如何选择模型呢?

如何选择模型.png

决策树算法思想

决策树(decision tree)是一个树结构(可以是二叉树或者非二叉树)。决策树分为分类树和回归树两种分类树对离散变量做决策树,回归树对连续变量做决策树。
其中每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放在一个类别。
使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

决策树的组成

分为三个:根节点;非叶子节点与分支;叶子节点。具体意思如下:

  • 根节点:第一个选择点
  • 非叶子节点与分支:中间过程
  • 叶子节点:最终的决策结果

决策树执行步骤

1.1 特征选择

特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准,从而衍生出不同的决策树算法。

1.2 决策树生成

根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。树结构来说,递归结构是最容易理解的方式。

1.3 决策树的剪枝

决策树容易过拟合,一般来需要剪枝,缩小树结构规则,缓解过拟合,剪枝技术有预剪枝和后剪枝两种。

  • 预剪枝:边建立决策树边进行剪枝的操作(更实用),预剪枝需要限制深度,叶子节点个数,叶子节点样本数,信息增益量等。
  • 后剪枝:当建立完决策树后来进行剪枝操作,通过一定的衡量标准(叶子节点越多,损失越大)

决策树案例

#决策树总结# - 图2

所以根据上面的例子,非常直观容易的得到了一个实例的类别判断,只要你告诉我各个特征的具体值,决策树的判定过程就相当于树中从跟节点到某一个叶子节点的遍历,每一步如何遍历是由数据各个特征的具体特征属性决定。#决策树总结# - 图3
于是构建决策树也就成了最重要的工作。

1.1 特征选择

划分数据集的大原则是:将无序的数据变得更加有序。
我们可以使用多种方法划分数据集,但是每种方法都有各自的优缺点。于是我们这么想,如果我们能测量数据的复杂度,对比按不同特征分类后的数据复杂度,若按某一特征分类后复杂度减少的更多,那么这个特征即为最佳分类特征。
我们的目标是:通过一种衡量标准来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当做根节点,以此类推。而衡量标准就是:熵
Claude Shannon 定义了熵(entropy)和信息增益(information gain)。 下面先介绍一下概念:

5.1 熵(entropy)

在信息论与概率论中,熵(entropy)用于表示“随机变量不确定性的度量
设X是一个有限状态的离散型随机变量,其概率分布为:
#决策树总结# - 图4
则随机变量X的熵定义为:
#决策树总结# - 图5
其中 n代表X的 n 种不同的离散取值,而 pi代表了X取值为 i 的概率,log是以2为底的对数

5.2 条件熵(conditional entropy)

#决策树总结# - 图6
其中:
#决策树总结# - 图7
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。注意一下,条件熵中X也是一个变量,意思是在一个变量X的条件下(变量X的每个值都会取到),另一个变量Y的熵对X的期望。

5.3 信息增益(information gain)

信息增益表示的是:得知特征X的信息而使得类Y的信息的不确定性减少的程度。简单说,就是当我们用另一个变量X对原变量Y分类后,原变量Y的不确定性就会减少了(即熵值减少)。而熵就是不确定性,不确定程度减少了多少其实就是信息增益,这就是信息增益的由来。
所以信息增益的具体定义如下:
特征A对训练数据集D的信息增益g(D,A)定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D/A)之差,即:
#决策树总结# - 图8
一般地,熵H(Y)与条件熵H(Y|X)之差成为互信息(mutual information)。
根据信息增益准则而进行特征选择的方法是:对训练数据集D,计算其每个特征的信息增益,并比他们大小,从而选择信息增益最大的特征。

5.4 信息增益比(information gain ratio)

以信息增益作为特征选择准则,会存在偏向于选择取值较多的特征的问题,可以采用信息增益比对这个问题进行校正。
特征A对训练数据集D的信息增益比定义为其信息增益与训练集D关于特征A的值的熵之比,即:
#决策树总结# - 图9
其中:
#决策树总结# - 图10

code:
https://www.cnblogs.com/wj-1314/p/9428494.html

1.2 决策树生成

决策树的生成算法介绍

划分数据集的最大原则是:使无序的数据变的有序。如果一个训练数据中有20个特征,那么选取哪个做划分依据?这就必须采用量化的方法来判断,量化划分方法有多重,其中一项就是“信息论度量信息分类”。基于信息论的决策树算法有ID3、CART和C4.5等算法,其中C4.5和CART两种算法从ID3算法中衍生而来。
决策树的生成算法由很多变形,这里简单说一下几种经典的实现算法:ID3算法,C4.5算法和CART算法。这些算法的主要区别在于分类结点熵特征选择的选取标准不同,下面了解一下算法的具体实现过程。

一:ID3算法

ID3算法所采用的度量标准就是我们前面提到的“信息增益”。当属性a的信息增益最大时,则意味着用a属性划分,其所获得的“纯度”提升最大,我们所要做的,就是找到信息增益最大的属性。
ID3算法的核心是在决策树的各个节点上应用信息增益准则进行特征选择,具体的做法是:

  • 从根节点上开始,对结点计算所有可能特征的信息增益,选择信息增益最大的特征作为结点的特征,并由该特征的不同取值构建子节点;
  • 对于子节点递归的调用以上方法,构建决策树;
  • 直到所有特征的信息增益均很小或者没有特征可选择的时候为止。

ID3算法具体的算法过程如下:
输入的是 m 个样本,样本输出集合为D,每个样本有 n 个离散特征,特征集合为A,输出为决策树 T。

  • 1,初始化信息增益的阈值€
  • 2,判断样本是否为同一类输出 Di,如果是则返回单节点树T,标记类别为Di
  • 3,判断特征是否为空,如果是则返回单节点树T,标记类别为样本值红输出类别D实例数最多的类别
  • 4,计算A 中的各个特征(一共 n 个)对输出D的信息增益,选择信息增益最大的特征 Ag
  • 5,如果Ag的信息增益小于阈值€,则返回单节点树T,标记类别为样本中输出类别D实例树最多的类别
  • 6,否则,按特征Ag 的不同取值 Agi 将对应的样本输出D分成不同的类别 Di,每个类别产生一个子节点。对应特征为 Agi,返回增加了节点的数 T
  • 7,对于所有的子节点,令 D= Di,A=A-{Ag} 递归调用 2~6 步,得到子树Ti并返回

ID3算法存在的缺点:
1. ID3算法在选择根节点和内部节点中的分支属性时,采用信息增益作为评价标准。信息增益的缺点是倾向于选择取值较多是属性,在有些情况下这类属性可能不会提供太多有价值的信息。
2. ID3算法只能对描述属性为离散型属性的数据集构造决策树 。
3. ID3算法对于缺失值的情况没做考虑。
4.没有考虑过拟合的问题。

在ID3算法中,信息增益(Info-Gain)越大,划分越好,决策树算法本质上就是找出每一列的最佳划分以及不同列划分的先后顺序以及排布

所以说,ID3决策树,或者说信息增益(条件熵)并不是说一定会偏向取值多的特征,而是数据集的不充分以及客观存在的大数定理导致取值多的特征在计算条件熵时容易估计出偏小的条件熵。如果数据集足够大,均分到某特征的每个取值的样本足够多,那么这时信息增益是没有偏向性的。

ID3代码:
https://www.cnblogs.com/wj-1314/p/10268650.html

全部代码:
https://github.com/LeBron-Jian/MachineLearningNote

二:C4.5算法

ID3算法的作者昆兰基于上面的不足,对ID3算法做了改进,这就是C4.5算法,也许你会问,为什么不叫ID4,ID5之类的名字呢?那是因为决策树当时太火爆了,它的ID3一出来,别人二次创新,很快就占了ID4,ID5,所以他另辟蹊径,取名C4.5 算法,后来的进化版为C4.5算法。
C4.5算法与ID3算法的区别主要是在于它在生产决策树的过程中,使用信息增益比来进行特征选择。
实际上,信息增益准则对于可取值数目较多的属性会有所偏好,为了减少这种偏好可能带来的不利影响,C4.5决策树算法不直接使用信息增益,而是使用“信息增益率”来选择最优划分属性,信息增益率定义为:
#决策树总结# - 图11
其中,分子为信息增益,分母为属性X的熵。

需要注意的是,增益率准则对可取值数目较少的属性有所偏好。所以一般这样选取划分属性:先从候选属性中找到信息增益高于平均水平的属性,再从中选择增益率最高的。
虽然C4.5 改善了ID3算法的几个问题,仍然有优化的空间。

  • 1,由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有优化的空间。思路主要有两种:一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。
  • 2,C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
  • 3,C3.5算法只能用于分类,如果将决策树用于回归的话,可以扩大它的使用范围。
  • 4,C4.5算法由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续纸还有大量的排序运算。如果能够加以模型简化可以减少运算强度但不牺牲太多准确性的话,那就更好了。

  • 三:CART算法

    分类与回归树(classification and regression tree,CART)与C4.5算法一样,由ID3算法演化而来。CART假设决策树是一个二叉树,它通过递归地二分每个特征,将特征空间划分为有限个单元,并在这些单元上确定预测的概率分布。
    上面所说的C4.5的几个缺点在CART树里面加以改进。所以如果不考虑集成学习的话,在普通的决策树算法里,CART算法就是比较优的算法了。sklearn的决策树使用的也是CART算法。
    CART算法中,对于回归树,采用的是平方误差最小化准则;对于分类树,采用基尼指数最小化准则

基尼指数

分类问题中,假设有K个类别,样本点属于第k类的概率为pk,则概率分布的基尼指数定义为:
#决策树总结# - 图12

决策树优缺点

优点:
1、可以生成可以理解的规则
2、计算量相对不是很大
3、可以处理连续和种类字段
4、可以清晰的显示哪些字段比较重要(这一特性可以用于特征选择)
缺点:
1、对连续型字段比较难预测
2、对于有时间顺序数据,需要许多预处理工作(为什么?)
3、当类别较多时,错误可能增加的比较快
4、对处理特征关联性比较强的数据时,表现的不是太好
5、一般的算法分类的时候,只是根据一个字段来分类(为什么?)
适用范围:
1、应用决策树决策方法必须具备以下条件:
(1)具有决策者期望达到的明确目标
(2)存在决策者可以选择的两个以上的可行的备选方案
(3)存在决策者无法控制的两个以上不确定因素
(4)不同方案在不同因素下的收益或损失可以计算出来
(5)决策者可以估计不确定因素发生的概率

优点:

  • 容易解释
  • 非参数型


缺点:

  • 趋向过拟合
  • 可能或陷于局部最小值中
  • 没有在线学习

代码:

-- coding: utf-8 --“””
Created on Mon Jul 26 15:34:52 2021

@author: yingtao.xiang
“””

from sklearn import tree
from matplotlib import pyplot as plt
from sklearn import datasets
# from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import os.path

fn=[] # 这里为输入的样本

DATA_DIR=”C:/Users/yingtao.xiang/Desktop/“ #填写路径
x = fn.drop([‘uid’,’oil_actv_dt’,’create_dt’,’bad_ind’,’class_new’],axis = 1)
# 对缺失值处理
# x= x.fillna(0)
y = fn.bad_ind.copy()

决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。 注意区分回归树、分类树
dtree1 = tree.DecisionTreeClassifier(max_depth = 4,min_samples_leaf = 500,min_samples_split = 5000)
dtree = tree.DecisionTreeRegressor(max_depth = 4,min_samples_leaf = 500,min_samples_split = 5000)
“””
参数详解:

DecisionTreeClassifier(criterion=’entropy’, min_samples_leaf=3)函数为创建一个决策树模型,其函数的参数含义如下所示:

criterion:gini或者entropy,前者是基尼系数,后者是信息熵。
splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中,默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random” 。
max_features:None(所有),log2,sqrt,N 特征小于50的时候一般使用所有的
max_depth: int or None, optional (default=None) 设置决策随机森林中的决策树的最大深度,深度越大,越容易过拟合,推荐树的深度为:5-20之间。
min_samples_split:设置结点的最小样本数量,当样本数量可能小于此值时,结点将不会在划分。
min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
min_weight_fraction_leaf: 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。
max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。
class_weight: 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。
min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
“””

“””
注意,参数max_depth控制树的深度为2层,考虑到逻辑上的复杂程度,
在生成规则引擎时一般不适用太深的树。参数min_samples_leaf控制每一个叶节点上的样本个数,
由于一个节点上的样本过少,不具有统计意义,有非常大的可能产生过拟合,故在这里设置最小值为500。
参数min_samples_split控制父节点分化的最小样本个数为5000个,当节点样本数量少于5000时,则不再分化。
“””

dtree = dtree.fit(x,y)
clf = dtree.fit(x,y)

pydotplus 可视化显示
import pydotplus
from IPython.display import Image
# from sklearn.externals.six import StringIO
from six import StringIO
import os

os.environ[“PATH”] += os.pathsep + ‘C:/Program Files (x86)/Graphviz/bin/‘

dot_data = StringIO()
tree.export_graphviz(dtree, out_file=dot_data,
feature_names=x.columns,
class_names=[‘bad_ind’],
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())

文本显示
text_representation = tree.export_text(clf)
print(text_representation)

Save rules
with open(os.path.join(DATA_DIR, “decistion_tree.log”), “w”) as fout:
fout.write(text_representation)

可视化显示
fig = plt.figure(figsize=(25,20))
_ = tree.plot_tree(
clf,
feature_names=x.feature_names, #list [‘sepal length (cm)’,’sepal width (cm)’,’petal length (cm)’,’petal width (cm)’]
class_names=y.target_names, #numpy.ndarray array([‘1’, ‘0’,])
filled=True
)

Save picture
fig.savefig(DATA_DIR+”decistion_tree.png”)

根据决策树的条件划分 出客户群体
dff1 = fn.loc[(fn.pay_amount_tot>240387.5)&(fn.oil_amount_num>3.5)].copy()
dff1[‘level’] = ‘past_A’
dff2 = fn.loc[(fn.pay_amount_tot>240387.5)&(fn.oil_amount_num<=3.5)].copy()
dff2[‘level’] = ‘past_B’
dff3 = fn.loc[fn.pay_amount_tot<=240387.5].copy()
dff3[‘level’] = ‘past_C’