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

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

决策树算法介绍

决策树算法背景介绍:

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

决策树学习过程:

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

熵、条件熵、信息增益:

数据挖掘决策树算法例题及答案 数据挖掘决策树id3_数据分析

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)
代码运行结果

数据挖掘决策树算法例题及答案 数据挖掘决策树id3_决策树_02