一、决策树(Decision Tree)
1、逻辑回归VS决策树
任务:根据用户的学习动力、能力提升意愿、兴趣度、空余时间,判断其是否适合学习本门课程。
(1)、如果用逻辑回归模型框架
逻辑回归是把四个属性直接丢给模型,建立逻辑回归的方程,预测出对应分类的概率。
(2)、如果用决策树模型框架
问:想学习AI的意愿有多少分(100分满分)? 答:70(70分进入右侧no的分支)
问:想提高个人能力吗? 答:想
问:是否对AI有兴趣? 答:有
问:每周有多少时间学习新知识? 答:1.5小时(超过每周有1小时学习时间)
结论:现在就报名开始学习吧!
最后的结果可以理解为树的树叶。
2、决策树的概念
一种对实例进行分类的树形结构,通过多层判断区分目标所属类别
本质:通过多层判断,从训练数据集中归纳出一组分类规则。
优点:
(1)、计算量小,运算速度快。
(2)、易于理解,可清晰查看各属性的重要性。
缺点:
(1)、忽略属性间的相关性(比如学习动力和学习兴趣可能是有关系的,逻辑回归中可以体现相关性,而决策树忽略了)。
(2)、样本类别分布不均匀时,容易影响模型表现。
3、决策树求解
假设给定训练数据集
D= {(x1,y1 ),(x₂,y₂),…, (xN,yN)}
其中,xi=(xi(1),xi(2),…,xi(m))T 为输入实例(输入数据),m为特征个数
yi∈ {1,2,3,…,K}为类标记(标签),i= 1,2,…,N,N为样本容量。
目标:根据训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。
问题核心:特征选择,每一个节点,应该选用哪个特征。
决策树三种求解方法:ID3、C4.5、CART
参考资料:
1、https://www.cnblogs.com/callyblog/p/9724823.html
ID3
利用信息熵(entropy /ˈentrəpi/)原理选择信息增益最大的属性作为分类属性,递归地拓展决策树的分枝,完成决策树的构造。
信息熵(entropy)是度量随机变量不确定性的指标,熵越大,变量的不确定性就越大。
假定当前样本集合D中第k类样本所占的比例为pk,则D的信息熵为:
Ent(D)的值越小,变量的不确定性越小。
pk =1时:Ent(D)=0,即集合D中的某一类所占的比例为100%,则集合D的信息熵为0。
当这个Ent(D)的值越小,变量的不确定性越小,说明样本集合D的纯度就越高。
根据信息熵,可以计算以属性a进行样本划分带来的信息增益
V为根据属性a划分出的类别数(如动力属性划分出的类别有3种:很强、意愿、很弱,即V值为3)、D为当前样本总数(如上面总共有10个样本),Dv为类别v样本数。
目标:划分后样本分布不确定性尽可能小,即划分后信息熵小,信息增益大。
一般来讲,信息增益越大,说明如果用属性a来划分样本集合D,那么纯度会提升,因为我们分别对样本的所有属性计算增益情况,选择最大的来作为决策树的一个结点,或者可以说那些信息增益大的属性往往离根结点越近,因为我们会优先用能区分度大的也就是信息增益大的属性来进行划分。当一个属性已经作为划分的依据,在下面就不在参与竞选了,我们刚才说过根结点代表全部样本,而经过根结点下面属性各个取值后样本又可以按照相应属性值进行划分,并且在当前的样本下利用剩下的属性再次计算信息增益来进一步选择划分的结点,ID3决策树就是这样建立起来的。
有10个样本,类别分为两类:是(1)和否(0)。
总共有动力、想提升能力、有兴趣、时间四个属性,要想建立决策树,第一步就是先用哪一个属性作为第一个节点。为了判断这个属性,我们就要计算每个属性对应的信息增益,要计算信息增益我们要先计算划分之前的信息熵。
以能力划分
(1)、划分前的信息熵(计算D的信息熵)
只有两个类别是(1)和否(0),"否"有6个,故所占的比例是60%,"是"有4个,故所占的比例是40%
Ent(D)= -(0.6log20.6 + 0.4log20.4 )= 0.971,即属性划分前信息熵为0.971
(2)、划分之后的信息熵(先计算Dv 的信息熵,再计算信息增益)
以"想提升能力"为例,想提升能力属性有两种划分:是(1)和否(0),分别计算0和1对应的信息熵,乘以比例再求和
由于"是"为6个和"否"为4个
(1)、当"想提升能力"为否的时候,有4个样本(Dv =4,D=10,即要计算这4个样本的信息熵),这4个样本对应的类别都为否,即当前样本集合D中否所占的比例为100%
(2)、当"想提升能力"为是的时候,有6个样本(Dv =6,D=10,即要计算这6个样本的信息熵),这6个样本中有2个样本对应的类别为否,其余4个对应的类别都为是,即否所占的比列为1/3,是所占的比例为2/3.
0.4(0log20 + 1log21) + 0.6( -1/3log21/3 - 2/3log22/3)=0.6(0.52832+0.389975)=0.550977
(3)、信息增益
gain=0.971-0.550977=0.42
以兴趣划分
(1)、划分前的信息熵(计算D的信息熵)
只有两个类别是(1)和否(0),否有6个,故所占的比例是60%,是有4个,故所占的比例是40%
Ent(D)= -(0.6log20.6 + 0.4log20.4 )= 0.971,即属性划分前信息熵为0.971
(2)、划分之后的信息熵(先计算Dv 的信息熵,再计算信息增益)
兴趣属性有两种划分:是(1)和否(0),分别计算0和1对应的信息熵,乘以比例再求和
由于是和否各5个,故Dv/D=0.5,
(1)、当兴趣为否的时候,有5个样本(Dv =5,D=10,即要计算这5个样本的信息熵),这5个样本对应的类别都为否,即当前样本集合D中否所占的比例为100%
(2)、当兴趣为是的时候,有5个样本(Dv =5,D=10),这5个样本中有一个样本对应的类别为否,其余4个对应的类别都为是,即否所占的比列为0.2,是所占的比例为0.8.
0.5(0log20 + 1log21) + 0.5( -0.2log20.2 - 0.8log20.8)=0.361
(3)、信息增益
gain=0.971-0.361=0.61
上面是以兴趣属性划分带来的信息增益,下面是其他属性划分带来的信息增益:
发现以兴趣划分,信息增益是最大的,即划分后不确定性是最小的,故以兴趣作为第一个节点。
运行决策树算法的结果:
即先以兴趣进行划分,如果为否则不合适,如下图所示将不合适的用红线划掉。
如果为是则进入第二个节点。在第二个节点还要进行一次划分,用一样的方法对时间进行划分,如下图所示
即有一个样本没有时间,类别为否,有4个样本有时间,类别为是。
一开始有四个属性,不知道从哪个属性开始划分,通过最大化的信息增益找到其中的两个进行划分,从而完成了分类。
二、实战准备(一)
lris数据集
lris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。
3 类(不同的花)共 150 条记录,每类(花)各 50 个数据
每条记录都有 4 项特征:
花萼长度(Sepal Length)、花萼宽度(Sepal Width),花瓣长度(Petal Length)、花瓣宽度(Petal Width)
通过4个特征预测花卉属于三类(iris-setosa,iris-versicolour, iris-virginica)中的哪一品种
结果标签:0= setosa,1=versicolor,2 = virginica
机器学习经典数据集:
简单而具有代表性
常用于监督式学习应用
三、实战(一)-决策树实现iris数据分类
数据集
1、基于iris_data.csv数据,建立决策树模型,评估模型表现;
2、可视化决策树结构;
3、修改min_samples_leaf参数,对比模型结果
iris_data.csv数据集免费下载
通过网盘分享的文件:iris_data.csv 链接: https://pan.baidu.com/s/1QPU-eMTCt_1OrRq2leuTWA 提取码: uny1 --来自百度网盘超级会员v6的分享
1、加载数据
#加载数据 import torch import pandas as pd import numpy as np from sklearn.metrics import accuracy_score from sklearn import tree # from matplotlib import pyplot as plt import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt data = pd.read_csv('./data/iris_data.csv') print(data)
结果:
sepal length sepal width ... target label 0 5.1 3.5 ... Iris-setosa 0 1 4.9 3.0 ... Iris-setosa 0 2 4.7 3.2 ... Iris-setosa 0 3 4.6 3.1 ... Iris-setosa 0 4 5.0 3.6 ... Iris-setosa 0 .. ... ... ... ... ... 145 6.7 3.0 ... Iris-virginica 2 146 6.3 2.5 ... Iris-virginica 2 147 6.5 3.0 ... Iris-virginica 2 148 6.2 3.4 ... Iris-virginica 2 149 5.9 3.0 ... Iris-virginica 2 [150 rows x 6 columns]
2、定义X和y
X = data.drop(['target','label'],axis=1) y = data.loc[:,'label'] print(X.shape,y.shape)#打印X,y的维度
结果:(150, 4) (150,)
3、建立决策树模型
#建立决策树模型 dc_tree = tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=5) #决策树分裂出来的叶子最少要有5个样本,如果再往下分发现少于5个样本节点就没有必要往下分了 dc_tree.fit(X,y) # 监督学习
criterion='entropy’也就是采用ID3。min_samples_leaf:叶子节点最少样本数,少于最少样本数就没必要往下分了。
4、评估模型表现
# 预测 y_predict = dc_tree.predict(X) # 准确率 accuracy = accuracy_score(y,y_predict) print(accuracy)
结果:0.9733333333333334
5、可视化
#绘图 fig1 = plt.figure(figsize=(10, 10)) tree.plot_tree(dc_tree,filled=True,feature_names=['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'],class_names=['setosa','versicolor','virginica']) #填充底色 分类名称 plt.show()
filled=True表示根据不同的分类加上不同的背景颜色。feature_names是修改属性名称。class_names显示输出类别。
结果:
查看samples的值,这个值要大于等于5。
如果报错:AttributeError: module 'backend_interagg' has no attribute 'FigureCanvas'. Did you mean: 'FigureCanvasAgg'?
则使用下面代码
# from matplotlib import pyplot as plt import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt
完整代码:
#加载数据 import torch import pandas as pd import numpy as np from sklearn.metrics import accuracy_score from sklearn import tree # from matplotlib import pyplot as plt import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt data = pd.read_csv('./data/iris_data.csv') print(data) #定义X,y X = data.drop(['target','label'],axis=1) y = data.loc[:,'label'] print(X.shape,y.shape)#打印X,y的维度 #建立决策树模型 dc_tree = tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=5) #决策树分裂出来的叶子最少要有5个样本,如果再往下分发现少于5个样本节点就没有必要往下分了 dc_tree.fit(X,y) # 预测 y_predict = dc_tree.predict(X) # 准确率 accuracy = accuracy_score(y,y_predict) print(accuracy) #绘图 fig1 = plt.figure(figsize=(10, 10)) tree.plot_tree(dc_tree,filled=True,feature_names=['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'],class_names=['setosa','versicolor','virginica']) #填充底色 分类名称 plt.show()
修改min_samples_leaf参数,对比模型结果
#建立决策树模型 dc_tree = tree.DecisionTreeClassifier(criterion='entropy',min_samples_leaf=1) #决策树分裂出来的叶子最少要有1个样本,如果再往下分发现少于1个样本节点就没有必要往下分了 dc_tree.fit(X,y)
将min_samples_leaf的值由5改为1,结果如下:
查看samples的值,这个必须大于等于1。