版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32023541/article/details/81565181
决策树用在分类的问题上,说白了就是根据属性判断某一类别的问题。决策树的核心是什么?打个比方,如果今天下雨,我就去超市,如果超市没有关门,我就买苹果。假设把结果分成两类,买苹果和不买苹果。则分为下:
这就是决策树,但是问题来了,这是我买苹果的决策树。但是如果不知道我的规则,只给一堆用户数据,比如告诉你天气和超市是否关门(忘记关门肯定买不了这个常识吧,也可以换成其他的因素)然后给出一大堆买苹果和不买苹果的结果。我们要怎么得到上图的这种决策树?要知道,怎么才能从数据中看出来天气是根节点?
如果是更复杂的场景,给你一系列的变量属性,每个属性也可能不止两个值。从一系列属性中根据某种规则(比如最大信息增益)找出最佳的属性作为根节点,在从根节点往下找出其余最佳的属性作为它的根节点,依次循环,直到属性不可再分。这样就得到了一个树状的判断图,这就是决策树的核心。
最佳属性的获取规则如下:
(1)首先计算总的信息熵值:根据信息论,信息值为下:
(2)计算每个属性的信息熵:
假设属性有 k 种取值,
(3)选择最大信息增益的属性作为根节点
就这样在选取根节点后,在循环往复的在根节点一下再继续按此规则选择下一根节点,直到决策树成形。
以上展示了根据苹果买卖数据,决策树形成的过程,选取 天气为根节点。
用销量数据 sales_data.xls 生成决策树代码如下:
#-*- coding:utf-8 -*-
import pandas as pd
filename = 'wajue/sales_data.xls'
data = pd.read_excel(filename,index_col = u"序号")
# 数据是类别标签,要转化成数据
# 用 1 表示好,是,高 这三种属性,用 -1 来表示 坏 否 低
data[data == u"好"] = 1
data[data == u"是"] = 1
data[data == u"高"] = 1
data[data != 1] = -1
# 属性数据矩阵
x_copy = data.iloc[:,:3]
x = data.iloc[:,:3].as_matrix().astype(int)
# 销量类别矩阵
y = data.iloc[:,3].as_matrix().astype(int)
# 引入决策树分类器 DTC
from sklearn.tree import DecisionTreeClassifier as DTC
# 基于信息熵建立决策树模型
dtc = DTC(criterion = 'entropy')
dtc.fit(x,y)
# 导入相关函数,可视化决策时
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
with open("wajue/tree.dot","w") as f:
f = export_graphviz(dtc,feature_names = x_copy.columns,out_file = f)
tree.dot 如下