gpt4 book ai didi

python - sklearn - 模型保持过度拟合

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:34 25 4
gpt4 key购买 nike

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

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

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

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

我的问题:

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

enter image description here

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

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

我很高兴继续思考这个问题,但此时我正在寻找正确方向的插入力。我的问题可能出在哪里,我可以做些什么来解决它?

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

最佳答案

我会首先尝试在参数空间上进行网格搜索,同时还会对训练集使用 k 折交叉验证(当然,将测试集放在一边)。然后选择一组参数,然后从 k 折交叉验证中概括出最好的参数。我建议使用 GridSearchCVStratifiedKFold (当将分类器作为估计器传递时,它已经是 GridSearchCV 的 default strategy)。

假设具有 rbf 的 SVM 可以完美地适应任何训练集,因为 VC 维度是无限的。因此,如果调整参数无助于减少过度拟合,那么您可能希望针对更简单的假设尝试类似的参数调整策略,例如线性 SVM 或您认为可能适合您的领域的其他分类器。

您提到的正则化如果可用的话绝对是个好主意。

相同标签的预测让我认为标签不平衡可能是一个问题,对于这种情况,您可以使用不同的类别权重。所以在 SVM 的情况下,每个类都有自己的 C 惩罚权重。 sklearn 中的一些估计器接受拟合参数,允许您设置样本权重以设置单个训练样本的惩罚量。

现在,如果您认为这些特征可能是个问题,我会通过查看 f_classif 提供的 F 值来使用特征选择,并且可以与 SelectKBest 之类的东西一起使用。另一种选择是使用交叉验证进行递归特征消除。如果您使用 sklearns Pipeline API,特征选择也可以包含在网格搜索中。

关于python - sklearn - 模型保持过度拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31956501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com