决策树
决策树(Decision Tree)是一种基本的分类和回归方法。
1、 回归树:用于预测定量数据,响应预测值取它所属的叶节点内训练集的平均响应值;
2、 分类树:用于预测定性数据,给定观测值被预测为它所属的叶节点内训练集中最常见的类别(多数表决)。
构造过程:特征选择→决策树的生成→决策树的剪枝
回归树 RSS作为确定分割点的准则
分类树 分类错误率作为确定分割点的准则
1) 分类错误率:
,其中
代表第m个区域的训练集中第k类所占的比例。
在实践中存在另外两个指标:
2) 基尼系数:
,衡量K个类别的总方差。不难发现,当某结点的观测值几乎来自同一类别,G的值越小。
3) 信息增益(互信息):
,
.
###公式和图片不会添加,感兴趣的朋友可以下载附件,有详细的分析过程。
rm(list=ls())
library(tree) #加载tree包以建立分类树和回归树
data("Carseats")
attach(Carseats)
High=ifelse(Sales<=8,"No","Yes") #创建高销量变量
Carseats=data.frame(Carseats,High)
dim(Carseats) #400 12
tree.carseats=tree(High~.-Sales,data=Carseats)
summary(tree.carseats)
###生成####
set.seed(2)
train=sample(1:nrow(Carseats),200) #200个训练集 200个测试集
Carseats.test=Carseats[-train,] #测试数据
High.test=High[-train]
tree.carseats=tree(High~.-Sales,Carseats,subset = train)
tree.carseats
par(mfrow=c(1,1))
plot(tree.carseats)
text(tree.carseats,pretty=0)
tree.pred=predict(tree.carseats,Carseats.test,type="class")
table(tree.pred,High.test)
(86+57)/200 #测试集预测的准确率为(86+57)/200=0.715
###剪枝####
set.seed(3)
cv.carseats=cv.tree(tree.carseats,FUN=prune.misclass)
names(cv.carseats)
par(mfrow=c(1,2))
plot(cv.carseats$size,cv.carseats$dev,type="b") #错误率对树规模size的函数
plot(cv.carseats$k,cv.carseats$dev,type="b") #错误率对复杂度k的函数
par(mfrow=c(1,1))
prune.carseats=prune.misclass(tree.carseats,best=9)
plot(prune.carseats)
text(prune.carseats,pretty=0)
tree.pred=predict(prune.carseats,Carseats.test,type="class")
table(tree.pred,High.test)
(96+60)/200 #测试集预测的准确率为(96+60)/200=0.78
#####回归树####
library(MASS)
data("Boston")
set.seed(1)
train=sample(1:nrow(Boston),nrow(Boston)/2)
tree.boston=tree(medv~.,Boston,subset=train) #房价中位数
plot(tree.boston)
text(tree.boston,pretty=0)
cv.boston=cv.tree(tree.boston)
plot(cv.boston$size,cv.boston$dev,type="b")
prune.boston=prune.tree(tree.boston,best=5)
plot(prune.boston)
text(prune.boston,pretty=0)
yhat=predict(tree.boston,newdata = Boston[-train,])
boston.test=Boston[-train,"medv"]
plot(yhat,boston.test)
abline(0,1)
mean((yhat-boston.test)^2) #25