这个示例展示了如何在生长随机回归树森林时为您的数据集选择适当的分割预测器选择技术。这个示例还展示了如何决定在训练数据中包含哪些最重要的预测因子。
加载carbig
数据集。考虑一个模型,它可以根据汽缸数量、发动机排量、马力、重量、加速度、车型年份和原产国来预测汽车的燃油经济性。考虑气缸
,Model_Year
,起源
作为分类变量。
负载carbig气缸=分类(缸);Model_Year =分类(Model_Year);起源=分类(cellstr(起源));X =表(汽缸、排量、马力、重量、加速度,Model_Year,起源);
标准的CART算法倾向于将具有许多唯一值(层次)的预测器(例如,连续变量)与具有较少层次(例如,分类变量)的预测器分开。如果您的数据是异构的,或者您的预测变量在其级别的数量上差异很大,那么考虑使用曲率或交互测试来选择分裂预测器,而不是标准的CART。
对于每个预测器,确定数据中水平的数量。一种方法是定义一个匿名函数:
使用。将所有变量转换为类别数据类型分类
确定所有独特的类别,同时忽略缺失的值使用类别
使用元素个数
然后,将函数应用到每个变量varfun
.
countLevels = @ (x)元素个数(类别(类别(x)));numLevels = varfun (countLevels X,“OutputFormat”,“统一”);
比较预测变量之间的水平数量。
图酒吧(numLevels)标题(“预测因素中的水平数量”)包含(预测变量的) ylabel (的层数) h = gca;h.XTickLabel = X.Properties.VariableNames (1: end-1);h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;
连续变量比分类变量有更多的层次。由于预测器之间的水平数量差异很大,使用标准CART在随机森林中树的每个节点上选择分裂预测器可能会产生不准确的预测器重要性估计。在这种情况下,使用曲率测试或交互测试。属性指定算法“PredictorSelection”
名称-值对的论点。有关详细信息,请参见选择分裂预测器选择技术.
训练一个由200棵回归树组成的袋装集合来估计预测器的重要值。使用以下名称-值对参数定义树学习器:
“NumVariablesToSample”、“所有”
—在每个节点使用所有预测变量,确保每棵树都使用所有预测变量。
“PredictorSelection”、“interaction-curvature”
—指定交互测试的使用情况以选择分离预测器。
“代孕”,“上”
-指定代理分割的用法,以提高准确性,因为数据集包含缺失的值。
t = templateTree (“NumVariablesToSample”,“所有”,...“PredictorSelection”,“interaction-curvature”,“代孕”,“上”);rng (1);%的再现性Mdl = fitrensemble (X,英里/加仑,“方法”,“包”,“NumLearningCycles”, 200,...“学习者”t);
Mdl
是一个RegressionBaggedEnsemble
模型。
估计模型 使用out-of-bag预测。
yHat = oobPredict (Mdl);(R2 = corr Mdl.Y yHat) ^ 2
R2 = 0.8744
Mdl
解释了均值附近87%的可变性。
通过在树之间排列袋子外的观测值来估计预测器的重要值。
impOOB = oobPermutedPredictorImportance (Mdl);
impOOB
1乘7的预测器重要性估计向量是否与中的预测器相对应Mdl。PredictorNames
.这些估计并不偏向于包含多个层次的预测指标。
比较预测器的重要性估计。
图酒吧(impOOB)标题(“不偏不倚的预测因素重要性估计”)包含(预测变量的) ylabel (“重要性”) h = gca;h.XTickLabel = Mdl.PredictorNames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;
更重要的估计表明更重要的预测因素。条形图表明Model_Year
最重要的预测因素是什么气缸
和重量
.的Model_Year
和气缸
变量分别只有13和5个不同的层次,而重量
变量有超过300个关卡。
比较预测器的重要性估计,通过排列出袋外的观察和那些估计,得到的收益,在均方误差中由于每个预测器的分裂。另外,获得由代理分割估计的预测器关联度量。
[impGain, predAssociation] = predictorImportance (Mdl);图1:numel(Mdl.PredictorNames),[impOOB' impGain']“预测因子重要性估计比较”)包含(预测变量的) ylabel (“重要性”) h = gca;h.XTickLabel = Mdl.PredictorNames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;传奇(“OOB排列的,“MSE改进”网格)在
根据的值impGain
,变量位移
,马力
,重量
似乎同样重要。
predAssociation
是一个7 × 7的预测器关联度量矩阵。行和列对应于Mdl。PredictorNames
.的联想预测测量是一个值,该值指示分割观察的决策规则之间的相似性。最好的代理决策分割产生最大的关联预测度量。使用的元素可以推断出对预测器之间关系的强度predAssociation
.数值越大表明预测因子的相关性越高。
图显示亮度图像(predAssociation)标题(“预测协会估计”) 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);
计算 简化模型。
yHatReduced = oobPredict (MdlReduced);r2Reduced = corr (Mdl.Y yHatReduced) ^ 2
r2Reduced = 0.8653
的 对于简化后的模型是接近于 完整模型的。这一结果表明,简化模型是足够的预测。
templateTree
|fitrensemble
|oobPredict
|oobPermutedPredictorImportance
|predictorImportance
|相关系数