1.資料集:採用 matlab2016b 自帶資料集:iris鳶尾花、ionosphere電離層資料
2.採用函式 fitcecoc 進行svm多分類模型訓練;【fitcecoc:ecoc:error-correcting output code】
3.採用10折交叉驗證對資料集進行劃分,將mdl轉化為 cvmdl
4.將誤差ossloss作為模型的評價指標
示例1:鳶尾花資料集iris
function [cvmdl,oosloss]=svm3() %分成三類load fisheriris
x = meas; %150*4 :150個樣本,4個特徵(萼長、萼寬、瓣長、瓣寬);meas=measure(長度)
y = species; %三種屬性;species(種類)
t = templatesvm('standardize',1); %建立svm模板t;
%templatesvm是fitcecoc函式中的svm模板;
%standardize:資料標準化,可用help檢視templatesvm其他引數
%訓練該模型
mdl = fitcecoc(x,y,'learners',t,'classnames',);
%驗證該模型
cvmdl = crossval(mdl); %將模型進行交叉驗證,平衡模型欠擬合和過擬合
%顯示結果
oosloss = kfoldloss(cvmdl) %10折交叉驗證得到的泛化誤差 oosloss =0.033,效果很好
結果如下:
>> [cvmdl,oosloss]=svm3()
cvmdl =
classreg.learning.partition.classificationpartitionedecoc
crossvalidatedmodel: 'ecoc'
predictornames:
responsename: 'y'
numobservations: 150
kfold: 10
partition: [1x1 cvpartition]
classnames:
scoretransform: 'none'
properties, methods
oosloss =
0.0333333333333333
示例2:電離層資料二分類
%matlab自帶電離層load ionosphere;
%使用預設選項訓練ecoc多類模型
model_2 =fitcecoc(x,y);
%建立乙個svm模板
t_2 = templatesvm('standardize',1);
%接下來訓練ecoc分類器
model_2 = fitcecoc(x,y,'learners',t_2);
%使用10倍交叉驗證交叉驗證mdl
cvmodel_2 =crossval(model_2);
%估算泛化誤差
oosloss_2 = kfoldloss(cvmodel_2);
結果:
>> [cvmodel_2,oosloss_2]=svm31()cvmodel_2 =classreg.learning.partition.classificationpartitionedecoc
crossvalidatedmodel: 'ecoc'predictornames:
responsename: 'y'numobservations: 351kfold: 10partition: [1x1 cvpartition]
classnames:
scoretransform: 'none'properties, methods
oosloss_2 =
0.113960113960115
多分類查詢
有這樣乙個情況 現在有50個分類,每個型別我們只需要15條記錄!該怎麼做?而每個型別的記錄數大概都在數萬條!我遇到此種問題,本能的把它當做一般的問題來處理 你不是要50個分類,每種分類要15條嗎?好 第一種方式 通過子查詢方式實現,語句如下 slect n.from news object n wh...
libsvm 多分類情況
svm是乙個二分類器,當遇到多類別的時候,一般採取如下兩種策略。a.一對多法 one versus rest,簡稱1 v r svms 訓練時依次把某個類別的樣本歸為一類,其他剩餘的樣本歸為另一類,這樣k個類別的樣本就構造出了k個svm。分類時將未知樣本分類為具有最大分類函式值的那類。b.一對一法 ...
多分類學習
多分類學習的基本思路是拆解法,即將多個二分類任務拆為若干個二分類任務求解。具體地就是,先對問題進行拆分,然後為每個拆分的二分類任務訓練乙個分類器 在測試時,對這些分類器的 結果進行整合以獲得最終的多分類結果。關鍵 多分類任務如何拆分。經典的為 一對一 one vs one,ovo 一對多 one v...