决策树是一种树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。构造决策树的核心问题是在每一步如何选择适当的属性对样本做拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下,分而治之的过程
决策树方法在分类、预测、规则提取等领域有着广泛应用。机器学习研究者J.Ross Quinlan 提出了ID3算法以后,决策树在机器学习、数据挖掘领域得到了极大的发展,之后又提出了C4.5,成为了新的监督学习算法。另外还有CART分类算法,值得一提的是ID3和CART孙法都是采用类似的方法从训练样本中学习决策树。
接下来简单叙述一下这几个算法:
ID3算法:
其核心是在决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮助确定生成每个节点所应采用的合适属性。
C4.5算法:
C4.5决策生成算法相对于ID3算法的重要改进是使用信息增益率来选择节点属性。C4.5算法可以克服ID3算法存在的不足:ID3适用于离散的描述属性,而C4.5算法即能够处理离散的描述属性,也可以处理连续的描述属性
CART算法:
CART决策树是一种十分有效的非参数分类和回归方法,通过构建树、修建树、评估树来构建一个二叉树。当终结点是连续变量时,该树为回归树;当终结点是分类变量,该树为分类树。
本文主要介绍一下ID3算法。
ID3算法的简介以及原理:
ID3算法给予信息熵来选择最佳测试属性。它选择当前样本集中具有最大信息增益值的属性作为测试属性;样本集的划分则依据测试属性的取值进行,测试属性有多少不同取值就将样本集划分为多少子样本集,同时决策树上相应于该样本集的节点长出新的叶子节点。
根据信息论理论,采用划分样本集的不确定性作为衡量划分好坏的标准,用信息增益值度量不确定性:信息增益值越大,不确定性越小,因此,在每个非叶节点选择信息增益最大的属性作为测试属性,这样可以得到当前情况下最纯的拆分,从而得到较小的决策树。
公式如图显然E(A)越小,Gain(A)的值越大,说明测试属性A对于分类提供的信息越大,选择A之后对分类的不确定程度越小。
ID3的算法具体实现步骤如下:
1,对当前样本集合,计算所有属性的信息增益
2,选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划分到同一个子样本集;
3,若子样本集的类别属性只含有单个属性,则分支为叶子结点,判断其属性值并标上相应的符号,然后返回调用出;否则对子样本集递归调用本算法。
废话不多说,直接贴代码为证:
#-*- coding: utf-8 -*-
import pandasas pd
#参数初始化
inputfile ='path'
data = pd.read_excel(inputfile, index_col =u'序号')#导入数据
#数据如果是类别标签,需要转化为数据
#用1和-1分别代表各自标签
data[data ==u'标签A'] =1
data[data ==u'标签B'] =1
data[data ==u'标签B'] =1
data[data !=1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)
from sklearn.treeimport DecisionTreeClassifieras DTC
dtc = DTC(criterion='entropy')#建立决策树模型,
dtc.fit(x, y)#训练模型
#导入相关函数,可视化决策树
from sklearn.treeimport export_graphviz
x = pd.DataFrame(x)
from sklearn.externals.siximport StringIO
x = pd.DataFrame(x)
with open("tree.dot", 'w')as f:
f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
网友评论