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

时间:2019-06-07 03:23:14

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

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

我有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是标签的向量。

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

1 个答案:

答案 0 :(得分: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的评论中所提到的,您试图做的是不好的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])