当前位置: 首页 > news >正文

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

目录

一、了解数据清洗

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 pltdata = pd.read_excel('111.xlsx')  # 导入文件
data = data[data['矿物类型'] != 'D']  # 删除无用的类别D
null_num = data.isnull()  # 判断是否为空,返回布尔值null_total = null_num.sum()  # 对上述布尔类型的值进行求和,默认True为1,False为0x_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):    # 参数为datafill_values = data.mean()   # mean会计算每一列的均值,然后返回给fill_valuesreturn 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的数据取出,赋值给AB = data[data['矿物类型'] == 1]   # 将标签为1的数据取出,赋值给BC = data[data['矿物类型'] == 2]   # 将标签为2的数据取出,赋值给CA = 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

 

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

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • zabbix6.4连接钉钉发出警告
  • 【计算机网络】TCP协议(下)
  • 基于stm32f407的pwm输出以及初始化(84mhz)
  • 电影、视频拍摄基础知识 | 所有岗位及职能描述、任职要求速览
  • LC1860C 后来怎么样了
  • 浅谈人工智能之python调用通义千问API
  • 深入解析MySQL索引的使用及优化
  • gitlab 启动/关闭/启用开机启动/禁用开机启动
  • 前端HTML基础笔记
  • 6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)
  • 8. GIS数据分析师岗位职责、技术要求和常见面试题
  • 深度学习中常见的权重参数初始化方法
  • argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常
  • C++手记
  • C语言深度剖析--不定期更新的第五弹
  • .pyc 想到的一些问题
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • gops —— Go 程序诊断分析工具
  • js操作时间(持续更新)
  • mongodb--安装和初步使用教程
  • php面试题 汇集2
  • spring学习第二天
  • TypeScript迭代器
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue脚手架vue-cli
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端性能优化——回流与重绘
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • ![CDATA[ ]] 是什么东东
  • (2)(2.10) LTM telemetry
  • (20050108)又读《平凡的世界》
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (九十四)函数和二维数组
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)模仿学习-完成后台管理页面查询
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .md即markdown文件的基本常用编写语法
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • ??javascript里的变量问题
  • @RequestBody的使用
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [100天算法】-目标和(day 79)
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [BSidesCF 2019]Kookie1
  • [BZOJ 1040] 骑士
  • [C#]DataTable常用操作总结【转】
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?