1. 程式人生 > >matlab二分類實驗(使用libsvm工具包+SVMcgForClass函式)

matlab二分類實驗(使用libsvm工具包+SVMcgForClass函式)

這幾天在做資料探勘實驗,實驗要求在 Matlab 環境下,利用 libsvm 工具包設計一個 SVM 兩類分類器。在給定的資料集上進行 2-折交叉驗證,另外可以使用SVMcgForClass函式尋找最優的c和g引數。
我在做實驗的過程中參考了以下網址的解釋,這裡詳細解釋了libsvm中函式的使用,並且詳細說明了每個引數的含義,另外還可以下載到libsvm以及SVMcgForClass函式的原始碼。
http://www.matlabsky.com/thread-10966-1-1.html(很詳細)

實驗程式碼如下:

tic;
load('DATA.mat');
[N,M]=size(DATA);%N=14980,M=15
K=2; %我覺得資料本身並不適合做歸一化操作,歸一化之後效果反而不好了 indices=crossvalind('Kfold',N,K);%將N個數據隨機分成K份,並返回對應的索引 %%第一折 TEST1=(indices==1);%測試資料的索引 TRAIN1=~TEST1;%訓練資料的索引 train1_data=DATA(TRAIN1,1:M-1); train1_label=DATA(TRAIN1,M); test1_data=DATA(TEST1,1:M-1); test1_label=DATA(TEST1,M); [bestacc1,bestc1,bestg1] = SVMcgForClass(train1_label,train1_data,-8
,8,-8,8,2,1,1,4.5) model1=svmtrain(train1_label,train1_data,'-c bestc1 -g bestg1' ); [label_train1, acc_train1,decision_train1] = svmpredict(train1_label,train1_data,model1); [label_test1, acc_test1,decision_test1] = svmpredict(test1_label,test1_data,model1); %%第二折 TEST2=(indices==2);%測試資料的索引 TRAIN2=~TEST2;%訓練資料的索引
train2_data=DATA(TRAIN2,1:M-1); train2_label=DATA(TRAIN2,M); test2_data=DATA(TEST2,1:M-1); test2_label=DATA(TEST2,M); [bestacc2,bestc2,bestg2] = SVMcgForClass(train2_label,train2_data,-8,8,-8,8,2,1,1,4.5) model2=svmtrain(train2_label,train2_data,'-c bestc2 -g bestg2'); [label_train2, acc_train2,decision_train2] = svmpredict(train2_label,train2_data,model2); [label_test2, acc_test2,decision_test2] = svmpredict(test2_label,test2_data,model2); toc;

實驗結果如下:
工作區中的結果變數:
這裡寫圖片描述
另外,由於是二折交叉驗證,每一折都會在訓練集上使用SVMcgForClass函式尋找最優的引數(c和g),所以一共生成了四個結果圖片,如下:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
上面工作區中的結果有點奇怪啊,在找到最優的c和g之後,分別使用model1=svmtrain(train1_label, train1_data, ‘-c bestc1 -g bestg1’ )進行模型訓練;使用[label_train1, acc_train1, decision_train1] = svmpredict(train1_label, train1_data, model1)對訓練資料進行測試;
使用[label_test1, acc_test1, decision_test1] = svmpredict(test1_label, test1_data, model1)對測試資料進行測試;
但是model1,model2,label_train1,acc_train1, decision_train1等結果都為空,我猜想是不是訓練時使用svmtrain(train1_label,train1_data,’-c bestc1 -g bestg1’ )導致的原因,於是又做了下面的實驗:把svmtrain(train1_label,train1_data,’-c bestc1 -g bestg1’ )中的bestc1和bestg1直接替換成找到的最優的c和g的值(從工作區中可以看出,bestc1=4,bestg1=0.0039, bestc2=2, bestg2=0.0039),於是直接運行了這幾行程式碼:

model1=svmtrain(train1_label,train1_data,'-c 4 -g 0.0039' );
[label_train1, acc_train1,decision_train1] = svmpredict(train1_label,train1_data,model1);
[label_test1, acc_test1,decision_test1] = svmpredict(test1_label,test1_data,model1);
model2=svmtrain(train2_label,train2_data,'-c 2 -g 0.0039');
[label_train2, acc_train2,decision_train2] = svmpredict(train2_label,train2_data,model2);
[label_test2, acc_test2,decision_test2] = svmpredict(test2_label,test2_data,model2);

這樣執行完成後,剛才沒有的資料就都出現了,如下圖:
這裡寫圖片描述
實驗結論:
1.從圖上可以看出,第一折的訓練準確率:100%,第一折測試準確率:97%;第二折的訓練準確率是:100%,第二折的測試準確率:96.87%
2.使用找到的最優c和g訓練我們的模型時,要寫成’-c 4 -g 0.0039’,不要寫成’-c bestc1 -g bestg1’ ,好像尋優函式並不知道字串裡面儲存的是啥內容。