根据你提供的字幕文本,我为你整理了这份详细的课程笔记,并按照时间轴添加了书签,方便你复习和定位。
---
## 📚 课程笔记:机器学习基础与项目实战(第二讲)—— 数据预处理
### 🎯 课程概述 [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]
- **核心思想**:数据预处理是机器学习项目的第一步,也是至关重要的一步,它直接影响模型的性能。
- **三大操作**:数据清洗、数据转换、数据压缩,共同确保模型能高效、准确地从数据中学习。
- **比喻**:**“就像烹饪前需要清洗食材一样”**,数据预处理就是去除数据中的无用信息,为模型“烹饪”出一道美味佳肴。