决策树
应用领域:分类、预测、规则提取等领域
决策树是一树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出达到这个节点的样本所属的类。构造决策树的核心问题是在每一步如何选择适当的属性对样本对样本进行拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下,分而治之的过程。
决策树常见算法
决策树算法 | 算法描述 |
ID3算法 | 核心是在决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮助确定生成每个节点时所应采用的合适属性。 |
C4.5算法 | C4.5决策树生成算法相对于ID3算法的重要改进是使用信息增益率来选择节点属性。C4.5算法可以克服ID3算法存在的不足:ID3算法只适用于离散的描述属性,而C4.5算法既能处理离散的描述属性,也可以处理连续的描述属性。 |
CART算法 | CART决策树是一种十分有效的非参数分类和回归方法,通过构建树、修剪树、评估树来构建一个二叉树。当终点是连续变量时,该树为回归树;当终点是分类变量,该树为分类树。 |
ID3算法
(1)算法简介及基本原理
ID3算法基于信息熵来选择最佳测试属性。它选择当前样本集中具有最大信息增益值的属性作为测试属性;样本集的划分则依据测试属性的取值进行,测试属性有多少不同取值就将样本集划分为多少子样本集,同时决策树上相应于该样本集的节点长出新的叶子节点。ID3算法根据信息论理论,采用划分后样本集的不确定性作为衡量划分好坏的标准,用信息增益最大的属性作为测试属性:信息增益值越大,不确定性越小。因此,ID3算法在每个非叶节点选择信息增益最大的属性作为测试属性,这样可以得到当前情况下最纯的拆分,从而得到较小的决策树。
(2)ID3算法具体流程
ID3算法的具体详细实现步骤如下:
-
对当前样本集合,计算所有属性的信息增益;
-
选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划为同一个子样本集;
-
若子样本集的类别属性只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,然后返回调用出;否则对字样本集递归调用本算法。
(3)实例
由于ID3决策树算法采用了信息增益作为选择测试属性的标准,会偏向于选择取值较多的,即所谓高度分支属性,而这类属性并不一定是最优属性。同时ID3决策树算法只能处理离散属性,对于连续型的属性,在分类前需要对其进行离散化。为了解决倾向于选择高度分支属性的问题,人们采用信息增益率作为选择测试属性的标准,这样便得到C4.5决策树算法。此外,常用的决策树算法还有CART算法,SLIQ算法、SPRINT算法和PUBLIC算法等。
代码实现(决策树算法预测销量高低):
# 使用ID3决策树算法预测销量高低
import pandas as pd
# 初始化参数
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序号') # 导入数据
# 数据是类别标签,要将它转换为数据
# 用1来表示“好”,“是”,“高”这三个属性,用-1来表示“坏”,“否”,“低”
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)
from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy') # 建立决策树模型,基于信息熵
dtc.fit(x, y) # 训练模型
# 导入相关函数,可视化决策树
# 导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式
from sklearn.tree import export_graphviz
x = pd.DataFrame(x)
from sklearn.externals.six import StringIO
x = pd.DataFrame(x)
with open("tree.dot", 'w') as f:
f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
输出: