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.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行のコードで:









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







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









朝にパラメータの選択を夜に残して、あなたが私たちが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_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レベルの最良のモデルを平均します。







興味深いから:









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







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







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







1 ニキータ・サーキン

2 ローマシャヤクメトフ

3 イワン・フィロノフ

4 アレクサンダー・I-モルティド・キセレフ

9 Ivan Tyamgin (慎重に、 Rr








All Articles