前処理で標準化するタイミングを間違えるとdata leakingが発生するので、注意メモ。
参考サイト
- Data Leakage in Machine Learning
- Avoiding Data Leakage in Machine Learning
- Automate Machine Learning Workflows with Pipelines in Python and scikit-learn
Normalization時のデータリークについて
データセットを標準化するとき、trainデータとtestデータをまとめてfitしてしまうと、testデータもfit時に入ってしまい、データリークが生じる。なので、trainデータとtestデータをまず分けて、trainデータでfitさせてから、trainデータとtestデータをそれぞれtransfromする。なので、testデータはtrainデータの平均・標準偏差でスケーリングされる。
そのため、必ずtrainデータとtestデータに分けてからtrainデータでfit()し、別々にスケーリングすること。
交差検証時のデータリークについて
また、交差検証時には、訓練データをtrainデータとtestデータに分割し直すので、交差検証のモデリング時に、testデータの内容が入り込んでしまっている。そのため、sklearnでは、交差検証の個々の分割に対して、train用のパートのみを対象として標準化できるPipelineクラスを提供している。
例)インディアンの成人病関連データによる成人病罹患判別
データ内容
pipelineによる交差検証
best_estimator_には、Standardscalerとlogisticregressionの2ステップからなるパイプラインが格納されている。
logisticregressionにアクセルするには、パイプラインのnamed_steps属性を用いる。
補:データリークを防ぐ方法として、データを訓練用、テスト用、検証用の3つにわけると確実。(前処理前に、データを訓練・テスト用と、検証用にあらかじめわけてから、訓練・テスト用データで前処理を行い、最後に検証用データでスコアを調べる。)
ブログによると、データを3つに分割する方法は、重回帰分析の時は不要らしいが、Neural Network や 分類木を使うときには、利用を検討した方がいいらしい。
0コメント