- 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/
尝试使用 caret 包中的 preProcess 函数时出现以下错误。 predict 函数适用于 knn 和中值插补,但会给出装袋错误。我应该如何编辑对预测函数的调用。 可重现的例子: data
我正在尝试让两个 fontawesome 图标向上插入和向下插入以相互堆叠而不隐藏一个并显示另一个?任何建议将不胜感激。这是一个带有 Bootstrap 和 fontawesome 的 plucker
我目前正在使用列表来处理左侧菜单。一切正常,但现在我想对 font-awsome 执行操作,我正在尝试将 fa-caret-right 移动到 fa-caret-down。 fa-caret-righ
我试图了解 Caret 包中的 5 折交叉验证算法,但我无法找到如何为每一折获取训练集和测试集,而且我也无法从类似的建议问题中找到它。想象一下,如果我想通过随机森林方法进行交叉验证,我会执行以下操作:
在 R 包 caret 中,我们能否使用函数 createDataPartition()(或用于交叉验证的 createFolds())基于多个变量创建分层训练和测试集? 这是一个变量的示例: #2/
我对rfe库中的caret函数有疑问。在插入符号主页link上,他们给出了以下RFE算法: algorithm 对于此示例,我将rfe函数与3折交叉验证结合使用,并将train函数与linear-SV
我们可以通过利用foreach软件包,nnet和插入符号软件包来使用多核并行地训练神经网络模型吗? 我只看到randomforest并行执行。神经网络是否可能。 我对插入符号的火车功能特别感兴趣,该功
我希望使用带有不是默认选项之一的指标的插入符号包。对于下面的示例,我使用了 Metrics 包。我已经阅读了 StackOverflow 上的所有相关问题以及 caret 网站上的指南,但仍然收到错误
实际的并行插入符取决于 R、插入符和 doMC 软件包。如 Parallelizing Caret code 中所述 有人和我在类似的环境中工作吗? R 插入符并行化正常工作的最大 R 版本是什么?
我不知道如何使用R中的caret包提取训练误差(即在训练集上获得的误差)。例如,我有以下模型: data(iris); library(caret); model<-train(Species~.,
我最近在插入符号的 trainControl() Funktion 中发现了随机搜索选项。插入符如何生成参数以及是否有办法提供某种特定于用户的输入(例如从中采样参数的分布)?关于website我只找到
我的训练数据集 (train) 是一个具有 n 个特征 的数据框架,以及一个具有结果 y 的附加列。我建立了3个单独的模型,例如: m1 用于测试数据),并且在最后一步中,DATA_TO_PREDI
我正在尝试通过方法 useDelimiter("&|=|~ |^");. 除了被忽略的 ^ 之外,所有定界符都可以正常工作:这是为什么? 我在扫描仪文档中看不出原因。 最佳答案 你需要转义^,像这样:
我目前正在学习如何在 R 中实现逻辑回归 我已经获取了一个数据集并将其分成训练集和测试集,并希望实现前向选择、后向选择和最佳子集选择 使用交叉验证来选择最佳功能。我正在使用 caret 对训练数据集实
“插入符号”一词起源于文本插入点的何处?我试图用谷歌搜索它,但这很难找到(即使我的历史计算机引用书在这里似乎也无济于事)。 我相当确定我记得一些使用文字插入符号(即:^)作为文本插入标记的古老的 Wa
我正在使用 caret R中的库用于模型生成。我想生成一个 earth (又名 MARS)模型,我想指定 degree此模型生成的参数。根据documentation (第 11 页) earth方法
我想使用 AUC 作为性能度量,但 RFE 仅支持 RMSE、RSquared、Accuracy、Kappa。如何使用自定义指标,例如 auc? 最佳答案 您必须指定一个自定义 summaryFunc
代码: library(nnet) library(caret) #K-folds resampling method for fitting model ctrl <- trainControl(m
我试图通过将“knnImpute”传递给 Caret 的 train() 方法的 preProcess 参数来估算值。基于以下示例,这些值似乎没有被估算,保留为 NA,然后被忽略。我究竟做错了什么?
我正在训练基于来自 Kaggle 的心脏病数据的决策树模型。 . 由于我也在使用 10 倍 CV 构建其他模型,因此我尝试使用带有 rpart 方法的 caret 包来构建树。然而,情节结果很奇怪,因
我是一名优秀的程序员,十分优秀!