返回目錄
A
洞察決策:大數據分析實務手冊 - 第 3 章
第三章:數據清洗與特徵工程
發布於 2026-02-28 18:05
# 第三章:數據清洗與特徵工程
> 本章將帶領你從雜亂的原始資料,逐步轉化為乾淨且可用的數據集,並深入探討特徵構造與選擇的關鍵技術。\n
> **關鍵字**:缺失值處理、離群點偵測、資料標準化、特徵擴張、特徵選擇
---
## 3.1 前言
在大多數機器學習專案中,數據的質量決定了模型的上限。即使最先進的演算法,若以「劣質」的資料作為訓練,亦可能產生誤導性的洞察。清洗與特徵工程不只是技術流程,更是一門「數據故事講述」的藝術。\n
> 典型例子:一家零售企業原始訂單資料中,客戶行為欄位「購買時間」包含多種格式(YYYY-MM-DD、MM/DD/YYYY、Unix timestamp)。若直接使用,模型將無法識別時間序列趨勢,甚至可能導致訓練失敗。
---
## 3.2 為何清洗重要
| 影響 | 具體說明 |
|------|----------|
| **模型準確度** | 噪聲數據會降低訓練效果,讓模型學到錯誤的關係。
| **可解釋性** | 噪聲或錯誤值會破壞特徵間的邏輯關係,影響解釋。
| **成本效益** | 清洗不當會導致後續調試成本飆升,甚至浪費算力。
| **合規風險** | 無效或重複資料可能違反數據保護法,導致罰款。
---
## 3.3 清洗步驟概述
1. **資料審查** – 檢視資料結構、缺失分佈、離群點。\n2. **缺失值處理** – 補值或刪除。\n3. **重複值處理** – 去重或聚合。\n4. **格式統一** – 時間、貨幣、文字大小寫。\n5. **離群點偵測** – IQR、Z-score、Isolation Forest 等。\n6. **資料轉換** – 標準化、正規化、One‑Hot、Label Encoding。\n7. **驗證** – 交叉驗證或視覺化確認。
### 3.3.1 缺失值處理技巧
| 方法 | 適用場景 | 優缺點 |
|------|----------|--------|
| 刪除(行/列) | 缺失比例極低 | 失去資訊,可能導致樣本偏差 |
| 均值/中位數補值 | 連續數值 | 無法保留分布特徵 |
| 預測模型補值 | 多樣化特徵 | 增加計算成本,需防止資料洩露 |
| 迭代填補(IterativeImputer) | 高維數據 | 計算複雜,需調參 |
### 3.3.2 離群點偵測實務
python
from sklearn.ensemble import IsolationForest
import pandas as pd
X = df.select_dtypes(include=[float, int])
iso = IsolationForest(contamination=0.05, random_state=42)
mask = iso.fit_predict(X) == 1 # 1 正常, -1 離群
X_clean = X[mask]
> **注意**:在金融風險場景,離群點往往代表重要訊號,過度剔除可能錯失關鍵機會。
---
## 3.4 常見清洗問題與解決方案
| 問題 | 原因 | 解決方案 |
|------|------|----------|
| **多格式時間** | 不同系統採用不同時間標準 | 使用 `pd.to_datetime()` + `infer_datetime_format=True` |
| **文字多樣化** | 例如 “USA” vs “United States” | 建立映射表或使用 `fuzzywuzzy` 進行相似度匹配 |
| **數值單位混用** | 例如 “kg” 與 “lbs” | 先統一單位,使用 `pint` 或手寫轉換函式 |
| **重複訂單** | 交易系統偶爾重複提交 | 依賴唯一 ID 或組合鍵去重 |
---
## 3.5 特徵工程概念
> **特徵**:模型所學習的「輸入」。\n> **特徵工程**:創造、轉換、選擇有助於模型表現的特徵。\n> **可解釋性**:特徵應保持業務可理解性,避免過度複雜化。
### 3.5.1 特徵擴張方法
| 方法 | 說明 |
|------|------|
| 多項式擴張 | `PolynomialFeatures(degree=2)` 產生交互項 |
| 滑動窗口 | 時間序列的過去 N 天值 |
| 文字向量化 | TF‑IDF, Word2Vec, SentenceEmbedding |
| 統計聚合 | 平均、最大、最小、變異數 |
| 主成份分析(PCA) | 降維,保留解釋力 |
### 3.5.2 特徵選擇技術
| 方法 | 概念 |
|------|------|
| 方差過濾 | 去除變異度極低特徵 |
| 相關係數 | `corr()` 低相關特徵去除 |
| L1 正則化 | `Lasso` 或 `ElasticNet` 內部選擇 |
| 機器學習重要度 | RandomForest、XGBoost 等內建重要度 |
| Recursive Feature Elimination | RFE/ RFECV |
---
## 3.6 實戰案例:零售客戶流失預測
### 3.6.1 資料來源
- 交易歷史表(結構化)
- 客戶服務紀錄(半結構化)
- 產品評論(非結構化文字)
- 客戶基本資料(個人資訊)
### 3.6.2 清洗流程
1. **時間標準化**:所有時間欄位轉為 UTC。\n2. **缺失處理**:客戶年齡缺失時使用中位數填補。\n3. **重複訂單**:依 `order_id` 去重。\n4. **離群點**:交易金額>3×IQR 剔除。\n5. **文字處理**:使用 `TfidfVectorizer` 轉化評論。
### 3.6.3 特徵工程
- **交易頻率**:過去30天購買次數。\n- **客戶壽命**:從第一筆交易到最後一次的天數。\n- **平均訂單價**:總金額 / 次數。\n- **情感分數**:評論情感傾向(正負)使用 VADER。\n- **產品多樣性**:不同品項數量。\n
### 3.6.4 模型與評估
- 使用 LightGBM:訓練集 70%,驗證集 30%。\n- 評估指標:AUC-ROC、F1-score。\n- 重要特徵:客戶壽命、平均訂單價、情感分數。
### 3.6.5 部署考量
- **資料管道**:每週批次 ETL,將特徵表寫入 ClickHouse。\n- **模型監控**:AUC 漸降 >5% 時觸發 retraining。\n- **合規**:刪除 PII,僅保留匿名客戶 ID。
---
## 3.7 工具與框架快速指南
| 類別 | 工具 | 特色 |
|------|------|------|
| **ETL** | Apache NiFi、Airflow、dbt | 視覺化流、排程、版本控制 |
| **資料清洗** | Pandas、Dask、Polars | 大數據、並行處理 |
| **特徵工程** | Featuretools、tsfresh、scikit‑learn | 自動化特徵構造、時序特徵 |
| **模型訓練** | XGBoost、LightGBM、PyTorch | 高效、可擴展 |
| **部署** | MLflow、Kubeflow、SageMaker | 實驗管理、CI/CD |
---
## 3.8 小結
1. **清洗是基礎**:資料的完整性與一致性直接決定模型的可行性。\n2. **特徵是關鍵**:合理的特徵構造與選擇能將模型性能推向極致。\n3. **工具選型與流程化**:自動化與可追溯性是商業化的必要條件。\n4. **合規與倫理**:數據治理同樣適用於清洗與特徵工程,確保合規與透明。
---
## 3.9 小測
1. 在清洗過程中,若資料集中的 `customer_id` 同時存在 `NaN` 與重複值,最佳做法是?
- A) 刪除所有包含 NaN 的列
- B) 先填補 NaN,再去重
- C) 直接保留重複,忽略 NaN
- D) 先去重,再填補 NaN
2. 當你使用 `IsolationForest` 進行離群點偵測時,若想更保守,應調整哪個參數?
- A) `n_estimators`
- B) `contamination`
- C) `max_samples`
- D) `bootstrap`
---
## 3.10 下一章預告
第四章將聚焦於「機器學習模型訓練與驗證」——從交叉驗證到模型調參,再到可解釋性與公平性,帶你實戰掌握模型構建與優化。