决策树
什么是决策树?
决策树类似于一个流程图的树结构:其中,每一个内部结点表示杂志一个属性上的测试,每个分支代表一个属性输出,而每个树叶节点代表类或类分布。树的最顶层是根结点,我们通过一个例子来说明,通过分析不同年龄段,不同身份,不同收入的人群来预测一个人是否会购买电脑,如果画出决策树我们会得到下图
构造决策树的基本原理
原理: 首先从训练样本矩阵中选择第一个特征进行子表划分,使每个子表中该特征的值全部相同,然后再在每个子表中选择下一个特征按照同样的规则继续划分更小的子表,不断重复直到所有的特征全部使用完为止,此时便得到叶级子表,其中所有样本的特征值全部相同。对于待预测样本,根据其每一个特征的值,选择对应的子表,逐一匹配,直到找到与之完全匹配的叶级子表,用该子表中样本的输出,通过平均(回归)或者投票(分类)为待预测样本提供输出。
随着子表的划分,信息熵(信息的混乱程度)越来越小,信息越来越纯,数据越来越有序。
那么这里就不得不提一个概念了——信息熵
信息熵
信息和抽象,如何度量?
1948年,香农提出了 ”信息熵(entropy)“的概念
一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者
是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少
例子:猜世界杯冠军,假如一无所知,猜多少次?
每个队夺冠的几率不是相等的
香农用: 比特(bit)来衡量信息的多少
变量的不确定性越大,熵也就越大
决策树归纳算法 (ID3)
ID3 算法是在1970-1980之间由J.Ross. Quinlan发明的算法
根节点的确定
相信在前面的例子中,一定有人会有一个疑问,为什么要把age作为跟结点呢?
我们通过信息获取量来判断,即通过那个结点的信息获取量越大我们就选择这个结点作为根节点
信息获取量(Information Gain):Gain(A) = Info(D) - Infor_A(D)
通过A来作为节点分类获取了多少信息
其中Info(D)和Info_A(D)就是通过香农给出的熵计算公式来进行计算
公式中的
5
14
4
14
5
14
\frac{5}{14}\frac{4}{14}\frac{5}{14}
145144145分别是三种人群,不同年龄端的比例,括号内的内容则是在这个年龄段内购买的人数,以下的公式也可以类似脱离
类似,Gain(income) = 0.029, Gain(student) = 0.151, Gain(credit_rating)=0.048
所以,选择age作为第一个根节点
算法
- 树以代表训练样本的单个结点开始(步骤1)
- 如果样本都在同一个类,则该结点称为树叶,并用该类标号(步骤2 和3)
- 否则,算法使用称为信息增益的基于熵的度量作为启发信息,能够最好地将样本分类的属性(步骤6).该属性称为该结点的测试或判定的属性(步骤7)
- 在该算法版本中,所有的属性都是分类的,即离散值。连续的属性必须离散化
- 对测试属性的每个已知的值创建一个分支,并据此划分样本(步骤8-10)
- 算法使用同样的过程,递归地形成每个划分上的样本判断树。一旦一个属性出现在一个结点上,就不必在该结点的任何后代上考虑它(步骤13)
递归划分的步骤当下列条件之一成立时停止:
1. 给定结点的所有样本属于同一类(步骤2和3)
2.没有剩余的属性可以用来进一步划分样本(步骤4).在此情况下,使用多数表决(步骤5)
3.这涉及将给定的结点转换为树叶,并用样本中的多数所在的类标记它,替换地,可以存放系欸但样本的类分布
4.分支
5.test_attribute = ai 没有样本 (步骤11).在这种情况下,以samples中的多数类创建一个树叶
其他算法
其他算法:
C4.5: Quinlan
Classification and Regression Trees (CART): (L. Breiman, J. Friedman, R. Olshen, C. Stone)
共同点:都是贪心算法,自上而下(Top-down approach)
区别:属性选择度量方法不同: C4.5 (gain ratio), CART(gini index), ID3 (Information Gain)
树剪枝叶 (避免overfitting)
当数据量很大的是否,我们会发现得到的模型对训练集符合的很好但是对测试集却不行,这个时候我们就要通过剪枝来提高模型的准确性
不必用尽所有的特征,叶级子表中允许混杂不同的特征值,以此降低决策树的层数,在精度牺牲可接受的前提下,提高模型的性能。通常情况下,可以优先选择使信息熵减少量最大的特征作为划分子表的依据。
剪枝又分为预剪枝 (Pre-Pruning) 和 后剪枝 (Post-Pruning) 但是在本文中就不过多的描述
决策树的优点:
直观,便于理解,小规模数据集有效
决策树的缺点:
处理连续变量不好
类别较多时,错误增加的比较快
可规模性一般
python代码实现
代码中用到的资料在这里哦
点我啊
提取码:cu45
import pandas as pd
from sklearn import tree # 导入决策树模块
import graphviz # 导入可视化模块
import numpy as np
# 导入数据
data = pd.read_csv('../ml_data/AllElectronics.csv')
# 数据的预处理 单词无法进行训练用1,2,3分别代替其中的三类
data = data.replace(['youth', 'high', 'yes', 'excellent'], 1)
data = data.replace(['senior', 'medium', 'no', 'fair'], 2)
data = data.replace(['middle_aged', 'low'], 3)
print(data)
# 切割训练数据
train_x = data.iloc[:, 1:5]
train_y = data.iloc[:, 5]
# 调用方法使用ID3的方法进行训练
dtc = tree.DecisionTreeClassifier(criterion='entropy')
dtc.fit(train_x, train_y)
# 模型输出
dot_data = tree.export_graphviz(
dtc, # (决策树模型)
out_file=None,
feature_names=['age', 'income', 'student', 'credit_rating'], # 模型中对应标签名称
filled=True,
impurity=False,
rounded=True
)
graph = graphviz.Source(dot_data) # 选择要可视化的dot数据
graph.render(r'C:\Users\Lenovo\Desktop\tree') # 将可视化结果输出至指定位置
最后得到的结果就是这个
结语
对于机器学习的算法,你可能不能完全的自己书写出来,但是绝对不要当啥都不知道的调包虾,理解其中的原理才是王道。