第13章主要練習使用五種不同的迴歸模型,包含基本線性迴歸、互動效應處理、非線性關係擬合、利用Ridge正則化減少變異,以及使用Lasso進行特徵選擇。Exercise則進一步將這些模型應用於sklearn的real-world datasets的California housing資料集,並擴展了評估範圍。除了實作第13章的五種迴歸方法外,還加入了之前章節中的DecisionTreeRegressor與RandomForestRegressor。透過這些練習,可以更好的掌握如何實作基本與進階的迴歸模型,以及如何處理特徵間的互動效應、如何透過多項式轉換建立非線性模型、如何使用正則化技術減少過擬合、如何評估不同模型的效能與效率,以及如何視覺化分析模型結果。
OS: Windows 11 23H2
CPU: Intel Core i7-13700K
GPU: NVIDIA GeForce RTX 4070 SUPER 12G
RAM: DDR5 64G 5600MT/s
Python Package Manager: uv
Python Version: 3.10.16
Python Package: numpy, pandas, sklearn, rich, seaborn, matplotlib
IDE: Visual Studio Code
為方便查看運行結果,故額外使用rich函式庫建立兩個Function格式化印出指定內容。
13.1 Fitting a Line
Code:
Explanation:
此程式碼使用sklearn提供的LinearRegression方法建立線性迴歸模型。首先透過make_regression方法建立具有100個樣本、3個特徵的合成資料集,然後訓練線性迴歸模型。最後輸出模型的截距、係數、目標值預測以及模型在訓練資料上的評分。
Discussion:
線性迴歸方法優點在於易於理解和實作,計算效率高。然而,此方法假設特徵與目標間存在線性關係,無法捕捉複雜的非線性模式,且對極端值較為敏感。
Result:
13.2 Handling Interactive Effects
Code:
Explanation:
此程式碼使用PolynomialFeatures方法在線性迴歸模型中加入互動產生的效果。首先透過make_regression方法建立含100個樣本、2個特徵的合成資料集,然後使用PolynomialFeatures方法生成特徵之間的互動項(其中interaction_only設為True,而degree設為3代表最高至三階互動,include_bias設為False代表不包含bias)。接著訓練線性迴歸模型並展示第一個觀測值的原始特徵、互動項及轉換後的特徵值。
Discussion:
在線性迴歸模型中加入互動的優點是能夠捕捉特徵間的非線性關係,提高模型的表達能力和預測準確性。但這也增加了模型的複雜度和過擬合風險,且當特徵數量過大時,會導致特徵空間急劇膨脹,計算成本顯著提高。
Result:
13.3 Fitting a Nonlinear Relationship
Code:
Explanation:
此程式碼使用sklearn提供的PolynomialFeatures方法處理非線性的數據關係。首先透過make_regression方法建立具有100個樣本、1個特徵的合成資料集(為了方便查看觀測值的結果,故只生成1個特徵),然後使用PolynomialFeatures方法生成最高至三階的多項式特徵(透過設定degree為3,以及設定include_bias為False不包含bias)。接著訓練線性迴歸模型,並顯示第一個觀測值的原始值及其二次方、三次方結果,以及轉換後包含所有多項式特徵的值。
Discussion:
多項式特徵轉換的優點是能夠使用線性模型捕捉非線性關係,實作簡單且計算效率高。然而,高階多項式容易導致過擬合,特別是在小型資料集上,且需要更多的特徵選擇和正則化處理來防止模型複雜度過高。
Result:
13.4 Reducing Variance with Regularization
Code:
Explanation:
此程式碼使用Ridge進行正則化,減少模型的變異性。首先透過make_regression方法建立含100個樣本、3個特徵的合成資料集,接著使用StandardScaler標準化特徵。然後分別訓練一個固定alpha值為0.5的Ridge模型與一個使用交叉驗證自動選擇最佳alpha值(從0.1、1.0和10.0中選擇)的RidgeCV模型,最後輸出選定的係數和最佳alpha值。
Discussion:
Ridge透過L2懲罰項縮小係數大小來減少過擬合風險,提高模型的泛化能力,特別適合處理多重共線性的問題。且L2懲罰只會縮小而不會完全消除不重要特徵係數。正則化強度(alpha)的選擇要是過高則會導致欠擬合。在實際使用中,Ridge需手動設定alpha值,而RidgeCV則透過交叉驗證自動從候補值之中選取最佳的參數設定,可有效簡化調整參數的過程。雖然RidgeCV更為便利,但其計算成本較高,因此在大型資料集的情況下,直接使用Ridge可能會更高效。
Result:
13.5 Reducing Features with Lasso Regression
Code:
Explanation:
此程式碼使用Lasso用於特徵選擇。首先透過make_regression方法建立含100個樣本、3個特徵的合成資料集,接著使用StandardScaler標準化特徵。然後分別訓練兩個Lasso模型,一個使用alpha=0.5,另一個使用alpha=10(更強的正則化),最後比較兩個模型的係數,顯示較大的alpha值如何將部分係數壓縮至完全為零。
Discussion:
Lasso使用L1正則化的優點是能將不重要特徵的係數精確歸零,實現自動特徵選擇,使模型更簡約且易於解釋。然而,alpha值的選擇影響很大,過強的正則化可能忽略重要特徵;另外,當特徵高度相關時,Lasso可能隨機選擇其中一個而非保留所有相關特徵。
Result:
Settings
這邊使用scikit-learn的real-world datasets中的California Housing作為主要資料集,對之前所有章節中所有的回歸類型模型進行訓練與比較差異。
California Housing數據集是scikit-learn中常用的真實世界數據集,基於1990年美國加州人口普查資料收集。該數據集包含20640個樣本和9個特徵,主要記錄加州各區域的房屋中位價格及相關因素。每個樣本代表一個人口普查區域,特徵包括收入中位數、房屋年齡、平均房間數、臥室數量、人口等統計信息。數據集被廣泛用於回歸分析和房價預測模型的開發與測試,是機器學習入門者學習預測建模的理想資源。
Explanation:
首先透過sklearn.datasets提供的fetch_california_housing載入資料集,接下來透過StandScaler進行標準化後,使用train_test_split進行分割為訓練集與評估集。
Code:
Explanation:
接下來分別對13章中所有小節內容,以及之前章節中的回歸類型模型如DecisionTreeRegressor與RandomForestRegressor,皆使用california housing資料集進行訓練與評估,這邊評估使用兩種指標。
第一種計算模型執行評估集時的MSE,可測量預測值與實際值的平均平方差距,數值越小代表預測越準確。
第二種計算模型直接評估集時的L2 Score,可衡量模型解釋目標變數變異的比例,其值介於0至1間,值越高表示模型的解釋力越強。
Code:
Discussion:
綜合三張圖片的實驗結果,可以清楚看到這八種不同的回歸模型在california housing數據集上的表現差異。右圖呈現了各個模型的三個不同指標:訓練時間、均方誤差(MSE)和R2 Score。從中可以觀察到,RandomForestRegressor雖然訓練時間最長(828.41毫秒),但其MSE最低(0.25)且R2最高(0.81),表現最為優異。相比之下,Lasso(特別是alpha=10時)表現最差,MSE高達1.32,R2為負值,意味著其預測能力甚至不如簡單的平均值。
左下圖呈現了訓練時間與MSE的關係,清楚展示了模型複雜度與預測精度間的權衡。大多數模型集中在圖左下角,表明它們在效率與精度間取得了一定平衡。然而,RandomForestRegressor雖然訓練時間顯著增加,但MSE值低得多,顯示出明顯優勢。
右下圖展示了訓練時間與R2的關係,進一步確認了RandomForestRegressor的優異性。Polynomial Regression與DecisionTreeRegressor的R2分數相近(約0.6 ~ 0.66),表示它們能解釋目標變數約三分之二的變異。
綜合而言,對於california housing數據集,RandomForestRegressor提供最佳預測精度,適合資源充足且對準確性要求高的場景。Polynomial Regression在簡單模型中表現最佳,計算效率與精度取得良好平衡。Lasso則顯示出參數選擇的重要性,不當設定可能導致模型崩潰。這些結果提醒我們,模型選擇應同時考慮計算資源、預測精度和可解釋性需求,以及數據集的特性與應用場景。
Result:
Difficulties Encountered and Solutions
1. 對California housing資料集進行切分的問題
Difficulties:要將California housing資料集切分為訓練集與測試集時,若直接使用之前訓練Classifier模型的切分方法,即使用sklearn提供的train_test_split方法,並設定參數stratify=target的話,會無法對Regression類型的資料集進行切分。
Solution:由於設定參數stratigy=target會對資料進行分層抽樣,而分層抽樣本質上是為分類問題設計的,而不是為回歸問題設計的,且分層抽樣需要離散的類別標籤,但回歸問題中的目標值(如房價)是連續的數值。解決方法可直接將stratify=target部分刪除,即可正常運行。
References
[1] Machine Learning with Python Cookbook-2nd, by Kyle Gallatin and Chris Albon, O'Reilly, 2023, ISBN: 9781098135720
[2] 機器學習入門:使用Scikit-Learn與TensorFlow, 黃建庭, 碁峰, 2021, ISBN: 9786263240285
[3] 精通機器學習:使用Scikit-Learn, Keras與TensorFlow(第三版), Aurélien Géron, 歐萊禮, 2024, ISBN: 9786263246676
[4] scikit-learn 機器學習實戰, 鄧立國 郭雅秋 陳子堯 鄧淇文, 清華大學, 2022, ISBN: 9787302604396
[5] Python資料科學學習手冊(第二版), Jake VanderPlas , 歐萊禮, 2023, ISBN: 9786263246843