决策树
1. 信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)
1.1 Entropy
混乱程度的度量,越乱熵值越高
(log底数选取不影响,保持一致就好)
譬如:
A = [1, 1, 1, 2, 2]
B = [2, 9, 7, 1, 3]
A中只有两种类别,相对稳定;B中类别多,混乱。
A的熵值 < B的熵值
C = [1, 1, 1, 1, 1]
对于只有一种类别的相当于 p = 1 logp = 0 H(X) = 0
当p = 0.5,熵值最大,当p趋近于0或者1时,熵值越小。
1.2 Conditional Entropy
1.3 Joint Entropy
1.4 Information Gain
参考
如何挑出特征作为节点?
找到信息增益相对最大的那个点作为节点。
举例:
14天中9天打球,5天不打球,熵值:
四个特征:天气/温度/湿度/风
选谁当根节点?
特征一:天气
(5/14) 5天晴天中2天打球,3天不打球
(4/14) 4天阴天都打球
(5/14) 5天雨天中3天打球,2天不打球
熵计算:
信息增益:
同理算出
特征二:gain(温度) = 0.029
特征三:gain(湿度) =0.152
特征四:gain(风) = 0.048
max (gain(特征一), gain(特征二), gain(特征三), gain(特征四)) = 0.247 选择特征一:天气作为根节点。
下面的子节点需要再遍历算一遍找出max(gain(feature))
1.5 Gini Index
GINI Index:(和熵的衡量标准类似,只是计算方法不同)
概率肯定在0~1之间,如果说这个东西越确定的越纯的,取到的概率接近于1,GINI系数越接近0,也就是说基尼指数越小,样本的不确定性越小。
2. 决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景
2.1 ID3:信息增益
D: 训练数据集
A: 特征
问题:信息增益会偏向取值较多特征
极端举例,按唯一ID编号]划分, 每个熵值都是自己,很纯,为0,也就是说信息增益最大,会选取ID作为优秀的特征【并不
2.2 C4.5:信息增益率
为了解决 ID3的问题,提出C4.5:information gain ratio,考虑自身熵
如果特征A的取值越多,譬如刚才的ID编号例子,每个都是唯一的值,多混乱啊,HA(D)的值必须大,也就是说1/HA(D)的值小。这相当于是给信息增益乘了一个惩罚系数,也就是
2.3 CART:分类回归树
Classification And Regression Tree
使用GINI系数作为衡量标准,选GINI系数最小的那个做节点和切分
CART假设决策树是二叉树,内部节点特征的取值为“是”(左)和“否”(右)。这样的决策树等价于递归地二分每个特征,将输入空间划分为有限个单元。
连续值划分:
sort(): 60 70 75 85 90 95 100 120 125 220
二分法,找到分界点切分。
60 70 75 85 90 95 100 120 | 125 220
譬如来一刀,左边 122.5 右边
2.3.1 回归树原理
3. 决策树防止过拟合手段
决策树很容易过拟合
3.1 剪枝: 预剪枝&后剪枝
-
预剪枝:边建边剪(常用)
限制深度
限制叶子节点的个数
限制叶子节点中的样本数,譬如小于指定样本数就不用再分了
限制信息增益,譬如小于某个差值也不用再分了 -
后剪枝:建完剪
通过一定标准衡量,看要不要分裂
C = Cost
T = Tree
叶子节点越多,损失越大
限制叶子节点的个数,希望越小越好,也就是说明叶子节点越多,损失越大
举例:
本节点如果不分 ①
此节点下面有三个叶子节点②
对于的取值,越大,越小;越小,越大
对比,如果①>②,那就说明还是分的好,如果①<②,那就还是不分的好。
4. 模型评估
5. sklearn参数详解,Python绘制决策树
详细见官网
from sklearn.datasets import load_iris
from sklearn import tree
import graphviz
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph
#graph.render("my_tree") #get a pdf file