基于决策树及集成算法的回归与分类案例

news2024/11/18 10:21:15

基于决策树及集成算法的回归与分类案例

描述

本任务基于决策树及集成算法分别实现鲍鱼年龄预测案例和肿瘤分类案例。鲍鱼年龄预测案例是建立一个回归模型,根据鲍鱼的特征数据(长度、直径、高度、总重量、剥壳重量、内脏重量、壳重)等预测其年龄。

肿瘤分类案例我们已经用逻辑回归实现过,本任务利用决策树和集成算法来实现。

本任务的主要实践内容:

1、 决策树分类模型的构建

2、 决策树算法的调参

3、 集成算法(随机森林、Adaboost)的应用及对比

4、 使用matplotlib可视化模型预测曲线

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库

    matplotlib	3.3.4
    numpy 			1.19.5
    pandas			1.1.5
    scikit-learn	0.24.2
    mglearn        0.1.9
    

分析

鲍鱼年龄预测模型的输出(年龄)是个连续值,因此这是一个回归问题,算法的目的是寻找鲍鱼的特征数据和年龄之间的规律(即回归函数)。

本任务涉及以下几个环节:

a)加载、查看数据集

b)数据的处理及拆分

d)构建模型,拟合训练数据

e)评估并预测鲍鱼年龄

子任务:基于决策树与集成算法,构建分类模型预测肿瘤分类

实施

1、加载、查看鲍鱼数据集

Abalone数据集可以在线加载,但建议下载到本地,然后加载本地文件(方法2)。

import numpy as np
import pandas as pd
from IPython.display import display

# 方法1、在线加载鲍鱼数据集文件(csv格式,建议复制链接下载到本地,然后使用方法2加载)
# url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
# data = pd.read_csv(url) # 读取在线数据

# 方法2、加载本地数据文件(abalone.data文件放在当前目录)
abalone = pd.read_csv('../dataset/abalone.data')

# 原数据中没有表头(即特征名称),我们加上便于观察数据
abalone.columns = ['Sex', 'Length', 'Diameter', 'Height',
                'Whole weight', 'Shucked weight', 'Viscera weight',
                'Shell weight', 'Rings']

display(abalone) # 4176条数据,8个特征(最后一列Rings代表环数,即年龄,相当于数据的标签)

显示结果:

请添加图片描述

4176条数据,8个特征,最后一列Rings代表年龄,相当于数据的标签(target)。

2、数据处理及拆分

前几节里我们用的数据集都是scickit-learn自带的,内部已经将data(样本特征数据)和target(标签)分开,而鲍鱼数据集需要我们自己分开,然后才能使用train_test_split函数将data和target拆分为训练集和测试集。

另外,需要注意的是,性别(Sex)列不是数字,而是M(雄性)、F(雌性)和I(未知)三个字符,为了便于模型处理,我们需要将其转换为数字,这里我们用0、1、2分别替换M、F和I。

# 性别特征的值是M、F和I(未知),为了便于算法计算,需要变成数字
new_abalone = abalone.replace({'M':0 ,'F':1, 'I':2}) # M、F、I分别替换为0,1,2
display(new_abalone)

显示结果:

请添加图片描述

接下来,我们获取前8列作为data(样本特征数据)、最后1列年龄作为target(样本的标签),然后再使用train_test_split函数将data和target随机拆分为训练集和测试集。

from sklearn.model_selection import train_test_split

# 从数据集中分离样本数据和标签数据
data = new_abalone.values[:, :8] # 前8列(特征数据)
target = new_abalone.values[:, -1] # 最后一列(年龄)

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(data, target, 
                                                    test_size=0.25, random_state=0)

print(X_train.shape, X_test.shape) # 查看拆分结果

输出结果:

(3132, 8) (1044, 8)

3、创建模型,评估与预测

我们使用三种模型来建模,分别是:决策树(默认参数)、随机森林(集成50棵决策树)和线性回归。

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression


# 创建回归模型
# model = DecisionTreeRegressor().fit(X_train, y_train) # 决策树(默认参数)
model = RandomForestRegressor(50).fit(X_train, y_train) # 使用50棵决策树构成随机森林
model = LinearRegression().fit(X_train, y_train) # 线性回归

# 评估模型(分类模型输出准确率,回归模型输出R2_score)
print('test_score:', model.score(X_test, y_test))

# 预测测试集中的鲍鱼年龄
y_pred = model.predict(X_test)
n = 10 # 显示前n个样本的预测年龄,并与实际年龄作对比
print('预测年龄:', np.round(y_pred[:n])) # np.round()-四舍五入取整
print('实际年龄:', y_test[:n])

显示结果:

# 决策树(默认参数)
test_score: 0.46037735849056594
预测年龄: [0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
实际年龄: [0 1 1 1 1 1 1 1 1 1]
# 使用50棵决策树构成随机森林
test_score: 0.8677924528301887
预测年龄: [0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
实际年龄: [0 1 1 1 1 1 1 1 1 1]
# 线性回归
test_score: 0.7291758706114061
预测年龄: [0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
实际年龄: [0 1 1 1 1 1 1 1 1 1]

可以看到:使用默认参数的决策树回归算法表现最差,使用50棵决策树集成的随机森林和逻辑回归模型表现要好一些。

4、可视化预测曲线

为了形象地观察模型预测的年龄和实际年龄的关系,我们使用Matplotlib将预测值和实际值可视化。

import matplotlib.pyplot as plt

# 可视化预测曲线
plt.figure(figsize=(12, 4)) # 图像尺寸
plt.title('Abalone age prediction') # 标题
n = 100 # 图中显示样本的数量
plt.plot(np.arange(n), y_pred[:n], label='pred') # 预测值
plt.plot(np.arange(n), y_test[:n], label='true') # 实际值
plt.legend() # 显示图例
plt.show()

显示结果:

请添加图片描述

5、子任务:使用多种模型实现肿瘤预测(分类问题)

决策树及其集成算法既可以处理回归问题,也可以处理分类问题,下面对比它们在肿瘤分类预测中的表现。

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

cancer = load_breast_cancer() # 加载cancer数据集

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, 
                                                    test_size=0.25, random_state=0)
# 创建多种分类模型
m_1 = DecisionTreeClassifier().fit(X_train, y_train) # 无参数决策树(过拟合现象严重)
m_2 = DecisionTreeClassifier(max_depth=5, min_samples_leaf=9).fit(X_train, y_train) # 指定剪枝参数
m_3 = RandomForestClassifier(50).fit(X_train, y_train) # 随机森林(使用50棵决策树)
m_4 = AdaBoostClassifier().fit(X_train, y_train) # AdaBoost

# 评估模型,对比准确率
models = {'d_tree_1':m_1, 'd_tree_2':m_2, 'r_forest':m_3, 'adaboost':m_4}
for m in models:
    score_train = models[m].score(X_train, y_train)
    score_test = models[m].score(X_test, y_test)
    print('{}: train_score {:.2f}  test_score {:.2f}'.format(m, score_train, score_test))

输出结果:

d_tree_1: train_score 1.00  test_score 0.87
d_tree_2: train_score 0.96  test_score 0.94
r_forest: train_score 1.00  test_score 0.97
adaboost: train_score 1.00  test_score 0.98

可以看出,无参数的决策树模型(d_tree_1)过拟合现象比较严重,而指定了剪枝参数的决策树( d_tree_2)和两个决策树集成模型(随机森林、AdaBoost)表现更好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:超级大全网上面试题搜集整理(四)

转载参考: python 面试题(高级)_python高级面试题_梦幻python的博客-CSDN博客 cpython pypy_介绍Cython,Pypy Cpython Numba各有什么缺点【面试题详解】_函明的博客-CSDN博客 Cython、PyPy专题开篇 - 知乎 Python抽象类和接口类_python 接口类_代码输…

蓝桥杯客观题知识点

一、异步和同步的在于 有无统一的时钟信号 异步无 同步有 RS485 半双工、异步、串行、差分输入------多级通信(USB\键盘等外设) RS232 全双工、异步、串行、单端输入------一对一通信 二、组合逻辑电路和时序逻辑电路的区别 组合:任意时…

使用反射重新执行不同的方法

0. 用到的技术 反射获取正在执行的方法名称Class[]数组的获取 1. 为什么要这样做? 情况如下: 当我调用sendCommands方法发送请求时可能会收到errorCode为403也就是代码中的MDS_ERROR,就是当token(mds)失效了这种情况,我们就需要重新刷新token,并且重新执行该方法 假设还有1…

SYN FLOOD攻击和HTTP慢速攻击实验笔记

SYN_FLOOD攻击和HTTP慢速攻击是DDOS攻击的两种方式。 SYN Flood攻击 SYN Flood攻击的原理就是阻断TCP三次握手的第三次ACK包,即不对服务器发送的SYNACK数据包做出应答。由于服务器没有收到客户端发来的确认响应,就会一直保持连接直到超时,当…

产品营销软文怎么写吸引人?

随着互联网的发展,人们获取信息的渠道变得越来越多,其中软文营销成为了众多企业推广自己产品的主要方式之一。那么,软文营销怎么写才能吸引人呢?这里有一些建议,可以帮助你解决这个问题。 要想写出一篇成功的软文&…

自拍的照片不太清晰怎么办?拍摄的模糊照片如何修复高清?

如果您的人像照片不太清晰,可能是由于手持相机时快门速度过慢、摄像机抖动或者焦点不准确等原因造成的。 自己拍摄的照片总是感觉不太清晰,放大看的话更是模糊,该如何是好? 以下是一些避免自拍照片模糊的方法: 1、使…

XSKY星辰天合荣获环球网“年度科技优秀创新案例”

近日,环球网主办的第四届环球趋势大会在广州举行,由环球时报、环球网联合主办的“2022 环球趋势案例征集活动”评选结果同步揭晓,XSKY星辰天合荣获 2022 环球趋势案例“年度科技创新优秀案例”。“2022 环球趋势案例”是人民日报旗下&#xf…

6个免费高清图库素材库,设计师、自媒体都在用~

免费高清图片素材分享,建议收藏起来. 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 超大图库网站,含有几百万张图片素材,自然、植物、人物、日常、交通等涵盖多种类型,全部都有详细的标签分类。图片素材质量都很高…

DOM 事件相关知识总结——事件绑定、事件流(事件冒泡、捕获)

1. 事件绑定方式 1. 直接给元素添加事件属性 <input onclick"alert(我被点击了&#xff01;)" type"button" value"点我试试" />优点&#xff1a;大家都会&#xff0c;几乎所有的浏览器都支持 缺点&#xff1a;夹杂在HTML代码中&…

79-Linux_Socket实现客户端与服务器端间通讯

Socket实现客户端与服务器端间通讯一.网络编程的接口1.socket2.bind3.listen4.accept5.connect6.close7.ssize_t recv和ssize_t send8.UDP 数据读写二.tcp流式服务和粘包问题三.客户端及服务器端实现的代码.1.客户端2.服务器端一.网络编程的接口 头文件: #include <sys/typ…

win11使用移动硬盘(固态非固态)卡顿问题解决

以前win10使用移动硬盘没用出现过卡顿的问题&#xff0c;后来更新win11后&#xff0c;硬盘在处理文件和文件新建以及编辑的时候&#xff0c;都会莫名其妙卡1-3秒左右。以为是盘坏了&#xff0c;各种检测和修复。发现没有问题 后来还找移动硬盘的商家沟通&#xff0c;也无果打算…

C语言基础应用(四)选择结构

引言&#xff1a; 在日常生活中&#xff0c;我们时时刻刻面临着选择&#xff0c;在C语言中&#xff0c;如果我们需要判断条件从而实现不同的要求&#xff0c;我们就需要使用选择结构。 注&#xff1a;以下代码均未导入头文件&#xff0c;如果读者使用了代码&#xff0c;请记得…

day9 条件变量的基本使用

目录 条件变量 条件变量 应用场景&#xff1a;生产者消费问题&#xff0c;是线程同步的一种手段&#xff1b; 必要性&#xff1a;为了实现等待某个资源&#xff0c;让线程休眠&#xff0c;提高运行效率&#xff1b; 等待资源&#xff1a; //1、一直等待资源 int pthread_c…

linux 匿名文件 memfd_create

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e;目录 前言 概述 原理 接口 代码演示 结尾 前言 本专栏主要分享linux下并发编程相关知识…

慌了!ChatGPT吃我饭,还要掀我碗?

ChatGPT面世&#xff0c;各种被AI取代“失业言论”笼罩在人们头顶&#xff0c;本文聚焦这一问题&#xff0c;推荐关注ChatGPT的小伙伴阅读。 一时间火爆全网的新晋网红——ChatGPT&#xff0c;就问&#xff1a;还有谁不认识&#xff1f; 谷歌计划在旗舰搜索引擎中添加对话式人…

TCP/UDP协议 (详解)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

网络安全之入侵检测

目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型&#xff08;Anomaly Detection&#xff09; 误用检测模型&#xff08;Misuse Detection&#xff09; 经典特征案例 ​编辑自定义签名 ​编辑 签名检查过程 检测生命周期…

提升 Prometheus 的高可用性:Thanos 的部署与实践!

背景 在高可用 prometheus&#xff1a;问题集锦文章中有简单提到 Prometheus 的高可用方案&#xff0c;尝试了联邦、Remote Write 之后&#xff0c;我们最终选择了 Thanos 作为监控配套组件&#xff0c;利用其全局视图来管理我们的多地域、300集群的监控数据。本文主要介绍 Th…

NC237662 葫芦的考验之定位子串(SAM + 后缀链接树上倍增)

题意&#xff1a; 给出一个字符串S&#xff0c;|S| ≤ 250000&#xff0c;给出 Q < 250000 次询问&#xff0c;每次需要回答 S[l, r] 在 S 中共出现了多少次。 思路&#xff1a; 如果使用 SAM&#xff0c;我们提前求出每个状态的 cnt[u]&#xff0c;询问就是要求我们快速…

Nuxt3中的中间件-middleware

参考&#xff1a;nuxt3中间件(middleware)详解 - 简书nuxt3中间件(middleware)详解 在项目中有时候需要在网站切换路由的过程中添加一些自定义的逻辑&#xff0c;比如权限什么的。这个时候可以使用nuxt的middleware。 ...https://www.jianshu.com/p/bd22637c6447 中间件的作用…