聊天視窗

數據科學之路:從基礎到實務應用 - 第 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% 在模型。透過系統化的流程與自動化工具,可大幅提升效率與模型穩定度。 --- **下一章**:機器學習模型實作——從線性模型到樹模型、深度學習。