机器学习——朴素贝叶斯分类器
贝叶斯分类是一类分类算法的总称,这类算法均已贝叶斯定理为基础,因此统称为贝叶斯分类。在贝叶斯分类器中,常用朴素贝叶斯,就类似于看见黑人,大多会认为来自非洲。
事件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)