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

CART algorithm of matlab 'fitctree' takes account on the attributes order why ?

这里有一个例子提到 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包含 34 个预测变量。预测变量不包含名称,fitctree 仅通过列号 x1, x2, ..., x34 引用它们。如果翻转 table,列号会发生变化,因此它们的名称也会发生变化。所以x1 -> x34x2 -> x33,等等..

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

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

原订单(mdl): 颠倒顺序(mdl1):

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

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

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

在那种情况下,似乎只选择列号较小的那个。在非翻转 table 中选择 x3 而不是 x29 因为 3 < 29。但是如果你翻转 tables,x3 变成 x32x29 变成 x6。由于 6 < 32 你现在得到 x6,原来的 x29.

最终这并不重要 - 翻转后的决策树 table 没有好坏之分。它仅发生在树开始过度拟合的较低节点中。所以你真的不必关心它。

附录:

散点图生成代码:

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'})