xgboostの加法性バイアス(およびその修正?)


9

私は今コンテストに参加しています。私はそれをうまくやるのが私の仕事だと知っていますが、私の問題とその解決策について、他の人にとっても助けになるかもしれないので、誰かがここで私の問題とその解決策について話したいと思うかもしれません。

私はxgboostモデル(ツリーベースのモデルと線形モデルとその2つのアンサンブル)をトレーニングしました。既にここで説明したように、トレーニングセット(交差検証を行った場合)の平均絶対誤差(MAE)は小さく(約0.3)、保持されたテストセットでは誤差は約2.4でした。その後、競争が始まり、エラーは約8(!)でした。驚くべきことに、 予測は常に真の値より約8〜9高くなりました!! 画像の黄色で囲まれた領域を参照してください。

ここに画像の説明を入力してください

トレーニングデータの期間は2015年10月に終了し、コンテストは今すぐ始まりました(16年4月、テスト期間は3月に約2週間)。

今日、私は自分の予測から定数値9を差し引いただけで、エラーは2になり、リードボードで3を獲得しました(この1日分)。;)これは黄色の線の右側の部分です。

だから私が議論したいこと:

  • xgboostは、切片項をモデル方程式に追加することに対してどのように反応しますか?システムの変更が多すぎる場合、これによりバイアスが発生する可能性がありますか(私の場合、10月15日から4月16日のように)。
  • インターセプトなしのxgboostモデルは、ターゲット値の平行シフトに対してより堅牢になるでしょうか?

私は9のバイアスを差し引いていきます。誰か興味があれば、結果を表示できます。ここでより多くの洞察を得ることはちょうどより興味深いでしょう。


テストデータに基づいて手動でモデルを変更したように聞こえるので、はい、それは良いですが、再現可能ではありません。モデルはデータの曲率に非常によく一致しています。この領域でのエラーの原因は、赤い線が急降下し、青い線が上昇する最初にあるようです。この動作をモデル化する方法を見つけようと思います。
ウィンク2016

@Winksに戻ってきてくれてありがとう!競争の前にテスト期間があり、8-9エラーがあり、常に肯定的であったと言わざるを得ないので、スクリーンショットの最初の動きだけではなく、システム全体が変わったようです。他の競合他社は、最初からそれを正しく持っているように見えます...そうです、そうです、多分私はただひどく悪いのかもしれません...または彼らはより良いデータを使用しています。すべてがトレーニングデータ(およびトレーニング/テストの分割とx検証...)でそれほど堅牢である一方で、この悪いエラーを目にして驚いただけです。
Ric

回答:


3

私は自分に答えて、誰かが興味があれば私の発見を知らせます。

最初のバイアス:私はすべての最近のデータを収集し、相関性をフォーマットするなどの時間をかけました。私はずっと前にこれをやるべきだった。画像は次のとおりです。

ここに画像の説明を入力してください

2015年末から4月16日までのデータが表示されます。価格レベルはまったく異なります。2015年のデータでトレーニングされたモデルは、この変更を得ることができません。

第二:xgboostの適合。私は次のセットアップが本当に好きでした。トレーニングとテストのエラーは今では非常に近く、まだ良好です:

xgb_grid_1 <- expand.grid(
    nrounds = c(12000),
    eta = c(0.01),
    max_depth = c(3),
    gamma = 1,
    colsample_bytree = c(0.7),
    min_child_weight = c(5) 
  )

  xgb_train_1 <- train(
    x = training,y = model.data$Price[inTrain],
    trControl = ctrl,
    tuneGrid = xgb_grid_1,
    method="xgbTree" 
   ,subsample = 0.8
    )

したがって、私は多くの木を使用し、それらのすべては最大で3分割の深さです(ここで推奨されています)。これを行うと、計算が速くなり(ツリーのサイズは分割ごとに2倍に増加します)、オーバーフィットが減少したようです。

私の要約:葉の数は少ないがたくさんある木を使用して、最近のデータを探します。競争のために、これは私にとって不運でした...


これを共有していただきありがとうございます(+1)。あなたのコードに関して明白な質問をするためだけに:あなたは明らかにここでグリッドに沿って検索しないでください。単一のパラメータ設定に対してトレーニング(およびリサンプリング統計を取得)するだけです。異なるパラメーター値を使用して「3」に出くわしましたか?「3」はRMSEまたはその他の基準に基づいて最適でしたか?
usεr11852

@usεr11852xgoostを使用した「最初の日」で、max_depthを選択しすぎました。私の回答のリンク(「ここ」)をたどると、ディスカッションが表示されます。最後に3を選択しました。上のコードで示したように、キャレットパッケージを使用してグリッド検索を実行できます。または、xgboostでいくつかのルーチンを直接使用でき、最近、同じことをするmlrを使い始めました。ノイズが多いほど、深度を選択します(多くの場合、1または2のみ)。
Ric

返信いただきありがとうございます。コメントではありません:D。コメントの前に(「ここ」)リンクを読みましたが、「アドバイスを3から3に取りましたが...」という基準(MAE?)に基づいて最適な深さはコメントされていません。RMSE / MAEエラーまたは他の何に基づいて「3」が最適でしたか(テスト/トレーニングエラー間の最小の不一致)?たとえば、私は日常的に直接ツリーの深さをグリッド検索しますが、おそらく「3」を使用していませんか?
usεr11852

厳密にコメントすると、なぜからcaretに移動したのmlrですか?私には、彼らはかなり重複して購入しているように見えます。
usεr11852

@usεr11852の最初のコメント:これがMLコンテストの場合は、おそらく深さをグリッド検索する必要があります。これは明確なシグナルを伴う予測競争であり、私の心では良い機能(たとえば、気象変数)の選択がより重要でした。ターゲットが体制の切り替えを実行したため、ライブペリロイド中に代表的なデータが十分になかったので、深さを3にしました。
Ric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.