資料前處理與迴歸分析

資料前處理:為什麼清理資料這麼重要?

在我們訓練任何機器學習模型之前,必須先面對現實中亂七八糟的原始數據。資料前處理 (Data preprocessing) 就是把這些數據變成好看的報告的過程。想像一下,你在煮飯前總得先洗菜、切菜吧?如果食材又髒又沒切過,是做不出好菜的。

原始數據通常會有一堆問題,像是異常值 (outliers)、缺失值 (missing values)、無意義的組合,還有亂七八糟的單位。前處理就是要把這些混亂,變成模型真正能看得懂、學得會的東西。

資料前處理的 7 個步驟

1. 取得資料集 (Acquire the dataset)。 從各個來源收集資料,然後把它們整合成適當的格式。資料集的結構會根據你的領域而有所不同(比如商業資料跟醫療資料就長得不一樣)。

2. 匯入關鍵函式庫 (Import crucial libraries)。 在 Python 裡,有三個函式庫是前處理的鐵三角:NumPy(科學運算)、Pandas(資料操作與分析)和 Matplotlib(2D 繪圖跟視覺化)。

3. 匯入資料集 (Import the dataset)。 把資料載入你的工作環境。記得確認你的工作目錄 (working directory) 設定正確,程式才找得到檔案喔。

4. 處理缺失值 (Handle missing values)。 這點超級重要!如果你無視缺失資料,模型就會得出錯誤的結論。常見的做法包含用該欄位的平均數或中位數來填補,或是乾脆把缺漏的那一整列刪掉。

欄位?列?都是什麼?

為了更容易理解,我們可以把資料想像成一個 Excel 表格。在資料科學中,表格的兩個維度分別代表:

  • 欄位 (Column / 垂直方向): 代表一個特定的 「特徵 (Feature)」「變數」。例如:每個人的「年齡」、「身高」或「收入」。
  • 列 (Row / 水平方向): 代表 「一筆完整的資料 (Observation / Record)」。例如:某位特定使用者的所有基本資料。

實際範例解析

假設我們有一個如下的客戶資料表:

姓名年齡 (欄位)收入 (欄位)
小明 (這是一列 Row)2550,000
小華 (這是一列 Row)(缺失值)60,000
小美 (這是一列 Row)2755,000

當我們提到用該欄位的平均數或中位數填補,它的執行動作如下:

  1. 系統發現「小華」的「年齡」空缺了。
  2. 系統會去尋找「年齡」這個欄位 (Column) 裡其他已知的數值(也就是小明的 25 歲和小美的 27 歲)。
  3. 計算這個欄位的平均數:
  4. 最後把 26 填入小華年齡的缺失值中。

而後半段提到的把缺漏的那一整列刪掉,則是另一種暴力的做法:只要發現小華有一項資料沒填(年齡缺失),就把「小華」這一整筆資料(Row) 直接從表格中剔除,連帶他完好的收入資料也不採納了。

5. 類別資料編碼 (Encode categorical data)。 機器學習模型是靠數學運作的——它們只懂數字,不懂「紅色」或「男生」這種標籤文字。編碼的方法有虛擬變數 (dummy variables)、標籤編碼 (label encoding,把類別變成整數) 以及獨熱編碼 (one-hot encoding,為每個類別建立二元欄位)。

6. 特徵縮放 (Feature scaling)。 當你的特徵範圍差超多的時候(例如年齡 0–100 歲 vs 薪水 0–1,000,000 元),有些演算法會被搞混。特徵縮放就是把變數標準化到同一個範圍裡。最常用的兩個方法是 Min-Max 縮放和標準化 (Standardization / z-score)。

7. 切割資料集 (Split the dataset)。 把資料分成訓練集 (training set)(給模型學習用)和測試集 (test set)(用來驗證模型好壞)。最常見的切法是跟著八二法則走:80/20,或者 70/30、60/40 也很常見。

其他的前處理技巧

除了這 7 個核心步驟,你可能還會遇到:

  • 資料整合 (Data Integration) — 把來自不同來源系統的資料,合併成單一的資料集。
  • 資料轉換 (Data Transformation) — 把資料從一種格式轉成另一種格式(e.g.: source system format → destination format)。
  • 資料離散化 (Data Discretization) — 把連續數值變成離散的區間(比如把確切的年齡,變成「18–25 歲」、「26–35 歲」這種年齡層)。

第二部分:迴歸分析 — 預測連續數值

現在資料乾淨了,我們來看看怎麼做預測。先從一個經典的例子開始。

房價問題

想像一下,我們有一份包含 47 間房子的資料集,裡面有居住面積(平方英尺)跟價格(千元馬幣)。問題很簡單:給定一間房子的面積,我們能預測它的價格嗎?

這是一個監督式學習 (supervised learning) 的問題。我們有「輸入-輸出」的配對資料,並想找出它們之間的關聯規則。因為輸出(價格)是一個連續的數值,所以這具體來說叫作迴歸 (regression) 問題。

補充說明:連續的數值?迴歸?都是什麼?

連續的數值是可以無限細分、有大小之分的數字。它們通常是「測量」出來的,而不是一個一個「數」出來的。它包含了所有的小數和分數。比如,房價可以是 50 萬馬幣,也可以是 50.5 萬馬幣,甚至是 50.512 萬馬幣。只要儀器或計算夠精確,數字可以無限切分下去。生活中的面積、身高、體重、溫度、時間,都是連續數值。

相對的概念是「離散數值」(Discrete Value): 這是只能跳躍式出現、通常是整數的數字。例如:「這間房子有幾間臥室?」答案只能是 1 間、2 間或 3 間,不可能有 2.38 間臥室。

在機器學習的領域裡,只要你的目標是預測一個「連續的數值」,我們就把這個任務稱為「迴歸」

迴歸的核心概念,就是在茫茫的數據資料中,找出一條**「最符合趨勢的線」**(Line of Best Fit),藉此理解輸入(面積)與輸出(價格)之間的數學關係。

1.00

數學符號約定

在深入之前,我們先來約定一下符號:

  •  = 輸入特徵 (例如第  間房子的面積)
  •  = 輸出/目標變數 (例如第  間房子的價格)
  •  = 一筆訓練樣本
  •  = 訓練樣本的總數
  •  = 我們的假設函數 (hypothesis function), 也就是我們想學出來的預測器

我們的目標是:找到一個函數 ,讓  能準確預測  的值。

線性迴歸 (Linear Regression)

最簡單的假設就是線性函數。

預測的房價 = (基本底價) + (面積的影響力 × 面積) + (臥室的影響力 × 臥室數)

這些  值被稱為參數 (parameters)(或權重 weights)。我們的工作就是要找出最準確的  值。但該怎麼找呢?

成本函數 (The Cost Function)

我們定義了一個最小平方法成本函

公式詳解:

 是我們用公式算出來的預測房價

 是這間房子在現實中的真實成交價

把它們相減,就是在算**「我們猜錯了多少錢(誤差)」**。例如,我們預測賣 50 萬,實際賣了 60 萬,誤差就是 -10 萬。

2. 平方

這裡把誤差拿來「平方」,有兩個很重要的原因:

  • 把負數變成正數: 如果我們高估了 10 萬(誤差 +10)或低估了 10 萬(誤差 -10),對預測來說都是一樣糟糕的。平方之後,負號就不見了,我們只看「誤差的幅度」。
  • 嚴厲懲罰「大錯誤」: 平方有一個特性,會讓越大的數字膨脹得越快(例如 2 的平方是 4,但 10 的平方是 100)。這等於是在告訴機器:「小誤差還可以接受,但如果預測錯得太離譜,你的分數會扣得非常非常重!」

3. 加總

我們不能只看一間房子的誤差,而是要把資料集裡全部 47 間房子的「誤差平方」全部加起來,算出一個總分。這就是為什麼這個方法被稱為最小平方法 (Least Squares)

為什麼前面要乘一個二分之一?其實這只是一個數學上的小偷吃步。 在機器學習的下一步,我們需要用到微積分來尋找最小誤差。當平方的那個 2 掉下來相乘時,剛好可以跟  抵銷掉,讓後面的計算過程變得更乾淨漂亮。它完全不會影響我們尋找最佳答案的結果。

 越小,代表我們的模型越貼合資料。所以我們要想辦法最小化 

梯度下降 (Gradient Descent) — 尋找最佳參數

梯度下降是一個迭代的優化演算法。它的直觀概念是這樣的:

  1. 隨便猜一個  的起始值。
  2. 計算成本 
  3. 朝著能讓  減少最多的方向(最陡的下坡方向)稍微調整 θ。
  4. 重複這個動作,直到收斂(走到谷底)。

更新規則長這樣:

公式詳解

其實看不懂半點 我盡力說說看

想像一個情境:你被蒙住了雙眼,丟在一座高山上的某個地方。你的目標是「走到這座山的最低谷」。 你看不見,只能用腳感覺周圍地面的傾斜程度。你會怎麼做?你一定是用腳探一探,感覺哪邊是「最陡的下坡」,然後往那個方向踏出一步。接著再用腳感覺一下,再往最陡的下坡走一步。不斷重複,直到你覺得四周都平了,你就知道自己到達谷底了。

現在我們來看看我們的公式,把它拆開來看:

1. ​ 與  (準備更新位置)

  • ​: 這是我們的「權重」(例如:面積對房價的影響力)。你可以把它想像成你現在站在山坡上的**「座標位置」**。
  •  在程式語言裡,這個符號唸作 "Assign"(賦值)。它的意思是**「把右邊算出來的新結果,取代掉左邊舊的東西」**。所以整行公式的意思是:「我的新位置,將會等於右邊算出來的結果」。

2.  (腳底下的坡度)

  • 這坨看起來最可怕的符號叫「偏導數」(Partial Derivative)。別管微積分了,它的白話文就叫作「坡度(slope)」。
  • 它代表你現在腳踩的地方「有多陡」以及「哪邊是上坡」。如果山坡很陡,這個算出來的數字就很大;如果很平緩,數字就很小。

3. 減號  (我們要往下坡走)

  • 剛剛說偏導數算出來的是「上坡」的方向。但我們的目標是走到谷底(減少誤差),所以我們必須在公式裡加一個減號,強迫機器**「反著坡度走,往下坡前進」**。

4. α (Alpha,步伐大小)

  • 這個  叫作學習率 (Learning Rate)。在下山的故事裡,它就是你的**「步伐大小」**。
  • 機器在下山時,步伐不能亂踩。
    • 如果 太大: 你的步伐太大,可能會一腳從山谷左邊直接跨到山谷右邊,甚至越爬越高,永遠找不到最低點。
    • 如果  太小: 你用螞蟻的步伐下山,雖然很安全,但機器會算到天荒地老才走到谷底。

所以公式,翻譯過來大概是:

新的位置 := 舊的位置 - ( 步伐大小 × 腳底下的陡峭程度 )

這裡的  是學習率 (learning rate)——它控制了你每次踏出的步伐有多大。步伐太大會衝過頭;太小又會走得很慢,收斂超級久。

把偏導數 (partial derivative) 展開,

1.00

更新規則會變成:

公式詳解:

在第一個公式裡,我們告訴機器要「測量坡度」(),但機器是一台死腦筋的電腦,你得告訴它「具體要拿什麼數字來算」。經過微積分的推導後(我們直接跳過數學推導),第一條公式的坡度部分,就會變成第二條公式。

1. 準備更新位置:

這部分跟剛剛一模一樣:新的權重 := 舊的權重 + (步伐大小 × 調整方向)

你可能會發現,這裡的符號從「減號 −」變成了「加號 +」。這是因為數學家在推導公式時,把後面的括號順序對調了,負負得正,就變成加號了。概念完全不變!

2. 預測的誤差:

  •  是現實成交價
  •  是機器的預測價

3. 這個特徵的「存在感」:

為什麼最後還要乘上一個 ​(例如這間房子的實際面積)呢?這是在計算「責任歸屬」。 想像一下,你今天預測房價大翻車,總得找個特徵來怪罪並調整吧?

  • 如果這間房子的面積超大(x 數值很大),那它對這次錯誤預測的「責任」就很大。乘上這個大數字後,面積的權重 () 就會被大幅度地調整
  • 相反地,如果今天這間房子根本沒有游泳池(游泳池數量 x=0),那房價算錯關游泳池什麼事?乘上 0 之後,游泳池的權重就不會被調整。

也就是,我要更新這個條件的重要性 ()。更新的幅度,取決於我這次『猜錯了多少錢』,再乘上這間房子『這個條件本身的數值有多大』。

這就是 LMS (Least Mean Squares) 更新規則,也叫作 Widrow-Hoff 學習規則。注意看一個細節:更新的幅度跟誤差是成正比的。當預測值很接近實際值時,調整的幅度就會很微小;當誤差很大的時候,調整的幅度就會很大。

批量 (Batch) vs 隨機 (Stochastic) 梯度下降

批量梯度下降 (Batch Gradient Descent) 會在做單次更新前,把所有訓練樣本的梯度加總起來。它很精準,但遇到大資料集的時候會跑得非常慢。

1.00

隨機/增量梯度下降 (Stochastic / Incremental Gradient Descent) 則是每看完一筆訓練樣本就立刻更新一次 。它的速度快很多,在實務上通常效果也不錯,雖然走向收斂的路徑會比較曲折、充滿雜訊。

1.00

欠擬合 (Underfitting) vs 過擬合 (Overfitting)

1.00

這是機器學習裡最重要的概念之一!想像一下用不同的模型來擬合我們的房價資料:

  • 一條直線 (線性擬合) 可能太簡單了——它抓不到資料的真實弧度。這叫做欠擬合 (underfitting)
  • 二次方程式 (加上 x2) 擬合得比較好,抓到了更多結構。
  • 五次方多項式 可以完美穿過每一個訓練資料點——但如果拿它來預測新房子的價格,結果一定會慘不忍睹。這叫做過擬合 (overfitting)

一個只會死背訓練資料的模型,不一定是個好模型。我們要的是能對未知的新資料做出準確預測(具備泛化能力 generalization)的模型。

局部加權線性迴歸 (Locally Weighted Linear Regression)

一般的線性迴歸是用一條全域的線來擬合所有資料。局部加權線性迴歸 (LWLR) 換了個思路:在做每次預測時,它會給附近的訓練點比較大的權重,離得遠的點權重就給得比較小。

每個訓練樣本的權重通常會用高斯函數來算:

公式詳解:

這個應該不在考試範圍裡面,看個大概就行。

LWLR 就像是找了一個深耕當地的「資深房仲」。當你要賣一間 30 坪的房子時,這位房仲不會管那些 100 坪的豪宅賣多少錢,他只會特別去查「附近同樣也是 28 到 32 坪左右」的房子成交價,用這些極度相似的房子來幫你估價。

「差異程度」或「距離」:

  • x 是你現在想估價的房子(例如:30坪)。
  •  是資料庫裡的歷史成交房子(例如:一間 80 坪的房子)。
  • 把它們相減再平方,算出來的就是這兩間房子的「差距有多大」。差距越大,這個數字就越大。

 是指數函數(Exponential),配合前面的負號,它畫出來會是一個中間高、兩邊低的「鐘型曲線」或稱高斯曲線。

1.00

如果兩間房子很像(距離近): 算出來的權重  會非常接近 1(代表重要,必須強烈參考)。

如果兩間房子差十萬八千里(距離遠): 這個函數會讓權重「墜崖式」地急速暴跌到趨近於 0。這等於房仲在說:「那間 80 坪的豪宅對我們這間 30 坪的估價毫無參考價值,直接忽略!」

「參考範圍」的大小:

這個 是你可以自己設定的參數,它決定了房仲的「目光有多寬」。

  • 如果  很大: 鐘型曲線會很平緩。這代表房仲比較隨和,連 40 坪、50 坪的房子也會加減參考一下。
  • 如果  很小: 鐘型曲線會非常尖銳、極度狹窄。這代表房仲非常嚴格,只肯參考 29.5 坪到 30.5 坪的房子,只要差一點點,權重就直接給 0。

什麼叫「無母數 (non-parametric)」?

一般的線性迴歸,機器只要把 θ0​、θ1​、θ2​ 這三個參數學好,它就可以把那 47 間房子的歷史資料全部刪掉了,因為規律已經濃縮在那三個參數裡。

但 LWLR 是「無母數」的,這意味著它沒有固定的公式參數。它就像一個不記筆記、全靠臨時抱佛腳的學生。每次有人來問一間新房子的價格,它就必須把那 47 間歷史資料全部拿出來重新比對一次、重新算一次附近的權重。雖然計算量變大很多,但它的預測會比一條死板的直線靈活且準確非常多!

參數  (tau) 決定了權重隨距離衰減的速度有多快。LWLR 是一種無母數 (non-parametric) 的方法:它沒有一組固定的參數,而是每次有新的查詢點時,都要重新針對附近資料擬合一次。

第三部分:邏輯迴歸 (Logistic Regression) — 當輸出是離散值

前面講的都是建立在 是連續數值的狀況。但如果  只能是 0 或 1 呢?(比如判斷垃圾郵件 vs 正常郵件,或是腫瘤是惡性 vs 良性)。

我們沒辦法用單純的線性函數,因為它有可能輸出小於 0 或大於 1 的值。所以,我們要把它包裝進 Sigmoid (邏輯) 函數裡面:

Sigmoid 函數可以把任何實數壓縮到 (0,1) 的範圍內,這樣我們就可以把它解釋成「機率」。如果 h(x)≥0.5,我們就預測 y=1;否則就預測 y=0。

公式詳解

**是什麼?**其實就是我們上面學到的計價公式的縮寫版(也就是  算出來的那個直線數值)。

它就像一台「數值壓縮機」。無論你把多大或多小的數字(哪怕是 +10000 或 −10000)丟進這個公式裡,它都會把它「擠壓」成一個介於 0 到 1 之間的小數。

為什麼要壓在 0 到 1 之間? 因為這正好就是「機率」! 如果公式算出來是 0.85,機器就是在告訴你:「我有 85% 的把握這是一封垃圾郵件(y=1)。」既然大於 0.5(50%),我們就大膽預測它是垃圾郵件。

擬合邏輯迴歸

這次我們不用最小化平方誤差了,而是改用最大概似估計 (Maximum Likelihood Estimation, MLE)。我們的假設是:

1. 第一個公式:預測「會發生」的機率

白話文翻譯:

「在我們已知這筆資料 (x) 和現在的模型標準 (θ) 的條件下,這件事**『會發生 (y=1)』**的機率是多少?」

答案: 就是我們的魔法壓縮機 h(x) 算出來的數字! 例如:模型算出來 h(x)=0.8,這行公式就是在說:「這封信是垃圾郵件的機率是 80%。」

2. 第二個公式:預測「不會發生」的機率

白話文翻譯:

「在同樣的條件下,這件事**『不會發生 (y=0)』**的機率是多少?」

答案: 因為結果只有「是」跟「否」兩種可能,既然全部的機率加起來必須是 100%(也就是數字 1),那麼「不會發生」的機率,當然就是 1 減掉「會發生」的機率

延續上面的例子:既然是垃圾郵件的機率是 80% (0.8),那它是正常郵件的機率就是 1−0.8=0.2 (也就是 20%)。

它的對數概似函數 (Log-likelihood) 長這樣(推導過程省略)(應該也沒什麼用,看看就好):

公式詳解:

這串公式看起來很嚇人,但它其實是一個非常聰明的**「雙開關機制」**,完全根據現實的真相(y 是 1 還是 0)來決定怎麼評分:

  • 如果這封信真的是垃圾郵件(): 公式後半段的  會變成 ,後半段直接消失!公式只剩下 。這等於在說:「既然答案是 ,我只在乎你猜的機率  有多接近 。你越接近 ,分數越高。」
  • 如果這封信是正常郵件(): 公式前半段的  會消失!公式只剩下後半段的 。這等於在說:「既然答案是 0,我希望你猜的機率  越小越好(越接近 ),這樣  才會大,分數才會高。」

最大概似估計 (MLE) 的目標,就是要「最大化」這個函數。白話來說,就是想盡辦法讓機器「對正確答案充滿自信」。

我們要想辦法最大化這個函數,用的方法是——你猜對了——梯度下降。算出來的更新規則跟線性迴歸的簡直像得出奇:

1.00

公式長得一模一樣,但別忘了,這裡的  已經是 Sigmoid 函數,不再是線性函數囉!(第三部分重點差不多就是這個了,上面推導過程應該不重要)

總結

主題核心概念
資料前處理在訓練模型前,清理並轉換原始資料。
線性迴歸用線性模型來預測連續的數值。
成本函數 (J)衡量我們的預測錯得有多離譜。
梯度下降透過迭代調整參數,想辦法把成本降到最低。
批量 vs 隨機 GD看完所有樣本才更新 vs 看完一筆樣本就更新。
欠擬合 / 過擬合模型太簡單抓不到規律 vs 模型太複雜只會死背。
局部加權 LR預測時,給距離近的資料點比較大的影響力。
邏輯迴歸使用 Sigmoid 函數來分類離散的結果 (如 0 或 1)。

留言區