C4.5算法【python,算法,机器学习】

20 篇文章 0 订阅
17 篇文章 0 订阅

优点

  1. 可以处理缺失值。
  2. 特征只能使用一次。
  3. 可以剪枝,可以避免过拟合问题。

缺点

  1. 不适合大数据集的训练,因为受内存大小影响。

计算流程

对于单个特征 A, 我们做如下假设:

  1. 有两个判断值yesno, 概率分别为 p y p_y py p n p_n pn
  2. 有三组值a,b,c, 各组的比例分别为 r a r_a ra r b r_b rb r c r_c rc,各个组内yesno的比例分别为 r a y r_{ay} ray r a n r_ {an} ran r b y r_{by} rby r b n r_{bn} rbn r c y r_{cy} rcy r c n r_{cn} rcn

那么该特征的熵增比的计算流程如下:

  1. 计算初始熵: h ( i n i t ) = − ( p y ∗ log ⁡ 2 p y + p n ∗ log ⁡ 2 p n ) h(init)=-(p_y*\log_2{p_y}+p_n*\log_2{p_n}) h(init)=(pylog2py+pnlog2pn)
  2. 计算分组的条件熵: h ( D ∣ A ) = r a ( − ( r a y ∗ log ⁡ 2 r a y + r a n ∗ log ⁡ 2 r a n ) ) + r b ( − ( r b y ∗ log ⁡ 2 r b y + r b n ∗ log ⁡ 2 r b n ) ) + r c ( − ( r c y ∗ log ⁡ 2 r c y + r c n ∗ log ⁡ 2 r c n ) ) h(D|A)=r_a(-(r_{ay}*\log_2{r_{ay}}+r_{an}*\log_2{r_{an}})) + r_b(-(r_{by}*\log_2{r_{by}}+r_{bn}*\log_2{r_{bn}})) + r_c(-(r_{cy}*\log_2{r_{cy}}+r_{cn}*\log_2{r_{cn}})) h(DA)=ra((raylog2ray+ranlog2ran))+rb((rbylog2rby+rbnlog2rbn))+rc((rcylog2rcy+rcnlog2rcn))
  3. 计算熵增: g ( A ) = h ( i n i t ) − h ( D ∣ A ) g(A)=h(init)-h(D|A) g(A)=h(init)h(DA)
  4. 计算熵增比: g a i n _ r a t i o = g ( A ) / ( − r a log ⁡ 2 r a − r b log ⁡ 2 r b − r c log ⁡ 2 r c ) gain\_ratio=g(A)/(-r_a\log_2{r_a}-r_b\log_2{r_b}-r_c\log_2{r_c}) gain_ratio=g(A)/(ralog2rarblog2rbrclog2rc)

一下是一个简单代码示例:

import numpy as np
import pandas as pd

df = pd.DataFrame({"wage": [1, 0, 1, 0, 0, 1, 0, 0],
                   "press": [1, 1, 0, 1, 1, 1, 0, 0],
                   "platform": [2, 0, 0, 0, 1, 1, 2, 1],
                   "work": ["好", "好", "好", "好", "不好", "好", "不好",
                            "不好"]})


# 计算信息熵
def cal_entropy(p_arr):
	return sum(-p * np.log2(p) for p in p_arr)


# 计算工资特征的初始熵
init_entropy_wage = cal_entropy([5 / 8, 3 / 8])
# 计算工资列特征的信息熵
entropy_wage = (3 / 8 * cal_entropy([3 / 3]) +
                5 / 8 * cal_entropy([2 / 5, 3 / 5]))
# 计算工资的熵增
gain_entropy_wage = init_entropy_wage - entropy_wage
print(gain_entropy_wage)
# 计算工资的熵增比,利用熵增除以特征分组比例的信息熵,这里的分组熵和初始熵计算值是一样的
gain_ratio_wage = gain_entropy_wage / cal_entropy([5 / 8, 3 / 8])
print(gain_ratio_wage)
  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值