主要内容

为分类预测器创建虚拟变量并生成C/ c++代码

这个例子展示了如何使用支持向量机(SVM)模型生成分类数据的代码。金宝app使用数字和编码的分类预测器训练模型。使用dummyvar在拟合SVM分类器之前,将分类预测器转换为数值虚拟变量。在将新数据传递到经过训练的模型时,必须以类似的方式对数据进行预处理。

或者,如果一个训练过的模型在CategoricalPredictors属性,则不需要手动创建虚拟变量来生成代码。该软件自动处理分类预测器。例如,请参见生成代码对表中的数据进行分类

预处理数据和训练SVM分类器

加载病人数据集。属性创建表舒张压收缩压数值变量。表格中的每一行对应于一个不同的病人。

负载病人台=表(舒张压、收缩压);头(台)
ans =8×2表舒张收缩压_________ ________ 93 124 77 109 83 125 75 117 80 122 70 121 88 130 82 115

转换性别变量,分类变量。类别的顺序categoricalGender之所以重要,是因为它决定了预测器数据中列的顺序。使用dummyvar将分类变量转换为0和1组成的矩阵,其中a1的价值(i, j)第Th项表示这个病人属于j类别。

categoricalGender =分类(性别);orderGender =类别(categoricalGender)
orderGender =2 x1细胞{'女'}{‘男性’}
dummyGender = dummyvar (categoricalGender);

注意:由此产生的dummyGender矩阵秩不足。根据您所训练的模型的类型,这种等级缺失可能是有问题的。例如,在训练线性模型时,删除虚拟变量的第一列。

创建一个包含虚拟变量的表dummyGender带有相应的可变标题。将这个新表与资源描述

tblGender = array2table (dummyGender,“VariableNames”, orderGender);tbl = [tbl tblGender];头(台)
ans =8×4表舒张收缩期女男_________ ________ ______ ____ 93 124 0 1 77 109 0 1 83 125 10 75 117 10 80 122 10 70 121 10 88 130 10 82 115 0 1

转换SelfAssessedHealthStatus变量,分类变量。请注意分类的顺序categoricalHealth,并将变量转换为数值矩阵dummyvar

categoricalHealth =分类(SelfAssessedHealthStatus);orderHealth =类别(categoricalHealth)
orderHealth =4 x1细胞{'Excellent'} {'Fair'} {'Good'} {'Poor'}
dummyHealth = dummyvar (categoricalHealth);

创建一个包含dummyHealth带有相应的可变标题。将这个新表与资源描述

tblHealth = array2table (dummyHealth,“VariableNames”, orderHealth);tbl = [tbl tblHealth];头(台)
ans =8×8表舒张压收缩压女性男性优秀的公平好可怜  _________ ________ ______ ____ _________ ____ ____ ____ 93 124 0 1 1 0 0 0 77 109 0 1 0 1 0 0 0 0 0 1 0 83 125 75 117 1 0 0 1 0 0 0 0 0 1 0 80 122 70 121 1 0 0 0 0 0 0 0 1 0 88 130 82 115 0 1 0 0 1 0

第三排资源描述例如,符合以下特征的患者:舒张压为83,收缩压为125,女性,自我评估健康状况良好。

因为所有的值资源描述是数字,你能把表格转换成矩阵吗X

X = table2array(台);

使用。训练SVM分类器X.指定吸烟者变量作为响应。

Y =吸烟者;Mdl = fitcsvm (X, Y);

生成C / c++代码

生成加载SVM分类器的代码,将新的预测器数据作为输入参数,然后对新数据进行分类。

保存支持向量机分类器到一个文件使用saveLearnerForCoder

saveLearnerForCoder (Mdl“SVMClassifier”

saveLearnerForCoder将分类器保存到MATLAB®二进制文件SVMClassifier.mat作为当前文件夹中的结构数组。

定义入口点函数mySVMPredict,它将新的预测器数据作为输入参数。在函数中,通过使用加载SVM分类器loadLearnerForCoder,然后将加载的分类器传递给预测

函数标签= mySVMPredict (X)% # codegenMdl = loadLearnerForCoder (“SVMClassifier”);标签=预测(Mdl X);结束

生成的代码mySVMPredict通过使用codegen.使用。指定新的预测器数据的数据类型和维度coder.typeof以便生成的代码接受一个可变大小的数组。

codegenmySVMPredictarg游戏{编码器。typeof (X,[正8],[1 0])}
代码生成成功。

验证mySVMPredictMEX文件返回训练数据相同的结果。

标签=预测(Mdl X);mylabel = mySVMPredict (X);mylabel_mex = mySVMPredict_mex (X);verifyMEX = isequal(标签、mylabel mylabel_mex)
verifyMEX =逻辑1

预测新数据的标签

要预测新数据的标签,必须首先对新数据进行预处理。如果您在MATLAB环境中运行生成的代码,您可以按照本节描述的预处理步骤进行操作。如果在MATLAB环境之外部署生成的代码,则预处理步骤可能有所不同。在任何一种情况下,您都必须确保新数据具有与训练数据相同的列X

在这个例子中,取第三,第四和第五名病人病人数据集。对这些患者的数据进行预处理,使得到的数值矩阵与训练数据的形式相匹配。

将分类变量转换为虚拟变量。因为新的观察可能不包括所有类别的值,所以您需要指定与训练期间使用的类别相同的类别,并维护相同的类别顺序。在MATLAB中,传递与相应训练数据变量相关联的类别名称的有序单元数组(在本例中,orderGender性别价值观和orderHealth用于自评健康状态值)。

newcategoricalGender =分类(性别(3:5),orderGender);newdummyGender = dummyvar (newcategoricalGender);newcategoricalHealth =分类(SelfAssessedHealthStatus (3:5), orderHealth);newdummyHealth = dummyvar (newcategoricalHealth);

将所有的新数据合并成一个数字矩阵。

newX =[舒张(3:5)收缩期(3:5)newdummyGender newdummyHealth]
newX =3×883 125 1 0 0 0 1 0 75 117 1 0 0 1 0 0 80 122 1 0 0 0 1 0 0

请注意,newX正好对应矩阵的第三,第四和第五行X

验证mySVMPredictMEX文件对新数据返回相同的结果。

newX newlabel =预测(Mdl);newmylabel = mySVMPredict (newX);newmylabel_mex = mySVMPredict_mex (newX);newverifyMEX = isequal (newlabel newmylabel newmylabel_mex)
newverifyMEX =逻辑1

另请参阅

|||(MATLAB编码器)|(MATLAB编码器)||(MATLAB编码器)|

相关的话题