天天看点

开始对EEG数据进行训练

可能会随时更新,,,

第一个实验(desktop computer) 将2224个ep和normal总样本进行归一化: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-scale.exe epnorma llibsvm.svm > epnormallibsvm.scale WARNING: original #nonzeros 2127904          new      #nonzeros 6671908 Use -l 0 if many original feature values are zeros

对2224个总样本抽样(按约8:2的比例分为训练集和测试集): D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\tools>python subset.py epnorm allibsvm.scale 1770 epnormallibsvm.train epnormallibsvm.test

使用最easy的方式跑第一次svm,即使用easy.py工具(需要安装gnuplot软件): D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\tools>python easy.py epnormal libsvm.train epnormallibsvm.test Scaling training data... WARNING: original #nonzeros 5309923          new      #nonzeros 5309939 Use -l 0 if many original feature values are zeros Cross validation... 艾玛,机子卡了,,,

the second  day...

D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-predict.exe epnor mallibsvm.test.scale epnormallibsvm.train.model epnormalresult1.txt Accuracy = 97.7974% (444/454) (classification)

结果还不错啊。

第二组实验(laptop,不使用easy.py工具了,第一组实验准确率还挺高的,不知道是否存在过拟合): 对归一化后的2224个总样本抽样(按约7:3的比例分为训练集和测试集): D:\libsvm-3.20\tools>python subset.py epnormallibsvm.scale 1550 epnormallibsvm.t rain epnormallibsvm.test

直接用svm-train.exe工具对训练集进行训练svm模型: D:\libsvm-3.20\tools>cd ../windows

D:\libsvm-3.20\windows>svm-train.exe epnormallibsvm.train epnormallibsvm.train.m odel * optimization finished, #iter = 798 nu = 0.828093 obj = -1218.847945, rho = -5.348895 nSV = 1291, nBSV = 1276 Total nSV = 1291

使用svm-predict.exe工具对上一步训练好的model在测试集上进行测试: D:\libsvm-3.20\windows>svm-predict.exe epnormallibsvm.test epnormallibsvm.train. model epnormalresutl2.txt Accuracy = 61.5727% (415/674) (classification)

果然存在过拟合。。。或者还是参数没有调好,,,或者特征样本点不够“特征”??

第三个实验(laptop,对第二个实验进行自动选择最优参数,即还是使用easy.py,只是想对比一下结果): 估计得跑个十几分钟了(开始时间:2015.4.17 8:42:01) 有两台电脑任自己调配的好处就是,一台机器跑着一个实验,可以在另一台机器上跑另一个实验,吼吼~ 现在已经是9:17:30了,过去半个多小时了,还在跑着,,,使用easy.py进行参数调优实在是太慢了,准备手动调优参数了。 。。。 9:32:30了,50分钟过去了,仍然是Cross validation。。。此时的参数为(gnuplot上实时显示的): Best log2(C) = 5    log2(gamma) = -5  accuracy = 96.7742% C = 32    gamma = 0.03125 其中,log2(C) 为横坐标,log2(gamma)为纵坐标。 实际上,手动调参,主要就是惩罚系数C和rbf径向基核函数的参数gamma。那就参考此刻的C值哈gamma值,从这里开始吧。它是是继续跑它的(laptop),我在desktop上手动调参。 下面的几个实验都做完了,这个实验直到11:03:28才完成,历时2个小时21分钟。 看下结果吧(昨天晚上跑的第一个实验,早晨来了一看又崩了,没看到结果。。。这次可以看了,desktop还不如laptop): D:\libsvm-3.20\tools>python easy.py epnormallibsvm.train epnormallibsvm.test Scaling training data... WARNING: original #nonzeros 4649937          new      #nonzeros 4649962 Use -l 0 if many original feature values are zeros Cross validation... Best c=32.0, g=0.03125 CV rate=96.7742 Training... Output model: epnormallibsvm.train.model Scaling testing data... WARNING: original #nonzeros 2021971          new      #nonzeros 2021983 Use -l 0 if many original feature values are zeros Testing... Accuracy = 97.9228% (660/674) (classification) Output prediction: epnormallibsvm.test.predict

哈哈,貌似漫长的等待总是值得的,这次得到的Accuracy最高! 是不是可以想到,做事情不要浮躁,不要急于求成,静下心来研究,踏实走好每一步,结果总会好的~~

第四个实验(desktop,和第二个类似,只是train集和test集的比例换成约6:4): 首先对2224个总样本进行抽样: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\tools>python subset.py epnorm allibsvm.scale 1330 epnormallibsvm4.train epnormallibsvm4.test 对train集进行训练: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-train.exe epnorma llibsvm4.train epnormallibsvm4.train.model * optimization finished, #iter = 715 nu = 0.823675 obj = -1035.060451, rho = -5.268397 nSV = 1105, nBSV = 1085 Total nSV = 1105 对test集进行测试: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-predict.exe epnor mallibsvm4.test epnormallibsvm4.train.model epnormalresult4.txt Accuracy = 60.7383% (543/894) (classification) 仅仅通过实验二和实验四是否可以得出,仅仅训练不调优参数,实验结果差不多就在61%左右了??

那么既然实验一中的Accuracy那么高,不妨用那个训练好的model对实验二和实验四中的test集进行预测: 首先看一下对实验二的测试结果: 实验二的test集在laptop上(苦逼的是,有线无线网络不在一个局域网上,交换机虽然就在我这,但多插一根网线就会不工作,,,来回传文件要么用qq,要么用U盘代步,,登上qq机器会更卡,,一把辛酸泪,苦不堪言啊,,,),扯的太远了,先看看对实验四的test集的结果吧: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-predict.exe epnor mallibsvm4.test epnormallibsvm.train.model epnormalresult41.txt Accuracy = 96.868% (866/894) (classification) 额,貌似也挺高的,忽然想起来,这个模型是在约8比2的train集和test集(虽然分成了train集和test集,但已用了全部的数据样本得出来的model)上进行交叉验证的,仍然存在过拟合的问题,那么,接下来就在约占8的train集上进行再分train81集和test82集,仅仅对约占8的train集进行easy.py自动化参数调优,将约占2的test21集完全隔离开来,然后用这个新的model8对全新的test21集进行预测。

还有个问题,就是上面已经提到过的,使用easy.py进行参数调优实在是太慢了,还是手动调优参数吧。 手动调参,就选约8:2的train集和test集吧: 使用参数( -g 0.03125 -c 32)进行训练: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-train.exe -g 0.03 125 -c 32 epnormallibsvm1.train  epnormallibsvm11.model ...*.* optimization finished, #iter = 4975 nu = 0.063868 obj = -1964.716169, rho = -0.959370 nSV = 545, nBSV = 25 Total nSV = 545

手动写参数很快,就几秒钟就运行完了。 使用训练好的模型,对全新的test集进行预测: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-predict.exe epnor mallibsvm1.test epnormallibsvm11.model epnormalresult11.txt Accuracy = 97.7974% (444/454) (classification)

哇哦,准确率很高。

暂时到这里,要去开会了(Wearable2015)。10:00

回来继续实验(10:55)。

第五个实验(desktop,和第二、四个类似,只是train集和test集的比例换成5:5): 按5:5抽样: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\tools>python subset.py epnorm allibsvm.scale 1112 epnormallibsvm5.train epnormallibsvm5.test 仍然使用参数(-g 0.03125  -c 32)对train5集进行训练: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-train.exe -g 0.03 125 -c 32 epnormallibsvm5.train epnormal5.model ..*.* optimization finished, #iter = 3396 nu = 0.070966 obj = -1365.881889, rho = -0.961911 nSV = 429, nBSV = 15 Total nSV = 429 使用训练好的epnormal5.model对test5集进行预测: D:\Program Files\MATLAB\R2013a\toolbox\libsvm-3.20\windows>svm-predict.exe epnor mallibsvm5.test epnormal5.model epnormalresult5.txt Accuracy = 96.4029% (1072/1112) (classification) 准确率依然不错的样子,但还是有上升的空间,通过这组数据看来,1000个以上的数据会有几十个会预测错,error number(误差数)会随着数据量的增大而增大。

有个感慨,就是如同《机器学习那些事儿》中所说的,绝大部分的时间可能都会用在特征工程(Future Engineering,个人认为不错的一个方向,too)上,特征工程可能会花费几天甚至几周,但训练和预测也就几个小时搞定。。