数据挖掘 part_2

5 mins.5.4k911

数据预处理是数据挖掘的关键步骤,直接决定后续分析和模型构建的成败。高质量的数据是洞察和决策的基础,而数据预处理的核心任务就是从原始数据中提取、清洗、转换和优化有用的信息。以下将从理解数据、数据清洗、数据转换、数据降维和特征工程五个方面进行详细阐述。


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
      # 处理缺失值
      # 方法1:删除含缺失值的样本
      data_cleaned = data.dropna()

      # 方法2:用均值填充(数值型数据)
      data['age'] = data['age'].fillna(data['age'].mean())

      # 方法3:用预测模型填充
      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
      # 方法1:分箱平滑
      data['income_binned'] = pd.qcut(data['income'], q=4)

      # 方法2:使用聚类方法检测异常值
      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

2.2 数据转换 (Data Transformation)

数据转换旨在使数据适合分析,方法包括:

  • 归一化 (Normalisation):
    • Min-Max归一化:将数据缩放到指定范围。
    • Z-Score归一化:标准化为均值0,方差1。
    • 小数标度归一化:按数据的数量级缩放。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      from sklearn.preprocessing import MinMaxScaler, StandardScaler

      # Min-Max归一化
      scaler_minmax = MinMaxScaler()
      data[['income']] = scaler_minmax.fit_transform(data[['income']])

      # Z-Score标准化
      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的核心思想是寻找数据中的主成分(Principal Components),这些主成分是数据方差最大的方向。主成分的几个重要特性包括:

        • 主成分是数据在新坐标系下的线性组合。
        • 主成分之间是正交的,表示它们彼此无关。
        • 主成分按照数据方差的大小排序,前几个主成分包含数据中最主要的信息。
      • PCA步骤

        • PCA对数据的尺度非常敏感,因此在降维前需要将数据标准化

        • 计算协方差矩阵

        • 对协方差矩阵 𝐶 进行特征值分解,得到特征值和特征向量:

          Cv=λv

          • 特征值( 𝜆 ):表示每个主成分方向上的数据方差。
          • 特征向量( 𝑣 ):表示主成分的方向。
        • 根据特征值的大小选择前 𝑘 个主成分,构造投影矩阵

        • 将数据投影到选定的主成分空间

      • 注意事项

        • 标准化是必要的
        • 降维会丢失部分信息,因此需要根据累计方差贡献率(Explained Variance Ratio)决定保留的主成分数量。一般选择使累计方差贡献率达到90%以上的主成分。
        • PCA将特征转化为线性组合,虽然在数学上减少了维度,但新特征可能无法直接解释物理意义。
        • 异常值可能显著影响协方差矩阵,因此在使用PCA之前应先处理异常值。
        • 为确保协方差矩阵的稳定性,样本量应大于特征数(即 𝑛 > p)
        • PCA假设数据的主成分是线性组合。如果数据具有显著的非线性关系,可以考虑其他降维方法,如t-SNE或UMAP。
  • 数值简化

    • 数值简化通过减少数据量来提高训练性能,方法通常比较简单,其主要思想是通过选择替代的、更小形式的数据表示更多数据:
      • 参数方法:
        • 假设数据符合某种分布(比如线性或对数等),对该分布进行拟合,然后只保存拟合后模型的参数
      • 非参数方法:
        • 采样:对数据进行聚类分析,然后在每个聚类中保留一定比例的样本
        • 直方图分析

数据泄露风险提示:

  • 问题:在降维时使用了目标变量的信息。
  • 解决方法:仅在训练集上进行特征选择或降维然后应用在测试集上,如用训练集进行PCA,并将训练集上的PCA规则应用在测试集上。

2.4 特征工程 (Feature Engineering)

特征工程通过构造新特征提升模型性能。例如:

  • 用户行为分析
    • 登录时间、设备类型。
  • 交易行为分析
    • 购买频率、金额。

数据泄露风险提示:

  • 问题:构造特征时使用了未来的信息。
  • 解决方法:确保特征仅基于训练集的历史数据构造。

2.5 对不平衡数据集的处理

对于不平衡数据集的处理其实并不严格属于数据预处理的部分,但由于同样涉及到数据泄露的问题,因此在这里详细介绍一下。

在机器学习任务中,不平衡数据集是一个常见问题,特别是在分类问题中。当某些类别的样本数量远远多于其他类别时,模型往往会倾向于预测多数类,导致对少数类的识别能力较差。这种情况可能导致模型在整体准确率较高的情况下,忽略关键类别,从而无法满足实际需求。

不平衡数据集会导致模型更关注多数类,忽略少数类。例如,在一个疾病诊断系统中,如果患病样本仅占1%,模型可能简单地预测“无病”以获得99%的准确率,但实际意义有限。在不平衡数据集上,使用准确率作为评价指标可能掩盖模型对少数类的低识别能力。需要使用更合适的指标(如F1分数、AUC-ROC)来全面评估模型性能。

处理方法:

  • 数据层面的方法:
    • 过采样(Oversampling):通过增加少数类样本的数量来平衡数据集的类别分布。常用的方法:
      • SMOTE(Synthetic Minority Oversampling Technique):通过插值的方法生成新的少数类样本,而不是简单复制已有样本。
    • 欠采样(Undersampling):通过减少多数类样本的数量来平衡数据集的类别分布。
    • 数据增强:通过旋转、翻转、噪声添加等方法,对少数类样本进行数据增强,从而扩大少数类样本的分布范围。常见于图像处理或语言处理。
  • 算法层面的方法:
    • 在模型训练时为少数类赋予更高的权重,使其对损失函数的贡献更大。许多机器学习算法(如SVM、逻辑回归)和深度学习框架(如PyTorch、TensorFlow)都支持权重调整。

数据泄露风险提示:

  • 问题:测试集数据失真。
  • 解决方法:在进行过采样或欠采样时,应仅在训练集上进行,避免测试集信息泄露。在数据划分时,应确保训练集和测试集中的类别比例一致,以避免测试结果受到数据分布变化的影响。

数据预处理的核心在于顺序正确、操作规范,并避免数据泄露。以下是关键点:

  • 顺序:探索 -> 清洗 -> 转换 -> 降维 -> 特征工程。
  • 泄露规避:所有操作必须基于训练集,测试集仅作为验证用途。
  • 代码模块化:将每个预处理步骤封装为函数,确保流程清晰。

Previous

  • 数据挖掘

      数据挖掘 part_3

      本章介绍 KNN(k-最近邻)和决策树的原理、关键参数以及优缺点,重点展示相关的数学公式,以便深入理解其工作机制。 1. KNN (k-Nearest Neig...

    • Next

    • 随笔

        记厦门岛夜游

        离开厦门前的临时起意,并不顺利的环岛夜骑,险象环生的高崎机场,记录两名大学生在夏至第二天夜晚的精彩冒险以及不为人知的秘密。 本来是厦门临走前的晚上,和A去SM...

      • Comments

        What do you think?
        • 1
        • 0
        • 0
        • 0
        • 0
        • 0
        1 Comments
        • Latest
        • Oldest
        • Hottest
        Xof2024-12-29

        味道很好,工作人员态度也很认真,非常喜欢

        Powered by Waline v2.15.8
        感谢您阅读: 「数据挖掘 part_2 | Thanafox's Blog」