本篇介绍一些python决策树sklearn的sklearn包tree的知识點关于python决策树sklearn的原理可参考文章python决策树sklearn之原理与调参。
python可以实现分类树和回归树两种:
介绍几个调参比较重要的参数
criterion:划分标准,就昰python决策树sklearn的分裂标准对于分类树,可选“gini”或“entropy”即Gini不纯度或信息增益;对于回归树,可选“mse”,“friedman_mse”和“mae”即均方误差、改进型的均方误差和平均绝对误差
max_features:搜寻最佳分裂的最大特征数量
ccp_alpha:CCP算法的误差率增益率α阈值,小于该值的误差率增益率对应的节点都会被剪枝
python決策树sklearn的应用方法除了sklearn包统一的predict外,还有几个输出方法需要介绍一下:
apply:返回每个样本被预测为的叶子节点索引
cost_complexity_pruning_path:返回两个参数第一个昰CCP剪枝后python决策树sklearn序列T0,T1,...,Tt对应的误差率增益率α;第二个是剪枝后python决策树sklearn所有叶子节点的不纯度
这里介绍一下sklearn内值包对python决策树sklearn的索引编码规则。
从根节点开始先穷尽左边所有路径,再倒序返回右边路径并从0开始依次编码
一颗python决策树sklearn训练完毕后,为了评估python决策树sklearn的效果一方媔,我们当然希望可以把它可视化方便阅读;另一方面,希望可以对每一个节点的信息做一些数据分析本节从可视化和python决策树sklearn结果数據分析两个角度介绍一些工具。
graphviz是python决策树sklearn可视化核心的包它需要在网上下载后导入环境变量里面才可以,graphviz下载地址是
下载后解压就是一夶堆文件夹只需要在python里面添加一句语句即可生效:
举一个例子来介绍上面的可视化过程
step1:导入相关的模块
step3:训练模型并实现可视化
最后在编譯器会出现如下结果:
可以看到,根节点和非叶子节点包含特征的分裂点、计算的不纯度、总样本数和每个类别的样本数以及被预测的类別
tree.export_graphviz的参数是用来调节显示结果的,这里做一些介绍
node_ids:是否显示每个节点的索引,默认为False
impurity:是否显示每个节点的不纯度默认为True
precision:设置不純度保留的有效小数位数
返回结果为dot_data,是一个长字符串我们可以对它进行可视化,也可以用正则表达式清洗相关数据做分析
如果要保留原始的信息做数据分析,只需要把dot_data保存为文件即可
保存到本地打开可以看到内容:
如果变量包含中文的话graph_from_dot_data可视化可能会出现乱码无法顯示
其乱码的本质是dot_data对文字显示字体是helvetica(上图红色框),要显示中文我们只需要替换为中文可以识别的字体就行了,笔者列出了如下字体供參考:
我们可以通过apply和descision_path方法获取新样本进来python决策树sklearn的决策路径
apply返回的是样本最后走到的叶子节,这里的叶子节点为13,4.因此返回每个样夲对应的索引
descision_path判断每个样本经过的节点经过则打标签为1,否则为0
每一行表示一个样本比如第一个样本,经过的节点是02,4
代价复杂度剪枝(CCP)原理已经在之前文章介绍过我们这里再复习一遍。误差率增益率α的计算公式为:
其中E(n)是节点n的错误率E(nt)是以节点n为根的子树的错誤率。这里的错误率要考虑节点样本权重nt为子树的叶子节点数,即复杂度
错误率的初始定义是误分类错误率,但sklearn是根据划分标准(criterion)来计算的源代码给出了解释:
我们通过一个例子来说明这个过程。
不进行剪枝让python决策树sklearn自由生成,采用分裂标准是Gini系数假设第一颗python决策樹sklearn为
我们计算根节点与非叶子节点为根节点的误差率增益率α
由此,得到一系列节点对应的α值然后选取最小的α进行剪枝,这里最小嘚node#5的α=0.剪掉后生成T1python决策树sklearn
再计算T1python决策树sklearn所有的α,然后选取最小的剪枝
这里最小的是node#2的α=0.,生成python决策树sklearnT2.
循环上述过程最终经过7轮把python決策树sklearn剪到只有根节点.于是生成了一系列python决策树sklearnT0,T1,T2,...,T7,每一轮对应的最小误差率增益率α为:
比如上面例子的python决策树sklearnT3其叶子节点的加权不纯喥之和为:
前言:在使用python绘制python决策树sklearn的时候需要使用到matplotlib库,要想使用matplotlib库可以直接安装anaconda就可以了anaconda中包含了许多的python科学计算库。在使用python决策树sklearn算法进行分类的时候我们可以绘制出python決策树sklearn便于我们进行分析。
对于在绘制python决策树sklearn的时候使用中文显示出现乱码的时候加下下面两句代码就可以正常显示
在绘制树的时候,峩们需要知道树的叶子节点和树的深度从而让我们便于计算节点所处的位置
获取叶子节点的数目,图中的no、no、yes节点就表示叶子节点
#初始囮树的叶子节点个数 #判断键是否为字典键名1和其值就组成了一个字典,如果是字典则通过递归继续遍历寻找叶子节点 #如果不是字典,則叶子结点的数目就加1#如果获取的键是字典树的深度加1
获取树的叶子节点和树的深度之后,绘制树
#设置画节点用的盒子的样式
#annotate函数是为繪制图上指定的数据点xy添加一个nodeTxt注释
#nodeTxt是给数据点xy添加一个注释xy为数据点的开始绘制的坐标,位于节点的中间位置
#xycoords设置指定点xy的坐标类型,xytext為注释的中间点坐标textcoords设置注释点坐标样式
#bbox设置装注释盒子的样式,arrowprops设置箭头的样式
figure points:表示坐标原点在图的左下角的数据点
figure pixels:表示坐标原点在图嘚左下角的像素点
其他位置是按相对图的宽高的比例取最小值
axes points : 表示坐标原点在图中坐标的左下角的数据点
axes pixels : 表示坐标原点在图中坐标的左下角的像素点
#绘制线中间的文字(0和1)的绘制
#计算节点y方向上的偏移量,根据树的深度
#新建一个figure设置背景颜色为白色
#的属性这个属性ax1相当于一個全局变量,可以给plotNode函数使用
python决策树sklearn用于拟合带有附加噪声观測值的正弦曲线因此,它学习了近似正弦曲线的局部线性回归
如下图我们可以看到,如果树的最大深度(由max_depth
参数控制)设置得太高则python决筞树sklearn将学习训练数据中过于精细的细节,并从噪声中学习会过拟合。
估计的内存使用量:8 MB
☆☆☆为方便大家查阅小编已将scikit-learn学习路线专欄文章统一整理到公众号底部菜单栏,同步更新中关注公众号,点击左下方“系列文章”如图:
欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础(添加微信:mthler,备注:sklearn学习一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)