主要内容

评估神经网络分类器性能

创建具有全连接层的前馈神经网络分类器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私人1.6019e+05 9 5已婚配偶缺席其他服务不在家庭黑人女性0 0 16牙买加<=50K 52自我空-不-inc 2.0964e+05 HS-grad 9已婚公民配偶执行管理丈夫白人男性0 0 45美国>50K

每行包含一个成年人的人口统计信息。最后一列,工资,显示一个人的年薪是低于或等于5万美元还是高于5万美元。

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

成人数据= rmmissing(成人数据);Adulttest = rmmissing(Adulttest);

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

edOrder = unique(adultdata.education_num,“稳定”);edCats = unique(adultdata.education,“稳定”);[~,edIdx] = sort(edOrder);Adultdata.education = categorical(categorical)...edCats (edIdx),“顺序”,真正的);Adultdata.education_num = [];adult .education = categorical(分类的)...edCats (edIdx),“顺序”,真正的);Adulttest.education_num = [];

划分训练数据

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

rng (“默认”用于分区的再现性C = cvpartition(adultdata.salary)“坚持”, 0.30);trainingIndices = training(c);validationIndices = test(c);tblTrain =成人数据(trainingIndices,:);tblValidation = adultdata(validationIndices,:);

训练神经网络

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

Mdl = fitcnet(tblTrain,“工资”“重量”“fnlwgt”...“标准化”,真的,“ValidationData”tblValidation,...“详细”1);
|==========================================================================================| | 迭代| |火车损失梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| |检查损失  | |==========================================================================================| | 1 | 0.326435 | 0.105391 | 1.174862 | 0.034638 | 0.325292 | 0 | | 2 | 0.275413 | 0.024249 | 0.259219 | 0.047694 | 0.275310 | 0 | | 3 | 0.258430 | 0.027390 | 0.173985 | 0.025407 | 0.258820 | 0 | | 4 | 0.218429 |0.024172 | 0.617121 | 0.033551 | 0.220265 | 0 | | 5 | 0.194545 | 0.022570 | 0.717853 | 0.030379 | 0.197881 | 0 | | 6 | 0.187702 | 0.030800 | 0.706053 | 0.026994 | 0.192706 | 0 | | 7 | 0.182328 | 0.016970 | 0.175624 | 0.026889 | 0.187243 | 0 | | 8 | 0.180458 | 0.007389 | 0.241016 | 0.021223 | 0.184689 | 0 | | 9 | 0.179364 | 0.007194 | 0.112335 | 0.018257 | 0.183928 | 0 | | 10 | 0.175531 | 0.008233 | 0.271539 | 0.038643 | 0.180789 | 0 | |==========================================================================================| | 迭代|火车损失|梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| |检查损失  | |==========================================================================================| | 11 | 0.167236 | 0.014633 | 0.941927 | 0.031520 | 0.172918 | 0 | | 12 | 0.164107 | 0.007069 | 0.186935 | 0.027410 | 0.169584 | 0 | | 13 | 0.162421 | 0.005973 | 0.226712 | 0.021679 | 0.167040 | 0 | | 14 | 0.161055 | 0.004590 | 0.142162 | 0.021750 | 0.165982 | 0 | | 15 | 0.159318 | 0.007807 | 0.438498 | 0.040362 | 0.164524 | 0 | |16 | 0.158856 | 0.003321 | 0.054253 | 0.027838 | 0.164177 | 0 | | 17 | 0.158481 | 0.004336 | 0.125983 | 0.018986 | 0.163746 | 0 | | 18 | 0.158042 | 0.004697 | 0.160583 | 0.024302 | 0.163042 | 0 | | 19 | 0.157412 | 0.007637 | 0.304204 | 0.032368 | 0.162194 | 0 | | 20 | 0.156931 | 0.003145 | 0.182916 | 0.044955 | 0.161804 | 0 | |==========================================================================================| | 迭代| |火车损失梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| |损失检查  | |==========================================================================================| | 21日| 0.156666 | 0.003791 | 0.089101 | 0.032138 | 0.161714 | 0 | | 22 | 0.156457 | 0.003157 | 0.039609 | 0.027238 | 0.161592 | 0 | | 23 | 0.156210 | 0.002608 | 0.081463 | 0.027368 | 0.161511 | 0 | | 24 | 0.155981 | 0.003497 | 0.088109 | 0.026131 | 0.161557 | 1 | | 25 | 0.155520 | 0.004131 | 0.181666 | 0.014582 | 0.161433 | 0 | | 26 | 0.154899 | 0.002309 | 0.327281 | 0.034867 | 0.161065 | 0 | | 27日| 0.154703 | 0.001210 | 0.055537 |0.013607 | 0.160733 | 0 | | 28 | 0.154503 | 0.002407 | 0.089433 | 0.013025 | 0.160449 | 0 | | 29日| 0.154304 | 0.003212 | 0.118986 | 0.012505 | 0.160163 | 0 | | 30 | 0.154026 | 0.002823 | 0.183600 | 0.012754 | 0.159885 | 0 | |==========================================================================================| | 迭代| |火车损失梯度| | | |一步迭代验证验证  | | | | | | 时间(秒)| | |检查损失|==========================================================================================| | 31日| 0.153738 | 0.004477 | 0.405824 | 0.014900 | 0.159378 | 0 | | 32 | 0.153538 | 0.003659 | 0.065795 | 0.027807 | 0.159333 | 0 | | 33 | 0.153491 | 0.001184 | 0.017043 | 0.015133 | 0.159377 | 1 | | 34 | 0.153460 | 0.000988 | 0.017456 | 0.013030 | 0.159446 | 2 | | 35 | 0.153420 | 0.002433 | 0.032119 | 0.012067 | 0.159463 | 3 | | 36 | 0.153329 | 0.003517 | 0.058506 | 0.012528 | 0.159478 | 4 | | 37 | 0.153181 | 0.002436 | 0.116169 | 0.016132 |38 0.159453 | 5 | | | 0.153025 | 0.001577 | 0.177446 | 0.025804 | 0.159377 | 6 | |==========================================================================================|

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

迭代= Mdl.TrainingHistory.Iteration;valLosses = mll . traininghistory . validationloss;[~,minIdx] = min(valLosses);迭代(minIdx)
Ans = 32

评估测试集性能

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

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

[labels,Scores] = predict(Mdl,adulttest);

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

confusionchart (adulttest.salary、标签)

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

计算测试集分类精度。

error = loss(Mdl,adulttest,“工资”);精度=(1-误差)*100
准确度= 85.0172

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

计算训练神经网络的测试集分类边缘。显示边缘的直方图。

分类边际是真实类别的分类分数和虚假类别的分类分数之间的差值。因为神经网络分类器返回的分数是后验概率,分类边际接近1表示有信心分类,而负边际值表示错误分类。

m = margin(Mdl,adulttest,“工资”);直方图(m)

图中包含一个轴对象。坐标轴对象包含一个直方图类型的对象。

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

meanMargin = edge(Mdl,adulttest,“工资”
meanMargin = 0.5943

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

weightedMeanMargin = edge(Mdl,adulttest,“工资”...“重量”“fnlwgt”
weightedMeanMargin = 0.6045

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

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

maxScores = max(Scores,[],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(颜色);

图中包含一个轴对象。axis对象带有xlabel Number of Work Hours Per Week, ylabel Education包含一个类型为scatter的对象。

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

另请参阅

|||||||

Baidu
map