网格搜索的交叉验证返回比defau更糟糕的结果

2024-04-28 12:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中使用scikitlearn运行一些基本的机器学习模型。使用内置的GridSearchCV()函数,我确定了不同技术的“最佳”参数,但其中许多参数的性能比默认值差。我将默认参数作为一个选项,所以我很惊讶会发生这种情况。在

例如:

from sklearn import svm, grid_search
from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(verbose=1)
parameters = {'learning_rate':[0.01, 0.05, 0.1, 0.5, 1],  
              'min_samples_split':[2,5,10,20], 
              'max_depth':[2,3,5,10]}
clf = grid_search.GridSearchCV(gbc, parameters)
t0 = time()
clf.fit(X_crossval, labels)
print "Gridsearch time:", round(time() - t0, 3), "s"
print clf.best_params_
# The output is: {'min_samples_split': 2, 'learning_rate': 0.01, 'max_depth': 2}

这与默认值相同,但max_depth是3。当我使用这些参数时,我得到的准确率为72%,而默认值为78%。在

我所做的一件事,我承认是可疑的,就是我使用了我的整个数据集进行交叉验证。在获得参数之后,我使用相同的数据集运行它,将其分成75-25个训练/测试。在

我的网格搜索忽略了“高级”默认值是有原因的吗?在


Tags: fromimportsearch参数timesklearnmaxgrid
2条回答

在同一个数据集上测试参数和/或特性选择时,对整个数据集运行交叉验证肯定会导致问题。看来这至少是问题的一部分。对数据子集运行CV以优化参数,并保留保留一个保留集用于测试,这是一个很好的实践。在

假设您使用的是^{}数据集(即注释链接中的示例中使用的数据集),下面是一个示例,说明如何通过使用^{}创建一个保留集来影响GridSearchCV参数优化:

from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier

iris = datasets.load_iris()
gbc = GradientBoostingClassifier()
parameters = {'learning_rate':[0.01, 0.05, 0.1, 0.5, 1], 
              'min_samples_split':[2,5,10,20], 
              'max_depth':[2,3,5,10]}

clf = GridSearchCV(gbc, parameters)
clf.fit(iris.data, iris.target)

print(clf.best_params_)
# {'learning_rate': 1, 'max_depth': 2, 'min_samples_split': 2}

现在使用随机训练子集重复网格搜索:

^{pr2}$

我发现这两种方法的分类精度都要高得多,这让我觉得您可能使用了不同的数据,但是在维护保持集的同时执行参数选择的基本点在这里演示。希望有帮助。在

您也可以使用kfords cross_验证器 https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html

from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import KFold

iris = datasets.load_iris()
gbc = GradientBoostingClassifier()
parameters = {'learning_rate':[0.01, 0.05, 0.1, 0.5, 1], 
          'min_samples_split':[2,5,10,20], 
          'max_depth':[2,3,5,10]}

cv_test= KFold(n_splits=5)
clf = GridSearchCV(gbc, parameters,cv=cv_test)
clf.fit(iris.data, iris.target)

print(clf.best_params_)

相关问题 更多 >