代码生成和分类学习应用程序
Classification Learner非常适合交互地选择和训练分类模型,但它不能生成基于训练模型标记数据的C/ c++代码。的生成函数按钮。出口部分的分类学习应用程序生成MATLAB代码用于训练模型,但不生成C/ c++代码。这个例子展示了如何从一个函数生成C代码,该函数使用导出的分类模型预测标签。该示例构建了一个模型,根据以下步骤预测给定各种财务比率的企业的信用评级:
使用文件中的信用评级数据集
CreditRating_Historical.dat
,包括在统计和机器学习工具箱™。使用主成分分析(PCA)降低数据的维数。
训练一组支持标签预测代码生成的模型。金宝app
导出具有最小5倍交叉验证分类精度的模型。
从转换新的预测器数据的入口点函数生成C代码,然后使用导出的模型预测相应的标签。
加载样例数据
加载样本数据并将数据导入Classification Learner应用程序。使用散点图检查数据并删除不必要的预测因子。
使用readtable
加载文件中的历史信用评级数据集CreditRating_Historical.dat
变成一个表。
信用评级=可读(“CreditRating_Historical.dat”);
在应用程序选项卡上,单击分类学习者.
在分类学习器中,对分类学习者选项卡,在文件部分中,点击新会话并选择从工作空间.
在“从工作区新建会话”对话框中,选择表creditrating
.除了识别为响应的变量外,所有变量都是双精度数值向量。点击开始会议比较基于5倍交叉验证分类精度的分类模型。
分类学习器加载数据并绘制变量的散点图WC_TA
与ID
.因为识别号码对显示在图中没有帮助,所以选择RE_TA
为X下预测.
散点图表明,这两个变量可以区分类别AAA
,BBB
,BB
,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工作区。这个领域ClassificationSVM
的trainedModel
包含紧凑模型。
在命令行中,将紧凑模型保存到一个名为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)。predictFcn
,mypredictCL
,与MEX函数返回相同的值。
另请参阅
loadLearnerForCoder
|saveLearnerForCoder
|coder.typeof
(MATLAB编码器)|codegen
(MATLAB编码器)|learnerCoderConfigurer