【机器学习 数据预处理】数据预处理与数据转换、数据清洗、数据压缩(附:代码 课
湛蓝的泪
2026年03月20日 19:03

根据你提供的字幕文本,我为你整理了这份详细的课程笔记,并按照时间轴添加了书签,方便你复习和定位。

---

## 📚 课程笔记:机器学习基础与项目实战(第二讲)—— 数据预处理

### 🎯 课程概述 [00:00:00,400 - 00:00:09,240]

- **课程主题**:机器学习基础与项目实战(第二讲)

- **核心内容**:数据预处理,分为四个部分讲解。

---

### 1️⃣ 数据预处理的意义 [00:00:09,240 - 00:00:26,970]

#### 🧠 核心观点:为什么需要数据预处理?

- **机器学习的本质**:模型从训练数据中学习规律,然后在测试数据上进行推理。**数据的质量直接影响模型的性能和效果。**

- **现实数据的三大问题**:

  1. **数据重复** [00:00:57,550 - 00:01:33,030]

    - **表现**:同一条数据被统计多次。

    - **危害**:模型会过多关注重复数据,忽略其他样本。

  2. **数据杂乱(异常值)** [00:01:34,400 - 00:02:01,860]

    - **表现**:数据中存在不合逻辑的值(如年龄120岁、收入-5000元、性别为“其他”)。

    - **危害**:干扰模型学习。

  3. **数据不完整(缺失值)** [00:02:01,860 - 00:02:28,910]

    - **表现**:某些样本的特定字段没有数据(如漏填年龄)。

    - **危害**:模型无法从缺失数据中学习。

#### 📊 另一种分类:数据本身问题 vs. 模型兼容性问题 [00:03:02,090 - 00:05:41,600]

- **数据的固有问题(必须处理)**:

  - **重复数据** -> **数据清洗**(删除)。

  - **异常值** -> **数据清洗**(修正或删除)。

  - **缺失值** -> **数据清洗**(填充或删除)。

- **数据与模型的兼容性问题(建议处理)**:

  - **数据格式不一致** [00:03:08,570 - 00:03:52,610]:

    - **表现**:同一列数据混合了数值(如35)和字符串(如“30”、“4万”)。

    - **危害**:模型无法直接处理非数值型数据。

  - **数据偏斜(样本不均衡)** [00:03:55,410 - 00:04:29,650]:

    - **表现**:某个类别的样本过多(如男性800,女性200)。

    - **危害**:模型会偏向多数类,忽略少数类的表现。

  - **数据冗余(特征冗余)** [00:04:38,130 - 00:05:05,460]:

    - **表现**:特征之间存在强相关性(如“身高”、“体重”和“BMI”)。

    - **危害**:模型学习到重复信息,增加计算复杂度。

#### 💡 数据预处理的三大核心任务 [00:06:10,130 - 00:07:15,790]

1. **数据清洗**:处理数据本身的“脏”问题(重复、缺失、异常)。

2. **数据转换**:将数据变成模型“能吃”的格式(如文本转数值、归一化)。

3. **数据压缩**:减少数据量或维度,提升效率、防止过拟合。

---

### 2️⃣ 数据清洗 [00:07:21,060 - 00:19:13,400]

#### 🎯 目标:提高数据质量,提升模型性能,简化训练过程。

#### 🧹 三大基本任务

1. **重复值删除** [00:10:02,960 - 00:11:18,909]

  - **操作**:删除数据集中完全相同的样本。

  - **示例**:学生信息表中“李四”的记录出现两次,删除其中一条。

2. **缺失值处理** [00:11:21,750 - 00:16:42,829]

  - **操作方式**:

    - **① 直接删除** [00:12:32,240 - 00:12:36,760]:删除含缺失值的行或列(适合缺失值极少的情况)。

    - **② 特殊值填充** [00:12:47,670 - 00:13:12,990]:用一个特殊值(如 -1 或 "N/A")标识缺失(实际应用较少)。

    - **③ 统计量填充** [00:13:12,990 - 00:13:46,460]:**(最常用)** 用平均值、中位数或众数来填充缺失值。例如,用所有学生的平均年龄填充某同学的缺失年龄。

    - **④ 模型预测填充** [00:13:52,340 - 00:16:04,800]:用其他特征作为输入,训练一个模型来预测缺失值(更复杂但更精确)。

3. **异常值处理** [00:16:45,189 - 00:19:10,880]

  - **定义**:明显偏离正常范围的数据点。

  - **检测**:使用统计学方法,例如计算 **Z-Score**(得分 - 平均值)/ 标准差。Z-Score 绝对值过大(如 > 3)的数据点被视为异常值。

  - **处理**:

    - **直接删除**异常值。

    - **用合理值替换**,如用最大值、最小值或平均值进行填充。

---

### 3️⃣ 数据转换 [00:19:14,580 - 00:26:23,700]

#### 🎯 目标:将数据转换为算法可接受的格式,并改善数据分布。

#### 🔄 常见转换类型

1. **类别数据编码** [00:19:50,810 - 00:22:10,800]

  - **问题**:模型无法处理“哈士奇”、“阿拉斯加”等文本标签,且不能简单用1、2、3编码(会引入不存在的大小关系)。

  - **解决方案:独热编码**:用N维向量表示N个类别,每个向量只有一个维度为1,其余为0。例如:

    - 哈士奇 -> [1, 0, 0]

    - 阿拉斯加 -> [0, 1, 0]

    - 萨摩耶 -> [0, 0, 1]

  - **影响**:会增加数据的维度。

2. **数值数据标准化/归一化** [00:23:51,520 - 00:24:52,710]

  - **目的**:消除不同特征之间量纲的影响,使数据具有可比性。

  - **Min-Max 标准化**:将数据映射到 [0, 1] 区间。

  - **Z-Score 标准化**:将数据转换为均值为0、标准差为1的标准正态分布。

3. **数据离散化** [00:23:55,300 - 00:24:47,959]

  - **目的**:将连续的数值划分为几个区间,将区间映射为离散值,使分布更均匀。

4. **对数变换** [00:24:52,710 - 00:26:14,160]

  - **目的**:处理**长尾分布**数据。通过对数变换,可以将长尾分布(偏态)转换为更接近正态分布(模型更易处理)的分布。

---

### 4️⃣ 数据压缩 [00:26:23,700 - 00:28:15,610]

#### 🎯 目标:降低数据维度,减少计算量,防止过拟合。

#### 🔧 两种常用方法

1. **主成分分析** [00:27:16,750 - 00:27:28,410]

  - **原理**:无监督降维。找到数据中**方差最大**的正交投影方向,将原始高维数据投影到低维空间,尽可能保留原始信息。

2. **线性判别分析** [00:27:28,410 - 00:27:46,140]

  - **原理**:有监督降维。找到一个投影方向,使得投影后不同类别的样本**类间差异最大化**,同类样本的**类内差异最小化**,同时降低维度。

---

### 5️⃣ 代码实战 (Python) [00:28:40,000 - 00:44:23,870]

#### 🛠️ 工具:Pandas, Scikit-learn, NumPy

#### 1. 重复值删除

- **创建DataFrame**:使用 `pd.DataFrame({列名: [值列表]})`,注意是一列一列地输入数据。

- **检测与删除**:

  - `data.duplicated()`:返回布尔序列,标识重复行。

  - `data.drop_duplicates(subset=['学号'], keep='first', inplace=True)`:根据“学号”字段删除重复数据,保留第一次出现的行。

#### 2. 缺失值处理

- **创建含NaN的数据**:直接传入 `None` 或 `np.nan`。

- **删除缺失值**:

  - `data.dropna(inplace=True)`:直接删除所有包含缺失值的行。

- **填充缺失值**:

  - **固定值填充**:`data.fillna(170)`:用固定值(如170)填充所有NaN。

  - **前向/后向填充**:`data.fillna(method='ffill')`:用前一行的值填充;`bfill` 用后一行的值填充。

  - **平均值填充**:`data['身高'].fillna(data['身高'].mean())`:用该列的平均值填充。

#### 3. 异常值处理

- **检测**:`data[data['身高'] > 200]`:筛选出异常值。

- **处理**:用正常值的最大值替换异常值。

  - `idx = data['身高'] < 200`:获取正常值的布尔索引。

  - `max_normal = data.loc[idx, '身高'].max()`:计算正常值中的最大值。

  - `data.loc[data['身高'] > 200, '身高'] = max_normal`:将异常值替换为正常值的最大值。

#### 4. 数据归一化

- **Min-Max 归一化**:

  ```python

  from sklearn.preprocessing import MinMaxScaler

  scaler = MinMaxScaler()

  X_scaled = scaler.fit_transform(X)

  ```

- **Z-Score 归一化**:

  ```python

  from sklearn.preprocessing import StandardScaler

  scaler = StandardScaler()

  X_scaled = scaler.fit_transform(X)

  ```

---

### ✨ 课程总结 [00:44:23,870 - 00:44:53,300]

- **核心思想**:数据预处理是机器学习项目的第一步,也是至关重要的一步,它直接影响模型的性能。

- **三大操作**:数据清洗、数据转换、数据压缩,共同确保模型能高效、准确地从数据中学习。

- **比喻**:**“就像烹饪前需要清洗食材一样”**,数据预处理就是去除数据中的无用信息,为模型“烹饪”出一道美味佳肴。