TIL 211112


どうせ書くチームブログ!!
だからチームブログのニュアンスで書くことにしました!!
(このアイデアはGDSCの準備のために書いたのでしょう…)

先週の任務


先週.
  • カグラー(https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python)抄写
  • WIL
  • の2つの難題!タイタニック号から抜け出せない私たちML...
    今週、Chapter 5のモデル評価と性能改善について議論します.
    これまで,指導学習,非指導学習理論と特性工学を学習した.非指導的な学習を評価することは困難な任務であり、指導的な学習(回帰、分類)に集中します.
    これまで指導学習モデルを評価するために
  • train test split関数を使用して、データセットをトレーニングセットとテストセットに分けます.
  • モデルを作成するために、トレーニングセットに適切な方法を適用し、
  • テストセットでは、
  • モデルを評価するためにscoreメソッドを使用しました.
  • このセクションでは、これらの評価方法をさらに拡張します.

    1.クロス検証


    複数のモデルの分割と学習を複数回繰り返す方法
    最も広く用いられている交差検査はk再交差検査である.
    kとしては通常5,10が用いられる.5階層クロス検証の場合、データは5つの部分ダイバーシティ(「フォルダ」と呼ばれる)に分割されます.次にモデルを選択し、最初のフォルダをテストセットとして使用し、残りのフォルダをトレーニングセットとして学習します.次に、2番目のベンドが2番目のモデルのテストセットとして使用されます.このようにモデルの学習とテストを繰り返す.

    1.scikit-learningのクロス検証

    from sklearn.model_selection import cross_val_score
    scikit-learningでのクロス検証はcross cal score関数によりmodel selectionで以下に示すように実現される.
    cross cal scoreのパラメータは、評価するモデル、トレーニングデータ、およびターゲットラベルです.
    iris = load_iris()
    logreg = LogisticRegression(max_iter = 1000)
    scores = cross_val_score(logreg, iris.data, iris.target)
    scikit-learning 0.22バージョンから、3層クロス検証から5層クロス検証に移行しました.cvパラメータを使用してフォルダの数を変更できます.(少なくとも5つの交差チェックを使用することをお勧めします!)
    クロス検証はcross validate関数も使用できます.この関数のインタフェースはcross val score関数に似ていますが、各パーティションはトレーニングとテストに要する時間を含むバイナリファイルを返します.

    2.クロス検証のメリット


  • クロス検証により、複数のトレーニングセットとテストセットが生成されます.これにより、テストセットのランダム性が向上し、テストセットの精度に及ぼす影響が減少する可能性があります.

  • データを複数のセクションに分割することで、モデルのトレーニングデータへの感度を理解できます.これは、最悪の状況と最良の状況を特定するのに役立ちます.

  • 前回の分割よりもデータの使用効率が高い.train test splitは75%のデータをトレーニングセットに、25%を評価に使用した.しかしながら、k−クロスカットチェック(k−1)/kを用いてモデル学習を行い、より正確なモデルを作成することができる.

  • しかし,クロス検証にも欠点がある.これは、計算コストが増加することを意味します.k個のモデルを作成する必要があるため、データのスコアは1回に約k倍遅い.
  • 3.階層k層のクロス検証とその他のポリシー


    k-クロス検証は、データセットをリスト順にk個のフォルダに分割します.1番目の1/3クラスが0,2番目の1/3クラスが1,2番目の1/3クラスが3層交差検証であると仮定する.最初のフォルダのテストセットは0レベル、トレーニングセットは1、2レベルです.つまり、この精度は「0」なのでしょうか?
    これらの問題を解決する方法は,階層k層交差検証である.次の図に示すように、フォルダにデータを分割するクラスの割合は、データセット全体のクラスの割合と同じです.

    分類ではこれらの階層化K−クロスカットチェックがよく用いられるが,回帰ではデフォルトのK−クロスカットチェックが用いられる.もちろん、回帰においても、層k毎の再交差検査を用いることができるが、これは一般的な方法ではない.
    1.クロス検証の詳細オプション
    scikit-learningは、クロス検証分割器をcvパラメータに渡し、データを分割する際により細かく制御します.ほとんどの場合、デフォルト値は正常に動作しますが、場合によっては!戦略が必要かもしれない.
    たとえば、分類データセットでデフォルトのk再交差検証を使用して、他の人の結果を再現する必要があります.そのためには、model selectionモジュールからKFoldスプリッタをインポートし、必要なフォルダ数を追加してオブジェクトを作成する必要があります.
    from sklearn.model_selection import KFold
    kfold = KFold(n_splits = 3)
    print("교차 검증 점수: \n", cross_val_score(logreg, iris.data, iris.target, cv = kfold)
    さっきの鉢植えデータは,デフォルトのk−オーバーラップクロス検証を用いると,話にならない精度が生じることを示している.もちろん、階層フォルダを作成することもできますが、この問題を解決するもう1つの方法は、サンプルの順序を乱雑にするためにデータを混ぜ合わせることです.shuffleパラメータを直接Trueに変更すればよい.random stateを固定して同じ操作を再現できます.
    from sklearn.model_selection import KFold
    kfold = KFold(n_splits = 3, shuffle = True, random_state =0)
    print("교차 검증 점수: \n", cross_val_score(logreg, iris.data, iris.target, cv = kfold)
    2. LOOCV
    LOOCV、Leave-on-outクロス検証も別のクロス検証方法です.LOOCVは、各ループでテストセットとしてデータポイントを選択します.1つのフォルダに1つの例しかないk-オーバーラップクロス検証は容易に実現できます.これにより、より小さなデータセットで有用な結果が得られます.
    3.任意の分割交差を検証する
    ランダム分割交差検証は、非常に柔軟な交差検証ポリシーです.このクロス検証では、トレーニングセット(train sizeと同じ)とtest sizeと同じテストセットを作成します.この2つのデータポイントは重複しません.これらの分割はn splits回数を繰り返す.
    次の図は、5つのトレーニングセットと2つのテストセットとしてサンプル10のデータのセットを選択した.
    from sklearn.model_selection import ShuffleSplit
    shuffle_split = ShuffleSplit(test_size = 5, train 5, n_splits = 10)
    上の図に示すように、選択されていないデータもあります.コードに示すように、50%の割合で選択することもできます.
    3.グループ交差検証
    データに非常に関連するグループが存在する場合でも、クロス検証は広く使用されます.例えば,表情認識システムを構築するために,100名の顔写真を収集した.一人で複数の写真を異なる表情で撮影し、データセットにない人の表情を正確に区別する分類器を作成することを目標としている.
    もちろん、階層化されたk層交差検証も使用できますが、テストセットに同じ顔があることになります.これによりモデルの精度を向上させることができるが,我々の究極の目標は新しい顔を識別することであるため,汎用性の向上に専念しなければならない.
    このため、グループKFoldを使用して、記録された写真の中の人が誰の配列グループパラメータであるかを受信できます.(グループ・スキーマをクラスと混同しないでください!)
    from sklearn.model_selection import GroupKFold
    X, y = make_blobs(n_samples = 12, random_state = 0)
    groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]
    score = cross_val_score(logreg, X, y, groups = groups, cv = GroupKFold(n_splits = 3))
    下図のように.

    4.反復交差検証


    データセットが大きくない場合は、クロス検証を繰り返して安定した検証スコアを得ることができます.このためにscikit-learning 0.19バージョンにRepeatedKFold(回帰)とRepeatedStratifiedKFold(分類)スプリッタが追加されました.クラス内のオブジェクトをcvパラメータとしてcross val scoreに渡して、クロス検証を繰り返すことができます.
  • 分割フォルダ数:n splitsパラメータ(デフォルト=5)
  • 繰り返し回数:n repeatsパラメータ(デフォルト=10)
    (繰り返しのたびにデータを再ブレンドします.)
  • ここまで5.1内容です!~!~今周のKaggleの必书にcross validateがあって、私はグーグルゲームを游びながら苦労して、とっくに本を勉强しました......途中でKFoldを書いた理由もいろいろな面で役立ちました!