主要内容

选择随机森林的预测器

此示例展示了在生成回归树的随机森林时如何为数据集选择适当的分割预测器选择技术。这个示例还展示了如何决定在训练数据中包含哪些最重要的预测因子。

加载和预处理数据

加载carbig数据集。考虑一个模型,该模型根据汽车的气缸数量、发动机排量、马力、重量、加速度、车型年份和原产国来预测汽车的燃油经济性。考虑气缸Model_Year,起源作为分类变量。

负载carbig柱体=分类(柱体);Model_Year = categorical(Model_Year);Origin = categorical(cellstr(Origin));X =表(气缸、排量、马力、重量、加速度、型号、年份、起源);

确定预测器中的水平

标准CART算法倾向于将具有许多唯一值(级别)的预测因子(例如,连续变量)与具有较少级别的预测因子(例如,分类变量)分开。如果您的数据是异构的,或者您的预测变量在其级别数量上变化很大,那么请考虑使用曲率或交互测试来分割预测器选择,而不是标准CART。

对于每个预测器,确定数据中的水平数。一种方法是定义一个匿名函数:

  1. 将所有变量转换为分类数据类型分类

  2. 确定所有唯一类别,同时忽略使用的缺失值类别

  3. 使用元素个数

然后,将函数应用于每个变量varfun

countLevels = @(x) nummel (categories(categorical(x)));numLevels = varfun(countLevels,X,“OutputFormat”“统一”);

比较预测变量之间的水平数量。

图栏(numLevels)“预测因子中的水平数”)包含(预测变量的) ylabel (“关卡数”) h = gca;h.XTickLabel = X.Properties.VariableNames(1:end-1);h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;

图包含一个轴对象。标题为Number of Levels Among Predictors的坐标轴对象包含一个bar类型的对象。

连续变量比分类变量有更多的层次。由于预测因子之间的层次数量变化很大,因此使用标准CART在随机森林中树的每个节点上选择分割预测因子可能会产生不准确的预测因子重要性估计。在这种情况下,使用曲率测试或交互测试。指定算法“PredictorSelection”名称-值对参数。有关详细信息,请参见选择分割预测器选择技术

回归树的列车袋装集合

训练200个回归树的袋装集合来估计预测器的重要性值。使用这些名称-值对参数定义一个树学习器:

  • “NumVariablesToSample”、“所有”—在每个节点使用所有预测变量,以确保每棵树使用所有预测变量。

  • “PredictorSelection”、“interaction-curvature”-指定交互测试的用途,以选择分割预测符。

  • “代孕”,“上”-指定使用代理分割来提高准确性,因为数据集包含缺失值。

t = templateTree(“NumVariablesToSample”“所有”“PredictorSelection”“interaction-curvature”“代孕”“上”);rng (1);%为了重现性Mdl = fitrensemble(X,MPG,“方法”“包”“NumLearningCycles”, 200,“学习者”t);

Mdl是一个RegressionBaggedEnsemble模型。

估计模型 R 2 使用袋外预测。

yHat = oobPredict(Mdl);R2 = corr(mdl y,yHat)^2
R2 = 0.8744

Mdl解释了平均值周围87%的变异性。

预测器重要性估计

通过在树中排列袋外观测来估计预测器的重要性值。

impOOB = oobPermutedPredictorImportance(Mdl);

impOOB预测因子重要性估计的1 × 7向量是否与中的预测因子相对应Mdl。PredictorNames.这些估计并不偏向于包含许多水平的预测因子。

比较预测器的重要性估计。

图栏标题(“无偏预测器重要性估计”)包含(预测变量的) ylabel (“重要性”) h = gca;h.XTickLabel = Mdl.PredictorNames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;

图包含一个轴对象。标题为Unbiased Predictor Importance Estimates的坐标轴对象包含一个bar类型的对象。

更大的重要性估计表明更重要的预测因子。条形图表明Model_Year最重要的预测因素是什么气缸重量.的Model_Year气缸变量分别只有13和5个不同的级别,而重量变量有超过300个关卡。

通过排列袋外观测值来比较预测器重要性估计值和通过将每个预测器上的分裂引起的均方误差的增益相加获得的估计值。此外,获得通过代理分割估计的预测关联措施。

[impGain,predAssociation] = predictorImportance(Mdl);figure plot(1: nummel (Mdl.PredictorNames),[impOOB' impGain']) title(“预测器重要性估计比较”)包含(预测变量的) ylabel (“重要性”) h = gca;h.XTickLabel = Mdl.PredictorNames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;传奇(“OOB排列的“MSE改进”网格)

图包含一个轴对象。标题为“预测器重要性估计比较”的轴对象包含2个类型为“线”的对象。这些对象表示OOB排列,MSE改进。

的值impGain,变量位移马力,重量似乎同样重要。

predAssociation是预测关联度量的7 × 7矩阵。中的行和列对应于预测符Mdl。PredictorNames.的联想的预测测量是一个值,表示分割观察值的决策规则之间的相似性。最佳代理决策分割产生最大的关联预测度量。的元素可以推断预测器对之间关系的强度predAssociation.较大的值表明预测因子对的相关性较高。

figure imagesc(predAssociation) title(“预测关联估计”) colorbar h = gca;h.XTickLabel = Mdl.PredictorNames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;h.YTickLabel = Mdl.PredictorNames;

图包含一个轴对象。标题为“预测关联估计”的轴对象包含一个图像类型的对象。

predAssociation(1、2)
Ans = 0.6871

最大的关联是气缸位移,但该值不足以表明两个预测因子之间存在很强的关系。

使用减少的预测集生长随机森林

因为在随机森林中,预测时间随着预测器数量的增加而增加,所以一个好的做法是使用尽可能少的预测器创建一个模型。

只使用最好的两个预测器,生成一个由200棵回归树组成的随机森林。默认的“NumVariablesToSample”的价值templateTree三分之一的预测因子是回归的fitrensemble采用随机森林算法。

t = templateTree(“PredictorSelection”“interaction-curvature”“代孕”“上”“复制”,真正的);%用于随机预测器选择的再现性MdlReduced = fitrensemble(X(:,{“Model_Year”“重量”}),英里/加仑,“方法”“包”“NumLearningCycles”, 200,“学习者”t);

计算 R 2 简化模型的。

yHatReduced = oobPredict(MdlReduced);r2Reduced = corr(Mdl.Y,yHatReduced)^2
r2Reduced = 0.8653

R 2 对于简化模型是接近的 R 2 完整的模型。这一结果表明,简化后的模型是足够的预测。

另请参阅

|||||

相关的话题