來源:
BreastTissue_classify_matlab: 使用libsvm進行分類 (github.com)
使用的一般步驟
1 )按照 LIBSVM 軟件包所要求的格式准備數據集;
2 )對數據進行簡單的縮放操作;
3 )首要考慮選用 RBF 核函數;
4 )采用交叉驗證選擇最佳參數 C 與 g ;
5 )采用最佳參數 C 與 g 對整個訓練集進行訓練獲取支持向量機模型;
6 )利用獲取的模型進行測試與預測。
一、數據
BreastTissue_data.mat
這里給出了106個數據, 每一個數據都有9個特征和一個分類標簽;用這些數據來生成測試集和訓練集, 得到模型並且測試、分類。
label:1、2、3、4、5、6

二、代碼流程
%% I. 清空環境變量
clear all
clc
%% II. 導入數據
load BreastTissue_data.mat
%%
% 1. 隨機產生訓練集和測試集
n = randperm(size(matrix,1));
%%
% 2. 訓練集——80個樣本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);
%%
% 3. 測試集——26個樣本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);
%% III. 數據歸一化
[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';
%% IV. SVM創建/訓練(RBF核函數)
%%參數
% 1. 尋找最佳c/g參數——交叉驗證方法
[c,g] = meshgrid(-10:0.2:10,-10:0.2:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
for j = 1:n
cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
cg(i,j) = svmtrain(train_label,Train_matrix,cmd);
if cg(i,j) > bestacc
bestacc = cg(i,j);
bestc = 2^c(i,j);
bestg = 2^g(i,j);
end
if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j)
bestacc = cg(i,j);
bestc = 2^c(i,j);
bestg = 2^g(i,j);
end
end
end
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
%%
% 2. 創建/訓練SVM模型
model = svmtrain(train_label,Train_matrix,cmd);
%% V. SVM仿真測試
[predict_label_1,accuracy_1,prob_estimates] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2,prob_estimates2] = svmpredict(test_label,Test_matrix,model);
result_1 = [train_label predict_label_1];
result_2 = [test_label predict_label_2];
%% VI. 繪圖
figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真實類別','預測類別')
xlabel('測試集樣本編號')
ylabel('測試集樣本類別')
string = {'測試集SVM預測結果對比(RBF核函數)';
['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)
結果:
參數
輸入:
cmin,cmax: 懲罰參數c的變化范圍,在[2^cmin,2^cmax]范圍內尋找最佳的參數c,默認值為cmin=-8,cmax=8。
gmin,gmax: RBF核參數g的變化范圍,在[2^gmin,2^gmax]范圍內尋找最佳的RBF核參數g,默認值為gmin=-8,gmax=8。
v:對訓練集進行v-fold Cross Validation,默認為3。
cstep,gstep:進行參數尋優是c和g的步進大小,默認取值為cstep=1,gstep=1。
accstep:最后參數選擇結果圖中准確率離散化顯示的步進間隔大小([0,100]之間的一個數),默認為4.5。
輸出:
bestCVaccuracy:最終CV意義下的最佳分類准確率。
bestc:最佳的參數c。
bestg:最佳的參數g。
三、常用的幾個概念:
1.歸一化函數(mapminmax)
(1)[Y,PS] = mapminmax(X,YMIN,YMAX)
其中,YMIN是我們期望歸一化后矩陣Y每行的最小值,YMAX是我們期望歸一化后矩陣Y每行的最大值。
(2)[Y,PS] = mapminmax(X,FP)
FP是一個結構體成員,主要是FP.ymin(相當於YMIN), FP.ymax(相當於YMAX)。1和2處理效果一樣,只不過參數的帶入形式不同。
(3)Y = mapminmax('apply',X,PS)
PS是訓練樣本的映射,測試樣本的預處理方式應與訓練樣本相同。只需將映射PS apply到測試樣本。
(4)X = mapminmax('reverse',Y,PS)
將歸一化后的Y反轉為歸一化之前
(5)dx_dy = mapminmax('dx_dy',X,Y,PS)
2.交叉驗證(Cross-validation)
交叉驗證將原始數據集分為兩組,分別作為訓練集和驗證集。訓練集用於訓練模型,驗證集用於評價訓練模型的性能指標。
參數尋優的意義:參數的數值決定着模型的性能。
采用交叉驗證方法保障驗證數據集沒有參與過模型的訓練,可以給出較為准確的參數尋優結果。
幾種常用交叉驗證(cross validation)方式的比較【python】
優化算法有很多,如網格搜索算法、遺傳算法、粒子群算法、蟻群算法、模擬退火算法等。
交叉驗證來說,我們采取的是網格搜索算法,即在參數的一定的范圍內,按照指定的步長對不同的參數進行排列組合,將每一組參數組合進行測試,取性能指標最優的那一組參數作為最終參數的值。如本例中(C,gamma)組成了一個二維網格,再與性能指標識別率組成三維模型,實現參數的最優選擇。
1、Double cross-validation
Double cross-validation也稱2-fold cross-validation(2-CV)
將數據集分成兩個相等大小的子集,進行兩回合的分類器訓練。在第一回合,一個子集作為訓練集,另一個作為測試集;在第二回合,則將訓練集與測試集對換后,再次訓練分類器,而其中我們比較關心的是兩次測試集的識別率。
優點:容易實現,處理簡單。
缺點:沒有用到交叉的方法,驗證數據集對於模型的訓練沒有任何貢獻。
2、K-flod CV(k折交叉驗證)
樣本數據被分為k組,每次將一組作為驗證數據集,其余的k−1組作為訓練數據集。這樣就會有k 個訓練模型,這k個模型的驗證准確率的平均值作為模型的性能指標。
優點:所有的樣本都會被用於模型訓練,評價結果可信。
缺點:相較於Hold one method,處理較為復雜。
3、Leave-One-Out CV(LOO-CV留一驗證法)
設原始數據集中有K個樣本,每次選擇一個樣本作為驗證數據集,其余的K−1個樣本作為訓練數據集,這樣就會有K個訓練模型,這K個訓練模型的驗證准確率平均值為模型的性能指標。
優點:每次模型訓練,幾乎所有的樣本都會應用到,結果最可信。
缺點:需要訓練的模型較多,且訓練數據集樣本大,計算成本高。
3.rbf核函數最佳參數cg的選取w問題
C被稱為懲罰因子,C越大說明對錯誤的容忍度越小,會導致過擬合(overfitting);C太小可能會導致容錯率過高,會導致欠擬合。
一般是通過交叉驗證的方法來確定C和gamma。
思路:將C和gamma參數在一定取值范圍內按照一定的步長(默認為1)進行取值組合;在不同(C,gamma)的組合下,將訓練集樣本均分成k組,一組作為驗證的數據樣本,其余k-1組則用來作為訓練的數據,每一組數據都輪流着作為驗證數據樣本,這樣在一組(C,gamma)組合下,就需要進行K次計算,把這K次計算的模型測試准確率score的均值作為這組(C,gamma)下模型的得分。這樣的話就能夠得到不同(C,gamma)組合下模型的得分,取得分最高的那組(C,gamma)即可,如果碰到有相同分的,一般考慮參數C,取C小的,因為在保證模型的准確率的情況下,C越小模型容錯率大,可以避免過擬合,若C也相同,則取先出現的那一組gamma。簡單的說,網格法原理就是在一定的范圍里面大步伐的,挨着試cg的參數,然后把該參數結果的精確度 繪制成等高線;再縮小cg的范圍,用小步伐去試,所以運算量很大。
網格法的缺點就是慢,數據量稍微大一點根本就跑不了。詳細的理論代碼可以在《[MATAB神經網絡30個案例分析].史峰》這本書的的十二十三章有講解,數據量太大的真的跑不動。
