决策树分析
程序员文章站
2022-05-21 23:29:55
...
使用分类树的判别
(目标变量是分类变量的判别问题)
首先通过data()函数读入数据,并通过str()函数确认其结构。
> data(Titanic)
> str(Titanic)
> Titanic[,1,2,]
\\表示第2个变量显示时为第1水平,第3个变量显示时为第2水平
然后绘制马赛克图,将交叉统计结果可视化。
> mosaicplot(Titanic[,1,2,],color=T)
可以使用rpart程序包进行决策树分析。由于该程序包以数据框类型作为对象,因此我们使用epitools程序包的expand.table()函数把刚才统计的泰坦尼克号数据转换成数据框,然后再进行分析。
> install.packages("epitools")
> library(epitools)
> Titanic.df <- expand.table(Titanic)
> library(rpart)
> Titanic.tree <- rpart(Survived~.,data=Titanic.df,
+ method="class")
\\rpart中的第1个参数是formula
> summary(Titanic.tree)
\\记录条数(n),各分割数(nsplit)所对应的复杂性参数(CP),变量的显著性,其后是各个节点的期望损失,分割后的记录条数,以及用下一个变量来分割后的改善等。
我们用partykit程序包进行可视化。不过,需要提前通过as.party()函数把刚才的结果转换成party形式。
> install.package("partykit")
> library(partykit)
> plot(as.party(Titanic.tree))
\\另外通过plotcp()函数来画图:
> plotcp(Titanic.tree)
\\关于数值的细节,可以从summary()函数的结果中读取:
> Titanic.tree2 <- rpart(Survived~.,data=Titanic.df,
+ method="class",cp=0.083)
> summary(Titanic.tree2)
> plot(as.party(Titanic.tree2))
使用回归树的预测。
(目标变量为数值变量时的预测问题)
首先读入数据:
> library(ggplot2)
> data(diamonds)
由于数据量很大,因此要通过subset()函数缩小范围后查看数据。当书写成x %in% c(a,b,c)的形式时,如果x是a、b、c中的一个,则返回TRUE,则返回FALSE。
> diamonds2 <- subset(diamonds,subset=
+ carat >= 1.5 & carat < 2 &
+ clarity %in% c("I1","SI2"))
>boxplot(diamonds2$price)
\\使用箱型图或直方图来观察分布
接下来,使用rpart()函数,从carat,cut,color以及clarity这4个方面来解释price。由于目标变量是数值变量,因此是把method参数指定为anova。
> str(diamonds)
> diamonds.tree <- rpart(formula=price~carat+cut+color+clarity,
data=diamonds,method="anova")
\\然后绘制结果数据的树结构
> plot(as.party(diamonds.tree))
这里和刚才的区别就是,由于解释变量包含了数值变量carat,因此将该变量作为基准值来分类;此外,由于目标变量为数值变量,因此和分类树中使用带状图显示分类变量的比例不同,这里使用箱型图来显示数值变量的分布。
最后,执行预测。把原数据前5万条作为训练集,剩下的作为测试数据。根据计算结果,用predict()函数预测测试数据。这里使用head()函数只显示前几行。
> train <- diamonds[1:50000,]
> test <- diamonds[50001:nrow(diamonds),]
> diamonds.tree2 <- rpart(
+ formula=price~carat+cut+color+clarity,
+ data=train,method="anova",cp=0.078)
> p <-predict(diamonds.tree2,newdata=test)
> head(p)