前言
昨天我們完成了資料的下載、讀取、初步檢視以及簡單視覺化,對資料集的結構、特徵分布和目標類別已有基本認識。今天,我們要在此基礎上,進行資料前處理(Data Preprocessing)與特徵工程(Feature Engineering),讓資料更適合用於邏輯迴歸模型。
資料前處理不是單純整理資料,而是為了確保模型可以順利訓練、提高預測準確度、並避免錯誤或偏差。理解「為什麼要做」比只知道程式操作更重要,這能幫助我們在實務中做出更好的判斷。
一、為什麼要做資料前處理?
資料前處理的目的是把「雜亂的資料」變成「乾淨、規範、適合模型使用的資料」。常見原因包括:
缺失值(Missing Value):
在資料集中,有時候某些欄位沒有數值,可能是測量遺漏、資料輸入錯誤或其他原因造成。例如,乳癌資料中某筆資料的「腫瘤平均半徑(radius_mean)」可能沒有填寫。若直接拿這筆資料訓練模型,可能會出現錯誤或降低模型準確度,因此需要先處理缺失值,例如刪掉或用平均值填補。
類別資料(Categorical Data):
邏輯迴歸模型只能處理數字資料。如果資料中有文字欄位,例如目標欄位「診斷結果(diagnosis)」是 B(良性)或 M(惡性),我們需要把它轉換成數字,才能讓模型理解。例如把 B 轉成 0、M 轉成 1。
數值範圍差異過大:
不同欄位的數值可能單位不同或範圍差異很大。例如「腫瘤平均半徑(radius_mean)」的數值可能從十幾到一百,而「腫瘤紋理平均值(texture_mean)」只有幾到二十。這種差距過大,會讓模型偏向大數值欄位,影響訓練效果,因此需要透過標準化(Standardization)或正規化(Normalization)處理,把數值轉到相似的尺度。
模型評估需要分組:
為了確認模型在新資料上的表現,我們通常會把資料分成兩組:訓練集(Training Set)用來讓模型學習,測試集(Test Set)用來驗證模型是否能準確預測新資料。這樣可以避免模型只記住訓練資料而不能應對沒有見過的資料。
二、資料前處理步驟與程式範例
在前處理過程中,會處理缺失值、類別資料編碼、特徵標準化,最後再切分訓練集與測試集。
print(df.isnull().sum()) # 查看缺失值
df.fillna(df.median(numeric_only=True), inplace=True) # 用中位數填補缺失值
df['diagnosis'] = df['diagnosis'].map({'B':0, 'M':1})
這段程式的說明如下:
這行程式的作用是把文字標籤轉成數字,讓邏輯迴歸能理解。map() 會將資料中的 B 轉成 0,M 轉成 1。這是必要的,因為邏輯迴歸無法直接處理文字資料,而需要數字來計算機率。
!pip install scikit-learn
from sklearn.preprocessing import StandardScaler
features = df.drop(['id','diagnosis'], axis=1)
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)
這段程式的說明如下:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
features_scaled, df['diagnosis'], test_size=0.2, random_state=42
)
執行後會得到四個變數:X_train、X_test、y_train、y_test,分別對應特徵與目標的訓練和測試資料。
三、前處理步驟原因說明
資料中有些欄位可能缺少數值,這些缺失值如果不處理,模型可能無法運算或導致不可靠的結果。常用方法有刪除或填補,而填補又分為平均值或中位數等。
為什麼建議用「中位數」而不是平均值?
因為中位數不會被極端值影響。例如一欄數值是 [1, 2, 3, 4, 100]:
所以用中位數填補缺失值能保持資料分布的代表性。
為什麼用 0/1 而不是隨便其他數字?
特徵標準化(Feature Scaling / Standardization)
不同欄位數值可能差距很大,例如:
radius_mean: 10~100
texture_mean: 5~20
如果不標準化,模型會偏向數值大的欄位,原因是模型在學習過程中會「衡量每個特徵對結果的錯誤貢獻」,這個錯誤就像是模型做錯的程度,稱為「損失」。數值大的特徵如果與模型預測結果有差距,模型就會認為錯得很嚴重,因此會優先調整這些權重,而小數值特徵的影響力被削弱。標準化會把每個特徵轉成 平均值 0、標準差 1 的尺度,公式如下:
z=(x−μ)/σ
其中 x 是原始值,μ 是欄位平均值,σ 是標準差。
範例:radius_mean 欄位有 10, 20, 30
平均值 μ=(10+20+30)/3=20
標準差 𝜎≈8.16
標準化後:
10 → (10-20)/8.16 ≈ -1.22
20 → (20-20)/8.16 = 0
30 → (30-20)/8.16 ≈ 1.22
這樣所有欄位數值都在類似尺度,避免某些特徵支配模型。
訓練/測試集切分(Train/Test Split)與泛化能力(Generalization)
為了確認模型在未見過的新資料上的表現,我們會把資料分成訓練集(Training Set)和測試集(Test Set):
如果不分訓練集和測試集:
你無法知道模型在新資料上的表現如何,可能看起來很準確,但其實只是記住訓練資料的細節。
無法評估不同特徵處理或模型參數設定是否有效。
泛化能力就是模型對新資料的預測能力。如果模型能準確預測測試集,表示泛化能力好;如果模型只在訓練資料上表現好,就說明它對新資料的適應能力有限。
小結
今天我們學習了資料前處理與特徵工程,包括缺失值處理、類別資料編碼、特徵標準化,以及訓練集與測試集切分。理解每個步驟背後的原因,能幫助我們準備出更乾淨、規範的資料,讓模型學習更有效,並在新資料上有更好的預測能力。
後續章節,我們將以這些前處理後的資料,實際開始建立邏輯迴歸模型,進行訓練與預測。