matlab'fitctree'的CART算法考虑属性顺序为啥?

Posted

技术标签:

【中文标题】matlab\'fitctree\'的CART算法考虑属性顺序为啥?【英文标题】:CART algorithm of matlab 'fitctree' takes account on the attributes order why ?matlab'fitctree'的CART算法考虑属性顺序为什么? 【发布时间】:2017-11-16 12:31:28 【问题描述】:

这是一个例子,提到 matlab 的 fitctree 考虑了特征顺序!为什么?

load ionosphere % Contains X and Y variables
Mdl = fitctree(X,Y)
view(Mdl,'mode','graph');
X1=fliplr(X);
Mdl1 = fitctree(X1,Y)
view(Mdl1,'mode','graph');

不是同一个模型,因此尽管处理相同的特征,分类精度也不一样?

【问题讨论】:

这不是在更改标签时重新排序。 X 表示特征矩阵,Y 表示类标签的 comlumn 向量。下面是一个简单的例子:假设我们有 2 种人,一个显眼又贪婪的人,如果他得到 5 个苹果和 3 个香蕉或 2 个苹果和 2 个香蕉,他会很高兴,如果他得到 10 个苹果和 9 个香蕉,另一个人不会或者 8 个苹果和 8 个香蕉,因为他很贪吃。在这种情况下:训练矩阵 X 将是 '[5 3 ; 2 2 ; 10 9; 8 8]和Y会[快乐快乐愤怒愤怒]'。通常,如果我们置换我们的特征,即 [5 2 10 8]' 和 [3 2 9 8 ],我们会得到相同的模型 当我运行你的代码时,我得到了非常相似的树,只有非常非常小的差异。我认为唯一的区别是因为要划分类 A=[2 1 2 1] 和类 B=[5 6 5 6 ],您可以在 (2-5) 之间进行划分,并且分类将是完美的。数值求解器落在中间某处,并正确分类,因此停止。 即使分类正确,通常它应该呈现相同的模型,因为特征的顺序无关紧要。如果 [2 1 2 1 ; 5 6 5 6 ] 是 Y=[A B]' 的训练矩阵,因此如果我们使用 [1 1 2 2 ,模型应该是相同的; 6 6 5 5 ] 对于相同的 Y,对吗? 【参考方案1】:

在您的示例中,X包含 34 个预测变量。预测变量不包含名称,fitctree 仅通过列号 x1, x2, ..., x34 引用它们。如果翻转表格,列号会发生变化,因此它们的名称也会发生变化。所以x1 -> x34x2 -> x33等。

对于大多数节点,这无关紧要,因为 CART 总是将节点除以最大化两个子节点之间的杂质增益的预测因子。但有时有多个预测因子会导致相同的杂质增益。然后它只选择列号最低的那个。并且由于通过重新排序预测变量来更改列号,因此您最终会在该节点处获得不同的预测变量。

例如让我们看看标记的拆分:

原始订单(mdl): 翻转订单 (mdl1):

到目前为止,始终选择相同的预测变量和值。名称因订单而更改,例如旧数据中的x5 = 新模型中的x30。但x3x6 实际上是不同的预测器。翻转顺序中的x6 是原始顺序中的x29

这些预测变量之间的散点图显示了这是如何发生的:

蓝色和青色线分别标记mdlmdl1 在该节点执行的拆分。正如我们所看到的,两个拆分都会产生每个标签具有相同数量元素的子节点!因此 CART 可以选择两个预测因子中的任何一个,它会导致相同的杂质增益。

在这种情况下,它似乎只选择列号较低的那个。在非翻转表中选择x3 而不是x29,因为3 < 29。但是,如果您翻转表格,x3 将变为 x32x29 将变为 x6。由于6 < 32,您现在以x6 结束,原来的x29

最终这无关紧要——翻转表的决策树没有好坏之分。它只发生在树开始过度拟合的较低节点中。所以你真的不必关心它。

附录:

散点图生成代码:

load ionosphere % Contains X and Y variables
Mdl = fitctree(X,Y);
view(Mdl,'mode','graph');
X1=fliplr(X);
Mdl1 = fitctree(X1,Y);
view(Mdl1,'mode','graph');

idx = (X(:,5)>=0.23154 & X(:,27)>=0.999945 & X(:,1)>=0.5);
remainder = X(idx,:);
labels = cell2mat(Y(idx,:));

gscatter(remainder(:,3), remainder(:,(35-6)), labels,'rgb','osd');

limits = [-1.5 1.5];
xlim(limits)
ylim(limits)
xlabel('predictor 3')
ylabel('predictor 29')
hold on
plot([0.73 0.73], limits, '-b')
plot(limits, [0.693 0.693], '-c')
legend('b' 'g')

【讨论】:

非常感谢您的解释。但是,即使我们对它们重新排序,即使“多个预测器将导致相同的杂质增益”,为什么决策树也不考虑相同的预测器来构建树? @LMarwa 我扩展了解释。现在清楚了吗?

以上是关于matlab'fitctree'的CART算法考虑属性顺序为啥?的主要内容,如果未能解决你的问题,请参考以下文章

决策树之CART算法

决策树的剪枝

机器学习算法决策树-5 CART回归树法,M5回归树算法对CART算法改进了什么

机器学习算法决策树-4 CART算法和CHAID算法

CART算法

CART分类回归树算法