这个evaluate_model函数经常被使用,我在IBM的这里发现它被使用过。但我在这里展示这个函数:
def evaluate_model(alg, train, target, predictors, useTrainCV=True , cv_folds=5, early_stopping_rounds=50): if useTrainCV: xgb_param = alg.get_xgb_params() xgtrain = xgb.DMatrix(train[predictors].values, target['Default Flag'].values) cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds, metrics='auc', early_stopping_rounds=early_stopping_rounds, verbose_eval=True) alg.set_params(n_estimators=cvresult.shape[0]) #Fit the algorithm on the data alg.fit(train[predictors], target['Default Flag'], eval_metric='auc') #Predict training set: dtrain_predictions = alg.predict(train[predictors]) dtrain_predprob = alg.predict_proba(train[predictors])[:,1] #Print model report: print("\nModel Report") print("Accuracy : %.6g" % metrics.accuracy_score(target['Default Flag'].values, dtrain_predictions)) print("AUC Score (Train): %f" % metrics.roc_auc_score(target['Default Flag'], dtrain_predprob)) plt.figure(figsize=(12,12)) feat_imp = pd.Series(alg.get_booster().get_fscore()).sort_values(ascending=False) feat_imp.plot(kind='bar', title='Feature Importance', color='g') plt.ylabel('Feature Importance Score') plt.show()
在调整XGboost的参数后,我有
xgb4 = XGBClassifier( objective="binary:logistic", learning_rate=0.10, n_esimators=5000, max_depth=6, min_child_weight=1, gamma=0.1, subsample=0.8, colsample_bytree=0.8, reg_alpha=0.1, nthread=4, scale_pos_weight=1.0, seed=27)features = [x for x in X_train.columns if x not in ['Default Flag','ID']]evaluate_model(xgb4, X_train, y_train, features)
我得到的结果是
Model ReportAccuracy : 0.803236AUC Score (Train): 0.856995
我有一个问题,可能有些不太明智,那就是这个evaluate_model()
函数并没有在数据的测试集上进行测试,这让我觉得奇怪。当我在测试集上调用它时(evaluate_model(xgb4, X_test, y_test, features)
),我得到的是
Model ReportAccuracy : 0.873706AUC Score (Train): 0.965286
我想知道这两个模型报告是否有问题,因为测试集的准确率高于训练集。如果这个问题结构呈现得不好,我表示歉意。
回答:
我将进一步展开我的回答:
这个函数在你提供的数据集上进行训练,并返回训练的准确率和AUC:因此,这不是评估你的模型的可靠方法。
在你提供的链接中,提到这个函数是用来调整估计器数量的:
下面的函数执行以下操作以找到在你的数据上使用的最佳提升树数量:
- 使用数据的特征训练一个XGBoost模型。
- 对模型进行k折交叉验证,使用准确率和AUC分数作为评估指标。
- 为每个提升轮次返回输出,以便你可以看到模型是如何学习的。你将在下一节中查看详细输出。
- 当交叉验证分数在增加提升轮次后没有显著改善时停止运行,为模型提供一个最佳的估计器数量。
你不应该用它来评估模型性能,而是应该进行一个干净的交叉验证。
在这种情况下,你的测试分数更高是因为你的测试集更小,所以模型更容易过拟合。