Scikit-learnのStandardScalerを使用した学習用データ、テスト用データの標準化方法のあるべき姿

[概要]

機械学習モデル作成に使用される、Scikit-learnライブラリにはStandardScalerというクラスがあります。本クラスを使用する際、学習用データ、テスト用データの標準化方法について2つの具体的コードと実行結果を元にあるべき姿を確認しました。

概要
案1StandardScalerのインスタンスを学習用データ、テスト用データとで共用する
案2StandardScalerのインスタンスを学習用データ、テスト用データとで別々のものを使用する

<サンプルコード>

<案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があるべき姿となる。

コメントを残す

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