决策树概念
根据数据特征划分的一棵树,每个分枝是由某个不同的特征划分得到的。
特点:
直接解决了多分类问题(不需要ovo或ovR),也能解决回归问题
直观而且具有可解释性。
熵的引入
熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,熵是对不确定性的测量。
1948年,香农Claude E. Shannon引入信息(熵),将其定义为离散随机事件的出现概率。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。
信息熵的定义
如果一个随机变量X的可能取值为X = {x1, x2,…, xk},其概率分布为P(X = xi) = pi(i = 1,2, …, n),则随机变量X的熵定义为
最简单的,如果我们的数据集类别仅取0和1两个元素,其概率为P和(1-P),那么该数据集的熵即可为如下图所示
由图可见,对于二元离散数据集,当P=0.5时,数据集最不稳定,这时候的信息熵最大;当P越靠近0或者1的时候,信息熵逐渐降低,数据集也越来越稳定。
如何划分一颗决策树呢?
遍历所有的维度和该维度上的可能取值进行划分,使得划分后树的信息熵降低。
基尼系数
基尼系数越大,数据的不确定性越高;基尼系数越小数据的不稳定性越低。
决策树的过拟合现象:
样本里的噪音干扰数据太大,使得模型对这些噪音拟合从而出现过拟合现象。
通过剪枝来解决过拟合问题。
决策树的剪枝和超参数
random_state:
无论决策树模型如何进化,在分枝上的本质都是追求某个不纯度指标的优化,不纯度是基于节点来计算的.也就是说,决策树在建树时,是靠优化节点来追求一棵优化的树,但最优的节点能够保证最优的树吗, 不一定. 那应该怎么解决 这个问题呢. sklearn解决这个问题的方法: 既然可以树不能保证最优,那就建更多的不同的树,然后从中取最好的.
怎样从一组数据集中建不同的树呢:scikit-learn在每次分枝时, 不使用全部特征, 而是随机选取一部分特征,从中选取不纯度相关指标最优的作为分枝用的节点. 这样,每次生成的树也就不同了. 这里对于特征的随机选取,就是random_state的意思
splitter:
splitter也是用来控制决策树中的随机选项的,有两种输入值:
输入"best", 决策树在分枝时虽然随机, 但是还会优先选择更重要的特征(feature_importances_)进行分枝;
输入"random", 决策树在分枝时对于特征的选择更加随机
max_depth: 限制树的最大深度,超过设定深度的树枝全部剪掉
min_samples_leaf:
一个节点在分枝后的每个子节点必须包含min_samples_leaf个子节点,否则分枝就不会发生;
或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
min_samples_split:
一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则就分枝就不会发生;
min_impurity_decrease:
限制信息增益(父节点的信息熵-子节点的信息熵)的大小,信息增益小于设定数值的分枝不会发生,
决策树的局限性
对于决策边界的处理总是横平竖直,不能做出最优决策。