这是一个示例,其中提到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 -> 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'})