sklearn机器学习:决策树案例

news/2024/5/8 7:20:49/文章来源:https://blog.csdn.net/oax_knud/article/details/128074452

系列文章目录


文章目录

  • 系列文章目录
  • 一、决策树原理
    • 1.1 定义
    • 1.2 优点
    • 1.3 缺点
  • 二、分类树
    • 2.1 函数语法
    • 2.2 案例
  • 三、回归树案例
    • 3.1 函数语法
    • 3.2 案例


一、决策树原理

1.1 定义

决策树是一种用来 classification (分类)和 regression(回归) 的无参监督学习方法。其目的是创建一种模型从数据特征中学习简单的决策规则来预测一个目标变量的值

1.2 优点

  1. 便于理解和解释。树的结构可以可视化出来。
  2. 训练需要的数据少。其他机器学习模型通常需要数据规范化,比如构建虚拟变量和移除缺失值。
  3. 决策树的开销和决策树导入的训练集数目呈指数关系。
  4. 能够处理数值型数据和分类数据
  5. 能够处理多路输出的问题
  6. 使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。
  7. 可以通过数值统计测试来验证该模型。(解释模型的可靠性)
  8. 即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好。

1.3 缺点

  1. 过拟合:决策树模型容易产生一个过于复杂的模型,泛化性能可能会很差。剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现该问题有效方法。
  2. 决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解。
  3. 决策树学习算法是基于启发式算法,学习一棵最优决策树通常是一个NP难问题。例如在每个节点进行局部最优决策的贪心算法,这样的算法不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成。
  4. 数据平衡:如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡

二、分类树

2.1 函数语法

官方解释:决策分类树

sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)
参数含义
criterion节点分裂效果的量化指标,默认gini(基尼系数);可选择:entropy(信息熵)和gini和log_loss
splitter用于在每个节点上选择拆分的策略。支持的策略是“best”选择最佳拆分,“random”选择最佳随机拆分。
max_depth树的最大深度.;若为None,则节点一直分裂,直到无法继续分裂,或者叶子节点包含的样本数目小于min_samples_split
min_samples_split一个节点分枝所需要的最小样本数目: 如果是int,那么考虑min_samples_split作为最小值。如果是float,那么min_samples_split是一个分数,ceil(min_samples_split * n_samples)是每次拆分的最小样本数。
min_samples_leaf一个节点分枝后,分裂的节点所包含的最小样本数目。如果是int,那么考虑min_samples_leaf作为最小值。如果是float,那么min_samples_leaf是一个分数,ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。
min_weight_fraction_leaf叶节点上所需的(所有输入样本的)权重总和的最小加权分数。当没有提供sample_weight时,样本具有相等的权值
max_features限制分枝时考虑的特征个数 。如果是int,那么考虑每次拆分时的max_features特性。如果是float,那么max_features是一个分数,max(1, int(max_features * n_features_in_))特征在每次拆分时都被考虑。如果" auto “,那么max_features=sqrt(n_features)。如果” sqrt “,那么max_features=sqrt(n_features)。如果” log2 ",那么max_features=log2(n_features)。如果为None,则max_features=n_features。
random_state如果准则的改进对于几个分割是相同的,并且必须随机选择一个分割,则情况就是如此。为了在拟合过程中获得确定性行为,random_state必须固定为一个整数。
max_leaf_nodes最大的叶子节点数目
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。
class_weight可以采用“balanced”模式使用y的值自动调整权重,权重与输入数据中的类频率成反比,如n_samples / (n_classes * np.bincount(y))
  • criterion:通常就使用基尼系数;数据维度很大,噪音很大时使用基尼系数;维度低,数据比较清晰的时候,信息熵和基尼系数没区别;当决策树的拟合程度不够的时候,使用信息熵;两个都试试,不好就换另外一个
  • max_depth:实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度
  • min_samples_leaf:搭配max_depth使用,这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从=5开始使用。如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用。

属性列表:

属性含义
classes_类标签(单个输出问题),或类标签数组列表(多个输出问题)。
feature_importances_特征权重
max_features_max_features的推断值。
n_classes_类的数量(针对单个输出问题),或包含每个输出的类的数量的列表(针对多个输出问题)。
n_features_in_fit时看到的特征数目
feature_names_in_fit时看到的特征名称
n_outputs_fit时output的数目
tree_底层Tree对象

方法列表:
在这里插入图片描述

2.2 案例

数据集采用的是:sklearn.datasets中的wine数据集,在这里我把它导出为了csv进行后续训练。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import graphviz#读取数据
wine=pd.read_csv(r"D:\ml-learn\code\decision-tree\wine.csv")
#特征和标签
wine_features,wine_label=wine.iloc[:,:13],wine.iloc[:,13:14]
#划分数据集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine_features,wine_label,test_size=0.3)#构建模型
clf = tree.DecisionTreeClassifier(criterion="entropy",splitter="best",max_depth=5,min_samples_split=0.15,min_samples_leaf=0.05,random_state=1,class_weight="balanced")
#训练模型
clf = clf.fit(Xtrain, Ytrain)#决策树属性
#决策树标签种类
classes=clf.classes_
#特征重要性权重
feature_importance=clf.feature_importances_
#最大特征数目
clf.max_features_
#标签的种类数目
clf.n_classes_
#输入特征数目
clf.n_features_in_
#输出标签数目
clf.n_outputs_
#决策树对象
clf.tree_#决策树方法
#apply:返回样本预测类别所在的叶子节点
clf.apply(Xtest)
#计算最小成本复杂度修剪过程中的修剪路径。
clf.cost_complexity_pruning_path(Xtest,Ytest)
#返回决策路径
clf.decision_path(Xtest)
#决策树深度
clf.get_depth()
#决策树叶子节点数目
clf.get_n_leaves()
#决策树训练参数
clf.get_params
#获取预测值
clf.predict(Xtest)
#获取预测值的log-probabilities :范围在-inf到0
clf.predict_log_proba(Xtest)
#预测每一类的可能性:范围在0-1
clf.predict_proba(Xtest)
#测试集得分:准确率
clf.score(Xtest,Ytest)#绘制一个决策树,并保存pdf
dot_data = tree.export_graphviz(clf, out_file=None,feature_names=wine_features.columns,class_names=["class1","class2","class3"],filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render(r"D:\ml-learn\code\decision-tree\wine")

三、回归树案例

3.1 函数语法

官方函数说明:DecisionTreeRegressor

sklearn.tree.DecisionTreeRegressor(*, criterion='squared_error', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, ccp_alpha=0.0)

回归树和分类树主要不同的参数在于criterion
criterion表示回归树衡量分枝质量的指标,支持的标准有三种:

  1. 输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失
  2. 输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差
  3. 输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失

方法区别:回归树的接口score返回的是R平方,并不是MSE

3.2 案例

#回归树案例:
from sklearn.model_selection import cross_val_score
from sklearn import tree
from sklearn.model_selection import train_test_split
import graphviz
import pandas as pd#读取数据
boston=pd.read_csv(r"D:\ml-learn\code\decision-tree\boston_house_prices.csv")
boston_features,boston_target=boston.iloc[:,:13],boston.iloc[:,13:]
#划分数据集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(boston_features,boston_target,test_size=0.3)#构建回归树
regressor=tree.DecisionTreeRegressor(random_state=1,max_depth=5)
#训练回归树
regressor=regressor.fit(Xtrain,Ytrain)
#交叉验证
cross_val_score(regressor,Xtest,Ytest, cv=10,scoring = "neg_mean_squared_error")# 回归树属性
#特征重要性权重
regressor.feature_importances_
#最大特征数目
regressor.max_features_
#标签的种类数目
regressor.n_classes_
#输入特征数目
regressor.n_features_in_
#输出标签数目
regressor.n_outputs_
#回归树对象
regressor.tree_#回归树方法
#apply:返回样本预测类别所在的叶子节点
regressor.apply(Xtest)
#计算最小成本复杂度修剪过程中的修剪路径。
regressor.cost_complexity_pruning_path(Xtest,Ytest)
#返回决策路径
regressor.decision_path(Xtest)
#决策树深度
regressor.get_depth()
#决策树叶子节点数目
regressor.get_n_leaves()
#决策树训练参数
regressor.get_params
#获取预测值
regressor.predict(Xtest)
#测试集得分:准确率
regressor.score(Xtest,Ytest)#绘制一个决策树,并保存pdf
dot_data = tree.export_graphviz(regressor,out_file=None,feature_names=boston_features.columns,filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render(r"D:\ml-learn\code\decision-tree\boston")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_227010.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派不吃灰】Linux篇⑩ 学习例行性工作排程(核心概念)

目录1. 什么是例行性工作排程2. 仅运行一次的工作排程3. 循环运行的例行性工作排程4. 可唤醒停机期间的工作任务5. 重点回顾❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11-28 ❤️❤️ 本篇更新记录 2022-11-28 ❤️&…

python>>numpy(第二讲)

章节内容 元素操作 常用的方法 广播 数组形状操作 排序数组 目录 元素操作 一些常用的方法 广播 数组形状操作 数组排序 元素操作 生成元素a np.array([1,2,3,4]) b np.ones(4)1 生成一个原来数组的n倍生成一个所有元素均跟2次方有关的数组一个计算矩阵相乘的函数判断两个…

2022王道OS 1.2 操作系统的发展与分类

2022 王道OS 操作系统的发展与分类 文章目录2022 王道OS 操作系统的发展与分类知识总览OS的发展与分类手工操作阶段批处理阶段--单道批处理系统批处理阶段--多道批处理系统分时操作系统实时操作系统其他几种OS知识回顾与重要考点文章目录2022 王道OS 操作系统的发展与分类知识总…

jsp美食管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 美食管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统采用serlvet dao bean mvc模式开发,系统具有完整的源代码和数据库,系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8…

QT-MySQL QSqlDatabase: QMYSQL driver not loaded

使用Qt连接mysql数据库,遇到了一个问题,就是QT5.14.1版本在连接MySQL数据库时候,提示驱动加载失败,“QMYSQL driver not loaded” 编程环境:   Qt5.14.1,编译器是MSVC2017_64,是64位的。   mysql-8.0.30-winx64&am…

如何在 docker 容器使用 nginx 实现反向代理统一站点入口

在微服务架构下,我们会部署很多微服务来实现我们的系统。每个微服务会有不同的端口。而用户在访问我们的站点时希望通过统一的端口来访问所有的服务,因为在很多情况下用户只能通过 80 或者 443 端口访问外界服务。 这个时候我们就可以使用反向代理来实现…

Kubernetes集群coredns缓存容器bind: address already in use错误导致集群服务无法互通解决

coredns缓存nodelocal dns cache :53: bind: address already in use错误处理起因分析问题处理问题重启Node local dns起因 事情起因是Kubernetes集群内的服务无法互相访问了 分析问题 因为Kubernetes集群内的服务都是通过service、pod的名称作为域名到coredns解析Cluster I…

[附源码]计算机毕业设计springboot贷款申请审核管理系统论文

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【简单、高效、性能好】SetFit:无需Prompts的高效小样本学习

重磅推荐专栏: 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers,轻松构建属于自己的NLP智能应用! 1. 概要 使用预训练语言模型的小样本学习(处理只有少量标签或没有标签的数据)已成为比较普遍的…

Zlibrary已死,找了一个替代品,找了一个替代品免费的电子书下载平台...

大家好,我是鸟哥。一个半路出家的程序员。 提到Zlibrary,想必大家都不陌生吧。全球最大的数字图书馆,截止被封前共收录了591万本书,7751万篇文章,并且还在不断的增加中,关键是可以免费下载。 反正我是很熟悉…

智能计量系统配套设备有哪些

智能计量系统配套设备 地磅区域安装配套设备包含:微波定位仪、视频监控、道闸、LED显示屏、车号识别、语音对讲、音响设备、红绿灯、刷卡机箱、雷达、补光灯。 硬件设备 1、微波定位仪:通过微波定位仪设备,可以判断车辆是否完全上磅。 2、…

C++11(一)

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、列表初始化initializer_list二、声明1.auto2.decltype3.nullptr三、C11 STL中的变化1.array2.forward_list3.STL其他变化四、C关键字新功…

【三维重建补充知识-0】视差、深度概念及其转换

一、基本概念 把手指放在眼前,分别闭上左、右眼,我们会发现手指与后边物体的相对位置是不同的,也即两眼所识别的两幅图像之间存在视觉差异,我们通过“视差”这一概念来表示这种差别。 该过程也可以通过两个处于同一平面的相机来模…

C++ 之 移动构造函数

1、左值和右值 C( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。 通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象,表达式结束后依然存在的持久化对象,所有的具名变量或者对象都是左值。右值是指临时的…

设置渐变边框色

如上图所示,需设置渐变边框色,左右边框颜色固定,上边框从左到右开始渐变,下边框从右到左开始渐变。 思考了很久,如果看作是一个div,则需要用到 border-image属性设置渐变色。也可以看作是两个div&#xff0…

CISAW信息安全保障人员认证考试难吗?

CISAW信息安全保障人员认证,作为信息安全行业相当热门的证书之一,其持证人数已超50%,在信息安全行业内占有一席之地,很多报考人都比较关心CISAW考试难不难?能通过吗?那接下来说一说CISAW证书考不好考&#…

常见的网络协议

目录 一、TCP/IP协议簇 二、网络设备与五层模型对应关系: 三、常用网络协议总结(TCP/IP协议簇) 四、应用层服务协议 五、传输层协议组 TCP_UDP 六、网络层协议 IP_ICMP_ARP 七、物理层协议 MAC子层协议 一、TCP/IP协议簇 OSI七层模型…

IBM MQ 故障诊断(一)

说明:本文主要是针对运维人员的手册。前面部分主要是应用三板斧的方式,后面的步骤可能会发散和具体深入一些。不过也不是严格的划分,读者就当看一遍杂文的方式来看待此文吧。 一,队列管理器的启停 QMGR的启停是故障诊断中遇到最…

[附源码]SSM计算机毕业设计线上图书销售管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

用huggingface.transformers在文本分类任务(单任务和多任务场景下)上微调预训练模型

诸神缄默不语-个人CSDN博文目录 transformers官方文档:https://huggingface.co/docs/transformers/index AutoModel文档:https://huggingface.co/docs/transformers/v4.23.1/en/model_doc/auto#transformers.AutoModel AutoTokenizer文档:ht…