刚刚学习神经网络的新手小白,本文是在我学习matlab案例的过程中写的,内容大多都是按照我自己的理解写的,如有不对欢迎批评指正。
Matlab案例:Compare Deep Learning Networks for Credit Default Prediction- MATLAB & Simulink
一、查看原始数据
案例中给出的原始数据如下,主要包含5列,是一个table文件
每一列数据的详细解释如下:
从上面我们可以看出ScoreGroup就是他的分类标签,主要有三类:‘low Risk’,‘Hight Risk’, ‘Medium Risk’三类
二、制作标签
在案例中提到如果想要训练神经网络,需要将标签转换为one-hot encoded vectors(为什么必须要转换为这个形式?所有神经网络训练都要将标签转换为这种形式吗?)
2024年4月10日,最近拜读了赵小川教授的《深度学习理论及实战(Matlab版)》从中得到了启发,为何要将标签转为独热编码我想原因是这样的:在有监督学习中,面对多分类问题,采用的数据格式就是数据+标签,而标签之所以采用独热编码,是因为多分类任务中,实现分类其实就是最后的输出层中某一个节点被激活,而其他节点未被激活,被激活的节点就是1,未被激活的节点就是0,所以多分类问题输出的类型其实就是独热编码,因此需要在制作标签时与输出一致便于计算损失函数。
通过这个代码获取文字标签的热向量:
riskGroup = onehotencode(tbl.ScoreGroup,2);
转换后的one-hot encoded vectors形式如下,每一列代表一个种类
%随后向tbl表中添加三个新的列,每一列对应一个标签
tbl.HighRisk = riskGroup(:,1);
tbl.MediumRisk = riskGroup(:,2);
tbl.LowRisk = riskGroup(:,3);
%随后将原本的文字标签删除:
tbl = removevars(tbl,{'ScoreGroup'});
%从tbl表中删除ScoreGroup(就是文字标签,因为上面已经用热向量表示标签了,所以这里就不需要文字标签了)
%因为要预测的是default所以要把他放到最后一列
tbl = movevars(tbl,'Default','After','LowRisk');
%将Default列放在最后
编辑完成后的tbl文件如图所示:
三、划分数据集
在示例中他是按照id来进行数据划分的,将id的60%划分为训练集、20%划分为测试集、20%划分为训练集,在划分过程中采用随机划分
在示例中采用的索引对数据集进行随机划分:
1.获取id的个数:
%采用ID对数据进行划分
idx = unique(tbl.ID);%提取tbl中的id
numObservations = length(idx);%提取ID的个数
2.确定训练、测试、验证的个数,训练60%,测试与验证20%
numObservationsTrain = floor(0.6*numObservations);%floor是取四舍五入后的小于或等于原数的整数,就是向下去整数
numObservationsValidation = floor(0.2*numObservations);
numObservationsTest = numObservations - numObservationsTrain - numObservationsValidation
3.创建与id数量对应的随机索引
rng('default')%按默认对随机取值进行初始化,保证每次取值取到的数据是一样的
% 这里是案例为例保证大家在学习的时候都取一样的值才设计的,在自己训练的过程中可以不用设定这个
idxShuffle = idx(randperm(numObservations));
%randperm(numObservations)对1到numObservations随机排列行程一个向量
%以randperm(5)为例就是对1 2 3 4 5随机排列,返回类似于 [3, 1, 5, 2, 4] 的向量
%idx(1)表示第一个元素对应的索引,举例:c=idx(3);x=[1;2;3;4];cc=x(idx(3));那么cc=3;
idxTrain = idxShuffle(1:numObservationsTrain);%选取id随机排列下前60%为训练集,测试集与验证集以此类推
idxValidation = idxShuffle(numObservationsTrain+1:numObservationsTrain+numObservationsValidation);
idxTest = idxShuffle(numObservationsTrain+numObservationsValidation+1:end);
4.通过索引建立布尔向量
idxTrainTbl = ismember(tbl.ID,idxTrain);
%ismember(A,B)就是从在查看A中的原始是否存在于B中,如果存在返回布尔值1不存在返回布尔值0
idxValidationTbl = ismember(tbl.ID,idxValidation);
idxTestTbl = ismember(tbl.ID,idxTest);
5.仅保留训练所需的数据:YOB、标签、Default将其余的变量删除
tbl = removevars(tbl,{'ID','Year'});
head(tbl)
去除多余的变量后的tbl文件如下:
6.通过布尔向量获取训练集、测试集、验证集
tblTrain = tbl(idxTrainTbl,:);
tblValidation = tbl(idxValidationTbl,:);
tblTest = tbl(idxTestTbl,:);
这应该是一种常见的划分数据集的方法,通过建立随机索引划分数据集
划分好的训练集如下:
四、构建神经网络模型
构建一个ResNet神经网络,可以通过matlab自带的深度网络设计器搭建(在matlab APP的工具中可以找到),也可以敲代码搭建网络
我这里选择根据他案例中示范,通过深度网络设计器,对网络进行搭建,深度网络设计器搭建网络只需要拖动图标就可以了非常适合新手入门。
案例中搭建ResNet网络的代码如下:
residualDLN = dlnetwork;
residualLayers = [
featureInputLayer(4,'Normalization','zscore','Name','input')
fullyConnectedLayer(16,'Name','fc1')
batchNormalizationLayer('Name','bn1')
reluLayer('Name','relu1')
fullyConnectedLayer(32,'Name','resblock1-fc1')
batchNormalizationLayer('Name','resblock1-bn1')
reluLayer('Name','resblock1-relu1')
fullyConnectedLayer(32,'Name','resblock1-fc2')
additionLayer(2,'Name','resblock1-add')
batchNormalizationLayer('Name','resblock1-bn2')
reluLayer('Name','resblock1-relu2')
fullyConnectedLayer(64,'Name','resblock2-fc1')
batchNormalizationLayer('Name','resblock2-bn1')
reluLayer('Name','resblock2-relu1')
fullyConnectedLayer(64,'Name','resblock2-fc2')
additionLayer(2,'Name','resblock2-add')
batchNormalizationLayer('Name','resblock2-bn2')
reluLayer('Name','resblock2-relu2')
fullyConnectedLayer(1,'Name','fc2')
sigmoidLayer('Name','sigmoid')];
residualDLN = addLayers(residualDLN,residualLayers);
residualDLN = addLayers(residualDLN,fullyConnectedLayer(32,'Name','resblock1-fc-shortcut'));
residualDLN = addLayers(residualDLN,fullyConnectedLayer(64,'Name','resblock2-fc-shortcut'));
residualDLN = connectLayers(residualDLN,'relu1','resblock1-fc-shortcut');
residualDLN = connectLayers(residualDLN,'resblock1-fc-shortcut','resblock1-add/in2');
residualDLN = connectLayers(residualDLN,'resblock1-relu2','resblock2-fc-shortcut');
residualDLN = connectLayers(residualDLN,'resblock2-fc-shortcut','resblock2-add/in2');
deepNetworkDesigner(residualDLN)