📕参考:ysu老师课件+西瓜书
1.决策树的基本概念
【决策树】:决策树是一种描述对样本数据进行分类的树形结构模型,由节点和有向边组成。其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
关于决策树要掌握的概念:
决策树的优缺点:
优点:
缺点:
2.决策树的生成过程
决策树模型涉及到三个关键过程:
一是特征变量的选择,根据某个指标(如信息增益、基尼指数等)选择当前最佳的特征属性作为判断依据。
二是决策树的生成,常用的决策树算法有ID3、C4.5、CART等算法;
三是决策树的剪枝,通过剪枝来避免过拟合,提升对数据的预测效果。
2.1 特征变量的选择
最常用的三种特征选择策略:信息增益、信息增益比、Gini指数
2.1.1 信息增益
首先引入【信息量】。
消息中所包含的信息量大小与该消息所表示的事件出现的概率相关,如果一个消息所表示的事件是必然事件(发生概率100%),则该消息所包含的信息量为0;如果一个消息表示的不可能事件(发生概率极低),则该消息的信息量为无穷大。
信息量应该随着概率单调递减:某事件的概率越大,则信息量越小。
再引入【信息熵】。
“信息熵”用来表示信息不确定性的一种度量。熵越高表示越混乱,熵越低表示越有序。
(类比高中学的分子状态混乱程度,熵越大越混乱)
再引入【信息增益】。
“信息增益”表示在知道某个特征之后使得不确定性减少的程度(知道某个特征前的熵与知道某个特征之后的熵之差)。
根据某个变量将样本数据分割为多个子集,分割前与分割后样本数据的熵之差为信息增益,信息增益越高,表示该变量对样本数据的分类效果越好。
2.1.2 信息增益比
再引入【信息增益比】
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题,因此通过引入了【信息增益比】来解决该问题。
比如:以user_id为特征变量,由于每个人的user_id是唯一的,在每个user_id下可以完美地进行准确分类,但是这种情况显然是无意义的。
注:只有在不同变量分裂出不同个数子节点的情况下,信息增益比才会起作用。如果每个变量允许分裂相同个数的子节点,那么信息增益比并不起作用。
2.1.3 Gini指数
Gini指数也是衡量随机变量不纯度的一种方法,Gini指数越小,则表示变量纯度越高,Gini指数越大,表示变量纯度越低。
理解:
2.2 决策树的生成
常用的决策树算法有:ID3、C4.5、CART
先介绍决策树生成时的三个【终止条件】:
2.2.1 ID3——信息增益
ID3(Iterative Dichotomiser 3)是一种基于信息增益的决策树生成算法。
其主要步骤包括:
【专业描述】
2.2.2 C4.5——信息增益比
C4.5算法整体上与ID3算法非常相似,不同之处是C4.5以信息增益比为准则来选择分枝变量。
2.2.3 CART——Gini指数
CART(Classification and Regression Trees)是一种基于Gini指数的决策树生成算法,可用于分类和回归任务。
其主要步骤包括:
【专业描述】
注意:
CART是一种二叉树,即将所有问题看做二元分类问题。
由于CART是二叉树,在遇到连续变量或者多元分类变量时,存在寻找最优切分点的情况。
【补充】
CART的缺点
两种决策的对比
2.3 决策树的剪枝
决策树的剪枝是为了防止过拟合,即过度依赖训练数据而导致在未知数据上表现不佳。
剪枝通过修剪决策树的一部分来达到简化模型的目的。
剪枝分为预剪枝(Pre-pruning)和后剪枝(Post-pruning)两种类型。
2.3.1 预剪枝
在决策树生成的过程中,在每次划分节点之前,通过一些预定的规则判断是否继续划分。若当前结点的划分不能使决策树泛化性能提升,则停止划分并将当前结点记为叶结点,其类别标记为训练样例数最多的类别。
预剪枝的优缺点
2.3.2 后剪枝
在决策树生成完成后,通过递归地从底部向上对节点进行判断,决定是否剪枝。
具体过程如下:
后剪枝相对于预剪枝更为灵活,因为它在生成完整的树之后才进行剪枝决策,可以更准确地评估每个子树的性能。
后剪枝的优缺点:
3.代码实践
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn import tree
import matplotlib.pyplot as plt
# 加载示例数据集(鸢尾花数据集)
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树模型
clf = DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)
# 使用模型进行预测
y_pred = clf.predict(X_test)
# 输出模型的准确率
accuracy = clf.score(X_test, y_test)
print(f"Model Accuracy: {accuracy:.2f}")
# 输出决策树的规则
tree_rules = export_text(clf, feature_names=iris.feature_names)
print("Decision Tree Rules:\n", tree_rules)
# 可视化决策树
fig, ax = plt.subplots(figsize=(12, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, ax=ax)
plt.show()