使用自定义 CV 在 Sklearn 中进行交叉验证

cross Validation in Sklearn using a Custom CV

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

我有2个索引列表listTrainlistTest是训练集的分区(后面会用到实际的测试集).我想使用与 listTrain 关联的样本来估计参数,并使用与 listTest 关联的样本来评估 cross 验证过程中的错误(支持集合方法)。

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

文档说我应该创建 "An iterable yielding (train, test) splits as arrays of indices"。但是,我不知道如何创建它。

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

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

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

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

编辑:问题的实际答案。尝试将 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])