***********写在前面*************************************************************************************************
本文章所有内容都是我从其他前辈处摘录过来的,本人只是做了相应的整理,在文章中也标注了某一段的来源,文章结尾附了链接~~~~~~~~~~
***********以下是正文***********************************************************************************************
(泣血整理,内容很全,可以右侧查看目录,每个算法都有参考代码附上)
目录
(C)CART(Classification And Regression Tree,分类 回归树)算法
一、 决策树与线性模型、逻辑回归的区别
1. 决策树与线性模型
树形模型是一个一个特征进行处理,线性模型是所有特征给予权重相加得到一个新的值。
2. 决策树与逻辑回归
逻辑回归是将所有特征变换为概率后,通过大于某一概率阈值的划分为一类,小于某一概率阈值的为另一类;而决策树是对每一个特征做一个划分。另外逻辑回归只能找到线性分割(输入特征x与logit之间是线性的,除非对x进行多维映射),而决策树可以找到非线性分割。
树形模型更加接近人的思维方式,可以产生可视化的分类规则,产生的模型具有可解释性(可以抽取规则)。树模型拟合出来的函数其实是分区间的阶梯函数。(以上来源于参考链接【1】)
二、决策树
(二分树示例图,来源于【2】)
1. 基础介绍 :
决策树是一种机器学习的方法。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
决策树是一种十分常用的分类方法,属于有监督学习(Supervised Learning)。所谓有监管学习,就是给出一堆样本,每个样本都有一组属性和一个分类结果,也就是分类结果已知,那么通过学习这些样本得到一个决策树,这个决策树能够对新的数据给出正确的分类。
2. 一个简单的例子:
下面通过一个简单的例子来说明决策树的生成过程:
【样本】:学生情况数据
【样本量】:10
【变量】:分数,出勤率,回答问题次数,作业提交率
【目标变量】:是否为好学生
然后用这一组附带分类结果的样本可以训练出多种多样的决策树,这里为了简化过程,我们假设决策树为二叉树,且类似于下面的左图:
(左图) (右图)
通过学习上表的数据,可以得到A,B,C,D,E的具体值,而A,B,C,D,E则称为阈值。当然也可以有和左图完全不同的树形,比如右图这种的。
所以决策树的生成主要分以下两步,这两步通常通过学习已经知道分类结果的样本来实现。
- 节点的分裂:一般当一个节点所代表的属性无法给出判断时,则选择将这一节点分成2个子节点(如不是二叉树的情况会分成n个子节点)
- 阈值的确定:选择适当的阈值使得分类错误率最小 (Training Error)。
3. 常用决策树算法:
比较常用的决策树算法有ID3,C4.5和CART(Classification And Regression Tree),CART的分类效果一般优于其他决策树。下面具体介绍每一种决策树的构造过程。(以上来源于参考链接【3】)
(A)ID3算法
- ID3概述
ID3算法是由Quinlan首先提出的,该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。
- ID3要解决的问题
1. 如何选择特征作为划分数据集的标准?
在ID3算法中,选择信息增益最大的属性作为当前的特征对数据集分类。信息增益的概念将在下面介绍,通过不断的选择特征对数据集不断划分;
2. 如何判断划分的结束?
第一种为划分出来的类属于同一个类;第二种为已经没有属性可供再分了。此时就结束了。
- ID3划分数据的依据
ID3算法是以信息熵和信息增益作为衡量标准的分类算法。
1. 信息熵(Entropy):
熵的概念主要是指信息的混乱程度,变量的不确定性越大,熵的值也就越大,熵的公式可以表示为:
其中,是类别在样本中出现的频率。
2. 信息增益(Information gain):
信息增益指的是划分前后熵的变化,可以用下面的公式表示:
其中,代表样本的属性,代表属性所有的取值集合,是属性的一个属性取值,是中的值为的样例集合。
(以上来源于参考链接【4】)
- ID3参考代码
#!/usr/bin/env python
# encoding:utf-8
from math import log
def calEntropy(dataSet):
"""calcuate entropy(s)
@dateSet a training set
"""
size = len(dataSet)
laberCount = {}
for item in dataSet:
laber = item[-1]
if laber not in laberCount.keys():
laberCount[laber] = 0
laberCount[laber] += 1
entropy = 0.0
for laber in laberCount:
prob = float(laberCount[laber])/size
entropy -