K 折交叉验证查询

K-fold Cross Validation Queries

我正在尝试执行 K 折交叉验证和 GridSearchCV 来优化我的梯度提升模型 - 按照 link - https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/

我对以下模型报告的屏幕截图有几个问题:

1)0.814365的精度是怎么算出来的?它在脚本的哪个位置进行训练测试拆分?如果将 cv_folds=5 更改为 cv_folds=any integer,那么精度仍然是 0.814365。事实上,删除 cv_folds 并输入 performCV=False 也可以提供相同的准确性。

(注意我的 sk learn No CV 80/20 train test 给出了大约 0.79-0.80 的准确度)

2) 同样,AUC 分数(训练)是如何计算的?这应该是 ROC-AUC 而不是 AUC?我的 sk learn 模型给出的 AUC 约为 0.87。就像准确率一样,这个分数似乎是固定的。

3) 为什么平均 CV 分数比 AUC(训练)分数低很多?看起来他们都在使用 roc_auc(我的 sklearn 模型为 ROC AUC 给出了 0.77)

df = pd.read_csv("123.csv")

target = 'APPROVED'  #item to predict
IDcol = '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 & IDcols
predictors = [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_scoreauc 计算似乎是固定的,因为您始终使用相同的输入(ddf["APPROVED"]ddf_predictionsddf_predprob)计算。 performCV 部分实际上并没有转换任何这些数据集,因此如果您使用相同的模型、模型参数和输入数据,您将获得与计算相同的预测。

根据您的评论,cv_score 准确度可能低于完整测试集的准确度有多种原因。主要原因之一是,当您使用完整的训练集而不是每次 cv 折叠时使用训练数据的子集时,您允许模型访问更多数据进行训练。如果您的数据量不是那么大,则尤其如此。如果您的数据集不大,那么该数据在训练中更为重要,可以提供更好的性能。