决策树中的有序属性

数据挖掘 机器学习 分类 决策树
2021-09-23 06:57:19

我正在阅读Tan、Steinbeck 和 Kumar的《数据挖掘简介》一书。在关于决策树的章节中,当谈到“表达属性测试条件的方法”时,书中说:

“Ordinal 属性也可以产生二元或多路拆分。Ordinal 属性值可以进行分组,只要分组不违反属性值的 order 属性即可。图 4.10 说明了基于 Shirt Size 属性拆分训练记录的各种方法。图 4.10(a) 和 (b) 中所示的分组保留了属性值之间的顺序,而图 a.10(c) 中所示的分组违反了此属性,因为它将属性值 Small 和 Large 组合到同一个分区中,而 Medium和 Extra Large 合并到另一个分区中。”

在此处输入图像描述

为什么有序属性值可以分组,只要分组不违反属性值的顺序属性

2个回答

我想说决策树中有序和无序因素的不同处理更多的是约定和实现细节,而不是必要性。

但这也是一个重要的优化功能。请参阅此处的文档 rpart

我们已经说过,对于具有水平,所有2(-1) 测试了不同的可能拆分..

幸运的是,对于任何有序的结果,都有一个计算捷径,允许程序仅使用 -1 比较。

如您所见,有序因子的处理可能非常有效。

因此,我的建议 - 作为特征工程的一部分,决定是使用有序因子还是无序因子:

仅当它与输出变量高度相关时才使用有序因子,否则回退到无序因子

Bellow 是一个简单的例子,一个以有序因子为特征的分散输出变量如何使决策树变得非常深且无效。

> df
  X Y
1 1 0
2 2 1
3 3 0
4 4 1
> str(df)
'data.frame':   4 obs. of  2 variables:
 $ X: Ord.factor w/ 4 levels "1"<"2"<"3"<"4": 1 2 3 4
 $ Y: num  0 1 0 1

注意输出变量 与有序因子高度不相关。

> fit <- rpart(Y ~ X, method="class", data = df, control=rpart.control(minsplit = 1))  
> print(fit)
n= 4 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 4 2 0 (0.50000000 0.50000000)  
   2) X=1 1 0 0 (1.00000000 0.00000000) *
   3) X=2,3,4 3 1 1 (0.33333333 0.66666667)  
     6) X=3,4 2 1 0 (0.50000000 0.50000000)  
      12) X=1,2,3 1 0 0 (1.00000000 0.00000000) *
      13) X=4 1 0 1 (0.00000000 1.00000000) *
     7) X=1,2 1 0 1 (0.00000000 1.00000000) *

这导致了一个深度(且不可扩展)的决策树。

在此处输入图像描述

使因子无序导致最优决策树。

> df
  X Y
1 1 0
2 2 1
3 3 0
4 4 1
> str(df)
'data.frame':   4 obs. of  2 variables:
 $ X: Factor w/ 4 levels "1","2","3","4": 1 2 3 4
 $ Y: num  0 1 0 1
> 

> fit <- rpart(Y ~ X, method="class", data = df, control=rpart.control(minsplit = 1))  
> print(fit)
n= 4 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 4 2 0 (0.50000000 0.50000000)  
  2) X=1,3 2 0 0 (1.00000000 0.00000000) *
  3) X=2,4 2 0 1 (0.00000000 1.00000000) *

在此处输入图像描述

我想原因很清楚。我们通常将事物拆分为不矛盾的特定部分。一个特殊的东西可以是小型的和中型的,作为一个组,也可以是大的,作为另一个组。但它不能同时又小又大。关键是您的数据中有一个序列。如果没有这样的东西,你可以有不同的属性值组合。假设您有一组水果的属性值。它可以是苹果、菠萝和西瓜。由于没有序数,您可以拥有所有可能的二进制拆分组合;在前一种情况下,您不能因为您的二进制拆分以某种方式违反了逻辑顺序。