R语言决策树概论

决策树数学基础:

ID3算法:
基于信息熵来选择最佳测试属性,选择当前样本中最大信息增益的属性作为测试属性
设S是s个数据样本的集合。假定类别属性具有m个不同的值:C(i) i=1,2,3... 设s(i)是样本中的C(i)中的样本数,它总的信息熵为:
I(s(1),s(2),s(3).....) = -(s(1)/S)log2(s(1)/S) -(s(2)/S)log2(s(2)/S)..........
设一个属性A具有k个不同的值{a1,a2....ak}利用属性A将 集合划分为k个子集{S1,S2.....},其中Si包含了集合S中属性A取ai的样本,若选择属性A作为测试属性则就产生新叶子节点,这样根据属性A花粉样本大的信息熵为:
E(A)=
(放弃写公式了 直接来例子吧)

实例  餐饮销售额关于天气,周末,促销等的决策树分析:
天气是否周末是否促销销售额
    
    
    
    
    
    
    
    
    
像这样给出34个样本,首先最关心的属性当然是销售额高低(实际当然不会是这样,可以在预处理中,取销售额平均值座位临界点,得到高低),销售额高的样本数据有18个,低的16个,计算信息熵:
I(18,16) =-18/34log2(18/34)  -16/34log2(16/34) =0.997503
接下来,研究天气好坏对销售额的影响,天气好时,销售额高的数据有11个,低的6个;天气差时,销售额高的数据7个,低的10个,天气属性的信息熵计算如下:
I(11,6) = -11/17log2(11/17) -6/17log2(6/17) =0.936667
I(7,10) = -7/17log2(7/17) - 10/17log2(10/17) =0.977418
E(天气) = 17/34I(11,6) +17/34I(7,10)  =0.957043
依次算出E(周末),E(促销)  
然后计算信息增益值:
Gain(天气)  = I(18,16) -E(天气)    Gain(周末) = I(18,16) -E(周末)  Gain(促销)=I(18,16) -E(促销)
信息增益值最大的作为一个叶子节点,对是否周末和是否促销进行下一轮的分析,得到决策树;
ID3决策树算法不一定好,其他的决策树算法还有c4.5算法, CART算法,SLIQ算法 SPRINT PUBLIC等算法

R语言ID3决策树算法

data<-read.csv("file.csv")[,2:5]
colnames(data)<-c("x1","x2","x3","result")
#计算一列的信息熵
calculate<-function(data){
t<-table(data)
sum<-sum(t)
t<-t[t!=0]
entropy<--sum(log2(t/sum)*(t/sum))
return(entropy)
}
#计算两列数据的信息熵
calculate2<-function(data){
var<-table(data[1])
p<-var/sum(var)
varnames<-names(var)
array<-c()
for(name in varnames){
array<-append(array,calculate(subset(data,data[1]==name,select=2)))
}
return(sum(array* p))
}
buildTree<-function(data){
if(length(unique(data $result))==1){
cat(data $ result[1])
return()
}
if(length(names(data))==1){
cat("....")
return()
}
entropy<-calculate(data $ result)
labels<-names(data)
label<-""
temp<-Inf
subentropy<-c()
for(i in 1:(length(data)-1)){
temp2<-calculate2(data[c(i,length(labels))])
if(temp2<temp){
temp<- temp2
label<-labels[i]
}
subentropy<-append(subentropy,temp2)
}
cat(label)
cat("[")
nextLabels<-labels[labels!=label]
for(value in unlist(unique(data[label]))){
cat(value,":")
buildTree(subset(data,data[label]==value,select=nextLabels))
cat(";")
}
cat("]")
}
#构建分类树
buildTree(data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值