
在前文中,我们已经详细介绍了决策树算法中的ID3/C4.5/CART算法的原理,以及决策树的剪枝问题。
ID3算法戳我
C4.5算法戳我
CART算法戳我
决策树剪枝问题戳我
本文将详细介绍如何用R语言实现决策树算法。
算法
区分要点
R包
ID3
使用信息增益
rpart包中rpart函数
C4.5
使用信息增益
RWeka包中J48()
CART
使用gini
rpart包中rpart函数
C5.0
C4.5的改进,比较适合于大规模数据
c50包
文章目录
数据简介
R语言实现
ID3算法
CART算法
C4.5算法
C5.0算法
数据简介
本文数据选择了红酒质量分类数据集,这是一个很经典的数据集,原数据集中“质量”这一变量取值有{3,4,5,6,7,8}。为了实现二分类问题,我们添加一个变量“等级”,并将“质量”为{3,4,5}的观测划分在等级0中,“质量”为{6,7,8}的观测划分在等级1中。
数据下载
因变量:等级
自变量:非挥发性酸性、挥发性酸性、柠檬酸、剩余糖分、氯化物、游离二氧化硫、二氧化硫总量、浓度、pH、硫酸盐、酒精
library(openxlsx)
wine = read.xlsx(".../winequality-red.xlsx") #读入数据
#将数据集分为训练集和测试集,比例为7:3
train_sub = sample(nrow(wine),7/10*nrow(wine))
train_data = wine[train_sub,]
test_data = wine[-train_sub,]
R语言实现
ID3算法
ID3算法和CART算法都是用rpart包实现的,rpart包常用参数如下:
参数
意义
formula
y yy ~ x 1 x_1x1+x 2 x_2x2+…+x n x_nxn或者y yy ~ . 指明了因变量和自变量
data
使用的数据集
na.action
缺失值处理,默认na.rpart,表示删掉因变量y yy缺失的观测,但是保留自变量缺失的观测
method
决策树的类型,“exp”用于生存分析,“poisson”用于二分类变量,“class”用于分类变量(使用居多),”anova”对应回归树
parms
只用于分类树,parms=list(split,prior,loss),其中split的选项默认"gini"(对应CART),和"information"(对应ID3算法)
control
控制决策树形状的参数
rpart包的参数详解
rpart.control的参数详解
library(rpart)
#决策树的生成
wine_decisiontree_ID3
至此,我们已经将决策树生成好,之后我们将使用rpart.plot绘制决策树
rpart.plot主要的参数有:
参数
意义
tree
所绘制的模型
type
可选1,2,3,4,控制节点的形状
fallen.leaves
默认为T
branch
控制树的外观,若branch=1则获得垂直的决策树
cex
图中符号的大小
library(rpart.plot)
rpart.plot(wine_decisiontree_ID3_prune,branch=1, fallen.leaves=T,cex=0.6)
ID3算法所绘树图:
用所得的ID3模型在测试集上预测
#在测试集上预测
pre_decisiontree_ID3
ID3算法所得AUC值为0.746
CART算法
CART算法的实现也是使用rpart包
library(rpart)
library(rpart.plot)
#决策树的生成
wine_decisiontree_cart
CART算法所绘树图:
用所得的CART模型在测试集上预测
#在测试集上预测
pre_decisiontree_cart
CART算法所得AUC值为0.718
C4.5算法
C4.5算法使用RWeka包,RWeka包的安装需要依赖于rJava包。
rJava包的安装
在安装好rJava包后,使用如下代码即可安装RWeka包
install.packages("RWeka")
library(RWeka)
我们使用RWeka包中的J48()来调用C4.5算法。
J48(formula,data,subset,na.action,control=Weka_control(u=T,c=0.25,M=2,R=T,N=3,B=T),options=NULL)
参数
意义
U
默认位TRUE,表示不剪枝
C
对剪枝过程设置置信区间
M
表示叶节点的最小样本量,默认为2
R
按错误率降低剪枝法剪枝
N
当R=TRUE时,交叉验证的折叠次数,默认为3
B
表示是否建立二叉树,默认为TRUE
#Sys.setenv(JAVA_HOME='C:\Program Files\Java\jdk1.8.0_191\jre') #看是否有必要更改环境变量
library(rJava)
library(RWeka)
library(pROC) #绘制ROC曲线
wine_decisiontree_C4_5
C4.5算法所得AUC值为0.731
C5.0算法
C5.0算法是C4.5算法的改进,使用的是c50包
library(C50)
#c50算法
#c5.0(x,y,trials=1) x表示自变量,y表示因变量,
#c5.0是一个boosting算法,trails控制循环次数
wine_decisiontree_C50
用所得的C5.0模型在测试集上预测
#在测试集上预测
pre_decisiontree_C50
C5.0算法所得AUC值为0.735