一、数据介绍
这是关于意大利一个地区的葡萄酒数据,该数据是对该地区的三种不同培育品种的葡萄所酿造的酒的13种要素的化学分析结果,一共有178个观测值。我们希望用这些数据来建立一个模型,利用这些要素的特性来判断是那个品种的葡萄所酿造的酒。因变量是Class (葡萄的品种),有1、2、3个取值,而13个自变量为:Alcohol (酒精)、 Malic.acid (苹果酸)、Ash (灰分)、Alcalinity of ash (灰的碱性)、Magnesium (镁)、 Total phenols (苯酚总量)、Flavanoids[2]、Nonflavanoid phenols(非flavanoid苯酚)、Proanthocyanins[3]、Color intensity(颜色强度)、Hue(色调)、OD280/OD315 of diluted wines (稀释的酒的蛋白质浓度的光谱度量)、Proline(脯氨酸)。这些化学成份不认识也无所谓,最后我们的目标是判断一杯葡萄酒是由三种葡萄中的哪一种酿制的。
分类变量:1 2 3
输入变量:Alcohol (酒精)、 Malic.acid (苹果酸)、Ash (灰分)、Alcalinity of ash (灰的碱性)、Magnesium (镁)、 Total phenols (苯酚总量)、Flavanoids[2]、Nonflavanoid phenols(非flavanoid苯酚)、Proanthocyanins[3]、Color intensity(颜色强度)、Hue(色调)、OD280/OD315 of diluted wines (稀释的酒的蛋白质浓度的光谱度量)、Proline(脯氨酸)。
二、数据导入
将数据导入进matlab中,将数据分为训练集和测试集,训练集为已知的分类变量和各输入变量,测试集内应仅有输入变量,没有分类变量,
data1如图所示
data2如图所示
三、调用matlab工具箱中的随机森林模型
将工具箱调用出来之后 选择装袋树模型,点击训练,训练结束后,点击导出代码
trainingData=data1
inputTable = trainingData;
predictorNames = {'Alcohol', 'Malicacid', 'Ash', 'Alcalinityofash', 'Magnesium', 'Totalphenols', 'Flavanoids', 'Nonflavanoidphenols', 'Proanthocyanins', 'Colorintensity', 'Hue', 'OD280OD315ofdilutedwines', 'Proline'};
predictors = inputTable(:, predictorNames);
response = inputTable.Class;
isCategoricalPredictor = [false, false, false, false, false, false, false, false, false, false, false, false, false];
% 训练分类器
% 以下代码指定所有分类器选项并训练分类器。
template = templateTree(...
'MaxNumSplits', 177);
classificationEnsemble = fitcensemble(...
predictors, ...
response, ...
'Method', 'Bag', ...
'NumLearningCycles', 30, ...
'Learners', template, ...
'ClassNames', categorical({'1'; '2'; '3'}));
% 使用预测函数创建结果结构体
predictorExtractionFcn = @(t) t(:, predictorNames);
ensemblePredictFcn = @(x) predict(classificationEnsemble, x);
trainedClassifier.predictFcn = @(x) ensemblePredictFcn(predictorExtractionFcn(x));
% 向结果结构体中添加字段
trainedClassifier.RequiredVariables = {'Alcalinityofash', 'Alcohol', 'Ash', 'Colorintensity', 'Flavanoids', 'Hue', 'Magnesium', 'Malicacid', 'Nonflavanoidphenols', 'OD280OD315ofdilutedwines', 'Proanthocyanins', 'Proline', 'Totalphenols'};
trainedClassifier.ClassificationEnsemble = classificationEnsemble;
trainedClassifier.About = '此结构体是从分类学习器 R2021a 导出的训练模型。';
trainedClassifier.HowToPredict = sprintf('要对新表 T 进行预测,请使用: \n yfit = c.predictFcn(T) \n将 ''c'' 替换为作为此结构体的变量的名称,例如 ''trainedModel''。\n \n表 T 必须包含由以下内容返回的变量: \n c.RequiredVariables \n变量格式(例如矩阵/向量、数据类型)必须与原始训练数据匹配。\n忽略其他变量。\n \n有关详细信息,请参阅 <a href="matlab:helpview(fullfile(docroot, ''stats'', ''stats.map''), ''appclassification_exportmodeltoworkspace'')">How to predict using an exported model</a>。');
% 提取预测变量和响应
% 以下代码将数据处理为合适的形状以训练模型。
%
inputTable = trainingData;
predictorNames = {'Alcohol', 'Malicacid', 'Ash', 'Alcalinityofash', 'Magnesium', 'Totalphenols', 'Flavanoids', 'Nonflavanoidphenols', 'Proanthocyanins', 'Colorintensity', 'Hue', 'OD280OD315ofdilutedwines', 'Proline'};
predictors = inputTable(:, predictorNames);
response = inputTable.Class;
isCategoricalPredictor = [false, false, false, false, false, false, false, false, false, false, false, false, false];
% 执行交叉验证
partitionedModel = crossval(trainedClassifier.ClassificationEnsemble, 'KFold', 5);
% 计算验证预测
[validationPredictions, validationScores] = kfoldPredict(partitionedModel);
% 计算验证准确度
validationAccuracy = 1 - kfoldLoss(partitionedModel, 'LossFun', 'ClassifError');
再这之后,如果只是想预测出分类结果,输入这一行代码即可
yfit = trainedModel1.predictFcn(data2)
效果如图所示
至此,利用随机森林模型对于分类模型的求解已完毕,但还有很多细节没有说明,如F1分数,混淆矩阵,ROC曲线,网格调参,随机森林模型网格搜索最大决策分裂数目热力图绘制,后续应该会更新