1. 程式人生 > >LIBSVM資料格式及其使用

LIBSVM資料格式及其使用

關於支援向量機(SVM)的理論部分推薦一個部落格:支援向量機通俗導論(理解SVM的三層境界)

July的部落格分三層講述支援向量機,對於我們需要了解道不同層次的學習者來說,一目瞭然。

我也是通過此部落格進行學習的。

假若你已經基本上掌握了SVM的理論部分,那麼如何對資料進行分析呢?

我們一般對資料使用SVM進行分類的時候,使用的是林智仁的SVM庫:LIBSVM

在這裡可以下載到最新的庫,而且能夠下載到訓練所用的資料,但是資料連線點開之後只能複製,就像這個資料集:

不能下載,那我們複製完之後儲存成什麼格式呢?

我們可以從LIBSVM裡面隨便下載一個數據,比如libsvm裡面自帶的heart_scale,然後用notepad開啟,貼上儲存即可

對於自己的資料怎麼辦呢?

首先,我們知道LIBSVM裡面的資料格式如下:

Label 1:value 2:value ….

其次,我們使用FormatDataLibsvm.xls生成這種格式,具體如下:

下載FormatDataLibsvm.xls(百度搜索)

執行FormatDataLibsvm.xls(注意這時會有一個關於“巨集已禁巨集”的安全警示,點選“選項”,選擇“啟用此內容”,確定即可);1,先執行FormatDataLibsvm.xls然後將資料貼上到sheet1的topleft單元。

2、 開啟data.xls,(注:網上很多的介紹都是直接將資料貼上到sheet1的topleft單元),要特別注意的是這時候的資料排列順序應該是:

              條件屬性a   條件屬性b  ...  決策屬性

                        7     5    ...  2

                        4     2    ...  1

  3、"工具"-->"巨集"-->執行下面有一個選項(FormatDatatoLibsvm)-->執行,要選中這個然後點選“執行” ,這時候資料講變成:

             決策屬性  條件屬性a  條件屬性b  ...

                    2    1:7    2:5    ...

                   1    1:4    2:2    ...

等資料轉換完成後,將該檔案儲存為.txt檔案。這時資料轉換的問題就解決了。

最後,從LIBSVM裡面隨便下載一個數據,比如libsvm裡面自帶的heart_scale,然後用notepad開啟,資料貼上進儲存即可

使用libsvm 3.18 MATLAB 程式設計對UCI的資料breast進行分類:

程式如下:

%資料本身分組加預測



[breast_label, breast_inst] =libsvmread('../breast_scale');

 data= [breast_inst(:,1), breast_inst(:,2),breast_inst(:,3), breast_inst(:,4)];

%data = breast_inst;

 groups = ismember(breast_label,2);                                         %將標籤轉換成1和0

 [train, test] =crossvalind('holdOut',groups,0.7);                         %利用交叉耦合函式進行分組,70%的資料用來訓練,剩下的資料進行預測



 train_breast = data(train,:);                                       %獲取train標籤對應的訓練資料

 train_breast_labels = groups(train,:);

 train_breast_labels = double(train_breast_labels );



 test_breast = data(test,:);                                         %獲取train標籤對應的訓練資料

 test_breast_labels = groups(test,:);                     

 test_breast_labels =double(test_breast_labels);



 % 資料歸一化

 train_breast = normalization(train_breast',2);

 test_breast = normalization(test_breast',2);

 train_breast = train_breast';

 test_breast = test_breast';



 %訓練和預測

 model = svmtrain(train_breast_labels,train_breast, '-s 0 -t 0 -c 1 -g 0.07');

 [predict_label, accuracy, dec_values] =svmpredict(test_breast_labels, test_breast, model);



 [mm,mn] = size(model.SVs);



figure;

hold on;

[m,n] = size(train_breast);

for run = 1:m

   if train_breast_labels(run) == 0

       h1 = plot( train_breast(run,1),train_breast(run,2),'r+' );

   else

       h2 = plot( train_breast(run,1),train_breast(run,2),'g*' );

   end

   for i = 1:mm

       if model.SVs(i,1)==train_breast(run,1) &&model.SVs(i,2)==train_breast(run,2)

           h3 = plot( train_breast(run,1),train_breast(run,2),'o' );

       end

   end

end



legend([h1,h2,h3],'1','0','SupportVectors');

hold off;

執行結果:
分類結果圖

optimization finished, #iter = 67190

nu = 0.093757

obj = -18.486007, rho = -0.113756

nSV = 22, nBSV = 16

Total nSV = 22

Accuracy = 95.1782% (454/477)(classification)
總之,資料前期處理很重要,歸一化很重要,明白引數,逐一試試,才能達到較好的分類效果。