matlab的CART算法' fitctree'考虑到属性顺序为什么?

时间:2017-06-14 11:21:37

标签: matlab tree classification cart decision-tree

这里有一个例子提到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');

虽然处理相同的功能,但不是相同的模型,因此分类准确度不同?

1 个答案:

答案 0 :(得分:0)

在您的示例中,X包含34个预测变量。预测变量不包含任何名称,fitctree只是通过列号x1, x2, ..., x34引用它们。如果您翻转表格,则列号会更改,因此会更改其名称。所以x1 -> x34x2 -> x33等等。

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

E.g。让我们来看看标记的分裂:

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

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

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

complot

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

在这种情况下,似乎只选择具有较低列数的那个。在未翻转的表格x3中,选择x29代替3 < 29,因为x3。但如果您翻转表格,x32变为x29x6变为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'})

最终这没关系 - 翻转表的决策树不是更好或更差。它只发生在树开始过度拟合的较低节点中。所以你真的不必关心它。

<强>附录

散点图生成代码:

ls -1Ap /var/ | grep -v /