代码生成和分类学习程序

分类学习者非常适合交互选择和培训分类模型,但它不会生成基于培训的模型的标签数据的C / C ++代码。这生成函数按钮在出口分类学习者应用程序的部分生成MATLAB代码用于培训模型,但不会生成C / C ++代码。此示例显示了如何从使用导出的分类模型中预测标签的函数生成C代码。根据这些步骤,该示例构建了一种预测各种金融比率的业务信用评级:

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

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

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

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

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

加载示例数据

加载样本数据并将数据导入分类学习者应用程序。使用散点图查看数据并删除不必要的预测器。

采用readtable加载文件中设置的历史信用评级数据Creditrating_Historical.dat.进入桌子。

creditrating = readtable ('信用_historical.dat');

在这一点应用选项卡上,单击分类学习者

在分类学习者中,在分类学习者标签,在文件部分,点击新会议并选择从工作空间

在“新会话”对话框中,选择表格信用评级.除了标识为响应之外的所有变量是双精度数字向量。点击开始课程比较基于5倍,交叉验证的分类准确性的分类模型。

分类学习者加载数据并绘制变量的散点图WC_TAID.因为标识号在绘图中不便于显示,所以选择re_ta.X预测因子

信用评级数据的散点图

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

识别号码对预测没有有用。因此,在里面特征部分,点击功能选择然后清除ID复选框。您还可以使用“新会话”对话框中的“复选框”从“开始”中删除不必要的预测器。此示例显示如何在包含所有预测器时删除未使用的预测器以进行代码生成。

启用PCA.

启用PCA以减少数据维度。

在里面特征部分,点击主成分分析,然后选择启用PCA..该操作将PCA应用于预测数据,然后在训练模型之前对数据进行转换。分类学习者只使用能解释95%可变性的组件。

火车模型

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

选择以下分类模型和选项(它们支持代码生成以进行标签预测),然后执行交叉验证(有关更多细节,请参见)金宝app代码生成简介).要选择每个模型,请在模型类型部分,单击显示更多箭头,然后单击模型。选择模型并指定任何选项后,关闭任何打开菜单,然后单击火车在里面训练部分。

选择的模型和选项 描述
在下面决策树, 选择所有树木 各种复杂性的分类树
在下面金宝app支持矢量机器, 选择所有支持向量机 支持向量机具有不同的复杂性和使用不同的内核。复杂的支持向量机需要时间来适应。
在下面合奏分类器, 选择增强树木.在里面模型类型部分,点击先进的.减少最大分割数5并增加学习者人数100. 促进分类树的合奏
在下面合奏分类器, 选择袋装的树木.在里面模型类型部分,点击先进的.增加最大分割数50.并增加学习者人数100. 分类树的随机森林

在交叉验证每个模型类型之后,数据浏览器显示每个模型及其5倍的交叉验证分类精度,并以最佳的精度突出显示模型。

历史面板显示培训的型号及其准确性。精细高斯SVM模型具有最高的精度。

选择产生最大5倍交叉验证分类精度的模型,即精细高斯支持向量机学习器的纠错输出码(ECOC)模型。启用PCA后,分类学习器将使用六个预测器中的两个。

在里面绘图部分,点击混乱矩阵

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

该模型在介于之间进行了很好的区别一个B, 和C课程。然而,该模型在这些组内的特定级别之间不具有区分,特别是较低的B级。

将模型导出到工作区

将模型导出到MATLAB®工作区并使用型号保存Savelarnerforcoder.

在里面出口部分,点击出口模式,然后选择出口紧凑型号.点击在对话框中。

结构trainedModel出现在MATLAB工作区中。这个领域分类VM.trainedModel包含紧凑模型。

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

SavelAlnerForCoder(TroutaModel.ClassificationsVM,“ClassificationLearnerModel”

生成C代码以进行预测

使用对象函数的预测需要培训的模型对象,但是arg游戏选择Codegen.不接受这些对象。通过使用解决此限制Savelarnerforcoder.loadlearnerforcoder..使用培训模型Savelarnerforcoder..然后,定义通过使用加载保存的模型的入口点函数loadlearnerforcoder.并致电预测功能。最后,使用Codegen.为入口点函数生成代码。

预处理数据

预处理新数据以与培训数据预处理的相同方式。

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

  • 删除-列向量最多p标识要从数据中删除的变量的索引的元素p预测变量的数量是否在原始数据中

  • PCACEDERS.-正好的行向量PCA中心

  • Pcacoeffices- - - - - --经过-rPCA系数的矩阵,在哪里r最多

指定在选择数据时删除的预测器变量的索引功能选择在分类学习者。提取PCA统计信息trainedModel

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

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

保存('modelparameters.mat'“removeVars”'pcacenter''pcacoeffices');

定义入口点函数

一个入口点函数是您为代码生成定义的函数。因为您无法使用顶级使用任何功能Codegen.,您必须定义一个呼叫启用代码生成的函数的入口点函数,然后使用使用的切入点函数生成C / C ++代码Codegen.

在您当前的文件夹中,定义名为的函数mypredictCL.m那:

  • 接受数字矩阵(X)包含与分类学习者的相同预测变量相同的预测变量的原始观察

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

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

  • 使用PCA中心转换剩余的预测数据(PCACEDERS.)及系数(Pcacoeffices)由分类学习者估计

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

功能标签= mypredictCL (X)%#codegen.%MYPREDICTCL使用导出的模型对信用评级进行分类%分类学习者%mypredictcl加载训练的分类模型(svm)和模型%参数(removeVars、pcaCenters和pcacoeffents),删除x相对应的x中的预测器数据的原始矩阵的%列removeVars中的%索引,使用PCA转换生成的矩阵PCACEDERS和PCACEFICERS的PCA系数中的%中心,然后%使用转换的数据来分类信用评级。x是一个数字%矩阵与n行和7列。标签是一个N个1个单元格数组%预测标签。%加载训练的分类模型和模型参数svm = loadlearnerforcoder(“ClassificationLearnerModel”);data = 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,pcacenter)* pcacoeffices;%从SVM生成标签标签=预测(SVM, Xpca);结束

生成代码

因为C和C ++是静态类型的语言,所以必须在编译时确定入口点函数中所有变量的属性。使用可变大小的参数指定使用Coder.typeof.并使用参数生成代码。

创建一个双精度矩阵x用于使用代码Coder.typeof..指定行的数量x是任意的,但是那x一定有p列。

P = size(creditrating,2) - 1;x =编码器。typeof(0,[正无穷,p], [1 0]);

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

生成MEX功能mypredictCL.m.使用arg游戏选项来指定x作为一个论点。

Codegen.mypredictclarg游戏x

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

验证生成的代码

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

从原始数据集中删除响应变量,然后随机绘制15个观察。

RNG('默认');重复性的%m = 15;testsamplet = datasample(信用(:,1:(结束 -  1)),m);

通过使用,预测相应的标签预测FCN.在分类学习者培训的分类模型中。

testLabels = trainedModel.predictFcn (testsampleT);

将生成的表转换为一个矩阵。

testsample = table2array(testsamplet);

列的列testsample对应于分类学习者加载的预测数据列。

将测试数据传递给mypredictcl.这个函数mypredictcl通过使用预测相应的标签预测和分类学习者培训的分类模型。

testlabelspredict = mypredictcl(testsample);

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

testlabelsmex = mypredictcl_mex(testsample);

比较预测集。

Isequal(testlabels,testlabelsmex,testlabelspredict)
ans =逻辑1

isequal如果所有输入相等,则返回逻辑1(true)。预测FCN.mypredictcl,而MEX函数返回相同的值。

另请参阅

||||

相关话题