【2】使用MATLAB进行机器学习(回归)

2022年5月31日更新:
更加完整的回归流程及m代码实现,请见“实战1 空气质量数据的校准”。实战1 - 空气质量数据的校准

(一)选择数据

打开APP中 Regression Learner,点击新建,
在这里插入图片描述
这里我编了一个table,里面存放数据,命名为DATA_table。选择第8个变量Var8为Response(目标变量),选择其余8个变量为Predictors(特征量)。默认交叉验证打开,点开始。
在这里插入图片描述

(二)训练模型

选择 All,点 Train,使用所有模型都跑一遍。
在这里插入图片描述
显示线性模型效果最好。
在这里插入图片描述

(三)考虑降维

如果要考虑对这8个特征变量进行降维处理,可在训练开始前选中PCA,和上边一样,再跑一遍。发现树模型最优,PCA显示前两个特征变量的贡献度最大。
在这里插入图片描述
这样我们可以尝试只使用前两个变量进行回归,需要重新新建,然后Predictors只选Var1和Var2.
在这里插入图片描述
然后再使用所有模型跑一遍,发现树模型最优。
在这里插入图片描述

(四)考虑数据标准化

有些算法对数据的量纲比较敏感,因此我们可以尝试使用以下代码对数据进行标准化,

N=size(DATA_table);
DATA_table_norm=table;
for i=1:N(2)
      [Y,PS] = mapminmax(DATA_table{:,i});
      Var_name{i}=['Var',num2str(i)];
      Var_value(:,i)=Y;
      %table的创建,需要一列一列的添加
      DATA_table_norm(:,i)=table( Var_value(:,i),'VariableNames',Var_name(i));
end

表DATA_table_norm中存储标准化后的数据。

(五)模型输出及代码生成

训练好的模型,可以导出模型(Export Model)以便预测之用;也可以导出为代码(Generate Code),以便于集成到我们编写的m代码中使用。这里着重对生成的代码翻译了下,见下方。有问题欢迎交流。

function [trainedModel, validationRMSE] = trainRegressionModel(trainingData)
%  输入:
%      trainingData: 一个表,其中包含特征变量 predictor 和 目标变量response
%  输出:
%      trainedModel: 一个结构体,包含经过训练的回归模型信息。
%      可使用 trainedModel.predictFcn 函数对新数据进行预测.
%      validationRMSE: 数值型,包含RMSE。
% 例如,如果使用原始数据集T,重新训练该回归模型,可以输入:
%   [trainedModel, validationRMSE] = trainRegressionModel(T)
%
% 如果使用返回的“trainedModel”对新数据集T2进行预测,可以使用
%   yfit = trainedModel.predictFcn(T2)
% T2必须和训练该模型的训练集具有相同的结构,例如,训练集有Var1~Var2这2个特征变量,则T2也必须有这些特征变量

% 提取特征变量和目标变量
%此段代码将数据处理为正确的结构形式,以便输入到训练模型中用于训练
inputTable = trainingData;
predictorNames = {'Var1', 'Var2'};
predictors = inputTable(:, predictorNames);
response = inputTable.Var8;
isCategoricalPredictor = [false, false];

%训练回归模型
%此段代码对模型参数进行设置,并训练模型。
regressionTree = fitrtree(...
    predictors, ...
    response, ...
    'MinLeafSize', 4, ...
    'Surrogate', 'off');

%使用predict函数创建模型训练输出结果的结构
predictorExtractionFcn = @(t) t(:, predictorNames);
treePredictFcn = @(x) predict(regressionTree, x);
trainedModel.predictFcn = @(x) treePredictFcn(predictorExtractionFcn(x));

% 对输出的结果添加附加信息
trainedModel.RequiredVariables = {'Var1', 'Var2'};
trainedModel.RegressionTree = regressionTree;
trainedModel.About = 'This struct is a trained model exported from Regression Learner R2018b.';
trainedModel.HowToPredict = sprintf('To make predictions on a new table, T, use: \n  yfit = c.predictFcn(T) \nreplacing ''c'' with the name of the variable that is this struct, e.g. ''trainedModel''. \n \nThe table, T, must contain the variables returned by: \n  c.RequiredVariables \nVariable formats (e.g. matrix/vector, datatype) must match the original training data. \nAdditional variables are ignored. \n \nFor more information, see <a href="matlab:helpview(fullfile(docroot, ''stats'', ''stats.map''), ''appregression_exportmodeltoworkspace'')">How to predict using an exported model</a>.');

% 提取特征变量和目标变量
%此段代码将数据处理为正确的结构形式,以便输入到训练模型中用于训练
inputTable = trainingData;
predictorNames = {'Var1', 'Var2'};
predictors = inputTable(:, predictorNames);
response = inputTable.Var8;
isCategoricalPredictor = [false, false];

%执行交叉验证
partitionedModel = crossval(trainedModel.RegressionTree, 'KFold', 5);

%计算交叉验证预测值
validationPredictions = kfoldPredict(partitionedModel);

%计算交叉验证RMSE
validationRMSE = sqrt(kfoldLoss(partitionedModel, 'LossFun', 'mse'));


版权声明:本文为qq_43301351原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。