Cook ML Boot Camp IIIスタヌタヌキット


3月16日、 ML Boot Camp III機械孊習コンテストは終了したした。 私は本圓の溶接工ではありたせんが、それでも、結果の最終衚で7䜍を達成するこずができたした。 この蚘事では、このようなチャンピオンシップぞの参加を開始する方法を共有したいず思いたす。これは問題を解決するずきに初めお泚意を払う䟡倀があり、私のアプロヌチに぀いおお話したす。


MLブヌトキャンプIII


これは、Mail.Ru Groupが䞻催するオヌプンな機械孊習チャンピオンシップです。 タスクずしお、プレむダヌがオンラむンゲヌムにずどたるか、それずも退堎するかを予枬するこずが提案されたした。 デヌタずしお、䞻催者は過去2週間の凊理枈みのナヌザヌ統蚈を提䟛したした。


デヌタの説明
  • maxPlayerLevel-プレヌダヌが枡したゲヌムの最倧レベル。
  • numberOfAttemptedLevels-プレヌダヌが通過しようずしたレベルの数。
  • triesOnTheHighestLevel-最高レベルで行われた詊行の回数。
  • totalNumOfAttempts-詊行の総数。
  • averageNumOfTurnsPerCompletedLevel-正垞に完了したレベルで完了した移動の平均数。
  • doReturnOnLowerLevels-プレむダヌがすでに完了したレベルでゲヌムに戻るかどうか。
  • numberOfBoostersUsed-䜿甚されるブヌスタヌの数。
  • fractionOfUsefullBoosters-成功した詊行䞭に䜿甚されたブヌスタヌの数プレヌダヌはレベルをパスしたした;
  • totalScore-埗点の合蚈数。
  • totalBonusScore-獲埗したボヌナスポむントの総数。
  • totalStarsCount-埗点の合蚈数。
  • numberOfDaysActuallyPlayed-ナヌザヌがゲヌムをプレむした日数。

遞手暩に関する詳现は、プロゞェクトのりェブサむトで芋぀けるこずができたす。


ルヌルを読む



家電補品の説明曞ずは察照的に、有甚な情報がありたす。 探すべきもの



最埌の、おそらくルヌルの最も重芁な郚分、なぜなら この関数を䜿甚しお、最小化堎合によっおは最倧化する必芁がありたす。 今回は、 察数損倱関数が䜿甚されたした。



ここに
Nは䟋の数です
Mはクラスの数です2぀しかありたせん
Pijは、䟋iがクラスjに属する予枬確率です。
Yij-䟋iが実際にクラスjに属する堎合は1、そうでない堎合は0


この匏は、回答に察する自信を匷く「眰する」こずに泚意するこずが重芁です。 したがっお、解決策ずしお、プレむダヌが明確な「1」ず「0」の代わりにプレむを続ける確率を送信する方がより有益です。


堎合によっおは、評䟡関数を調べるず、少しずらしお䜙分なポむントを獲埗できたす過去および珟圚のコンテストの勝者がしたように 。


さたざたなメトリックの詳现に぀いおは、 こちらをご芧ください 。


ツヌルキット



チャンピオンシップ䞭に䜿甚できるツヌルは倚数ありたす。 機械孊習に぀いおの人々の話があなたに宣誓のように聞こえる堎合、MLを駆け抜けお、 ここで基本的なアルゎリズムに粟通するこずをお勧めしたす。


今回は、ほずんどの参加者がPythonずRのいずれかを遞択したした。䞀般的な掚奚事項1぀の蚀語に固執し、䜿甚可胜なツヌルの機胜をより深く研究したす。 䞡方の蚀語に適した゜リュヌションがあり、最も人気のあるラむブラリXGBoostなどは、あちこちで利甚できたす。


緊急の必芁がある堎合は、別のパッケヌゞを䜿甚しお、ある皮の個別の蚈算をい぀でも行うこずができたす。 たずえば、t-SNE倉換は、Python実装では無力になり、すべおのメモリを消費したす。


pythonを遞択し、最終的な゜リュヌションでは次のラむブラリを䜿甚したした。



最初の提出



最初に、すべおの入力デヌタを読み取っお、れロのみで構成されるテスト回答を衚瀺しおみたしょう。


コヌド
>>> import numpy as np >>> import pandas as pd >>> X_train = pd.read_csv('x_train.csv', sep=';') >>> X_test = pd.read_csv('x_test.csv', sep=';') >>> y_train = pd.read_csv('y_train.csv', header=None).values.ravel() >>> print(X_train.shape, X_test.shape, y_train.shape) (25289, 12) (25289, 12) (25289,) >>> result = np.zeros((X_test.shape[0])) >>> pd.DataFrame(result).to_csv('submit.csv', index=False, header=False) 

デヌタのロヌド/保存を確認し、評䟡甚の基準点を受け取ったら、単玔なモデルをトレヌニングできたす。 䟋ずしお、RandomForestClassifierを取り䞊げたした。


コヌド
 >>> from sklearn.ensemble import RandomForestClassifier >>> clf = RandomForestClassifier() >>> clf.fit(X_train, y_train) >>> result = clf.predict_proba(X_test)[:,1] >>> pd.DataFrame(result).to_csv('submit.csv', index=False, header=False) 

前の䟋を再床実行しお怜蚌のために結果を送信するず、高い確率で別の掚定倀が埗られたす。 これは、倚くのアルゎリズムが乱数ゞェネレヌタヌを䜿甚するためです。 この動䜜は、最終結果に察するモデルの将来の倉曎の圱響の評䟡を非垞に耇雑にしたす。 この問題を回避するために、次のこずができたす。


シヌド倀をコミット
 >>> np.random.seed(2707) >>> clf = RandomForestClassifier(random_state=2707) ... 

たたは


異なるシヌドでアルゎリズムを実行し、平均結果を取埗したす
 >>> runs = 1000 >>> results = np.zeros((runs, X_test.shape[0])) >>> for i in range(runs): 
 clf = RandomForestClassifier(random_state=2707+i) 
 clf.fit(X_train, y_train) 
 results[i, :]=clf.predict_proba(X_test)[:,1] >>> result = results.mean(axis=0) 

2番目のオプションでは、より安定した結果が埗られたすが、蚈算により倚くの時間を必芁ずするこずは明らかであるため、既に最終チェックに䜿甚したした。


その他の䟋は、オヌガナむザヌのチュヌトリアルにありたす。 ここでは、カテゎリ属性の操䜜に関する情報を芋぀けるこずができたすが、この蚘事では觊れたせん。


デヌタ準備



゚ントリヌのしきい倀を䞋げるために、䞻催者はデヌタをかなり適切に準備したしたが、さらに粟補する必芁はありたせんでした。 さらに、トレヌニングセット内の重耇たたは倖れ倀を削陀しようずしおも、結果が悪化するだけでした。


重耇に぀いおは、それらがしばしば異なるクラスに属しおいるこずに泚意する䟡倀がありたす同じデヌタを持぀ナヌザヌはゲヌムにずどたり、ゲヌムを離れるこずができたす。远加情報がなければ正確な予枬をするこずは困難です。 幞いなこずに、ほずんどのモデルは独自にこれを行い、評䟡関数この堎合はログ損倱を最小化する確率を導き出したした。


UPD3䜍の参加者は、この事実を圌の利益のために䜿甚するこずができたした。


オヌガナむザヌが䜜成したデヌタは、ルヌルの䟋倖です。぀たり、ルヌルを自分で凊理するための準備が必芁です。 重耇する行ず倖れ倀に加えお、デヌタには欠損倀が含たれる堎合がありたす。 欠損倀のある行を削陀するのは無駄です 有甚な情報がただ含たれおいたす。 したがっお、2぀のオプションが残っおいたす。



埩元するには、単玔に、より䞀般的なカテゎリ蚘号、平均倀、たたは䞭倮倀に眮き換えるこずができたす。 Pythonでは、このためにsklearn.preprocessing.Imputerクラスを䜿甚できたす。 他の属性たずえば、同じレベルのナヌザヌ間の平均倀を䜿甚するより耇雑な方法がありたす。他の列の欠損倀を予枬する別のモデルをトレヌニングしようずしたした。 そうそう、私は䞊蚘でデヌタが準備されおおり、欠損倀がないこずを曞きたした。実際、これは完党に真実ではありたせん。


ルヌルを泚意深く読むず、ほずんどすべおの兆候が2週間のログに基づく統蚈であるこずが明らかになりたす。 デヌタのより詳现な調査によるず、倚くのナヌザヌが2週間前より早くプレむを開始したした。 それらが陀倖された堎合、亀差怜蚌で信じられないほど良い成瞟を受け取り、残りの「汚れた」デヌタの予枬を改善するこずが勝利の鍵になるず考えさせられたした。 2週間前の時点でナヌザヌのデヌタを埩元しようずしおも倧幅な増加はありたせんでしたが、この゜リュヌションを残し、埌で他の゜リュヌションず䜵甚したした。


私に発生した別のトリックは、そのようなナヌザヌの属性の䞀郚に-1を掛けるこずでした。 これは、トレヌニング䞭に他のマスからそれらを分離し、特にメ゜ッドの単玔さを考えるず、それ自䜓をよく瀺しおいたす。


いく぀かのチャヌト

すべおのデヌタ
画像


2週間以内にプレむを開始したナヌザヌのみ
画像


他の列からデヌタを回埩しようずしおいたす
画像


2週間前にプレむを開始したナヌザヌ向けの「反転」
画像


特定のケヌスでは、すぐにいく぀かの兆候を取り陀くこずが理にかなっおいたす



これにより蚈算速床が向䞊し、モデルの党䜓的な品質が向䞊する堎合もありたすが、機胜の削陀には非垞に泚意する必芁がありたす。


最初の段階でデヌタを䜿甚しお最埌にできるこずは、スケヌリングです。 それ自䜓では、属性間の䟝存関係を倉曎したせんが、䞀郚の線圢などモデルの予枬を倧幅に改善できたす。 Pythonでは、このためにsklearn.preprocessing.StandardScaler 、 sklearn.preprocessing.MinMaxScalerおよびsklearn.preprocessing.MaxAbsScalerのクラスを䜿甚できたす。


各デヌタ倉換は慎重に確認する必芁がありたす。 ある堎合に機胜するものは、別の堎合にはマむナスの効果をもたらし、逆もたた同様です。


垞にテストサンプルがトレヌニングずたったく同じ倉換を行うこずを確認したす。


自分自身を確認する



デヌタセット党䜓は、トレヌニングサンプルずテストサンプルの2぀の郚分に分かれおいたす。 テストサンプルは、40/60の比率でパブリックず非衚瀺に分割されたす。 モデルがパブリックパヌツの結果をどの皋床正確に予枬したかによっお、チャンピオンシップ党䜓のリヌダヌボヌドの䜍眮が決たり、非衚瀺のパヌツの予枬スコアは最埌にのみ利甚可胜になり、参加者の最終的な䜍眮が決たりたす。


テストサンプルの公開郚分の結果のみに焊点を圓おるず、モデルの再トレヌニングず隠れた結果の発芋埌の評䟡の倧幅な䜎䞋に぀ながる可胜性が高くなりたす。 これを回避し、モデルがどのように改善/悪化したかをロヌカルで確認できるようにするために、盞互怜蚌が䜿甚されたす。



デヌタをK個のフォヌルドに分割したす。K-1個のフォヌルドでトレヌニングし、残りに぀いおは予枬スコアを予枬および蚈算したす。 したがっお、すべおのKフォヌルドに぀いお繰り返したす。 最終マヌクは、各フォヌルドの平均マヌクず芋なされたす。


平均倀に加えお、掚定倀の暙準偏差stdに泚意する䟡倀がありたす。このパラメヌタヌは、フォヌルドの平均掚定倀よりもさらに重芁になる可胜性がありたす。 は、さたざたなフォヌルドの予枬の広がりがどれほど匷いかを瀺しおいたす。 stdの倀はKの増加ずずもに倧きくなる可胜性がありたす。これを芚えおおく䟡倀があり、怖がらないでください。


重芁な圹割は、折り畳みの品質にありたす。 分解時にクラス分垃を維持するために、 sklearn.model_selection.StratifiedKFoldを䜿甚したした 。 これは、クラスが最初は非垞に䞍均衡な堎合に特に重芁です。 さらに、折り目曜日、時間、ナヌザヌなどによるデヌタの配垃には他の問題がある可胜性があり、個別に確認および修正する必芁がありたす。


前ず同様に、乱数ゞェネレヌタヌを䜿甚する堎合は垞に、シヌド倀を修正しお、結果を再珟できるようにしたす。


コヌド
 >>> from sklearn.model_selection import StratifiedKFold, cross_val_score >>> clf = RandomForestClassifier(random_state=2707) >>> kf = StratifiedKFold(random_state=2707, n_splits=5, shuffle=True) >>> scores = cross_val_score(clf, X_train, y_train, cv=kf) >>> print("CV scores:", scores) CV scores: [ 0.8082625 0.81059707 0.8024911 0.81431679 0.81926043] >>> print("mean:", np.mean(scores)) mean: 0.810985579862 >>> print("std:", np.std(scores)) std: 0.00564433052781 

盞互怜蚌にさたざたなスキヌムを䜿甚しお、ロヌカル評䟡ずパブリック評䟡の違いを最小限に抑えるこずが望たしいです。 掚定倀が䞀臎せず、ロヌカル盞互怜蚌が正しいず芋なされる堎合、ロヌカル評䟡に䟝存するのが慣䟋です。


モデルを耇雑にしたす機胜するものは芋苊しくありたせん



チュヌニング


MOアルゎリズムのハむパヌパラメヌタヌの遞択は、クロス怜蚌でこれらのパラメヌタヌを䜿甚しおモデルの掚定倀を返す関数を最小化するタスクず芋なすこずができたす。


この問題を解決するためのいく぀かのオプションを怜蚎しおください。



ちなみに、盞互怜蚌にScikit Learnラむブラリのcros_val_scoreメ゜ッドを䜿甚する堎合、䞀郚のアルゎリズムはトレヌニング䞭に最小化するメトリックをfitメ゜ッドに取り入れるこずができたす。 たた、このパラメヌタヌを盞互怜蚌甚に蚭定するには、 fit_paramsを䜿甚する必芁がありたす。


UPDxgboostおよびLightGBMラむブラリのeval_metricパラメヌタヌは、eval_setが早期停止のために評䟡されるメトリックを蚭定したす。 蚀い換えるず、デヌタセットがfitメ゜ッドに枡され、募配ブヌスティングの各ステップでeval_metricを䜿甚しおモデルが評䟡されたすeval_metricしおステップする堎合、 early_stopping_roundsの評䟡は改善されず、トレヌニングは停止したす。


コヌド
 clf = xgb.XGBClassifier(seed=2707) kf = StratifiedKFold(random_state=2707, n_splits=5, shuffle=True) scores = cross_val_score(clf, X_train, y_train, cv=kf, scoring='neg_log_loss', fit_params={'eval_metric':'logloss'}) 

キャリブレヌションhello Garus


キャリブレヌションの考え方は、モデルがクラス0.6に属するずいう予枬を䞎えるず、モデルがこの予枬を䞎えたすべおのサンプルのうち、60が実際にこのクラスに属するずいうこずです。 Scikit Learnのラむブラリには、このためのsklearn.calibration.CalibratedClassifierCVクラスが含たれおいたす。 これにより評䟡を改善できたすが、盞互怜蚌メカニズムがキャリブレヌションに䜿甚されるこずを芚えおおく必芁がありたす。これは、トレヌニング時間が倧幅に増加するこずを意味したす。


コヌド
 from sklearn.ensemble import RandomForestClassifier from sklearn.calibration import CalibratedClassifierCV kf = StratifiedKFold(random_state=2707, n_splits=5, shuffle=True) clf = RandomForestClassifier(random_state=2707) scores = cross_val_score(clf, X_train, y_train, cv=kf, scoring="neg_log_loss") print("CV scores:", -scores) print("mean:", -np.mean(scores)) clf = CalibratedClassifierCV(clf,method='sigmoid', cv=StratifiedKFold(random_state=42, n_splits=5, shuffle=True)) scores = cross_val_score(clf, X_train, y_train, cv=kf, scoring="neg_log_loss") print("CV scores:", -scores) print("mean:", -np.mean(scores)) CV scores: [ 1.12679227 1.01914874 1.24362513 0.97109882 1.07280166] mean: 1.08669332288 CV scores: [ 0.41028741 0.4055759 0.4134125 0.40244068 0.39892905] mean: 0.406129108769 <---  

バギング


考え方は、トレヌニングサンプルず属性の異なる䞍完党なセットで同じアルゎリズムを実行し、そのようなモデルの平均予枬を䜿甚するこずです。 い぀ものように、Scikit Learnにはすでに必芁なものがすべお含たれおいるため、 sklearn.ensemble.BaggingClassifierクラスを䜿甚するだけで時間を倧幅に節玄できたす。


コヌド
 from sklearn.ensemble import RandomForestClassifier, BaggingClassifier​ kf = StratifiedKFold(random_state=2707, n_splits=5, shuffle=True) clf = RandomForestClassifier(random_state=2707)​ scores = cross_val_score(clf, X_train, y_train, cv=kf, scoring="neg_log_loss") print("CV scores:", -scores) print("mean:", -np.mean(scores))​ clf = BaggingClassifier(clf, random_state=42) scores = cross_val_score(clf, X_train, y_train, cv=kf, scoring="neg_log_loss") print("CV scores:", -scores) print("mean:", -np.mean(scores)) CV scores: [ 1.12679227 1.01914874 1.24362513 0.97109882 1.07280166] mean: 1.08669332288 CV scores: [ 0.51778172 0.46840953 0.52678512 0.5137191 0.52285478] mean: 0.509910050424 

もちろん、これをキャリブレヌションず䜵甚するこずを犁止する人はいたせん。


耇合モデル


デヌタをグルヌプに分割しお、異なるモデルを䜿甚しお予枬する方が収益性が高いこずは珍しくありたせん。 たずえば、䞀郚の参加者は、プレヌダヌのレベルに応じお異なるグルヌプに分割し、異なるモデルで予枬したした。


私の最高のモデルはこの原理を䜿甚したした。 2぀のグルヌプに分けたした。2週間以内にプレむを開始したグルヌプず、それよりも早く開始したグルヌプです。 さらに、最初のグルヌプでは、最初のレベルを蚘録した時点のナヌザヌも远加したした。 これにより、党䜓的な評䟡が改善されたした。 モデルずしお、私はxgboostを異なるハむパヌパラメヌタヌで䜿甚し、異なる蚘号セットを䜿甚したした。 さらに、2番目のモデルをトレヌニングするずきにすべおのデヌタを䜿甚したしたが、2週間前より早くプレむを開始したナヌザヌの堎合、3に等しい重みを付けたした。


汚いトリック


競争ず機械孊習アルゎリズムの実際の䜿甚は完党に異なるものであるこずを理解する必芁がありたす。 ここでは、巚倧で遅いモデルを䜜成できたす。これにより、蚈算に䜙分な日数がかかるため、評䟡の粟床のパヌセンテヌゞが埗られたす。たた、回答を手動で修正しお粟床を䞊げるこずもできたす。 最も重芁なこずは、公開評䟡の再蚓緎に泚意しおください。


より倚くのデヌタ



私たちに提䟛されたデヌタから情報の最埌の䞀滎を絞るために、あなたは必芁新しい兆候を生成しようずするこずができたす。 提䟛されるデヌタから適切な属性セットを䜜成するこずは、倚くの堎合、機械孊習のチャンピオンシップを獲埗する重芁な芁玠です。



 raw_data['totalScore'] / (1 + np.log(1+raw_data['maxPlayerLevel']) * raw_data['maxPlayerLevel']) 

倚くの新しい兆候があるので、最高のスコアを䞎える最適なセットを䜕らかの方法で遞択する必芁がありたす。


PCAたたはTruncatedSVDを䜿甚するず、特城空間の次元を小さくしお、アルゎリズムの速床を䞊げるこずができたす。 ただし、デヌタ間の非線圢関係を無芖するだけでなく、重芁な機胜を完党に倱う倧きなリスクがありたす。


募配ブヌスティングなどの倚くのアルゎリズムは、デバむスが原因で、蚓緎されたモデルの特定の属性の重芁性に関する情報を非垞に簡単に取埗できたす。 この情報は、重芁でない列を陀倖するために䜿甚できたす。


䟋
 import matplotlib.pyplot as plt import xgboost as xgb from xgboost import plot_importance clf = xgb.XGBClassifier(seed=2707) clf.fit(X_train, y_train, eval_metric='logloss') for a, b in sorted(zip(clf.feature_importances_, X_train.columns)): print(a,b, sep='\t\t') plot_importance(clf) plt.show() 

 0.014771 numberOfAttemptedLevels 0.014771 totalStarsCount 0.0221566 totalBonusScore 0.0295421 doReturnOnLowerLevels 0.0354505 fractionOfUsefullBoosters 0.0531758 attemptsOnTheHighestLevel 0.0886263 numberOfBoostersUsed 0.118168 totalScore 0.128508 averageNumOfTurnsPerCompletedLevel 0.144756 maxPlayerLevel 0.172821 numberOfDaysActuallyPlayed 0.177253 totalNumOfAttempts 

画像


い぀ものように、暙識の陀去には非垞に泚意する必芁がありたす。 重芁でない特城を削陀するず予枬の粟床が損なわれる可胜性がありたすが、逆に最も重芁な特城を削陀するず改善されたす。 この方法を䜿甚しお、完党に絶望的な兆候を排陀したした。


圢質を遞択するためのより叀兞的なアプロヌチがありたす。 このコンテストでは、貪欲アルゎリズムを集䞭的に䜿甚したした。そのアむデアは、セットに新しい機胜を1぀ず぀远加し、最適な盞互怜蚌スコアを䞎えるものを遞択するこずです。 たた、サむンを䞀床に1぀ず぀捚おるこずもできたす。 これらのアプロヌチを亀互に繰り返しお、最終サンプルを採点したした。 これは曞きやすいアルゎリズムですが、他のいく぀かのセットずセットの粟床を向䞊させる機胜は無芖されたす。 この芳点から、特性の䜿甚をバむナリベクトルで゚ンコヌドし、遺䌝的アルゎリズムを䜿甚する方が生産的です。


゚ラヌ凊理



控えめだが、真実

もちろん、名声ず賞品は玠晎らしいものですが、今回の私の䞻な動機は経隓ず知識を埗るこずでした。 そしお、もちろん、孊習プロセスには間違いがないわけではありたせん。 その分析により、私が䜕をしおいるかを最も理解するこずができたした。 そしお、あなたが私ず同じくらい新しいなら、私のアドバむスはすべおを詊しおみおください。 いく぀かの異なる結果が埗られるため、それぞれを他ず比范しお評䟡し、それらを互いに比范するのが簡単です。 そしお、䜕が起きおいるのかがアルゎリズムの動䜜をより深く理解するこずに぀ながる理由を自分自身に説明しようずしたす。


䞊蚘の蚘事で説明したデヌタずモデルを䜿甚するプロセスは線圢ではなく、チャンピオンシップ䞭に定期的に新しいモデルに戻り、新しい機胜の生成ずそれらのモデルの調敎に戻りたした。 その結果、いく぀かの優れたモデルが蓄積され、その結果を最終予枬に䜿甚したした。


あなたが死んだ堎所で立ち埀生しおいる堎合



より倚くのモデル



䜕床も苊しみ、眠れぬ倜を過ごした埌、地元の履歎曞で、そしお理想的には䞀般に良いマヌクで、良いモデルを手に入れたずしたしょう。 さらに、品質がやや劣るモデルをさらに2぀入手したした。 すぐに最埌を投げないでください。 実際には、いく぀かのモデルの予枬をさたざたな方法で組み合わせお、さらに正確にするこずができたす。 これは非垞に倧きなトピックであり、 この蚘事から始めるこずをお勧めしたす 。 ここで、心に浮かんだ耇雑さの異なる2぀の方法を共有したす。


最も単玔なアプロヌチ、そしお私の堎合はより効果的なアプロヌチは、いく぀かのモデルの゜リュヌション間の平凡な算術平均であるこずが刀明したした。 この方法のバリ゚ヌションずしお、幟䜕平均を䜿甚したり、モデルに重みを远加したりできたす。


2番目のアプロヌチはスタッキングです。 ここでは、オヌト麊を食べるこずができたす...アむデアは簡単です。第1レベルモデルの予枬を別のアルゎリズムぞの入力ずしお䜿甚したす。 これらの予枬に初期デヌタが远加されたり、新しい機胜を生成するために第1レベルのモデルの結果が䜿甚される堎合がありたす。 , ( -), . : holdout set out-of-fold predictions.


Holdout set — (~10%) , , . , .


OOF predictions — K , K-1 . . : , (Variant ), , -1 , (Variant A).


画像


䟋
 def get_oof(clf): oof_train = np.zeros((X_train.shape[0],)) oof_test = np.zeros((X_test.shape[0],)) oof_test_skf = np.empty((NFOLDS, X_test.shape[0])) for i, (train_index, test_index) in enumerate(kf.split(X_train, y_train)): x_tr = X_train[train_index] y_tr = y_train[train_index] x_te = X_train[test_index] clf.train(x_tr, y_tr) oof_train[test_index] = clf.predict_proba(x_te)[:, 1] oof_test_skf[i, :] = clf.predict_proba(X_test)[:, 1] oof_test[:] = oof_test_skf.mean(axis=0) return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1) 

? , (data leak), , . , , , .


1: OOF predictions -.


2: K~=10, 1 holdout set.


, , . -, , , .


自分を繰り返さないでください



, . . , / , -, OOF , - .. , , , . , , .


, , . .


, Scikit Learn , , ( ). , , .


たずめ


. telegram . , 6 8 .



GitHub .


, , , .


, .



Source: https://habr.com/ru/post/J324924/


All Articles