xgb lgb 自定義評價函數差別

關於xgb lgb自定義評價函數,其實是區別的,
但步驟都是一樣的

XGB:

#自定義評價函數---適用於XGBClassifier
#preds是預測結果概率-但是需要轉換成label
#dtrain是xgb的矩陣,使用get_label() 可獲取到真實的label
def get_f1 (preds,dtrain):
    label=dtrain.get_label()
    preds= np.argmax(preds.reshape(12, -1), axis=0)
    f1=f1_score(label,preds,average='weighted')
    return '1-f1_score',1-float(f1)
#調用--注意默認是最小化評價函數,如果你需要最大化,選擇1-metric 就可以了
#因爲我沒在文檔中找到最大化的參數
model=XGBClassifier()
model.fit(train_x,train_y,eval_set=[(train_x,train_y)],early_stopping_rounds=10)
#------------------------------
#適用於xgb原生接口
#區別就在於這裏的preds是預測的結果標籤
#自定義評價函數
def get_f1 (preds,dtrain):
    label=dtrain.get_label()
    f1=f1_score(label,preds,average='weighted')
    return 'f1-score',float(f1)
#這裏調用--maxmize 參數實現最大化評價參數
model=xgb.train(params,dtrain,num_boost_round=50,evals=watchlist,feval=get_f1,
maximize=True,early_stopping_rounds=10)

#-----------------------------------------------------


LGB:

lgb使用兩個接口的定義都一樣,我們使用原生的接口輸出的predict()也是概率值,所以這就對應了。

#自定義評價函數
#注意需要返回三個參數,最後一個參數的含義是是不是metric越大越好,這裏也就是f1越大越好呀。
def get_f1 (preds,dtrain):
    label=dtrain.get_label()
    preds=np.argmax(preds.reshape(len(label),-1), axis=1)
    f1=f1_score(label,preds,average='weighted')
    return 'f1-score',float(f1),Ture
#調用與xgb沒區別
bst = lgb.train(params,lgb_train,num_boost_round=50,valid_sets=lgb_val,
feval=get_f1,early_stopping_rounds=10)

ps:

xgb和lgb都有對應的兩個庫實現
其中xgb原生庫輸出預測結果是label標籤,sklearn的庫輸出的是概率標籤都可以。
lgb原生庫輸出的是概率,sklearn的庫概率標籤都可以直接輸出。


end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章