机器学习——朴素贝叶斯分类器

贝叶斯分类是一类分类算法的总称,这类算法均已贝叶斯定理为基础,因此统称为贝叶斯分类。在贝叶斯分类器中,常用朴素贝叶斯,就类似于看见黑人,大多会认为来自非洲。

事件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)

 

posted @ 2018-08-29 17:16  Someday&Li  阅读(1688)  评论(0编辑  收藏  举报