 
      
      
        
        
        
      
     土曜日に、mail.ru MLブートキャンプ5からの1か月の機械学習コンテストが終了しました 。  14位になりました。 これは私が服を獲得した3回目のコンペティションであり、参加する過程でフレームワークを作成しました (QMLと呼ばれ、ニックネームと機械学習の略です)。  MLブートキャンプ5ソリューションを例として使用して、その使用方法を説明します。 
予想どおり、最初に商品の顔を表示します:)
- メタモデルでの将来の使用のためのモデル計算の中間結果の保存(相互検証結果を含む)
- さまざまな平均化とスタッキングのモデル
- 機能選択用のヘルパースクリプト
それでは、競合の解決を始めましょう(完全なソリューションスクリプトについては、 こちらをご覧ください )。
最初に、 フレームワークリポジトリのクローンを作成し、 インストールファイルに記述されている不足しているパッケージをインストールし、 config.pyで設定を指定します。
次に、 qml/db/schema.sql
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    持つファイルからデータベースに必要なテーブルを作成し、id trainとtestセット( qml_workdir/data/ids_test.csv
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 qml_workdir/data/ids_train.csv
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     )を持つファイルと最初のバージョンのデータを持つファイル( qml_workdir/data/v0001_test_x.csv
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 qml_workdir/data/v0001_train_x.csv
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 qml_workdir/data/train_y.csv
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     ) この記事では取り上げません。 
次に、ファイルwork.pyを作成します。 このファイルでは、以下のコードを記述して実行します
 # imports cv = QCV(qm) print(cv.cross_val(1, 1)) qm.qpredict(1, 1)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
           1 0.545776154551
     2 0.545405471315
     3 0.543444368229
     4 0.539330473549
     5 0.537107693689
 0.542212832267
3行のコードで:
- models.pyファイルのモデル番号1の5つのフォールド(ハードコード)で相互検証
- 折り目への折り畳みを記録したので、後で結果を比較するのに便利でした
- 各フォールドの結果とフォールドの平均結果を見ました
-  相互検証の結果をデータベースに保存しました( qml_results
 
 
 
 およびqml_results_statistic
 
 
 
 参照)
-  テストセットの予測ファイルを取得しました( qml_workdir/data/res/m0000001_d001__tr_70000_ts_30000__h_29c96aaed585f02e30096f265faca72c_s_1000.csv
 
 
 
 )
idと見出しを持つ列を削除し、コンテストウェブサイトに送信します。 結果は次のようになります。
 
      
      
        
        
        
      
     この結果により、私たちは公開理事会で497位、私立理事会で484位になります。 
まあ、十分ではありません。 データを見てみましょう。
 フィールドweight
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 height
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 ap_hi
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 ap_lo
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    には多くの不明瞭なデータがあり、 それらをクリアし 、 ボディマスインデックスとBMIクラスをプレートから追加することがわかります。 
 テストセットでは、いくつかの主観的な兆候が削除され、これらの列の値の分布を見て、アクティブのNaN
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    を1に、煙とアルコを0に置き換えています。したがって、すでに6番目のバージョンのデータがあります。 
ちなみに、この年齢の人のこのような活動に驚かないでください。そのため、健康診断中にアクティブとして登録されると、1日30分以上歩くだけで済みます。
 # imports cv = QCV(qm) print(cv.cross_val(1, 6)) qm.qpredict(1, 6)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
           1 0.545776154551
     2 0.545405471315
     3 0.543444368229
     4 0.539330473549
     5 0.537107693689
 0.542212832267
結果:
 
      
      
        
        
        
      
     パブリックボードでは477、プライベートでは470、C-安定性:)しかし、安定性は私たちにとって十分ではありません。この暑い夏には涼しい黒いTシャツを着る必要があります。 
どちらの場合も、 パラメーターをrandomに設定してxgboostを介してデータを実行しました 。 hyperoptを使用して最適なモデルパラメーターを選択します。
-   DATAS = [6]
 
 
 
 -複数のバージョンのデータを一度に調整できます
-   early_stop_cv
 
 
 
 パラメーターは、現在のパラメーターとの交差検証を停止し、現在のフォールドの結果を返します。コールバックがTrue
 
 
 
 返す場合、保存された分割内のフォールドを手動でソートして、CVスコアが最も高いフォールドが最初になるようにすると便利です。 その後、すべてのフォールドの検証を待たずに、失敗したモデルを除外できます
-   num_boost_rounds
 
 
 
 およびeta
 
 
 
 は1.3の増分でnum_boost_rounds
 
 
 
 します
-   model_id = qm.add_by_params(..
 
 
 
 後で番号でダウンロードできるように、そのようなパラメータを持つモデルをデータベースに追加します
-   tree_method='hist'
 
 
 
 -Microsoft製品嫌いの場合
-   seed=1000
 
 
 
 安定性を明らかにするために8つの側面で各モデルを実行します
- 各sidの分割からの各フォールドの予測結果が保存されます。これは後でメタモデルに役立ちます
朝にパラメータの選択を夜に残して、あなたが私たちがnatyunilsyaで何を見ることができるか
 select data_id, model_id, max(cv_diff), max(std), sum(sum_sc)/sum(cnt), sum(cnt), r.cv_time, m.cls, m.level, m.params from ( select model_id, fold, data_id, sum(cv_score) as sum_sc, std(cv_score) as std, max(cv_score)-min(cv_score) as cv_diff, count(*) as cnt from qml_results_statistic group by model_id, data_id, fold ) q left join qml_results r using (model_id, data_id) left join qml_models m using (model_id) group by data_id, model_id order by sum(sum_sc)/sum(cnt) limit 10000;
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      おおよその結果:
 
      
      
        
        
        
      
      CVでは1255モデルの方が優れていることがわかりますが、8つのシード間での1倍の広がりは大きくなっています。 さらに、標識の追加を検証するために、見つかったものの中で最も安定したモデル1395を使用します。 
なぜなら CVスコアが大幅に改善されました。送信してみてください:
 
      
      
        
        
        
      
     ああ、公的リーダーボード上の161の場所と私的上の164の場所! レフ・リトロボドチキンは、世間で7位だったウラジミール・オメルチェンコ(10位)とアンディ・パーコフ(14位)よりも優れています。 
Valery Babushkinを追い越す時です!
dataの20番目のバージョンを作成してみましょう。ここでは、利用可能な列の2つと3つの組み合わせを交互に加算、減算、乗算、除算して列を追加します。
新しいデータでモデルを実行すると、結果がデータなしの場合よりも悪くなります(ブートキャンプ3でこれを知っていた場合..)。 新しい列を1つずつ追加し、相互検証を開始して、結果が改善された場合にのみ終了する必要があります。
結果のデータを同様のスクリプトに送り、3番目のパラメーターとして使用可能な列と、確認する4番目の列を示します。
興味深いから:
-   QAvgOneModelData(model_id, 8)
 
 
 
 -元のモデルではなく、安定性を高めるために8つの異なるsidで元のモデルの予測を平均化する交差検証を実行します
-   early_stop_cv
 
 
 
 再びすべての分割を駆動しません
-   log_file='qml_workdir/logs/feat12.txt'
 
 
 
 作業の結果はログファイルに書き込まれ、ソートして現在の実行の最適な列を簡単に取得できます。
その結果、以下の列(データのバージョン47)を追加すると、CVが向上することがわかりました。
-  x__age__gluc_all
 
 
 
 
-  x__ap_hi__cholesterol_all
 
 
 
 
-   div6__height__gluc_all__imt
 
 
 
 -1/height/gluc_all*imt
 
 
 
 
-  plus__age_norm__ap_hi_norm__gluc_all_norm
 
 
 
 
-  x__age__weight
 
 
 
 
-   div1__age__weight__cholesterol_all
 
 
 
 age*weight/cholesterol_all
 
 
 
 div1__age__weight__cholesterol_all
 
 
 
 
-   div6__age__weight__cholesterol_all
 
 
 
 -1/age/weight*cholesterol_all
 
 
 
 div6__age__weight__cholesterol_all
 
 
 
 
-  plus__height_norm__weight_norm__gluc_all_norm
 
 
 
 
-   div1__ap_hi__ap_lo__cholesterol_all
 
 
 
 -ap_hi*ap_lo/cholesterol_all
 
 
 
 
-   div6__ap_hi__ap_lo__cholesterol_all
 
 
 
 -1/ap_hi/ap_lo*cholesterol_all
 
 
 
 
-  plus__age_norm__gluc_all_norm__imt_norm
 
 
 
 
-  minus6__ap_hi_norm__ap_lo_norm__cholesterol_all_norm
 
 
 
 
-  minus1__ap_hi_norm__ap_lo_norm__cholesterol_all_norm
 
 
 
 
-  minus6__age_norm__ap_lo_norm__cholesterol_all_norm
 
 
 
 
-  minus1__age_norm__ap_lo_norm__cholesterol_all_norm
 
 
 
 
-   div6__height__weight__ap_lo
 
 
 
 -1/height/weight*ap_lo
 
 
 
 
-  div2__ap_lo__cholesterol_all__gluc_all
 
 
 
 
-  x__age__ap_hi__gluc_all
 
 
 
 
-  div5__ap_lo__cholesterol_all__gluc_all
 
 
 
 
まあ、少なくともこのリストにはimt * height * height列はありませんでした。
新しいデータでモデルを実行しましょう:
 
      
      
        
        
        
      
      Ooh、公開で40位、個人で81位。 ヴァレリーははるかに遅れていますが、チャットオイル催眠術師は先に迫っています。 追いつく必要があります。 
ブレインストーミングのために座ります:
- ハンドブックからKMeansを取得する
- 私たちは主題を研究し、 SCOREスケールを見つけます
- Google、他にどのように機能を生成できますか、私たちは人々がExcelでそれを行う方法を見つけます
このすべて(データのバージョン66)を実現し、最終データでモデルチューニングを再度実行します。
 {"alpha": 0.008, "booster": "gbtree", "colsample_bylevel": 0.6, "colsample_bytree": 1.0, "eta": 0.004, "eval_metric": "logloss", "gamma": 0.2, "max_depth": 4, "num_boost_round": 2015, "objective": "binary:logistic", "subsample": 0.7, "tree_method": "hist"}
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
       その後、一度に1つの列をdiv6__height__weight__ap_lo
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、 div6__height__weight__ap_lo
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     CVスコア列がなければ、より容赦なくdiv6__height__weight__ap_lo
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    することがdiv6__height__weight__ap_lo
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    ます(バージョン69)。 
ソースデータで新しい最適な単一モデルを実行します。
 
      
      
        
        
        
      
     パブリック-26、プライベート-50。 催眠術師が回りました、私たちのTシャツ! 
やめる時が来たようですが、もっと欲しいです。 このモデルの8 sid以上の平均を送信しましょう:
 
      
      
        
        
        
      
     パブリック-21位(これらの平均値が解決策の1つとして選択されました。 ダンプの 0109872の下にあります)、プライベート-34位。 催眠術師は迂回して公になった。 
良いが、十分ではない。 さまざまな モデル を生成し ます 。 一部のモデルでは、NaNの正規化と充填が実行されました。
さまざまなデータで最良のモデルを平均して積み重ねます。 その後、もう一度第2レベルの最良のモデルを平均します。
興味深いから:
-  なぜなら モデルの相互検証の結果が保存され、平均化の誤計算が発生します 
      
 
 すぐに
- モデルの最初のスタックの計算ミスには時間がかかり、その後、保存された結果が再利用されます
- Kaggle Ensembling Guide
- スタッキングとブレンド
- 最初は、xgboostとLogisticRegressionを第2レベルのモデルとして採用しましたが、これは機能しませんでした。 その後、チャットでValery Babushkin が Mercedes 、googleについて話したときにリッジ回帰について言及し、上記の段落の記事を見つけて、それを第2レベルのモデルとして使用し始め、うまくいったことを思い出しました。 そして、私は1つのxgboostでそれを回りました。 うまくいきませんでした。
2番目の最後のモデルは、異なるデータを持つ異なる数のモデルで7つのスタッキングを平均化することです。 盗むのが面白いなら、これはダンプからモデル番号109639です
公開委員会では、このモデルはさまざまな単一xgboostの8 sidを平均するよりも悪い結果を出しましたが、クロス検証を信じて選択しました。 xgboostの平均から、フォールドのCV結果がスタッキングモデルと異なるように平均化を選択しました。 いくつかの折り目では、スタッキングモデルが顕著に優れていた(-0.0001)、他の場合は顕著に悪かった
はい、タイトルは黄色に変わりました、それはいくつかの勝者ほど簡単ではないことがわかりました:
  1 ニキータ・サーキン 
      
        
        
        
      
      2 ローマシャヤクメトフ 
      
        
        
        
      
      3 イワン・フィロノフ 
      
        
        
        
      
      4 アレクサンダー・I-モルティド・キセレフ 
      
        
        
        
      
      9 Ivan Tyamgin (慎重に、 Rr )