本次为学生时期所写的实验报告,代码程序为课堂学习和自学,对网络程序有所参考,如有雷同,望指出出处,谢谢!
基础知识来自教材:李航的《统计学习方法》
本人小白,仍在不断学习中,有错误的地方恳请大佬指出,谢谢!
本次实验采用ID3算法进行决策树的建立
一、代码实现(R语言)
1.前置函数编写
#前置函数:
#1.熵值计算函数
my_entropy<-function(X){ #X为n维向量,在决策树模型中,X指其各类取值的频数分布向量
p = prop.table(X) #prop.table为频率统计函数;p:包含每一个xi所占总体比例的n维向量
single_value <- p*log(p) #single_value储存每一个p对应的熵值,为n维向量
single_value[X == 0] <- 0 #如果有0概率,令0log0=0
value <- -sum(single_value) #value存储每个xi的熵值和,得到向量X的总熵
value
}
#2.信息增益计算函数
my_extra <- function(X,y){ #X,y均为向量,在决策树模型中一般认为X为指定的特征向量,y为因变量
#计算经验熵(未分类时y的总熵)
former_entropy = my_entropy(as.vector(table(y)))
#使用table求y的频数分布表,再将其向量化,计算总熵
table = table(X,y)
#建立X与y的频数分布表格,其中行名为特征变量X的各可能取值,列名为因变量y的可取值;
#第(i,j)元的数值即为给定特征变量取值为i时y的种类为j的个数
#计算特征的每个取值所占的比例
p=prop.table(rowSums(table(X,y)))
#rowSums:表示每一行的数值和,rowSums(table)相当于特征X每个取值的频数分布向量
#prop.table为频率统计函数
#每个给定特征取值下y的熵;
single_entropy = apply(table,1,my_entropy)
#使用apply并行计算,按行的顺序,对每一行向量求熵
#每一行向量内容为给定特征的某个取值下y的频数分布
#给定X下y的条件熵(即为每个特征取值的比例乘上取该值时y的熵的总和)
after_entropy = p%*%single_entropy
#信息增益:经验熵-条件熵
extra =former_entropy-after_entropy
extra
}
2.ID3决策树函数编写
#本函数采用data.tree程序包来绘制各结点,需先加载data.tree程序包
library(data.tree) #本函数涉及数据框的数据处理等操作,需先加载dplyr程序包,以便使用函数select
library(dplyr)
#决策树函数
my_decision_tree<- function(data,y,root,threshold){
#data数据集包含特征变量和因变量(要求最后一列为因变量);
#y为单独输入的因变量向量;
#root是Node {data.tree}定义的事先已生成根结点的"Node"类型的值,可自行命名;
#threshold为阈值
if(length(levels(factor(y)))==1){
#1.如果y值中种类只有一类,则直接生成只有该类名称的叶结点
#level和factor函数提取y中含有的种类,种类只有一类时,该函数提取出的值的长度为1
class = levels(factor(y)) #y的种类
child <- root$AddChild(class) #生成树的叶结点 (标签为y的种类名)
root$feature <-colnames(data)[ncol(data)] #此时根节点的特征即为因变量y的名称
child$feature <-