数据预处理是数据挖掘的关键步骤,直接决定后续分析和模型构建的成败。高质量的数据是洞察和决策的基础,而数据预处理的核心任务就是从原始数据中提取、清洗、转换和优化有用的信息。以下将从理解数据、数据清洗、数据转换、数据降维和特征工程五个方面进行详细阐述。
1. 理解数据
1.1 数据对象 (Data Objects)
数据对象是数据的基本单元,代表实际生活中的某一实体。例如:
1.2 数据属性 (Data Attributes)
数据属性是描述数据对象的特征,常被称为特征 (features)、变量 (variables) 或维度 (dimensions)。例如:
1.3 属性类型 (Attribute Types)
属性类型决定了数据的性质和处理方法,分为以下两类:
定性属性 (Qualitative Attributes)
- 名义型 (Nominal):仅表示类别,无顺序关系。
- 示例:婚姻状态(单身、已婚)、职业(教师、医生)。
- 二元型 (Binary):仅有两个状态。
- 有序型 (Ordinal):具有顺序但间隔不确定。
- 示例:衣服尺码(小、中、大)、满意度(好、中、差)。
定量属性 (Quantitative Attributes)
- 区间型 (Interval-scaled):值之间的差异有意义,但无绝对零点。
- 比例型 (Ratio-scaled):具有绝对零点,可进行比例运算。
1.4 数据质量 (Data Quality)
数据质量直接影响分析结果的可靠性,评估维度包括:
- 准确性:数据是否正确。
- 完整性:是否存在缺失值。
- 一致性:同一数据是否冲突。
- 及时性:数据是否反映最新状态。
- 可信度:用户对数据的信任程度。
- 可解释性:数据是否易于理解。
1.5 数据探索 (Data Exploration)
数据探索是了解数据的第一步,这一步通常涉及统计学基础知识,需要结合业务知识和统计学知识对数据的分布情况进行基本的描述,对于部分简单问题,在这一步就可能得到预期的结果(比如:员工离职行为和对公司满意度之间存在较高的相关性)
常用方法包括:
- 统计总结:均值、标准差、分位数等。
- 数据可视化:
- 箱线图 (Box Plot):显示分布及异常值,通常以四分位点为界限。
- 直方图 (Histogram):展示单变量分布,用于观察在该变量上是否存在偏态或正态分布等。
- 散点图 (Scatter Plot):分析变量间关系。
- 相关分析:
- 数值型变量:皮尔逊相关系数。
- 分类变量:卡方检验。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
data = pd.read_csv("data.csv")
print(data.info()) print(data.describe())
sns.boxplot(data['age']) sns.histplot(data['income'], kde=True) plt.show()
|
数据泄露风险提示:
- 问题:在探索过程中直接查看目标变量的统计信息可能导致泄露。
- 解决方法:对训练集和测试集分别进行探索分析。
2. 数据预处理 (Data Preprocessing)
2.1 数据清洗 (Data Cleaning)
数据清洗是预处理的第一步,顺序通常是:处理缺失值 -> 处理异常值 -> 统一数据格式。
清洗数据是提高数据质量的重要环节,包括:
- 处理缺失值:
- 忽略含缺失值的元组。
- 手动填充或使用均值、中位数等自动填充。
- 使用预测模型(如决策树)填充。
1 2 3 4 5 6 7 8 9 10 11 12
|
data_cleaned = data.dropna()
data['age'] = data['age'].fillna(data['age'].mean())
from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='most_frequent') data[['gender']] = imputer.fit_transform(data[['gender']])
|
- 处理噪声数据:
- 回归分析:拟合模型去除异常值。
- 分箱平滑:按范围分组后取均值或中位数。
- 聚类分析:检测并去除异常值。
1 2 3 4 5 6 7 8
| data['income_binned'] = pd.qcut(data['income'], q=4)
from sklearn.cluster import DBSCAN outlier_model = DBSCAN(eps=3, min_samples=5) outliers = outlier_model.fit_predict(data[['age', 'income']]) data['is_outlier'] = outliers
|
数据转换旨在使数据适合分析,方法包括:
- 归一化 (Normalisation):
- Min-Max归一化:将数据缩放到指定范围。
- Z-Score归一化:标准化为均值0,方差1。
- 小数标度归一化:按数据的数量级缩放。
1 2 3 4 5 6 7 8 9
| from sklearn.preprocessing import MinMaxScaler, StandardScaler
scaler_minmax = MinMaxScaler() data[['income']] = scaler_minmax.fit_transform(data[['income']])
scaler_zscore = StandardScaler() data[['age']] = scaler_zscore.fit_transform(data[['age']])
|
- 离散化 (Discretisation):
- 分箱法:将数据分为若干区间。
- 决策树分析:基于分类规则离散化。
- 聚类分析:根据聚类结果离散化。
1 2 3 4 5 6 7
| data['age_binned'] = pd.cut(data['age'], bins=3, labels=["young", "middle", "old"])
from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier(max_depth=3) tree.fit(data[['age']], data['target'])
|
数据泄露风险提示:
- 问题:在整个数据集上拟合转换器(如 MinMaxScaler)会泄露测试集信息。
- 解决方法:在训练集上拟合转换器,并将其应用于测试集。
2.3 数据降维 (Data Reduction)
数据降维减少数据量,同时保留关键信息,这样做的目的是为了减少特征列以提高训练效率或降低解释难度:
维度简化:
数值简化
- 数值简化通过减少数据量来提高训练性能,方法通常比较简单,其主要思想是通过选择替代的、更小形式的数据表示更多数据:
- 参数方法:
- 假设数据符合某种分布(比如线性或对数等),对该分布进行拟合,然后只保存拟合后模型的参数
- 非参数方法:
- 采样:对数据进行聚类分析,然后在每个聚类中保留一定比例的样本
- 直方图分析
数据泄露风险提示:
- 问题:在降维时使用了目标变量的信息。
- 解决方法:仅在训练集上进行特征选择或降维然后应用在测试集上,如用训练集进行PCA,并将训练集上的PCA规则应用在测试集上。
2.4 特征工程 (Feature Engineering)
特征工程通过构造新特征提升模型性能。例如:
数据泄露风险提示:
- 问题:构造特征时使用了未来的信息。
- 解决方法:确保特征仅基于训练集的历史数据构造。
2.5 对不平衡数据集的处理
对于不平衡数据集的处理其实并不严格属于数据预处理的部分,但由于同样涉及到数据泄露的问题,因此在这里详细介绍一下。
在机器学习任务中,不平衡数据集是一个常见问题,特别是在分类问题中。当某些类别的样本数量远远多于其他类别时,模型往往会倾向于预测多数类,导致对少数类的识别能力较差。这种情况可能导致模型在整体准确率较高的情况下,忽略关键类别,从而无法满足实际需求。
不平衡数据集会导致模型更关注多数类,忽略少数类。例如,在一个疾病诊断系统中,如果患病样本仅占1%,模型可能简单地预测“无病”以获得99%的准确率,但实际意义有限。在不平衡数据集上,使用准确率作为评价指标可能掩盖模型对少数类的低识别能力。需要使用更合适的指标(如F1分数、AUC-ROC)来全面评估模型性能。
处理方法:
- 数据层面的方法:
- 过采样(Oversampling):通过增加少数类样本的数量来平衡数据集的类别分布。常用的方法:
- SMOTE(Synthetic Minority Oversampling Technique):通过插值的方法生成新的少数类样本,而不是简单复制已有样本。
- 欠采样(Undersampling):通过减少多数类样本的数量来平衡数据集的类别分布。
- 数据增强:通过旋转、翻转、噪声添加等方法,对少数类样本进行数据增强,从而扩大少数类样本的分布范围。常见于图像处理或语言处理。
- 算法层面的方法:
- 在模型训练时为少数类赋予更高的权重,使其对损失函数的贡献更大。许多机器学习算法(如SVM、逻辑回归)和深度学习框架(如PyTorch、TensorFlow)都支持权重调整。
数据泄露风险提示:
- 问题:测试集数据失真。
- 解决方法:在进行过采样或欠采样时,应仅在训练集上进行,避免测试集信息泄露。在数据划分时,应确保训练集和测试集中的类别比例一致,以避免测试结果受到数据分布变化的影响。
数据预处理的核心在于顺序正确、操作规范,并避免数据泄露。以下是关键点:
- 顺序:探索 -> 清洗 -> 转换 -> 降维 -> 特征工程。
- 泄露规避:所有操作必须基于训练集,测试集仅作为验证用途。
- 代码模块化:将每个预处理步骤封装为函数,确保流程清晰。
Comments
Preview:
味道很好,工作人员态度也很认真,非常喜欢