拓端tecdat|Matlab建立SVM,KNN和朴素貝葉斯模型分類繪制ROC曲線


原文鏈接:http://tecdat.cn/?p=15508

繪制ROC曲線通過Logistic回歸進行分類

加載樣本數據。

load fisheriris

通過使用與versicolor和virginica物種相對應的度量來定義二元分類問題。

pred = meas(51:end,1:2);

定義二進制響應變量。

resp = (1:100)'>50;  % Versicolor = 0, virginica = 1

擬合邏輯回歸模型。

mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');

計算ROC曲線。使用邏輯回歸模型中的概率估計值作為得分。

perfcurve 將閾值存儲在數組中。

顯示曲線下的面積。

  1.  
    AUC
  2.  
    AUC = 0.7918

曲線下的面積為0.7918。最大AUC為1,對應於理想分類器。較大的AUC值表示更好的分類器性能。

繪制ROC曲線

  1.  
    plot(X,Y)
  2.  
    xlabel('False positive rate')
  3.  
    ylabel('True positive rate')
  4.  
    title('ROC for Classification by Logistic Regression')

 

使用ROC曲線比較分類方法

 

加載樣本數據

load ionosphere

X 是351x34預測變量的矩陣。 Y 是類別標簽的字符數組:  'b' 不良雷達回波和  'g' 良好雷達回波。

重新格式化因變量以適合邏輯回歸。

擬合一個邏輯回歸模型來估計雷達返回的后驗概率是一個不好的概率。

  1.  
    mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');
  2.  
    score_log = mdl.Fitted.Probability; % Probability estimates

使用得分的概率計算標准ROC曲線。

在相同的樣本數據上訓練SVM分類器標准化數據。

mdlSVM = fitcsvm(pred,resp,'Standardize',true);

計算后驗概率。

第二列  score_svm 包含不良雷達收益的后驗概率。

使用SVM模型的分數計算標准ROC曲線。

在同一樣本數據上擬合朴素貝葉斯分類器。

計算后驗概率(分數)

[~,score_nb] = resubPredict(mdlNB);

使用朴素貝葉斯分類的分數計算標准ROC曲線。

將ROC曲線繪制在同一張圖上。

 

盡管對於較高的閾值,SVM可以產生更好的ROC值,但邏輯回歸通常更擅長區分不良雷達收益與良好雷達。朴素貝葉斯的ROC曲線通常低於其他兩個ROC曲線,這表明樣本內性能比其他兩個分類器方法差。

比較所有三個分類器的曲線下面積。

  1.  
    AUClog
  2.  
    AUClog = 0.9659
  3.  
    AUCsvm
  4.  
    AUCsvm = 0.9489
  5.  
    AUCnb
  6.  
    AUCnb = 0.9393

Logistic回歸的AUC度量最高,而朴素的貝葉斯則最低。該結果表明,邏輯回歸對此樣本數據具有更好的樣本內平均性能。

 

確定自定義內核功能的參數值

 

本示例說明如何使用ROC曲線為分類器中的自定義內核函數確定更好的參數值。

在單位圓內生成隨機的一組點。

定義預測變量。將第一象限和第三象限中的點標記為屬於正類別,而將第二象限和第二象限中的點標記為負類。

  1.  
    pred = [X1; X2];
  2.  
    resp = ones(4*n,1);
  3.  
    resp(2*n + 1:end) = -1; % Labels

創建函數mysigmoid.m ,該函數 接受要素空間中的兩個矩陣作為輸入,並使用S形內核將其轉換為Gram矩陣。

使用Sigmoid內核函數訓練SVM分類器。使用標准化數據。

設置  gamma = 0.5 ,使用調整后的S形核訓練SVM分類器。

  1.  
     
  2.  
     
  3.  
    SVMModel2 = fitPosterior(SVMModel2);
  4.  
    [~,scores2] = resubPredict(SVMModel2);

計算兩個模型的ROC曲線和曲線下面積(AUC)。

繪制ROC曲線。

  1.  
    plot(x1,y1)
  2.  
    hold on
  3.  
    plot(x2,y2)
  4.  
    hold off
  5.  
     
  6.  
    title('ROC for classification by SVM');

 

將gamma參數設置為0.5的內核函數可提供更好的樣本內結果。

比較AUC度量。

  1.  
    auc1
  2.  
    auc2
  3.  
    auc1 =
  4.  
     
  5.  
    0.9518
  6.  
     
  7.  
     
  8.  
    auc2 =
  9.  
     
  10.  
    0.9985

伽瑪設置為0.5時曲線下的面積大於伽瑪設置為1時曲線下的面積。這也證實了伽瑪參數值為0.5會產生更好的結果。為了直觀比較這兩個伽瑪參數值的分類性能。

 

繪制分類樹的ROC曲線

 

加載樣本數據。

load fisheriris

列向量  species由三種不同物種的鳶尾花組成。雙矩陣  meas 包含對花朵的四種測量類型:萼片長度,萼片寬度,花瓣長度和花瓣寬度。所有度量單位均為厘米。

使用萼片的長度和寬度作為預測變量訓練分類樹。

根據樹預測物種的分類標簽和分數 。

[~,score] = resubPredict(Model);

分數是觀察值(數據矩陣中的一行)所屬類別的后驗概率。列  score 對應於所指定的類  'ClassNames'

由於這是一個多類問題,因此不能僅將其  score(:,2) 作為輸入。這樣做將無法提供  perfcurve 有關兩個陰性類別(setosa和virginica)分數的足夠信息。此問題與二元分類問題不同,在二元分類問題中,知道一個類別的分數就足以確定另一個類別的分數。因此,必須提供  perfcurve 將兩個否定類的得分納入考慮范圍的函數。一種函數是score(:,2)-max(score(:,1),score(:,3))。

X,默認為假陽性率,  Y,默認為真陽性率(召回率或敏感性)。正類標簽為  versicolor。由於未定義否定類別,因此  perfcurve 假設不屬於肯定類別的觀測值屬於一個類別。該函數將其接受為否定類。

  1.  
     
  2.  
    suby = 12×2
  3.  
     
  4.  
    0 0
  5.  
    0.1800 0.1800
  6.  
    0.4800 0.4800
  7.  
    0.5800 0.5800
  8.  
    0.6200 0.6200
  9.  
    0.8000 0.8000
  10.  
    0.8800 0.8800
  11.  
    0.9200 0.9200
  12.  
    0.9600 0.9600
  13.  
    0.9800 0.9800
  14.  
  15.  
     
  16.  
     
  17.  
    subnames = 1x2 cell
  18.  
    {'setosa'} {'virginica'}

在ROC曲線上繪制ROC曲線和最佳工作點。

 

找到與最佳工作點相對應的閾值。

  1.  
    T((X==OPTROCPT(1))&(Y==OPTROCPT(2)))
  2.  
    ans = 0.2857

指定  virginica 為否定類,並計算和繪制ROC曲線  versicolor

同樣,必須提供  perfcurve 將否定類分數納入考量的函數。要使用的函數的一個示例是score(:,2)-score(:,3)。

 

計算ROC曲線的逐點置信區間

加載樣本數據。

load fisheriris

僅將前兩個變量用作預測變量,來定義二元問題。

pred = meas(51:end,1:2);

定義二進制因變量。

resp = (1:100)'>50;  % Versicolor = 0, virginica = 1

擬合邏輯回歸模型。

通過垂直平均(VA)和使用bootstrap進行采樣,計算真實正率(TPR)上的逐點置信區間。

'NBoot',1000 將引導樣本的數量設置為1000。  'XVals','All' 提示  perfcurve 返回  X,  Y和  T 所有分數的Y 值,並X 使用垂直平均將所有值的值(真陽性率)  平均  (假陽性率)。 默認情況下將使用閾值平均來計算置信范圍。

繪制逐點置信區間。

errorbar(X,Y(:,1),Y(:,1)-Y(:,2),Y(:,3)-Y(:,1));

 

不一定總是可以控制誤報率(FPR,X 此示例中的  值)。因此,可能希望通過閾值平均來計算真實正利率(TPR)的逐點置信區間。

繪制置信區間。

  1.  
    figure()
  2.  
    errorbar(X1(:,1),Y1(:,1),Y1(:,1)-Y1(:,2),Y1(:,3)-Y1(:,1));

 

指定閾值計算ROC曲線。然后繪制曲線。

  1.  
     
  2.  
    figure()
  3.  
    errorbar(X1(:,1),Y1(:,1),Y1(:,1)-Y1(:,2),Y1(:,3)-Y1(:,1));

 

 

參考文獻

最受歡迎的見解

1.R語言多元Logistic邏輯回歸 應用案例

2.面板平滑轉移回歸(PSTR)分析案例實現

3.matlab中的偏最小二乘回歸(PLSR)和主成分回歸(PCR)

4.R語言泊松Poisson回歸模型分析案例

5.R語言回歸中的Hosmer-Lemeshow擬合優度檢驗

6.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現

7.在R語言中實現Logistic邏輯回歸

8.python用線性回歸預測股票價格

9.R語言如何在生存分析與Cox回歸中計算IDI,NRI指標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM