《机器学习》数据预处理 删除、替换、填充 案例解析及实现

news2024/9/17 7:25:21

目录

一、了解数据清洗

1、什么是数据清洗

2、数据清洗步骤

1)缺失值处理

2)异常值处理

3)重复值处理

4)格式修正

5)数据一致性检查

6)数据类型转换

二、数据清洗用法

1、有如下文件内容

2、完整代码

1)代码1

2)自建包fill_na.py内代码:

1、运行结果

2、调试结果:

3)数据处理后的内容:


 

一、了解数据清洗

1、什么是数据清洗

        数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。 换句话说,数据清洗的目的是删除重复信息纠正存在的错误,并提供数据一致性。在进行数据清洗时,需要按照一定的规则把“脏数据”“洗掉”,以确保数据的准确性和可靠性。

 

2、数据清洗步骤

        1)缺失值处理

                找出数据中的缺失值,并根据具体情况进行处理,可以通过删除包含缺失值的样本、使用均值或中位数等等 进行填充,或使用其他合适的方法来处理缺失值。

 

        2)异常值处理

                检测并处理数据中的异常值,这些异常值可能是由于测量错误、输入错误或其他原因导致的,可以通过删除异常值、替换为合适的值或使用其他方法进行处理。

 

        3)重复值处理

                检测并删除数据中的重复值,这些重复值可能是由于数据输入错误、数据复制或其他原因导致的,重复值可能会对模型的训练和性能产生负面影响。

 

        4)格式修正

                将数据转换为统一的格式,例如将日期转换为特定的日期格式、将文本转换为小写或大写、移除多余的空格等。

 

        5)数据一致性检查

                对数据进行逻辑一致性检查,确保数据在不同字段、不同记录之间保持一致。

 

        6)数据类型转换

                将数据转换为适当的数据类型,例如将字符串转换为数值型、将文本转换为分类变量等。

 

 

二、数据清洗用法

1、有如下文件内容

                (内容随意敲的)

6b36028cac354b8e9101d8776be0d109.png

此时图中有一些无用的字符,还有一些空值,接下来要对这组数据进行数据预处理

 

2、完整代码

        1)代码1

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('111.xlsx')  # 导入文件
data = data[data['矿物类型'] != 'D']  # 删除无用的类别D
null_num = data.isnull()  # 判断是否为空,返回布尔值

null_total = null_num.sum()  # 对上述布尔类型的值进行求和,默认True为1,False为0

x_whole = data.drop('矿物类型',axis=1)  # 将除了矿物类型的列当做特征集
y_whole = data.矿物类型   # 将矿物类型列当做标签集

label_dict = {'A':0,'B':1,'C':2}  # 定义一个字典,用来将矿物类型转换为整型
encoded_label = [label_dict[label] for label in y_whole]  # 利用列表生成式,遍历标签集中的每一个字符串类型的类别,利用字典键值对的作用,将原来的值更改为整型,
y_whole = pd.Series(encoded_label,name='矿物类型')  # 将上述转变后的数据更改为Series类型,并赋值给原始标签集

"""去除无用符号"""
for column_name in x_whole.columns:   # 遍历特征集的列名
    x_whole[column_name] = pd.to_numeric(x_whole[column_name],errors='coerce')
# 使用numpy的用法to_numeric,将取出每列的数据转换为数值型,参数error表示如果转换为数值类型发生错误,就将那个值转换为Nan


""" Z标准化 """
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_whole_z = scaler.fit_transform(x_whole)  # 将去除无用符号的特征集数据进行z标准化
x_whole = pd.DataFrame(x_whole_z,columns=x_whole.columns)  # z标准化后为numpy数据,将其转换为dataframe类型


""" 数据集切分 """
from sklearn.model_selection import train_test_split
x_train_w,x_test_w,y_train_w,y_test_w = train_test_split(x_whole,y_whole,test_size=0.2,random_state=0)



""" 填充空值 """
import fill_na  # 导入自己写的填充函数


# 使用均值填充,调用自己写的函数,对空值进行填充
x_train_fill,y_train_fill = fill_na.mean_train_fill(x_train_w,y_train_w)  # 训练集的填充
x_test_fill,y_test_fill = fill_na.mean_test_fill(x_train_fill,y_train_fill,x_test_w,y_test_w)  # 测试集的填充




""" 对数据进行过采样,防止过拟合 """
from imblearn.over_sampling import SMOTE
oversampler = SMOTE(k_neighbors=1,random_state=0)  # k_neighbors=1表示最近邻的邻居个数,以及随机种子
os_x_train,os_y_train = oversampler.fit_resample(x_train_fill,y_train_fill)  # 输入参数训练集特征和标签,将他们进行过拟合操作,返回两个新的训练数据集


""" 绘制每个类别数据个数图 """
y_whole = pd.concat([os_y_train,y_test_fill])  # 合并过拟合后的数据
labels_count= pd.value_counts(y_whole)  # 返回每个类别的数据个数
fig,ax = plt.subplots()  # 使用subplot创建子图,fig表示整个图像,ax表示子图坐标区域
bars = ax.bar(labels_count.index,labels_count.values)  # 表示在指定区域绘制条形图,x轴表示数据的索引,y轴表示值
for bar in bars:  # 遍历每一个条形图
    yval = bar.get_height()  # 获取每个条形图的高度
    # 在条形图上增加文本,用bar.get()+bar.get_width()/2计算文本的水平位置
    ax.text(bar.get_x()+bar.get_width()/2,yval,round(yval,2),va='bottom',ha='center',fontsize=10,color='black')
plt.xlabel('lables')  # x轴名字
plt.ylabel('numbers')  # y轴名字
plt.title('The number of data for each category after removing empty data')  # 标题
plt.show()


data_train = pd.concat([os_y_train,os_x_train],axis=1).sample(frac=1,random_state=0)  # sample(frac=1,random_state=0)表示随机选择行,frac表示返回样本比例
data_test = pd.concat([y_test_fill,x_test_fill],axis=1)


data_train.to_excel(r'./训练数据集[均值填充].xlsx',index=False)
data_test.to_excel(r'./测试数据集[均值填充].xlsx',index=False)

        2)自建包fill_na.py内代码:


import pandas as pd


"""  使用均值填充  """
def mean_method(data):    # 参数为data

    fill_values = data.mean()   # mean会计算每一列的均值,然后返回给fill_values
    return data.fillna(fill_values)   # 返回 均值填充到data的数据

def mean_train_fill(train_data, train_label):   # 传入两个参数,一个是训练的特征集,一个训练的标签
    data = pd.concat([train_data, train_label], axis=1)   # 将特征集和标签集合并
    data = data.reset_index(drop=True)   # 重置合并后数据的索引
    A = data[data['矿物类型'] == 0]   # 将标签为0的数据取出,赋值给A
    B = data[data['矿物类型'] == 1]   # 将标签为1的数据取出,赋值给B
    C = data[data['矿物类型'] == 2]   # 将标签为2的数据取出,赋值给C

    A = mean_method(A)   # 调用mean_method函数对A类别中的数值进行求均值后再进行填充
    B = mean_method(B)
    C = mean_method(C)


    df_filled = pd.concat([A, B, C])   # 填充完后将每一类数据合并
    df_filled = df_filled.reset_index(drop=True)    # 重置索引
    return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型  # 返回训练集的特征和标签
def mean_test_method(train_data, test_data):
    fill_values = train_data.mean()   # 对训练集的数据进行求均值
    return test_data.fillna(fill_values)  # 将训练集计算的均值填充到测试集

def mean_test_fill(train_data, train_label, test_data, test_label):  # 导入填充好的训练集数据和标签,以及未填充的测试集特征和标签
    train_data_all = pd.concat([train_data, train_label], axis=1)  # 合并填充好的训练集数据
    train_data_all = train_data_all.reset_index(drop=True)   # 重置索引
    test_data_all = pd.concat([test_data, test_label], axis=1)  # 合并未处理的测试集数据
    test_data_all = test_data_all.reset_index(drop=True)

    A_train = train_data_all[train_data_all['矿物类型'] == 0]     # 取出训练集中0类别的数据
    B_train = train_data_all[train_data_all['矿物类型'] == 1]
    C_train = train_data_all[train_data_all['矿物类型'] == 2]

    A_test = test_data_all[test_data_all['矿物类型'] == 0]   # 取出测试集中0类别的数据
    B_test = test_data_all[test_data_all['矿物类型'] == 1]
    C_test = test_data_all[test_data_all['矿物类型'] == 2]

    A = mean_test_method(A_train, A_test)  # 调用上述函数mean_test_method,输入参数0类别的数据的训练集和测试集合,返回填充后的0类别测试集数据
    B = mean_test_method(B_train, B_test)
    C = mean_test_method(C_train, C_test)

    df_filled = pd.concat([A, B, C])  # 合并处理完三个类别的测试集数据
    df_filled = df_filled.reset_index(drop=True)
    return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型  # 返回测试集的特征集和标签集

 

        1、运行结果

abb2841d3f594148976f1c7f506a5963.png

 

        2、调试结果:

34b1b1461ba249379261e18fd3bae1ae.png

 

3)数据处理后的内容:

8f7f16b480f34a06b3a082268b1bb2d6.png

9b9dfa9a22d54b9ab239126998b65214.png

 

(还有其他填充方法,例如直接删除空值、中位数填充、众数填充、线性回归填充、随机森林填充等等,代码大致相同,可私信发代码)

 

 

 

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

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

相关文章

前向渲染路径

1、前向渲染路径处理光照的方式 前向渲染路径中会将光源分为以下3种处理方式: 逐像素处理(需要高等质量处理的光)逐顶点处理(需要中等质量处理的光)球谐函数(SH)处理(需要低等质量…

线程的四种操作

所属专栏:Java学习 1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链…

C++17: 用折叠表达式实现一个IsAllTrue函数

前言 让我们实现一个 IsAllTrue 函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true。 本文记录了逐步实现与优化该函数的思维链,用到了以下现代C新特性知识,适合对C进阶知识有一定…

2025最新:如何打造公司财务管理系统?Java SpringBoot实现,一步到位管理企业财务!

✍✍计算机毕业编程指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java…

STM32F407VET6开发板RT-Thread的移植适配

前言 最近购买了一块 STM32F407VET6开发板【魔女】,http://www.stm32er.com/ 通过原理图了解到,开发板板载 CMSIS-DAP 调试下载口,例程部分大部分以裸机程序为主 目标:打算移植适配到 RT-Thread 适配 RT-Thread RT-Thread 支持…

基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现

文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进3. 源码和发行版 概要 准静态自适应环形缓存器(Quasi-Static Adaptive Ring Cache)是taskBus用于…

【Python报错已解决】 No Python at ‘C:\Users...\Python Python39\python.exe’

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查Python安装路径2.2 …

苍穹外卖随记(一)

黑马苍穹外卖逻辑和细节的问题和解决 1.后端查询到员工的日期信息,将信息进行json化传给前端时发生:前端收到的是不标准的日期json串。 解决:1.注解进行json格式化(JsonFormat)2. 在spring MVC中,通过消息…

如何验证VMWare WorkStation的安装?

如何验证VMWare WorkStation的安装? 右击"网络",点击 打开"网络和Internet设置",点击更改适配器选项,如果出现VMNet1和VMNet8,则说明安装成功。

内网穿透(cpolar实现)

目录 一、介绍 二、内网穿透工具cpolar实现 1.下载与安装 2.cpolar指定authtoken 3.获取临时域名 4.验证临时域名有效性 一、介绍 内网穿透,即 NAT 穿透(Network Address Translation Traversal),是一种网络技术&#xff0…

Python爬虫使用实例-wallpaper

1/ 排雷避坑 &#x1f95d; 中文乱码问题 print(requests.get(urlurl,headersheaders).text)出现中文乱码 原因分析&#xff1a; <meta charset"gbk" />解决方法&#xff1a; 法一&#xff1a; response requests.get(urlurl,headersheaders) response.en…

java基础-IO(4)管道流 PipedOutputStream、PipedInputStream、PipedReader、PipedWriter

管道 提到管道&#xff0c;第一印象就是水管或者地下管道&#xff0c;一节接着一节&#xff0c;形如下图。 管道流 "流"从上一个管道 ——-> 下一个管道。又细分为字节流和字符流。 字节流&#xff08;PipedOutputStream、PipedInputStream&#xff09; 如果…

SSM框架介绍

SSM通常指的是三个开源框架的组合&#xff0c;即Spring、SpringMVC&#xff08;Spring Web MVC&#xff09;和MyBatis&#xff0c;这三个框架经常一起使用来开发Java企业级应用&#xff0c;特别是在Web应用开发中非常流行。 SSM框架介绍 Spring 简介&#xff1a;Spring是一个…

谷粒商城のNginx

文章目录 前言一、Nginx1、安装Nginx2、相关配置2.1、配置host2.2、配置Nginx2.3、配置网关 前言 本篇重点介绍项目中的Nginx配置。 一、Nginx 1、安装Nginx 首先需要在本地虚拟机执行&#xff1a; mkdir -p /mydata/nginx/html /mydata/nginx/logs /mydata/nginx/conf在项目…

ModuleNotFoundError: No module named ‘mmcv.transforms‘

不得已的解决方法&#xff1a; mmcv升级到2.0.0即可解决 升级后自然又面临一系列不兼容问题&#xff01; 官方文档查漏补缺

【STM32】呼吸灯实现

对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999&#xff0c;重装载值为2000&#xff0c;因为设置内部时钟晶振频率为100MHZ &#xff0c;1s跳 100 000000次 &#xff0c;跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…

九,自定义转换器详细操作(附+详细源码解析)

九&#xff0c;自定义转换器详细操作&#xff08;附详细源码解析&#xff09; 文章目录 九&#xff0c;自定义转换器详细操作&#xff08;附详细源码解析&#xff09;1. 基本介绍2. 准备工作3. 自定义转换器操作4. 自定义转换器的注意事项和细节5. 总结&#xff1a;6. 最后&…

【前端学习】AntV G6-07 深入图形与图形分组、自定义节点、节点动画(上、中)

课程链接 AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;上&#xff09;_哔哩哔哩_bilibili AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;中&#xff09;_哔哩哔哩_bilibili 图形分组 Group | G6 (antgroup.com) 自…

ARM32开发——DMA内存到内存

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求数据交互流程开发流程依赖引入DMA初始DMA传输请求完整代码 关心的内容DMA初始化DMA初始化DMA数据传输请求完整代码 DMA中断开启…

封装智能指针 qt实现登录界面

1.封装独占智能指针——unique_ptr #include <iostream> #include <utility> // For std::move// 命名空间 namespace custom_memory { template <typename T> class myPtr { public:// 使用初始化列表进行初始化explicit myPtr(T* p nullptr) noexcept : …