机器学习(4):决策树
1 介绍
决策树(Decision Tree),它是一种以树形数据结构来展示决策规则和分类结果的模型,作为一种归纳学习算法,其重点是将看似无序、杂乱的已知数据,通过某种技术手段将它们转化成可以预测未知数据的树状模型,每一条从根结点(对最终分类结果贡献最大的属性)到叶子结点(最终分类结果)的路径都代表一条决策的规则。决策树就是形如下图的结构:
1.1 决策树的基本流程
下图就是在生成决策树的过程中经历的步骤。
- 首先从开始位置,将所有数据划分到一个节点,即根节点。
- 然后经历橙色的两个步骤,橙色的表示判断条件:若数据为空集,跳出循环。如果该节点是根节点,返回null;如果该节点是中间节点,将该节点标记为训练数据中类别最多的类若样本都属于同一类,跳出循环,节点标记为该类别;
- 如果经过橙色标记的判断条件都没有跳出循环,则考虑对该节点进行划分。既然是算法,则不能随意的进行划分,要讲究效率和精度,选择当前条件下的最优属性划分(什么是最优属性,这是决策树的重点,后面会详细解释)
- 经历上步骤划分后,生成新的节点,然后循环判断条件,不断生成新的分支节点,直到所有节点都跳出循环。
- 结束。这样便会生成一棵决策树。
1.2 信息增益
在介绍信息增益之前,先介绍一下信息熵的含义。热力学里有一个熵的概念,熵就是来形容系统混乱程度的,系统越混乱,熵就越大。信息熵也具有同样的意义,不过它描述的是随机变量的不确定性(也就是混乱程度)。
为了方便解释,我们用一个简单的便于观察的例子。下图是一个只有2个取值的随机变量,假如取值只有0和1,则P(X=0)=p,P(X=1)=1-p,其中p是x=0的概率。信息熵为H§=-plogp-(1-p)log(1-p),我们画一个p在0-1的变过过程,H§随着变化的曲线:
由上图可以看出,当p=0.5的时候,H§达到最大值。因为p=0或p=1的时候,X只有一种可能性,也就是X是确定的,因此熵最小,而随着p接近0.5的过程中,变量X的不确定性就越来越大,我们计算出来的熵也是越来越大,与实际相符。
信息增益用于分类问题,衡量选择某一特征后数据集的纯度提升。计算公式为:
信息增益就是划分前的信息熵减去划分后的信息熵。其中A代表的此次划分中所使用的属性。
如果决策树使用信息增益准则来选择最优划分属性的话,在划分前会针对每个属性都计算信息增益,选择能使得信息增益最大的属性作为最优划分属性。ID3算法就是使用的信息增益划分方法,决策树是一个基础理论,实际落地的算法有多种,ID3是其中一种。
1.3 基尼指数
基尼指数也是一个寻找最优划分属性的准则。公式如下:
基尼指数就是在样本集中随机抽出两个样本不同类别的概率。当样本集越不纯的时候,这个概率也就越大,即基尼指数也越大。这个规律与信息熵的相同,还是以刚才的只有两个取值的随机变量为例,我们这次纵坐标除了有信息熵外,再加上基尼指数。
可以看出,基尼指数与信息熵虽然值不同,但是趋势一致。同样的,使用基尼指数来选择最优划分属性也是对比不同属性划分后基尼指数的差值,选择使样本集基尼指数减小最多的属性。
1.4 决策树的优缺点
优点
- 易于理解和解释:决策树的结构直观,易于理解和解释。
- 处理多种数据类型:可以处理数值型和类别型数据。
- 不需要数据标准化:决策树不需要对数据进行标准化或归一化处理。
缺点
- 容易过拟合:决策树容易过拟合,特别是在数据集较小或树深度较大时。
- 对噪声敏感:决策树对噪声数据较为敏感,可能导致模型性能下降。
- 不稳定:数据的小变化可能导致生成完全不同的树。
2 使用Python实现决策树
2.1 安装必要的库
首先,确保你已经安装了scikit-learn
库。如果没有安装,可以使用以下命令进行安装:
pip install scikit-learn
2.2 导入库并加载数据集
我们将使用scikit-learn
自带的鸢尾花(Iris)数据集来演示决策树的使用。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import export_graphviz
import graphviz
# 加载鸢尾花数据集
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.3, random_state=42)
2.3 训练决策树模型
接下来,我们使用DecisionTreeClassifier
来训练决策树模型。
# 创建决策树分类器
clf = DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)
2.4 预测与评估
使用训练好的模型对测试集进行预测,并评估模型的准确率。
# 对测试集进行预测
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")
2.5 可视化决策树
为了更直观地理解决策树的结构,我们可以使用graphviz
库来可视化决策树。graphviz 下载地址:Download | Graphviz。下载windows程序。
安装时记得选择第二项,为所有用户添加系统环境。
在命令窗口输入dot -V查看是否安装成功,如果没有出现版本信息则重启一下电脑再试试。
安装 graphviz
库:
pip install graphviz
编写可视化代码:
# 导出决策树为dot文件
dot_data = export_graphviz(clf, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
# 使用graphviz渲染决策树
graph = graphviz.Source(dot_data)
graph.render("iris_decision_tree") # 保存为PDF文件
graph.view() # 在浏览器中查看