有如下数据集:
序号 | 天气 | 是否周末 | 是否有促销 | 销量 |
1 | 坏 | 是 | 是 | 高 |
2 | 坏 | 是 | 是 | 高 |
3 | 坏 | 是 | 是 | 高 |
4 | 坏 | 否 | 是 | 高 |
5 | 坏 | 是 | 是 | 高 |
6 | 坏 | 否 | 是 | 高 |
7 | 坏 | 是 | 否 | 高 |
8 | 好 | 是 | 是 | 高 |
9 | 好 | 是 | 否 | 高 |
10 | 好 | 是 | 是 | 高 |
11 | 好 | 是 | 是 | 高 |
12 | 好 | 是 | 是 | 高 |
13 | 好 | 是 | 是 | 高 |
14 | 坏 | 是 | 是 | 低 |
15 | 好 | 否 | 是 | 高 |
16 | 好 | 否 | 是 | 高 |
17 | 好 | 否 | 是 | 高 |
18 | 好 | 否 | 是 | 高 |
19 | 好 | 否 | 否 | 高 |
20 | 坏 | 否 | 否 | 低 |
21 | 坏 | 否 | 是 | 低 |
22 | 坏 | 否 | 是 | 低 |
23 | 坏 | 否 | 是 | 低 |
24 | 坏 | 否 | 否 | 低 |
25 | 坏 | 是 | 否 | 低 |
26 | 好 | 否 | 是 | 低 |
27 | 好 | 否 | 是 | 低 |
28 | 坏 | 否 | 否 | 低 |
29 | 坏 | 否 | 否 | 低 |
30 | 好 | 否 | 否 | 低 |
31 | 坏 | 是 | 否 | 低 |
32 | 好 | 否 | 是 | 低 |
33 | 好 | 否 | 否 | 低 |
34 | 好 | 否 | 否 | 低 |
一般决策树学习算法是一个递归地选择最优特征并根据特征对训练数据进行分割,使每个子数据集都有一个最好的分类的过程。算法包括:
step1:特征选择(根据熵或基尼指数选择特征)
step2:决策树生成(有ID3、C4.5、CART算法等)
step3:剪枝(防止过拟合)
在信息论中,熵代表的意思是随机变量不确定性的度量。简单的说,有容量为100的数据集,特征A可以将数据集分为80容量和20容量的两类,而特征B将数据集分为50容量和50容量的两类,则特征A的信息熵要小于特征B的,因为A可以比较明确地将数据集分类,B并没有明确地将数据集分类。因此A的不确定性小,即熵小。
设X是一个取有限个值的离散随机变量,其概率分布为:
则随机变量X的熵为:
若Pi=0,则定义0log0=0。熵越大随机变量的不确定性越大。
设随机变量(X|Y),其联合概率分布为:
随机变量X给定条件下随机变量Y的条件熵H(X|Y)定义为,X给定条件下Y的条件概率分布的熵对X的数学期望:
当熵和条件熵中的概率由数据估计得到时,则称两者为经验熵和经验条件熵。
信息增益表示得到特征X后使得类Y的信息不确定性减少的程度。信息增益越大,不确定性减少的程度越大。特征A对训练集D的信息增益g(D,X)定义为集合D的经验熵H(D)与特征X给定条件下的经验条件熵H(D|X)之差,即:
本文所示例的ID3算法即是根据信息增益选择特征的。对于训练集D,计算每个特征的信息增益,选择增益最大的特征。
特征X对训练数据集D的信息增益比gR(D,A)定义为信息增益与g(D,A)与训练数据集D关于特征A的熵HA(D)之比:
其中,n为特征A取值的个数
从根节点开始,对结点计算所有可能特征的信息增益,选择信息增益最大的特征作为根节点,由改特征的不同取值对数据进行分类建立子节点。再对子节点递归地使用以上方法,建立决策树,直到所有特征的信息增益均很小或没有特征为止。
Python代码示例——使用Scikit-Learn建立决策树
数据集:将文章开头的数据拷到一个Excel表格中即可,与py文件同目录
源代码:
#-*- coding: utf-8 -*-import pandas as pdinputfile = 'E:/Machine_Learning/Code/decision tree ID3/data.xls' #数据文件路径data = pd.read_excel(inputfile, index_col = u'序号') #导入数据#数据文件是excel表格,需要将标签变为数据#用1表示好、是、高,用-1表示坏、否、低data[data == u'好'] = 1data[data == u'是'] = 1data[data == u'高'] = 1data[data != 1] = -1x = data.iloc[:,:3].as_matrix().astype(int)y = data.iloc[:,3].as_matrix().astype(int)from sklearn.tree import DecisionTreeClassifier as DTCdtc = DTC(criterion='entropy') #建立决策树模型,基于信息熵dtc.fit(x, y) #训练模型#导入相关函数,可视化决策树。from sklearn.tree import export_graphvizx = pd.DataFrame(x)with open("tree.dot", 'w') as f: f = export_graphviz(dtc, feature_names = x.columns, out_file = f)最后在目录下生成一个dot文件,这是一个可视化的文件,需要安装Graphviz软件才可以查看,可转为pdf或图片格式。打开是如下效果:
3.2 C4.5算法
与ID3算法类似,不同的是C4.5使用信息增益比来选择特征。
4、剪枝
决策树在学习的过程中会产生过拟合现象,即过多地考虑提高训练数据的正确分类,从而构造出复杂的决策树。这时需要将生产的决策树进行简化,即剪枝。关于剪枝会在接下来的文章里阐述。
新闻热点
疑难解答