我正在尝试使用K-Fold交叉验证和GridSearchCV来优化我的梯度提升模型,按照以下链接进行操作 – https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/
关于下面的模型报告截图,我有一些问题:
1) 0.814365的准确率是如何计算的?脚本中在哪里进行的训练测试分割?如果将cv_folds=5改为任意整数,准确率仍然是0.814365。实际上,删除cv_folds并输入performCV=False也会得到相同的准确率。
(请注意,我的sklearn无交叉验证的80/20训练测试集准确率约为0.79-0.80)
2) 同样,AUC分数(训练集)是如何计算的?这应该是ROC-AUC而不是AUC吗?我的sklearn模型的AUC约为0.87。像准确率一样,这个分数似乎是固定的。
3) 为什么平均CV分数比AUC(训练集)分数低很多?看起来它们都在使用roc_auc(我的sklearn模型给出的ROC AUC为0.77)
df = pd.read_csv("123.csv")target = 'APPROVED' #item to predictIDcol = 'ID'def modelfit(alg, ddf, predictors, performCV=True, printFeatureImportance=True, cv_folds=5): #Fit the algorithm on the data alg.fit(ddf[predictors], ddf['APPROVED']) #Predict training set: ddf_predictions = alg.predict(ddf[predictors]) ddf_predprob = alg.predict_proba(ddf[predictors])[:,1] #Perform cross-validation: if performCV: cv_score = cross_validation.cross_val_score(alg, ddf[predictors], ddf['APPROVED'], cv=cv_folds, scoring='roc_auc') #Print model report: print ("\nModel Report") print ("Accuracy : %f" % metrics.accuracy_score(ddf['APPROVED'].values, ddf_predictions)) print ("AUC Score (Train): %f" % metrics.roc_auc_score(ddf['APPROVED'], ddf_predprob)) if performCV: print ("CV Score : Mean - %.5g | Std - %.5g | Min - %.5g | Max - %.5g" % (npy.mean(cv_score),npy.std(cv_score),npy.min(cv_score),npy.max(cv_score))) #Print Feature Importance: if printFeatureImportance: feat_imp = pd.Series(alg.feature_importances_, predictors).sort_values(ascending=False) feat_imp.plot(kind='bar', title='Feature Importances') plt.ylabel('Feature Importance Score')#Choose all predictors except target & IDcolspredictors = [x for x in df.columns if x not in [target, IDcol]]gbm0 = GradientBoostingClassifier(random_state=10)modelfit(gbm0, df, predictors)
回答:
你的cv_score
看起来较低的主要原因是将其与训练准确率进行比较是不公平的。你的训练准确率是使用用于拟合模型的相同数据计算的,而cv_score
则是交叉验证中测试折的平均分数。正如你所想象的,模型在使用它已经训练过的数据进行预测时表现会更好,而不是基于模型从未见过的新数据进行预测。
你的accuracy_score
和auc
计算看起来是固定的,因为你始终使用相同的输入(ddf["APPROVED"]
,ddf_predictions
和ddf_predprob
)进行计算。performCV
部分实际上并没有转换这些数据集,因此如果你使用相同的模型、模型参数和输入数据,你将得到相同的预测,这些预测将用于计算中。
根据你的评论,cv_score
准确率可能低于你的完整测试集准确率的原因有很多。主要原因之一是当你使用完整的训练集而不是每个cv
折的一部分训练数据时,你允许模型访问更多的训练数据。如果你的数据集不是很大,那么这些数据在训练中就显得更加重要,并且可以提供更好的性能。