2016-02-15 5 views
5

Sto provando ad utilizzare il punteggio f da scikit-learn come metrica di valutazione nel classificatore xgb. Ecco il mio codice:Utilizzo di 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) 

Ma c'è un errore:

Can't handle mix of binary and continuous

risposta

3

Il problema è che f1_score sta cercando di confrontare non binario vs binari obiettivi e per impostazione predefinita questo metodo non binaria media. Da documentation "media: stringa, [Nessuno, 'binario' (predefinito), 'micro', 'macro', 'campioni', 'ponderato']".

In ogni caso, si sta dicendo che la tua previsione è qualcosa di simile a questo [0.001, 0.7889,0.33...] e il tuo target è binario [0,1,0...]. Quindi, se conosci la tua soglia, ti consiglio di preelaborare il risultato prima di inviarlo alla funzione f1_score. Il valore usuale della soglia sarebbe 0.5.

Testato esempio della funzione di valutazione. Non viene più visualizzato alcun errore:

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)