[概要]
機械学習モデル作成に使用される、Scikit-learnライブラリにはStandardScalerというクラスがあります。本クラスを使用する際、学習用データ、テスト用データの標準化方法について2つの具体的コードと実行結果を元にあるべき姿を確認しました。
案 | 概要 |
案1 | StandardScalerのインスタンスを学習用データ、テスト用データとで共用する |
案2 | StandardScalerのインスタンスを学習用データ、テスト用データとで別々のものを使用する |
<サンプルコード>
<案1>
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(x_train)
scaler_test.fit(x_test)
x_train_std = scaler.transform(x_train)
x_test_std = scaler_test.transform(x_test)
<案2>
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(x_train)
x_train_std = scaler.transform(x_train)
x_test_std = scaler.transform(x_test)
<実行結果>
x_test_stdの平均、標準偏差はそれぞれ以下の通り
<案1>
平均:2.1065770210836303e-17
標準偏差:1.0
<案2>
平均:0.007817453227428085
標準偏差:1.08562736440783
<結論>
案2のようにStandardScalerのインスタンスを学習用データ、テスト用データとで別々のものを使用すると、scalerインスタンスに対して学習用データ、テスト用データそれぞれ別々の平均、標準偏差をfitすることになり、結果として別の基準でtransform(標準化)が行われるためせっかく学習用データを使用して作成したモデルに対して、妥当なテストができなくなってしまう。(モデル作成と別基準で標準化したデータによるテストは、いわば1次関数の問題を解いてテスト準備したのにテストで2次関数の問題が出されるようなもの)
実行結果に記載の通り、標準化計算の目的である平均0、標準偏差1に近付ける、という意味では当然ながら案1より案2の方が近付くのだが、モデル作成の目的に立ち返ると学習用データとテスト用データはそれぞれ同じ基準で標準化すべきであり、案1があるべき姿となる。