为什么我在参数调优时的平均测试分数(交叉验证)低于保留测试集上的分数(RandomForestClassifier)?

我使用RandomizedSearchCV(sklearn)在我的训练集上进行3折交叉验证来进行超参数调优。之后,我在测试集上检查我的分数(准确率,加权召回率,Cohen kappa)。令人惊讶的是,它总是略高于我的RandomizedSearchCV的best_score属性。

在开始时,我对数据进行了70/30的分层分割,划分为训练集和测试集。

我的数据集包含12个类别,12个特征,并且是不平衡的。我有大约3000个数据点。

当我将参数调优的交叉验证训练分数与保留测试集上的分数进行比较时,这是正常的(或不算太令人惊讶)吗?

我已经尝试了不同的随机种子来进行初始分割,以及不同的评分方法(准确率,宏观召回率,加权召回率,Cohen kappa)。

这是我的代码:

#Split data in training and test set (70/30 stratified split)x_train, x_test, y_train, y_test = train_test_split(X_Distances, Y, test_size=0.3, random_state=42, stratify=Y, shuffle=True)#Scorings used for parameter tuning evaluationscoring = {'Accuracy' : make_scorer(accuracy_score), 'Recall' : 'recall_weighted', 'Kappa' : make_scorer(cohen_kappa_score)}#Initializing of parameter rangesparams_randomSearch = {"min_samples_leaf": np.arange(1,30,2),              "min_samples_split": np.arange(2,20,2),              "max_depth": np.arange(2, 20, 2),              "min_weight_fraction_leaf": np.arange(0. ,0.4, 0.1),              "n_estimators": np.arange(10, 1000, 100),              "max_features" : ['auto', 'sqrt', 'log2', None],              "criterion" : ['entropy', 'gini']}#Perform RandomSearchCV over a wide range of possible parametersif __name__ == '__main__':    rs = RandomizedSearchCV(RandomForestClassifier(random_state=42), param_distributions=params_randomSearch, scoring = scoring, cv = 3, refit = 'Recall', n_iter=60, n_jobs=-1, random_state=42)    rs.fit(x_train, y_train)    print('Best Score: ', rs.best_score_, '\nBest parameters: ', rs.best_params_)    y_predict = rs.best_estimator_.predict(x_test)    acc = recall_score(y_test, y_predict, average='weighted')

加权召回率的结果:

# RandomizedSearchCV:best_params_ = {dict} {'n_estimators': 310, 'min_weight_fraction_leaf': 0.0, 'min_samples_split': 12, 'min_samples_leaf': 5, 'max_features': 'auto', 'max_depth': 14, 'criterion': 'entropy'}best_score_ = {float64} 0.5103216514642342# Hold out test set:0.5666293393057111

我想使用保留测试集来比较不同算法在这组数据上的表现。

问题:我的方法中是否存在导致这种分数差异的错误,或者我可以忽略它,并且应该如何解释这种差异?


回答:

据我所见,一切都在预期之中。

best_score_ 给你的是最佳估计器的3折平均分数:

每个折叠包含大约1.386个训练样本:3.000 * 0.7(训练集大小)* 2/3(交叉验证训练集大小)。

然后,你在整个x_train上拟合最佳估计器(这是由RandomizedSearchCV的”refit”参数引起的),它有大约2.100个样本:3.000 * 0.7,这要多得多。

你可以尝试,例如,将你的搜索设置为cv=5,你可能会发现分数差异减少了。

另外,你的数据越多,交叉验证分数就越有代表性。也许对于这个特定项目,3000个样本还不够多。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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