主要内容

评估神经网络分类器的性能

创建具有完全连接层的前馈神经网络分类器fitcnet.使用验证数据早期停止训练过程,以防止模型过拟合。然后,利用分类器的目标函数对测试数据进行模型性能评估。

加载和预处理样例数据

本例使用了存储在census1994.mat.该数据集包含来自美国人口普查局的人口信息,可以用来预测一个人的年收入是否超过5万美元。

加载样例数据census1994,其中包含培训数据adultdata测试数据成人.预览训练数据集的前几行。

负载census1994头(adultdata)
年龄workClass fnlwgt教育education_num marital_status种族职业关系性capital_gain capital_loss hours_per_week native_country薪水  ___ ________________ __________ _________ _____________ _____________________ _________________ _____________ _____ ______ ____________ ____________ ______________ ______________ ______ 39 State-gov 77516单身汉13未婚Adm-clerical家族的白人男性2174 0 40美国< = 50 k 50 Self-emp-not-inc 83311单身汉13Married-civ-spouse Exec-managerial丈夫13美国白人男性0 0 < = 50 k 38私人2.1565 e + 05 HS-grad 9离婚Handlers-cleaners家族的白人男性40 0 0美国< = 50 k 53私人2.3472 e + 05年11日7 Married-civ-spouse Handlers-cleaners丈夫黑人男性40 0 0美国< = 50 k 28私人3.3841 e + 05单身汉13 Married-civ-spouse Prof-specialty妻子古巴黑人女性40 0 0 < = 50 k 37私人2.8458 e + 05年硕士14 Married-civ-spouse Exec-managerial妻子白人女性0 040美国<=50K 49 Private 1.6019e+05 9th 5已婚配偶缺席其他服务非家庭黑人女性0 0 16牙买加<=50K 52 self - empo -not-inc 2.0964e+05 HS-grad 9已婚公民配偶行政管理丈夫白人男性0 0 45美国>50K

每一行包含一个成年人的人口统计信息。最后一列,工资,显示一个人的年薪是低于或等于$50,000还是大于$50,000。

删除的行adultdata而且成人其中表缺少值。

adultdata = rmmissing (adultdata);成人= rmmissing(成人);

结合education_num而且教育训练和测试数据中的变量创建一个单一的有序分类变量,显示一个人所获得的最高教育水平。

edOrder =独特(adultdata.education_num,“稳定”);edCats =独特(adultdata.education,“稳定”);[~, edIdx] = (edOrder)进行排序;adultdata.education =分类(adultdata.education,...edCats (edIdx),“顺序”,真正的);adultdata.education_num = [];adulttest.education =分类(adulttest.education,...edCats (edIdx),“顺序”,真正的);adulttest.education_num = [];

分区训练数据

使用分层坚持率分区进一步分割训练数据。创建一个单独的验证数据集,以便尽早停止模型训练过程。为验证数据集保留大约30%的观测值,并使用其余的观测值来训练神经网络分类器。

rng (“默认”分区的可重复性c = cvpartition (adultdata.salary“坚持”, 0.30);trainingIndices =培训(c);validationIndices =测试(c);tblTrain = adultdata (trainingIndices:);tblValidation = adultdata (validationIndices:);

训练神经网络

利用训练集训练神经网络分类器。指定工资列的tblTrain作为响应和fnlwgt列作为观测权值,并对数值预测因子进行标准化。通过使用验证集在每次迭代中评估模型。指定在每个迭代中显示训练信息详细的名称-值参数。默认情况下,如果验证交叉熵损失大于或等于迄今为止计算的最小验证交叉熵损失(连续6次),则训练过程将提前结束。若要更改允许验证损失大于或等于最小值的次数,请指定ValidationPatience名称-值参数。

Mdl = fitcnet (tblTrain,“工资”“重量”“fnlwgt”...“标准化”,真的,“ValidationData”tblValidation,...“详细”1);
|==========================================================================================| | 迭代| |火车损失梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| |检查损失  | |==========================================================================================| | 1 | 0.326435 | 0.105391 | 1.174862 | 0.033707 | 0.325292 | 0 | | 2 | 0.275413 | 0.024249 | 0.259219 | 0.046675 | 0.275310 | 0 | | 3 | 0.258430 | 0.027390 | 0.173985 | 0.037106 | 0.258820 | 0 | | 4 | 0.218429 |0.024172 | 0.617121 | 0.054042 | 0.220265 | 0 | | 5 | 0.194545 | 0.022570 | 0.717853 | 0.049697 | 0.197881 | 0 | | 6 | 0.187702 | 0.030800 | 0.706053 | 0.034268 | 0.192706 | 0 | | 7 | 0.182328 | 0.016970 | 0.175624 | 0.035020 | 0.187243 | 0 | | 8 | 0.180458 | 0.007389 | 0.241016 | 0.039957 | 0.184689 | 0 | | 9 | 0.179364 | 0.007194 | 0.112335 | 0.042422 | 0.183928 | 0 | | 10 | 0.175531 | 0.008233 | 0.271539 | 0.038625 | 0.180789 | 0 | |==========================================================================================| | 迭代|火车损失|梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| |检查损失  | |==========================================================================================| | 11 | 0.167236 | 0.014633 | 0.941927 | 0.039679 | 0.172918 | 0 | | 12 | 0.164107 | 0.007069 | 0.186935 | 0.043016 | 0.169584 | 0 | | 13 | 0.162421 | 0.005973 | 0.226712 | 0.036239 | 0.167040 | 0 | | 14 | 0.161055 | 0.004590 | 0.142162 | 0.042217 | 0.165982 | 0 | | 15 | 0.159318 | 0.007807 | 0.438498 | 0.032128 | 0.164524 | 0 | |16 | 0.158856 | 0.003321 | 0.054253 | 0.028355 | 0.164177 | 0 | | 17 | 0.158481 | 0.004336 | 0.125983 | 0.030792 | 0.163746 | 0 | | 18 | 0.158042 | 0.004697 | 0.160583 | 0.028266 | 0.163042 | 0 | | 19 | 0.157412 | 0.007637 | 0.304204 | 0.030251 | 0.162194 | 0 | | 20 | 0.156931 | 0.003145 | 0.182916 | 0.077059 | 0.161804 | 0 | |==========================================================================================| | 迭代| |火车损失梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| |损失检查  | |==========================================================================================| | 21日| 0.156666 | 0.003791 | 0.089101 | 0.031859 | 0.161714 | 0 | | 22 | 0.156457 | 0.003157 | 0.039609 | 0.034453 | 0.161592 | 0 | | 23 | 0.156210 | 0.002608 | 0.081463 | 0.037641 | 0.161511 | 0 | | 24 | 0.155981 | 0.003497 | 0.088109 | 0.043069 | 0.161557 | 1 | | 25 | 0.155520 | 0.004131 | 0.181666 | 0.039154 | 0.161433 | 0 | | 26 | 0.154899 | 0.002309 | 0.327281 | 0.034695 | 0.161065 | 0 | | 27日| 0.154703 | 0.001210 | 0.055537 |0.034852 | 0.160733 | 0 | | 28 | 0.154503 | 0.002407 | 0.089433 | 0.036038 | 0.160449 | 0 | | 29日| 0.154304 | 0.003212 | 0.118986 | 0.050329 | 0.160163 | 0 | | 30 | 0.154026 | 0.002823 | 0.183600 | 0.033973 | 0.159885 | 0 | |==========================================================================================| | 迭代| |火车损失梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| | |检查损失|==========================================================================================| | 31日| 0.153738 | 0.004477 | 0.405824 | 0.034834 | 0.159378 | 0 | | 32 | 0.153538 | 0.003659 | 0.065795 | 0.034054 | 0.159333 | 0 | | 33 | 0.153491 | 0.001184 | 0.017043 | 0.031163 | 0.159377 | 1 | | 34 | 0.153460 | 0.000988 | 0.017456 | 0.033223 | 0.159446 | 2 | | 35 | 0.153420 | 0.002433 | 0.032119 | 0.030938 | 0.159463 | 3 | | 36 | 0.153329 | 0.003517 | 0.058506 | 0.031380 | 0.159478 | 4 | | 37 | 0.153181 | 0.002436 | 0.116169 | 0.031088 |38 0.159453 | 5 | | | 0.153025 | 0.001577 | 0.177446 | 0.032347 | 0.159377 | 6 | |==========================================================================================|

的信息TrainingHistory对象的属性Mdl检验对应最小验证交叉熵损失的迭代。最终返回的模型Mdl在此迭代中训练的模型。

迭代= Mdl.TrainingHistory.Iteration;valLosses = Mdl.TrainingHistory.ValidationLoss;[~, minIdx] = min (valLosses);迭代(minIdx)
ans = 32

评估测试集性能

评估训练后的分类器的性能Mdl在测试台上成人通过使用预测损失保证金,边缘对象的功能。

为测试集中的观察结果找到预测的标签和分类分数。

(标签、分数)=预测(Mdl,成人);

根据测试集的结果创建一个混淆矩阵。对角线元素表示给定类的正确分类实例的数量。非对角线元素是错误分类观测的实例。

confusionchart (adulttest.salary、标签)

图包含一个类型为confusimatrixchart的对象。

计算测试集分类精度。

错误=损失(Mdl,成人,“工资”);精度=(1个错误)* 100
精度= 85.0172

神经网络分类器正确地分类了大约85%的测试集观察结果。

计算经过训练的神经网络的测试集分类裕度。显示空白的直方图。

分类裕度是真实类的分类分数与虚假类的分类分数之间的差值。因为神经网络分类器返回的分数是后验概率,接近1的分类边值表示可靠分类,负边值表示错误分类。

m =利润率(Mdl成人,“工资”);直方图(m)

图中包含一个axes对象。axis对象包含一个直方图类型的对象。

使用分类边,或分类边的平均值,来评估分类器的整体性能。

meanMargin =边缘(Mdl,成人,“工资”
meanMargin = 0.5943

或者,使用观察权重计算加权分类边。

weightedMeanMargin =边缘(Mdl,成人,“工资”...“重量”“fnlwgt”
weightedMeanMargin = 0.6045

使用散点图将预测的标签和分类分数可视化,其中每个点对应于一个观察结果。使用预测的标签来设置点的颜色,使用最大分数来设置点的透明度。透明度较低的点被标记为更有信心的点。

首先,找出每个测试集观测的最大分类分数。

maxScores = max(分数,[],2);

制作一个散点图,比较每周工作小时数和教育水平的最高分数。因为教育变量是分类的,所以沿着y维随机抖动(或隔开)点。

更改颜色图,使年薪小于或等于$50,000的最高分数显示为蓝色,年薪大于$50,000的最高分数显示为红色。

散射(adulttest.hours_per_week adulttest.education[],标签,...“填充”“MarkerFaceAlpha”“平”“AlphaData”maxScores,...“YJitter”“兰德”);包含(“每周工作时数”) ylabel (“教育”Mdl)。一会
ans =2 x1分类< = 50 k > 50 k
颜色=(2行)
颜色=2×30 0.4470 0.7410 0.8500 0.3250 0.0980
colormap(颜色);

图中包含一个axes对象。axes对象包含一个scatter类型的对象。

散点图中的颜色表示,通常情况下,神经网络预测教育水平较低(12年级或以下)的人的年薪低于或等于5万美元。图右下方一些点的透明度表明,对于每周工作很多小时(60小时或更多)的人,模型对这一预测不太有信心。

另请参阅

|||||||

Baidu
map