【机器学习】决策树

本文详细介绍了决策树的工作原理,特别是在sklearn库中的实现。通过讲解`DecisionTreeClassifier`,讨论了`criterion`参数,如熵和基尼指数的选择,以及`random_state`和`splitter`对模型稳定性和防止过拟合的影响。还提到了剪枝参数如`max_depth`、`min_samples_split`和`min_samples_leaf`等,强调了在处理不平衡数据集时的`class_weight`参数。此外,简要介绍了回归树和决策树在泰坦尼克号生存预测中的应用,以及决策树的优缺点。
摘要由CSDN通过智能技术生成


学习视频:
《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili


决策树

1.概述

1.1决策树是如何工作的

决策树(Decision Tree)是一种非参数(可以处理各种各样的数据)的有监督学习(就是必须要有标签)方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。

决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。

在这个决策过程中,一直在对记录的特征进行提问。最初的问题所在的地方叫做根节点,在得到结论前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点

  • 根节点:没有进边,有出边。包含最初的,针对特征的提问;
  • 中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问;
  • 叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签。
  • 子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点。

对于决策树算法来说,其核心就是解决以下两个问题:

  • 如何从数据表中找出最佳节点和最佳分枝?
  • 如何让决策树停止生长,防止过拟合?

1.2 sklearn中的决策树

  • 模块sklearn.tree

sklearn中的决策树的”类“都是”tree“这个模块下,这个模块总共包括5个类
在这里插入图片描述

  • sklearn的基本建模流程

在这里插入图片描述

调用适合的类,然后确定参数,训练模型利用fit接口,提取有用的信息,例如score就是对分类模型进行打分的。在此流程下,分类树对应的代码:

from sklearn import tree              #导入需要的模块

clf = tree.DecisionTreeClassifier()   #实例化
clf = clf.fit(X_train,y_train)        #用训练集数据训练模型
result = clf.score(X_test,y_test)     #导入测试集,从接口中调用需要的信息

2.DecisionTreeclassifier与红酒数据集

2.1重要参数

2.1.1 criterion

为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做==“不纯度”==。通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。
不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的,也就是说,在同一棵决策树上,叶子节点的不纯度一定是最低的。

Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:

(1)输入"entropy",使用信息(Entropy)
E n t r o p y ( t ) = − ∑ i = 0 c − 1 p ( i ∣ t ) log ⁡ 2 p ( i ∣ t ) Entropy\left( t \right) =-\sum_{i=0}^{c-1}{p\left( i|t \right) \log _2p\left( i|t \right)} Entropy(t)=i=0c1p(it)log2p(it)
(2)输入"gini",使用基尼系数(Gini Impurity)
G i n i = 1 − ∑ i = 0 c − 1 p ( i ∣ t ) 2 Gini=1-\sum_{i=0}^{c-1}{p\left( i|t \right) ^2} Gini=1i=0c1p(it)2
其中t是表示的给定节点,i表示的是标签的任意分类, p ( i ∣ t ) 2 p\left(i|t\right)^2 p(it)2表示的是标签分类i在节点t上所占的比例。

在sklearn中计算信息熵时,是基于信息熵的信息增益(Information Gain),也就是父节点的信息熵和子节点信息熵的差。相比于基尼系数来说,信息熵对不纯度更加敏感,对不纯度的惩罚最强,但是在实际使用过程中,信息熵和基尼系数的效果基本一样。信息滴的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息滴对不纯度更加敏感,所以信息滴作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息摘很容易过拟合,基尼系数在这种情况下效果往往比较好。当模型拟合程度不足的时候,即当模型在训练集和测试集上都表现不太好的时候,使用信息滴。当然,这些不是绝对的。

对于criterion参数

  • 确定不纯度的计算方法,帮忙找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好;
  • 改参数有两个选择:gini或entropy,默认状态下是gini;
  • 通常情况下使用基尼系数,数据维度很大,噪音很大时使用基尼系数;维度低,数据比较清晰的时候,信息滴和基尼系数没区别当决策树的拟合程度不够的时候,使用信息滴两个都试试,不好就换另外一个。

对于决策树的基本流程可以简单的概况为:

在这里插入图片描述

直到没有更多的特征可用,或整体的不纯度指标已经最优,决策树就会停止生长。

在了解了第一个参数后,利用Python中自带的红酒数据建立一个树

(1)导入模块

from sklearn import tree #导入决策树的模块
from sklearn.datasets import 1oad_wine #导入红酒数据,datasets是sklearn自带的,有各种各样的数据
from sklearn.model_selection import train_test_split#导入划分测试集和训练集的模块

(2)探索数据

wine = load_wine()
wine.data#数据的特征
win.target#数据标签

#把wine数据转换成一张表
import pandas as pd
pd.concat([pd.DataFrame (wine.data) , pd.DataFrame(wine.target)],axis=1)
wine.feature_names #特征名字
wine.target_names  #标签名字

(3)划分训练集和测试集

Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

Xtrain.shape
Xtest.shape

(4)建立模型

多数运行下面的代码会呈现不同的结果,

clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(Xtrain, Ytrain)   #fit就是训练的接口
score = clf.score(Xtest, Ytest) #返回预测的准确率
score

(5)画出一棵树

feature_name=['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值