下面的有些叙述基于我个人理解, 可能与专业书籍描述不同, 但是最终都是表达同一个意思, 如果有不同意见的小伙伴, 请在评论区留言, 我不胜感激.
参考:
周志华-机器学习
https://blog.csdn.net/xiaohukun/article/details/78112917
https://blog.csdn.net/fuqiuai/article/details/79456971
决策树简介
1. 问题背景
常规方式对样本进行分类, 会导致很大的性能问题, 样本需要不断重复检测每一项属性(属性之间还不能存在相关性), 例如: 人的体重由[年龄, 身高] 决定, 当获得一组样本 [20, 178], 可能我们会先将该数据归到20岁的阶段中, 然后判断身高, 最后判断体重, 我们也有可能先使用身高, 然后使用年龄, 最后判断体重, 排列组合的方式得出预测值, 这种毫无准则的选择判断会导致很大的计算量; 然而决策树使用**信息增益(当前属性对样本的贡献率) **, 根据信息增益从大到小选用对应的属性进行判断, 有针对性的选择可以有效地避免无用的计算, 通过选用合适的样本属性按照特定的规则进行判断, 对样本准确的分类, 现在遇到的问题就是如何构建一棵决策树, 构建出来的决策树还能准确预测结果, 下面将针对决策树定义, 信息量, 建立决策树需要遵守的规则, 优化等问题来讲解.
2. 决策树定义
决策树是基于树结构进行决策, 一棵决策树包含一个Root根节点(里面包含所有测试集, 测试集从Root处出发, 按照一定的决策方式, 不同的决策将导致每个样本最终拥有不同的预测结果), 以及若干内部节点和叶子节点, 叶子节点对应最终的决策结果, 每一个内部节点都是一个属性测试, 从Root到叶子节点的路径就是一个样本的决策过程, 当样本到达叶子节点的时候就是样本的预测结果.
决策树如下图:
Root: 包含所有的样本集
DECISION: 决策方式
Result: 决策结果
构造决策树
1. 问题背景
构建决策树需要有一个构建规则, 不同的构建规则将导致预测结果的不同, 当然, 不同的数据需要使用不同的构建规则, 这样才能最好地预测出结果, 下面将介绍3中不同的构建规则: 信息增益, 信息增益率, 基尼指数
2. 信息熵
信息熵是度量样本属性对最终预测结果的影响程度, 当某一属性的熵在正常情况下比其他属性的熵要大的时候, 我们就可以先选用该属性优先对样本进行分类(越是影响大的属性越容易影响预测结果, 越容易预测正确).
信息熵方程定义:
pk: 属性在样例中的比例
使用例子说明:
如下图片, 使用age, income, student, credit属性来判断一个人能否买电脑
使用buys_computer计算总的信息熵:
buys_computer包含2个子集 {yes, no}, 正例比例: 9/14, 反例比例: 5/14, 最终得到 Info(D)
同理计算age:
age包含3个子集 {youth, middle_aged, senior}, 分别计算youth, middle_aged, senior各自相对于正反例的比例值, 道理同上, 然后得到 Info_youth(D), Info_middle_aged(D), Info_senior(D).
由于不同子集样本相对于age数目不同, 所以:
Info_age(D) = youth_权重*Info_youth + middle_aged_权重*Info_middle_aged(D) + senior_权重*Info_senior(D)
最终age的信息熵计算结果:
3. 信息增益(ID3算法)
信息增益: 样本利用某一属性分类之后得到多少样本, 例如: 样本使用age属性分类, Gain(D, age) = 总的熵(即Info(D)) - Info_age(D)
信息增益方程定义:
V代表属性种类; D^V代表每种属性对应的样本数目;
Ent(D)代表Info(D); |D^v|/|D| 就是属性数目在样本中权重.
下面直接计算Gain(D, age), 计算age相对于总样本D的信息增益
在前面信息熵的计算中, 我们已经得出Info(D), Info_age(D), 按照公式只需做差