今天学习了分类算法中的决策树。博大精深。
一、基本信息
1、名称区别:决策树是统称,也称为分类树(分类变量)、回归树(连续变量)。
2、定义:决策树模型是一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,不怕噪声数据和缺失数据。
a、直观明了,神经网络 (这种方法的权重以及预测机制往往让人觉得很不透明) 等预测方法。
b、对缺失值的处理,是删除因变量缺失的观测 ,而保留有自变量缺失的观测 。
3、决策树建模步骤:
1、如何选择自变量
2、如何选择分割点
3、确定停止划分的条件
二、常见分类
1、3种最常见的决策树:
CART分类回归树(classification and regression tree)。每个节点采用二分法(与C4.5最大的区别,c4.5可以有很多分支);用Gini Ratio作为衡量指标,如果分散指标程度很高的说明数据有很多类别。
C4.5。最新有5.0版本;先建完整的决策树;使用自定义的错误率(Predicted Error Rate)对节点修剪。
CHAID 卡方自动交互检验 (Chi-squared Automatic Interaction)。计算节点中类别的p值。根据p值的大小决定决策树是否生长不需要修剪(与前两者的区别)。
2、聚类分析、判别分析、分类树的区别
三、R语言中rpart包与party包的区别
1、CP参数定义
cp: complexity parameter复杂性参数,用来修剪树的.
当决策树复杂度超过一定程度后,随着复杂度的提高,测试集的分类精确度反而会降低。因此,建立的决策树不宜太复杂,需进行剪枝。该剪枝算法依赖于复杂性参数cp,cp随树复杂度的增加而减小,当增加一个节点引起的分类精确度变化量小于树复杂度变化的cp倍时,则须剪去该节点。故建立一棵既能精确分类,又不过度适合的决策树的关键是求解一个合适的cp值。一般选择错判率最小值对应的cp值来修树.
2、CP选择问题
建立树模型要权衡两方面问题,一个是要拟合得使分组后的变异较小,另一个是要防止过度拟合,而使模型的误差过大,前者的参数是CP,后者的参数是Xerror。所以要在Xerror最小的情况下,也使CP尽量小。
四、决策树建模步骤详解
1、生成随机数——runif(nrow(x),0,1)
2、将数据集进行划分,训练集与测试集
titanic.train <- titanic[x < .4,]
titanic.test <- titanic[x>= .4,]
选取了x变量 小于0.4 或 大于0.4 为训练集
- library(rpart);
-
- ## rpart.control对树进行一些设置
- ## xval是10折交叉验证
- ## minsplit是最小分支节点数,这里指大于等于20,那么该节点会继续分划下去,否则停止
- ## minbucket:叶子节点最小样本数
- ## maxdepth:树的深度
- ## cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度
- ct <- rpart.control(xval=10, minsplit=20, cp=0.1)
-
- ## kyphosis是rpart这个包自带的数据集
- ## na.action:缺失数据的处理办法,默认为删除因变量缺失的观测而保留自变量缺失的观测。
- ## method:树的末端数据类型选择相应的变量分割方法:
- ## 连续性method=“anova”,离散型method=“class”,计数型method=“poisson”,生存分析型method=“exp”
- ## parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法(gini和information)
- ## cost我觉得是损失矩阵,在剪枝的时候,叶子节点的加权误差与父节点的误差进行比较,考虑损失矩阵的时候,从将“减少-误差”调整为“减少-损失”
- fit <- rpart(Kyphosis~Age + Number + Start,
- data=kyphosis, method="class",control=ct,
- parms = list(prior = c(0.65,0.35), split = "information"));
-
- ## 第一种
- par(mfrow=c(1,3));
- plot(fit);
- text(fit,use.n=T,all=T,cex=0.9);
-
- ## 第二种,这种会更漂亮一些
- library(rpart.plot);
- rpart.plot(fit, branch=1, branch.type=2, type=1, extra=102,
- shadow.col="gray", box.col="green",
- border.col="blue", split.col="red",
- split.cex=1.2, main="Kyphosis决策树");
-
- ## rpart包提供了复杂度损失修剪的修剪方法,printcp会告诉分裂到每一层,cp是多少,平均相对误差是多少
- ## 交叉验证的估计误差(“xerror”列),以及标准误差(“xstd”列),平均相对误差=xerror±xstd
- printcp(fit);
-
- ## 通过上面的分析来确定cp的值
- ## 我们可以用下面的办法选择具有最小xerror的cp的办法:
- ## prune(fit, cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])
-
- fit2 <- prune(fit, cp=0.01);
- rpart.plot(fit2, branch=1, branch.type=2, type=1, extra=102,
- shadow.col="gray", box.col="green",
- border.col="blue", split.col="red",
- split.cex=1.2, main="Kyphosis决策树");
欢迎大牛们一起交流~