1.目的和意义
对客户行为模式的分析,对于每一个行业都至关重要。客户信用的评估基于对客户的认知,将客户划分为不同的类别,对应不同的需求,市场规模和重要程度。由此,可以指定差异化的服务策略,从而压缩成本,降低风险,实现利益最大化。
2.算法设计
流程图
算法理论介绍
(1)读入数据,由于数据保存在二进制文件german.data中,需要使用MATLAB的fid = fopen(‘german.data’, ‘r’);打开文件,再使用MATLAB的读入函数textscan,其中fid作为打开的文件句柄。调用方法如下:
%% 读入数据
% 打开文件
fid = fopen('german.data', 'r');
% 按格式读取每一行
% 每行包括21项,包括字符串和数字
C = textscan(fid, '%s %d %s %s %d %s %s %d %s %s %d %s %d %s %s %d %s %d %s %s %d\n');
% 关闭文件
fclose(fid);
为了便于计算,必须使用数值来表示数据中的类别属性。最简单的方式就是使用整数进行编码,如第一个属性的类别字符串为“A12”,“A1”表示该属性为第一个属性,“2”表示属性值为第二个类别。因此,采用数字“2”编码字符串“A12”,具体实现如下:
% 将字符串转换为整数
N = 20;
% 存放整数编码后的数值矩阵
C1=zeros(N+1,1000);
for i=1:N+1
% 类别属性
if iscell(C{
i})
for j=1:1000
% eg: 'A12' -> 2
if i<10
d = textscan(C{
i}{
j}, '%c%c%d');
% eg: 'A103' -> 3
else
d = textscan(C{
i}{
j}, '%c%c%c%d');
end
C1(i,j) = d{
end};
end
% 数值属性
else
C1(i,:) = C{
i};
end
end
(2)划分训练样本和测试样本
%% 划分训练样本与测试样本
% 输入向量
x = C1(1:N, :);
% 目标输出
y = C1(N+1, :);
% 正例
posx = x(:,y==1);
% 负例
negx = x(:,y==2);
% 训练样本
trainx = [ posx(:,1:350), negx(:,1:150)];
trainy = [ones(1,350), ones(1,150)*2];
% 测试样本
testx = [ posx(:,351:700), negx(:,151:300)];
testy = trainy;
(3)样本归一化,使用maominmax函数对输入样本进行归一化
% 训练样本归一化
[trainx, s1] = mapminmax(trainx);
% 测试样本归一化
testx = mapminmax('apply', testx, s1);
(4)创建BP网络,训练
% 创建BP网络
net = newff(trainx, trainy);
% 设置最大训练次数
net.trainParam.epochs = 1500;
% 目标误差
net.trainParam.goal = 1e-13;
% 显示级别
net.trainParam.show = 1;
% 训练
net = train(net,trainx, trainy);
(5)测试
y0 = net(testx);
% y0为浮点数输出。将y0量化为1或2。
y00 = y0;
% 以1.5为临界点,小于1.5为1,大于1.5为2
y00(y00<1.5)=1;
y00(y00>1.5)=2;
% 显示正确率
fprintf('正确率: \n');
disp(sum(y00==testy)/length(y00));
web -broswer http://www.ilovematlab.cn/forum-222-1.html
3.实验验证
由图可知,结果的正确率为:0.7520,此时较为理想
同时打开一个网站
4.实验总结
随着金融行业的迅猛发展,银行等部门逐渐积累了大量的客户数据,如何根据积累的数据跟踪个人客户的信用记录。如何根据累积的数据跟踪个人客户的信用记录并利用已有客户的数据,分析、判断新客户的信用状况,成为迫切需要解决的问题。个人信用评估对促进消费有极大的帮助。
通过此次学习,我学到了很多知识,我明白了我要熟练掌握专业知识,做到学以致用,实现学习的价值。同时我也知道了学习的时候要多加练习,才能更牢固的掌握。
5.实验源码
% credit_class.m
% 信贷信用的评估
% 数据取自德国信用数据库
%% 清理工作空间
clear,clc
% 关闭图形窗口
close all
%% 读入数据
% 打开文件
fid = fopen('german.data', 'r');
% 按格式读取每一行
% 每行包括21项,包括字符串和数字
C = textscan(fid, '%s %d %s %s %d %s %s %d %s %s %d %s %d %s %s %d %s %d %s %s %d\n');
% 关闭文件
fclose(fid);
% 将字符串转换为整数
N = 20;
% 存放整数编码后的数值矩阵
C1=zeros(N+1,1000);
for i=1:N+1
% 类别属性
if iscell(C{
i})
for j=1:1000
% eg: 'A12' -> 2
if i<10
d = textscan(C{
i}{
j}, '%c%c%d');
% eg: 'A103' -> 3
else
d = textscan(C{
i}{
j}, '%c%c%c%d');
end
C1(i,j) = d{
end};
end
% 数值属性
else
C1(i,:) = C{
i};
end
end
%% 划分训练样本与测试样本
% 输入向量
x = C1(1:N, :);
% 目标输出
y = C1(N+1, :);
% 正例
posx = x(:,y==1);
% 负例
negx = x(:,y==2);
% 训练样本
trainx = [ posx(:,1:350), negx(:,1:150)];
trainy = [ones(1,350), ones(1,150)*2];
% 测试样本
testx = [ posx(:,351:700), negx(:,151:300)];
testy = trainy;
%% 样本归一化
% 训练样本归一化
[trainx, s1] = mapminmax(trainx);
% 测试样本归一化
testx = mapminmax('apply', testx, s1);
%% 创建网络,训练
% 创建BP网络
net = newff(trainx, trainy);
% 设置最大训练次数
net.trainParam.epochs = 1500;
% 目标误差
net.trainParam.goal = 1e-13;
% 显示级别
net.trainParam.show = 1;
% 训练
net = train(net,trainx, trainy);
%% 测试
y0 = net(testx);
% y0为浮点数输出。将y0量化为1或2。
y00 = y0;
% 以1.5为临界点,小于1.5为1,大于1.5为2
y00(y00<1.5)=1;
y00(y00>1.5)=2;
% 显示正确率
fprintf('正确率: \n');
disp(sum(y00==testy)/length(y00));
web -broswer http://www.ilovematlab.cn/forum-222-1.html
6.数据集
扫描二维码关注公众号,回复:
15111255 查看本文章