【问题标题】:cross Validation in Sklearn using a Custom CV使用自定义简历在 Sklearn 中进行交叉验证
【发布时间】:2019-10-22 13:28:58
【问题描述】:

我正在处理一个二元分类问题。

我有 2 个索引列表 listTrainlistTest它们是训练集的分区(实际测试集仅在以后使用)。我想使用与listTrain 关联的样本来估计参数和与listTest 关联的样本来评估交叉验证过程中的错误(保持集方法)。

但是,我无法找到将其传递给 sklearn GridSearchCV 的正确方法。

文档说我应该创建“一个可迭代的产生(训练,测试)拆分为索引数组”。但是,我不知道如何创建它。

grid_search = GridSearchCV(estimator = model, param_grid = param_grid,cv = custom_cv, n_jobs = -1, verbose = 0,scoring=errorType)

那么,我的问题是如何根据这些索引创建custom_cv 以用于此方法?

Xy分别是特征矩阵,y是标签向量。

示例:假设我只有一个超参数 alpha 属于集合 {1,2,3}。我想设置 alpha=1,使用与 listTrain 关联的样本估计模型的参数(例如回归的系数),并使用与 listTest 关联的样本评估错误。然后我重复 alpha=2 的过程,最后重复 alpha=3 的过程。然后我选择最小化错误的 alpha。

【问题讨论】:

  • 您是否尝试 1) 使用多倍训练数据进行交叉验证,然后 2) 使用测试集测试泛化?因为据我了解您的问题,您希望在listTrain 上安装具有特定参数的分类器并使用listTest 测试其性能。但这只是在同一个问题上测试不同的参数集,而不是真正的交叉验证?
  • @JimmyOnThePage 假设我只有一个属于集合 {1,2,3} 的超参数 alpha。我想设置 alpha=1,使用与 listTrain 关联的样本估计模型的参数(例如回归的系数),并使用与 listTest 关联的样本评估错误。然后我重复 alpha=2 的过程,最后重复 alpha=3 的过程。然后我选择最小化错误的 alpha。
  • 请记住,这个过程是错误的(从 ML 实践的角度来看)并且强烈不推荐;您的测试集应该只使用一次,用于您的 final 模型的性能评估,否则您实际上将它用作另一个 validation 集(不同于测试一)。请参阅Order between using validation, training and test sets 中的答案。
  • @desertnaut 对不起!我没有使用测试集。我使用索引集 listTrain 和 listTest 将训练集分为两部分。实际的测试集只会在以后使用。我这样做有两个原因:1)我的样本高度不平衡。 2)我的一些回归器出现过拟合,我想测试不同的方法。

标签: python-3.x scikit-learn cross-validation


【解决方案1】:

编辑:问题的实际答案。尝试将cv 命令传递给索引生成器:

def index_gen(listTrain, listTest):
    yield listTrain, listTest

grid_search = GridSearchCV(estimator = model, param_grid = 
    param_grid,cv = index_gen(listTrain, listTest), n_jobs = -1, 
    verbose = 0,scoring=errorType)

编辑:编辑前:

正如desertnaut 的评论中提到的,您尝试做的是糟糕的机器学习实践,您最终会对最终模型的泛化性能做出有偏差的估计。以您提议的方式使用测试集将有效地将测试集信息泄漏到训练阶段,并让您高估模型对看不见的数据进行分类的能力。我对你的建议:

grid_search = GridSearchCV(estimator = model, param_grid = param_grid,cv = 5, 
    n_jobs = -1, verbose = 0,scoring=errorType)

grid_search.fit(x[listTrain], y[listTrain]

现在,您的训练集将被分成 5 个(您可以在此处选择数量)折叠,使用其中的 4 个折叠对一组特定的超参数进行训练,并测试遗漏的折叠。重复 5 次,直到您的所有训练示例都成为遗漏集合的一部分。整个过程针对您正在测试的每个超参数设置完成(在本例中为 5x3)

grid_search.best_params_ 将为您提供在所有 5 折中表现最佳的参数字典。这些是您用来训练最终分类器的参数,再次仅使用训练集:

clf = LogisticRegression(**grid_search.best_params_).fit(x[listTrain], 
    y[listTrain])

现在,最后您的分类器在测试集上进行了测试,并给出了泛化性能的无偏估计:

predictions = clf.predict(x[listTest])

【讨论】:

  • 感谢您的回答。这正是我现在正在做的。请看上面的评论。我没有使用实际的测试集。这些索引集是实际训练集的分区。另请参阅问题版。
  • 啊,我明白了。将编辑答案,但会跟上以供将来参考
猜你喜欢
  • 2015-06-11
  • 2014-07-27
  • 2021-11-24
  • 2017-03-16
  • 2018-10-02
  • 2019-06-01
  • 2013-12-13
  • 2017-06-19
  • 2012-10-14
相关资源
最近更新 更多