2016-02-15 19 views
5

Ben x-class sınıflandırıcısında değerlendirme ölçütü olarak scikit-learn'den f-skorunu kullanıyorum. İşte benim kodudur:xgb içinde f-skoru kullanma

clf = xgb.XGBClassifier(max_depth=8, learning_rate=0.004, 
          n_estimators=100, 
          silent=False, objective='binary:logistic', 
          nthread=-1, gamma=0, 
          min_child_weight=1, max_delta_step=0, subsample=0.8, 
          colsample_bytree=0.6, 
          base_score=0.5, 
          seed=0, missing=None) 
scores = [] 
predictions = [] 
for train, test, ans_train, y_test in zip(trains, tests, ans_trains, ans_tests): 
     clf.fit(train, ans_train, eval_metric=xgb_f1, 
        eval_set=[(train, ans_train), (test, y_test)], 
        early_stopping_rounds=900) 
     y_pred = clf.predict(test) 
     predictions.append(y_pred) 
     scores.append(f1_score(y_test, y_pred)) 

def xg_f1(y, t): 
    t = t.get_label() 
    return "f1", f1_score(t, y) 

Ama bir hata var:

Can't handle mix of binary and continuous

cevap

3

sorun f1_score ikili hedeflere karşı ve bu yöntem ikili yapar varsayılan olarak olmayan ikili karşılaştırmaya çalışıyor olmasıdır ortalama. "ortalama: string, [Yok, 'ikili' (varsayılan)," mikro "," makro "," örnek "," ağırlıklı "]".

Her neyse, bu sizin tahmininizin bu [0.001, 0.7889,0.33...] gibi bir şey olduğunu ve hedefinizin [0,1,0...] ikili olduğunu söylüyor. Bu nedenle, eşiğinizi biliyorsanız, f1_score işlevine göndermeden önce sonucunuzu ön işlem yapmanızı öneririm. Eşiğin normal değeri 0.5 olacaktır.

Değerlendirme işlevinizin örneği örneği. Artık hata çıkmıyor:

def xg_f1(y,t): 
    t = t.get_label() 
    y_bin = [1. if y_cont > 0.5 else 0. for y_cont in y] # binaryzing your output 
    return 'f1',f1_score(t,y_bin)