算法梳理之决策树
算法梳理之决策树
一、信息论基础
1、信息量:信息量就是不确定度,不确定性越强,信息度就越大。
2、自信息:就是指具体某一事件发生时所带来的信息量的多少。也可以理解为如果某事件发生的概率越大,则其自信息就越小。具体的自信息公式如下:
I
(
p
i
)
=
−
l
o
g
(
p
i
)
I(p_i)=-log(p_i)
I(pi)=−log(pi)
p
i
表
示
随
机
变
量
的
第
i
个
事
件
发
生
的
概
率
,
自
信
息
单
位
是
b
i
t
。
p_i表示随机变量的第i个事件发生的概率,自信息单位是bit。
pi表示随机变量的第i个事件发生的概率,自信息单位是bit。
3、熵:用来描述整个随机分布所带来的信息量平均值。公式如下:
熵只依赖X的分布,和X的取值没有关系,熵是用来度量不确定性,当熵越大,即X=xi的不确定性越大,反之越小,当用在分类中时,熵越大即这个类别的不确定性更大,反之越小.
针对二元随机变量分布:联合熵,条件熵
4、联合熵:对于服从服从联合分布p(x,y)的一对离散型随机变量(X,Y),其联合熵公式为:
5、条件熵:知道X发生的条件下,Y发生的不确定性。(在X给定条件下,Y的条件概率分布的熵对X的数学期望)公式如下:
6、信息增益:
7、基尼不纯度:在样本集合中,一个随机选中的样本被分类分错的概率。通俗理解就是一个随机事件变成它的对立事件的概率。公式如下:
基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率。
二、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并返回。
优点:用信息增益去筛选变量。
缺点:
1、ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。
2、ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。
3、 ID3算法对于缺失值的情况没有做考虑
4、没有考虑过拟合的问题
三、C4.5(原理,过程,优缺点)
C4.5基于ID3算法基础,对ID3的4点不足做了改善。C4.5算法用信息增益率来选择划分属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足在树构造过程中进行剪枝;能够完成对连续属性的离散化处理;能够对不完整数据进行处理。
过程:
C4.5处理数值属性的过程如下:
1、按照属性值对训练数据进行排序;
2、用不同的阈值对训练数据进行动态划分
3、当输入改变时确定一个阈值
4、取当前样本的属性值和前一个样本属性值的中点作为新的阈值
5、生成两个划分,所有的样本分布到这两个划分中
6、得到所有可能的阈值、增益和增益比例
优点:C4.5算法产生的分类规则易于理解、准确率较高。
缺点:
1、算法低效,在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。
2、内存受限,适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。
四、CART分类树(原理,过程,优缺点)
CART算法的全称是Classification And Regression Tree,采用的是Gini指数(选Gini指数最小的特征s)作为分裂标准,同时它也是包含后剪枝操作。
过程:
输入:训练数据集D,停止计算的条件
输出:CART决策树
具体步骤:
(1)计算现有特征对该数据集的基尼指数,对于每一个特征A,可以对样本点A是否为a可以将数据集D分成数据集D1,D2D1,D2。
(2)对于所有的特征A和所有可能的切分点a,选择基尼指数最小的特征以及相对应的切分点作为最优特征和最佳切分点。
(3)对最优子树递归调用(1)(2),直到满足停止条件。
(4)生成CART分类树。
优点:先比ID3和C4.5,CART提高了生成决策树的效率
缺点:
1、 对连续性的字段比较难预测。
2、对有时间顺序的数据,需要很多预处理的工作。2.对有时间顺序的数据,需要很多预处理的工作。
3、当类别太多时,错误可能就会增加的比较快。
CART剪枝思路:
五、连续特征和离散特征处理
当属性的类型是离散型,不用对数据进行离散化处理;当属性类型为连续型,则需要对数据进行离散化处理。下图是采用二分法(C4.5也使用)对连续属性离散化:
六、 剪枝 模型评估
剪枝是一个简化过拟合决策树的过程。有两种常用的剪枝方法:
预剪枝:
预剪枝的核心思想是在对每一个节点划分之前先进行计算,如果当前节点的划分并不能够带来模型泛化能力的提升就不再进行划分,对于未能够区分的样本种类(此时可能存在不同的样本类别同时存在于节点中),按照投票(少数服从多数)的原则进行判断。
后剪枝:
后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,在剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识。
附上剪枝流程图:
七、 sklearn参数详解
from sklearn.tree import DecisionTreeRegressor
DecisionTreeRegressor(criterion="mse",splitter="best",max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.,
max_features=None, random_state=None, max_leaf_nodes=None,
min_impurity_decrease=0., min_impurity_split=None, presort=False)
共12个参数:
criterion="mse":特征选择的标准,有信息增益和基尼系数两种,使用信息增益的是ID3和C4.5算法(使用信息增益比),使用基尼系数的CART算法,默认是gini系数。
splitter="best":特征切分点选择标准,决策树是递归地选择最优切分点,spliter是用来指明在哪个集合上来递归,有“best”和“random”两种参数可以选择,best表示在所有特征上递归,适用于数据集较小的时候,random表示随机选择一部分特征进行递归,适用于数据集较大的时候。
max_depth=None:树的最大深度。如果为None,则表示树的深度不限,直到
每个叶子都是纯净的,即叶节点中所有样本都属于同一个类别,
或者叶子节点中包含小于min_samples_split个样本。
min_samples_split=2:子数据集再切分需要的最小样本量,默认是2,如果子数据样本量小于2时,则不再进行下一步切分。如果数据量较小,使用默认值就可,如果数据量较大,为降低计算量,应该把这个值增大,即限制子数据集的切分次数。
min_samples_leaf=1:叶节点(子数据集)最小样本数,如果子数据集中的样本数小于这个值,那么该叶节点和其兄弟节点都会被剪枝(去掉),该值默认为1
min_weight_fraction_leaf=0.:在叶节点处的所有输入样本权重总和的最小加权分数,如果不输入则表示所有的叶节点的权重是一致的。
max_features=None:特征切分时考虑的最大特征数量,默认是对所有特征进行切分。
random_state=None:随机种子的设置,与LR中参数一致。
max_leaf_nodes=None:最大叶节点个数,即数据集切分成子数据集的最大个数。
min_impurity_decrease=0.:切分点最小不纯度,用来限制数据集的继续切分(决策树的生成)。
min_impurity_split=None:权重设置,主要是用于处理不平衡样本。
presort=False:是否进行预排序,默认是False。
参考文章:
https://blog.youkuaiyun.com/xbmatrix/article/details/56691137
http://leijun00.github.io/2014/09/decision-tree/
https://juejin.im/post/5aa503b4518825555d46e1d8
https://blog.youkuaiyun.com/wj176623/article/details/52497099
https://blog.youkuaiyun.com/gzj_1101/article/details/78355234