2016-02-15 11 views
5

Ich versuche f-Score von scikit-lernen als Bewertungsmaß in xgb Klassifikator verwenden. Hier ist mein Code:Verwenden von f-Score in xgb

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) 

Aber es ist ein Fehler:

Can't handle mix of binary and continuous

Antwort

3

Das Problem ist, dass f1_score versucht nichtbinäres gegen binäre Ziele zu vergleichen und standardmäßig diese Methode funktioniert binäre Mittelung. Von documentation "Durchschnitt: Zeichenfolge, [Keine, 'Binär' (Standard), 'Mikro', 'Makro', 'Proben', 'Gewichtet']".

Wie auch immer, es ist sagen, dass Ihre Vorhersage ist so etwas wie [0.001, 0.7889,0.33...] und Ihr Ziel ist binär [0,1,0...]. Wenn Sie also Ihren Schwellenwert kennen, empfehle ich Ihnen, Ihr Ergebnis vorzuverarbeiten, bevor Sie es an die f1_score-Funktion senden. Üblicher Wert der Schwelle wäre 0.5.

Getestetes Beispiel für Ihre Bewertungsfunktion. Der Fehler wird nicht mehr ausgegeben:

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)