预测
利用神经网络分类器对观测数据进行分类
描述
例子
利用神经网络对测试集观测值进行分类
使用神经网络分类器预测测试集观察值的标签。
加载病人
数据集。从数据集创建一个表。每一行对应一个病人,每列对应一个诊断变量。使用吸烟者
变量作为响应变量,其余变量作为预测变量。
负载病人台=表(舒张压、收缩压、性别、身高、体重、年龄、吸烟);
将数据分离到一个训练集中tblTrain
还有一个测试集tblTest
通过使用分层压痕分区。该软件为测试数据集保留了大约30%的观察数据,并将其余的观察数据用于训练数据集。
rng (“默认”)分区的可重复性c = cvpartition(资源描述。抽烟,“坚持”, 0.30);trainingIndices =培训(c);testIndices =测试(c);tblTrain =(资源(trainingIndices:);tblTest =(资源(testIndices:);
使用训练集训练神经网络分类器。指定吸烟者
列的tblTrain
作为响应变量。指定以标准化数值预测器。
Mdl = fitcnet (tblTrain,“抽烟”,...“标准化”,真正的);
对测试集观测值进行分类。使用混淆矩阵可视化结果。
标签=预测(Mdl tblTest);confusionchart (tblTest.Smoker、标签)
神经网络模型正确地分类了除了两个测试集观测数据之外的所有数据。
选择要包含在神经网络分类器中的特征
通过比较测试集分类裕度、边、误差和预测来执行特征选择。比较使用所有预测器训练的模型的测试集指标与仅使用预测器的子集训练的模型的测试集指标。
加载示例文件fisheriris.csv
,其中包含虹膜的数据,包括萼片长度、萼片宽度、花瓣长度、花瓣宽度和物种类型。将文件读入表中。
fishertable = readtable (“fisheriris.csv”);
将数据分离到一个训练集中trainTbl
还有一个测试集testTbl
通过使用分层压痕分区。该软件为测试数据集保留了大约30%的观察数据,并将其余的观察数据用于训练数据集。
rng (“默认”c = cvpartition(fishtable .)物种,“坚持”, 0.3);trainTbl = fishertable(培训(c):);testTbl = fishertable(测试(c):);
用训练集中的所有预测器训练一个神经网络分类器,并用训练集中的所有预测器训练另一个分类器PetalWidth
.对于这两个模型,指定物种
作为响应变量,并标准化预测器。
allMdl = fitcnet (trainTbl,“物种”,“标准化”,真正的);subsetMdl = fitcnet (trainTbl,“物种~ SepalLength + SepalWidth + PetalLength”,...“标准化”,真正的);
计算两个模型的测试集分类裕度。因为测试集只包含45个观察结果,所以使用条形图显示边界。
对于每个观察,分类裕度是真实类的分类得分与虚假类的最大得分之间的差值。因为神经网络分类器返回的分类分数是后验概率,接近1的裕度值表示有信心的分类,负的裕度值表示分类错误。
tiledlayout (2, 1)%顶轴ax₁= nexttile;allMargins =利润率(allMdl testTbl);栏(ax₁,allMargins)包含(ax₁“观察”) ylabel (ax₁,“保证金”)标题(ax₁,“预测”)%底部轴ax2 = nexttile;subsetMargins =利润率(subsetMdl testTbl);栏(ax2 subsetMargins)包含(ax2,“观察”) ylabel (ax2,“保证金”)标题(ax2,“子集预测”)
比较两个模型的测试集分类边,或分类边的平均值。
allEdge =边缘(allMdl testTbl)
allEdge = 0.8198
subsetEdge =边缘(subsetMdl testTbl)
subsetEdge = 0.9556
基于测试集分类边和边,在一个预测因子子集上训练的模型似乎优于在所有预测因子上训练的模型。
比较两种模型的测试集分类误差。
allError =损失(allMdl testTbl);allAccuracy = 1-allError
allAccuracy = 0.9111
subsetError =损失(subsetMdl testTbl);subsetAccuracy = 1-subsetError
subsetAccuracy = 0.9778
同样,只使用一个预测器子集训练的模型似乎比使用所有预测器训练的模型表现更好。
使用混淆矩阵可视化测试集分类结果。
allLabels =预测(allMdl testTbl);图confusionchart (testTbl.Species allLabels)标题(“预测”)
subsetLabels =预测(subsetMdl testTbl);图confusionchart (testTbl.Species subsetLabels)标题(“子集预测”)
使用所有预测因子训练的模型错误分类了四个测试集的观察值。使用预测器子集训练的模型只对测试集观察结果中的一个进行了错误分类。
考虑到这两个模型的测试集性能,考虑使用使用所有预测器训练的模型PetalWidth
.
神经网络分类器的分层结构预测
了解神经网络分类器的层如何一起工作,以预测单个观察的标签和分类分数。
加载示例文件fisheriris.csv
,其中包含虹膜的数据,包括萼片长度、萼片宽度、花瓣长度、花瓣宽度和物种类型。将文件读入表中。
fishertable = readtable (“fisheriris.csv”);
使用数据集训练神经网络分类器。指定物种
列的fishertable
作为响应变量。
Mdl = fitcnet (fishertable,“物种”);
从数据集中选择第15个观测值。看看神经网络分类器的层如何接受观察并返回预测的类标签newPointLabel
和分类的分数newPointScores
.
newPoint = Mdl。X{15日:}
newPoint =1×45.8000 4.0000 1.2000 0.2000
firstFCStep = (Mdl.LayerWeights{1})*newPoint' + mdl . layerbias {1};reluStep = max (firstFCStep, 0);finalFCStep = (mll . layerweights {end})*reluStep + mll . layerbias {end};finalSoftmaxStep = softmax (finalFCStep);[~, classIdx] = max (finalSoftmaxStep);newPointLabel = Mdl。一会{classIdx}
newPointLabel = ' setosa '
newPointScores = finalSoftmaxStep '
newPointScores =1×31.0000 0.0000 0.0000
方法返回的预测是否匹配预测
对象的功能。
[predictedLabel, predictedScores] =预测(Mdl newPoint)
predictedLabel =1 x1单元阵列{' setosa '}
predictedScores =1×31.0000 0.0000 0.0000
输入参数
Mdl
- - - - - -训练神经网络分类器
ClassificationNeuralNetwork
模型对象|CompactClassificationNeuralNetwork
模型对象
经过训练的神经网络分类器,指定为ClassificationNeuralNetwork
模型对象或CompactClassificationNeuralNetwork
返回的模型对象fitcnet
或紧凑的
,分别。
X
- - - - - -预测数据需分类
数字矩阵|表格
要分类的预测数据,指定为数字矩阵或表格。
默认情况下,每一行X
对应一个观察结果,每一列对应一个变量。
对于数字矩阵:
列中的变量
X
必须与训练的预测变量的顺序相同Mdl
.如果你训练
Mdl
使用一个表(例如,资源描述
),资源描述
那么,只包含数字预测变量X
可以是一个数字矩阵。处理数字预测资源描述
作为训练期间的分类,识别分类预测器使用CategoricalPredictors
名称-值参数fitcnet
.如果资源描述
包含异构预测器变量(例如,数值和类别数据类型)和X
是一个数字矩阵吗预测
抛出一个错误。
一个表:
预测
除了字符向量的单元格数组外,不支持多列变量或单元格数组。如果你训练
Mdl
使用一个表(例如,资源描述
),则所有预测变量均为X
必须具有与所训练的变量相同的变量名和数据类型Mdl
(存储在Mdl。PredictorNames
).的列顺序X
是否需要对应列的顺序资源描述
.同时,资源描述
和X
可以包含其他变量(响应变量、观察权重等),但是预测
忽略了它们。如果你训练
Mdl
使用一个数字矩阵,然后预测器名称在Mdl。PredictorNames
必须与对应的预测器变量名称相同X
.要在训练期间指定预测器名称,请使用PredictorNames
名称-值参数fitcnet
.的所有预测变量X
必须是数字向量。X
可以包含其他变量(响应变量、观察权重等),但是预测
忽略了它们。
如果你设置“标准化”,真的
在fitcnet
当训练Mdl
,然后软件利用相应的均值和标准差对预测数据的数值列进行标准化。
请注意
如果你定位你的预测矩阵,使观察结果对应列和指定“ObservationsIn”、“列”
,那么计算时间可能会显著减少。你不能指定“ObservationsIn”、“列”
用于表中的预测数据。
数据类型:单
|双
|表格
维
- - - - - -预测器数据观测维数
“行”
(默认)|“列”
预测器数据观测维数,指定为“行”
或“列”
.
请注意
如果你定位你的预测矩阵,使观察结果对应列和指定“ObservationsIn”、“列”
,那么计算时间可能会显著减少。你不能指定“ObservationsIn”、“列”
用于表中的预测数据。
数据类型:字符
|字符串
输出参数
更多关于
分类的分数
的分类的分数对于神经网络分类器,使用softmax激活函数计算,该函数跟随网络中最后的全连接层。分数对应后验概率。
观察结果的后验概率x的类k是
在哪里
P(x|k)的条件概率是x给定类k.
P(k)是类的先验概率吗k.
K响应变量中的类数。
一个k(x)是k输出从最后的全连接层进行观察x.
选择功能
仿真软件块
将神经网络分类模型的预测集成到Simulink中®,你可以使用ClassificationNeuralNetwork预测在统计和机器学习工具箱™库或MATLAB中®函数块中包含预测
函数。有关示例,请参见使用分类神经网络预测块预测类标签和用MATLAB函数块预测类标签.
在决定使用哪种方法时,请考虑以下几点:
如果使用“统计和机器学习工具箱”库块,则可以使用定点的工具(定点设计师)将浮点模型转换为定点模型。
控件必须为MATLAB函数块启用对可变大小数组的支持
预测
函数。如果使用MATLAB函数块,则可以使用MATLAB函数在同一个MATLAB函数块中进行预测前后的预处理或后处理。
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
使用
saveLearnerForCoder
,loadLearnerForCoder
,codegen
(MATLAB编码器)来生成的代码预测
函数。保存一个训练过的模型saveLearnerForCoder
.定义一个入口点函数,用于加载保存的模型loadLearnerForCoder
并调用预测
函数。然后使用codegen
为入口点函数生成代码。生成单精度的C/ c++代码
预测
,指定名称-值参数“数据类型”、“单身”
当你打电话给loadLearnerForCoder
函数。该表包含关于的参数的注释
预测
.该表中未包含的参数完全支持。论点 笔记和局限性 Mdl
有关模型对象的使用说明和限制,请参见代码生成的
CompactClassificationNeuralNetwork
对象。X
X
必须是单精度或双精度矩阵,或包含数值变量、类别变量或两者都包含的表。中的行数或观察数
X
可以是可变大小的,但列数在X
必须是固定的。如果你想指定
X
作为一个表,那么你的模型必须使用一个表来训练,你的预测入口点函数必须做以下工作:接受数据作为数组。
从数据输入参数创建一个表,并在表中指定变量名。
把桌子递给
预测
.
有关此表工作流的示例,请参见生成代码对表格中的数据进行分类.有关在代码生成中使用表的更多信息,请参见表的代码生成(MATLAB编码器)和表代码生成的限制(MATLAB编码器).
ObservationsIn
的
维
值ObservationsIn
名称-值参数必须是编译时常量。例如,使用“ObservationsIn”、“列”
在生成的代码中,包含{coder.Constant(“ObservationsIn”),coder.Constant(“列”)}
在arg游戏
的价值codegen
(MATLAB编码器).
有关更多信息,请参见代码生成简介.
版本历史
介绍了R2021a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。