データを分割する前後のStandardScaler


20

を使用して読んでいたときStandardScaler、推奨事項のほとんどは、データを電車/テストStandardScaler 分割する前に使用する必要があると言っていましたが、オンラインで投稿されたコードの一部をチェックするときに(sklearnを使用して)2つの主要な用途がありました。

1- StandardScalerすべてのデータで使用。例えば

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_fit = sc.fit(X)
X_std = X_fit.transform(X)

または

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit(X)
X = sc.transform(X)

または単に

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_std = sc.fit_transform(X)

2- StandardScaler分割データで使用。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

データを標準化したいのですが、どの方法が最適なのかわかりません!

回答:


25

テストセットの分布に関する情報がモデルに漏れないようにするには、オプション#2に進み、トレーニングデータのみにスケーラーを適合させ、そのスケーラーでトレーニングセットとテストセットの両方を標準化する必要があります。分割する前に完全なデータセットにスケーラーをフィッティングすることにより(オプション#1)、テストセットに関する情報を使用してトレーニングセットが変換され、トレーニングセットが下流に渡されます。

例として、データセット全体の分布を知ることは、異常値を検出および処理する方法、およびモデルをパラメーター化する方法に影響を与える可能性があります。データ自体は公開されていませんが、データの分布に関する情報は公開されています。その結果、テストセットのパフォーマンスは、目に見えないデータのパフォーマンスの真の推定値ではありません。あなたが役に立つと思うかもしれないさらなる議論は、相互検証にあります。


同じことが検証セットにも当てはまりますか?言い換えると、トレーニングセットをトレインセットと検証セットに分割した場合、トレインのみに適合してから、検証セットとテストセットの両方に後で適用できますか?または、検証とトレーニングの両方の例を含むデータセット全体の適合性を学び、後でそれをテストセットに適用することのみを心配します。
フィルグラウ

こんにちは-ではない検証やテスト-それは正しい、唯一の列車に収まるのです
redhqs

0

以下はどうですか:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

の場合X_test = sc.transform(X_test)、エラーX_testが返されますがまだ適合していません。または、私はここで何かを見逃しましたか?


2
X_testからフィットを削除する
tsumaranaina

0

テストデータに対してfit_transform(X_test)を実行しないでください。
適合はすでに上で発生しています。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

申し訳ありませんが、これは以下の内容への返信
でした
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.