机器学习必修课 - 如何处理缺失数据

运行环境:Google Colab

处理缺失数据可简单分为两种方法:1. 删除具有缺失值的列 2. 填充

!git clone https://github.com/JeffereyWu/Housing-prices-data.git
  • 下载数据集
import pandas as pd
from sklearn.model_selection import train_test_split
  • 导入库
# Read the data
X_full = pd.read_csv('/content/Housing-prices-data/train.csv', index_col='Id')
X_test_full = pd.read_csv('/content/Housing-prices-data/test.csv', index_col='Id')
  • 读取数据
  • index_col='Id'是为了将数据框的索引列设置为’Id’列。
# Remove rows with missing target, separate target from predictors
X_full.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = X_full.SalePrice
X_full.drop(['SalePrice'], axis=1, inplace=True)
  • SalePrice 是我们尝试预测的目标变量。
  • 删除训练数据中带有缺失目标值(‘SalePrice’)的行。
  • 将目标值(‘SalePrice’)存储在变量y中,并从特征中删除。
# To keep things simple, we'll use only numerical predictors
X = X_full.select_dtypes(exclude=['object'])
X_test = X_test_full.select_dtypes(exclude=['object'])
  • 将特征数据限制为仅包含数值型特征
  • select_dtypes 函数用于根据数据类型(在这里是’object’,即非数值型)选择特定类型的列。
X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2,random_state=0)
  • 使用train_test_split 函数将训练数据X和目标值y分成训练集和验证集。train_size参数指定了训练集的比例(80%),test_size参数指定了验证集的比例(20%),random_state参数用于控制随机分割的种子,以确保每次运行代码时分割结果都一样。

1. 了解训练数据的形状和每列数据中缺失值的数量

# Shape of training data (num_rows, num_columns)
print(X_train.shape)# Number of missing values in each column of training data
missing_val_count_by_column = (X_train.isnull().sum())
print(missing_val_count_by_column[missing_val_count_by_column > 0])

在这里插入图片描述

  • 首先使用.isnull()方法将每个单元格是否为缺失值进行检查,然后使用.sum()方法计算每列中缺失值的总数。
  • 最后,它打印出那些包含至少一个缺失值的列的缺失值数量。
  • 这段代码可以帮助你了解哪些特征(列)在训练数据中存在缺失值,以便在数据预处理过程中采取适当的措施来处理这些缺失值,例如填充它们或者删除相关的特征。

考虑到数据中缺失值的数量并不是很多,如果我们删除带有缺失值的列,那么就会丢失掉很多有用的信息。因此,更好的做法是对缺失值进行填充(imputation),以尽量保留数据的完整性。填充缺失值通常可以采用一些方法,如用平均值、中位数或者其他相关数据来替代缺失值,这样可以更好地保留数据的特征和信息,提高模型的性能。

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error# Function for comparing different approaches
def score_dataset(X_train, X_valid, y_train, y_valid):model = RandomForestRegressor(n_estimators=100, random_state=0)model.fit(X_train, y_train)preds = model.predict(X_valid)return mean_absolute_error(y_valid, preds)
  • RandomForestRegressor 是一个随机森林回归模型,用于机器学习中的回归问题。mean_absolute_error 是一个评估回归模型性能的函数,它用于计算预测值与实际值之间的平均绝对误差。
  • 函数的目的是通过比较不同数据集处理方法的分数来评估哪种方法在机器学习任务中效果最好。
# Get names of columns with missing values
cols_with_missing = [col for col in X_train.columnsif X_train[col].isnull().any()]# Drop columns in training and validation data
reduced_X_train = X_train.drop(cols_with_missing, axis=1)
reduced_X_valid = X_valid.drop(cols_with_missing, axis=1)
  • 创建了一个列表cols_with_missing,用于存储训练数据X_train中具有缺失值的列名。
  • 遍历X_train的每一列,使用.isnull().any()来检查每列是否包含任何缺失值。如果某列中至少有一个缺失值,就将其列名添加到cols_with_missing列表中。
  • 使用.drop()方法从训练数据X_train和验证数据X_valid中删除具有缺失值的列。cols_with_missing列表中包含了所有具有缺失值的列名,通过axis=1参数,可以指定删除列而不是行。
print("MAE (Drop columns with missing values):")
print(score_dataset(reduced_X_train, reduced_X_valid, y_train, y_valid))

在这里插入图片描述

2. 数据填充

from sklearn.impute import SimpleImputer# Imputation
my_imputer = SimpleImputer() 
imputed_X_train = pd.DataFrame(my_imputer.fit_transform(X_train))
imputed_X_valid = pd.DataFrame(my_imputer.transform(X_valid))# Imputation removed column names; put them back
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns
  • 导入了Scikit-learn库中的SimpleImputer类,该类用于处理缺失值,它可以用于填充数据中的缺失值。
  • 分别使用fit_transform方法来对训练数据X_train和验证数据X_valid进行缺失值填充。
  • 在训练过程中,模型需要学习如何处理缺失值以及其他特征,因此使用fit_transform方法对训练数据进行预处理。
  • 使用transform方法对验证数据进行数据预处理,包括填充缺失值。在验证过程中,模型不应该再次拟合填充器,因为这会导致信息泄露。模型在实际应用中不会在新的数据上重新拟合填充器,而是使用在训练数据上学到的填充策略。
  • 将填充后的数据框中的列名恢复为原始数据X_trainX_valid的列名。这是因为在填充数据时,列名可能被丢失。
print("MAE (Imputation):")
print(score_dataset(imputed_X_train, imputed_X_valid, y_train, y_valid))

在这里插入图片描述

这里我们可以看到,填充的方法没有删除的方法成效好。由于数据集中缺失值很少,所以通常来说,使用填充方法来处理缺失值应该比完全删除带有缺失值的列更好。但是在实际情况中,填充的方式也需要谨慎选择,不一定每次都使用均值填充就是最佳选择。具体的填充策略需要根据数据的特点和背后的含义来确定,可能需要尝试不同的填充方式以找到最合适的方法。同时,一些填充方式可能会导致糟糕的结果,因此需要谨慎评估和选择。

3. 对训练数据和验证数据进行最终的数据预处理

# Preprocessed training and validation features
final_imputer = SimpleImputer(strategy='median')
final_X_train = pd.DataFrame(final_imputer.fit_transform(X_train))
final_X_valid = pd.DataFrame(final_imputer.transform(X_valid))final_X_train.columns = X_train.columns
final_X_valid.columns = X_valid.columns
  • 设置填充策略为’median’(中位数)。这意味着缺失值将会使用每列的中位数值来进行填充。
# Define and fit model
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(final_X_train, y_train)# Get validation predictions and MAE
preds_valid = model.predict(final_X_valid)
print("MAE (Your approach):")
print(mean_absolute_error(y_valid, preds_valid))

在这里插入图片描述

# Fill in the line below: preprocess test data
final_X_test = pd.DataFrame(final_imputer.transform(X_test))
final_X_test.columns = X_test.columns# Fill in the line below: get test predictions
preds_test = model.predict(final_X_test)
# Save test predictions to file
output = pd.DataFrame({'Id': X_test.index,'SalePrice': preds_test})
output.to_csv('submission.csv', index=False)

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

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

相关文章

竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…

C语言实例_调用SQLITE数据库完成数据增删改查

一、SQLite介绍 SQLite是一种轻量级的关系型数据库管理系统(RDBMS),它是一个开源的、零配置的、服务器端的、自包含的、零管理的、事务性的SQL数据库引擎。它被广泛应用于嵌入式设备、移动设备和桌面应用程序等领域。 SQLite的特点包括&…

SpringBoot快速入门

搭建SpringBoot工程,定义hello方法,返回“Hello SpringBoot” ②导入springboot工程需要继承的父工程;以及web开发的起步依赖。 ③编写Controller ④引导类就是SpringBoot项目的一个入口。 写注解写main方法调用run方法 快速构建SpringBoo…

MySQL体系结构和四层架构介绍

MySQL体系结构图如下: 四层介绍 1. 连接层: 它的主要功能是处理客户端与MySQL服务器之间的连接(比如Java应用程序通过JDBC连接MySQL)。当客户端应用程序连接到MySQL服务器时,连接层对用户进行身份验证、建立安全连接并管理会话状态。它还处理…

python获取时间戳

使用 datetime 库获取时间。 获取当前时间: import datetime print(datetime.datetime.now()) . 后面的是微秒,也是一个时间单位,1秒1000000微秒。 转为时间戳: import datetimedate datetime.datetime.now() timestamp date…

小谈设计模式(14)—建造者模式

小谈设计模式(14)—建造者模式 专栏介绍专栏地址专栏介绍 建造者模式角色分类产品(Product)抽象建造者(Builder)具体建造者(Concrete Builder)指挥者(Director&#xff0…

电脑通过串口助手和51单片机串口通讯

今天有时间把电脑和51单片机之间的串口通讯搞定了,电脑发送的串口数据,单片机能够正常接收并显示到oled屏幕上,特此记录一下,防止后面自己忘记了怎么搞得了。 先来两个图片看看结果吧! 下面是串口3.c的文件全部内容&a…

Spring Cloud Zuul 基本原理

Spring Cloud Zuul 底层是基于Servlet实现的,核心是通过一系列的ZuulFilter来完成请求的转发。 1、核心组件注册 1.1. EnableZuulProxy注解 启用Zuul作为微服务网关,需要在Application应用类加上EnableZuulProxy注解,而该注解核心是利用Im…

@SpringBootApplication注解的理解——如何排除自动装配 分布式情况下如何自动加载 nacos是怎么被发现的

前言 spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求。 本篇博客介绍SpringBootApplicant注解的自动加载相关内容 其他相关的Spring博客文章列表如下: Spring基…

2023 年热门的大型语言模型 (LLMs)汇总【更新至9月26】

一、全景地图 整理了一张大语言模型的血缘图谱,如下图所示: 图中的大语言模型,都是自己做过评测的,主观了点,但是原汁原味,有好的可以推荐给我。 二、ChatGPT系列 ChaTGP是商业版本大语言模型的正统&…

逆强化学习

1.逆强化学习的理论框架 1.teacher的行为被定义成best 2.学习的网络有两个,actor和reward 3.每次迭代中通过比较actor与teacher的行为来更新reward function,基于新的reward function来更新actor使得actor获得的reward最大。 loss的设计相当于一个排序问…

visual studio禁用qt-vsaddin插件更新

visual studio里qt-vsaddin插件默认是自动更新的,由于qt-vsaddin插件新版本的操作方式与老版本相差较大,且新版本不稳定,容易出Bug,所以需要禁用其自动更新,步骤如下:     点击VS2019菜单栏上的【扩展】–…

基于Java的毕业设计选题管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

实现springboot的简单使用~

在之前学习SpringSpringMVCMybatis框架时,我们学习了多种配置spring程序的方式,例如:使用XML,注解,Java配置类,或者是将它们结合使用,但配置文件配置起来依然过于复杂,而我们接下来要…

虚拟机VMware的使用流程以及出现的问题附解决方法

虚拟机VMware的使用流程以及出现的问题附解决方法 下载安装 略。。。 创建虚拟机 虚拟机的设置如下:注意网络适配器为NAT 如果出现ip addr 命令:不显示IP地址的话: 解决方式如下: 首先设置网卡:先查看一下onboot是…

软件工程与计算总结(三)示例项目描述

本节介绍一个标准的项目描述,大家可以作为蓝本学习~ 目录 一.背景 二.目标 三.系统用户 四.用户访谈要点 1.收银员 2.客户经理 3.总经理 4.系统管理员 五.项目实践过程 一.背景 A是一家刚刚发展起来的小型连锁商店,其前身是一家独立的小百货门面…

贪心算法+练习

正值国庆之际,祝愿祖国繁荣昌盛,祝愿朋友一生平安!终身学习,奋斗不息! 目录 1.贪心算法简介 2.贪心算法的特点 3.如何学习贪心算法 题目练习(持续更新) 1.柠檬水找零(easy&…

Altium Designer 批量添加元器件后缀

Altium Designer 批量添加元器件后缀 方法一方法二可能出现的问题要注意 方法一 您可以使用 Altium Designer 中的“批量修改元器件名称”功能来批量添加元器件后缀。具体步骤如下: 1.为了方便显示 操作流程,我这里复制了几个原理图的文件,粘…

剑指offer——JZ22 链表中倒数最后k个结点 解题思路与具体代码【C++】

一、题目描述与要求 链表中倒数最后k个结点_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。 数据范围&…

好奇喵 | Surface Web ---> Deep Web ---> Dark Web

前言 我们可能听说过深网(deep Web)、暗网(dark Web)等名词,有些时候可能会认为它们是一个东西,其实不然,两者的区别还是比较大的。 什么是deep web? 深网是网络的一部分,与之相对应的是表层网络(surface …