主要内容

代码生成和分类学习者应用程序

分类学习器非常适合交互式地选择和训练分类模型,但它不会生成基于训练模型的数据标签的C/ c++代码。的生成函数按钮出口部分生成MATLAB代码用于训练模型,但不生成C/ c++代码。这个例子展示了如何从一个函数生成C代码,该函数使用导出的分类模型预测标签。该示例构建了一个模型,根据以下步骤,在给定各种财务比率的情况下,预测企业的信用评级:

  1. 使用文件中的信用评级数据集CreditRating_Historical.dat,它包含在统计学和机器学习工具箱™中。

  2. 使用主成分分析(PCA)降低数据维数。

  3. 训练一组支持标签预测代码生成的模型。金宝app

  4. 以最小5倍交叉验证分类精度导出模型。

  5. 从一个入口点函数生成C代码,该函数转换新的预测器数据,然后使用导出的模型预测相应的标签。

加载样本数据

加载样本数据,并将数据导入Classification Learner应用程序。使用散点图检查数据,删除不必要的预测因素。

使用可读在文件中加载历史信用评级数据集CreditRating_Historical.dat一个表中。

信用评级=可读(“CreditRating_Historical.dat”);

应用程序选项卡,单击分类学习者

在分类学习者中,关于分类学习者选项卡,文件部分中,点击新会话选择从工作空间

在“来自工作区的新会话”对话框中,选择表creditrating.除了响应之外,所有变量都是双精度数值向量。点击开始会议比较基于5倍、交叉验证的分类精度的分类模型。

分类学习者加载数据并绘制变量的散点图沃库塔身份证件。由于标识号对在绘图中显示没有帮助,请选择RE_TA对于X在下面预测

信用评级数据散点图

散点图表明这两个变量可以分离类AAA,BBB,BB,CCC相当好。然而,与其余类对应的观察结果被混合到这些类中。

识别号码对预测没有帮助。因此,在特性部分中,点击特征选择.在“特性选择”对话框中,清除身份证件复选框,然后单击好吧.您还可以使用“从工作区新建会话”对话框中的复选框从一开始就删除不必要的预测器。这个示例展示了在包含了所有预测器后,如何删除用于代码生成的未使用的预测器。

使主成分分析

使用PCA降低数据维数。

特性部分中,点击主成分分析.在“高级PCA选项”对话框中,选择使主成分分析,然后单击好吧。此操作将主成分分析应用于预测数据,然后在训练模型之前对数据进行转换。分类学习者仅使用共同解释95%可变性的组件。

火车模型

培训一组支持标签预测代码生成的模型。有关分类学习器中支金宝app持代码生成的模型列表,请参阅生成C代码的预测

选择以下支持标签预测代码生成的分类模型和选项,然后执行交叉验证(有关更多详细信息,请参阅金宝app代码生成简介)。要选择每个模型,请在模型类型节中,单击显示更多箭头,然后单击模型。选择模型并指定任何选项后,单击火车培训部分。

模型和选择选项 描述
决策树中,选择所有的树 不同复杂性的分类树
金宝app支持向量机中,选择所有支持向量机 支持向量机具有不同的复杂性和使用不同的内核。复杂的支持向量机需要时间来适应。
集成分类器中,选择提高了树.在模型类型部分中,点击先进的.在对话框中,减少最大拆分数5.和增加许多学习者One hundred.点击好吧 增强的分类树集合
集成分类器中,选择套袋树.在模型类型部分中,点击先进的.在对话框中,增加最大拆分数50和增加许多学习者One hundred.点击好吧 分类树的随机森林

在交叉验证每个模型类型之后模型窗格显示每个模型及其5倍交叉验证的分类精度,并突出显示具有最佳精度的模型。

模型窗格显示训练过的模型及其准确性。精高斯支持向量机模型的精度最高。

选择产生最大5倍交叉验证分类精度的模型,这是精细高斯SVM学习者的纠错输出码(ECOC)模型。启用PCA后,分类学习者使用六个预测值中的两个。

情节段,单击箭头以打开图库,然后单击混淆矩阵(验证)验证结果组。

精细高斯支持向量机模型的混淆矩阵

模型能很好地区分A.,B,C类。然而,该模型并不能很好地区分这些组中的特定水平,特别是较低的B水平。

将模型导出到工作空间

将模型导出到MATLAB®工作区和保存模型使用saveLearnerForCoder

出口部分中,点击出口模式,然后选择出口紧凑的模型点击好吧在对话框中。

结构训练模型出现在MATLAB工作区中。字段ClassificationSVM训练模型包含精简模型。

在命令行中,将压缩模型保存到名为ClassificationLearnerModel.mat在当前文件夹中。

saveLearnerForCoder (trainedModel。ClassificationSVM,“分类学习模型”)

生成C代码的预测

使用对象函数进行预测需要一个训练过的模型对象,但是-args选择codegen(MATLAB编码器)不接受这样的物品。通过使用来解决这个限制saveLearnerForCoderloadLearnerForCoder.通过使用保存一个训练过的模型saveLearnerForCoder.然后,定义一个入口点函数,通过使用loadLearnerForCoder并调用预测函数。最后,使用codegen为入口点函数生成代码。

数据进行预处理

预处理新数据的方法与预处理训练数据的方法相同。

预处理时,需要以下三个模型参数:

  • removeVars-最多的列向量P标识要从数据中删除的变量索引的元素,其中P是原始数据中预测变量的数量

  • pcaCenters-精确的行向量Q主成分分析中心

  • pcaCoefficientsQ——- - - - - -RPCA系数矩阵,其中R最多是Q

指定在使用选择数据时删除的预测变量的索引特征选择在分类学习器中。从中提取PCA统计信息训练模型

removeVars=1;pcaCenters=trainedModel.pcaCenters;pcaCoefficients=trainedModel.pcaCoefficients;

将模型参数保存到名为ModelParameters.mat在当前文件夹中。

拯救(“ModelParameters.mat”,“removeVars”,“pcaCenters”,“pcaCoefficients”);

定义入口点函数

入口点函数是为代码生成而定义的函数。因为你不能在顶层使用codegen,必须定义一个入口点函数来调用支持代码生成的函数,然后使用codegen

在当前文件夹中,定义一个名为MYCL.m:

  • 接受一个数字矩阵(X)的原始观察结果,其中包含与传入分类学习者的相同的预测变量

  • 加载分类模型ClassificationLearnerModel.mat和模型参数ModelParameters.mat

  • 删除与中的索引对应的预测变量removeVars

  • 使用PCA中心变换剩余的预测数据(pcaCenters)和系数(pcaCoefficients)估计的分类学习者

  • 使用模型返回预测的标签

函数标签=mypredictCL(X)% # codegen%MYPREDICTCL使用从导出的模型对信用评级进行分类%分类学习者% MYPREDICTCL加载训练过的分类模型(SVM)和模型%参数(removeVars、PCacCenter和pcaCoefficients)删除X中预测器数据的原始矩阵的%列对应于%的指标去除evars,转换结果矩阵使用主成分分析pcaCenters中的%中心,pcacoefficient中的PCA系数,然后%使用转换后的数据对信用评级进行分类。X是一个数字矩阵,n行7列。Label是一个n乘1的单元格数组%预测标签。%负载训练的分类模型及模型参数支持向量机= loadLearnerForCoder (“分类学习模型”);数据= coder.load (“ModelParameters”);removeVars=data.removeVars;pcaCenters=data.pcaCenters;pcaCoefficients=data.pcaCoefficients;%删除未使用的预测变量keepvars = 1:大小(X, 2);idx = ~ ismember (keepvars removeVars);keepvars = keepvars (idx);XwoID = X (:, keepvars);%基于PCA的变换预测器Xpca = bsxfun (@minus XwoID pcaCenters) * pcaCoefficients;%从SVM生成标签标签=预测(SVM,Xpca);终止

生成代码

因为C和c++都是静态类型语言,所以必须在编译时确定入口点函数中所有变量的属性。使用coder.typeof(MATLAB编码器)并使用参数生成代码。

创建一个名为x使用以下方法生成代码coder.typeof(MATLAB编码器).的行数x是任意的,但是x必须有P柱。

p=规模(信用评级,2)-1;x=编码器类型(0[Inf,p],[10]);

有关指定变量大小参数的详细信息,请参见为代码生成指定可变大小参数

生成一个MEX函数MYCL.m.使用-args指定的选项x作为参数。

codegenmypredictCL-argsx

codegen生成MEX文件mypredictCL_mex.mexw64在当前文件夹中。文件扩展名取决于您的平台。

验证生成的代码

验证MEX函数是否返回预期的标签。

将响应变量从原始数据集中移除,然后随机抽取15个观察值。

rng (“默认”);%的再现性m = 15;testsampleT = datasample(creditrating(:,1:(end - 1)),m);

通过使用predictFcn在分类学习者训练的分类模型中。

testLabels=trainedModel.predictFcn(testsampleT);

将结果表转换为矩阵。

testsample = table2array (testsampleT);

的列试验材料与分类学习器加载的预测数据列相对应。

将测试数据传递给mypredictCL. 功能mypredictCL使用来预测相应的标签预测分类学习器训练的分类模型。

testLabelsPredict = mypredictCL (testsample);

使用生成的MEX函数预测相应的标签MyCl_mex

testLabelsMEX = mypredictCL_mex (testsample);

比较这几组预测。

isequal (testLabels testLabelsMEX testLabelsPredict)
逻辑1

等质量如果所有输入都相等,则返回逻辑1 (true)。predictFcn,mypredictCL,并且MEX函数返回相同的值。

另见

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

相关的话题