机器学习决策树作业

机器学习决策树作业

作业:(1)编程实现:利用信息增益率作为评定标准,实现根节点的决策树的特征选择(封装为函数,或类)(2)编程实现:利用Gini系数做为评定标准,实现根节点的特征选择(3)比较二者在分类的准确率的差别。要求:感性写出自己的收获或疑惑,以便我在下节课有针对的讲解。

(1)编程实现:利用信息增益率作为评定标准,实现根节点的决策树的特征选择(封装为函数,或类)

信息增益

计算公式

特征A对数据集D的信息增益比:
请添加图片描述
其中 g R g_R gR(D, A)是特征A对数据集D的信息增益。 H A H_A HA(D)是特征A对数据集的经验熵

思路

信息增益比 → \rightarrow 信息增益 经验熵
信息增益 → \rightarrow 原信息熵 条件熵

代码

import numpy as np
import pandas as pd

train_data = pd.read_csv('playornot.csv')
X, y = train_data.iloc[:, :-1], train_data.iloc[:, -1]
# 信息特征
attrs = train_data.columns[:-1]


# 计算原信息熵
def calc_entropy(series):
    prob = series.value_counts(normalize=True).values
    return - prob @ np.log2(prob)


# 计算条件熵
def cond_entropy(col, y):
    labels = col.unique()
    attr_ratio = col.value_counts(normalize=True)[labels]  # importance
    entr = np.array([
        - y[col == label].value_counts(normalize=True).values @
        np.log2(y[col == label].value_counts(normalize=True).values)
        for label in labels
    ])
    cond_ent = entr @ attr_ratio
    return cond_ent


# 计算信息增益
def info_gain(X, y):
    H_D = calc_entropy(y)  # 未分割之前的熵
    cond_entropies = np.array([
        cond_entropy(X[col], y)
        for col in X.columns.values
    ])
    info_gain = H_D - cond_entropies
    return info_gain


# 计算经验熵
def exper_entropy(X, y):
    return np.array([cond_entropy(X[col], y)
                     for col in X.columns.values])


if __name__ == '__main__':
    print((info_gain(X, y) / exper_entropy(X, y)))
    # 信息特征最大值为所选特征
    print(attrs[(np.array(info_gain(X, y) / exper_entropy(X, y))).argmax()])

结果

在这里插入图片描述

(2)编程实现:利用Gini系数做为评定标准,实现根节点的特征选择

基尼指数

基尼指数表示数据集D的纯度,数值大小表示一个随机选中的样本在子集中被分错的可能性。当一个节点中所有样本都是一个类时,基尼不纯度为零。

思路

假设有K个类,样本点属于第k类的概率为pi,则概率分布的基尼指数为:
请添加图片描述

import numpy as np
import pandas as pd

train_data = pd.read_csv('playornot.csv')
X, y = train_data.iloc[:, :-1], train_data.iloc[:, -1]
# 信息特征
attrs = train_data.columns[:-1]


# gini系数
def gini():
    return [
        1 - train_data[attr].value_counts(normalize=True).values @ train_data[attr].value_counts(normalize=True).values
        for attr in attrs]


if __name__ == "__main__":
    print(gini())
    # 基尼系数系数增益越大越好
    print(attrs[(np.array(gini())).argmax()])

结果

在这里插入图片描述

(3)比较二者在分类的准确率的差别。要求:感性写出自己的收获或疑惑,以便我在下节课有针对的讲解。

两者之间没有绝对的优劣,每个决策都有适用情况,应该针对实际情况进行选择。
适用情况:
信息增益率通常用于离散型的特征划分,因此ID3(以信息增益作为决策标准)和C4.5(以信息增益率作为决策标准)通常情况下都是多叉树,也就是根据离散特征的取值会将数据分到多个子树中;而CART树为二叉树,使用基尼指数作为划分准则,对于离散型特征和连续行特征都能很好的处理。

图二转自该博客
原创不易 转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈请添加图片描述

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值