Kaggle学習ノート--data leakage

11325 ワード

Kaggle学習ノート--data leakage
  • 概要
  • このチュートリアルでは、データの漏洩とデータの漏洩を防止する方法について学習します.
  • ターゲットリーク-予測変数は使用不可データ
  • を含む.
  • 訓練-試験汚染
  • データ準備
  • 結論
  • 原文:https://www.kaggle.com/alexisbcook/data-leakage
    概要
    このチュートリアルでは、データ漏洩とデータ漏洩の防止方法について学習します.
    どのように予防するか分からない場合は、漏れが頻繁に発生し、微妙で危険な方法でモデルを破壊します.データの漏洩はモデルが訓練時に高性能になり、結果が正確になる.予測すると効果が悪くなります.漏れには2つの主要なタイプがある:【target leakage】目標漏れと【train-test contamination】訓練-汚染テスト.
    目標漏洩:予測変数に使用不可データが含まれる
    1.機能が良好な予測に役立つかどうかだけでなく、データが利用可能な時間順序または時間順序に基づいて、ターゲット漏洩を考慮する.2.ターゲット漏洩を防止するために、ターゲット値が達成された後に更新(または作成)される変数を除外します.
    トレーニング-テスト汚染
    トレーニングデータと検証データを誤って区別すると、「train-test contamination」という別のタイプの漏洩が発生します.検証【validation】は、モデルが以前に考慮されていなかったデータをどのように処理するかを測定するために使用されます.検証データが前処理動作に影響を及ぼす場合、このプロセスは微妙な方法で破壊されます.trainを呼び出すようにtest_split()の前に前処理(欠落値を埋めた)を行った.最終的な結果は、モデルが良好な検証スコアを得る可能性があるが、モデルを呼び出して決定する際にはよくない.
    検証が単純なtrain-test splitに基づいている場合は、前処理ステップのフィッティングを含む任意のタイプのフィッティングに検証データが除外されます.scikit-learnパイプを使用すると、より簡単になります.クロス検証を使用する場合、パイプ内で前処理を行うことが特に重要です.トレーニングデータと検証データを誤って区別すると、異なるタイプの漏洩が発生します.
    データの準備
    この例では、ターゲット漏洩の検出と除去方法について説明します.1.クレジットカードの申請に関するデータセットを使用して、yシリーズがどのアプリケーションを受け入れたかを予測します.2.これは非常に小さなデータセットであるため、クロス検証を使用してモデル品質の正確なメトリックを確保します.
    import pandas as pd
    # Read the data
    data = pd.read_csv('C:/Users/Administrator/Desktop/home-data-for-ml-course/AER_credit_card_data.csv',
                       true_values = ['yes'], false_values = ['no'])
    # Select target
    y = data.card
    # Select predictors
    X = data.drop(['card'], axis=1)
    print("Number of rows in the dataset:", X.shape[0])
    print(X.head())
    

    Number of rows in the dataset: 1319
    from sklearn.pipeline import make_pipeline
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import cross_val_score
    
    '''
    from sklearn.pipeline import Pipeline
    my_pipeline = Pipeline(steps=[
        ('preprocessor', SimpleImputer()),
        ('model', RandomForestRegressor(n_estimators=50, random_state=0))
    ])
    '''
    # Since there is no preprocessing, we don't need a pipeline (used anyway as best practice!)
    my_pipeline = make_pipeline(RandomForestClassifier(n_estimators=100))
    #          。  [`cross_val_score()`]           (MAE),                。   `cv`       。
    cv_scores = cross_val_score(my_pipeline, X, y,
                                cv=5,
                                scoring='accuracy')
    
    print("Cross-validation accuracy: %f" % cv_scores.mean())
    
    

    Cross-validation accuracy: 0.981052
    経験があれば、98%の時間で正確なモデルを見つけることができます.それは確かに発生しましたが、データのターゲット漏洩があるかどうかをもっとよく確認する必要があります.以下はデータの要約です.「データ」タブ【data tab】の下でデータを見つけることもできます.card:1 if credit cardアプリケーションaccepted、 0 if not reports: Number of major derogatory reports age: Age n years plus twelfths of a year income: Yearly income (divided by 10,000) share: Ratio of monthly credit card expenditure to yearly income expenditure: Average monthly credit card expenditure owner: 1 if owns home, 0 if rents selfempl: 1 if self-employed, 0 if not dependents: 1 + number of dependents months: Months living at current address majorcards: Number of major credit cards held active: Number of active credit accounts
    カード:クレジットカードの申請を受けた場合は1、そうでなければ0報告:主なけなす報告の数年齢:年齢n歳に1年の12分の1の収入を加える:年収(10000で割る)シェア:毎月のクレジットカード支出と年収の比率支出:クレジットカードの平均毎月支出所有者:家屋を持っている場合は1;賃貸料の場合は0 selfempl:自雇者の場合は1;そうでない場合は、0扶養者:1+扶養者数ヶ月:現在の住所に住む月majorcards:保有する主なクレジットカード数アクティブ:アクティブなクレジット口座数
    いくつかの変数は疑わしいように見えます.たとえば、支出はこのカードまたは申請前に使用したカードの支出を表しますか?この場合、基本データの比較は非常に役立ちます.
    #             y = data.card
    expenditures_cardholders = X.expenditure[y]
    #         
    expenditures_noncardholders = X.expenditure[~y]
    print('Fraction of those who did not receive a card and had no expenditures: %.2f' \
          %((expenditures_noncardholders == 0).mean()))
    
    print('Fraction of those who received a card and had no expenditures: %.2f' \
          %(( expenditures_cardholders == 0).mean()))
    
    
    

    Fraction of those who did not receive a card and had no expenditures: 1.00 Fraction of those who received a card and had no expenditures: 0.02
    上記のように、カードを受け取っていない人はみな支出していないが、カードを受け取った人は2%しか支出していない.我々のモデルは高い精度を持っているようだが,不思議ではない.しかし、これも目標の漏れの一つの状況のようだ.支出は、申請したカードの支出を意味する可能性があります.2.シェア部分は支出によって決まるので、それも排除すべきである.3.変数activeとmajorcardはよくわかりませんが、説明から見ると心配です.ほとんどの場合、データを作成したユーザを追跡して詳細を検索できない場合は、残念に思わないほうがいいです.次のように、ターゲット漏洩のないモデルを実行します.
    # Drop leaky predictors from dataset
    potential_leaks = ['expenditure', 'share', 'active', 'majorcards','dependents']
    X2 = X.drop(potential_leaks, axis=1)
    
    # Evaluate the model with leaky predictors removed
    cv_scores = cross_val_score(my_pipeline, X2, y,
                                cv=5,
                                scoring='accuracy')
    
    print("Cross-val accuracy: %f" % cv_scores.mean())
    

    Cross-val accuracy: 0.834716
    このときのクロスチェックの精度は83%程度であり,上の98%よりもはるかに低いことが分かるが,新しいモデルに適用するとよりよく表現される.
    結論
    多くのデータ科学応用において、データ漏洩は大きな損失をもたらす可能性がある.訓練データを注意深く分離し、検証することで、訓練試験の汚染を防止することができ、パイプはこの分離を実現するのに役立つ.同様に、慎重さ、常識、データ探索を組み合わせることで、ターゲットの漏洩を識別するのに役立ちます.