这里有一个例子提到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');
虽然处理相同的功能,但不是相同的模型,因此分类准确度不同?
答案 0 :(得分:0)
在您的示例中,X
包含34个预测变量。预测变量不包含任何名称,fitctree
只是通过列号x1, x2, ..., x34
引用它们。如果您翻转表格,则列号会更改,因此会更改其名称。所以x1 -> x34
。 x2 -> x33
等等。
对于大多数节点而言,这并不重要,因为CART总是将节点除以最大化两个子节点之间的杂质增益的预测器。但有时会有多个预测因子导致相同的杂质增益。然后它只选择具有最低列数的那个。由于通过重新排序预测变量来更改列号,因此您最终会在该节点上使用不同的预测变量。
E.g。让我们来看看标记的分裂:
到目前为止,总是选择相同的预测变量和值。名称因订单而更改,例如新模型中旧数据中的x5
= x30
。但x3
和x6
实际上是不同的预测因素。翻转顺序中的x6
按原始顺序为x29
。
这些预测变量之间的散点图显示了这种情况如何发生:
蓝色和青色线分别标记mdl
和mdl1
在该节点处执行的拆分。正如我们所看到的,两个splits都会生成每个标签具有相同元素数的子节点!因此,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'})
。
最终这没关系 - 翻转表的决策树不是更好或更差。它只发生在树开始过度拟合的较低节点中。所以你真的不必关心它。
<强>附录强>
散点图生成代码:
ls -1Ap /var/ | grep -v /