开始对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)上,特征工程可能会花费几天甚至几周,但训练和预测也就几个小时搞定。。
相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
公众号推荐
   一个历史类的公众号,欢迎关注
一两拨千金