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)
總之,資料前期處理很重要,歸一化很重要,明白引數,逐一試試,才能達到較好的分類效果。