我是机器学习领域的新手。我的问题如下:我已经建立了一个模型,我正在尝试优化这个模型。通过做一些研究,我发现交叉验证可以用来帮助我避免过度拟合的模型。此外,Gridsearchcv可以用来帮助我优化这种模型的参数,并最终确定最佳参数。
现在我的问题是我应该先进行交叉验证,然后使用网格搜索来确定最佳参数,还是使用 GridsearchCV 就足够了,因为它本身执行交叉验证?
请参阅使用测试数据集进行交叉验证。
我的建议是,如果你的数据集足够大:
- 将数据集拆分为训练子集和测试子集。
- 对训练数据集执行 GridSearchCV。
- 评估测试子集上的最佳模型(来自 GridSearchCV(。
> 正如@Noki所建议的,您可以在网格搜索CV中使用cv参数。
GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, iid='deprecated',
refit=True, cv=None, verbose=0,
pre_dispatch='2*n_jobs',error_score=nan,return_train_score=False)
此外,文档还明确指出,如果这是一个分类问题,它将自动确保它是分层的。
对于整数/无输入,如果估计器是分类器,y 是二进制或 多类,使用分层KFold。在所有其他情况下,使用 KFold。
但是,我想补充一点: 您可以根据Y_target变量的值计数使 K 折叠动态化。 您不能将 K 折叠中频率的最低计数设置为 1,它会在训练时抛出错误。我碰巧遇到过这个问题。使用以下代码片段来帮助您。
例如
import pandas as pd
Y_target=pd.Series([0,1,1,1,1,0,0,0,6,6,6,6,6,6,6,6,6])
if Y_target.value_counts().iloc[-1]<2:
raise Exception ("No value can have frequency count as 1 in Y-target")
else:
Kfold=Y_target.value_counts().iloc[-1]
然后,您可以在网格搜索中将 Kfold 分配给您的 cv 参数
现在我的问题是我应该先进行交叉验证,然后使用网格搜索来确定最佳参数,还是使用 GridsearchCV 就足够了,因为它本身执行交叉验证?
第二个。GridSearchCV使用交叉验证拆分策略来选择最佳参数。如果您阅读scikit-learn文档,则有一个名为"cv"的参数,默认情况下它定义了5倍交叉验证。如果需要使用其他交叉验证策略,可以为其提供 int、交叉验证生成器或可迭代对象