如何使用GridSearch的输出?


23

我目前正在使用Python和Scikit进行学习,以进行分类,并围绕GridSearch进行了一些阅读,我认为这是优化估算器参数以获得最佳结果的好方法。

我的方法是这样的:

  1. 将我的数据分为训练/测试。
  2. 结合使用GridSearch和5Fold Cross验证来训练和测试我的估算器(Random Forest,Gradient Boost,SVC等),以获得具有最佳超参数组合的最佳估算器。
  3. 然后,使用测试集预测分类并将其与实际的类别标签进行比较,然后根据我的每个估计量(例如Precision,Recall,FMeasure和Matthews Correlation Coefficient)计算度量。

正是在这个阶段,我看到了奇怪的行为,并且不确定如何进行。我是否从GridSearch中获取.best_estimator_并将其用作网格搜索中的“最佳”输出,并使用此估计器执行预测?如果这样做,我发现第3阶段的指标通常比仅对所有训练数据进行训练并对测试集进行测试的情况要低得多。还是仅将输出GridSearchCV对象作为新的估算器?如果这样做,我的第3阶段指标会获得更好的分数,但是使用GridSearchCV对象而不是预期的分类器(例如随机森林)似乎很奇怪...

编辑: 所以我的问题是返回的GridSearchCV对象和.best_estimator_属性之间的区别是什么?我应该使用其中哪一个来计算其他指标?我可以像常规分类器一样使用此输出(例如使用预测),还是应该使用它?

Answers:


27

决定走开,找到可以满足我的问题的答案,并在这里写下来,以供其他任何想知道的人使用。

.best_estimator_属性是指定模型类型的实例,该模型具有param_grid中给定参数的“最佳”组合。此实例是否有用取决于refit参数是否设置为True(默认情况下)。例如:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

将返回RandomForestClassifier。从文档中可以很清楚地看出这一点。从文档中不清楚的是,为什么大多数示例没有专门使用.best_estimator_而是这样做:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

第二种方法返回一个GridSearchCV实例,它具有GridSearchCV的所有特征,例如.best_estimator _ 、. best_params等,它们本身可以像经过训练的分类器一样使用,因为:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

进行预测时,它仅使用相同的最佳估计器实例。因此,实际上,这两者之间没有区别,除非您特别只希望估算器实例本身。附带说明一下,我的指标差异无关紧要,可以归结为错误的类加权功能。


感谢您的帖子@Dan,它非常有帮助。我想请您澄清一下。在后一种情况下,如果我refit=Falseclf.fit不会用最好的分类做了什么?
Poete Maudit

@PoeteMaudit refit参数告诉GridSearchCV函数采用找到的最佳参数,并在整个数据集中使用这些参数重新训练模型。如果改装= FALSE,然后best_estimator不可用,根据文档:scikit-learn.org/stable/modules/generated/...
丹·卡特

0

GridSearchCV使您可以将估算器与网格搜索前导码结合起来以调整超参数。该方法从网格搜索中选择最佳参数,并将其与用户选择的估计器一起使用。GridSearchCV继承了分类器中的方法,因此可以,您可以直接通过GridSearchCV接口使用.score,.predict等方法。如果您希望提取由网格搜索标识的最佳超参数,则可以使用.best_params_,这将返回最佳超参数。然后,您可以将此超参数分别传递给估计器。

直接使用.predict将产生与通过.best_param_获得最佳超参数然后在模型中使用它相同的结果。通过了解网格搜索的基本原理,我们可以了解为什么会这样。


网格搜索

该技术用于查找与算法配合使用的最佳参数。这不是权重或模型,而是使用数据学习的。这显然很令人困惑,因此我将通过调用一个超参数来区分这些参数。

超参数类似于k最近邻居(k-NN)中的k。k-NN要求用户选择在计算距离时要考虑的邻居。然后,算法调整参数(阈值),以查看是否有新示例落入学习的分布内,这是通过数据完成的。

我们如何选择k?

有些人只是根据过去对数据类型的研究提出建议。其他人使用网格搜索。这种方法将能够最好地确定哪个k最适合用于您的数据。

它是如何工作的?

[1,2,3,...,10]

这违反了不使用测试数据的原则!!

nnn1n

所选的超参数值是在n折中达到最高平均性能的值。对算法满意后,就可以在测试集上对其进行测试。如果直接进入测试集,则可能会过度拟合。


嗨,贾哈,这是一个不错的答案,但我仍然不愿意回答我的问题。我已经更新了问题标题和问题本身,以使事情更加清楚。
丹·卡特

编写自己的网格搜索。它实际上是创建一个数组,然后在模型周围添加一个for循环。然后,在for循环的末尾,将产生的性能记录到一个数组中。在查看完网格中所有可能的值之后,请查看性能阵列,并挑选出最佳的阵列。这是您的超参数的最佳值。对于数据科学,强烈建议不要依赖内置函数的基础知识。数据千差万别,它最适合您控制!
JahKnows

如果我只有一个超参数可以优化,那是一个很好的建议,但是如果我有4个呢?5?4/5次嵌套的for循环很难看,我认为无需在这里重新发明轮子,那会浪费时间,这就是存在这样的软件包的原因。
丹·卡特

GridSearchCV允许您将估算器与GridSearchCV设置结合使用。因此,它完全符合我们刚刚讨论的内容。然后选择最佳参数,并将其与您选择的估算器一起使用。GridSearchCV继承了分类器中的方法,因此可以,您可以直接通过GridSearchCV接口使用.score,.predict等方法。我不建议这样做,但是,更简单的工具意味着更少的控制。对于诸如网格搜索之类的简单操作,只需自己编写即可。
JahKnows

1
该答案没有解决与GridSearchCV使用有关的问题。
霍布斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.