数据清洗-缺失值填充-对XGBoost参数优化填充

news2024/12/24 22:11:09

目录

  • 一、安装所需的python包
  • 二、采用XGboost算法进行缺失值填充
    • 2.1可直接运行代码
    • 2.2以某个缺失值数据进行实战
      • 2.2.1 代码运行过程截屏:
      • 2.2.2 填充后的数据截屏:
  • 三、网格搜索(Grid Search)对 XGBoost 模型的超参数进行优化原理介绍
    • 3.1 说明
    • 3.2 参数优化的原理
      • 1. 网格搜索(Grid Search)
      • 2. 交叉验证(Cross-Validation)
      • 3. XGBoost 模型的超参数
      • 4. 预测缺失值
    • 3.3 整体优化效果
    • 3.4 输出与保存
  • 四、XGBoost算法原理介绍
    • 4.1 XGBoost 的定义
    • 4.2 XGBoost 的核心思想
    • 4.3 XGBoost 的特点
    • 4.4 XGBoost 的工作原理
    • 4.5 XGBoost 的损失函数
    • 4.6XGBoost 的参数
    • 4.7 XGBoost 的应用场景
    • 4.8XGBoost 的优缺点
      • 4.8.1 优点
      • 4.8.2 缺点

感觉大家对原理性的东西不太感兴趣,那我就直接举例提供代码,以及详细的注释,大家自己对照改代码应用于你自己建立的模型吧。

这些代码全部是我自己做数模竞赛时候自己用的代码。可以直接运行,记得修改文件路径。

一、安装所需的python包

pip install pandas
pip install numpy
pip install scikit-learn
pip install xgboost

二、采用XGboost算法进行缺失值填充

注意代码需要把自己的数据文件格式转换为CSV文件,并且把路径修改为自己文件所在的路径,不会转换的参考我此教程文件格式转换:EXCEL和CSV文件格式互相转换。

我知道大家对原理性的东西不感兴趣,我把他的原理介绍放在文末,需要写论文的同学自己拿去用,记得修改,否则查重率过不去。

2.1可直接运行代码

"""
XGBoost算法填补缺失值,这个精度比随机森林高,对XGboost的参数进行优化以后的代码
基本上在缺失值附近的数据旁边了
填充的效果还行,可以!
"""


import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import joblib

# 读取数据,请将'缺失值填充.csv'替换为你的真实数据文件名
filename = '缺失值填充.csv'
data = pd.read_csv(filename, encoding='gbk')

# 分离出有缺失值的列
missing_columns = data.columns[data.isnull().any()]

# 定义要进行网格搜索的超参数范围
parameters = {
    'n_estimators': [50, 100, 200, 300],  # 树的数量
    'learning_rate': [0.01, 0.05, 0.1, 0.2],  # 学习率
    'max_depth': [3, 5, 8, 10],  # 构建树的深度,越大可能模型会更复杂/过拟合
}

# 对每一列进行迭代插补
for column in missing_columns:
    # 提取出非缺失值的数据
    train_data = data[data[column].notnull()]
    test_data = data[data[column].isnull()]

    y = train_data[column]
    X = train_data.drop(columns=[column])
    X_test = test_data.drop(columns=[column])

    # 利用XGBRegressor拟合数据
    model = XGBRegressor()
    grid_search = GridSearchCV(estimator=model, param_grid=parameters, scoring='neg_mean_squared_error', cv=5)
    grid_search.fit(X, y)
    model = grid_search.best_estimator_

    # 利用模型预测缺失值
    imputed_values = model.predict(X_test)

    # 用估计的值填充缺失值
    data.loc[data[column].isnull(), column] = imputed_values

    # 输出最优参数和最优分数
    print(f'Best parameters for column {column}: {grid_search.best_params_}')
    print(f'Best score for column {column}: {grid_search.best_score_}')

    # 保存模型
    joblib.dump(model, f'{column}_best_model.joblib')

# 输出处理后的数据
print(data)

#保存数据
data.to_csv('XGBoost参数优化填充.csv', index=False)

注意:filename = '缺失值填充.csv'里面的缺失值填充.csv是你自己的缺失值的csv文件路径,data.to_csv('XGBoost参数优化填充.csv', index=False)中的XGBoost参数优化填充.csv是你填充后的文件名,你可以自己起名。
注意:你也可以自定义网格的超参数范围。

2.2以某个缺失值数据进行实战

注意:数据量较少,由自己构建,均有规律,
如下图:
在这里插入图片描述

构造缺失值,如下图:
在这里插入图片描述

运行代码查看填充后的数据怎么样,
运行代码如下图+填充后的截图:

2.2.1 代码运行过程截屏:

在这里插入图片描述

2.2.2 填充后的数据截屏:

在这里插入图片描述

说明:数据量过小,填充效果不明显,但是你在进行数模比赛时候,需要说明为什么你要选用该算法填充,说明他的原理即可,不必纠结填充的数据是否正确,因为你本身也不知道数据的正确性。并且数模如国赛的C题,数据量往往都很大,以及MathorCup的大数据竞赛等等,所以效果仁者见仁吧。

接下来我将继续分享其他我参加数模时候常用的几种数据填充的代码,都是我自己调试跑通过的,大家直接复制粘贴使用。

三、网格搜索(Grid Search)对 XGBoost 模型的超参数进行优化原理介绍

3.1 说明

该代码使用 XGBoost 算法来填补数据中的缺失值,并通过网格搜索(Grid Search)对 XGBoost 模型的超参数进行优化,以提高预测精度。具体步骤如下:

  1. 读取数据:从指定的 CSV 文件中读取数据,并查找所有包含缺失值的列。
  2. 参数优化设置:定义一组超参数的可能取值范围,供后续的网格搜索使用。这些超参数包括:
    • n_estimators:树的数量(即弱学习器的数量)。
    • learning_rate:学习率,控制每次更新的步长大小。
    • max_depth:树的最大深度,控制模型的复杂度。
  3. 逐列填补缺失值:对每一列存在缺失值的数据,使用 XGBoost 进行预测和填补:
    • 分离出该列的训练数据(非缺失值)和测试数据(缺失值部分)。
    • 使用网格搜索和交叉验证(Cross-Validation)来选择最佳的模型参数组合。
    • 用训练好的 XGBoost 模型预测缺失值并进行填补。
  4. 保存最优模型:将每一列的最佳模型保存到文件中,以备将来使用。
  5. 保存处理后的数据:将填补后的数据保存为新的 CSV 文件。

3.2 参数优化的原理

1. 网格搜索(Grid Search)

网格搜索是对一组给定的超参数进行系统地遍历,找到一组使模型在验证集上表现最优的参数组合。具体来说,代码中使用 GridSearchCV 函数来实现网格搜索:

  • estimator:指定使用的基础模型,这里是 XGBRegressor
  • param_grid:定义参数的取值范围。代码中定义了 3 个参数:
    • n_estimators:从 [50, 100, 200, 300] 中选择最佳的树数量。
    • learning_rate:从 [0.01, 0.05, 0.1, 0.2] 中选择最佳的学习率。
    • max_depth:从 [3, 5, 8, 10] 中选择最佳的树深度。
  • scoring:指定使用的评分标准,这里是负均方误差(neg_mean_squared_error),目的是最小化均方误差。
  • cv:设置交叉验证的折数,这里为 5,表示使用 5 折交叉验证。

2. 交叉验证(Cross-Validation)

交叉验证用于评估模型的泛化能力。通过将数据集分为若干个互斥的子集,迭代地训练和验证模型,可以有效防止过拟合。代码中使用 5 折交叉验证,这意味着将数据集分为 5 份,每次使用其中 4 份训练模型,剩下 1 份用于验证。

3. XGBoost 模型的超参数

  • n_estimators(树的数量):控制模型的复杂度。过多的树可能导致过拟合,而树的数量太少可能导致欠拟合。
  • learning_rate(学习率):控制每次更新的步长。较低的学习率通常需要更多的树来达到最佳性能,但能防止模型过拟合。
  • max_depth(最大深度):控制单棵树的深度,越大可能导致模型更复杂(过拟合),越小则可能欠拟合。

4. 预测缺失值

在找到最佳的参数组合后,使用训练好的 XGBoost 模型预测测试数据中的缺失值。模型使用已知数据学习缺失值的模式,然后对未知部分进行填充。

3.3 整体优化效果

通过网格搜索和交叉验证,代码能够找到适合填补每一列缺失值的最佳 XGBoost 模型参数,从而最大化模型的预测准确性。通常相较于未优化的XGBoost填补效果相对较好,因为它利用了大量数据的局部信息,并优化了模型的复杂度和泛化能力。

3.4 输出与保存

  • 最优参数和分数:对于每一列,输出最优参数组合和最佳得分。
  • 保存模型:将每一列的最佳模型保存为 .joblib 文件,以便将来复用。
  • 保存数据:填补后的完整数据保存为新的 CSV 文件 XGBoost参数优化填充.csv

每一列的最佳模型保存结果如下图:

在这里插入图片描述

四、XGBoost算法原理介绍

4.1 XGBoost 的定义

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升的机器学习算法,由 Tianqi Chen 在 2016 年提出。相比其他梯度提升算法,XGBoost 在速度和性能上有显著的提升。XGBoost 是一种集成学习方法,通过组合多个弱学习器(通常是决策树)来构建一个强大的预测模型。

4.2 XGBoost 的核心思想

XGBoost 属于 梯度提升树(Gradient Boosting Decision Trees, GBDT) 的一种扩展和优化。GBDT 的基本思想是将多个弱学习器(通常是决策树)逐步叠加,通过最小化损失函数来提高模型的准确性。XGBoost 在此基础上进行了多种优化和增强,使得算法在计算速度、内存效率和准确性上都有显著提升。

4.3 XGBoost 的特点

  1. 正则化处理:XGBoost 引入了正则化项(L1 和 L2 正则化),可以有效防止过拟合。
  2. 并行计算:XGBoost 支持并行化的树构建过程,利用多核 CPU 加速计算。
  3. 分块结构:采用分块结构处理数据,可以高效利用内存,适合处理大规模数据集。
  4. 缺失值处理:XGBoost 可以自动处理数据中的缺失值,在训练过程中找到最优化的分裂方向。
  5. 自定义损失函数:支持多种损失函数(如平方误差、逻辑回归损失)以及用户自定义损失函数。
  6. 树剪枝(Pruning):采用后向贪心算法进行树剪枝,减少不必要的复杂度。
  7. 内置交叉验证:内置了交叉验证方法,可以自动在训练过程中找到最佳的模型参数。

4.4 XGBoost 的工作原理

  1. 初始化模型:首先用一个常数值(如训练数据的平均值)初始化模型。
  2. 迭代训练:在每一轮迭代中:
    • 计算模型的残差(即当前模型的预测值与实际值之间的差距)。
    • 使用残差训练一个新的弱学习器(通常是决策树),使其能够拟合这些残差。
    • 将新的弱学习器加到现有模型中,更新模型的预测结果。
    • 重复上述步骤,直到达到预设的弱学习器数量或其他停止条件。
  3. 组合模型:将所有弱学习器的结果加权求和,得到最终的预测模型。

4.5 XGBoost 的损失函数

XGBoost 可以使用多种损失函数,例如:

  • 均方误差(MSE):用于回归问题。
  • 对数损失(Log Loss):用于分类问题。
  • 自定义损失函数:用户可以根据特定需求定义自己的损失函数。

4.6XGBoost 的参数

XGBoost 有许多参数可以调整,主要分为以下几类:

  1. 通用参数:控制 XGBoost 的通用功能,如 booster(指定使用哪种基学习器),nthread(用于控制并行线程数量)等。
  2. Booster 参数:控制单个 Booster(基学习器)的行为,如 eta(学习率),max_depth(树的最大深度),subsample(子样本比例)等。
  3. 任务参数:控制 XGBoost 如何执行特定的学习任务,如 objective(指定学习任务和相应的损失函数),eval_metric(指定评价指标)等。

4.7 XGBoost 的应用场景

XGBoost 广泛应用于以下领域:

  • 回归分析:预测数值型目标变量。
  • 分类问题:预测类别型目标变量(如二分类和多分类)。
  • 排序问题:如在信息检索中的排序任务。
  • 时间序列预测:预测时间序列中的未来值。

4.8XGBoost 的优缺点

4.8.1 优点

  • 高效:计算速度快,内存占用少。
  • 灵活:支持多种数据类型和损失函数。
  • 准确:正则化处理和防止过拟合的特性使得模型的表现更加稳健。
  • 可解释性:生成的树模型可以直观理解和解释。

4.8.2 缺点

  • 参数调优复杂:需要较多的参数调整来实现最佳性能。
  • 对小数据集不适用:在数据量较小的情况下,无法显著优于简单模型。
  • 对异常值敏感:异常值可能会对模型性能产生较大影响,需要进行预处理。

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

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

相关文章

Windows 上下载、编译 OpenCV 并配置系统环境变量的详细步骤

创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力! 在 Windows 上下载并编译 OpenCV,然后配置系统环境变量的步骤如下: 1. 下载 OpenCV 打开 OpenCV 官方下载页面。找到最新的 Windows 版本,点击下载&…

初中生物--4.生物体的结构层次(二)

一、植物体的结构层次 1.绿色开花植物的六大器官 根、茎、叶、花、种子、果实 2.植物的组织 3.植物体的生长 植物体的生长是细胞分裂、生长和分化的综合结果。在植物体的生长过程中,细胞不断分裂产生新的细胞,新细胞不断生长使细胞体积增大&#xff…

数据结构 - 队列

一.队列的定义 1.队列的分类 队列根据存储结构可以分为 顺序队列 和 链式队列 2.队列的结构 ①.顺序队列 顺序队列的 front 指向队首元素的前一个下标 ②.链式队列 二.顺序队列的基本运算 0.顺序队列的结构体定义 typedef int data_t;typedef struct {data_t *data; …

stable diffusion 反推提示词插件 tagger 的安装,很详细

stable diffusion 反推提示词插件 tagger 的安装,很详细 一、前言二、下载1、方式一2、方式二 一、前言 最近想下载 stable diffusion 反推提示词插件 tagger ,也是好一番折腾,这里做个记录。 在安装之前确保能正常访问 github &#xff0c…

图像增强技术分析

图像增强是一种图像处理技术,旨在改善图像的视觉质量,使其更适合显示或进一步分析。这种技术可以应用于多种场景,包括医学成像、卫星图像、视频处理以及文本到图像生成模型等领域。图像增强的目标通常是提高图像的某些视觉特征,如…

[内网渗透]---msf基础-永恒之蓝-ms17-010

what Metasploit(通常简称为MSF)是一个开源的渗透测试框架,包含大量的已知漏洞利用模块,可以用来攻击目标系统并获取控制权。 how 实验环境:Kali、带有永恒之蓝漏洞的虚拟机且开启445端口(两个虚拟机同一子网) 1.信…

FPGA-Vivado-IP核-虚拟输入输出(VIO)

VIO IP核 背景介绍 Vivado中的VIO(Virtual Input/Output,虚拟输入/输出) IP核是一种用于调试和测试FPGA设计的IP核。当设计者通过JTAG接口与FPGA芯片连接时,在Vivado的Verilog代码中添加VIO IP核,就可以让设计者与FPG…

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”,我们叫它互联网,而这条公路上的车辆,则是数据包。你可以把 TCP(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…

08_Python数据类型_字典

Python的基础数据类型 数值类型:整数、浮点数、复数、布尔字符串容器类型:列表、元祖、字典、集合 字典 字典(Dictionary)是一种可变容器模型,它可以存储任意类型对象,其中每个对象都存储为一个键值对。…

3.4.3 __ipipe_init_early之初始化root domain

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.4.3 __ipipe_init_early之初始化root domain 如下图所示,红框里面的函数当前都是空的,本章还是分析蓝框中的代码片段。 第295行,变量ipd指向了ipipe_root即ipd代表root doma…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则

文章目录 垃圾回收机制堆空间的基本结构内存分配和回收规则对象优先在 Eden 区分配分配担保机制 大对象直接进入老年代长期存活的对象进入老年代主要进行 GC 的区域部分收集 (Partial GC):Minor GCMajor/Old GCMixed GC 整堆收集(Full GC) 空…

K-means 算法的介绍与应用

目录 引言 K-means 算法的基本原理 表格总结:K-means 算法的主要步骤 K-means 算法的 MATLAB 实现 优化方法与改进 K-means 算法的应用领域 表格总结:K-means 算法的主要应用领域 结论 引言 K-means 算法是一种经典的基于距离的聚类算法&#xff…

中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测

中秋献礼!2024年中科院一区极光优化算法分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测 目录 中秋献礼!2024年中科院一区极光优化算法分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测效果一览基本介…

人工智能和大模型的简介

文章目录 前言一、大模型简介二、大模型主要功能1、自然语言理解和生成2、文本总结和翻译3、文本分类和信息检索4、多模态处理三、大模型的技术特性1、深度学习架构2、大规模预训练3、自适应能力前言 随着技术的进步,人工智能(Artificial Intelligence, AI)和机器学习(Mac…

TryHackMe 第1天 | Introduction to Cyber Security

偶然之间了解到了TryHackMe这个网站,尝试跟着其中的学习路径进行学习,发现还是挺适合入门网络安全这一领域的。但是这个网站包含了很多内容,如果不用一些东西记录下来,那么很容易忘记,所以打算在此记录一下学习过程。 …

Linux——应用层自定义协议与序列化

目录 一应用层 1再谈 "协议" 2序列化与反序列化 3理解read,write,recv,send 4Udp vs Tcp 二网络版本计算器 三手写序列和反序列化 四进程间关系与守护进程 1进程组 1.1什么是进程组 1.2组长进程 2会话 2.1什么是会话 2.2会话下的前后台进程 3作业控…

nginx实现权重机制(nginx基础配置二)

在上一篇文章中我们已经完成了对轮询机制的测试,详情请看轮询机制。 接下来我们进行权重机制的测试 一、conf配置 upstream backServer{ server 127.0.0.1:8080 weight2; server 127.0.0.1:8081 weight1; } server { listen 80; server_name upstream.boyatop.cn…

一个有趣的“苦无”测试探针笔的设计

设计思路来源 动漫火影中的苦无,在测试过程中多种测试点方便测试,不想每次去找合适的测试工具,例如点测试和连接线测试需要用到不同的接触工具。 PCB设计 这这些焊点都是短接的(除了中间的固定孔),直接使…

Leetcode 验证回文串

使用双指针技术,逐步比较字符串中的字符,并忽略非字母数字字符以及大小写,判断该字符串是否为回文。以下是详细解释: 1. 核心思想: 回文串是指正读和反读都相同的字符串。我们需要从字符串的两端开始比较字符&#x…

Python画笔案例-051 绘制赵爽弦图

1、绘制赵爽弦图 通过 python 的turtle 库绘制 赵爽弦图,如下图: 2、实现代码 绘制 赵爽弦图,以下为实现代码: """赵爽弦图.py本程序演录了如何自定义形状,如何把它添加到造型字典。赵爽弦图是用来证明…