gpt4 book ai didi

python - 为什么我在参数调整 (cv) 上的平均测试分数低于保持测试集 (RandomForestClassifier)?

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:13 27 4
gpt4 key购买 nike

我正在使用 RandomizedSearchCV (sklearn) 对我的训练集进行 3 折交叉验证来进行超参数调整。之后,我在测试集上检查我的分数(准确性、召回加权、cohen_kappa)。令人惊讶的是,它总是比我的 RandomizedSearchCV 的 best_score 属性高一点。

一开始,我将分层数据拆分为 70/30 的训练和测试集。

我的数据集包括 12 个类、12 个特征并且是不平衡的。我有 ~3k 个数据点。

当我将参数调优的交叉验证训练分数与保留测试集上的分数进行比较时,这是否正常(或不足为奇)?

我已经为初始拆分和不同的评分方法(准确度、recall_macro、recall_weighted、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 evaluation
scoring = {'Accuracy' : make_scorer(accuracy_score), 'Recall' : 'recall_weighted', 'Kappa' : make_scorer(cohen_kappa_score)}

#Initializing of parameter ranges
params_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 parameters
if __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')

recall_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

我想使用 hold-out 测试集来比较不同算法对该数据集的处理方式。

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

最佳答案

据我所知,一切都符合预期。

best_score_ 为最佳估算器提供 3 倍的平均分数:

每个折叠包含 ~1.386 个训练样本:3.000 * 0.7(训练大小)* 2/3(cv 训练大小)。

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

例如,您可以尝试使用 cv=5 进行搜索,您可能会发现得分差异减小。

此外,您拥有的数据越多,CV 得分就越具有代表性。也许对于这个特定项目,3000 个样本还不够。

关于python - 为什么我在参数调整 (cv) 上的平均测试分数低于保持测试集 (RandomForestClassifier)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com