機械学習:特徴量のスケーリング
前記事で扱ったワインの特徴量を見ていくと、Nonflavonoid phenols(非フラボノイド芳香族)の数値が小数点二桁なのに対し、Proline(フロリン)が三桁から4桁の数値です。
計算機上では数値大小が絶対の正義なので、機械学習アルゴリズムも、数値の大きいフロリンを重要なファクターと扱い、1未満の特徴量を検討しないアルゴリズムもあります。
機械学習法では、決定木とRandom Forestのアルゴリズムは閾値と平均値を扱うので、特徴量のスケーリングは必要ありません。
ただし、アルゴリズムで最適化に勾配効果法を採用しているものは、大きい値を持つ特徴量に結果が引っ張られるので、特徴量の尺度が同じとなるようにスケーリングを行います。
normalization:正規化
全ての特徴量を、それぞれの最大値最小値を使って、$$[0,1]$$に収めます。
$${X^{i}_{norm}=\displaystyle{ \frac{ X^{i}-X^{i}_{min} }{ X^{i}_{max}-X^{i}_{min}} } }$$
これを行うのには、sklearn.preprosessingのMinMaxScalingを使い、
from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
X_train_norm = mms.fit_transform(X_train)
X_test_norm = mms.transform(X_test)
とします。
X_train_normに、mms.fit_transformを使い、X_test_nromに mms.transformを使っているのは、X_test_normの変換には前行のX_train_normと同じフィットを使うので、フィットし直す必要はないからです。
standardization 標準化
学習モデルに線形を用いているものの殆どは、各特徴量への重みを0、または0に近い小さい値の乱数に初期化します。このため、正規分布に特徴量を従わせる標準化の方が、モデルが学習しやすくなるため実用的と言われています。
$${X^{i}_{std}=\displaystyle{ \frac{ X^{i}-\mu_{X^i} }{\sigma_{X^i} } } }$$
ここで、$${\mu_{X^i}}$$は特徴量$${X^i}$$の平均値、 $${\sigma_{X^i}}$$は特徴量$${X^i}$$の分散となります。
標準化には、正規化と同じsklearn.preprosessingのStandardScalerを使います。
from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)
RobustScaler
このスケーリングは、多くの外れ値があるデータセット、外れ値が桁違いに大きく学習モデルがうまく適応しない場合、もしくは過適合に陥りやすい場合に行います。
デフォルト設定では、特徴量の中心値を使い、第一分位点と第三分位点間の距離を1にするように調整します。
$${X^{i}_{rbst}=\displaystyle{ \frac{ X^{i}-{X^i}_{med} }{ Q^{X^i}_{3}-Q^{X^i}_{1}} } }$$
$${Q^{X^i}_{j}}$$は、$${X^i}$$特徴量の第$${j}$$位分位点で、$${{X^i}_{med} }$$は$${X^i}$$特徴量の中心値です。
from sklearn.preprocessing import RobustScaler
rbstsc = RobustScaler()
X_train_std = rbstsc.fit_transform(X_train)
X_test_std = rbstsc.transform(X_test)