使用网格搜索进行交叉验证的效果不如默认设置

我在Python中使用scikitlearn运行一些基本的机器学习模型。使用内置的GridSearchCV()函数,我确定了不同技术的“最佳”参数,但其中许多的表现却不如默认设置。我将默认参数作为一个选项包含在内,所以我对此感到很惊讶。

例如:

from sklearn import svm, grid_searchfrom sklearn.ensemble import GradientBoostingClassifiergbc = 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的比例分割成训练/测试集进行运行。

为什么我的网格搜索会忽略这些“优越”的默认设置呢?


回答:

在整个数据集上进行交叉验证以选择参数和/或特征,确实会在你使用相同的数据集进行测试时造成问题。看起来这至少是这里问题的一部分。在数据的一个子集上进行CV以优化参数,并保留一个测试用的保留集,是一个好的做法。

假设你使用的是iris数据集(这是你评论链接中示例所使用的数据集),这里是一个如何通过首先使用train_test_split创建一个保留集来影响GridSearchCV参数优化的示例:

from sklearn import datasetsfrom sklearn.model_selection import GridSearchCVfrom sklearn.ensemble import GradientBoostingClassifieriris = 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}

现在使用一个随机的训练子集重复进行网格搜索:

from sklearn.model_selection import train_test_splitX_train,X_test,y_train,y_test = train_test_split(iris.data, iris.target,                                                  test_size=0.33,                                                  random_state=42)clf = GridSearchCV(gbc, parameters)clf.fit(X_train, y_train)print(clf.best_params_)# {'learning_rate': 0.01, 'max_depth': 5, 'min_samples_split': 2}

我在这两种方法中都看到了更高的分类准确率,这让我觉得你可能使用了不同的数据 – 但关于在保持保留集的同时进行参数选择的基本观点在这里得到了展示。希望这对你有帮助。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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