python-3.x - 使用自定义简历在 Sklearn 中进行交叉验证
问题描述
我正在处理一个二进制分类问题。
我有 2 个索引列表listTrain
和listTest
,它们是训练集的分区(实际的测试集只会在以后使用)。我想使用与相关的样本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。
解决方案
编辑:问题的实际答案。尝试将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])