貝葉斯分類是一類分類算法的總稱,這類算法均已貝葉斯定理為基礎,因此統稱為貝葉斯分類。在貝葉斯分類器中,常用朴素貝葉斯,就類似於看見黑人,大多會認為來自非洲。
事件A在事件B(發生)的條件下的概率,與事件B在事件A(發生)的條件下的概率是不一樣的,但他們有確定的關系,貝葉斯定理就是對在這種關系的陳述。
優點:
簡單、高效、健壯。能應用到大型數據庫中,方法簡單且分類准確率高,速度快。
缺點:
相關屬性不獨立,會影響貝葉斯分類准確率。
改進方法:
降低獨立性假設的算法, 例如,TAN(Tree Augmented Bayes Network)算法、貝葉斯網絡分類器(Bayes Network Classifier,BNC)。
朴素貝葉斯分類步驟:
(1)設為一個待分類項,a為x的一個特征屬性。
(2)有類別集合。
(3)計算;
(4)如果,則
。
總體來說,大致分為三個階段:
實例介紹:
運用朴素貝葉斯算法根據客戶的16個屬性,為一家銀行建一個分類器,判斷客戶是否願意購買理財產品:
MATLAB實現代碼:
%% ————————————2.朴素貝葉斯分類器——————————————%%
load 'bank.mat';
names = bank.Properties.VariableNames;%使用數據文件,記錄自變量和因變量的屬性名
category = varfun(@iscellstr,bank,'Output','uniform'); %輸出格式為數值格式。為字符串的返回結果為1,為數字的返回結果為0
for i = find(category)
bank.(names{i}) = categorical(bank.(names{i}));
%將bank中的屬性創建分類數組。
end
catPred = category(1:end-1); %記錄除y值的是否為字符串的邏輯矩陣
dist = repmat({'normal'},1,width(bank)-1); %repmat(A,M,N)指將A中的內容賦值給M*N的矩陣,A可為字符串或者矩陣等。
dist(catPred) = {'mvmn'}; %將不為數值型的屬性賦值為mvmn。
%預測變量
X = table2array(varfun(@double,bank(:,1:end-1)));%先將自變量轉化為double類型,再將table轉化為數組類型。
Y = bank.y; %將因變量賦值給Y
disp('數據中YES&No的統計結果');
tabulate(Y) %求重復數字的個數使用tabulate,占比率
%%%設置交叉驗證方式
cv = cvpartition(height(bank),'holdout',0.40);
%height(bank)取bank的行數,采用holdout validation(保持驗證),其中0.4*height(bank)的樣本會作為測試集
Xtrain = X(training(cv),:);
%training是交叉驗證的訓練函數
%training(cv)返回'holdout' or 'resubstitution'的邏輯變量
%training(c,i)返回'kfold' or 'leaveout'.的邏輯變量
%test是交叉驗證的測試集函數
%test(cv)與training函數用法類似
Ytrain = Y(training(cv),:);
Xtest = X(test(cv),:);
Ytest = Y(test(cv),:);
Xnum = [X(:,~catPred) dummyvar(X(:,catPred))];
%~catPred是指catPed~=0的列,即初始不為數值型的屬性
%dummyvar是用於生成虛擬變量的函數,主要將某種類別轉化為0和1組合的矩陣。即使用數值變量代表研究的樣本子組。
Ynum = double(Y)-1;
XtestNum = Xnum(test(cv),:);
YtestNum = Ynum(test(cv),:);
%訓練分類器
Nb = NaiveBayes.fit(Xtrain,Ytrain,'Distribution',dist);
%進行預測
Y_Nb = Nb.predict(Xtest);
Yscore_Nb = Nb.posterior(Xtest);
Yscore_Nb = Yscore_Nb(:,2);
%計算混淆矩陣
disp('貝葉斯分類結果');
C_nb = confusionmat(Ytest,Y_Nb)