决策树 (Decision Tree)

目录

一、决策树算法的概念

决策树的优点

二、决策树模型

1、什么是决策树模型

决策树模型 Decision tree model

2、选择在节点需要使用的特征

信息理论

[1] 信息熵的定义

[2] 信息熵的计算

3、剪枝处理

三、使用sklearn自带库实现鸢尾花决策树

代码部分

运行结果


一、决策树算法的概念

决策树(DTs)是一种树形结构,本质是一颗由多个判断节点组成的树,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,是一种用于分类和回归的非参数有监督学习方法。

决策树的基本概念包括:根节点、内部节点、叶节点、分支、测试、属性等。决策树的生成过程包括:特征选择、决策树的生成、决策树的修剪等。

决策树是一种预测模型,它代表的是对象属性与对象值之间的一种映射关系。决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法

决策树的优点


决策树的优点是易于理解和解释,可以处理缺失数据和异常数据,适用于大规模数据集等。

二、决策树模型

1、什么是决策树模型

决策树模型 Decision tree model

以西瓜为例建立一个决策树模型

色泽根蒂声音好坏
绿色清脆
深绿色/
绿色
//

我们有2个输入特征,输出标签0或1,这是一个二元分类问题。

输入的特征 X 采用分类值,也就是说,这些特征值只取几个值,第一个特征要么是有色泽的,要么是无色泽的;声音要么是清脆要么是沉闷。

当我们有一个待测试模型时,从顶端根节点开始往下进行判断1,0抵达下一个分支直达最后一个节点判断是好瓜还是坏瓜。

我们要优先选择最容易判定好坏瓜的特征作优先判断。如看瓜有无色泽即可立即判断西瓜的好坏,而直接通过根蒂却无法直接判断,所以将色泽作为根节点,根蒂作为叶节点判断。

所以在决策树学习时,我们做的第一步就是决定选择哪个特征。

第二个关键的决定就是何时停止使用特征进行分类,也就是何时停止拆分。我们刚才使用的标准是确定了100%是好瓜或者坏瓜才停止拆分。除此之外,我们可以在分裂没有进一步的结果导致树超过最大深度。树的最大深度时可以人为设定的一个参数;

在决策树中,节点的深度定义为跳数,从表示最顶部的根节点到特点节点所需的时间,

根节点所在的位置是depth 0,如果我们设定决策树最大深度为2.那么它在depth 2就会输出结果,将不会拆分此级别以下的任何节点,这时决策树永远也不会到达深度3。

限制深度原因

限制决策树的深度,是为了不让决策树变得太大、太笨重;其次,保持决策树很小,它也不容易过度拟合

另一个原因是,优先级分数的改进,就是如果拆分后得到的收益太小,由于要尽量保持决策树较小,我们也会考虑停止拆分。

如果某个节点示例数低于某个阈值,我们也可能会停止分裂。
 

2、选择在节点需要使用的特征

信息理论

[1] 信息熵的定义

熵就是衡量一组数据是否不纯的指标,选择根节点时,需要计算每个特征的信息熵,信息增益最大的作为根节点,信息熵越大代表越不稳定。

[2] 信息熵的计算

信息的整体的熵:

假定离散属性 a 有 V 个取值,那么可以计算 a 取值为 v 时的熵 2D^v , 考虑到样本数量的影响,最终得到信息增益(GAIN)

那么只需要递归地选取能使信息增益最大化的属性就行,即

这就是ID3算法。

3、剪枝处理


剪枝处理是避免模型过拟合的常用手段,常见的有预剪枝和后剪枝。
预剪枝:决策树生成过程中,在划分前估计,如果不能提升泛化能力,那么停止
后剪枝:决策树生成后,自底向上,将不能提示泛化能力的叶子节点剪掉

三、使用sklearn自带库实现鸢尾花决策树

使用之前已经做数据分类的鸢尾花数据集进行测试,关于数据集处理部分请参考上一章PR曲线。

代码部分

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.preprocessing import label_binarize
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
#切分数据集
from sklearn.model_selection import train_test_split
 
 
#使曲线变化显著,增加噪声
random_state=np.random.RandomState(0)
n_samples,n_features=X.shape
#在原始x的列上n_feature*n倍级噪声增加n倍
X=np.c_[X,random_state.randn(n_samples,200*n_features)]
 
#划分训练集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=random_state)#分割训练集
 
#模型创建与应用
#初始化模型
model=DecisionTreeClassifier()
#驯练模型
model.fit(X_train,y_train)
#模型预测
predictions=model.predict(X_test)
predictions
#模型评估
score=accuracy_score(y_test,predictions)
print(score)
# pre_data=model.predict(X_test)
# print(pre_data)
print("特征重要性:",model.feature_importances_)

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值