AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
12/100 第二週:資料處理與特徵工程
12. 缺失值處理(刪除、填補、插值) 🕳 用最適合的方法補缺值,避免 AI 做錯決策!
🕳
用最適合的方法補缺值,避免 AI 做錯決策! 🚀
缺失值 (Missing Values) 是機器學習中最常見的數據問題之一。如果不處理缺失值,AI 可能會:
• 學習錯誤模式,導致預測不準確
• 無法訓練模型,因為某些演算法無法處理 NaN (如 Scikit-learn)
• 影響特徵工程,導致特徵無效
今天,我們將學習 刪除、填補、插值 三種處理缺失值的方法,讓 AI 學得更準確! 💡
________________________________________
📌 2.1 為什麼數據會有缺失值?
缺失值可能來自於以下幾個原因:
✅ 人工錯誤:使用者未填寫完整表單
✅ 感測器故障:IoT 設備或測量儀器遺漏數據
✅ 資料合併問題:來自不同數據源的資料欄位不匹配
✅ 條件性遺漏:某些數據只適用於特定條件 (如男性不填寫懷孕次數)
📌 範例數據
python
import pandas as pd
import numpy as np
# 創建包含缺失值的數據集
data = {
"姓名": ["Alice", "Bob", "Charlie", "David", "Eve"],
"年齡": [25, np.nan, 30, 35, np.nan],
"收入": [50000, 60000, np.nan, 80000, 70000],
"城市": ["台北", np.nan, "台中", "高雄", "台北"]
}
df = pd.DataFrame(data)
print("原始數據:")
print(df)
輸出:
r
姓名 年齡 收入 城市
0 Alice 25.0 50000 台北
1 Bob NaN 60000 NaN
2 Charlie 30.0 NaN 台中
3 David 35.0 80000 高雄
4 Eve NaN 70000 台北
________________________________________
📌 2.2 缺失值處理方法
處理缺失值的方法主要有 刪除、填補、插值 三種方式,選擇哪種方法取決於數據的性質與應用場景。
🔹 1️⃣ 刪除缺失值 (Dropping Missing Values)
👉 適用於缺失值較少的情況,但如果缺失值過多,可能會導致數據不足。
📌 方法:
✅ 刪除含有 NaN 的整行 (dropna())
✅ 刪除含有 NaN 的整列 (dropna(axis=1))
📌 Python 實作
# 刪除含有缺失值的行
df_dropped_rows = df.dropna()
print("\n刪除含有 NaN 的行:")
print(df_dropped_rows)
# 刪除含有缺失值的列
df_dropped_columns = df.dropna(axis=1)
print("\n刪除含有 NaN 的列:")
print(df_dropped_columns)
📌 優缺點
在進行資料清理時,針對缺失值的處理方法有刪除行與刪除列兩種常見做法。刪除行的方式簡單且快速,適用於缺失值比例較低的情況,但若缺失值過多,可能會導致大量數據被刪除,影響分析效果。而刪除列則適合用於大部分數據缺失的特徵,能有效移除問題欄位,但同時也存在丟失關鍵資訊的風險。因此,在選擇這兩種方法時,需根據數據情況權衡利弊,以免對後續分析造成負面影響。
________________________________________
🔹 2️⃣ 填補缺失值 (Imputation)
👉 適用於缺失值較多,但仍希望保留數據的情況。
📌 方法:
✅ 使用固定數值填補 (fillna())
✅ 使用統計值填補 (均值/中位數/眾數)
✅ 使用其他列數據填補 (例如根據年齡段預測收入)
📌 Python 實作
# 使用固定值填補
df_filled_zero = df.fillna(0)
print("\n使用 0 填補缺失值:")
print(df_filled_zero)
# 使用均值填補
df["年齡"].fillna(df["年齡"].mean(), inplace=True)
df["收入"].fillna(df["收入"].median(), inplace=True) # 使用中位數填補
print("\n使用均值/中位數填補後:")
print(df)
# 使用眾數填補類別變數
df["城市"].fillna(df["城市"].mode()[0], inplace=True)
print("\n使用眾數填補類別變數:")
print(df)
📌 優缺點
方法 優點 缺點
固定值填補 適用於特定變數 (如 0 代表無數據) 可能產生偏差
均值/中位數填補 簡單且不會影響整體趨勢 可能影響變異性
眾數填補 適用於類別變數 (如城市) 當數據不均衡時可能不準確
________________________________________
🔹 3️⃣ 插值法 (Interpolation)
👉 適用於連續數據 (如時間序列) 的缺失值填補。
📌 方法:
✅ 線性插值 (interpolate(method='linear'))
✅ 多項式插值 (interpolate(method='polynomial', order=2))
✅ 時間序列插值 (interpolate(method='time'))
📌 Python 實作
# 創建時間序列數據
time_series_data = {'日期': pd.date_range(start='2024-01-01', periods=10, freq='D'),
'銷售額': [100, np.nan, np.nan, 130, 140, np.nan, 160, 170, np.nan, 200]}
df_ts = pd.DataFrame(time_series_data)
print("\n原始時間序列數據:")
print(df_ts)
# 使用線性插值填補缺失值
df_ts["銷售額"] = df_ts["銷售額"].interpolate(method='linear')
print("\n線性插值後:")
print(df_ts)
📌 優缺點
在處理缺失值時,常見的插值方法包括線性插值、多項式插值與時間序列插值。線性插值適用於趨勢穩定的數據,透過線性關係預測缺失值,但在面對非線性變化時,可能無法準確捕捉數據趨勢。多項式插值則適合用於變化較為複雜的非線性數據,能夠更靈活地擬合資料走勢,但若階數過高,容易出現過度擬合的風險。至於時間序列插值,則特別適用於時間序列數據的缺失值填補,可以根據時間索引進行預測,不過前提是數據必須具備明確且連續的時間標記。綜合而言,選擇插值方法時應依據數據特性與應用場景,平衡準確性與風險。
________________________________________
📌 2.3 如何選擇適合的缺失值處理方法?
在進行資料前處理時,根據數據特性選擇適當的缺失值處理方法非常重要。
當缺失值比例較低(少於 5%)時,直接刪除缺失數據(如使用 dropna())通常是最簡單且有效的做法。
若數據的可用性較為關鍵,則建議採用均值或中位數填補(fillna()),以保留更多資料樣本。對於類別型數據,使用眾數填補(mode())能有效維持分類的一致性。
而在處理連續時間序列數據時,插值法(interpolate())則能根據時間趨勢合理預測缺失值。綜合而言,選擇合適的方法應根據數據類型與應用場景做出判斷,以確保數據的完整性與分析的準確性。
________________________________________
📌 2.4 測驗:你會處理缺失值嗎?
📝 單選題
1️⃣ 如果一個欄位有 50% 以上的數據缺失,應該怎麼處理?
A. 刪除該欄
B. 用 0 填補
C. 用均值填補
D. 讓 AI 自己決定
✅ 答案:A
📌 解析:如果缺失值過多,填補可能會帶來較大誤差,刪除欄位是較好的選擇。
________________________________________
🎉 恭喜!你現在掌握了缺失值處理的關鍵技巧! 🎯
🚀 下一步:學習數據標準化與正規化,提升 AI 模型的穩定性!






















