sklearn.preprocessing

使い方

機械学習のうち、ニューラルネットワークやSVMなどのモデルは、データの値の大きさやレンジが異なる場合、過学習になったり精度が悪くなることがあり、データを揃えるための前処理が必要になる(SVMの例ニューラルネットワークの例)。

scikit-learnのpreprocessingモジュールには、データの前処理を行う各種のクラスが準備されている。一般的な使い方は以下の通り。

  1. データを訓練データとテストデータに分ける
  2. 各preprocessorのfit()メソッドに訓練データを与えて変換用のパラメータを準備する(変換モデルを構築する)
    • fit()メソッドは、各列が特徴量、各行がデータレコードである2次元配列を想定している
  3. 変換器のtransform()メソッドに訓練データを与えて前処理を施す
  4. 同じ変換器のtransform()メソッドにテストデータを与えて前処理をほどこす

なお、fit()メソッドとtransform()メソッドをそれぞれ分けて行うほか、fit().transform()とメソッドチェーンで実行してもよい。またpreprocessorにはこれらを一体化したfit_transform()というメソッドも準備されている。

実行例

preprocessingのscaler系のクラスの1つ、MinMaxScalerを例にして、その挙動を追ってみる。

まず必要なライブラリーやクラスをインポートし、Breast cancerデータを読み込み、データを訓練データとテストデータに分ける。cancerデータは30の特徴量を列とし、569のレコードを持つが、それを3:1に分け、426セットの訓練データと143セットのテストデータとしている。

次にMinMaxScalerのインスタンスを生成し、fit()メソッドに訓練データX_trainを与えて、変換用のモデルを構築する。

preprocessingでいうモデルの構築とは、基準となるデータを与えて、変換用のパラメータを算出・保持するのに相当する。

今回の例のMinMaxScalerオブジェクトでは、特徴量数を要素数とする1次元配列で、データセット中の各特徴量の最小値(data_min_)、最大値(data_max_)、最大値-最小値のレンジ(data_range_)、レンジの逆数であるscales_がインスタンス内に保持されている。

これらのパラメーターは、30の特徴量について、426個のデータの最小値、最大値・・・などとなっている。たとえば1つ目の特徴量については、最大値-最小値は28.11−6.98=21.13となり、data_range_の1つ目の値と符合している。またscales_の各要素は、data_range_の各要素の逆数となっている。

構築された変換器によりX_trainを変換すると、すべての特徴量について最小値が0、最大値が1となる。

同じ変換器でテストデータも変換すると、変換後の特徴量の最小値・最大値は0、1になっていない。これはテストデータの最大値・最小値が必ずしも訓練データのそれらと一致しないので当然である。また、テストデータの最大値が訓練データの最大値よりも大きい場合は、テストデータの最大値が1を超えることになる。

テストデータで改めてfit()メソッドを実行してテストデータに適用するとレンジが0~1になるが、そうすると訓練データとテストデータで異なる変換を行うことになり、結果が歪んでしまう。

preprocessingの各種モデル

sklearn.preprocessingには多様な変換器が準備されているが、それらを目的ごとのカテゴリーに分けて整理する。

scaler~スケール変換

データの大きさやレンジを変換してそろえる。

MinMaxScaler
各特徴量が0~1の範囲になるよう正規化する(線形変換)。
StandardScaler
各特徴量の標本平均と標本分散を使って標準化する(線形変換)。
RobustScaler
各特徴量の中央値と4分位数を使って標準化する(線形変換)。

normalization~正則化

特徴量ベクトルのノルムをそろえる。レンジをそろえる目的のscalerに比べて、元のデータ分布の相似性はなくなる。

Normalizer
特徴量ベクトルのノルムを1にそろえる。

binalize~2値化

特徴量データを0/1の2値に分ける。

encoder~カテゴリーデータのエンコード

カテゴリーで与えられたデータ(性別、曜日など)をモデルで扱うために数値化する。

LabelEncoder
1次元配列で与えられた特徴量クラスデータを、数値ラベルに変換する。
OrdinalEncoder
2次元配列で与えられた特徴量クラスデータを、数値ラベルに変換する。
OneHotEncoder
2次元配列で与えられた特徴量クラスデータを、特徴量ごとのインジケーター列に変換する。

スケール変換の頑健性

MinMaxScalerは計算過程が簡明だが、飛び離れた異常値がわずかでもあるとそれが全体のレンジを規定し、本来適用したいデータの値が歪んでしまう。StandardScalerやRobustScalerはこのような異常値に対して頑健な変換を行う。これら3つの頑健性についてはこちらで確認している。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です