MATLAB朴素贝叶斯(德国信用卡案例)

我们matlab建模课的案例

数据以及代码

链接:https://pan.baidu.com/s/18qpV2qsHzwbnOgZBMBHdGQ?pwd=r8g2 
提取码:r8g2

参考书:MATLAB数学建模方法与实践(第三版)p63-p66

导入数据及分类

计算数据的x和y

clear;clc;
data = load('german.data-numeric');
[x,y] = size(data);

例:

数据大小为1000x25

x = 1000

y =  25


最后一列为是否失约

原数据1代表失约 2代表未失约

% 模型数据---前1到5行 测试数据---第221行 取第一列,第二列,25列
train_data = data(1:5,[1,2,25])
text_data = data(117,[1,2,25])

例:

模型数据

测试数据

 【注:1 12 为参数 我们需要放进我们的贝叶斯模型里面跑 0 为他会失约 我们跑贝叶斯模型的时候要注意这一列不要放进去 相当于这是一个答案 我们放进贝叶斯里跑出来的0和1 和这个正确答案做比较 才可以算出正确率】

套入自制贝叶斯算法

p0【测试数据在失约下的概率】

p1【测试数据在未失约下的概率】

【注:此时虽然传进的是整个测试数据,但是测试数据的是否失约那一列并未使用,即最后一列】

% 自制贝叶斯模型 计算测试数据 对应位置p0 p1概率
p0 = [];
p1 = [];
[p0,p1] = beiyesi_train(train_data,text_data)

贝叶斯函数实现

function [p0,p1] = beiyesi_train(train_data,text_data)
% train_data 模型数据
% text_data 测试数据
% return
% p0 测试数据在失约下的概率
% p1 测试数据在未失约下的概率

% 算测试集和模型集的大小
[x_train,y_train] = size(train_data);
[x_text,y_text] = size(text_data);

% 后验0的概率 后验1的概率 对应存进p0 p1矩阵
p0 = [];
p1 = [];
for i = 1:x_text
    for j = 1:y_text-1
        [p0(i,j),p1(i,j)] = beiyesi_function(train_data,j,text_data(i,j),y_text);
    end
end



% 以下为计算贝叶斯值 即p0 p1最后一列

default = 0; % 违约的总个数 
for i = 1:x_train
    if train_data(i,y_train) == 0
        default = default+1;
    end
end
default = default/x_train; % 违约的概率 

nodefault = 0; % 未违约的总个数
for i = 1:x_train
    if train_data(i,y_train) == 1
        nodefault = nodefault+1;
    end
end
nodefault = nodefault/x_train;% 未违约的概率

p0(:,y_text) = 1;
p1(:,y_text) = 1;
for i = 1:x_text
    for j = 1:y_text-1
        p0(i,y_text) = p0(i,y_text) * p0(i,j);
        p1(i,y_text) = p1(i,y_text) * p1(i,j);
    end
    p0(i,y_text) = p0(i,y_text) * default;
    p1(i,y_text) = p1(i,y_text) * nodefault;
end

例:

p0

p1

【注:该算法为避免出现0的情况 采用如果概率为0 则概率赋值为1/[(0或1的个数)+1]

p0 p1各个位置对应着测试数据的大小,但是测试数据的最后一列并没有使用到,所以我把贝叶斯算法最后乘起来的值放在p0 p1对应位置的最后一列 即贝叶斯算法得到的值为p0 p1最后一列的值 剩下我们只需要遍历p0 p1】

p0 的 第一个位置 0.6667 为

p(1|0)= 2/3 = 0.6667

第二个位置 0.3333 为

p (12|0)= 1/3 = 0.3333

第三个位置 0.1333 为

p(1|0)x p (12|0)x  (0占最后一列的比例)= 2/3 x 1/3  x 3/5 = 0.13333

p1 的 第一个位置 0.5000 为

p(1|1)= 1/2 = 0.5

第二个位置 0.3333 为

p (12|1)= 0

由于概率为0所以赋值为1+(1在最后一列的个数+1)= 1/3 = 0.3333

第三个位置 0.0667 为

p(1|1)x p (12|1)x  (1占最后一列的比例)= 1/2 x 1/3  x 2/5 = 0.0667


模型答案与真实数据结果比对得出正确率

% 预测结果
p = [];
p = beiyesi_p(p0,p1)

% 真实结果
p_text = text_data(:,end)

% 自制贝叶斯分类结果
p_right = beiyesi_right(p,p_text)

% 正确率
right_ratio = (p_right(1,1)+p_right(2,2))/(p_right(1,1)+p_right(1,2)+p_right(2,1)+p_right(2,2))

例:

p 我们模型所预测值

p_text 真实数据结果

p_right 矩阵

 

 right_ratio 正确率

 


 放入更大的数据测试

% 模型数据---前800行 测试数据---后200行
train_data = data(1:800,:)
text_data = data(800:1000,:)

结果如下

正确率74% 嘿嘿 

参考文章

信用评分卡建模—基于German Credit德国信用数据集 - 知乎 (zhihu.com)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>