这是一个示例,其中提到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引用它们。如果您翻转表格,则列号会更改,因此其名称也会更改。所以x1 -> x34x2 -> x33等。

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

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

原始订单(mdl):
matlab - Matlab'fitctree'的CART算法为什么考虑属性顺序?-LMLPHP
翻转订单(mdl1):
matlab - Matlab'fitctree'的CART算法为什么考虑属性顺序?-LMLPHP

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

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

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

蓝色和青色线标记分别由mdlmdl1在该节点执行的拆分。如我们所见,两个拆分都将产生每个标签具有相同数量元素的子节点!因此,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'})

08-20 02:07