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 -> x34
。 x2 -> x33
,等等..
对于大多数节点而言,这无关紧要,因为 CART 总是将节点除以最大化两个子节点之间杂质增益的预测变量。但有时会有多个预测因子导致相同的杂质增加。然后它只选择列号最低的那个。由于列号通过重新排序预测变量而改变,您最终会在该节点得到不同的预测变量。
例如让我们看看标记的拆分:
原订单(mdl
):
颠倒顺序(mdl1
):
到目前为止,始终选择了相同的预测变量和值。名称因订单而更改,例如旧数据中的 x5
= 新模型中的 x30
。但是 x3
和 x6
实际上是不同的预测变量。翻转后的 x6
是原始顺序的 x29
。
这些预测变量之间的散点图显示了这是如何发生的:
其中蓝色和青色线分别标记了 mdl
和 mdl1
在该节点执行的拆分。正如我们所见,两次拆分都会产生每个标签具有相同数量元素的子节点!因此CART可以选择两个预测器中的任何一个,它会导致相同的杂质增益。
在那种情况下,似乎只选择列号较小的那个。在非翻转 table 中选择 x3
而不是 x29
因为 3 < 29
。但是如果你翻转 tables,x3
变成 x32
而 x29
变成 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'})
这里有一个例子提到 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 -> x34
。 x2 -> x33
,等等..
对于大多数节点而言,这无关紧要,因为 CART 总是将节点除以最大化两个子节点之间杂质增益的预测变量。但有时会有多个预测因子导致相同的杂质增加。然后它只选择列号最低的那个。由于列号通过重新排序预测变量而改变,您最终会在该节点得到不同的预测变量。
例如让我们看看标记的拆分:
原订单(mdl
):
mdl1
):
到目前为止,始终选择了相同的预测变量和值。名称因订单而更改,例如旧数据中的 x5
= 新模型中的 x30
。但是 x3
和 x6
实际上是不同的预测变量。翻转后的 x6
是原始顺序的 x29
。
这些预测变量之间的散点图显示了这是如何发生的:
其中蓝色和青色线分别标记了 mdl
和 mdl1
在该节点执行的拆分。正如我们所见,两次拆分都会产生每个标签具有相同数量元素的子节点!因此CART可以选择两个预测器中的任何一个,它会导致相同的杂质增益。
在那种情况下,似乎只选择列号较小的那个。在非翻转 table 中选择 x3
而不是 x29
因为 3 < 29
。但是如果你翻转 tables,x3
变成 x32
而 x29
变成 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'})