我在参数调整(cv)时的平均测试分数为什么比保持测试集(RandomForestClassifier)低?
作者:互联网
我正在使用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