iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
AI & Data

30 天了解 AI & Data:入門到實作系列 第 9

【DAY9】監督式學習:用 Python 實作邏輯迴歸----資料前處理與特徵工程

  • 分享至 

  • xImage
  •  

前言
昨天我們完成了資料的下載、讀取、初步檢視以及簡單視覺化,對資料集的結構、特徵分布和目標類別已有基本認識。今天,我們要在此基礎上,進行資料前處理(Data Preprocessing)與特徵工程(Feature Engineering),讓資料更適合用於邏輯迴歸模型。

資料前處理不是單純整理資料,而是為了確保模型可以順利訓練、提高預測準確度、並避免錯誤或偏差。理解「為什麼要做」比只知道程式操作更重要,這能幫助我們在實務中做出更好的判斷。


一、為什麼要做資料前處理?

資料前處理的目的是把「雜亂的資料」變成「乾淨、規範、適合模型使用的資料」。常見原因包括:

  1. 缺失值(Missing Value):
    在資料集中,有時候某些欄位沒有數值,可能是測量遺漏、資料輸入錯誤或其他原因造成。例如,乳癌資料中某筆資料的「腫瘤平均半徑(radius_mean)」可能沒有填寫。若直接拿這筆資料訓練模型,可能會出現錯誤或降低模型準確度,因此需要先處理缺失值,例如刪掉或用平均值填補。

  2. 類別資料(Categorical Data):
    邏輯迴歸模型只能處理數字資料。如果資料中有文字欄位,例如目標欄位「診斷結果(diagnosis)」是 B(良性)或 M(惡性),我們需要把它轉換成數字,才能讓模型理解。例如把 B 轉成 0、M 轉成 1。

  3. 數值範圍差異過大:
    不同欄位的數值可能單位不同或範圍差異很大。例如「腫瘤平均半徑(radius_mean)」的數值可能從十幾到一百,而「腫瘤紋理平均值(texture_mean)」只有幾到二十。這種差距過大,會讓模型偏向大數值欄位,影響訓練效果,因此需要透過標準化(Standardization)或正規化(Normalization)處理,把數值轉到相似的尺度。

  4. 模型評估需要分組:
    為了確認模型在新資料上的表現,我們通常會把資料分成兩組:訓練集(Training Set)用來讓模型學習,測試集(Test Set)用來驗證模型是否能準確預測新資料。這樣可以避免模型只記住訓練資料而不能應對沒有見過的資料。

二、資料前處理步驟與程式範例

在前處理過程中,會處理缺失值、類別資料編碼、特徵標準化,最後再切分訓練集與測試集。

  1. 缺失值處理(Missing Value Handling)
print(df.isnull().sum())   # 查看缺失值
df.fillna(df.median(numeric_only=True), inplace=True)  # 用中位數填補缺失值
  • isnull():檢查每個欄位的每個數值是不是空的(缺失值)。
  • sum():把每個欄位的缺失數量加起來,方便知道哪個欄位缺資料最多。
  • fillna():把缺失值填上去。
  • df.median():計算每個欄位的中位數(中間值,不受極端值影響)。
  • numeric_only=True:表示只對「數值欄位」計算中位數。
    因為資料集可能有文字欄位(例如 diagnosis: B / M),文字欄位沒辦法算中位數,所以要限定只對數字欄位做中位數填補。
  • inplace=True:直接在原本的 DataFrame 修改,不需要再建立新的變數。
  1. 類別資料編碼(Categorical Encoding)
df['diagnosis'] = df['diagnosis'].map({'B':0, 'M':1})

這段程式的說明如下:
這行程式的作用是把文字標籤轉成數字,讓邏輯迴歸能理解。map() 會將資料中的 B 轉成 0,M 轉成 1。這是必要的,因為邏輯迴歸無法直接處理文字資料,而需要數字來計算機率。

  1. 特徵標準化(Feature Scaling / Standardization)
!pip install scikit-learn
from sklearn.preprocessing import StandardScaler
features = df.drop(['id','diagnosis'], axis=1)
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)

這段程式的說明如下:

  • df.drop(['id','diagnosis'], axis=1):去掉不需要的欄位,例如識別碼(id)和目標欄位(diagnosis),只保留特徵欄位供模型學習。
  • StandardScaler():建立標準化工具,會把每個特徵欄位轉成平均值為 0、標準差為 1 的尺度,確保數值差異過大的欄位不會影響模型學習。
  • fit_transform(features):先學習每個欄位的平均值與標準差(fit),再把原始資料轉換成標準化後的數值(transform)。
  1. 訓練集與測試集切分(Train-Test Split)
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
)

  • train_test_split():把資料分成訓練集和測試集,通常測試集比例為 20%~30%,用來驗證模型的泛化能力。
  • features_scaled:經過標準化的特徵資料,用於模型訓練。
  • df['diagnosis']:目標欄位,也就是我們想要預測的結果。
  • test_size=0.2:表示 20% 的資料拿來當測試集,其餘 80% 作為訓練集。
  • random_state=42:設定隨機種子,確保每次切分結果相同,方便重現結果。

執行後會得到四個變數:X_train、X_test、y_train、y_test,分別對應特徵與目標的訓練和測試資料。

三、前處理步驟原因說明

  1. 缺失值處理(Missing Value Handling)
  • 資料中有些欄位可能缺少數值,這些缺失值如果不處理,模型可能無法運算或導致不可靠的結果。常用方法有刪除或填補,而填補又分為平均值或中位數等。

  • 為什麼建議用「中位數」而不是平均值?
    因為中位數不會被極端值影響。例如一欄數值是 [1, 2, 3, 4, 100]:

    • 平均值 = (1+2+3+4+100)/5 = 22 → 遠大於大多數數值
    • 中位數 = 3 → 真正反映中間值,不會被極端值拉高

所以用中位數填補缺失值能保持資料分布的代表性。

  1. 類別資料編碼(Categorical Encoding)
  • 電腦只能處理數字資料,如果欄位是文字,例如「診斷結果(diagnosis)」是 B 或 M,就需要轉成數字。

為什麼用 0/1 而不是隨便其他數字?

  • 邏輯迴歸會計算欄位對目標的機率影響,0/1 是最直覺的二元表示:0 表示「否」、1 表示「是」。如果用其他數字如 5/10,模型計算出的權重仍可用,但沒有 0/1 那麼直觀,也可能讓解釋變得不容易。
  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
      這樣所有欄位數值都在類似尺度,避免某些特徵支配模型。

  2. 訓練/測試集切分(Train/Test Split)與泛化能力(Generalization)
    為了確認模型在未見過的新資料上的表現,我們會把資料分成訓練集(Training Set)和測試集(Test Set):

  • 訓練集:用來讓模型學習特徵與目標的關係,調整每個特徵對結果的影響。
  • 測試集:用來驗證模型能否正確預測新資料,而不是只記住訓練資料的細節。

如果不分訓練集和測試集:

  • 你無法知道模型在新資料上的表現如何,可能看起來很準確,但其實只是記住訓練資料的細節。

  • 無法評估不同特徵處理或模型參數設定是否有效。

泛化能力就是模型對新資料的預測能力。如果模型能準確預測測試集,表示泛化能力好;如果模型只在訓練資料上表現好,就說明它對新資料的適應能力有限。


小結
今天我們學習了資料前處理與特徵工程,包括缺失值處理、類別資料編碼、特徵標準化,以及訓練集與測試集切分。理解每個步驟背後的原因,能幫助我們準備出更乾淨、規範的資料,讓模型學習更有效,並在新資料上有更好的預測能力。

後續章節,我們將以這些前處理後的資料,實際開始建立邏輯迴歸模型,進行訓練與預測。


上一篇
【DAY8】監督式學習:用 Python 實作邏輯迴歸----資料下載與初步測試
系列文
30 天了解 AI & Data:入門到實作9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言