主要内容

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

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

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

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

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

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

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

加载样例数据

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

使用readtable加载文件中的历史信用评级数据集CreditRating_Historical.dat变成一个表。

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

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

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

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

分类学习器加载数据并绘制变量的散点图WC_TAID.因为识别号码对显示在图中没有帮助,所以选择RE_TAX预测

信用评级数据的散点图

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

识别号码对预测没有帮助。因此,在选项部分中,点击特征选择.在默认特性选择选项卡,清除ID复选框,单击保存并应用.您还可以使用“从工作区新建会话”对话框中的复选框,从一开始删除不必要的预测符。此示例展示了在包含所有预测器时,如何删除代码生成中未使用的预测器。

使主成分分析

启用PCA降低数据维数。

选项部分中,点击主成分分析.2 .在“Default PCA Options”对话框中选择使主成分分析,并单击保存并应用.该操作将PCA应用于预测器数据,然后在训练模型之前转换数据。“分类学习器”只使用能够解释95%变异性的成分。

火车模型

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

选择以下分类模型和选项,它们支持用于标签预测的代码生成,然后执行交叉验证(有关详细信息,请参见金宝app代码生成简介).要选择每个模型,请在模型部分,单击显示更多箭头,然后单击模型。

要选择的模型和选项 描述
决策树中,选择所有的树 不同复杂度的分类树
金宝app支持向量机中,选择所有支持向量机 各种复杂的支持向量机,使用各种内核。复杂的支持向量机需要时间来拟合。
集成分类器中,选择提高了树.在模型中总结选项卡,在模型Hyperparameters,减少最大分割次数5和增加学习人数One hundred. 增强了分类树的集合
集成分类器中,选择袋装的树木.在模型中总结选项卡,在模型Hyperparameters,减少最大分割次数50和增加学习人数One hundred. 分类树的随机森林

在选择模型并指定任何选项之后,删除默认的精细树模型(模型1)模型窗格并选择删除.然后,在火车部分中,点击火车都并选择火车都

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

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

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

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

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

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

将模型导出到工作区

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

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

结构trainedModel出现在MATLAB工作区。这个领域ClassificationSVMtrainedModel包含紧凑模型。

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

saveLearnerForCoder (trainedModel。ClassificationSVM,“ClassificationLearnerModel”

生成用于预测的C代码

使用对象函数进行预测需要经过训练的模型对象,但是arg游戏选择codegen(MATLAB编码器)不接受这样的对象。通过使用saveLearnerForCoder而且loadLearnerForCoder.通过使用保存一个训练好的模型saveLearnerForCoder.然后,定义一个入口点函数,通过使用加载保存的模型loadLearnerForCoder并调用预测函数。最后,使用codegen为入口点函数生成代码。

数据进行预处理

用预处理训练数据的方法预处理新数据。

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

  • removeVars的列向量p标识要从数据中删除的变量索引的元素,其中p预测变量的数量在原始数据中吗

  • pcaCenters的行向量主成分分析中心

  • pcaCoefficients- - - - - -——- - - - - -r式中,为主成分分析系数矩阵r最多是

指定在选择数据时所删除的预测变量的索引特征选择在分类学习者。提取PCA统计数据trainedModel

removeVars = 1;pcaCenters = trainedModel.PCACenters;pcacoeffents = trainedmodel . pcacoeffents;

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

保存(“ModelParameters.mat”“removeVars”“pcaCenters”“pcaCoefficients”);

定义入口点函数

入口点函数是为代码生成而定义的函数。因为您不能在顶层使用codegen,您必须定义一个入口点函数,该函数调用支持代码生成的函数,然后通过使用为入口点函数生成C/ c++代码codegen

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

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

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

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

  • 使用主成分分析中心(pcaCenters)和系数(pcaCoefficients)由分类学习者估计

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

函数标签= mypredictCL(X)% # codegen使用导出的模型对信用评级进行分类%分类学习者加载训练过的分类模型(SVM)和模型% parameters (removeVars, pcaCenters,和pcacoeffents),删除%列的原始矩阵的预测器数据在X中对应%指数在removeVars,转换结果矩阵使用PCApcaCenters中的% centers和pcacoefficiency中的PCA系数,然后%使用转换后的数据对信用评级进行分类。X是一个数字%矩阵,n行7列。Label是一个n × 1的单元格数组%预测标签。负载训练分类模型和模型参数支持向量机= loadLearnerForCoder(“ClassificationLearnerModel”);Data = code .load(“ModelParameters”);removeVars = data.removeVars;pcaCenters = data.pcaCenters;pcacoeffents = data. pcacoeffents;移除未使用的预测变量keepvars = 1:size(X,2);idx = ~ismember(keepvars,removeVars);Keepvars = Keepvars (idx);XwoID = X(:,keepvars);通过PCA转换预测因子Xpca = bsxfun(@minus,XwoID,pcaCenters)*pcaCoefficients;从SVM生成标签label = predict(SVM,Xpca);结束

生成代码

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

创建一个双精度矩阵称为x用于代码生成coder.typeof(MATLAB编码器).的行数x是武断的,但那x必须有p列。

P =大小(信用评级,2)- 1;X =编码器。typeof(0,[正无穷,p], [1 0]);

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

生成一个MEX函数mypredictCL.m.使用arg游戏要指定的选项x作为一个论证。

codegenmypredictCLarg游戏x

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);

的列testsample对应于Classification Learner加载的预测器数据的列。

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

testlabelpredict = mypredictCL(testsample);

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

testLabelsMEX = mypredictCL_mex(testsample);

比较两组预测。

isequal (testLabels testLabelsMEX testLabelsPredict)
Ans =逻辑1

isequal如果所有输入都相等,则返回逻辑1 (true)。predictFcnmypredictCL,与MEX函数返回相同的值。

另请参阅

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

相关的话题