决策树的原理、方法以及python实现——机器学习笔记

这篇具有很好参考价值的文章主要介绍了决策树的原理、方法以及python实现——机器学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

* * * * * *  The Machine Learning Noting Series  * * * * * *

策树(Decision Tree)是机器学习的核心算法之一,在较小训练样本或有限计算资源下仍有较好表现,它包括分类树和回归树,是目前应用最广泛的分类预测和回归预测方法。

导航

0 引言

1 决策树的概念

    分类树

    回归树

2  决策树的生长

     分类算法

     分类过程

3  决策树的剪枝

     剪枝算法

     剪枝过程

4  python代码实现——实例应用

- - - - - - - - - - -

0  引言

考虑这样一个药品筛选问题,大批患有同种疾病的不同病人,服用5种候选药后取得同样的效果,现有每个病人服药前的几项生理指标数据,要通过这些数据来得到选药的建议,即要根据任何一个此类病人的生理指标来得到最合适药物的建议,这就可以使用决策树方法,建立以药物为输出变量,以生理指标为输入变量的多分类预测模型。此案例在文章最后给出。

1  决策树概念

分类树

以一个例子说明决策树概念。右侧图为一个典型的树深度等于4的决策树。树深度是树根到树叶的最大层数,通常为决策树模型复杂度的度量。每个椭圆为树的节点,有向箭头将各层节点连在一起构成树的分支,一个分支的上下节点分别成为父、子节点,每个父节点下均仅有2个子节点的称为2叉树,2个以上节点的为多叉树。根节点包含所有样本,按照某种分类算法分出的子节点分别包含父节点的部分样本,在末端且没有子节点的称为叶节点。

左侧图为右侧决策树的分类边界示意。右侧决策树根节点按 X2<5 规则生成第一层的左右两个子节点,分别对应左图水平线 X2=5 分割形成的上下两个区域,后面的分割依次类推。

python决策树,机器学习,决策树,python

 回归树

回归树本质上也是对 p+1 (p个输入变量)维空间的划分,下图展示了两个输入变量 X1 和 X2 以及一个输出变量 Y 的回归平面。左图为使用线性回归模型 python决策树,机器学习,决策树,python 所得的回归平面,右图为回归树的回归面。右图回归面按照一定的规则进行划分,例如最高面是按照规则 X1<-2.9和X2>3.4 划分的。图中深色观察测点的输出变量实际值大于预测值,样本观测点位于回归面上方,浅色点相反,可见回归树复杂度高,能有效分析输入和输出变量间的非线性关系,解决非线性回归问题。

python决策树,机器学习,决策树,python

 分类树空间划分的先后顺序和位置,每次划分应使分出的两个区域所包含的观测点的输出变量取值差异及异质性尽量低,即两区域的离差平方(或MES)和应为最小,公式为:(其中R为划分区域,为输出变量预测值)

python决策树,机器学习,决策树,python

2  决策树的生长

分类回归树CART(Classification and Regression Tree)为二叉树,使用贪心算法,自顶向下的递归二分策略实现区域划分。其他算法包括ID3和C4.5这里不做介绍。

分类算法

分类由节点异质性(也称为纯洁度(Purity))决定,异质性越小表明子节点观测值类别相同程度越高,分类越合适。

⚫ CART分类树使用基尼系数(Gini)(或者熵[参考点击这里] )度量节点异质性,节点 t 的基尼系数为:

其中 K 为输出变量的类别数, 是节点 t 中输出变量取第 k 类的概率。可见当节点 t 中输出变量均取同一类值即没有异质性时,基尼系数取最小值为0;当输出变量异质性最大时基尼系数取到最大值 1-1/k .

⚫ CART回归树使用方差度量异质性,节点 t 方差为:

其中,y(t) 为节点 t 中样本观测 X 的输出变量值, 为节点 t 中输出变量的均值。

分类过程

分类树节点的划分应使左()右()子节点的基尼系数均取到最小值,但通常无法做到,因此只需取两者的加权平均数最小即可,权重为左右节点各自的样本量占比。可见,从父节点到子节点,输出变量的异质性下降为:

python决策树,机器学习,决策树,python

“最佳”分组变量和组限应使取最大值。同理,若使用熵而非基尼系数,则使用熵替代上式中的 :

python决策树,机器学习,决策树,python

“最佳”分组同样需使上式达到最大值。需要说明的是,熵取最小值0代表节 t 无异质性,最大值取到 . 上式中的即为信息增益

回归树分类过程和分类树类似,只是异质性度量使用节点方差代替基尼系数。回归树异质性下降为:

python决策树,机器学习,决策树,python

“最佳”分组同样需使上式达到最大值。

3  决策树的剪枝

剪枝算法

CART的后剪枝采用最小代价复杂度剪枝法(Minimal Cost Complexity Pruning,MCCP),剪枝的目的是解决模型的过拟合,以得到测试误差最小的树,或者说,达到复杂度和测试误差的平衡。

可以使用叶节点个数来测度决策树的复杂度,将误差看成树的“测试代价”,那么树 T 的代价复杂度定义为:

python决策树,机器学习,决策树,python

其中,为树T的叶节点个数,α为复杂度参数(Complexity Parameter,CP参数),R(T)为测试误差:对于分类树使用判错率计算;对于回归树使用均方误差或者离差平方和计算,即此时:

一般希望测试误差R(T)和模型复杂度均较低,但两者其实是此高彼低的关系,因此只要两者之和即代价复杂度较小即可。

此外,树T代价复杂度是α的函数,α=0时表示不考虑复杂度的影响,基于代价复杂度最小是最优树的原则,此时的最优树为叶节点最多的树。显然最优树与CP参数α有关,因此可以通过调整α的取值得到一系列当前最优树,而真正的最优树就在其中。

剪枝过程

在从叶节点逐渐向根节点方向剪枝的过程中,需要判断先剪哪一只,是否需要剪枝的问题。即在判断是否应剪掉中间节点{t}下的子树时,应计算两者的代价复杂度,其中中间节点的代价复杂度通常被视为剪掉其所有子树后的代价复杂度(此时仅有一个叶节点):

python决策树,机器学习,决策树,python

中间节点的子树的代价复杂度为:

python决策树,机器学习,决策树,python

其中为左右两个子节点测试误差的加权均值,权重为各自样本量占比。

基于代价复杂度最小原则,若,即时,则应剪掉子树,因为它对降低测试误差贡献很小。

CART后剪枝主要分为两个阶段

python决策树,机器学习,决策树,python

python决策树,机器学习,决策树,python

 4  python代码实现——实例应用

继续引言中的例子,先说明结果,python代码放在最后。

python决策树,机器学习,决策树,python

 左图可以得出,树深度达到4时两个误差均达到最小,因此最有树深度为4,右图可以看出,影响药物效果的生理指标中,最重要因素为Na/K,性别没有影响。

python决策树,机器学习,决策树,pythonpython决策树,机器学习,决策树,python

左图表明模型整体预测正确率为99%,对药物B的查准率较低,但整体查准率P和查全率R均达99%,说明模型分类预测性能理想。右图为此案例的决策树,从前4行可以看出,当生理指标4≤14.83,指标2小于等于0.5以及指标0小于等于49.5时,推荐使用药物A,其余类推。

本案例python代码(来自参考文献,数据可向我索要)

# 导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import warnings
warnings.filterwarnings(action = 'ignore')
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False
import sklearn.linear_model as LM
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score,train_test_split
from sklearn.datasets import make_regression
from sklearn import tree
from sklearn.preprocessing import LabelEncoder
# 数据详情
data=pd.read_csv('药物研究.txt')
le = LabelEncoder()
le.fit(data["Sex"])
data["SexC"]=le.transform(data["Sex"])
data["BPC"]=le.fit(data["BP"]).transform(data["BP"])
data["CholesterolC"]=le.fit(data["Cholesterol"]).transform(data["Cholesterol"])
data["Na/K"]=data["Na"]/data["K"]
data.head()
# 生成决策树
X=data[['Age','SexC','BPC','CholesterolC','Na/K']]
Y=data['Drug']
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.70, random_state=123)
trainErr=[]
testErr=[]
K=np.arange(2,10)
for k in K:
    modelDTC = tree.DecisionTreeClassifier(max_depth=k,random_state=123)
    modelDTC.fit(X_train,Y_train)
    trainErr.append(1-modelDTC.score(X_train,Y_train))
    testErr.append(1-modelDTC.score(X_test,Y_test))
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,4))
axes[0].grid(True, linestyle='-.')
axes[0].plot(np.arange(2,10),trainErr,label="训练误差",marker='o',linestyle='-')
axes[0].plot(np.arange(2,10),testErr,label="测试误差",marker='o',linestyle='-.')
axes[0].set_xlabel("树深度")
axes[0].set_ylabel("误差")
axes[0].set_title('树深度和误差')
axes[0].legend()

bestK=K[testErr.index(np.min(testErr))]
modelDTC = tree.DecisionTreeClassifier(max_depth=bestK,random_state=123)
modelDTC.fit(X_train,Y_train)
axes[1].bar(np.arange(5),modelDTC.feature_importances_)
axes[1].set_title('输入变量的重要性')
axes[1].set_xlabel('输入变量')
axes[1].set_xticks(np.arange(5))
axes[1].set_xticklabels(['年龄','性别','血压','胆固醇','Na/K'])
plt.show()

# 打印决策树
print("模型的评价:\n",classification_report(Y,modelDTC.predict(X)))
print(tree.export_text(modelDTC))

参考文献

《Python机器学习 数据建模与分析》,薛薇 等/著

《机器学习与Pytnon实践》,黄勉 编著文章来源地址https://www.toymoban.com/news/detail-758055.html

到了这里,关于决策树的原理、方法以及python实现——机器学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习】决策树(Decision Tree,DT)算法介绍:原理与案例实现

    前言   决策树算法是机器学习领域中的一种重要分类方法,它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点,在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理,包括熵和信息熵的相关概念,以及几种经典的决策树算法。   在进

    2024年04月11日
    浏览(30)
  • 机器学习 C4.5算法原理 + 决策树分裂详解(离散属性+连续属性) 附python代码

    一.C4.5算法的简介: C4.5并不是单单一个算法而是 一套算法 ,主要用于对机器学习和数据挖掘中的分类问题。它是一种有监督的学习,也就是说对于该算法我们需要 先给它们提供一个数据集 ,这个数据集包含多个实例,每个实例都包含多个属性,该实例用这些属性描述, 根

    2024年02月08日
    浏览(43)
  • 【机器学习实战】决策树 python代码实现

    优点:计算复杂度不高 输出结果易于理解 对中间值的缺失不敏感,可以处理不相关的特征数据 缺点:可能会产生过度匹配的问题 适用数据类型 数据型和标称型 一般流程: 收集数据 准备数据 分析数据 训练算法 测试算法 使用算法 数据重新加载的问题 代码实现 实现截图

    2024年02月05日
    浏览(26)
  • 机器学习---决策树的划分依据(熵、信息增益、信息增益率、基尼值和基尼指数)

    1. 熵 物理学上,熵 Entropy 是“混乱”程度的量度。 系统越有序,熵值越低;系统越混乱或者分散,熵值越⾼。 1948年⾹农提出了信息熵(Entropy)的概念。        从信息的完整性上进⾏的描述:当系统的有序状态⼀致时,数据越集中的地⽅熵值越⼩,数据 越分散的地⽅熵值

    2024年02月10日
    浏览(33)
  • python机器学习决策树和SVM向量机算法实现红酒分类

    经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本,每个样本有13个特征,可以用于分类任务。 具体每个字段的含义如下: alcohol:酒精含量百分比 malic_acid:苹果酸含量(克/升) ash:灰分含量(克/升) alcalinity_of_ash:灰分碱度(以mEq/L为单位)

    2024年02月08日
    浏览(28)
  • 【机器学习】R语言实现随机森林、支持向量机、决策树多方法二分类模型

    暑期简单学习了机器学习理论知识,当时跟着B站咕泡老师学的,内容讲得蛮详细,实例代码、资料都比较全面,但是学校Python课程开设在这学期,所以用Python进行数据分析、建模等不是很熟悉,所以决定用之前学过的R语言来实现机器学习。R语言的相关包也都比较完善,所以

    2024年02月04日
    浏览(30)
  • (统计学习方法|李航)第五章决策树——四五节:决策树的剪枝,CART算法

    目录 一,决策数的剪枝 二,CART算法 1.CART生成 (1)回归树的生成 (2)分类树的生成          2.CART剪枝 (1)剪枝,形成一个子树序列 (2)在剪枝得到的子树序列T0,T1-----,Tn中通过交叉验证选取最优子树Ta   好的决策树不高不宽     柳建男的”后剪枝“挥手创作   如果

    2024年02月14日
    浏览(27)
  • 【人工智能与机器学习】决策树ID3及其python实现

    决策树(Decision Tree)是一类常见的机器学习方法,是一种非常常用的分类方法,它是一种监督学习。常见的决策树算法有ID3,C4.5、C5.0和CART(classification and regression tree),CART的分类效果一般要优于其他决策树。 决策树是基于树状结构来进行决策的,一般地,一棵决策树包含

    2024年02月08日
    浏览(29)
  • 2023年数学建模随机森林:基于多个决策树的集成学习方法

    目录 目录 1. 什么是随机森林? 2. 随机森林的优缺点 3. 随机森林的构建过程

    2024年02月08日
    浏览(28)
  • python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归

    线性回归所解决的问题是把数据集的特征传入到模型中,预测一个值使得误差最小,预测值无限接近于真实值。比如把房子的其他特征传入到模型中,预测出房价, 房价是一系列连续的数值,线性回归解决的是有监督的学习。有很多场景预测出来的结果不一定是连续的,我们

    2024年02月15日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包