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

数据预处理

        在日常生产生活中,我们收集到的数据往往质量不高,比如会出现像 “账号余额为 - 100” 这样的异常值,或者存在缺失值,甚至有 “年龄 2 岁却有研究生学历” 这种不可能的组合。而数据预处理技术,就是为了改善这些数据的质量,让它们更适合后续的挖掘任务,从而提升挖掘结果的准确率和效率。接下来,我们就从四个核心部分展开学习。

一、数据集成

首先,我们来看数据集成。数据集成指的是将来自多个不同数据源的数据,组合到一个集成的数据存储中,并提供统一的数据视图。这些数据源可能是多维数据集、数据库或者数据文件等。

在这个过程中,我们会遇到几个典型问题:

  1. 同名异义:比如员工信息表 A 里的 “ID” 是员工编号,而交易记录表 B 里的 “ID” 是订单编号,虽然名字一样,但描述的是不同实体。
  2. 异名同义:像数据表 A 的 “sales_dt” 和数据表 B 的 “sales_date”,其实都是指销售日期,只是名字不同。
  3. 单位不统一:比如一个表用国际单位,另一个表用我国传统计量单位描述同一个实体。
  4. 颗粒度不统一:比如表 A 是每天每个城市的数据,表 B 是每月每个省份的数据,两者的细化程度不同。

解决了实体识别问题后,我们就可以进行数据合并了。Python 提供了多种函数来实现,主要有这三种:

  1. 数据堆叠:用 Pandas 的 concat () 函数,按轴拼接两个 DataFrame。它的基本语法是concat(objs, axis = 0, join = 'outer', ignore_index = False)。当 axis=0 时,是行堆叠,把两个表上下拼接;axis=1 时,是列堆叠,左右拼接。就像 PPT 里的例子,表 1 和表 2 通过不同的 axis 参数,会得到不同的堆叠结果。
  2. 数据增补:用 append () 函数,实现纵向合并,把一个数据框添加到另一个的尾部,相当于 axis=0 的堆叠补充。
  3. 数据合并:用 merge () 函数,类似数据库的连接方式,支持左连接、右连接、内连接和外连接,通过指定连接键(on 参数等)来合并数据。

二、数据清洗

数据清洗是预处理中非常关键的一步,目的是处理重复值、缺失值、异常值等问题,提高数据质量。

1. 重复值处理

重复值分两种:

  1. 记录重复:多行数据描述同一个实体。我们可以用 duplicated () 函数检测,它返回布尔值表示是否重复;用 drop_duplicates () 函数删除重复记录,比如按 “姓名” 去重,保留第一条记录。
  2. 特征重复:也就是特征冗余,一个特征的信息能从其他特征得到。标称特征可用卡方系数检测,数值特征用相关系数检测,比如两个高度相关的数值特征,可能存在冗余。

2. 缺失值处理

数据缺失很常见,可能是存储遗漏、设备故障等原因导致。处理方法有:

  1. 直接删除:用 dropna () 函数,删除含缺失值的行或列。但这种方法会丢失信息,通常在缺失率超过 70%-75% 时使用。
  2. 替换或插补:用 fillna () 函数,可选均值、中位数、众数替换,或用固定值(如 0、'Unknown'),也可用临近值。比如对 “数学” 成绩的缺失值,用所有非缺失成绩的均值或中位数填充。

3. 异常值检测和处理

异常值是偏离多数数据的值,可能因录入错误、测量错误等产生,会影响模型准确性。检测方法有:

  1. 原则:假设数据服从正态分布,99.73% 的数据在 (μ-3σ, μ+3σ) 范围内,超出的视为异常值。
  2. 箱线图分析:计算 IQR(四分位距 = Q3-Q1),小于 Q1-1.5IQR 或大于 Q3+1.5IQR 的值为异常值,箱线图中会以孤立点显示。
  3. 聚类方法:比如 DBSCAN 算法,异常值在低密度区域,不构成簇。

处理异常值的方法:数量少时直接删除;用缺失值处理方法替换;若异常值有特殊意义,可咨询业务人员后决定是否保留。

三、数据变换

数据变换是把数据转换成适合算法的形式,常见操作有:

1. 数据规范化

消除不同特征的单位和取值范围差异,常用三种方法:

  1. 最小 - 最大规范化:用 MinMaxScaler,将数据缩放到 [0,1] 区间,公式是(x - 最小值)/(最大值 - 最小值)。
  2. 零 - 均值规范化:用 StandardScaler,使数据均值为 0、方差为 1,公式是(x - 均值)/ 标准差。
  3. 小数定标规范化:通过移动小数点,将数据映射到 [-1,1] 之间。

2. 数值特征的二值化和离散化

  1. 二值化:用 Binarizer 类,按阈值将数据转为 0 或 1,比如阈值 3000,大于 3000 为 1,否则为 0。
  2. 离散化:将连续值分成区间。等宽离散化用 cut () 函数,按固定宽度分箱;等频离散化用 qcut () 函数,按数据频率分箱,每个区间包含大致相同数量的数据。

3. 标称特征的数值化

因为算法通常处理数值,所以要把标称特征(如 “天气”)转为数值:

  1. 独热编码:用 OneHotEncoder 或 get_dummies (),将每个类别转为一个二元特征,比如 “晴天”“雨天”“阴天” 会变成三个 0-1 特征。
  2. 标签编码:用 LabelEncoder,给每个类别编号,比如 “晴天 = 0”“阴天 = 1”“雨天 = 2”,避免维度爆炸,但可能引入不必要的顺序关系。

四、数据规约

当数据规模过大时,会影响挖掘效率,数据规约就是在保持数据分布的前提下,降低数据规模。

1. 样本规约(抽样)

  1. 简单随机抽样:用 sample () 函数,随机选取部分样本。
  2. 分层抽样:用 StratifiedShuffleSplit,先按类别分层,再每层随机抽样,保证类别比例不变,适合不平衡数据。
  3. 聚类抽样:先将数据聚类成簇,再从簇中抽样,不需事先知道类别。

2. 维度规约

也就是降维,减少特征数量,常用方法有 PCA(主成分分析)、SVD(奇异值分解)等线性方法,以及 Kernel PCA 等非线性方法。

3. 数据压缩

分无损压缩(如熵编码,可完全重建原始数据)和有损压缩(如小波压缩,近似重建),维度和样本规约也可视为特殊压缩。

总结

数据预处理是数据挖掘的基础,从集成多源数据,到清洗脏数据,再到变换数据格式,最后规约数据规模,每一步都影响着后续模型的效果。

http://www.dtcms.com/a/277546.html

相关文章:

  • 基于requests_html的爬虫实战
  • UE5多人MOBA+GAS 20、添加眩晕
  • 基于Flink的实时开发平台-Dinky
  • 基于Leaflet调用天地图在线API的多层级地名检索实战
  • LeetCode第 458 场周赛题解
  • 复习笔记 35
  • PHP语法高级篇(二):文件处理
  • c++ thread_local
  • Java求职面试:从Spring到微服务的全面挑战
  • 牛客周赛 Round 100
  • Android事件分发机制完整总结
  • CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司为 Cortex-M 系列处理器
  • 互联网大厂Java面试:从Spring Boot到微服务的场景应用
  • 2024CVPR:Question Aware Vision Transformer for Multimodal Reasoning介绍
  • 考研复习-数据结构-第六章-图
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • git实操
  • HTML 标题标签
  • 香港理工大学实验室定时预约
  • 【windows办公小助手】快速搜索文件及文件所处目录everything
  • 内存对齐与缓存优化:从硬件原理到代码实战
  • 前端进阶之路-从传统前端到VUE-JS(第五期-路由应用)
  • 通信网络编程5.0——JAVA
  • 新手向:使用Python从PDF中高效提取结构化文本
  • LeetCode经典题解:21、合并两个有序链表
  • 【基础算法】倍增
  • Qt:编译qsqlmysql.dll
  • React强大且灵活hooks库——ahooks入门实践之常用场景hook
  • NoSQL 介绍
  • day052-ansible handler、roles与优化