K-2交叉验证是否本质上等同于50:50的训练-测试分割?

我正在进行一个数据项目作业,要求使用50%的数据进行训练,剩余50%的数据用于测试。我希望利用交叉验证的魔力,同时仍然满足上述要求。

目前,我的代码如下:

clf = LogisticRegression(penalty='l2', class_weight='balanced')
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
#交叉验证
cv = StratifiedKFold(n_splits=2)
i = 0
for train, test in cv.split(X, y):
    probas_ = clf.fit(X[train], y[train]).predict_proba(X[test])
    # 计算ROC曲线和曲线下面积
    fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])
    tprs.append(interp(mean_fpr, fpr, tpr))
    tprs[-1][0] = 0.0
    roc_auc = auc(fpr, tpr)
    aucs.append(roc_auc)
    i += 1
print("平均AUC: ", sum(aucs)/len(aucs), "AUC: ", aucs[-1],)

由于我只使用了2个分割,这是否相当于使用了50:50的训练-测试分割?还是我应该先将数据分割为50:50,然后在训练部分使用交叉验证,最后使用该模型来测试剩余50%的测试数据?


回答:

你应该实施你的第二个建议。交叉验证应该用于调整你的方法的参数。在你的例子中,这样的参数包括Logistic回归的C参数值和class_weight='balanced'。所以你应该:

  • 将数据分割为50%训练,50%测试
  • 使用训练数据通过交叉验证选择模型参数的最优值
  • 在训练数据上使用最优参数重新拟合模型
  • 对测试数据进行预测,并报告你选择的评估度量的得分

请注意,你应该使用测试数据来报告最终得分,而不用于调整模型,否则你就是在作弊。想象一下,在现实中你可能直到最后一刻才有机会访问这些数据,所以你不能使用它们。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注