首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在GridSearchCV中正确选择最佳模式--学习和插入都是错误的

如何在GridSearchCV中正确选择最佳模式--学习和插入都是错误的
EN

Stack Overflow用户
提问于 2019-10-31 16:55:24
回答 1查看 4.5K关注 0票数 5

考虑3个数据集-列车/val/测试。GridSearchCV默认选择交叉验证分数最高的最佳模型。在现实世界中,预测必须准确,这是选择最佳模型的可怕方法。原因是因为这就是它应该如何使用的原因:

用于模型学习数据集的-Train集

-Val集用来验证模型在火车集合中学到的知识,并更新参数/超参数,以最大限度地提高验证分数。

-Test集-测试你的数据在看不见的数据。

-Finally在活动设置中使用该模型,并记录结果以查看结果是否足以做出决策。令人惊讶的是,许多数据科学家只是在选择验证分数最高的模型的基础上,冲动地在生产中使用他们受过训练的模型。我发现网格搜索可以选择那些非常适合的模型,并且在预测未知数据方面比默认参数做得更糟糕。

我的方法:

-Manually对模型进行培训,并查看每个模型的结果(在某种程度上是循环的,但效率不高)。这是非常手动和耗时的,但我得到的结果明显优于网格搜索。我想让这个完全自动化。

-Plot对我要选择的每个超参数的验证曲线,然后选择显示列车和val集之间最小差异的超参数,同时最大化两者(即train=98%,val = 78%是非常糟糕的,但是train=72%、val=70%是可以接受的)。

就像我说的,我想要一个更好的(自动化)方法来选择最好的型号。

我在寻找什么样的答案:

我希望在火车和验证集中的得分最大化,同时最小化火车和val集合之间的分数差异。考虑网格搜索算法中的以下示例:有两个模型:

代码语言:javascript
复制
Model A: train score = 99%, val score = 89%

Model B: train score = 80%, val score = 79%

模型B是一个更可靠的模型,我会选择模式B,而不是模式A任何一天。它不太合适,而且预测是一致的。我们知道该期待什么。然而,网格搜索将选择模式A,因为val评分较高。我发现这是一个常见的问题,在互联网上没有找到任何解决方案。人们往往过于关注他们在学校学到的东西,而实际上并没有考虑选择一个超级适合的模式会带来什么后果。我看到了关于如何使用sklearn和插入符号网格搜索包并让它们为您选择模型的多余帖子,但没有看到如何实际选择最佳模型。

到目前为止,我的方法是非常手动的。我想要一种自动化的方法。

我目前所做的是:

代码语言:javascript
复制
gs = GridSearchCV(model, params, cv=3).fit(X_train, y_train) # X_train and y_train consists of validation sets too if you do it this way, since GridSearchCV already creates a cv set.
final_model = gs.best_estimator_
train_predictions = final_model.predict(X_train)
val_predictions = final_model.predict(X_val)
test_predictions = final_model.predict(X_test)

print('Train Score:', accuracy_score(train_predictions, y_train)) # .99
print('Val Score:', accuracy_score(val_predictions, y_val)) # .89
print('Test Score:', accuracy_score(test_predictions, y_test)) # .8

如果我看到上面这样的东西,我将排除这个模型,尝试不同的超参数,直到我得到一致的结果。通过人工拟合不同的模型,并对所有的三个结果,验证曲线等。我可以决定什么是最好的模式。我不想手动这么做。我希望这个过程是自动化的。网格搜索算法每次都会返回超拟合模型。我期待着听到一些答案。

另一个大问题是val和测试集之间的区别。由于许多问题都面临时间依赖性问题,我想知道一种可靠的方法来测试模型的性能。按时间划分数据集是至关重要的,否则我们就会出现数据泄漏。我熟悉的一种方法是判别分析(拟合一个模型,看看模型是否能够预测该示例来自哪个数据集: train检验)。另一种方法是KS / KL测试,查看目标变量的分布,或者循环遍历每个特性并比较分布。

EN

回答 1

Stack Overflow用户

发布于 2020-07-11 01:46:35

我同意这样的意见,即使用测试集来选择超参数可以避免对验证集(/folds)的需要,并且使测试集的分数不再代表未来的性能。您可以通过“在实时提要上测试模型”来解决这个问题,所以这很好。

--我甚至会给出我取出测试集的场景--这是相同的问题。网格搜索算法选择验证分数最高的模型。它没有考虑火车得分和瓦尔得分之间的差异。差额应该接近于0。一个99%的训练分数和88%的val评分不是一个很好的模型,但是网格搜索会占用88%的训练分数和87%的val分数。我会选择第二种模式。

现在,这是更容易理解的事情:除了原始性能之外,还有一些原因希望训练/测试的分数差距很小。参见例如https://datascience.stackexchange.com/q/66350/55122。实际上,sklearn从0.20版本开始就能适应这种情况:通过使用return_train_score=Truerefit作为一个可调用的调用,可以消耗cv_results_并返回最好的索引:

refit : bool,str,或可调用,default=True

..。

在选择最佳估计器时,除了最大值之外,还有其他考虑因素,可以将重构设置为返回给定best_index_的所选cv_results_的函数。在这种情况下,best_estimator_和best_params_将根据返回的best_index_设置,而best_score_属性将不可用。

..。

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html

当然,这要求您可以将查看分数及其差异的手工过程放入一个函数中,并且可能不承认任何类似验证曲线的内容,但至少这是有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58648017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档