首页 > 解决方案 > 使用自定义简历在 Sklearn 中进行交叉验证

问题描述

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

我有 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根据这些索引创建要在此方法中使用的?

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

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

标签: python-3.xscikit-learncross-validation

解决方案


编辑:问题的实际答案。尝试将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 的评论中所提到的,您尝试做的是糟糕的ML 实践,您最终会对最终模型的泛化性能进行有偏差的估计。以您提议的方式使用测试集将有效地将测试集信息泄漏到训练阶段,并让您高估模型对看不见的数据进行分类的能力。我在你的情况下建议:

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])

推荐阅读