gpt4 book ai didi

python - 如何在 GridSearchCV 中正确选择最佳模型 - sklearn 和 caret 都做错了

转载 作者:行者123 更新时间:2023-12-04 15:39:03 25 4
gpt4 key购买 nike

考虑 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 个结果、验证曲线等……我可以决定什么是最好的模型。我不想手动执行此操作。我希望这个过程是自动化的。网格搜索算法每次都会返回过拟合模型。我期待听到一些答案。
另一个大问题是 val 和 test 集之间的差异。由于许多问题都面临时间依赖性问题,我想知道一种可靠的方法来随着时间的推移测试模型的性能。按时间拆分数据集至关重要,否则我们将出现数据泄漏。我熟悉的一种方法是判别分析(拟合模型以查看模型是否可以预测示例来自哪个数据集:train val test)。另一种方法是 KS/KL 测试并查看目标变量的分布,或者循环遍历每个特征并比较分布。

最佳答案

我同意使用测试集选择超参数不需要验证集 (/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.


现在这是更容易理解的事情:除了原始性能之外,还有其他一些原因希望训练/测试分数差距很小。见例如 https://datascience.stackexchange.com/q/66350/55122 .和 sklearn从 v0.20 开始实际上确实适应了这一点:通过使用 return_train_score=Truerefit作为消耗 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.

...


https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
当然,这要求您可以将查看分数及其差异的手动过程放入一个函数中,并且可能不承认诸如验证曲线之类的东西,但至少它是一些东西。

关于python - 如何在 GridSearchCV 中正确选择最佳模型 - sklearn 和 caret 都做错了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58648017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com