目录
1. tree.DecisionTreeClassifier(分类树)
2. tree.DecisionTreeRegressor(回归树)
3. tree.export_graphviz(将生成的决策树导出为DOT格式,画图专用)
一、认识决策树
1. 介绍
决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列 有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。
2. 决策树生成过程
上面这组数据集为 一系列已知物种以及所属类别的数据。我们现在的目标是,将动物们分为哺乳类和非哺乳类。根据已经收集到的数据,决策树算法 可以算出了下面的 这棵决策树:
假如我们现在发现了一种 新物种 A,它是冷血动物,体表带鳞片,并且不是胎生,我们就可以通过这棵决策树来判断它的 所属类别。
涉及关键概念:节点
① 根节点:没有进边,有出边。包含最初的,针对特征的提问。
② 中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
③ 叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签。
④ 子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点。
3. 基本工作原理描述
(1)根节点
开始时,整个数据集视为 一个 根节点。在根节点上,选择 一个特征,将数据集 分割成 多个子集。选择的特征是 基于某种 度量标准,通常是 根据信息增益(Entropy)、基尼不纯度(Gini Impurity)或均方误差(Mean Squared Error)等来进行选择。
(2)分支节点
接下来,每个子集都被 视为 一个 分支节点,并在 分支节点上选择 另一个特征,再次 将数据集分割成 更小的子集。这个 过程递归地 进行下去,直到 达到某个 停止条件,如 达到 最大深度、节点中的样本数 小于阈值,或者节点的 不纯度 低于阈值。
(3)叶子节点
当不再 进行分割时,节点 被标记为 叶子节点,叶子节点中 包含一个 最终的 类别标签(对于分类问题)或 回归值(对于回归问题)。这个值 是根据 该节点上的数据集的 主要类别(对于分类问题)或 平均目标值(对于回归问题)来确定的。
(4)预测
一旦 构建了决策树,对新的 未见样本 进行预测时,从 根节点开始 根据特征的 值遍历树的 分支,直到达 到叶子节点。然后,将 叶子节点的 类别标签 或 回归值作为 预测结果。
4. 划分准则
(1)信息增益(Information Gain)
信息增益是 用于分类问题的 常见划分准则,它 基于 信息论的 概念。在每个节点上,根据 特征的 取值将数据集 分成多个子集,然后 计算每个子集的 熵(Entropy),然后 计算 信息增益,它是 父节点熵 与 子节点熵 之差。信息增益越大,意味着划分后的数据 更加纯净,更 有助于分类。
熵的计算:
对于节点
,
表示类别
在节点
中的样本比例。
表示类别的数量。
熵的值在 0 和 1 之间,越接近 0 表示节点 越纯净,越接近 1 表示节点的不纯度越高。
信息增益的计算:
是父节点的数据集,
是要划分的特征,Values(
) 是特征
的取值集合,
是特征
取值为
时的子节点数据集。
选择 信息增益最大的 特征作为划分特征,可以 使用熵的 减少量来衡量。信息增益的 问题是它偏向于 选择具有 较多取值的 特征。
(2)基尼不纯度(Gini Impurity)
基尼不纯度是 另一种用于 分类问题 的划分准则。在每个节点上,根据 特征的 取值将 数据集分成 多个子集,然后 计算每个子集的 基尼不纯度,它 表示从该子 集中随机选择 两个样本,它们的 类别标签不一致的 概率。基尼 不纯度越低,表示子 节点的 纯度越高。
基尼不纯度的计算:
表示类别的 数量。基尼不纯度的值 在 0 和 1 之间,越接近 0 表示节点 越纯净,越接近 1 表示节点的 不纯度越高。
选择基尼 不纯度最低的 特征作为 划分特征。基尼不纯度 相对于 信息增益 更加 偏好选择取值 较少的 特征,因此 在某些情况下,它可能 会对多分类问题更有利。
(3)均方误差(Mean Squared Error)
均方误差是 用于回归问题的 划分准则。在每个节点上,根据特征的 取值将数据集分成 多个子集,然后 计算每个子集中 目标变量的 均方误差。均方误差越低,表示 子节点的 目标变量值 更接近于 均值,模型对 数据的 拟合越好。
二、sklearn中的决策树
涉及模块:sklearn.tree
1. tree.DecisionTreeClassifier(分类树)
(1)模型基本参数
(2)模型属性
(3)接口
2. tree.DecisionTreeRegressor(回归树)
(1)算法原理
决策树回归是一种基于 树结构的回归模型,它通过 将 特征空间划分为 不同的区域,每个区域内 具有相同的 目标变量值,并通过 构建决策树来 实现预测。决策树回归的 关键思想是 根据特征的 取值进行 划分,选择 最优的 划分特征和 划分点,使得 划分后的 子集内 目标变量的 方差最小化。具体的算法原理如下:
- 计算当前节点的 目标变量的方差,即 平方误差 和;
- 对 每个特征的 每个可能 取值进行 划分,计算 划分后的子集的 平方误差和;
- 选择 划分特征 和 划分点,使得 划分后的 平方误差 和 最小;
- 递归地 继续划 分子集,直到 满足停止 条件,例如 达到最大深度、节点包含的 样本数小于 某个阈值等。
决策树回归的 算法过程 可以通过递归地 构建 二叉树来实现,其中 每个节点 代表一个 特征变量,每个 叶节点代表一个 预测值。为了 找到最佳划分特征 和 划分点,我们可以 使用 贪婪算法,依次评估 每个特征的 每个划分点,并选择 最小的 平方误差和。
(2)重要参数:criterion
回归树 衡量分枝质量的 指标,支持的标准有三种:
① 输入“mse”使用均方误差mean squared error(MSE),父节点和叶子节点之间的 均方误差的差额 将被用来作为 特征选择的标准,这种方法通过使用 叶子节点的均值来 最小化 L2损失。
② 输入“friedman_mse”,使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差。
③ 输入“mae”使用绝对平均误差MAE (mean absolute error),这种指标使用叶节点的中值来 最小化 L1损失。
3. tree.export_graphviz(将生成的决策树导出为DOT格式,画图专用)
4. 其他(补充)
① 信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。
② random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
③ splitter也是用来控制决策树中的随机选项的,有两种输入值,输入“best”,决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random”,决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。
④ 在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止,这样的决策树往往会过拟合。为了让决策树有更好的泛化性,需要要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。
三、决策树的优缺点
1. 优点
① 易于 理解和解释,因为树木可以画出来被看见。
② 需要 很少的 数据准备。其他很多算法 通常都需要 数据规范化,需要 创建虚拟变量并删除空值 等。但 sklearn中的决策树模块 不支持对缺失值的处理。
③ 使用 树的成本(比如说,在预测数据的时候)是用于 训练树的数据点的 数量的 对数,相比于 其他算法,这是一个 很低的成本。
④ 能够同时 处理数字 和 分类 数据,既可以做 回归又可以 做分类。其他技术通常专门用于分析仅具有 一种变量类型的 数据集。
⑤ 能够处理 多输出问题,即含有 多个标签的问题(注意与一个标签中含有多种标签分类的问题区别开)
⑥ 是一个 白盒模型,结果很容易 能够被解释。如果 在模型中可以观察 到给定的情况,则可以通过布尔逻辑 轻松解释 条件。相反,在 黑盒模型中(例如,在人工神经网络中),结果可能更难以解释。
⑦ 可以 使用统计测试验证 模型,这让 我们可以 考虑模型的 可靠性。即使 其假设 在某种程度上 违反了生成数据的 真实模型,也能够表现良好。
2. 缺点
① 决策树学习者 可能创建 过于复杂的树,这些 树不能很好地 推广数据。这称为过度拟合。修剪,设置叶节点所需的最小样本数或设置树的最大深度等机制是 避免此问题所必需的。
② 决策树 可能不稳定,数据中 微小的变化 可能导致 生成完全 不同的树,这个问题需要通过 集成算法来解 决。
③ 决策树的 学习是 基于贪婪算法,它靠 优化局部最优(每个节点的最优)来 试图达到整体的最优,但这种 做法 不能保证返回 全局最优决策树。这个问题 也可以 由集成算法 来解决,在随机森林中,特征和样本会 在分枝过程中 被随机采样。
④ 有些概念 很难学习,因为决策树 不容易表达它们,例如 XOR,奇偶校验 或多路复用器问题。
⑤ 如果标签中的 某些类占 主导地位,决策树学习者 会创建偏向 主导类的树。因此,建议在 拟合决策树 之前 平衡数据集。