- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑 3 个数据集训练/验证/测试。 Sklearns GridSearchCV 默认选择交叉验证分数最高的最佳模型。在预测需要准确的现实世界环境中,这是选择最佳模型的可怕方法。原因是因为它应该是这样使用的:
- 训练模型学习数据集
-Val 设置以验证模型在训练集中学到的内容并更新参数/超参数以最大化验证分数。
- 测试集 - 在看不见的数据上测试您的数据。
- 最后在实时环境中使用模型并记录结果以查看结果是否足以做出决策。令人惊讶的是,许多数据科学家仅根据选择验证分数最高的模型就冲动地在生产中使用他们经过训练的模型。我发现网格搜索可以选择过度拟合的模型,并且在预测看不见的数据方面比默认参数做得更差。
我的方法:
- 手动训练模型并查看每个模型的结果(在某种循环中,但效率不高)。这是非常手动和耗时的,但我得到的结果比网格搜索要好得多。我希望这是完全自动化的。
- 为我想选择的每个超参数绘制验证曲线,然后选择显示 train 和 val 集之间差异最小的超参数,同时最大化两者(即 train=98%, val = 78% 真的很糟糕,但 train=72 %, val=70% 是可以接受的)。
就像我说的,我想要一种更好的(自动化)方法来选择最佳模型。
我在寻找什么样的答案:
我想最大化训练集和验证集中的分数,同时最小化训练集和验证集之间的分数差异。考虑以下来自网格搜索算法的示例:
有两种型号:
Model A: train score = 99%, val score = 89%
Model B: train score = 80%, val score = 79%
B 型是一个更可靠的模型,我会选择 B 型而不是 A 型。它较少过拟合并且预测是一致的。我们知道会发生什么。但是网格搜索将选择模型 A,因为 val 分数更高。我发现这是一个常见问题,并且在 Internet 上的任何地方都没有找到任何解决方案。人们往往过于关注他们在学校学到的东西,而实际上并没有考虑选择过拟合模型的后果。我看到了关于如何使用 sklearn 和 caret gridsearch 包并让他们为您选择模型的冗余帖子,但没有看到如何实际选择最佳模型。
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
如果我看到类似上面的内容,我将排除该模型并尝试不同的超参数,直到获得一致的结果。通过手动拟合不同的模型并查看所有 3 个结果、验证曲线等……我可以决定什么是最好的模型。我不想手动执行此操作。我希望这个过程是自动化的。网格搜索算法每次都会返回过拟合模型。我期待听到一些答案。
最佳答案
我同意使用测试集选择超参数不需要验证集 (/folds),并使测试集分数不再代表 future 性能的评论。您可以通过“在实时提要上测试模型”来解决这个问题,这样很好。
I'll even give the scenario where I take out the test set - it's the same problem. The gridsearch algorithm picks the model with the highest validation score. It doesn't look at the difference between the train score and val score. The difference should be close to 0. A train score of 99% and a val score of 88% is not a good model, but grid search will take that over train score of 88% and val score of 87%. I would choose the second model.
sklearn
从 v0.20 开始实际上确实适应了这一点:通过使用
return_train_score=True
和
refit
作为消耗
cv_results_
的可调用对象并返回最佳索引:
refit : bool, str, or callable, default=True
...
Where there are considerations other than maximum score in choosing a best estimator, refit can be set to a function which returns the selected best_index_ given cv_results_. In that case, the best_estimator_ and best_params_ will be set according to the returned best_index_ while the best_score_ attribute will not be available.
...
关于python - 如何在 GridSearchCV 中正确选择最佳模型 - sklearn 和 caret 都做错了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58648017/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!