文章目录

  • DecisionTreeClassifier 分类树
    • ① 重要参数:criterion 不纯度的计算
      • ♦ 基本概念
      • ♦ 选择方式
      • ♦ 基本计算流程
      • ♦ 案例
    • ② 重要参数:random_state & splitter
    • ③ 剪枝参数
      • ▶ max_depth
      • ▶ min_samples_leaf & min_samples_split
      • ▶ max_features & min_impurity_decrease
      • ▶ 确认最优剪枝参数
      • ▶ 目标权重参数:class_weight & min_weight_fraction_leaf
    • ④ 重要属性和接口
    • 总结

DecisionTreeClassifier 分类树

class sklearn.tree.DecisionTreeClassifier (criterion=’gini’, splitter=’best’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None,
random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,
class_weight=None, presort=False)

① 重要参数:criterion 不纯度的计算

♦ 基本概念

为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心,大多是围绕在对某个不纯度相关指标的最优化上。

不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的,也就是说,在同一棵决策树上,叶子节点的不纯度一定是最低的。

Criterion参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:

  • 输入”entropy“,使用信息熵(Entropy)
  • 输入”gini“,使用基尼系数(Gini Impurity)

其中t代表给定的节点,i代表标签的任意分类, p ( i ∣ t ) p(i|t) p(i∣t)代表标签分类i在节点t上所占的比例。

注意:当使用信息熵时,sklearn实际计算的是基于信息熵的信息增益(Information Gain),即父节点的信息熵和子节点的信息熵之差。比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。

对于信息熵的理解参见大佬博文~

返回顶部


♦ 选择方式

返回顶部


♦ 基本计算流程

  • 直到没有更多的特征可用,或整体的不纯度指标已经最优,决策树就会停止生长。

返回顶部


♦ 案例

import pandas  as  pd
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier# 获取数据集
wine_data = load_wine()
x = pd.DataFrame(wine_data.data)
y = wine_data.target
feature = wine_data.feature_names
x.columns = feature# 划分测试集、训练集
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.3, random_state=420)# 建模
clf = DecisionTreeClassifier(criterion="entropy").fit(xtrain, ytrain)
# 返回预测的准确度 accuracy
score = clf.score(xtest, ytest)  # 0.9629629629629629feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
import graphviz
dot_data = tree.export_graphviz(clf,feature_names= feature_name,class_names=["琴酒","雪莉","贝尔摩德"],filled=True,rounded=True)
graph = graphviz.Source(dot_data)
print(graph)
  • filled=True 按照所分的类别进行颜色填充

  • rounded=True 显示的方框是否为圆角

  • 通过绘制出的决策树模型可以看到其中的entropy就是之前提到的信息熵不纯度计算方式的结果,越往后其值越小,验证了:不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的

  • 查看特征重要性,并匹配。(类似于回归模型中的回归系数)

#特征重要性
feature_im = clf.feature_importances_
match = [*zip(feature_name,clf.feature_importances_)]


返回顶部


② 重要参数:random_state & splitter

random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。

splitter也是用来控制决策树中的随机选项的,有两种输入值输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能性。当然,树一旦建成,我们依然是使用剪枝参数来防止过拟合。

clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="random")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score
import graphviz
dot_data = tree.export_graphviz(clf,feature_names= feature_name,class_names=["琴酒","雪莉","贝尔摩德"],filled=True,rounded=True)
graph = graphviz.Source(dot_data)
graph
  • 显然当设置splitter参数为random的时候,拟合出来的树模型深度要比best的深(由于图片较大没有截取完整的)。

    返回顶部

③ 剪枝参数

在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一棵决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足。(没有绝对的完美,就是说对于模型对于训练集的拟合越是完美,细节过于到位,其局限性就越高,或许拟合出来的模型对于新数据集的适应能力反而较差)

为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。sklearn为我们提供了不同的剪枝策略:

▶ max_depth

max_depth限制树的最大深度,超过设定深度的树枝全部剪掉。这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从3开始尝试,看看拟合的效果再决定是否增加设定深度。

▶ min_samples_leaf & min_samples_split

  • min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从5开始使用。如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差,过拟合的叶子节点出现。对于类别不多的分类问题,1通常就是最佳选择。

  • min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。

▶ max_features & min_impurity_decrease

  • 一般max_depth使用,用作树的”精修“。
  • max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
  • min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。sklearn实际计算的是基于信息熵的信息增益(Information Gain),即父节点的信息熵和子节点的信息熵之差。也就是说当父节点与子节点之间的的entroy差越大,就说明该层对于整棵树的拟合效果贡献越大

▶ 确认最优剪枝参数

  • 那具体怎么来确定每个参数填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了,继续使用我们
    已经训练好的决策树模型clf。超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲 线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。
import matplotlib.pyplot as pltscores = []
for i in range(10):clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="random",max_depth=i+1).fit(xtrain, ytrain)score = clf.score(xtest, ytest)scores.append(score)
fig = plt.figure(figsize=(10,6))
plt.plot(range(1,11),scores)
plt.show()

这里我们使用不同的max_depth参数来进行学习曲线的绘制,通过图像可以看出,在树的深度为5的时候,模型精确度达到了最大,为6的时候有所下降,并且之后保持不变,说明6之后的树深度对于模型的影响几乎没有。

▶ 目标权重参数:class_weight & min_weight_fraction_leaf

  • 完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重

  • 有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。

返回顶部


④ 重要属性和接口

属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。sklearn中许多算法的接口都是相似的,比如说我们之前已经用到的fitscore,几乎对每个算法都可以使用。除了这两个接口之外,决策树最常用的接口还有applypredictapply中输入测试集返回每个测试样本所在的叶子节点的索引predict输入测试集返回每个测试样本的标签

返回顶部


总结

七个参数:

  • Criterion 不纯度计算
  • 两个随机性相关的参数(random_statesplitter
  • 四个剪枝参数(max_depth, min_sample_leafmax_featuremin_impurity_decrease

一个属性:feature_importances_

四个接口:fitscoreapplypredict


【skLearn 分类、回归算法】DecisionTreeClassifier 分类树相关推荐

  1. sklearn实现GBDT算法(分类)

    阿喽哈~小天才们,今天我们聊一聊GBDT 上一篇文章我们详细地说了GBDT算法原理,包括为什么拟合负梯度.负梯度为何可以替代残差.二分类GBDT算法公式和实例演算,感兴趣的童鞋请移步GBDT算法详解& ...

  2. 自然语言处理算法回归算法和分类算法

    人工智能学习算法分类 纯算法类 1.回归算法 回归分析是在一系列的已知或能通过获取的自变量与因变量之间的相关关系的基础上,建立变量之间的回归方程,把回归方程作为算法模型,通过其来实现对新变量得出因变量 ...

  3. 机器学习中常见的分类 回归 聚类算法小结

    Date: 2019-08-15 今天开始总结和复习机器学习知识点: 一句话概括: 1. 聚类:无监督学习,学习结果将产生几个集合,集合中的元素彼此相似: 2. 分类:有监督学习,学习结果将产生几个函 ...

  4. Python机器学习--分类\回归--决策树算法

    决策树算法类型 决策树是一系列算法,而不是一个算法. 决策树包含了 ID3分类算法,C4.5分类算法,Cart分类树算法,Cart回归树算法. 决策树既可以做分类算法,也可以做回归算法.因此决策树既可 ...

  5. 基于机器学习逻辑回归算法完成癌症病人的肿瘤是否良性的判断

    https://www.toutiao.com/a6630407688360575502/ 2018-12-04 22:46:48 逻辑回归算法 虽然逻辑回归算法的名字中有回归二字,但是它却不是回归算 ...

  6. 机器学习笔记(10)——逻辑回归算法优化之随机梯度下降法

    在上一篇文章<机器学习笔记(9)--深入理解逻辑回归算法及其Python实现>中,详细学习了逻辑回归算法的分类原理和使用梯度下降法来最小化损失函数的数学推导过程,从而拟合出分类函数的参数θ ...

  7. 数学解析Logistic回归算法

    数学解析Logistic回归算法 在<Logistic回归算法(分类问题)>一节,我们学习了 Logistic 回归算法,并且重点认识了 Logistic 函数.我们知道分类问题的预测结果 ...

  8. Py之scikit-learn:机器学习sklearn库的简介、六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类)、安装、使用方法(实际问题中如何选择最合适的机器学习算法)之详细攻略

    Py之scikit-learn:机器学习sklearn库的简介(组件/版本迭代).六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类).安装.使用方法(实际问题中如何选择最合适的机器学 ...

  9. 数据挖掘十大经典算法--CART: 分类与回归树

    一.决策树的类型  在数据挖掘中,决策树主要有两种类型: 分类树 的输出是样本的类标. 回归树 的输出是一个实数 (例如房子的价格,病人呆在医院的时间等). 术语分类和回归树 (CART) 包含了上述 ...

最新文章

  1. Question: Database Of Tumor Suppressors And/Or Oncogenes
  2. 前端暗黑模式,你了解多少
  3. Jmeter性能测试的标准流程
  4. 关于Excel的最大行数和列数。
  5. Word 2013 使用技巧
  6. JSOI2007 文本生成器
  7. nachos模拟linux,Ubuntu 10.10成功安装Nachos
  8. 隧道管廊UWB定位系统解决方案
  9. 计算机桌面怎么改为d盘,WinXP桌面路径修改成D盘的步骤
  10. 京东多个物流信息怎么批量查询,并分析派件时效
  11. 前后端分离开发,如何定义各类错误码?
  12. Unity3D游戏开发之自由视角状态下的角色控制
  13. 电商网上购物成为非洲人喜欢的一种新颖购物方式
  14. 听说你想用开发者工具调试我的网站?挺可以的啊。25
  15. 基于thinkphp5的开源cms
  16. 坚定、信心和进取是成功的基石
  17. 公有iot私有iot架构_玩洋葱Omega IoT设备在OLED屏幕上显示实时血糖
  18. 企业级监控系统zabbix---通过qqmail发送告警信息
  19. 富力等待黎明:李思廉走在还债的漫漫长路
  20. php汽车之家数据api,2018汽车之家汽车品牌车型数据新鲜出炉

热门文章

  1. 【券商报告】信息服务行业AI产业链深度研究(2)AI+驾驶:蔚来,这不是汽车,这是一个移动的计算中心——附下载链接
  2. bzoj2560 串珠子 状压dp+FWT
  3. 微信小程序(三):选座系统(主要内容:列表渲染的应用)
  4. 质控软件fastp常用参数说明
  5. 哪所大学教php_【优秀营员amp;考核成绩6所】人大+厦大+南开大学+西交+东北大学+中国石油大学...
  6. 国内如何创建google(谷歌)账号?
  7. 100%成功注册Google账号的方法
  8. 精准找到B站大家爱看的王冰冰——用Python
  9. 搭建高可用的MongoDB集群(一):MongoDB的配置与副本集
  10. ASCII编码与Unicode编码