XGBoost算法,关于evaluate_model函数的问题

这个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分数作为评估指标。
  • 为每个提升轮次返回输出,以便你可以看到模型是如何学习的。你将在下一节中查看详细输出。
  • 当交叉验证分数在增加提升轮次后没有显著改善时停止运行,为模型提供一个最佳的估计器数量。

你不应该用它来评估模型性能,而是应该进行一个干净的交叉验证。

在这种情况下,你的测试分数更高是因为你的测试集更小,所以模型更容易过拟合。

Related Posts

如何使用Google Protobuf解析、编辑和生成object_detection/pipeline.config文件

我在一个常见的集成学习范式中训练多个模型,目前我在处理…

我的GridSearchCV不起作用,我不知道为什么

大家好,我在使用GridSearchCV时遇到了问题,…

Keras: 两个同时进行的层,其中一个对前一层的输出进行卷积

我想实现这样的模型连接: 输入图像1 -> 卷积层1 …

如何将行数据转换为列数据而不使用独热编码

我有一个如下所示的数据集。 MonthDate Day…

使用 ML Kit 与 NNAPI

我正在尝试在运行 Android 9 的设备上使用新的…

Vowpal Wabbit 可能的哈希冲突

我在VW中生成了一个模型,并且在相同的数据上生成了两个…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注