def tpr_weight_funtion(y_true,y_predict): d = pd.DataFrame() d['prob'] = list(y_predict) d['y'] = list(y_true) d = d.sort_values(['prob'], ascending=[0]) y = d.y PosAll = pd.Series(y).value_counts()[1] NegAll = pd.Series(y).value_counts()[0] pCumsum = d['y'].cumsum() nCumsum = np.arange(len(y)) - pCumsum + 1 pCumsumPer = pCumsum / PosAll nCumsumPer = nCumsum / NegAll TR1 = pCumsumPer[abs(nCumsumPer-0.001).idxmin()] TR2 = pCumsumPer[abs(nCumsumPer-0.005).idxmin()] TR3 = pCumsumPer[abs(nCumsumPer-0.01).idxmin()] return 0.4 * TR1 + 0.3 * TR2 + 0.3 * TR3 def myFeval(preds, xgbtrain): label = xgbtrain.get_label() score=tpr_weight_funtion(label, preds) return 'myFeval',score model = xgb.train(params, xgb_train_data,num_boost_round=2000,evals= [(xgb_train_data, 'train'),(xgb_val_data, 'valid')],early_stopping_rounds=100,verbose_eval=500,feval = myFeval)
在末尾加上一句 feval = myFeval