楼主: Lisrelchen
8637 5

[Machine Learning]机器学习算法的R语言实现:决策树算法 [推广有奖]

  • 0关注
  • 62粉丝

VIP

已卖:4194份资源

院士

67%

还不是VIP/贵宾

-

TA的文库  其他...

Bayesian NewOccidental

Spatial Data Analysis

东西方数据挖掘

威望
0
论坛币
50288 个
通用积分
83.6906
学术水平
253 点
热心指数
300 点
信用等级
208 点
经验
41518 点
帖子
3256
精华
14
在线时间
766 小时
注册时间
2006-5-4
最后登录
2022-11-6

楼主
Lisrelchen 发表于 2014-7-11 23:55:20 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
决策树的R语言实现如下:

  1. library(plyr)

  2. # 测试数据集 http://archive.ics.uci.edu/ml/datasets/Car+Evaluation

  3. ##计算训练集合D的熵H(D)
  4. ##输入:trainData 训练集,类型为数据框
  5. ##      nClass 指明训练集中第nClass列为分类结果
  6. ##输出:训练集的熵
  7. cal_HD <- function(trainData, nClass){
  8.   if ( !(is.data.frame(trainData) & is.numeric(nClass)) )
  9.     "input error"
  10.   if (length(trainData) < nClass)
  11.     "nClass is larger than the length of trainData"
  12.   
  13.   rownum <- nrow(trainData)
  14.   #对第nClass列的值统计频数
  15.   calss.freq <- count(trainData,nClass)
  16.   
  17.   #计算每个取值的  概率*log2(概率)
  18.   calss.freq <- mutate(calss.freq, freq2 = (freq / rownum)*log2(freq / rownum))
  19.   
  20.   -sum(calss.freq[,"freq2"])
  21.   
  22.   #使用arrange代替order,方便的按照多列对数据框进行排序
  23.   #mtcars.new2 <- arrange(mtcars, cyl, vs, gear)
  24. }

  25. #cal_HD(mtcars,11)

  26. ##计算训练集合D对特征值A的条件熵H(D|A)
  27. ##输入:trainData 训练集,类型为数据框
  28. ##      nClass 指明训练集中第nClass列为分类结果
  29. ##      nA 指明trainData中条件A的列号
  30. ##输出:训练集trainData对特征A的条件熵
  31. cal_HDA <- function(trainData, nClass, nA){
  32.   rownum <- nrow(trainData)
  33.   
  34.   #对第nA列的特征A计算频数
  35.   nA.freq <- count(trainData,nA)
  36.   i <- 1
  37.   sub.hd <- c()
  38.   for (nA.value in nA.freq[,1]){
  39.     #取特征值A取值为na.value的子集
  40.     sub.trainData <- trainData[which(trainData[,nA] == nA.value),]
  41.    
  42.     sub.hd[i] <- cal_HD(sub.trainData,nClass)
  43.     i <- i+1
  44.   }
  45.   
  46.   nA.freq <- mutate(nA.freq, freq2 = (freq / rownum)*sub.hd)
  47.   sum(nA.freq[,"freq2"])
  48. }

  49. ##计算训练集合D对特征值A的信息增益g(D,A)
  50. ##输入:trainData 训练集,类型为数据框
  51. ##      nClass 指明训练集中第nClass列为分类结果
  52. ##      nA 指明trainData中特征A的列号
  53. ##输出:训练集trainData对特征A的信息增益
  54. g_DA <- function(trainData, nClass, nA){
  55.   cal_HD(trainData, nClass) - cal_HDA(trainData, nClass, nA)
  56. }

  57. ##根据训练集合生成决策树
  58. ##输入:trainData 训练集,类型为数据框
  59. ##      strRoot 指明根节点的属性名称
  60. ##      strRootAttri 指明根节点的属性取值
  61. ##      nClass 指明训练集中第nClass列为分类结果
  62. ##      cAttri 向量,表示当前可用的特征集合,用列号表示
  63. ##      e 如果特征的最大信息增益小于e,则剩余作为一个分类,类频数最高的最为分类结果
  64. ##输出:决策树T
  65. gen_decision_tree <- function(trainData, strRoot, strRootAttri, nClass, cAttri, e){
  66.   # 树的描述,(上级节点名称、上级节点属性值、自己节点名称,自己节点的取值)
  67.   decision_tree <- data.frame()
  68.   
  69.   nClass.freq <- count(trainData,nClass)   ##类别出现的频数
  70.   nClass.freq <- arrange(nClass.freq, desc(freq))  ##按频数从低到高排列
  71.   col.name <- names(trainData) ##trainData的列名
  72.   
  73.   ##1、如果D中所有属于同一类Ck,则T为单节点树  
  74.   if nrow(nClass.freq) == 1{
  75.     rbind(decision_tree, c(strRoot, strRootAttri, nClass.freq[1,1], ''))
  76.     return decision_tree
  77.   }
  78.   
  79.   ##2、如果属性cAttri为空,将D中频数最高的类别返回
  80.   if length(cAttri) == 0{
  81.     rbind(decision_tree, c(strRoot, strRootAttri, nClass.freq[1,1], ''))
  82.     return decision_tree
  83.   }
  84.   
  85.   ##3、计算cAttri中各特征值对D的信息增益,选择信息增益最大的特征值Ag及其信息增益
  86.   maxDA <- 0    #记录最大的信息增益
  87.   maxAttriName <- ''   #记录最大信息增益对应的属性名称
  88.   maxAttriIndex <- ''   #记录最大信息增益对应的属性列号
  89.   
  90.   for(i in cAttri){
  91.     curDA <- g_DA(trainData,nClass,i)
  92.     if (maxDA <= curDA){
  93.       maxDA <- curDA
  94.       maxAttriName <- col.name[i]
  95.     }
  96.   }
  97.   
  98.   ##4、如果最大信息增益小于阈值e,将D中频数最高的类别返回
  99.   if (maxDA < e){
  100.     rbind(decision_tree, c(strRoot, strRootAttri, nClass.freq[1,1], ''))
  101.     return decision_tree
  102.   }
  103.   
  104.   ##5、否则,对Ag的每一可能值ai,依Ag=ai将D分割为若干非空子集Di
  105.   ##   将Di中实例数最大的类作为标记,构建子节点
  106.   ##   由节点及其子节点构成树T,返回T
  107.   for (oneValue in unique(trainData[,maxAttriName])){
  108.     sub.train <- trainData[which(trainData[,maxAttriName] == oneValue),]  #Di
  109.     #sub.trian.freq <- count(sub.train,nClass)   ##类别出现的频数
  110.     #sub.trian.freq <- arrange(sub.trian.freq, desc(freq))  ##按频数从低到高排列
  111.    
  112.     rbind(decision_tree, c(strRoot, strRootAttri, maxAttriName , oneValue))
  113.    
  114.     ##6、递归构建下一步
  115.     # 剔除已经使用的属性
  116.     next.cAttri <- cAttri[which(cAttri !=maxAttriIndex)]
  117.     # 递归调用
  118.     next.dt <-gen_decision_tree(sub.train, maxAttriName,
  119.                                 oneValue, nClass, next.cAttri, e)
  120.     rbind(decision_tree, next.dt)
  121.   }
  122.   
  123.   names(decision_tree) <- c('preName','preValue','curName','curValue')
  124.   decision_tree
  125. }
复制代码

决策树总结
1、R中有实现决策树算法的包rpart,和画出决策树的包rpart.plot,本例自己实现决策树算法是为了更好的理解。
2、由于决策树只能处理离散属性,因此连续属性应首先进行离散化。
3、决策树易于理解,对业务的解释性较强。
4、ID3算法容易引起过拟合,需考虑树的剪枝。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Learning earning machine 机器学习算法 Learn library

本帖被以下文库推荐

沙发
liuqi413 发表于 2014-7-12 00:11:09 来自手机
Lisrelchen 发表于 2014-7-11 23:55
决策树的R语言实现如下:


很好

藤椅
auirzxp 学生认证  发表于 2014-7-12 00:16:18
提示: 作者被禁止或删除 内容自动屏蔽

板凳
andyyuan1988 在职认证  发表于 2015-3-20 10:58:03
get√
谢楼主

报纸
T江枫渔火 学生认证  发表于 2015-5-27 13:17:28
andyyuan1988 发表于 2015-3-20 10:58
get√
谢楼主
学习了,谢谢楼主

地板
Gavinchen0304 发表于 2017-12-20 13:25:04
非常感谢

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-2-6 00:02