对整个数据集或训练集进行交叉验证?

数据挖掘 机器学习 scikit-学习 交叉验证
2022-03-09 17:02:04

我有一个包含 77 个样本的数据集,其中包含 302 个带有两个标签 (0,1) 的特征。我用 gridsearch (cv=5) 训练了一个 SVM 来执行二进制分类。

在我的脚本的一次运行中,我进行了测试训练拆分,然后将训练数据传递到 gridsearch。我得到了广泛的训练准确度(>70-90%)和测试准确度(40-75%)。我的问题是,如果我的模型看起来是基于火车的/因为我的数据似乎根据拆分得到不同的结果,我该如何评估我的模型。

我所做的是:在循环中运行整个脚本并迭代 10 个不同的拆分,然后在 ROC 曲线上绘制误差线。这合理吗?

3个回答

我建议不要进行训练测试拆分,而是建议使用 n 折交叉验证,或者更好的是留一法交叉验证。

我的问题是,如果我的模型看起来是基于火车的/因为我的数据似乎根据拆分得到不同的结果,我该如何评估我的模型。

误差估计的高方差是数据集非常小的结果。当从如此小的数据集中采样时,很容易得到不具代表性的训练和测试分割。交叉验证将为您提供更稳定的误差估计。

我所做的是:在循环中运行整个脚本并迭代 10 个不同的拆分,然后在 ROC 曲线上绘制误差线。这合理吗?

多次运行模型评估例程并对结果进行平均是一个非常好的主意。在我看来,您正在手动运行控制较少的交叉验证版本。

当您说“在 ROC 曲线上绘制误差线”时,我不确定您的意思。ROC 下的区域是您的准确度指标吗?或者您是在计算精度,然后以某种方式将其绘制在与 ROC 曲线相同的轴上?


这不是您的问题的一部分,但它可能会有所帮助。当您的数据集具有比示例更多的特征时,您极有可能遇到与维度灾难相关的问题。在特征所在的 302 维空间中,仅包含 77 个示例的数据集非常稀疏。

您可能需要考虑更简单的模型(逻辑回归、浅层决策树等)并采用某种类型的正则化来阻止您的模型学习虚假关系。您还可以尝试使用降维技术来消除您的一些 302 特征。

做bagging,然后评估模型,

你也应该把你的数据分成训练和测试60/40,在训练上做折叠或把它分成训练和验证

https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets

您的数据集的问题是它很小,所以可能只使用逻辑回归和装袋

与特征相比,数据量太小。欠拟合的理想情况。请执行以下操作...

  1. 如果可行,请尝试获取更多数据

  2. 进行特征选择以缩小特征范围

  3. 使用决策树,因为数据量很小