数据挖掘——决策树算法入门
**个人的学习笔记,欢迎大佬指点**
保姆级注释,小白友好
链接: [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)
代码运行结果