数据挖掘——决策树算法入门

本文介绍了决策树算法的基础知识,包括其自上而下的分类方式和有监督学习过程。详细阐述了熵、条件熵和信息增益的概念,并通过ID3算法的步骤解释了如何选择最优决策特征。同时讨论了ID3算法的局限性,如处理离散型变量、样本缺失值敏感以及可能的过拟合问题。最后,提到了决策树的剪枝方法,如预剪枝和后剪枝,以提高决策树的泛化能力。通过一个银行贷款数据实例展示了如何运用ID3算法找到最佳决策特征。
摘要由CSDN通过智能技术生成

数据挖掘——决策树算法入门

**个人的学习笔记,欢迎大佬指点**
保姆级注释,小白友好
链接: [link](https://www.imooc.com/video/22254).
运行环境python3

决策树算法介绍

决策树算法背景介绍:

自上而下的对样本进行树形分类、有监督的算法

决策树学习过程:

特征选择 —— 根据选择的特征生成决策树 —— 对决策树进行剪枝

熵、条件熵、信息增益:

在这里插入图片描述

ID3算法应用

ID3算法具体步骤:

(1) 计算数据集D的熵 H(D)
(2) 计算某个特征A对于数据集D的条件熵H(D|A)
(3) 计算信息增益g(D,A)=H(D) – H(D|A)

ID3算法局限性

(1) 只能处理离散型变量,无法处理连续型变量
(2) 对样本缺失值比较敏感
(3) 每次分裂倾向于取值较多的特征,导致最终泛化性能较差

决策树的剪枝

目的:提高决策泛化能力
剪枝方法:预剪枝、后剪枝
预剪枝:在节点分裂之前进行剪枝,分三种情况
(1) 当树到达一定深度,停止树生长
(2) 当到达当前节点的样本数量小于某个阈值的时候,停止生长
(3) 计算每次分裂时对测试集准确率的提升,小于某个阈值不再生长
后剪枝:首先生成完全生长的决策树,然后自底向上进行剪枝

决策树算法实例(ID3算法)(根据银行15条贷款数据,寻找最优决策特征,辅助银行决策)

对15个样本数据,生成最优决策特征


#创建数据集,数据的第1-5列分别为:年龄、是否有工作、是否有房、个人信誉、是否贷款
def createDataset():
    dataset = [['young', 0, 0, 'normal', '0'],
               ['young', 0, 0, 'good', '0'],
               ['young', 1, 0, 'good', '1'],
               ['young', 1, 1, 'normal', '1'],
               ['young', 0, 0, 'normal', '0'],
               ['mid', 0, 0, 'normal', '0'],
               ['mid', 0, 0, 'good', '0'],
               ['mid', 1, 1, 'good', '1'],
               ['mid', 0, 1, 'very good', '1'],
               ['mid', 0, 1, 'very good', '1'],
               ['old', 0, 1, 'very good', '1'],
               ['old', 0, 1, 'good', '1'],
               ['old', 1, 0, 'good', '1'],
               ['old', 1, 0, 'very good', '1'],
               ['old', 0, 0, 'normal', '0']]
    return dataset


#计算熵
from math import log#引入数学计算包
def calcEntropy(dataset):#定义对数据集计算熵的函数
    num_samples = len(dataset)#样本条数
    label_counts = {}#创建一个字典,用于统计每种标签——贷款与否的个数
    for line in dataset:#该循环统计贷款与否的个数,并存放于字典中
        current_label = line[-1]
        if current_label not in label_counts.keys():
            label_counts[current_label] = 0
        label_counts[current_label] += 1

    entropy = 0.0#定义熵的初始值为0
    for key in label_counts:#熵的计算公式
        p = float(label_counts[key]) / num_samples#计算每个键对应的概率
        if p == 0:
            entropy = 0
        else:
            entropy -= p * log(p,2)
    return entropy

#计算条件熵(实际上为按特征值划分数据集,计算条件熵在下一步)
def splitDataset(dataset, feature_index, value):#定义一个更具不同特征值划分数据集的函数
    ret_dataset = []#创建一个空列表,用于存放子数据集
    for line in dataset:
        if line[feature_index] ==value:
            extract_line = line[:feature_index]#抽取该特征前面的数据
            extract_line.extend(line[feature_index+1:])#继续抽取该特征后面的数据
            ret_dataset.append(extract_line)#将抽取的数据放入该列表
    return ret_dataset

#计算信息增益,并获取最优信息增益与最优特征
def calc_info_gain(dataset):#定义计算信息增益函数
    num_features =len(dataset[0]) - 1#计算数据集的特征个数,dataset[0]:数据集的第一行
    base_entropy = calcEntropy(dataset)
    bast_info_gain = 0.0#设置最优信息增益初始值为0.0
    best_feature_index = -1#设置最优信息索引初始值为-1
    for i in range(num_features):
        feature_list = [example[i] for example in dataset]#选取每一条数据中的第i个特征,所得到的就是关于某个特征的列
        feature_set = set(feature_list)#去重,得到该特征有几类
        conditional_entropy = 0.0#设置条件熵初始值为0.0
        for value in feature_set:#计算该特征的条件熵
            sub_dataset = splitDataset(dataset, i, value) #根据该特征值划分成子数据集
            p = len(sub_dataset) / len(dataset)#计算该特征值对应的概率
            conditional_entropy += p * calcEntropy(sub_dataset)#计算该特征的条件熵
        info_gain = base_entropy - conditional_entropy#计算该特征的信息增益
        if (info_gain > bast_info_gain):
            bast_info_gain = info_gain
            best_feature_index = i
    return best_feature_index , bast_info_gain



if __name__ == '__main__':
    dataset = createDataset()
    best_feature_index , bast_info_gain = calc_info_gain(dataset)
    print(best_feature_index)
    print(bast_info_gain)

代码运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值