【實踐】數據挖掘DM課程課業打卡實驗3 分類器性能度量
叮嘟!這裏是小啊嗚的學習課程資料整理。好記性不如爛筆頭,今天也是努力進步的一天。一起加油進階吧!
一、實驗目的
(1)理解分類器性能度量的方法。
(2)編程ROC曲線繪製。
二、實驗內容
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);
(將執行正確的roc_plot函數代碼粘貼在此處,核心代碼要求有註釋)
% 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);
function [AUC,FPR,TPR] = roc_plot(deci,label_y)
[val,ind]=sort(deci);
roc_y=label_y(ind);
Num=length(roc_y);
FPR=zeros(Num,1);
TPR=zeros(Num,1);
for i=1:Num
TP=sum(roc_y(i:end)==1);
FP=sum(roc_y(i:end)==0);
P=sum(roc_y(:)==1);
N=sum(roc_y(:)==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');
ylabel('True Positive Rate');
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(:,1);
[auc2 ,FPR2 ,TPR2 ] = roc_plot(y2,tstLabels);
(將執行正確的bys_post1函數代碼粘貼在此處,核心代碼要求有註釋)
function [Params,prior,AllLabels] = NaiveBayesTrain1(trAttr, trLabels)
%NaiveBayesTrain只處理連續分類,不處理分類屬性;
AllLabels = unique(trLabels);
numClass = length(AllLabels); %取得所有類標號的種類個數;
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}=[];%初始化參數cell;
for AttrInd =1:numAttr
AttrVals=trAttr(:,AttrInd);
for i=1:numClass
Params{i,AttrInd}=GetParams4ContiAttr(AttrVals,Ind4Class{i,1});
end
end
end
function Params1=GetParams4ContiAttr(AttrVals,ind)
AttrVals4ThisClass=AttrVals(ind);
Params1(1)=mean(AttrVals4ThisClass); %求得均值;
Params1(2)=var(AttrVals4ThisClass); %求得方差;
end
function post=NaiveBayesPredict1(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);
varriance=Params{i,AttrInd}(2);
sig=sqrt(varriance);
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
Ending!
更多課程知識學習記錄隨後再來吧!
就醬,嘎啦!
注:
人生在勤,不索何獲。