QML:機械学習コンテストmail.ruでTシャツを入手するのは簡単です



土曜日に、mail.ru MLブートキャンプ5からの1か月の機械学習コンテストが終了しました14位になりました。 これは私が服を獲得した3回目のコンペティションであり、参加する過程でフレームワークを作成しました (QMLと呼ばれ、ニックネームと機械学習の略です)。 MLブートキャンプ5ソリューションを例として使用して、その使用方法を説明します。


予想どおり、最初に商品の顔を表示します:)



それでは、競合の解決を始めましょう(完全なソリューションスクリプトについては、 こちらをご覧ください )。


最初に、 フレームワークリポジトリのクローンを作成し、 インストールファイルに記述されている不足しているパッケージをインストールし、 config.pyで設定を指定します。


次に、 qml/db/schema.sql持つファイルからデータベースに必要なテーブルを作成し、id trainとtestセット( qml_workdir/data/ids_test.csvqml_workdir/data/ids_train.csv )を持つファイルと最初のバージョンのデータを持つファイル( qml_workdir/data/v0001_test_x.csvqml_workdir/data/v0001_train_x.csvqml_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行のコードで:



idと見出しを持つ列を削除し、コンテストウェブサイトに送信します。 結果は次のようになります。




この結果により、私たちは公開理事会で497位、私立理事会で484位になります。


まあ、十分ではありません。 データを見てみましょう。


フィールドweightheightap_hiap_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を使用して最適なモデルパラメーターを選択します。


パラメーター選択の例 。 スクリプトの興味深い内容から:



朝にパラメータの選択を夜に残して、あなたが私たちがnatyunilsyaで何を見ることができるか


mysqlクエリ
 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番目の列を示します。


興味深いから:



その結果、以下の列(データのバージョン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位。 ヴァレリーははるかに遅れていますが、チャットオイル催眠術師は先に迫っています。 追いつく必要があります。


ブレインストーミングのために座ります:



このすべて(データのバージョン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_lodiv6__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レベルの最良のモデルを平均します。


興味深いから:



2番目の最後のモデルは、異なるデータを持つ異なる数のモデルで7つのスタッキングを平均化することです。 盗むのが面白いなら、これはダンプからモデル番号109639です


公開委員会では、このモデルはさまざまな単一xgboostの8 sidを平均するよりも悪い結果を出しましたが、クロス検証を信じて選択しました。 xgboostの平均から、フォールドのCV結果がスタッキングモデルと異なるように平均化を選択しました。 いくつかの折り目では、スタッキングモデルが顕著に優れていた(-0.0001)、他の場合は顕著に悪かった


はい、タイトルは黄色に変わりました、それはいくつかの勝者ほど簡単ではないことがわかりました:


1 ニキータ・サーキン
2 ローマシャヤクメトフ
3 イワン・フィロノフ
4 アレクサンダー・I-モルティド・キセレフ
9 Ivan Tyamgin (慎重に、 Rr



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


All Articles