一、决策树
目录
1.1 决策树的概念
在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。它可以用来解决分类和回归问题。
1.2决策树的步骤
1.特征选择:特征选择是指从训练数据中选择一个最优的特征,作为当前节点的划分依据。不同的特征选择准则会导致不同的决策树算法,常用的准则有信息增益、信息增益率、基尼指数等。
2.决策树生成:决策树生成是指从根节点开始,递归地对每个节点进行特征选择,并根据特征的不同取值划分数据集,生成子节点。直到满足某些终止条件,如所有样本属于同一类别,或没有可用的特征,或达到最大深度等。
3.剪枝:决策树剪枝是指为了防止过拟合,对生成的决策树进行简化,去掉一些不重要的分支,减少树的复杂度。常用的剪枝方法有预剪枝和后剪枝,前者是在生成决策树的过程中进行剪枝,后者是在生成决策树后进行剪枝。
1.3决策树的优缺点
优点:
·简单易懂,可以直观地展示决策过程和分类规则。
·计算复杂度不高,输出结果易理解,对中间值缺失不敏感,可以处理不相关特征数据。
缺点:容易过拟合,即对训练数据过于敏感,导致泛化能力差。
二、如何构建决策树
1.构建决策树的过程是一个自上而下,递归地划分数据集的过程。
2.划分的原则是选择一个最优的属性,使得划分后的数据集的纯度或者信息增益最大。
3.纯度或者信息增益的度量方式有多种,常用的有信息熵、基尼指数等。
4.划分的终止条件有多种,常用的有设定树的最大深度、最小节点样本数、最小信息增益等。
5.为了防止过拟合,可以对决策树进行剪枝,即删除一些不重要的分支,减少树的复杂度。
决策树示意图:
2.1信息增益
信息熵:信息熵是一种度量信息的不确定性或复杂性的指标,它反映了信息源的平均信息量。信息熵的概念最早由香农在1948年提出,借鉴了热力学的熵的概念,将信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。
K表示类别的个数,pk表示第k类样本所占的比例。
信息增益:信息增益是指划分前后数据集的信息熵的差值,信息熵是度量数据集纯度的一种指标,它反映了数据集中样本的类别分布情况。信息增益越大,说明划分后的数据集纯度越高,不确定性越低。
Ent(D)表示数据集D的信息熵,V表示属性的取值个数,Dv表示属性取值为v的子集,∣D∣表示数据集的样本数。K表示类别的个数,pk表示第k类样本所占的比例。
决策树建立方法:
选择信息增益最大的属性作为划分属性。
2.2基尼指数
1.定义:
基尼值:
Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,表示数据集整体的不确定性。
Gini(D)越小,数据集D的纯度越高,不确定性越小。
基尼指数:
表示经a分割后数据集D的不确定性。
2、决策树建立方法
在侯选属性集合中,选择那个是的划分后基尼指数最小的属性为最优划分属性。
三、剪枝处理
1.剪枝:
剪枝处理是一种优化决策树的方法,它可以防止过拟合,减少树的复杂度,提高泛化能力。剪枝处理有两种主要的方式:预剪枝和后剪枝。
·预剪枝是在生成决策树的过程中,对每个节点在划分前先进行估计,如果当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶节点。
·后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,如果将该节点对应的子树替换为叶节点能够提高决策树的泛化性能,则将该子树剪掉。
2.剪枝的常用方法
a.留出法
b.检查验证发
c.悲观剪枝法
四、基于信息熵的决策树实现
1.步骤
1.1定义数据集
watermelon_data = [
{'颜色': '青绿', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '成熟': '成熟'},
{'颜色': '乌黑', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '成熟': '成熟'},
{'颜色': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '成熟': '成熟'},
{'颜色': '青绿', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '成熟': '成熟'},
{'颜色': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '稍糊', '成熟': '成熟'},
{'颜色': '浅白', '根蒂': '稍蜷', '敲声': '沉闷', '纹理': '稍糊', '成熟': '成熟'},
{'颜色': '青绿', '根蒂': '硬挺', '敲声': '清脆', '纹理': '清晰', '成熟': '不成熟'},
{'颜色': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '模糊', '成熟': '不成熟'},
{'颜色': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '模糊', '成熟': '不成熟'},
{'颜色': '浅白', '根蒂': '硬挺', '敲声': '清脆', '纹理': '模糊', '成熟': '不成熟'},
]
1.2 计算信息熵
def calculate_entropy(data):
total_samples = len(data)
if total_samples == 0:
return 0
label_counts = {}
for entry in data:
label = entry['成熟']
if label not in label_counts:
label_counts[label] = 0
label_counts[label] += 1
entropy = 0
for label in label_counts:
probability = label_counts[label] / total_samples
entropy -= probability * math.log2(probability)
return entropy
1.3 选择最佳特征进行分割
def find_best_split(data):
features = list(data[0].keys())[:-1] # 排除 '成熟' 特征
base_entropy = calculate_entropy(data)
best_info_gain = 0
best_feature = None
for feature in features:
unique_values = set(d[feature] for d in data)
new_entropy = 0
for value in unique_values:
sub_data = [d for d in data if d[feature] == value]
weight = len(sub_data) / len(data)
new_entropy += weight * calculate_entropy(sub_data)
info_gain = base_entropy - new_entropy
if info_gain > best_info_gain:
best_info_gain = info_gain
best_feature = feature
return best_feature
1.4 构建决策树并显示
def build_decision_tree(data):
# 如果所有数据都属于同一类别,返回该类别
if len(set(d['成熟'] for d in data)) == 1:
return data[0]['成熟']
# 如果没有特征可供分割,返回占多数的类别
if len(list(data[0].keys())[:-1]) == 0:
label_counts = {}
for entry in data:
label = entry['成熟']
if label not in label_counts:
label_counts[label] = 0
label_counts[label] += 1
majority_label = max(label_counts, key=label_counts.get)
return majority_label
best_feature = find_best_split(data)
tree = {best_feature: {}}
unique_values = set(d[best_feature] for d in data)
for value in unique_values:
sub_data = [d for d in data if d[best_feature] == value]
tree[best_feature][value] = build_decision_tree(sub_data)
return tree
# 构建决策树并显示
decision_tree = build_decision_tree(watermelon_data)
print(decision_tree)
2.结果
五、总结
决策树,在这次实验中。了解了一些关于决策树的知识,如决策树的各种划分标准,决策树的优缺点以及怎样去构建一个决策树等等。对于新东西的接受消化还是要花很大力气的,虽然效果并不是那么好,可视化还没有实现成功。