决策树算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、决策树模型
  • 二、使用sklearn自带库实现鸢尾花决策树


前言

决策树

决策树(DTs)是一种用于分类和回归的非参数有监督学习方法。

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

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

决策树的优点

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


提示:以下是本篇文章正文内容,下面案例可供参考

一、决策树模型

1、什么是决策树模型

决策树模型 Decision tree model

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

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

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

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

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

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

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

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

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

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

限制深度原因

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

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

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

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

信息熵的定义——熵就是衡量一组数据是否不纯的指标。

信息增益——选择根节点时,需要计算每个特征的信息熵,信息增益最大的作为根节点。

信息熵越大代表越不稳定

信息的整体的熵

Ent(D)=\sum_{k=1}^{|y|}p_{k}log_{2}p_{k}

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

Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})

那么只需要递归地选取能使信息增益最大化的属性 a_{*}就行,即a_{*}=argmax_{a\in A}Gain(D,a),这就是ID3算法

2.1-剪枝处理

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

二、使用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_)

运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值