Feature Scalingの話

Feature scalingと何か??

特徴量の取りうる値の範囲(スケール)を変えることである。

 

これが必要な理由は何か。

 

例えば、特徴量に年齢と給料があるとする。

 

年齢は大体30才とか40才とかの範囲にあるが、給料は40万であったり、60万であったりと、年齢と給料の間に大きなスケールの違いがある。

 

このように各特徴量間で、スケールに大きな違いがあるデータで機械学習をするとうまく学習できないという問題がある。

 

具体的にいうと、多くの機械学習のモデルではユークリッド距離というものがベースになっている。

 

ユークリッド距離というのは2点間の距離であり、例えば点a(x,y)と点bが(j,k)があったとして、sqrt((x-j)^2+(y-k)^2)である。

 

例えばx座標が年齢でy座標が給料とする。そして年齢が20才で給料が20万のAさんのデータと、年齢が40才で給料が50万のBさんのデータでユークリッド距離をとることを考える。

 

給料:(50-20)^2 = 900万

年齢:(40-20)^2 = 400

 

となり、この2つのデータ間のユークリッド距離というのは年齢の寄与が全くなく、ほとんど給料の差のみで決まると言える。これだと機械学習はうまくできない。

 

これを解消するために、年齢と給料のレンジを同じくらいにして、寄与度もおなじくらいにしてあげる必要がある。

 

Feature Scalingのやり方

正規化(Standardization)と標準化(Normalization)がある。

 

pythonでこれを行うにはライブラリーから以下のようにimportする必要がある。

from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

 

なぜX_trainはfit_transformでX_testはtransformなのか??

''fit''の部分はパラメータ(平均や標準偏差)を計算している。''transform''の部分はデータをスケーリングしている。

X_testでfitを使わないのは、X_trainと同じパラメータを使いたいからである。つまりX_testでfitを使うとX_trainで使ったパラメータと違う値になるからである。

 

dummy variablesにFeature Scalingを適用すべきか

モデルの予測の正確さを最適化させたい時は適用すべき

モデルで可能な限り多くの解釈を維持したい時は適用すべきでない

 

Standardization(正規化)とNormalization(標準化)の使い分け

一般的に、データが正規分布している時は標準化を使い、そうでない時は正規化を使う。よくわからない時は正規化を使う。

しかし、一般的なのは2つのスケーリング方法をテストすることである。