机器学习:数据清洗流程及完整代码实现

news2024/9/22 13:29:12

概述:

在处理数据之前,需要进行数据质量分析,了解数据的功能和作用,检查原始数据中是否存在脏数据。脏数据一般是指不符合要求以及不能直接进行相应分析的数据。

        脏数据往往存在如下问题:没有列头,一个列有多个参数,列数据的单位不统一,存在缺失值、空行、重复数据和非ASCII字符,有些列头应该是数据而不应该是列名参数等等。可将这些问题大致归类为缺失值、异常值和重复值等噪声数据问题。

数据清洗步骤:

  1. 数据加载和初步处理

  2. 加载数据:从Excel文件中加载数据。
  3. 数据筛选:去除“矿物类型”为'E'的行。                                                                                       
    data = pd.read_excel("矿物数据.xls")
    #从数据中筛选出“矿物类型”不是'E'的行。
    data=data[data['矿物类型']!='E']
  4. 空值处理:计算每列的空值数量,但未进行填充或删除。                                                         
    #找出数据中的空值。
    null_num=data.isnull()
    # 计算每列空值的总数。
    null_total=null_num.sum()
  5. 特征和标签分离:将“矿物类型”作为标签,其余作为特征。                                                      
    # 从数据中删除'矿物类型'和'序号'这两列,准备作为特征数据。
    x_whole=data.drop('矿物类型',axis=1).drop('序号',axis=1)
    # 将'矿物类型'列作为标签数据。
    y_whole=data.矿物类型
  6. 标签编码:将标签从文本转换为数字。                                                                                      
    # 创建一个字典,用于将标签文本转换为数字。
    label_dict={"A":0,"B":1,"C":2,"D":3}
    # 使用列表推导式将标签文本转换为数字。
    encoded_label=[label_dict[label] for label in y_whole]
    # 将转换后的标签数据转换为pandas Series,并命名为“矿物类型”。
    y_whole=pd.Series(encoded_label,name="矿物类型")
  7. 缺失值处理:代码中计算了空值数量,但没有进一步处理这些空值。可以考虑填充或删除这些空值。                                                                                                                                    
    # 尝试将每一列的数据转换为数值类型,如果转换失败则用NaN代替。
    for column_name in x_whole.columns:
        x_whole[column_name]=pd.to_numeric(x_whole[column_name],errors='coerce')
    
  8. 数据标准化:使用StandardScaler对特征进行标准化处理。                                                     
    from sklearn.preprocessing import StandardScaler
    scaler=StandardScaler()
    # 使用StandardScaler对特征数据进行标准化。
    x_whole_z=scaler.fit_transform(x_whole)
    # 将标准化后的数据转换回DataFrame。
    x_whole=pd.DataFrame(x_whole_z,columns=x_whole.columns)
  9. 训练集和测试集分割:使用train_test_split将数据分为训练集和测试集,测试集占30%。 
    # 从sklearn库中导入train_test_split,用于数据集的分割。
    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.3,random_state=5000)
    
  10. 缺失值填充:中位数填充:使用自定义的fill_data.median_train_fillfill_data.median_test_fill方法填充训练集和测试集的缺失值。                                       
    x_train_fill,y_train_fill=fill_data.median_train_fill(x_train_w,y_train_w)
    x_test_fill,y_test_fill = fill_data.median_test_fill(x_train_fill, y_train_fill,x_test_w, y_test_w)
    
                                                                                                                                                           函数 median_method这个函数用于填充数据中的缺失值,使用每列的中位数。
    • 计算中位数:计算数据中每列的中位数。
    • 填充缺失值:使用计算得到的中位数填充数据中的缺失值。                                            
      def median_method(data):
          fill_values=data.median()
          return  data.fillna(fill_values)

      函数 median_train_fill这个函数用于填充训练集中的缺失值,按标签分类处理。

    • 合并数据:将特征和标签合并到一个DataFrame中。
    • 重置索引:重置数据的索引。
    • 按标签分类:将数据按标签分类到不同的子集。
    • 分类填充:对每个子集使用median_method函数填充缺失值。
    • 合并填充后的数据:将填充后的子集重新合并为一个完整的DataFrame。
    • 重置索引:再次重置索引以确保连续性。
    • 数据可视化:在绘制条形图时,添加了标签数量的文本显示,这有助于直观地看到每个类别的数量。                                                                                                                 
      def median_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]
          B=data[data['矿物类型']==1]
          C=data[data['矿物类型']==2]
          D=data[data['矿物类型']==3]
      
          A=median_method(A)
          B=median_method(B)
          C=median_method(C)
          D=median_method(D)
      
          df_filled=pd.concat([A,B,C,D])
          df_filled=df_filled.reset_index(drop=True)
          return df_filled.drop('矿物类型',axis=1),df_filled.矿物类型
       

      函数 median_test_method这个函数用于使用训练集中位数填充测试集中的缺失值。                                                                                                               

    • 计算训练集中位数:计算训练数据中每列的中位数。
    • 填充测试数据:使用训练数据的中位数填充测试数据中的缺失值。                                 
      def median_test_method(train_data,test_data):
          fill_values=train_data.median()
          return test_data.fillna(fill_values)

      函数 median_test_fill这个函数用于填充测试集中的缺失值,按标签分类处理。                                                                                                                  

    • 合并数据:将训练和测试数据分别与标签合并。
    • 重置索引:重置数据的索引。
    • 按标签分类:将训练和测试数据按标签分类到不同的子集。
    • 分类填充:对每个测试数据子集使用median_test_method函数填充缺失值。
    • 合并填充后的数据:将填充后的子集重新合并为一个完整的DataFrame。
    • 重置索引:再次重置索引以确保连续性。
      def median_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]
          B_train=train_data_all[train_data_all['矿物类型']==1]
          C_train=train_data_all[train_data_all['矿物类型']==2]
          D_train=train_data_all[train_data_all['矿物类型']==3]
      
          A_test=test_data_all[test_data_all['矿物类型']==0]
          B_test=test_data_all[test_data_all['矿物类型']==1]
          C_test=test_data_all[test_data_all['矿物类型']==2]
          D_test=test_data_all[test_data_all['矿物类型']==3]
      
          A=median_test_method(A_train,A_test)
          B=median_test_method(B_train,B_test)
          C=median_test_method(C_train,C_test)
          D=median_test_method(D_train,D_test)
      
          df_filled = pd.concat([A, B, C, D])
          df_filled = df_filled.reset_index(drop=True)
          return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型     
  11. 过采样:使用SMOTE算法对训练数据进行过采样,以处理类别不平衡问题。                           
    from imblearn.over_sampling import SMOTE
    oversampler=SMOTE(k_neighbors=1,random_state=42)
    os_x_train,os_y_train=oversampler.fit_resample(x_train_fill,y_train_fill)
    
  12. 合并标签:将过采样后的训练集标签和测试集标签合并,用于可视化。
    labels_count = pd.Series(y_whole).value_counts()
    fig,ax=plt.subplots()
    bars=ax.bar(labels_count.index,labels_count.values)
    for bar in bars:
        yval=bar.get_height()
        ax.text(bar.get_x()+bar.get_width()/2,yval,round(yval,2),va='bottom',ha='center',fontsize=10,color='black')
    plt.xlabel('labels')
    plt.ylabel('numbers')
    plt.title('data_fillna_median')
    plt.show()
  13. 合并训练数据与测试数据并保存到Excel文件                                                                           

    data_train=pd.concat([os_y_train,os_x_train],axis=1).sample(frac=1,random_state=4)
    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)

     

数据清洗结果

      

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import fill_data
data = pd.read_excel("矿物数据.xls")
#从数据中筛选出“矿物类型”不是'E'的行。
data=data[data['矿物类型']!='E']
#找出数据中的空值。
null_num=data.isnull()
# 计算每列空值的总数。
null_total=null_num.sum()
# 从数据中删除'矿物类型'和'序号'这两列,准备作为特征数据。
x_whole=data.drop('矿物类型',axis=1).drop('序号',axis=1)
# 将'矿物类型'列作为标签数据。
y_whole=data.矿物类型
# 创建一个字典,用于将标签文本转换为数字。
label_dict={"A":0,"B":1,"C":2,"D":3}
# 使用列表推导式将标签文本转换为数字。
encoded_label=[label_dict[label] for label in y_whole]
# 将转换后的标签数据转换为pandas Series,并命名为“矿物类型”。
y_whole=pd.Series(encoded_label,name="矿物类型")
# 尝试将每一列的数据转换为数值类型,如果转换失败则用NaN代替。
for column_name in x_whole.columns:
    x_whole[column_name]=pd.to_numeric(x_whole[column_name],errors='coerce')

from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
# 使用StandardScaler对特征数据进行标准化。
x_whole_z=scaler.fit_transform(x_whole)
# 将标准化后的数据转换回DataFrame。
x_whole=pd.DataFrame(x_whole_z,columns=x_whole.columns)
# 从sklearn库中导入train_test_split,用于数据集的分割。
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.3,random_state=5000)


# 二:中位数填充
x_train_fill,y_train_fill=fill_data.median_train_fill(x_train_w,y_train_w)
x_test_fill,y_test_fill = fill_data.median_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=42)
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.Series(y_whole).value_counts()
fig,ax=plt.subplots()
bars=ax.bar(labels_count.index,labels_count.values)
for bar in bars:
    yval=bar.get_height()
    ax.text(bar.get_x()+bar.get_width()/2,yval,round(yval,2),va='bottom',ha='center',fontsize=10,color='black')
plt.xlabel('labels')
plt.ylabel('numbers')
plt.title('data_fillna_median')
plt.show()

data_train=pd.concat([os_y_train,os_x_train],axis=1).sample(frac=1,random_state=4)
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)

fill_data文件

import pandas as pd
import numpy as np
def median_method(data):
    fill_values=data.median()
    return  data.fillna(fill_values)

def median_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]
    B=data[data['矿物类型']==1]
    C=data[data['矿物类型']==2]
    D=data[data['矿物类型']==3]

    A=median_method(A)
    B=median_method(B)
    C=median_method(C)
    D=median_method(D)

    df_filled=pd.concat([A,B,C,D])
    df_filled=df_filled.reset_index(drop=True)
    return df_filled.drop('矿物类型',axis=1),df_filled.矿物类型

def median_test_method(train_data,test_data):
    fill_values=train_data.median()
    return test_data.fillna(fill_values)

def median_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]
    B_train=train_data_all[train_data_all['矿物类型']==1]
    C_train=train_data_all[train_data_all['矿物类型']==2]
    D_train=train_data_all[train_data_all['矿物类型']==3]

    A_test=test_data_all[test_data_all['矿物类型']==0]
    B_test=test_data_all[test_data_all['矿物类型']==1]
    C_test=test_data_all[test_data_all['矿物类型']==2]
    D_test=test_data_all[test_data_all['矿物类型']==3]

    A=median_test_method(A_train,A_test)
    B=median_test_method(B_train,B_test)
    C=median_test_method(C_train,C_test)
    D=median_test_method(D_train,D_test)

    df_filled = pd.concat([A, B, C, D])
    df_filled = df_filled.reset_index(drop=True)
    return df_filled.drop('矿物类型', axis=1), df_filled.矿物类型

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

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

相关文章

【CanMV K230】线段检测

【CanMV K230】线段检测 什么是线段检测线段检测应用领域1.地图解析中的道路、建筑轮廓提取2.计算机视觉中的物体识别和跟踪。3.机器人导航和环境理解。4.图像分割和特征点提取。5.建筑测量和图像重建。6.OCR(光学字符识别)预处理。7.行人检测和交通标志…

html+css+js网页设计 宝石及材料与工艺学专业知识科普与学习11个页面 带报告

htmlcssjs网页设计 宝石及材料与工艺学专业知识科普与学习11个页面 带报告 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&a…

免费分享:2014-2018年全球5.0级及以上地震正式报目录数据集

数据详情 本数据集为2014年—2018年中国台网正式目录(统一编目目录)全球5.0及以上地震6459次地震数据,属性字段包含发震时刻、经度、纬度、深度、地震类型、震级、参考位置、事件类型等。 数据属性 数据名称:全球5.0级及以上地震…

【数学建模】2024数学建模国赛B题(word论文+matlab):生产过程中的决策问题

详情请见:https://mbd.pub/o/bread/mbd-ZpqblZ5u 文章目录 一、问题二、解答2.1 问题一2.2 问题二2.3 问题三2.4 问题四 一、问题 某企业生产某种畅销的电子产品,需要分别购买两种零配件(零配件1和零配件2),在企业将两…

gcn(从空间域理解)

一、背景 常见的神经网络,如BP神经网络可以用来处理表格型的数据,卷积神经网络可以用来处理图片数据,循环神经网络则可以用来处理序列数据,这些数据都是结构化的数据,当我们需要处理的数据为图这种非结构化的数据&…

黑马点评9——附近商户-GEO数据结构

文章目录 GEO数据结构的基本用法导入店铺数据结构到GEO实现附件商户功能 GEO数据结构的基本用法 导入店铺数据结构到GEO 数据库里没法实现按照地理坐标排序等复杂的搜索功能,我们把数据存到redis中,只需要保存id和对应的x以及y的坐标,就可以…

一键部署Phi 3.5 mini+vision!多模态阅读基准数据集MRR-Benchmark上线,含550个问答对

小模型又又又卷起来了!微软开源三连发!一口气发布了 Phi 3.5 针对不同任务的 3 个模型,并在多个基准上超越了其他同类模型。 其中 Phi-3.5-mini-instruct 专为内存或算力受限的设备推出,小参数也能展现出强大的推理能力&#xff…

使用Cskin时候 遇到按钮有默认阴影问题解决

使用Cskin时候 遇到按钮有默认阴影 设置 DrawType 属性就可以了

【应用】浅谈大模型的应用场景

在人工智能(AI)的发展历程中,大模型无疑是一个重要的里程碑。这类模型通过海量数据的训练,其参数量都达到了千亿甚至万亿的规模,具备了强大的语言理解和生成能力,能够完成各种复杂的自然语言处理任务。 大模型在各种领域都有广泛的…

Web day0906

ok了家人们,今天开始学习javaweb,我们一起看看吧 一.WEB开发介绍 1.1 WEB介绍 Web ( World Wide Web )即全球广域网,也称为万维网。简 单说,能够通过浏览器访问的网站。在我们日常的生活中,经…

【JAVA基础】StringUtils.isEmpty、StringUtils.isBlank()、Objects.isNull()三者区别

📝个人主页🌹:个人主页 ⏩收录专栏⏪:日常经验 🌹🌹期待您的关注 🌹🌹,让我们共同进步! 总是区分不清楚这几个的差别:我们来直接验证一下&#…

【机械手控制】基于matlab 4-RPR平面机械手的可操作性、工作空间分析和路径跟踪【含Matlab源码 7422期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。 🍎个人主页:Matlab凤凰涅槃 🏆代码获取方式:扫描文章底部QQ二维码 ⛳️座右铭&…

U盘数据危机应对:详解文件或目录损坏无法读取的恢复之道

在数字化信息日益重要的今天,U盘作为便携存储设备,几乎成为了每个人工作和生活中的必需品。然而,当U盘突然遭遇文件或目录损坏且无法读取的困境时,我们往往面临数据丢失的风险,这不仅影响工作效率,还可能造…

【开学季】智慧城市入门教程福利放送,零基础入门三维WebGIS

步入九月,不知道有多少同学还没享受够假期 就要开始返校“直面天命” 各种大朋友、小朋友;大一萌新、学长学姐们也 都陆陆续续返校 小编整理了新中地公开课教程 帮助大家丝滑入门大学学习 这份开学礼包,请注意查收! WebGIS三…

Xinstall如何用一个包打通多个推广路径?

在移动互联网时代,App的推广和运营对于开发者而言是一项至关重要的任务。然而,面对繁多的推广渠道,如何高效地管理和评估各个渠道的效果,成为了摆在开发者面前的一大难题。今天,我们就来科普一下,如何通过X…

13条自动化测试框架设计原则

1、代码规范 测试框架随着业务推进,必然会涉及代码的二次开发,所以代码编写应符合通用规范,代码命名符合业界标准,并且代码层次清晰。特别在大型项目、多人协作型项目中,如果代码没有良好的规范,那么整个框…

计算机毕业设计选题推荐-博物馆管理系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Helm Deploy Online Rancher v2.9.1

文章目录 准备安装查看下载 准备 $ kubectl get node NAME STATUS ROLES AGE VERSION kube-master01 Ready control-plane 19d v1.29.5 kube-node01 Ready <none> 19d v1.29.5 kube-node02 Ready <none&…

嵌入式学习(链式栈和链式队列)

栈&#xff08;stack&#xff09;是一种只能在一端插入或删除操作的线性表。 栈只能在表尾插入或删除元素&#xff0c;表尾就是栈的栈顶&#xff0c;表头就是栈底 栈的主要特点&#xff1a;LIFO(last in first out) "后进先出" 栈可以采用顺序存储结构(顺序栈) 和…

备战秋招60天算法挑战,Day33

题目链接&#xff1a; https://leetcode.cn/problems/longest-increasing-subsequence/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1RRvheFEog/ LeetCode 300. 最长递增子序列 题目描述 给你一个整数数组nums &#xff0c;找到其中最长严格递增子序列的长度。 …