sklearn - 过拟合问题

数据挖掘 机器学习 Python 支持向量机 scikit-学习
2021-10-05 10:01:48

我正在寻找有关我当前机器学习问题的最佳前进方向的建议

问题的概要和我所做的如下:

  • 我有 900 多次 EEG 数据试验,每次试验时长为 1 秒。每个人都知道基本事实,并对状态 0 和状态 1 进行分类(40-60% 分裂)
  • 每个试验都经过预处理,我过滤和提取某些频带的功率,这些组成一组特征(特征矩阵:913x32)
  • 然后我使用 sklearn 来训练模型。cross_validation 用于我使用 0.2 的测试大小的地方。分类器设置为带有 rbf 内核的 SVC,C = 1,gamma = 1(我尝试了许多不同的值)

您可以在此处找到代码的缩短版本:http: //pastebin.com/Xu13ciL4

我的问题:

  • 当我使用分类器为我的测试集预测标签时,每个预测都是 0
  • 训练准确度为 1,而测试集准确度约为 0.56
  • 我的学习曲线图如下所示:

在此处输入图像描述

现在,这似乎是这里过度拟合的经典案例。然而,这里的过度拟合不太可能是由于样本的特征数量不成比例(32 个特征,900 个样本)造成的。我尝试了很多方法来缓解这个问题:

  • 我尝试过使用降维(PCA),以防我有太多的样本数量的特征,但准确度得分和学习曲线图看起来与上面相同。除非我将组件的数量设置为 10 以下,否则训练精度会开始下降,但考虑到您开始丢失信息,这是否有点意料之中?
  • 我尝试过规范化和标准化数据。标准化 (SD = 1) 不会改变训练或准确度分数。归一化 (0-1) 将我的训练精度降低到 0.6。
  • 我已经为 SVC 尝试了各种 C 和 gamma 设置,但它们都不会改变任何一个分数
  • 尝试使用 GaussianNB 等其他估计器,甚至使用 adaboost 等集成方法。没变化
  • 尝试使用 linearSVC 明确设置正则化方法,但没有改善情况
  • 我尝试使用 theano 通过神经网络运行相同的功能,我的训练精度约为 0.6,测试约为 0.5

我很高兴继续思考这个问题,但在这一点上,我正在寻找正确方向的推动力。我的问题可能出在哪里,我能做些什么来解决它?

我的一组功能完全有可能无法区分这两个类别,但在得出这个结论之前,我想尝试其他一些选项。此外,如果我的特征无法区分,那将解释测试集分数低的原因,但在这种情况下如何获得完美的训练集分数?那可能吗?

1个回答

要查看 SVM 是否可以捕获任何信号,请尝试平衡您的数据:创建包含 50% 正样本和 50% 负样本的训练集和测试集(即,通过从较大的样本中随机抽取)。还要标准化数据(减去平均值并除以标准差)。

(为了平衡,您可以尝试更改 sklearn 中的class_weight参数,但我们发现手动方法(下采样)效果更好。)