小白的决策树学习笔记(详细)

编程入门 行业动态 更新时间:2024-10-22 12:37:18

小白的决策树<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记(详细)"/>

小白的决策树学习笔记(详细)

文章目录

  • 决策树简介
  • 决策树背景知识
    • 信息增益
    • 信息增益率
    • 基尼指数(基尼不纯度)
  • 决策树常见算法
  • 决策树应用示例
    • 决策树的可视化
  • 基于决策树的相关算法
  • Reference

决策树简介

什么是决策树?先看看下图来个直观感受吧,谈过恋爱或者想要谈恋爱的小伙伴一定有过下图的决策过程。

正如上图这般直观,决策树的基本结构可以分为根节点、叶节点、以及分裂的条件。从机器学习的角度来看,就是根据一定的规则不断对样本数据进行节点分裂,直到分裂完成后的节点能够满足既定的预测目标。根据目标变量是连续还是离散的可将决策树分为回归树与分类树,两者在寻找最优分割点的策略上也有所不同。

决策树结构较简单,可解释性强,在需要强解释性金融风控、智慧医疗等领域中得到了广泛应用。虽然决策树基本结构简单,但以决策树为基模型的Random Forest、Adaboost、Xgboost、LightGBM、Catboost等集成学习模型性能却可媲美深度学习,且解释性更强。所以决策树以及以决策树为基模型的机器学习算法是大伙儿的必备利器。

决策树背景知识

决策树分裂的目标主要是让无序的数据变得有序,在分类决策树中选择最优分裂点的三大度量分别为:信息增益、信息增益率、基尼不纯度。

信息增益

信息增益定义为分裂前后的信息熵差值,信息熵越大代表着事物越不确定,即信息增益越大代表着此次分裂把事物的不确定性减少得越多。随机变量X的信息熵H(X)定义为:
其中p(x)代表取值为x时的概率,log为以2或者e为底的对数。可以看出,当概率值为0.5时信息熵最大,即随机变量的不确定性最大。

条件熵H(Y|X)表示已知随机变量X的条件下随机变量Y的不确定性,H(Y|X)可由以下公式推导:


基础的概念解决后,信息增益的计算公式如下:

其中S为全部样本的集合,value(T)为属性划分后,T所有取值的集合,v是T的其中一个属性值,Sv是S中属性T的值为v的样例集合,|Sv|为Sv中所含样例数。

信息增益率

信息增益率定义为节点信息增益与该节点分裂信息度量的比值。节点分裂信息度量SplitInformation(S,T)即为特征T的熵。
其中k为特征T的取值数。

基尼指数(基尼不纯度)

基尼指数表示在样本集合中随机选中的样本被分错的概率,衡量集合的“纯度”(或者说“无序程度”),基尼指数越小,集合纯度越高,分类效果越好。其详细的定义如下(源自李航 《统计学习方法》):

决策树常见算法

常见的决策树算法有ID3,C4.5,CART等,其中ID3的分裂指标为信息增益。
C4.5的分裂指标为信息增益率,为ID3的一种改进,即尽量选择取值较少(所含信息量较少)的特征进行分割,避免含有更多信息的特征在浅层的根节点中被分割(比如说对一个班的同学进行决策树分类,越接近于具体某位同学的描述应该放在每一个大类的分类描述之后)。CART为分类回归决策树,其决策树设定为二叉树,即可分类,也可回归,作分类树时以基尼指数为分裂指标;作回归树时则遍历每个节点,在每个节点处最小化一个目标变量为连续变量的损失函数,一般为均方误差,寻找最优的特征空间分割点以最小化误差。决策树的训练流程大致如下图所示,通过不断循环,使树的层数、节点数增加,即拟合能力增加,达到生长停止条件时(样本不可再分,或人为设置停止条件)结束训练。在分类树中也可考虑对连续特征进行分桶操作以提高决策树对连续型特征的利用能力,使模型更健壮。

决策树应用示例

决策树原理不太复杂,调用的步骤同样比较简单,上述的几种决策树算法都可以通过sklearn调包实现,只需调用sklearn.tree.DecisionTreeClassifier时换用不同的分裂指标即可实现不同的分类决策树,调用sklearn.tree.DecisionTreeRegressor即可实现回归树。下面以分类树展开应用示例。

##sklearn官方文档中的应用示例
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier(random_state=0) ##调用决策树分类器,并设定随机种子
iris = load_iris()  ##加载数据集
cross_val_score(clf, iris.data, iris.target, cv=10) '''对全数据集进行交叉验证,交叉验证折数为10即将全数据集分为十份,每次取其中一份作为测试集,剩下九份作为训练集,决策树分类器在训练集上训练,训练后在测试集上测试'''

对新数据的预测可调用clf.predict(),sklearn中的clf.predict_proba()还可输出分类的概率值,sklearn库中可直接调用实现的功能如下:

官方文档中提到基于基尼指数作为分裂指标时,可使用clf.feature_importances_得到由基尼指数决定的特征重要性,但此特征重要性分析会偏向于把特征值多(即特征纯度低)的特征视为重要特征,推荐使用sklearn.inspection.permutation_importance作为替代,即依次随机打乱某列特征,观察打乱前后分类性能指标的变化判断该特征的重要性。

决策树中的重要参数以及调参注意事项这篇文章归纳得比较全

决策树的可视化

决策树的最大特点就是可解释性强,其可视化的手段也是比较多,具体实现参考这篇文章。

##简单绘制决策树
from sklearn import tree
tree.plot_tree(clf) ##调用graphviz库可视化决策树,与简单绘制决策树相比返回iris.pdf文档
import graphviz
iris = load_iris()
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("iris")  ##tree.export_graphviz()可对决策树可视化中的各要素进行视觉优化,graph为视觉优化后的决策树可视化图
dot_data = tree.export_graphviz(clf, out_file=None,feature_names=iris.feature_names,class_names=iris.target_names,filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)  ##以文本的形式可视化决策树
from sklearn.tree.export import export_text
r = export_text(clf, feature_names=iris['feature_names'])  

基于决策树的相关算法


基于决策树的优秀集成算法非常多,基于Bagging集成策略的主要有随机森林,近年来性能及其突出的LightGBM、Catboost、Xgboost等则是基于Boosting集成策略的,集成后性能大幅度优于决策树,同时也一定程度上保留了决策树的可解释性。由于本篇笔记的主角是决策树,要详细介绍这几种优秀的基于决策树的算法的话没有一万字也是说不完的,而我此前做的项目主要也是集成学习这一块,之后也打算总结一下项目过程中学习到的关于各大集成学习算法的知识,所以本篇笔记就先到此为止吧。关于LightGBM、Catboost、Xgboost的对比,这一篇文章写得非常好,不过可能得翻墙。

Reference

决策树补充+调参

决策树算法

sklearn官方文档

《深度学习原理与Tensorflow实践》黄理灿

《统计学习方法》 李航

更多推荐

小白的决策树学习笔记(详细)

本文发布于:2024-03-12 01:09:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1730360.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   详细   决策树

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!