【數據挖掘】分類器性能度量實驗 使用 matlab 編程實現ROC曲線繪製的函數roc_plot

實驗內容

實驗1

1、編程實現ROC曲線繪製的函數roc_plot。其中,分類概率使用matlab自帶的樸素貝葉斯函數得到。

測試數據

測試代碼如下:

load('testingData.mat')
load('trainingData.mat')
nb = NaiveBayes.fit(trAttr, trLabels);
p=posterior (nb,tstAttr);
y1=p(:,2);
[auc1 ,FPR1 ,TPR1 ]  = roc_plot(y1,tstLabels);

訓練數據見trainingData.mat,測試數據見testingData.mat

鏈接:https://pan.baidu.com/s/1Or3DpNVoCdzXoI2z3iu_mw
提取碼:wa6z

實驗代碼

function [AUC,FPR,TPR] = roc_plot(y1,tstLabels)
[val,ind] = sort(y1);  %%對y1進行排序
roc_y = tstLabels(ind); %%根據下標對測試標籤進行排序
num = length(roc_y);   %%求測試數據的長度
FPR = zeros(num,1) %%設置橫座標
TPR = zeros(num,1) %%設置縱座標
P = sum(roc_y(:)==1);  %%P表示原本全爲正的個數
N = sum(roc_y(:)==0);  %%N表示原本全爲負的個數
for i=1:num
    TP = sum(roc_y(i:end)==1);
    FP = sum(roc_y(i:end)==0);   
    TPR(i) = TP/P;
    FPR(i) = FP/N;
end
TPR = [TPR;0];
FPR = [FPR;0];
AUC = 0;
for i=2:num+1
    AUC = AUC + TPR(i)*(FPR(i-1)-FPR(i));
end
figure,plot(FPR,TPR);
xlabel('False Positive Rate');  %%橫座標FPR
ylabel('True Positive Rate');   %%縱座標TPR
title(['ROC curve (AUC = ' num2str(AUC) ' )']);
end

測試結果

實驗2

(難度2)編程實現ROC曲線繪製的函數roc_plot。其中,分類概率使用自己編寫的樸素貝葉斯函數bys_post1得到

測試數據

測試代碼如下:

load('testingData.mat')
load('trainingData.mat')
[post4all]=bys_post1(trAttr, trLabels,tstAttr);
y2=post4all(:,2);
[auc2 ,FPR2 ,TPR2 ]  = roc_plot(y2,tstLabels);

訓練數據見trainingData.mat,測試數據見testingData.mat

鏈接:https://pan.baidu.com/s/1Or3DpNVoCdzXoI2z3iu_mw
提取碼:wa6z

實驗代碼

function [post4all] = bys_Classify(trAttr,trLabels,tstAttr)
%NaiveBayesTrain 只處理連續屬性,不處理分類屬性
[Params,prior,AllLabels] = NaiveBayesTrain(trAttr, trLabels);
N = size(tstAttr,1);
Labels = zeros(N,1);
for i=1 : N
    tstAttrSample = tstAttr(i,:);
    post = NaiveBayesPrdeict(Params,prior,tstAttrSample);
    post4all(i,:) = post./sum(post);
end
end
%NaiveBayesTrain 只處理連續屬性,不處理分類屬性
function [Params,prior,AllLabels] = NaiveBayesTrain(trAttr,trLabels)
AllLabels = unique(trLabels);
numClass = length(AllLabels);%取得所有類標號的種類個數
Ind4Class{numClass,1} = [];
for i =1 : numClass
   ind = find(trLabels == AllLabels(i));
   Ind4Class{i,1} = ind;
   prior(i) = length(ind)/length(trLabels);
end

numAttr = size(trAttr,2);
Params{numClass,numAttr} = [];

for AttrInd = 1 : numAttr
    AttrVals = trAttr(:,AttrInd);
    for i = 1 : numClass
        Params{i,AttrInd} = GetParams4ContiAttr(AttrVals,Ind4Class{i,1});
    end
end

end



function Paramsl = GetParams4ContiAttr(AttrVals,ind)
Attrvals4ThisClass = AttrVals(ind);
Paramsl(1) = mean(Attrvals4ThisClass);  %%求出均值
Paramsl(2) = var(Attrvals4ThisClass);   %%求出方差
end

function post = NaiveBayesPrdeict(Params,prior,tstAttr)
numClass = length(prior);
numAttr = length(tstAttr);
post = [];
for i = 1: numClass
    p_AttrCond = 1;
    for AttrInd = 1 : numAttr
        AttrVals = tstAttr(AttrInd);
            mean = Params{i,AttrInd}(1);
            sig = sqrt(Params{i,AttrInd}(2));
            p = (1/(sqrt(2*pi)*sig))*exp(-(AttrVals-mean)^2/(2*sig^2));
            p_AttrCond = p_AttrCond*p;
    end
    post(i) = p_AttrCond*prior(i);
end
end

測試結果

學如逆水行舟,不進則退
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章