目录:
一、决策树(decision tree)模型与学习
二、特征选择
三、决策树的生成
四、应用部分
一、决策树(decision tree)模型与学习
1、决策树模型
决策树(decision tree)在机器学习中是一种基本的分类与回归方法,是一个预测模型,它表示对象属性和对象值之间的一种映射,树中的每一个节点表示对象属性的判断条件,其分支表示符合节点条件的对象。树的叶子节点表示对象所属的预测结果。
2、递归构建决策树
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
递归原理
- 得到原始数据集,然后基于最好的属性值划分数据集。每一次划分数据集,我们都要消耗一个特征,根据某个特征将某些性质相同的元素剥离出来。
- 划分数据的时候我们根据香农熵,计算信息增益之后找到最好的属性值进行数据的划分。
- 由于特征值可能有多于两个的,因此可能存在大于两个分支的数据集划分
第一次划分数据将向下传递到树分支的下一个节点,在这个节点上,我们可以再次划分数据集,因此我们可以采用递归的原则来处理数据集。
二、特征选择
1、理解
特征选择在于选取对训练数据具有分类能力的特征.这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的推则是信息增益或信息增益比。
2、信息增益
三、决策树的生成
1、ID3算法(原理,过程,优缺点)
ID3算法用信息增益大小来判断当前节点应该用什么特征来构建决策树,用计算出的信息增益最大的特征来建立决策树的当前节点。
过程:
输入的是m个样本,样本输出集合为D,每个样本有n个离散特征,特征集合即为A,输出为决策树T。
具体过程如下:
1)初始化信息增益的阈值ϵ
2)判断样本是否为同一类输出Di,如果是则返回单节点树T。标记类别为Di
3) 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
4)计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征Ag
5) 如果Ag的信息增益小于阈值ϵ,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
6)否则,按特征Ag的不同取值Agi将对应的样本输出D分成不同的类别Di。每个类别产生一个子节点。对应特征值为Agi。返回增加了节点的数T。
7)对于所有的子节点,令D=Di,A=A−{Ag}递归调用2-6步,得到子树Ti并返回。
优点:用信息增益去筛选变量。
缺点:
1、ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。
2、ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。
3、 ID3算法对于缺失值的情况没有做考虑
4、没有考虑过拟合的问题
2、C4.5(原理,过程,优缺点)
C4.5基于ID3算法基础,对ID3的4点不足做了改善。C4.5算法用信息增益率来选择划分属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足在树构造过程中进行剪枝;能够完成对连续属性的离散化处理;能够对不完整数据进行处理。
过程:
C4.5处理数值属性的过程如下:
1、按照属性值对训练数据进行排序;
2、用不同的阈值对训练数据进行动态划分
3、当输入改变时确定一个阈值
4、取当前样本的属性值和前一个样本属性值的中点作为新的阈值
5、生成两个划分,所有的样本分布到这两个划分中
6、得到所有可能的阈值、增益和增益比例
优点:C4.5算法产生的分类规则易于理解、准确率较高。
缺点:
1、算法低效,在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。
2、内存受限,适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。
四、应用部分
1、划分数据集函数
def splitDataSet(dataSet, axis, value):
'''
:param dataSet: 待划分的数据集
:param axis: 划分数据集的特征
:param value: 特征的返回值
:return: 划分好的数据集
'''
retDataSet = []
for featVec in dataSet:
# 程序将符合特征的数据抽取出来
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
2、创建决策树
def createTree(dataSet,labels):
'''
:param dataSet: 数据集
:param labels: 标签列表
:return: 决策树信息,字典类型
'''
# 创建列表包含数据集的所有类标签
classList = [example[-1] for example in dataSet]
# 若类别完全相同,则停止划分
if classList.count(classList[0]) == len(classList):
return classList[0]
# 数据集中没有其余特征,则停止划分
if len(dataSet[0]) == 1:
return majorityCnt(classList)
# 存储最好的特征
bestFeat = chooseBestFeatureToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}}
# 得到列表包含的所有属性值
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
# 遍历当前选择特征包含的所有属性值
for value in uniqueVals:
subLabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
return myTree