如何控制决策树?

数据挖掘 机器学习 r 决策树
2021-09-29 01:21:42

这是我的决策树 R 脚本:

    library(caret)
    library(rpart.plot)
    library(plyr)
    library(dplyr)
    library(rpart)
    
    data("iris")
    
    names(iris) = tolower(names(iris))
    
    table(iris$species)
    suppressMessages(library(caret))
    
    index = createDataPartition(y=iris$species, p=0.7, list=FALSE)
    
    train = iris[index,]
    test = iris[-index,]
    
    trainctrl <- trainControl(method = "cv", number = 5, verboseIter = FALSE)

dt.model <- train(species~., data=train, method = "rpart", 
                  tuneLength = 10,
                  preProcess = c("center", "scale"),
                  trControl = trainctrl,
                  metric="Kappa")

dt.predict <-predict(dt.model, test)
confusionMatrix(dt.predict, test$species)

rpart.plot(dt.model$finalModel)
varImp(dt.model)

我的功能重要性是:

> varImp(dt.model)
rpart variable importance

             Overall
petal.width   100.00
petal.length   96.95
sepal.length   45.08
sepal.width     0.00

有没有办法考虑减少花瓣宽度?例如,我希望我的树使用比花瓣宽度更多的花瓣长度和萼片长度。是否可以?


我的问题是,在我使用决策树的数据集中,一个变量 x 的使用比其他变量多。然而,这个 x 变量会影响另一个 y 变量的值,该变量实际上是我的类的特征。以 Iris 为例:这就像说petal.length 与petal.width 成比例相关,即:

petal.width petal.length class
1            4           Virginica
1            6           Setosa
2            6            Virginica
2            7            Setosa

我的模型将基础类更多地区分为我的数据集的“petal.width”而不是“petal.lenght”。为此,我想对这些特征赋予不同的权重

2个回答

据我所知,只有两种方法可以使用比决策树正常使用“更少”的特定功能:

  • 完全删除该功能。
  • 修改数据,使该功能与其他功能相比变得不那么重要(不要这样做,这很复杂且毫无意义)

重要的是要理解决策树学习算法通过选择数据中最具区分性的特征来决定在每个节点使用哪个特征,即预测目标标签信息量最大的特征。所以使用一个特定的特征“少”意味着选择使用哪个特征不是基于根据数据预测目标的最佳方法......所以它不会真正遵循训练决策树的逻辑。

在你写的评论中:

我不能排除它,因为它与其他功能有关

如果您的意思是其他两个功能相关,您可以添加列以显式显示这些关系,然后删除原始列。例如添加一个名为petal.width.plus.length然后删除的列petal.width

退后一步,我认为您的问题可以改写为决策树最终处于局部最小值,因此无法找到最佳解决方案?如果是这样,考虑另一种算法?例如随机森林、GBM(例如 XGBoost)甚至深度学习。

如果其他算法也没有达到您的预期,您还应该考虑到数据并没有说明您的想法。也许您需要收集更多数据,或者对某些行进行过采样,或者寻找错误(例如,某些数据已经变成了NAs)。

最后(我想这是您所问问题的答案)您可以手动分区您认为最重要的字段上的数据,然后为每个分区构建决策树。由于您每次都需要这样做,因此predict您肯定想编写自己的包装类来存储分区。