Matlab建立SVM,KNN和樸素貝葉斯模型分類繪制ROC曲線|附代碼數(shù)據(jù)
原文鏈接:http://tecdat.cn/?p=15508
最近我們被客戶要求撰寫關(guān)于SVM,KNN和樸素貝葉斯模型的研究報告,包括一些圖形和統(tǒng)計輸出。
繪制ROC曲線通過Logistic回歸進行分類
加載樣本數(shù)據(jù)。
load fisheriris
通過使用與versicolor和virginica物種相對應(yīng)的度量來定義二元分類問題。
pred = meas(51:end,1:2);
定義二進制響應(yīng)變量。
resp = (1:100)'>50; ?% Versicolor = 0, virginica = 1
擬合邏輯回歸模型。
mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');
計算ROC曲線。使用邏輯回歸模型中的概率估計值作為得分。
perfcurve
?將閾值存儲在數(shù)組中。
顯示曲線下的面積。
AUCAUC = 0.7918
曲線下的面積為0.7918。最大AUC為1,對應(yīng)于理想分類器。較大的AUC值表示更好的分類器性能。
繪制ROC曲線
plot(X,Y)xlabel('False positive rate')
ylabel('True positive rate')title('ROC for Classification by Logistic Regression')

?
使用ROC曲線比較分類方法
?
加載樣本數(shù)據(jù)
load ionosphere
X
?是351x34預(yù)測變量的矩陣。?Y
?是類別標簽的字符數(shù)組:??'b'
?不良雷達回波和??'g'
?良好雷達回波。
重新格式化因變量以適合邏輯回歸。
擬合一個邏輯回歸模型來估計雷達返回的后驗概率是一個不好的概率。
mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');score_log = mdl.Fitted.Probability; % Probability estimates
使用得分的概率計算標準ROC曲線。
在相同的樣本數(shù)據(jù)上訓(xùn)練SVM分類器標準化數(shù)據(jù)。
mdlSVM = fitcsvm(pred,resp,'Standardize',true);
計算后驗概率。
第二列??score_svm
?包含不良雷達收益的后驗概率。
使用SVM模型的分數(shù)計算標準ROC曲線。
在同一樣本數(shù)據(jù)上擬合樸素貝葉斯分類器。
計算后驗概率(分數(shù))
[~,score_nb] = resubPredict(mdlNB);
使用樸素貝葉斯分類的分數(shù)計算標準ROC曲線。
將ROC曲線繪制在同一張圖上。

點擊標題查閱往期內(nèi)容

數(shù)據(jù)分享|R語言邏輯回歸、線性判別分析LDA、GAM、MARS、KNN、QDA、決策樹、隨機森林、SVM分類葡萄酒交叉驗證ROC

左右滑動查看更多

01

02

03

04

?
盡管對于較高的閾值,SVM可以產(chǎn)生更好的ROC值,但邏輯回歸通常更擅長區(qū)分不良雷達收益與良好雷達。樸素貝葉斯的ROC曲線通常低于其他兩個ROC曲線,這表明樣本內(nèi)性能比其他兩個分類器方法差。
比較所有三個分類器的曲線下面積。
AUClogAUClog = 0.9659AUCsvmAUCsvm = 0.9489AUCnbAUCnb = 0.9393
Logistic回歸的AUC度量最高,而樸素的貝葉斯則最低。該結(jié)果表明,邏輯回歸對此樣本數(shù)據(jù)具有更好的樣本內(nèi)平均性能。
確定自定義內(nèi)核功能的參數(shù)值
本示例說明如何使用ROC曲線為分類器中的自定義內(nèi)核函數(shù)確定更好的參數(shù)值。
在單位圓內(nèi)生成隨機的一組點。
定義預(yù)測變量。將第一象限和第三象限中的點標記為屬于正類別,而將第二象限和第二象限中的點標記為負類。
pred = [X1; X2];resp = ones(4*n,1);resp(2*n + 1:end) = -1; % Labels
創(chuàng)建函數(shù)mysigmoid.m
?,該函數(shù) 接受要素空間中的兩個矩陣作為輸入,并使用S形內(nèi)核將其轉(zhuǎn)換為Gram矩陣。
使用Sigmoid內(nèi)核函數(shù)訓(xùn)練SVM分類器。使用標準化數(shù)據(jù)。
設(shè)置??gamma = 0.5
?,使用調(diào)整后的S形核訓(xùn)練SVM分類器。
SVMModel2 = fitPosterior(SVMModel2);[~,scores2] = resubPredict(SVMModel2);
計算兩個模型的ROC曲線和曲線下面積(AUC)。
繪制ROC曲線。
plot(x1,y1)
hold onplot(x2,y2)
hold offtitle('ROC for classification by SVM');

?
將gamma參數(shù)設(shè)置為0.5的內(nèi)核函數(shù)可提供更好的樣本內(nèi)結(jié)果。
比較AUC度量。
auc1
auc2auc1 =
? ?0.9518auc2 =
? ?0.9985
伽瑪設(shè)置為0.5時曲線下的面積大于伽瑪設(shè)置為1時曲線下的面積。這也證實了伽瑪參數(shù)值為0.5會產(chǎn)生更好的結(jié)果。為了直觀比較這兩個伽瑪參數(shù)值的分類性能。
?
繪制分類樹的ROC曲線
?
加載樣本數(shù)據(jù)。
load fisheriris
列向量??species
由三種不同物種的鳶尾花組成。雙矩陣??meas
?包含對花朵的四種測量類型:萼片長度,萼片寬度,花瓣長度和花瓣寬度。所有度量單位均為厘米。
使用萼片的長度和寬度作為預(yù)測變量訓(xùn)練分類樹。
根據(jù)樹預(yù)測物種的分類標簽和分數(shù)?。
[~,score] = resubPredict(Model);
分數(shù)是觀察值(數(shù)據(jù)矩陣中的一行)所屬類別的后驗概率。列??score
?對應(yīng)于所指定的類??'ClassNames'
。
由于這是一個多類問題,因此不能僅將其??score(:,2)
?作為輸入。這樣做將無法提供??perfcurve
?有關(guān)兩個陰性類別(setosa和virginica)分數(shù)的足夠信息。此問題與二元分類問題不同,在二元分類問題中,知道一個類別的分數(shù)就足以確定另一個類別的分數(shù)。因此,必須提供??perfcurve
?將兩個否定類的得分納入考慮范圍的函數(shù)。一種函數(shù)是score(:,2)-max(score(:,1),score(:,3))。
X
,默認為假陽性率,??Y
,默認為真陽性率(召回率或敏感性)。正類標簽為??versicolor
。由于未定義否定類別,因此??perfcurve
?假設(shè)不屬于肯定類別的觀測值屬于一個類別。該函數(shù)將其接受為否定類。
suby = 12×2
? ? ? ? 0 ? ? ? ? 0
? ?0.1800 ? ?0.1800
? ?0.4800 ? ?0.4800
? ?0.5800 ? ?0.5800
? ?0.6200 ? ?0.6200
? ?0.8000 ? ?0.8000
? ?0.8800 ? ?0.8800
? ?0.9200 ? ?0.9200
? ?0.9600 ? ?0.9600
? ?0.9800 ? ?0.9800
? ? ??subnames = 1x2 cell
? ?{'setosa'} ? ?{'virginica'}
在ROC曲線上繪制ROC曲線和最佳工作點。

?
找到與最佳工作點相對應(yīng)的閾值。
T((X==OPTROCPT(1))&(Y==OPTROCPT(2)))ans = 0.2857
指定??virginica
?為否定類,并計算和繪制ROC曲線??versicolor
。
同樣,必須提供??perfcurve
?將否定類分數(shù)納入考量的函數(shù)。要使用的函數(shù)的一個示例是score(:,2)-score(:,3)。

?
計算ROC曲線的逐點置信區(qū)間
加載樣本數(shù)據(jù)。
load fisheriris
僅將前兩個變量用作預(yù)測變量,來定義二元問題。
pred = meas(51:end,1:2);
定義二進制因變量。
resp = (1:100)'>50; ?% Versicolor = 0, virginica = 1
擬合邏輯回歸模型。
通過垂直平均(VA)和使用bootstrap進行采樣,計算真實正率(TPR)上的逐點置信區(qū)間。
'NBoot',1000
?將引導(dǎo)樣本的數(shù)量設(shè)置為1000。??'XVals','All'
?提示??perfcurve
?返回??X
,??Y
和??T
?所有分數(shù)的Y
?值,并X
?使用垂直平均將所有值的值(真陽性率)? 平均? (假陽性率)。?默認情況下將使用閾值平均來計算置信范圍。
繪制逐點置信區(qū)間。
errorbar(X,Y(:,1),Y(:,1)-Y(:,2),Y(:,3)-Y(:,1));

?
不一定總是可以控制誤報率(FPR,X
?此示例中的? 值)。因此,可能希望通過閾值平均來計算真實正利率(TPR)的逐點置信區(qū)間。
繪制置信區(qū)間。
figure()errorbar(X1(:,1),Y1(:,1),Y1(:,1)-Y1(:,2),Y1(:,3)-Y1(:,1));

?
指定閾值計算ROC曲線。然后繪制曲線。
figure()errorbar(X1(:,1),Y1(:,1),Y1(:,1)-Y1(:,2),Y1(:,3)-Y1(:,1));
?


點擊文末?“閱讀原文”
獲取全文完整代碼數(shù)據(jù)資料。
本文選自《Matlab建立SVM,KNN和樸素貝葉斯模型分類繪制ROC曲線》。
點擊標題查閱往期內(nèi)容
R語言貝葉斯廣義線性混合(多層次/水平/嵌套)模型GLMM、邏輯回歸分析教育留級影響因素數(shù)據(jù)
邏輯回歸Logistic模型原理R語言分類預(yù)測冠心病風險實例
數(shù)據(jù)分享|用加性多元線性回歸、隨機森林、彈性網(wǎng)絡(luò)模型預(yù)測鮑魚年齡和可視化
R語言高維數(shù)據(jù)懲罰回歸方法:主成分回歸PCR、嶺回歸、lasso、彈性網(wǎng)絡(luò)elastic net分析基因數(shù)據(jù)(含練習(xí)題)
Python中LARS和Lasso回歸之最小角算法Lars分析波士頓住房數(shù)據(jù)實例
R語言Bootstrap的嶺回歸和自適應(yīng)LASSO回歸可視化
R語言Lasso回歸模型變量選擇和糖尿病發(fā)展預(yù)測模型R語言實現(xiàn)貝葉斯分位數(shù)回歸、lasso和自適應(yīng)lasso貝葉斯分位數(shù)回歸分析
基于R語言實現(xiàn)LASSO回歸分析
R語言用LASSO,adaptive LASSO預(yù)測通貨膨脹時間序列
R語言自適應(yīng)LASSO 多項式回歸、二元邏輯回歸和嶺回歸應(yīng)用分析
R語言懲罰logistic邏輯回歸(LASSO,嶺回歸)高維變量選擇的分類模型案例
Python中的Lasso回歸之最小角算法LARS
r語言中對LASSO回歸,Ridge嶺回歸和彈性網(wǎng)絡(luò)Elastic Net模型實現(xiàn)
r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現(xiàn)
R語言實現(xiàn)LASSO回歸——自己編寫LASSO回歸算法
R使用LASSO回歸預(yù)測股票收益
python使用LASSO回歸預(yù)測股票收益