选择随机森林的预测器
这个例子展示了在生长随机回归树森林时,如何为数据集选择适当的分割预测器选择技术。这个例子还展示了如何决定哪些预测因子是最重要的,应该包含在训练数据中。
加载和预处理数据
加载carbig
数据集。考虑一个模型,该模型根据汽车的气缸数量、发动机排量、马力、重量、加速度、车型年份和原产国来预测汽车的燃油经济性。考虑气缸
,Model_Year
,起源
作为分类变量。
负载carbig圆柱=分类(圆柱);Model_Year = categorical(Model_Year);Origin = categorical(cellstr(Origin));X =表(气缸,排量,马力,重量,加速度,型号,年份,起源);
确定预测词的级别
标准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,MPG,“方法”,“包”,“NumLearningCycles”, 200,...“学习者”t);
Mdl
是一个RegressionBaggedEnsemble
模型。
估计模型 使用袋外预测。
yHat = oobPredict(Mdl);R2 = corr(mld . y,yHat)^2
R2 = 0.8744
Mdl
解释了均值附近87%的变异性。
预测因子重要性估计
通过在树之间排列袋外观测值来估计预测器的重要性值。
impOOB = oobPermutedPredictorImportance(Mdl);
impOOB
预测器重要性估计的1 × 7向量是否对应于预测器Mdl。PredictorNames
.这些估计并不偏向于包含多个层次的预测因子。
比较预测器的重要性估计值。
图形栏(impOOB)标题(“无偏预测重要性估计”)包含(预测变量的) ylabel (“重要性”) h = gca;h.XTickLabel = mld . predictornames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;
更重要的估计表明更重要的预测因素。条形图说明了这一点Model_Year
是最重要的预测因素,其次是气缸
和重量
.的Model_Year
和气缸
变量分别只有13个和5个不同的层次,而重量
变量有超过300个级别。
通过排列袋外观测值,比较预测器重要性估计值和由于每个预测器的分割而获得的均方误差的增益之和。此外,通过代理分割获得预测器关联度量。
[impGain,predAssociation] = predictorImportance(Mdl);figure plot(1:numel(mld . predictornames),[impOOB' impGain'])“预测因素重要性估计比较”)包含(预测变量的) ylabel (“重要性”) h = gca;h.XTickLabel = mld . predictornames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;传奇(“OOB排列的,“MSE改进”网格)在
根据的值impGain
,变量位移
,马力
,重量
显得同样重要。
predAssociation
是一个7 × 7的预测器关联度量矩阵。中的行和列对应于预测器Mdl。PredictorNames
.的联想的预测测量指示拆分观察结果的决策规则之间的相似性的值。最佳代理决策分割产生最大的关联预测度量。的元素可以推断预测因子对之间关系的强度predAssociation
.数值越大表示预测因子对的相关性越高。
图imagesc(predAssociation)“预测者关联估计”) colorbar h = gca;h.XTickLabel = mld . predictornames;h.XTickLabelRotation = 45;h.TickLabelInterpreter =“没有”;. yticklabel = mld . 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(mld . y,yHatReduced)^2
r2Reduced = 0.8653
的 由于简化模型接近于 完整的模型。这一结果表明,简化模型足以用于预测。
另请参阅
templateTree
|fitrensemble
|oobPredict
|oobPermutedPredictorImportance
|predictorImportance
|相关系数