土曜日に、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 )