决策树1---特征选择(信息增益)

来源:互联网 发布:java小程序抽签源代码 编辑:程序博客网 时间:2024/06/05 19:34

特征的选择决定哪个特征先来划分空间。一般决策树算法特征选择通过信息增益或信息增益比来确定。ID3,C4.5的树生成通过信息增益和信息增益比概念生成。

概念及理解

信息增益:

g(D,A)=H(D)H(D|A)1

式子1中H(D)代表数据集D(学习集中的类)的信息熵,信息熵指的是变量的不确定性,变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。

公式理解

H(D)=i=1kCkDlog2CkD

其中D中含有类别k类
式子1中HD|A)代表数据集D在条件A下的信息熵,即在AD的不确定性。

H(D|A)=i=1pDiDH(Di)

Di指的是在特征A下数据集D的个数,p为条件A下数据集D的类别数。

信息增益:g(D,A)=H(D)H(D|A)信息熵H(D)可以看作常量(与特征A无关,与类有关),则信息增益求得的信息熵在特征A的信息增加量,增加量越多越好,即g(D|A)越大越好。因此要求H(D|A)越小越好,即在特征A下D的不确定性越小越好,特征A下搞清楚所需要的信息量也越小。

R计算过程

##信息熵Entropy <- function(x){  n <- length(x)  freq <- as.data.frame(table(x))  H <- sum(-(freq[,2]/n)*log2(freq[,2]/n)) ###向量式计算  return(H)} ##条件信息熵ConditionEntropy <- function(x){  n <- ncol(x)  num <-nrow(x)  ce <- matrix(0, nrow=1, ncol=n-1)  for(i1 in 1:ncol(ce)){    H <- 0    var_freq <- as.data.frame(table(x[,i1]))    for(i2 in 1:nrow(var_freq)){      var_freq2 <- as.data.frame(table(x[which(x[,i1]==var_freq[i2,1]), n]))      VarConditionEntropy <-  (var_freq[i2,2]/num)*sum(-(var_freq2[, 2]/var_freq[i2,2])*log2(var_freq2[, 2]/var_freq[i2,2])) ###向量式计算      H <- H + (VarConditionEntropy)    }    ce[1, i1] <- H  }  return(ce)}##信息增益MutualInformation <-function(x,y){  MI <- x - y  return(MI)}

计算验证

###生成数据集ID <- c(1:15)Age <- c(rep("青年",5), rep("中年",5), rep("老年",5))work <- c("NO", "NO", "YES", "YES", "NO", "NO", "NO", "YES", "NO", "NO", "NO", "NO", "YES", "YES", "NO")HOUSE <- c("NO", "NO", "NO", "YES", "NO", "NO", "NO", "YES", "YES", "YES", "YES", "YES", "NO", "NO", "NO")lei <- c("NO", "NO", "YES", "YES", "NO", "NO", "NO", "YES", "YES", "YES", "YES", "YES", "YES", "YES","NO")data <- data.frame(ID, Age, work, HOUSE, lei, stringsAsFactors=F)##计算经验信息熵entropy <- Entropy(data$lei)##计算经验条件信息熵condition_entropy <- ConditionEntropy(data)##计算信息增益MutualInformation(entropy, condition_entropy)          [,1]      [,2]      [,3]      [,4][1,] 0.9709506 0.0830075 0.3236502 0.4199731
1 0
原创粉丝点击