K折交叉验证查询

我正在尝试使用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_scoreauc计算看起来是固定的,因为你始终使用相同的输入(ddf["APPROVED"]ddf_predictionsddf_predprob)进行计算。performCV部分实际上并没有转换这些数据集,因此如果你使用相同的模型、模型参数和输入数据,你将得到相同的预测,这些预测将用于计算中。

根据你的评论,cv_score准确率可能低于你的完整测试集准确率的原因有很多。主要原因之一是当你使用完整的训练集而不是每个cv折的一部分训练数据时,你允许模型访问更多的训练数据。如果你的数据集不是很大,那么这些数据在训练中就显得更加重要,并且可以提供更好的性能。

Related Posts

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

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