机器学习 | 使用CatBoost处理缺失值

数据是任何分析或机器学习的基础。然而,现实世界的数据集并不完美,它们经常包含缺失值,这可能导致任何算法的训练阶段出现错误。处理缺失值至关重要,因为它们可能会导致数据分析和机器学习模型中出现偏差或不准确的结果。处理缺失值的策略包括插补(用估计值或计算值替换缺失值)、删除不完整的记录或使用多重插补等高级技术。处理缺失值是数据清理和准备的一个重要方面,以确保强大和可靠的分析。在本文中,我们将讨论如何使用CatBoost模型处理缺失值。

什么是CatBoost

CatBoost(categorical boosting)是由俄罗斯跨国IT公司Yandex开发的机器学习算法。这种特殊的boosting算法基于梯度提升框架,通过结合有序提升,不经意树和分类变量的高级处理等技术,可以比其他传统的梯度提升算法更有效地处理分类特征,从而以最小的超参数调整实现高性能。CatBoost还有一个内置的超参数(nan_mode)来处理数据集中存在的缺失值,这有助于我们非常有效地处理数据集,而无需执行其他数据预处理。

什么是缺失值?

缺失值是指数据集中某些观测或变量的数据缺失。这些缺失值的出现可能有各种原因,从数据收集过程中的错误到故意遗漏。我们需要非常小心地处理它们,以实现准确的预测模型。常见的缺失值在数据集中以两种方式表示,下面将进行讨论:

  • NaN(Not a Number):在数值数据集中,NaN通常用于表示缺失或未定义的值。NaN是IEEE标准定义的特殊浮点值,通常用于Python等编程语言和NumPy等库。

  • NULL或NA:在数据库系统或统计软件中,NULL或NA可用于表示缺失值。这些只是占位符,表示特定观察数据的缺失。

使用CatBoost处理缺失值

1.导入所需的库

现在我们将导入所有需要的Python库,如NumPy,Pandas,Matplotlib,Seaborn和SKlearn等。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from catboost import CatBoostRegressor, Pool
from sklearn.metrics import mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split

2.数据集加载

现在我们从Kaggle加载一个数据集。然后,我们将其分为训练集和测试集(80:20),并准备分类特征,这些特征将在训练期间提供给CatBoost。

# Load the Kaggle House Prices dataset
data = pd.read_csv('train.csv') # https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data?select=train.csv
# Choose features and target variable
features = data.columns.difference(['SalePrice']) # All columns except 'SalePrice'
target = 'SalePrice'# Convert categorical features to strings
categorical_features = data[features].select_dtypes(include=['object']).columns
for feature in categorical_features:data[feature] = data[feature].astype(str)# Split data into features and target
X = data[features]
y = data[target]
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Find categorical features for CatBoost
categorical_features_indices = np.where(X.dtypes == 'object')[0]

Kaggle House Prices数据集已加载并准备好使用这行代码建模。在将分类特征转换为字符串之后,数据被划分为特征(X)和目标变量(y)。使用80-20的比率将数据集进一步划分为训练集和测试集。对于需要在训练过程中描述分类特征的CatBoost模型,变量categorical_features_indices非常有用,因为它指定了分类特征的索引。

探索性数据分析

探索性数据分析(EDA)可以帮助我们更深入地了解数据集。

检查缺失值

这与本文非常相关,对任何数据集都很重要。如果处理不当,缺失值会影响模型的预测。在这里,我们将看到数据集的哪些列包含缺失值和总计数。

# Check for missing values
missing_values = data.isnull().sum().sort_values(ascending=False)
missing_values = missing_values[missing_values > 0]
print("\nColumns with missing values:\n", missing_values)

输出

Columns with missing values:PoolQC              1453
MiscFeature     1406
Alley                  1369
Fence                1179
FireplaceQu     690
LotFrontage      259
GarageYrBlt       81
GarageCond     81
GarageType      81
GarageFinish    81
GarageQual      81
BsmtFinType2    38
BsmtExposure   38
BsmtQual           37
BsmtCond          37
BsmtFinType1     37
MasVnrArea        8
MasVnrType         8
Electrical              1
dtype: int64

这段代码计算每一列的空值之和,以检查“data”DataFrame中的缺失值。然后打印列及其相应的计数,但仅针对缺失值大于零的列。这是通过根据缺失值的数量以降序对列进行排序来实现的。

目标变量分布

可视化目标变量的值分布有助于我们了解数据集是否存在任何潜在的错误。在我们的数据集中,目标变量是’SalePrice’。

plt.figure(figsize=(7, 4))
sns.histplot(data['SalePrice'], kde=True, color='forestgreen')
plt.title('Distribution of SalePrice')
plt.show()

在这里插入图片描述
使用Seaborn,此代码生成一个直方图,显示’data’ DataFrame中’SalePrice’变量的分布。当添加kde=True参数时,直方图获得数据分布的平滑描述,从而添加核密度估计图。

模型训练

# Create CatBoost pools for training and testing
train_pool = Pool(data=X_train, label=y_train, cat_features=categorical_features_indices)
test_pool = Pool(data=X_test, label=y_test, cat_features=categorical_features_indices)# Train the CatBoost model
model = CatBoostRegressor(iterations=100, depth=6, learning_rate=0.1, loss_function='RMSE', nan_mode='Min', verbose=False)
model.fit(train_pool)

为了训练CatBoost模型,我们需要为CatBoost创建训练和测试集,因为它的内部训练优化需要特殊类型的数据集类型,不同于普通的NumPy或pandas数据帧。之后,我们需要指定各种超参数来训练CatBoost模型。在这里,我们还将使用内置的catboost超参数处理缺失值。

  • iterations:该参数设置boosting迭代的总数,即集合中的树的数量。这里我们将它设置为100,这意味着训练过程将创建100个决策树(迭代)。
  • learning_rate:该参数确定梯度提升算法学习的步长,该算法将每个树对最终预测的贡献进行缩放。较小的学习率通常会导致更强大的模型,但需要更多的迭代。
  • depth:这个参数控制决策树的最大深度。更深的树可以捕获更复杂的模式,但它可能会导致过拟合问题。
  • verbose:此参数控制训练期间显示的日志记录和信息的级别,这对于监控训练过程很有用。这里我们将其设置为“False”以保持控制台清晰。
  • loss_function:该参数指定用于在训练期间优化模型的损失函数。它被设置为“RMSE”,因为我们正在执行回归任务。
  • cat_features:分类特征的索引数组。CatBoost会自动对这些特征进行编码以进行训练,并以不同的方式处理它们。
  • nan_mode:这是CatBoost的特殊超参数,用于在模型训练期间内部处理数据集的缺失值。这个超参数有三个值,分别是“Forbidden”、“Min”和“Max”。默认情况下,它接受’Forbidden’并在训练期间引发错误。如果我们将其设置为’Min’,那么它将用相应列的最小值替换所有缺失值。如果我们将其设置为’Max’,那么它将用相应列的最大值替换缺失值。在这里,我们将其设置为“Min”。

模型评估

现在,我们将根据MAE和R2得分来评估我们的模型,这是最常见的回归模型指标。

# Make predictions on the test set
y_pred = model.predict(test_pool)
# Evaluate the model
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f'Mean Absolute Error (MAE): {mae:.2f}')
print(f'R2 Score: {r2:.4f}')

输出

Mean Absolute Error (MAE): 17666.19
R2 Score: 0.9000

此代码使用预先训练的模型(model)对测试集进行预测。然后使用平均绝对误差(MAE)和R平方(R2)分数评估模型对测试数据的性能,这些分数提供了关于模型拟合优度和准确性的信息。

总结

我们可以得出结论,缺失值在现实世界的数据集中非常常见,但我们需要有效地处理它们,因为它们会降低模型的性能。CatBoost有其内置机制来处理训练过程中数据集中的缺失值。我们的模型达到了90%的显著R2分数,这表明缺失值得到了有效处理。但是,我们还可以执行超参数调优以获得更准确的结果。

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

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

相关文章

每日五道java面试题之springMVC篇(一)

目录: 第一题. 什么是Spring MVC?简单介绍下你对Spring MVC的理解?第二题. Spring MVC的优点第三题. Spring MVC的主要组件?第四题. 什么是DispatcherServlet?第五题. 什么是Spring MVC框架的控制器? 第一题. 什么是S…

子查询与连表查询

子查询与连表查询 标签:数据库 子查询 mysql> explain select e.empno,e.ename,(select dname from dept d where e.deptno d.deptno) as dname from emp e where e.deptno 1; -------------------------------------------------------------------------------------…

Manz高压清洗机S11-028GCH-High Quality Cleaner 操作使用说明492页

Manz高压清洗机S11-028GCH-High Quality Cleaner 操作使用说明492页

智能部署之巅:Amazon SageMaker 引领机器学习革新

本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 (全球 TMT 2023年12月6日讯)亚马逊云科技在 2023 re:Invent 全…

2024 GoLand激活,分享几个GoLand激活的方案

文章目录 GoLand公司简介我这边使用GoLand的理由GoLand 最新变化GoLand 2023.3 最新变化AI Assistant 正式版GoLand 中的 AI Assistant:_Rename_(重命名)GoLand 中的 AI Assistant:_Write documentation_(编写文档&…

Linux编程3.5 进程-进程创建

1、相关函数 #include<unistd.h> #include<sys/types.h> pid_t fork(void); 返回&#xff1a;子进程中为0&#xff0c;父进程中为子进程ID&#xff0c;出错为-1pid_t vfork(void); 返回&#xff1a;子进程中为0&#xff0c;父进程中为子进程ID&#xff0c;出…

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理一、Unity中 屏蔽透明区域的点击事件1.1 使用Image组件自带的参数检测1.2 根据点击的坐标计算该点的像素值是否满足阈值 二、Unity中屏蔽 不规则图片按钮点击的事件 总结 &#x1f3ac; 博客主页&#xff1a;htt…

遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析(代码完…

Qt 类的前置声明和头文件包含

1. 在头文件中引入另一个类经常有两种写法 1&#xff09;前置声明 2&#xff09;头文件包含 #ifndef FRMCOUPLE2_H #define FRMCOUPLE2_H#include <QWidget> //头文件包含namespace Ui { class frmcouple2; }//前置声明&#xff1a;QPushButton frmchkeyboard…

moi3D安装

下载文件双击文件 下一步 同意下一步 下一步 下一步 下一步 安装下一步 完成 破解 将如图中的文件复制到文件目录下 汉化 在目录中进入ui文件夹下 在安装包中找到如下的文件复制到ui目录下 在打开 另存为 另存为时改一下编码格式如图 打开软件 找到如图options进入…

图像分类技术在城市垃圾分类与处理中的应用与实践

一、引言 在当今世界&#xff0c;城市化进程不断加快&#xff0c;随之而来的是日益增长的垃圾处理压力。城市生活垃圾、工业固体废物和危险废物的处理已经成为环境保护领域的一大挑战。为了应对这一挑战&#xff0c;卫生填埋、垃圾堆肥和垃圾焚烧等技术路线应运而生。其中&…

Cloud-Eureka服务治理-Ribbon负载均衡

构建Cloud父工程 父工程只做依赖版本管理 不引入依赖 pom.xml <packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEA…

【系统学习】2-Java进阶知识总结-3-集合-1-补充【泛型、树、数据结构】

文章目录 泛型什么是泛型&#xff1f;常见的泛型标识符泛型类泛型方法泛型接口通配符 树树的基本概念什么是二叉树&#xff1f;二叉树--普通二叉树二叉树--二叉查找树定义规则优缺点 二叉树--平衡二叉树定义规则旋转机制 二叉树--红黑树定义规则红黑规则 常见数据结构总体特点结…

【自然语言处理】NLP入门(五):1、正则表达式与Python中的实现(5):字符串常用方法:对齐方式、大小写转换详解

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出4.字符转义符5. 字符串常用函数函数与方法之比较 6. 字符串常用方法1. 对齐方式center()ljust()rjust() 2. 大小写转换lower()upper()capitalize()title()swapcase() 一、前言 本…

在Jetson Xavier NX 开发板上使用VScode执行ROS程序详细过程

1.创建 ROS 工作空间ws 在home下打开终端输入下面指令 mkdir -p xxx_ws/src(必须得有 src) cd 自己命名_ws catkin_make2.启动 vscode cd 自己命名_ws code .3.vscode 中编译 ros 快捷键 ctrl shift B 调用编译&#xff0c;在上方弹窗位置选择:catkin_make:build 可以点击…

jenkins配置

jenkins前端常用插件&#xff1a; Git Parameter 、Maven Integration 、Proxmox&#xff08;snapshot&#xff09;、Pipeline: Multibranch&#xff08;多分支流水线&#xff09;、Pipeline: Stage Step、pipeline Git plugin、NodeJS Plugin、Publish Over SSH、SSH server…

python界面开发 - Menu (popupmenu) 右键菜单

文章目录 1. python图形界面开发1.1. Python图形界面开发——Tkinter1.2. Python图形界面开发——PyQt1.3. Python图形界面开发——wxPython1.4. Python图形界面开发—— PyGTK&#xff1a;基于GTK1.5. Python图形界面开发—— Kivy1.6. Python图形界面开发——可视化工具1.7. …

【个人学习笔记】概率论与数理统计知识梳理【六】

文章目录 第六章 样本及抽样分布一、随机抽样二、直方图与箱线图2.1 直方图2.2 箱线图 三、抽样分布总结 第六章 样本及抽样分布 好久没更新了&#xff0c;重新捡起来把它更完吧&#xff0c;可能会再开一个机器学习的笔记系列&#xff0c;参考用书是周志华的西瓜书。前五章主要…

Android 14.0 首次开机默认授予app运行时权限(去掉运行时授权弹窗)

1.概述 在14.0的系统rom产品定制化开发中&#xff0c;在6.0以后对于权限的申请&#xff0c;都需要动态申请&#xff0c;所以会在系统首次启动后&#xff0c;在app的首次运行时&#xff0c; 会弹出授权窗口&#xff0c;会让用户手动授予app运行时权限&#xff0c;在由于系统产品…

6、JavaWeb-Mybatis

P116 Mybatis-入门 Mybatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 持久层就是三层控制中的Dao层&#xff0c;数据访问层/持久层&#xff0c; P117 Mybatis-入门-快速入门程序 步骤&#xff1a; 创建springboot工程&#xff0c;数据表和实体类 引入mybat…