Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn-模型一直过拟合_Python_Machine Learning_Scikit Learn_Signal Processing_Svm - Fatal编程技术网

Python sklearn-模型一直过拟合

Python sklearn-模型一直过拟合,python,machine-learning,scikit-learn,signal-processing,svm,Python,Machine Learning,Scikit Learn,Signal Processing,Svm,我正在寻找关于解决我目前机器学习问题的最佳方法的建议 问题的概要和我所做的工作如下: 我有900多次脑电图数据试验,每次试验都有1秒长。基本事实是已知的,并将状态0和状态1分类(40-60%分割) 每次试验都要经过预处理,在预处理中,我过滤并提取特定频段的功率,这些组成一组特征(特征矩阵:913x32) 然后我用SKL学习训练模型。当我使用0.2的测试大小时,使用交叉验证。分类器设置为SVC,带有rbf核,C=1,gamma=1(我尝试了许多不同的值) 您可以在此处找到代码的缩短版本: 我的

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

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

  • 我有900多次脑电图数据试验,每次试验都有1秒长。基本事实是已知的,并将状态0和状态1分类(40-60%分割)
  • 每次试验都要经过预处理,在预处理中,我过滤并提取特定频段的功率,这些组成一组特征(特征矩阵:913x32)
  • 然后我用SKL学习训练模型。当我使用0.2的测试大小时,使用交叉验证。分类器设置为SVC,带有rbf核,C=1,gamma=1(我尝试了许多不同的值)
您可以在此处找到代码的缩短版本:

我的问题:

  • 当我使用分类器预测测试集的标签时,每个预测值都是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
我很高兴继续思考这个问题,但在这一点上,我正在寻找一个正确的方向推动。我的问题可能在哪里?我能做些什么来解决它


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

我将首先尝试在参数空间上进行网格搜索,但同时也在训练集上使用k-折叠交叉验证(当然,将测试集保留在一边)。然后选择参数集,然后从k-折叠交叉验证中概括出最佳参数。我建议使用with(当将分类器作为估计器传递时,它已经是GridSearchCV的首选)

假设一个带有rbf的支持向量机可以完美地适应任何训练集,因为VC维数是无限的。因此,如果调整参数无助于减少过度拟合,那么您可能需要尝试类似的参数调整策略,以实现更简单的假设,例如线性SVM或其他您认为适合您的领域的分类器

你提到的正规化如果可用的话肯定是个好主意

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


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

在当前涉及EEG数据的Kaggle竞赛中,竞争对手所做的事情可能值得一试,尤其是脚本和论坛。测试的学习曲线为0.56,非常奇怪。所有样本是否独立(均来自不同受试者)?你如何构建你的训练/测试分割?所有的样本都需要独立吗?我有大约900个试验,大约20个受试者,所以不,不是独立的…样本不需要独立。但这会影响在训练/测试中分割数据集的方式。这也取决于你的预测任务。若你们在训练中有受试者1-16的所有样本,在测试中有受试者17-20的所有样本,那个么你们的模型可能正在发现与受试者17-20无关的特征。这只是一个想法,并不是说你应该“分割”一个没有意义的主题。啊,是的,这是一个非常好的观点。最初我把它分开了,正如你所说的,这是不正确的。我已经开始使用sklearn.train\u test\u split和sklearn.ShuffleSplit,我相信这两种方法都会随机洗牌特征向量,除非我弄错了?你应该使用随机网格搜索。它的速度更快,并且已经被证明优于经典的网格搜索。尝试在范围
[0,1]
中搜索,然后,如果随机搜索返回的值接近超参数的此间隔边缘,请增加该超参数的搜索范围。看,明天我将尝试更多的参数调整。我在想也许还有比这更明显的问题,但我们会看到的。你能解释一下f_classif到底做什么吗?这只是一个单因素方差分析,其中