数据预处理
在日常生产生活中,我们收集到的数据往往质量不高,比如会出现像 “账号余额为 - 100” 这样的异常值,或者存在缺失值,甚至有 “年龄 2 岁却有研究生学历” 这种不可能的组合。而数据预处理技术,就是为了改善这些数据的质量,让它们更适合后续的挖掘任务,从而提升挖掘结果的准确率和效率。接下来,我们就从四个核心部分展开学习。
一、数据集成
首先,我们来看数据集成。数据集成指的是将来自多个不同数据源的数据,组合到一个集成的数据存储中,并提供统一的数据视图。这些数据源可能是多维数据集、数据库或者数据文件等。
在这个过程中,我们会遇到几个典型问题:
- 同名异义:比如员工信息表 A 里的 “ID” 是员工编号,而交易记录表 B 里的 “ID” 是订单编号,虽然名字一样,但描述的是不同实体。
- 异名同义:像数据表 A 的 “sales_dt” 和数据表 B 的 “sales_date”,其实都是指销售日期,只是名字不同。
- 单位不统一:比如一个表用国际单位,另一个表用我国传统计量单位描述同一个实体。
- 颗粒度不统一:比如表 A 是每天每个城市的数据,表 B 是每月每个省份的数据,两者的细化程度不同。
解决了实体识别问题后,我们就可以进行数据合并了。Python 提供了多种函数来实现,主要有这三种:
- 数据堆叠:用 Pandas 的 concat () 函数,按轴拼接两个 DataFrame。它的基本语法是concat(objs, axis = 0, join = 'outer', ignore_index = False)。当 axis=0 时,是行堆叠,把两个表上下拼接;axis=1 时,是列堆叠,左右拼接。就像 PPT 里的例子,表 1 和表 2 通过不同的 axis 参数,会得到不同的堆叠结果。
- 数据增补:用 append () 函数,实现纵向合并,把一个数据框添加到另一个的尾部,相当于 axis=0 的堆叠补充。
- 数据合并:用 merge () 函数,类似数据库的连接方式,支持左连接、右连接、内连接和外连接,通过指定连接键(on 参数等)来合并数据。
二、数据清洗
数据清洗是预处理中非常关键的一步,目的是处理重复值、缺失值、异常值等问题,提高数据质量。
1. 重复值处理
重复值分两种:
- 记录重复:多行数据描述同一个实体。我们可以用 duplicated () 函数检测,它返回布尔值表示是否重复;用 drop_duplicates () 函数删除重复记录,比如按 “姓名” 去重,保留第一条记录。
- 特征重复:也就是特征冗余,一个特征的信息能从其他特征得到。标称特征可用卡方系数检测,数值特征用相关系数检测,比如两个高度相关的数值特征,可能存在冗余。
2. 缺失值处理
数据缺失很常见,可能是存储遗漏、设备故障等原因导致。处理方法有:
- 直接删除:用 dropna () 函数,删除含缺失值的行或列。但这种方法会丢失信息,通常在缺失率超过 70%-75% 时使用。
- 替换或插补:用 fillna () 函数,可选均值、中位数、众数替换,或用固定值(如 0、'Unknown'),也可用临近值。比如对 “数学” 成绩的缺失值,用所有非缺失成绩的均值或中位数填充。
3. 异常值检测和处理
异常值是偏离多数数据的值,可能因录入错误、测量错误等产生,会影响模型准确性。检测方法有:
- 3σ 原则:假设数据服从正态分布,99.73% 的数据在 (μ-3σ, μ+3σ) 范围内,超出的视为异常值。
- 箱线图分析:计算 IQR(四分位距 = Q3-Q1),小于 Q1-1.5IQR 或大于 Q3+1.5IQR 的值为异常值,箱线图中会以孤立点显示。
- 聚类方法:比如 DBSCAN 算法,异常值在低密度区域,不构成簇。
处理异常值的方法:数量少时直接删除;用缺失值处理方法替换;若异常值有特殊意义,可咨询业务人员后决定是否保留。
三、数据变换
数据变换是把数据转换成适合算法的形式,常见操作有:
1. 数据规范化
消除不同特征的单位和取值范围差异,常用三种方法:
- 最小 - 最大规范化:用 MinMaxScaler,将数据缩放到 [0,1] 区间,公式是(x - 最小值)/(最大值 - 最小值)。
- 零 - 均值规范化:用 StandardScaler,使数据均值为 0、方差为 1,公式是(x - 均值)/ 标准差。
- 小数定标规范化:通过移动小数点,将数据映射到 [-1,1] 之间。
2. 数值特征的二值化和离散化
- 二值化:用 Binarizer 类,按阈值将数据转为 0 或 1,比如阈值 3000,大于 3000 为 1,否则为 0。
- 离散化:将连续值分成区间。等宽离散化用 cut () 函数,按固定宽度分箱;等频离散化用 qcut () 函数,按数据频率分箱,每个区间包含大致相同数量的数据。
3. 标称特征的数值化
因为算法通常处理数值,所以要把标称特征(如 “天气”)转为数值:
- 独热编码:用 OneHotEncoder 或 get_dummies (),将每个类别转为一个二元特征,比如 “晴天”“雨天”“阴天” 会变成三个 0-1 特征。
- 标签编码:用 LabelEncoder,给每个类别编号,比如 “晴天 = 0”“阴天 = 1”“雨天 = 2”,避免维度爆炸,但可能引入不必要的顺序关系。
四、数据规约
当数据规模过大时,会影响挖掘效率,数据规约就是在保持数据分布的前提下,降低数据规模。
1. 样本规约(抽样)
- 简单随机抽样:用 sample () 函数,随机选取部分样本。
- 分层抽样:用 StratifiedShuffleSplit,先按类别分层,再每层随机抽样,保证类别比例不变,适合不平衡数据。
- 聚类抽样:先将数据聚类成簇,再从簇中抽样,不需事先知道类别。
2. 维度规约
也就是降维,减少特征数量,常用方法有 PCA(主成分分析)、SVD(奇异值分解)等线性方法,以及 Kernel PCA 等非线性方法。
3. 数据压缩
分无损压缩(如熵编码,可完全重建原始数据)和有损压缩(如小波压缩,近似重建),维度和样本规约也可视为特殊压缩。
总结
数据预处理是数据挖掘的基础,从集成多源数据,到清洗脏数据,再到变换数据格式,最后规约数据规模,每一步都影响着后续模型的效果。