2016-02-15 14 views
5

Tôi đang cố gắng sử dụng điểm số f từ scikit-learn làm chỉ số đánh giá trong trình phân loại xgb. Đây là mã của tôi:Sử dụng điểm số f trong 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) 

Nhưng có một lỗi:

Can't handle mix of binary and continuous

Trả lời

3

Vấn đề là f1_score đang cố gắng để so sánh phi nhị phân so với mục tiêu nhị phân và theo mặc định phương pháp này không nhị phân trung bình. Từ documentation "trung bình: chuỗi, [Không có,‘ nhị phân ’(mặc định),‘ micro ’,‘ macro ’,‘ samples ’,‘ weighted ’]”.

Dù sao, nó được nói rằng dự đoán của bạn là một cái gì đó như thế này [0.001, 0.7889,0.33...] và mục tiêu của bạn là nhị phân [0,1,0...]. Vì vậy, nếu bạn biết ngưỡng của bạn, tôi khuyên bạn nên xử lý trước kết quả của bạn trước khi gửi nó đến hàm f1_score. Giá trị thông thường của ngưỡng sẽ là 0.5.

Ví dụ được kiểm tra về hàm đánh giá của bạn. Không xuất ra lỗi nữa:

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) 
Các vấn đề liên quan