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 -> x34
。 x2 -> x33
等。
对于大多数节点,这无关紧要,因为 CART 总是将节点除以最大化两个子节点之间的杂质增益的预测因子。但有时有多个预测因子会导致相同的杂质增益。然后它只选择列号最低的那个。并且由于通过重新排序预测变量来更改列号,因此您最终会在该节点处获得不同的预测变量。
例如让我们看看标记的拆分:
原始订单(mdl
):
翻转订单 (mdl1
):
到目前为止,始终选择相同的预测变量和值。名称因订单而更改,例如旧数据中的x5
= 新模型中的x30
。但x3
和x6
实际上是不同的预测器。翻转顺序中的x6
是原始顺序中的x29
。
这些预测变量之间的散点图显示了这是如何发生的:
蓝色和青色线分别标记mdl
和mdl1
在该节点执行的拆分。正如我们所看到的,两个拆分都会产生每个标签具有相同数量元素的子节点!因此 CART 可以选择两个预测因子中的任何一个,它会导致相同的杂质增益。
在这种情况下,它似乎只选择列号较低的那个。在非翻转表中选择x3
而不是x29
,因为3 < 29
。但是,如果您翻转表格,x3
将变为 x32
,x29
将变为 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算法考虑属性顺序为啥?的主要内容,如果未能解决你的问题,请参考以下文章