机器学习实践(1.2)XGBoost回归任务

news2024/9/28 3:28:11

前言

XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参、输入数据不变性等优势。本文只做XGBoost分类任务的脚本实现,更多XGBoost内容请查看文末 附加——深入学习XGBoost

机器学习实践(1.1)XGBoost分类任务

❤️ 本文完整脚本点此链接百度网盘链接获取 ❤️

一.轻松实现回归任务

1.1导入第三方库、数据集

"""第三方库导入"""
from xgboost import XGBRegressor
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import r2_score, mean_squared_error
import xgboost as xgb

"""波士顿房价数据集导入"""
data = datasets.load_boston()
# print(data)

"""训练集 验证集构建"""
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2,
                                                    random_state=42)

sklearn的波士顿房价数据集共506个数据样本,8:2切分后,训练集404个数据样本,验证集102个数据样本。数据集中包括 样本特征data(13个特征)、特征名称feature_names样本标签target(MEDV)、以及数据集位置filename(~~~\anaconda\lib\site-packages\sklearn\datasets\data\boston_house_prices.csv)

特征名称和标签解释如下:

- CRIM     per capita crime rate by town\n      # 按城镇划分的犯罪率  
- ZN       proportion of residential land zoned for lots over 25,000 sq.ft.\n  # 划分为25000平方英尺以上地块的住宅用地比例        
- INDUS    proportion of non-retail business acres per town\n     # 每每个城镇的非零售商业用地比例
- CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n        # 靠近查尔斯河,则为1;否则为0
- NOX      nitric oxides concentration (parts per 10 million)\n      # 一氧化氮浓度(百万分之一)
- RM       average number of rooms per dwelling\n  # 每个住宅的平均房间数      
- AGE      proportion of owner-occupied units built prior to 1940\n     # 1940年之前建造的自住单位比例  
- DIS      weighted distances to five Boston employment centres\n     # 到波士顿五个就业中心的加权距离
- RAD      index of accessibility to radial highways\n    # 辐射状公路可达性指数    
- TAX      full-value property-tax rate per $10,000\n   # 每10000美元的全额财产税税率
- PTRATIO  pupil-teacher ratio by town\n    # 按城镇划分的师生比例    
- B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\n  # 1000(Bk-0.63)^2其中Bk是按城镇划分的黑人比例       
- LSTAT    % lower status of the population\n    # 人口密度   
- MEDV     Median value of owner-occupied homes in $1000's\n # 住房屋的中值(单位:1000美元)

1.2模型训练

"""模型训练"""
model = XGBRegressor()

# model = XGBRegressor(booster='gbtree',  # gblinear
#                      n_estimators=150,  # 迭代次数
#                      learning_rate=0.01,  # 步长
#                      max_depth=10,  # 树的最大深度
#                      min_child_weight=0.5,  # 决定最小叶子节点样本权重和
#                      seed=123,  # 指定随机种子,为了复现结果
#                      )

model.fit(X_train, y_train, verbose=True)

XGBRegressor()是没有指定参数,模型使用默认参数如下。也可以指定参数例如指定booster='gbtree'等。

learning_rate: float = 1.0,
subsample: float = 0.8,
colsample_bynode: float = 0.8,
reg_lambda: float = 1e-5,
**kwargs: Any

1.3模型验证

模型效果的验证,简单直接的可以通过验证集来实现。实际项目中通常将整个数据集按照7:3:1比例划分为训练集、验证集、测试集。本例使用验证集验证模型准确性。
回归任务的评估指标只要有 r2_score 和 mse,其中 r2_score 越趋近于1越好,mse 越小越好。
R2 【注释1】 = 1 - (SSE / TSS),其中,SSE(sum of squared errors 【注释2】)是模型预测值与实际观测值之间差异的平方和,TSS(total sum of squares【注释2】)是所有观测值与其均值差异的平方和。

y_pred = model.predict(X_test)
# print(y_pred)

for m, n in zip(y_pred, y_test):
    if m / n - 1 > 0.2:
        print('预测值为{0}, 真是结果为{1}, 预测结果偏差大于20%'.format(m, n))


def metrics_sklearn(y_valid, y_pred_):
    """模型效果评估"""
    r2 = r2_score(y_valid, y_pred_)
    print('r2_score:{0}'.format(r2))

    mse = mean_squared_error(y_valid, y_pred_)
    print('mse:{0}'.format(mse))


"""模型效果评估"""
metrics_sklearn(y_test, y_pred)

结果中仅打印了预测误差在20%以上的预测数据。
在这里插入图片描述

二.模型调参

def adj_params():
    """模型调参"""
    params = {
              'booster': ['gbtree', 'gblinear'],
              # 'n_estimators': [20, 50, 100, 150, 200],
              'n_estimators': [75, 125, 200, 250, 300],
              'learning_rate': [0.01, 0.03, 0.05, 0.1],
              'max_depth': [5, 8, 10, 12]
              }

    # model_adj = XGBRegressor()

    other_params = {'subsample': 0.8, 'colsample_bytree': 0.8, 'seed': 123}
    model_adj = XGBRegressor(**other_params)

    # sklearn提供的调参工具,训练集k折交叉验证(消除数据切分产生数据分布不均匀的影响)
    optimized_param = GridSearchCV(estimator=model_adj, param_grid=params, scoring='r2', cv=5, verbose=1)
    # 模型训练
    optimized_param.fit(X_train, y_train)

    # 对应参数的k折交叉验证平均得分
    means = optimized_param.cv_results_['mean_test_score']
    params = optimized_param.cv_results_['params']
    for mean, param in zip(means, params):
        print("mean_score: %f,  params: %r" % (mean, param))
    # 最佳模型参数
    print('参数的最佳取值:{0}'.format(optimized_param.best_params_))
    # 最佳参数模型得分
    print('最佳模型得分:{0}'.format(optimized_param.best_score_))


adj_params()

2.1调参过程

第1次调参,选择'booster': ['gbtree', 'gblinear']'n_estimators': [75, 125, 200, 250, 300],params如下:

params = {
        'booster': ['gbtree', 'gblinear'],
        # 'n_estimators': [20, 50, 100, 150, 200],
        'n_estimators': [75, 125, 200, 250, 300],
        # 'learning_rate': [0.01, 0.03, 0.05, 0.1],
        # 'max_depth': [5, 8, 10, 12]
    }

other_params = {'seed': 123}

由结果可以显著判断,booster='gbtree'的结果显著高于booster='gblinear'
在这里插入图片描述
第2次调参,选择'n_estimators': [75, 125, 200, 250, 300]'learning_rate': [0.01, 0.03, 0.05, 0.1],params如下:

params = {
        # 'booster': ['gbtree', 'gblinear'],
        # 'n_estimators': [20, 50, 100, 150, 200],
        'n_estimators': [75, 125, 200, 250, 300],
        'learning_rate': [0.01, 0.03, 0.05, 0.1],
        # 'max_depth': [5, 8, 10, 12]
    }

    # model_adj = XGBRegressor()

    other_params = {'booster': 'gbtree', 'seed': 123}

由结果可以显著判断,learning_rate学习率0.01时模型效果最差,0.03~0.1之间差异不大。n_estimators迭代次数增加模型效果会明显变好。
在这里插入图片描述第3次调参,…
第4次调参,…

调参是个无穷无尽的过程,适可而止,切误沉溺其中本末倒置,真正决定模型效果上限的还是数据质量

2.2调参结果入模

model = XGBRegressor(booster='gbtree',  # gblinear
                     n_estimators=300,  # 迭代次数
                     learning_rate=0.03,  # 步长
                     # max_depth=10,  # 树的最大深度
                     # min_child_weight=0.5,  # 决定最小叶子节点样本权重和
                     seed=123,  # 指定随机种子,为了复现结果
                     )

model.fit(X_train, y_train, verbose=True)

基础模型booster='gbtree',学习率learning_rate=0.03, 迭代次数n_estimators=300 参数入模,fit()训练带参的模型,模型的参数和评估见下方(三.模型保存、加载、调用预测)

三.模型保存、加载、调用预测

"""模型保存"""
model.save_model('xgb_regressor_boston.model')

"""模型加载"""
clf = XGBRegressor()
clf.load_model('xgb_regressor_boston.model')

"""模型参数打印"""
bst = xgb.Booster(model_file='xgb_regressor_boston.model')

# print(bst.attributes())
print('模型参数值-开始'.center(20, '='))
for attr_name, attr_value in bst.attributes().items():
    # scikit_learn 的参数逐一解析
    if attr_name == 'scikit_learn':
        import json

        dict_attr = json.loads(attr_value)
        # 打印 模型 scikit_learn 参数
        for sl_name, sl_value in dict_attr.items():
            if sl_value is not None:
                print(f"{sl_name}:{sl_value}")
    else:
        print(f"{attr_name}:{attr_value}")
print('模型参数值-结束'.center(20, '='))

"""预测验证数据"""
y_pred = clf.predict(X_test)

"""模型效果评估"""
metrics_sklearn(y_test, y_pred)

模型参数打印和预测评估结果如图,不再赘述。
在这里插入图片描述


内容解释:

【注释1】R-squared(R2)分数是回归模型性能的一种常见评估指标。它测量模型对观测数据的拟合程度。该分数介于0和1之间,越接近1表示模型对数据的拟合越好。具体来说,R2分数是观测数据和回归模型之间差异的比率。这个比率由1减去误差平方和(SSE)和总偏差平方和(TSS)之比得到。

计算公式为:

R2 = 1 - (SSE / TSS)

其中,SSE(sum of squared errors)是模型预测值与实际观测值之间差异的平方和,TSS(total sum of squares)是所有观测值与其均值差异的平方和。

【注释2】SSE和TSS是回归分析中常用的两个指标,分别代表回归模型的误差平方和和总偏差平方和。
SSE(Sum of Squared Errors)是指在回归分析中,对于给定的自变量,在模型中计算出的因变量值与实际观察值之间的误差,即模型拟合的不准确程度。SSE等于所有误差的平方和,可以通过对每个数据点的误差(预测值与实际值之差)的平方求和得到。SSE越小,代表回归模型与实际观察值的拟合程度越好。
TSS(Total Sum of Squares)是指将每个数据点的实际观察值和所有观察值的平均值之差的平方求和,这个值代表了数据的总方差,即数据中每个点偏离数据的平均值的程度。TSS用于评估模型的预测能力,因为它反映了实际观察值的变化范围。TSS越小,代表数据相对于它的平均值离散程度越小。

计算公式如下:

SSE = sum((y_true - y_pred) ** 2)

TSS = sum((y_true - np.mean(y_true)) ** 2)

其中,y_true为真实观察值,y_pred为模型预测值,np.mean(y_true)为真实观察值的均值。

附加——深入学习XGBoost

附加1.模型调参、训练、保存、评估和预测

见《XGBoost模型调参、训练、评估、保存和预测》 ,包含模型脚本文件

附加2.算法原理

见《XGBoost算法原理及基础知识》 ,包括集成学习方法,XGBoost模型、目标函数、算法,公式推导等

附加3.分类任务的评估指标值详解

见《分类任务评估1——推导sklearn分类任务评估指标》,其中包含了详细的推理过程;
见《分类任务评估2——推导ROC曲线、P-R曲线和K-S曲线》,其中包含ROC曲线、P-R曲线和K-S曲线的推导与绘制;

附加4.模型中树的绘制和模型理解

见《Graphviz绘制模型树1——软件配置与XGBoost树的绘制》,包含Graphviz软件的安装和配置,以及to_graphviz()和plot_trees()两个画图函数的部分使用细节;
见《Graphviz绘制模型树2——XGBoost模型的可解释性》,从模型中的树着手解释XGBoost模型,并用EXCEL构建出模型。

❤️ 机器学习内容持续更新中… ❤️


声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,可收藏可转发但请勿转载,如有雷同纯属巧合。

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

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

相关文章

Axure教程—树

本文将教大家如何用AXURE中的动态面板制作树 一、效果 预览地址:https://1rmtjd.axshare.com 二、功能 1、点击“”,展开子节点 2、点击“-”子节点折叠 三、制作 1、父节点制作 拖入一个动态面板,进入,如图: 拖入一…

【LeetCode】HOT 100(18)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

【玩转Docker小鲸鱼叭】Docker容器常用命令大全

在 Docker 核心概念理解 一文中,我们知道 Docker容器 其实就是一个轻量级的沙盒,应用运行在不同的容器中从而实现隔离效果。容器的创建和运行是以镜像为基础的,容器可以被创建、销毁、启动和停止等。本文将介绍下容器的这些常用操作命令。 1、…

max^2 - min^2

2001^2- 2000^2 ???? max^2 - min^2min * (max - min) min * (max - min) (max - min)* (max - min) min * (max - min) * 2 (max - min)* (max - min) (max min)(max - min)

管理类联考——逻辑——技巧篇——形式逻辑——秒杀思路

第一章:说明 形式逻辑出现频次 8-10 道 形式逻辑细分思路 直言命题三段论与文氏图AEIO 与模态命题形式逻辑复合命题固定秒杀思路 说明1: AEIO 全称肯定命题:所有 S 都是 P,记作 SAP。 简称为“A” 全称否定命题:所…

TCL、海信、小米密集推新,Mini LED电视熬出头了

作者 | 辰纹 来源 | 洞见新研社 OLED和Mini LED之间的对决来到了赛点。 进入2023年,一线电视厂商发布的新品中,Mini LED成为主流。 3月2日,索尼全球发布了其2023年BRAVIA XR 电视新品阵容。其中,索尼Mini LED电视X95L采用Mini …

MFC学习之修改设置控件字体显示和颜色参数

前言 最近一直配合研发部门写一些调试类的小软件,记得之前电脑显示器和显卡配置都不高,显示分辨率比较低,软件界面上的文字还能看到清楚(不显小)。 现在公司新配置的电脑都比较好了,界面字体,尤…

【高性能计算】监督学习之支持向量机分类实验

【高性能计算】监督学习之支持向量机分类实验 实验目的实验内容实验步骤1、支持向量机算法1.1 支持向量机算法的基本思想1.2 支持向量机算法的分类过程1.3 支持向量机算法的模型构建过程 2、使用Python语言编写支持向量机的源程序代码并分析其分类原理2.1 支持向量机SVM模型代码…

四、卷积神经网络整体基础结构

一、计算机发展应用 神经网络主要用于特征提取 卷积神经网络主要应用在图像领域,解决传统神经网络出现的过拟合、权重太多等风险 1,CV领域的发展 Computer vision计算机视觉的发展在2012年出现的AlexNet开始之后得到了挽救 之前都是一些传统的机器学习…

SQL高级语句2

SQL高级语句2 SQL高级语句17.---- 连接查询 ----18.自我连接,算排名:19.---- CREATE VIEW ----视图,可以被当作是虚拟表或存储查询。20.---- UNION ----联集,将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要…

重新定义DevOps:容器化的变革力量

在快速发展的数字时代,DevOps 已成为重塑软件开发格局的重要范例。DevOps 是一个源自“开发”和“运营”的术语,它将这两个历史上孤立的功能集成到一个统一的方法中,专注于缩短软件开发生命周期。因此,DevOps 实践促进了更快、更可…

【产品应用】一体化电机在拉伸吹瓶机的应用

随着塑料瓶的广泛应用,拉伸吹瓶机作为生产塑料瓶的关键设备之一,受到了越来越多企业的关注。而在拉伸吹瓶机中,一体化电机的应用正逐渐成为行业的新趋势。 01.设备简介 吹瓶机是一种用于制造塑料瓶的机械设备。它通过将预先加热的塑料颗粒或…

当 MQTT 遇上 ChatGPT:探索可自然交互的物联网智能应用

前言 随着物联网技术的迅猛发展,人与设备、设备与设备之间的互动已变得不再困难,而如何更加自然、高效、智能地实现交互则成为物联网领域新的挑战。 近期,由 OpenAI 发布的 ChatGPT、GPT-3.5 和 GPT-4 等先进大语言模型(LLM&…

python 基础知识:使用jieba库对文本进行分词

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、jieba库是什么? Python的jieba库是一个中文分词工具,它可以将一段中文文本分割成一个一个的词语,方便后续的自然语言处理任务,如文本分类、情感分析等。 jieba库使用…

Riddztecia 作品集 |Beast Wear 出品

Beast & Wear:一个以彩色部落和可训练野兽庆祝多样性的收藏品。通过 NFT 野兽和装备提升你的 Riddzee 人物化身,增强视觉效果,提升你在迷人的 Riddztecia 世界中的游戏体验。去游戏、去成长、去探索。 Riddztecia NFT 空投包括训练怪兽和…

leetcode216. 组合总和 III(回溯算法-java)

组合总和 III leetcode216. 组合总和 III题目描述解题思路代码演示 回溯算法专题 leetcode216. 组合总和 III 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/combination-sum-iii 题目描述 找出所有相加之和为 n 的 k 个…

JMeter 批量接口测试

一、背景 最近在进行某中台的接口测试准备,发现接口数量非常多,有6、70个,而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后,决定尝试使用JMeter的csv读取来实现批量的接口…

Linux修改权限chown和chmod指令

一、 chmod指令修改文件权限 -rw-rw-r-- 1 zcb zcb 1135 Jun 9 14:56 test.c drwx------ 2 root root 4096 Apr 7 16:50 testemmc/ 上面两个文件,第一个字符-和d,分别表示二进制文件,目录,后面9个分别表示 u:拥有者…

【CV 向】了解 OpenCV 中的算术与位运算

文章目录 引言1. 利用 NumPy 创建图像2. 算术运算2.1 加法与减法2.2 乘法与除法 3. 位运算3.1 与运算3.2 或运算3.3 异或运算3.4 非运算 结论 引言 Python OpenCV 是一个功能强大的计算机视觉库,用于图像处理和计算机视觉任务。在 OpenCV 中,我们可以使…

【Python脚本】Python自动大麦网抢票,准点原价秒杀演唱会门票,拒绝黄牛交易!从我做起!!!1

文章目录 前言一、分析购票过程二、Selenium 模拟浏览器操作三、逆向工程:抢票接口总结 前言 你是否错过了周杰伦的票,最近又没抢到五月天的票,不要太难过,今晚有张学友的票,后天还有张杰的票,加油哦&…