ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-09 03:57:16  阅读:703  来源: 互联网

标签:cross-validation data-science machine-learning python hyperparameters


我正在使用RandomizedSearchCV(sklearn)进行超参数调整,并在训练集上进行了3倍交叉验证.之后,我要检查测试集的分数(准确性,recall_weighted,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')

结果为callback_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进行搜索,您可能会发现得分差异减小了.

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

标签:cross-validation,data-science,machine-learning,python,hyperparameters
来源: https://codeday.me/bug/20191109/2011671.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有