2017-04-25 58 views
0

sklearn-style API of XGBClassifier,我們可以提供早期停止的評估示例。如何爲XGBClassifier.fit()提供加權評估集?

eval_set(列表中,可選) - (X,Y)對作爲 驗證集合以用於早期停止

然而列表,該格式只提到了對功能和標籤。因此,如果文檔是準確的,那麼就沒有地方爲這些評估示例提供權重。

我錯過了什麼?

如果在sklearn風格中無法實現,是否支持原始(即非sklearn)XGBClassifier API?一個簡短的例子會很好,因爲我從來沒有使用該版本的API。

回答

1

編輯 - 在註釋中每個對話已更新

假設你有一個目標變量代表實值收益/損失值,你想爲「收益」或「損失」進行分類,願與您以確保驗證設置分類的重大絕對值收益/損失最重的,這裏有兩種可能的方法:

  1. 創建這是剛剛XGBoostRegressor送入treshold一個自定義分類,其中實估值迴歸預測被轉換爲1/0或「增益」/「損失」分類。此分類器的.fit()方法只會調用xgbregressor的.fit(),而此分類器的.predict()方法將調用迴歸器的.predict(),然後返回閾值類別預測。

  2. 你提到過你想嘗試在你的驗證集中加權處理記錄,但是在xgboost中沒有這個選項。實現這一點的方法是實現自定義eval-metric。但是,您指出eval_metric必須能夠一次返回單個標籤/ pred記錄的分數,因此它不能接受所有行值並在eval度量標準中執行加權。您在評論中提到的解決方案是「創建一個可調用的函數,它可以引用所有驗證示例,將索引(而不是標籤和分數)傳遞給eval_set,使用索引從可調用函數中獲取標籤和分數並返回每個驗證示例的度量標準「。這也應該起作用。

我會傾向於選擇選項1更簡單,但嘗試兩種不同的方法,並比較結果通常是一個好主意,如果你有時間,這麼有興趣如何將這些變成你。

+0

是的我知道'sample_weight'並且認爲它看起來與這個問題無關。 – Roy

+0

根據'eval_metric',顯然可調用每次只需要一個標籤 - 評分對,因此它不是爲每個驗證示例傳遞權重。我想我們可以創建一個可調用的對所有驗證示例的引用,將索引(而不是標籤和分數)傳遞給'eval_set',使用索引從每個驗證示例的可調用和返回度量標準中獲取標籤和分數。可以將總重量歸一化爲1.這樣,每個驗證示例返回的值將總計爲總體加權度量。 – Roy

+0

我認爲你的建議是可行的。我會等待幾天,看看有沒有更好的建議。如果沒有,我會標記你的答案。感謝您的努力!爲了其他讀者的緣故,你是否想用我自己的話寫上面的方法來提供你的答案,或者參考我的評論? – Roy