机器学习python决策树(tree.DecisionTreeRegressor)算法实例

本文python决策树使用sklearn.tree.DecisionTreeRegressor模型来进行总结。首先我们要了解python机器学习中决策树用来做什么的,然后清楚的知道算法原理,最后才能将决策树算法应用到实际场景当中。
决策树,就是一种把决策节点画成树的辅助决策工具,一种寻找最优方案的画图法。画决策树有三步:第一步,写出你想要实现的目标;第二步,在目标的右侧写出实现这个目标的所有方案;第三步,评估每个方案的结果,以及这些结果实现的概率;

  • 决策树介绍
    • 1.什么是决策树
    • 2.决策树能做什么
    • 3.决策树算法分类
    • 4.决策树剪枝
  • 决策树参数
  • 案例讲解

决策树介绍

1.什么是决策树

决策树字面意思可以拆分为决策与树,数有主干、枝干、叶这些部分。我们可以想象一下一棵树是什么样的,决策数据就是由根节点开始一步步走到叶子节点。下图就是常见的决策树的样子。
机器学习python决策树(tree.DecisionTreeRegressor)算法实例_第1张图片
最上面的圆点我就是开始的位置我们叫它根节点,继续往下判断分类的圆点我们叫它分支节点,最后没法再分的方块叫叶子节点。所以我们通常理解的根节点:第一个选择点;非叶子节点与分子:为中间的过程;叶子节点:为最终的决策分类结果。

2.决策树能做什么

决策树是将所有的数据都落到叶子节点,既可以做分类也可以做回归(本文主要讨论分类问题)。在分类问题中,表示基于特征对实例进行分类的过程,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。所以我们可以使用决策树进行一些基于样本而获取目标需求的概率分布情况,以下举一些简单的例子来说明:
有一家电商平台老板想提高产品销量,从可能会影响销量的因子:天气、时间、促销活动来分析是否对销量高低有影响,影响有多大。从而决策是否在哪些节点投入更多的资源来扩大销量。那么这种场景我们就把天气、时间、促销活动这三个作为训练样本,样本对应的销量高低作为目标标签。通过决策树就能很快的画出这每个节点的对于目标标签的概率,最终通过结果帮助决策应该用什么方式来提高销量。
机器学习python决策树(tree.DecisionTreeRegressor)算法实例_第2张图片

3.决策树算法分类

决策树算法 算法描述
ID3算法 其核心是在决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮组确定生成每个节点时所采用的合适属性
C4.5算法 C4.5决策树生产算法对于ID3算法的重要改进是使用信息增益率来选择节点属性。C4.5算法可以克服ID案发存在的不足:ID3算法只使用与离散的描述属性,而C4.5算法即能够处理离散的描述属性,也可以处理连续的描述属性
CART算法 CART决策树是一种十分有效的非参数分类和回归方法,通过构建树、修建树、评估树来构建一个二叉树。当终结点是连续变量时,该树为回归树;当终结点是分类变量,该树为分类树

根节点的选择该用哪个特征呢?接下来呢?如何切分呢?
我们的目标应该是根节点就像一个老大似的能更好的切分数据(分类的效果更好),根节点下面的节点自然就是二当家了。通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,以此类推。
衡量标准-熵:熵是表示随机变量不确定性的度量(解释:说白了就是物体内部的混乱程度,比如杂货市场里面什么都有那肯定混乱呀,专卖店里面只卖一个牌子的那就稳定多啦)

公式:H(X)=-Σ pi * logpi, i=1,2, … , n

一个栗子:A集合[1,1,1,1,1,1,1,1,2,2];B集合[1,2,3,4,5,6,7,8,9,1]
显然A集合的熵值要低,因为A里面只有两种类别,相对稳定一些而B中类别太多了,熵值就会大很多。(在分类任务中我们希望通过节点分支后数据类别的熵值大还是小呢?)不确定性越大,得到的熵值也就越大。当p=0或p=1时,H(p)=0,随机变量完全没有不确定性;当p=0.5时,H(p)=1,此时随机变量的不确定性最大。

4.决策树剪枝

为什么要剪枝:决策树过拟合风险很大,理论上可以完全分得开数据。想象一下,如果树足够庞大,每个叶子节点不就一个数据了嘛。这样看起来不是找不到终点,而且展示出来也会有很大的问题。所以我们就要进行决策树剪枝!
剪枝策略分为:预剪枝和后剪枝
预剪枝:边建立决策树边进行剪枝的操作(更实用),限制深度,叶子节点个数
叶子节点样本数,信息增益量等。
后剪枝:当建立完决策树后来进行剪枝操作,通过一定的衡量标准这里写图片描述(叶子节点越多,损失越大)
机器学习python决策树(tree.DecisionTreeRegressor)算法实例_第3张图片

决策树参数

官网链接,详情请点击这里查看

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)

列举常用的参数,调整参数就是上面讲的剪枝。因为所有参数都是来精简决策树的
1.criterion 标准有gini or entropy可以选择
2.splitter best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)
3.max_features None(所有),log2,sqrt,N 特征小于50的时候一般使用所有的
4.max_depth 数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下
5.min_samples_split 如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值
6.min_samples_leaf 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值,大些如10W可是尝试下5
7.min_weight_fraction_leaf 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了
8.max_leaf_nodes 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到
9.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高
10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点

案例讲解

在python机器学习sklearn.tree里面要构建决策树模型大体可以分为五部:数据导入数据预清理数据预处理构建模型设置参数模型输出
本文案例数据点击下载

import pandas as pd 
from sklearn import tree #导入决策树模块
import graphviz #导入可视化模块

#导入数据
data=pd.read_excel(r'C:\Users\huangjunwen\Desktop\sales_data.xls')

#对数据进行清理 
data=data.replace([['好','是','高']],1)#将数据集中的好,是,高替换成数字1
data=data.replace([['坏','否','低']],-1)#将数据及中的坏,否,低替换成数字-1
x=data.iloc[:,1:4]#选择训练集
y=data.iloc[:,4]#选择对应目标标签

#创建决策树模型并设置参数
dtc=tree.DecisionTreeClassifier(criterion='entropy')#创建基于信息熵的模型
dtc.fit(x,y)#训练模型

#模型输出
dot_data = \  #设置输出的参数
    tree.export_graphviz(
            dtc, #(决策树模型)
            out_file = None, 
            feature_names = ['天气','周末','促销'], #模型中对应标签名称
            filled = True,
            impurity = False,
            rounded = True
    )
dot_data=dot_data.replace('helvetica','"Microsoft Yahei"')
#因为标签是中文所以需要将参数设置成支持微软雅黑的格式

graph=graphviz.Source(dot_data)#选择要可视化的dot数据
graph.render(r'C:\Users\huangjunwen\Desktop\tree')#将可视化结果输出至指定位置

关于决策树可视化输出报错InvocationException: GraphViz’s executables not found需要用到第三方库graphviz如何安装及问题请点击此处
机器学习python决策树(tree.DecisionTreeRegressor)算法实例_第4张图片

你可能感兴趣的:(python—数据分析,学习python数据分析)