def createDataSet():
dataSet = [[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
labels = ['no surfacing','flippers']
return dataSet, labels
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #计算数据集中实例总数
print 'total numEntries = %d' % numEntries
labelCounts = {} #创建数据字典,计算每个label出现的次数
for featVec in dataSet: #the the number of unique elements and their occurance
currentLabel = featVec[-1] # -1表示获取最后一个元素,即label
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
for key in labelCounts.keys():#打印字典
print key,':',labelCounts[key]
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2) #log base 2
print 'shannonEnt = ',shannonEnt
return shannonEnt
一、特征选择
1.信息量(Information)
2.熵(Entropy)
它刻画了任意样例集的纯度(purity)
对于数据集
D
,
信息论中熵的一种解释是,熵确定了要编码集合S中任意成员(即以均匀的概率随机抽出的一个成员)的分类所需要的最少二进制位数。
3.条件熵(Conditional Entropy)
表示在已知随机变量
X
的条件下随机变量Y的不确定性。
4.信息增益(Information Gain)
表示在特征
X
的影响下数据集
注:说互信息(matual information)的时候,两个随机变量的地位是相同的;说“信息增益”的时候,是把一个变量看成减小另一个变量不确定度的手段。但其实二者的数值是相等的。
5.信息增益比(Information Gain Ratio)
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正。这是特征选择的另一准则。
6.基尼系数/指数(Gini)
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正。这是特征选择的另一准则。
二、决策树的生成
1. ID3算法
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:
输入:训练数据集
D
,特征集
输出:决策树T
(1)若D中所有实例属于同一类
C k
,则
T
为单结点树,并将类
ID3算法使用信息增益作为特征选择的度量。
结束条件:D中所有实例都属于同一类;信息增益值小于特定的阈值;没有其他特征可以选择了。
构建树的过程中对于选中的某一个特征,其有多少种取值,就分出多少条边。
下层的节点在进行特征选择的时候不会再用到上层用过的特征。
2. C4.5算法
C4.5 对ID3的改进,除了特征选择度量以外,另外两点是可以处理连续值型属性以及处理缺失值。
2.1处理连续值型属性
根据数据集D的属性A上的具体数值按照升序排序,得到属性序列值:{A1,A2,⋯,AN}
任意两个取值之间的中点作为可能的分割点,将数据集分成两部分,计算每个可能的分割点的信息增益。优化算法是只计算数据标签发生改变的对应两个属性值的中点。
3.CART(classify and regression tree)
CART决策树的生成就是递归地构建二叉决策树的过程。CART决策树既可以用于分类也可以用于回归。本文我们仅讨论用于分类的CART。对分类树而言,CART用Gini系数最小化准则来进行特征选择,生成二叉树。 CART生成算法如下:
平方误差最小化准则,最小二乘回归树生成算法
4.随机森林
随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那 么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M 个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一 个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
5.GBDT(Gradient Boosting Decision Tree)
三、决策树的剪枝
在决策树问题中,处理过拟合的方法为剪枝,其中剪枝分为先剪枝和后剪枝。
1.先剪枝
在这种方法中,在完全拟合整个训练集之前就停止决策树的生长。因此要采取一些提前结束的条件,比如说:当观察到不纯性度量的增益低于某个确定的阈值是就停止扩展叶子节点。这种方法有点在于避免产生过分拟合训练数据的过于复杂的子树,然而,很难为提前终止选取正取的阈值。阈值太高容易欠拟合,太低过拟合。
2.后剪枝
在此方法中,初始的决策树按最大规模增长,然后对其进行剪枝,按照自第向上的方法进行对决策树的修剪。
决策树越复杂一般来说对训练数据的拟合越好,其有更多的叶子节点,为了避免其过于复杂的模型,一般的做法都是给其一个惩罚。因此决策树的剪枝往往通过极小化损失函数(loss function)来实现。
Loss function :
其中|T|为叶子节点的个数,C(T)表示模型对训练样本的预测误差。因此当 α 确定后,如果在一颗子树的损失反而小于其分裂后的损失,则让父节点充当该子树的叶子节点,即当: