决策树
决策树分为分类树和回归树,分类树用于分类,如晴天/阴天/雨天,用户性别、邮件是否垃圾邮件,回归树用于预测实数值,如明天的温度,用户的年龄。
构建决策树重要步骤是选择最佳属性,使得基于该属性分裂后,每个分支的记录类别尽可能纯。
构建的决策树是否是严格的二叉树由属性选择度量确定,某些属性选择度量,如基尼系数强制结果树是二叉树,其他度量,如信息增益、信息增益比率并非如此,它允许多路划分。
属性选择方法
属性选择方法总是选择最好的属性作为分裂属性,即让每个分支的记录的类别尽可能纯。它将所有属性列表的属性按某个标准排序,从而选出最好的属性。属性选择方法很多,常用的有3中:
1、信息增益(ID.3即Iterative Dichotomiser 3,迭代二叉树3代)
信息增益基于香浓的信息论,它找出的属性R具有这样的特点:以属性R分裂前后的信息增益最大。信息定义(熵)为:
其中:m表示数据集D中类别C的个数,pi表示D中任意一个记录属于Ci的概率,info(D)表示将数据集D不同的类分开需要的信息量。
上式中info实际上就是信息论中的熵,熵表示的是不确定度的度量,如果某个数据集的类别的不确定度越高,则熵越大。
信息增益:假设我们选择属性R作为分裂属性,数据集D中,R有k个不同的取值{V1,V2,…,Vk},于是可将D根据R的值分成k组{D1,D2,… ,Dk},按R进行分裂后,将数据集D不同的类分开还需要的信息量为:
,该式中|Dj|表示D中属性R的值为Dj的个数。
信息增益定义为:分裂前后信息量的差,
信息增益Gain(R)表示属性R给分类带来的信息量,我们寻找Gain最大的属性,就能使分类尽可能纯。由于对所有的属性Info(D)是相同的,计算最新的InfoR(D)就可以了。
选择最佳特征的python代码如下:
def calculate_shannon_entropy(data_set):
'''计算香农熵
:param data_set: 输入数据集
:return: 香农熵的值
'''
num_entry = len(data_set)
label_count = {}
for feather_vec in data_set:
current_label = feather_vec[-1]
if current_label not in label_count.keys():
label_count[current_label] = 0
label_count[current_label] += 1
shannon_entropy = 0.0
for k, v in label_count.items():
prob = float(v)/num_entry
shannon_entropy -= prob * log(prob, 2)
return shannon_entropy
def split_data_set(data_set, axis, value):
'''抽取出数据集中第axis维中值等于value的行,并且该行中去除掉第axis维
:param data_set: 输入数据集
:param axis: 维度
:param value: 数值
:return:
'''
ret_data_set = []
for feather_vector in data_set:
if feather_vector[axis] == value:
reduced_vector = feather_vector[:axis]
reduced_vector.extend(feather_vector[axis + 1:])
ret_data_set.append(reduced_vector)
return ret_data_set
def choose_best_feature_to_split(dataSet):
'''选择最好的特征
:param dataSet:
:return: 最好的特征
'''
num_feature = len(dataSet[0]) - 1
base_entropy = calculate_shannon_entropy(dataSet)
best_info_gain = 0.0</