機械学習における高次元のデータの前処理について考えてみよう! | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

機械学習における高次元のデータの前処理について考えてみよう!

近年、機械学習を用いた AI システムのサービスが多く提供されています。
しかし、高精度な機械学習アルゴリズムを利用しても対象となるデータセットの次元数が大き過ぎると、一般的に「次元の呪い」と呼ばれる要因によって機械学習を行った結果値が思うような精度が出ないことがあります。
そこで今回は、この要因を回避するためのデータの次元を減らすための、特徴選択の簡単な手法をご紹介したいと思います。

スポンサーリンク
  • ■ 次元の呪い って?

大規模なデータを分析する時には、対象となるデータセットのベクトルの次元数が大きくなります。
次元の呪いとは、データセットの次元数が大きくなるすぎると、対象となるデータセットの組み合わせが膨大になり、利用している高性能の機械学習のアルゴリズムでも、十分な性能を発揮することができなくなり、未知データに対して適切な予測を行うことが困難になってきます。
特に、自然言語処理などは、ベクトルの次元数が数百万レベルになることが、多々あり、このような問題を解決する必要がでてきます。

■ 試してみよう!

特徴選択のアルゴリズムとしては、大きく分けて、

・単変量統計
・モデルベース選択
・反復選択

が挙げられます。

今回は、その中でも単純な「単変量統計」を試してみたいと思います。

単変量特徴選択を試してみるのには python の 機械学習ライブラリの scikit-learn を利用するのが手っ取り早そうです。
それでは、最も単純な SelectPercentile を試してみましょう。
SelectPercentile は、選択する特徴量の割合を指定します。
機械学習用途のデータセットで提供されている、 cancer データセットを利用して試してみましょう。
このタスクを難しくするため、情報量のないノイズを加えます。

from sklearn.datasetes. import load_breast_cancer
from sklearn.featue_selection import SelectPercentile
from sklearn.model_selection import train_test_split

cancer = load_breast_cancer()

rng = np.randam.RamdomState(42)
noise = rng.normal(size=(len(cancer),50))
X__w_noise = np.hstack([cancer.data,noise])

X_train,X_test,y_train,y_test = train_test_split(
X_w_noise,cancer.target,ramdom_state=0,test_size=.5
)

select = SelectPercenttile(percenttile=50)
select.fit(X_train,y_train)
X_train_selected = select.transform(X_train)

これで、特徴選択できたはずです。
それでは、どの特徴量が選択位されたのかみて見てみましょう。
get_support メソッドはどの特徴量が利用されたのかが調べられます。

mask = select.get_support()
print(mask)

以下のような配列形式で、値が返ってきます。

[True False True True False ... False True False True]

これで、特徴選択されたベクトルのインデックスの値を知ることが出来て、機械学習に用いるテストデータを作成する時、役立ちそうです。

■ 最後に

今回は、機械学習を行う前処理として、対象となるデータセットの特徴量を削減する特徴選択をご紹介しました。
データ解析の対象となるデータセットにはこのような前処理が必要となってきます。
他にも色々な手法が考案されています。上手く活用して機械学習の精度向上を目指しましょう!