返回目錄
A
數據科學之路:從基礎到實務應用 - 第 3 章
第三章 資料前處理:將原始資料轉化為模型友好結構
發布於 2026-02-26 16:46
# 第三章 資料前處理:將原始資料轉化為模型友好結構
> **為什麼前處理是關鍵?**\n\n在資料科學的管道中,前處理是連接「資料」與「模型」的橋梁。若資料不乾淨、格式不統一、或缺少關鍵特徵,模型的表現不僅會被打折,甚至可能產生偏差與不合理的預測。掌握前處理技巧,就是掌握了模型成功的關鍵基石。
---
## 3.1 資料清洗
| 步驟 | 說明 | 常用工具 |
|------|------|----------|
| 重複值剔除 | `drop_duplicates()` | pandas / dplyr |
| 資料類型轉換 | `astype()` | pandas / type() |
| 字串標準化 | `str.strip()` / `str.lower()` | pandas / stringr |
| 破損檔案修復 | `open()` + `try/except` | Python 標準庫 |
> **實戰示例**:使用 pandas 清洗銷售交易資料。
> python
> import pandas as pd
>
> df = pd.read_csv('sales.csv')
> df.drop_duplicates(inplace=True)
> df['date'] = pd.to_datetime(df['date'])
> df['product'] = df['product'].str.strip().str.lower()
>
## 3.2 資料轉換
### 3.2.1 結構化與非結構化資料結合
sql
SELECT s.id, s.amount, j.data ->> 'customer_id' AS cust_id
FROM sales s
JOIN json_table j ON s.json_id = j.id;
### 3.2.2 日期時間拆解
r
library(lubridate)
sales$year <- year(sales$timestamp)
sales$month <- month(sales$timestamp)
## 3.3 欠缺值處理
| 方法 | 何時適用 | 優點 | 缺點 |
|------|----------|------|------|
| 刪除 | 欠缺率 < 5% | 簡單快速 | 失去資訊 |
| 均值/中位數填補 | 數值型 | 保持分布 | 低方差 |
| KNN / MICE | 需要更高保真度 | 保留相關性 | 計算量大 |
> **提示**:對於關鍵變數,永遠先考慮使用 **MICE**(多重插補)或 **Hot‑Deck** 方法,避免資料失真。
## 3.4 類別編碼
| 編碼方式 | 適用場景 | Python 實作 |
|----------|----------|-------------|
| 數值編碼 | 低級別順序 | `LabelEncoder()` |
| One‑Hot | 無序類別 | `pd.get_dummies()` |
| Target / Ordinal | 目標變量相關 | `OrdinalEncoder()` |
python
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore')
encoded = enc.fit_transform(df[['category']])
## 3.5 正規化與標準化
| 方式 | 何時選擇 | 公式 |
|------|----------|------|
| Min‑Max | 需要 0-1 範圍 | \(x_{norm}=\frac{x-\min(x)}{\max(x)-\min(x)}\) |
| Z‑Score | 需要零均值、單位方差 | \(z=\frac{x-\mu}{\sigma}\) |
> **注意**:若資料中存在極端值,**RobustScaler**(以中位數為基準)更為安全。
## 3.6 特徵選擇
| 方法 | 主要思想 | 優缺點 |
|------|----------|--------|
| Filter | 相關性統計 | 簡單、可擴展 | 只考慮單一變數 |
| Wrapper | 模型評估 | 能捕捉交互作用 | 計算成本高 |
| Embedded | 內部正則化 | 同時進行學習 | 受限於模型類型 |
> **實戰**:使用 `SelectKBest` + `chi2` 進行特徵選擇。
> python
> from sklearn.feature_selection import SelectKBest, chi2
> selector = SelectKBest(chi2, k=10)
> X_new = selector.fit_transform(X, y)
>
## 3.7 特徵構造
| 构造技巧 | 示例 |
|-----------|------|
| 日期派生 | 年、季、周、工作日 |
| 文本統計 | 詞頻、TF‑IDF |
| 圖像統計 | 直方圖、顏色分佈 |
| 時間序列 | 滑動平均、差分 |
> **案例**:從「客戶評論」文本中提取情感分數,作為模型特徵。
> python
> from textblob import TextBlob
> df['sentiment'] = df['comment'].apply(lambda x: TextBlob(x).sentiment.polarity)
>
## 3.8 資料分割
| 分割方式 | 用途 |
|----------|------|
| 80/20 / 70/30 | 訓練 / 測試 |
| 交叉驗證 | 模型穩健性 |
| 時序分割 | 時間序列資料 |
> **小技巧**:在交叉驗證時使用 **StratifiedKFold**,確保各類別比例一致。
## 3.9 版本控制與文件化
| 為何需要 | 工具 |
|------------|------|
| 追蹤資料血統 | DVC、Git LFS |
| 記錄處理流程 | Airflow、Luigi |
| 可重現實驗 | Docker、conda、requirements.txt |
> **實務建議**:將每一次前處理腳本都納入 Git 分支,使用 **commit message** 描述「為什麼改變」與「改變內容」。
## 3.10 案例:零售銷售預測
1. **資料來源**:交易紀錄、商品目錄、天氣資料、節假日指標。
2. **前處理流程**:
* 交易表清洗、重複剔除、時間戳轉換。
* 商品表進行類別編碼與缺失值插補。
* 天氣資料與交易資料透過 **SQL JOIN** 合併。
* 生成「是否為節假日」特徵。
3. **特徵工程**:
* 滑動窗口 7 天銷售總量。
* 客戶人數分組指標。
* 商品類別熱度指數。
4. **模型選擇**:
* 隨機森林回歸:特徵重要性解釋。
* XGBoost:高效處理缺失值。
5. **評估**:
* MAE、RMSE、MAPE。
6. **部署**:
* 將模型封裝為 API,使用 Flask 或 FastAPI。
* 透過 Airflow 定時更新資料與重新訓練。
> **核心心得**:資料前處理是「資料科學成功的基石」。在實際工作中,往往花 70% 的時間在前處理,而 30% 在模型。透過系統化的流程與自動化工具,可大幅提升效率與模型穩定度。
---
**下一章**:機器學習模型實作——從線性模型到樹模型、深度學習。