数据挖掘-决策树算法的R实现

这篇博客介绍了使用R语言实现ID3决策树算法的过程,包括数据预处理、决策树构建和结果分析。通过UCI数据库中的Iris数据集进行实验,展示了如何将连续特征离散化,并构建决策树模型。实验结果显示,最优特征为"Petal.Length",根据其值可以有效分类鸢尾花品种。
摘要由CSDN通过智能技术生成

本次为学生时期所写的实验报告,代码程序为课堂学习和自学,对网络程序有所参考,如有雷同,望指出出处,谢谢!

基础知识来自教材:李航的《统计学习方法》

本人小白,仍在不断学习中,有错误的地方恳请大佬指出,谢谢!

本次实验采用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 <-
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值