sklearn - 模型保持过度拟合
sklearn - model keeps overfitting
我正在寻找有关解决当前机器学习问题的最佳方法的建议
问题的概要和我所做的如下:
- 我对 EEG 数据进行了 900 多次试验,每次试验的时长为 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 和伽马设置,但它们都没有改变任何一个分数
- 尝试使用其他估计器(如 GaussianNB),甚至是集成方法(如 adaboost)。没有变化
- 尝试使用 linearSVC 明确设置正则化方法,但没有改善这种情况
- 我使用 theano 通过神经网络尝试了 运行 相同的特征,我的训练精度约为 0.6,测试约为 0.5
我很高兴继续思考这个问题,但此时我正在寻找正确方向的推动力。我的问题可能出在哪里,我该怎么做才能解决它?
完全有可能我的特征集无法区分这两个类别,但在得出这个结论之前我想尝试一些其他选项。此外,如果我的特征无法区分,那么这可以解释测试集分数低的原因,但在这种情况下如何获得完美的训练集分数?这可能吗?
我会首先尝试对参数 space 进行网格搜索,但同时也会对训练集使用 k 折交叉验证(当然将测试集放在一边)。然后选择一组参数,然后从 k 折交叉验证中概括出最好的参数。我建议在传递 classifier 作为估算器时对 GridSearchCV 使用 GridSearchCV with StratifiedKFold (it's already the default strategy。
假设带有 rbf 的 SVM 可以完美地适应任何训练集,因为 VC 维度是无限的。因此,如果调整参数无助于减少过度拟合,那么您可能希望针对更简单的假设尝试类似的参数调整策略,例如线性 SVM 或您认为可能适合您的领域的其他 classifier。
你提到的正则化如果可用的话绝对是个好主意。
相同标签的预测让我认为标签不平衡可能是一个问题,对于这种情况,您可以使用不同的 class 权重。所以在 SVM 的情况下,每个 class 都有自己的 C 惩罚权重。 sklearn 中的一些估计器接受拟合参数,允许您设置样本权重以设置单个训练样本的惩罚量。
现在,如果您认为这些特征可能是个问题,我会通过查看 f_classif 提供的 F 值来使用特征选择,并且可以与 SelectKBest 之类的东西一起使用。另一种选择是使用交叉验证进行递归特征消除。如果您使用 sklearns Pipeline API.
,特征选择也可以包含在网格搜索中
我正在寻找有关解决当前机器学习问题的最佳方法的建议
问题的概要和我所做的如下:
- 我对 EEG 数据进行了 900 多次试验,每次试验的时长为 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 和伽马设置,但它们都没有改变任何一个分数
- 尝试使用其他估计器(如 GaussianNB),甚至是集成方法(如 adaboost)。没有变化
- 尝试使用 linearSVC 明确设置正则化方法,但没有改善这种情况
- 我使用 theano 通过神经网络尝试了 运行 相同的特征,我的训练精度约为 0.6,测试约为 0.5
我很高兴继续思考这个问题,但此时我正在寻找正确方向的推动力。我的问题可能出在哪里,我该怎么做才能解决它?
完全有可能我的特征集无法区分这两个类别,但在得出这个结论之前我想尝试一些其他选项。此外,如果我的特征无法区分,那么这可以解释测试集分数低的原因,但在这种情况下如何获得完美的训练集分数?这可能吗?
我会首先尝试对参数 space 进行网格搜索,但同时也会对训练集使用 k 折交叉验证(当然将测试集放在一边)。然后选择一组参数,然后从 k 折交叉验证中概括出最好的参数。我建议在传递 classifier 作为估算器时对 GridSearchCV 使用 GridSearchCV with StratifiedKFold (it's already the default strategy。
假设带有 rbf 的 SVM 可以完美地适应任何训练集,因为 VC 维度是无限的。因此,如果调整参数无助于减少过度拟合,那么您可能希望针对更简单的假设尝试类似的参数调整策略,例如线性 SVM 或您认为可能适合您的领域的其他 classifier。
你提到的正则化如果可用的话绝对是个好主意。
相同标签的预测让我认为标签不平衡可能是一个问题,对于这种情况,您可以使用不同的 class 权重。所以在 SVM 的情况下,每个 class 都有自己的 C 惩罚权重。 sklearn 中的一些估计器接受拟合参数,允许您设置样本权重以设置单个训练样本的惩罚量。
现在,如果您认为这些特征可能是个问题,我会通过查看 f_classif 提供的 F 值来使用特征选择,并且可以与 SelectKBest 之类的东西一起使用。另一种选择是使用交叉验证进行递归特征消除。如果您使用 sklearns Pipeline API.
,特征选择也可以包含在网格搜索中