主要參考:
機器學習| 算法筆記-線性回歸(Linear Regression) - 知乎 (zhihu.com)
2-2 線性回歸_嗶哩嗶哩_bilibili
Python機器學習實戰:線性回歸模型預測波士頓房價_嗶哩嗶哩_bilibili
回歸分析
在數學和統計學中,回歸(Regression) 是一種用于分析變量之間關系的方法,核心目標是通過一個或多個自變量(解釋變量) 來預測因變量(響應變量) 的連續數值。它不僅是機器學習中的基礎任務(如前文所述),更是統計學的重要分支,其數學本質和應用邏輯可從以下維度深入解析:
數學上的回歸是一種通過數據擬合函數關系來預測連續值的方法論,其核心在于用統計或機器學習手段建立自變量到因變量的映射,并通過誤差最小化確保模型有效性。從簡單的線性回歸到復雜的非線性模型,回歸分析始終是理解變量關系、解決預測問題的基礎工具,其思想貫穿統計學、機器學習及各應用學科。
回歸的分類
我們這里主要關注線性回歸
線性回歸
如果在回歸分析中,自變量與因變量是線性關系(一次方),那么這種回歸分析,我們稱之為線性回歸。
比如住宅面積和房價的關系:
線性回歸通常僅用于連續型數值預測,比如預測房價(面積與價格呈直線關系)
顯然,如果投資150萬,遠遠大于預測出來的房價,那么就不值得投資。
線性回歸優缺點
優點:簡單、計算高效、可解釋性強。
缺點:對非線性關系效果差、易受異常值和多重共線性影響。
線性回歸是機器學習和統計建模的基礎工具,適合初步探索變量關系,但通常需結合數據特性選擇合適的變體或更復雜模型。
線性回歸分析的目標
還是以房價問題為例
這里,我們是想找到房屋面積和房價之間的線性關系,其中,房屋面積就是一個特征,我們現在要找到這個特征跟房價之間的關系,也就是要尋找到合理的a和b,使得預測結果是相對準確的,因為不同的a和b對結果的影響肯定是不一樣的。
那么,怎么就能找到最適合的a和b呢?
如果我們已經知道一些現有的數據,也就是知道一些面積和房價之間的確切對應關系,之后,對于某個模型,使得模型的輸出結果和實際值之間的差距最小,也就能確定對應的a和b的值了。
由此,我們引出損失函數這一概念
所謂的損失函數,就是模型輸出結果和實際結果之間的差距的函數,當差距最小時,也就是損失函數值最小時,我們的目標就達到了。
所以,上面說的線性回歸的目標是什么呢?
答案是:不斷迭代數據特征的系數,然后找到損失函數的極小值,從而確定對應的特征系數。
舉例說明:
下面有兩組假設的擬合所預測出來的結果,我們看看對應的損失函數值各是多少
J1小于J2,看起來J1更合適。
上面只是假設已經有了系數,然后求解下損失函數,但是這個損失函數并不一定就是最小的,那么,我們實際中如何求解呢?
我們先了解兩種基礎的方法:最小二乘法和梯度下降法,其他更多方法以后有需要再學習。
最小二乘法
最小二乘法(Least Squares Method)是一種經典的數學優化方法,主要用于線性回歸問題,通過最小化預測值與真實值之間的殘差平方和來求解模型參數。它是統計學和機器學習中最基礎的參數估計方法之一。
應用場景
線性回歸(房價預測、銷量分析等)。
曲線擬合(如多項式回歸)。
信號處理(濾波器設計)。
經濟學(計量模型參數估計)。
總結
最小二乘法是線性回歸的經典解法,適用于小規模數據且特征數較少的情況。
解析解高效但受限于矩陣求逆,大數據時改用梯度下降或隨機梯度下降。
改進方法(如嶺回歸、Lasso)可以解決過擬合和不可逆問題。
非線性問題需使用更復雜的優化方法(如Levenberg-Marquardt)。
最終選擇:
數據量小且特征少 → 最小二乘法(解析解)。
數據量大或特征多 → 梯度下降/SGD。
需要特征選擇 → Lasso 回歸。
非線性回歸 → 非線性最小二乘法。
梯度下降法
上面提到,最小二乘法是線性回歸的經典解法,適用于小規模數據且特征數較少的情況,解析解高效但受限于矩陣求逆,大數據時改用梯度下降或隨機梯度下降。
梯度下降法(Gradient Descent,GD)是一種迭代優化算法,用于尋找可微函數的局部最小值(或最大值)。它是機器學習和深度學習的核心優化方法之一,尤其適用于大規模數據和高維參數空間的優化問題。
示意如下:
對于y=ax+b
總結
梯度下降法是機器學習和深度學習的核心優化算法,通過迭代更新參數最小化損失函數。
主要變體:BGD(穩定但慢)、SGD(快但震蕩)、Mini-batch GD(平衡)。
改進算法:Momentum、Adam等可加速收斂并提高穩定性。
適用場景:
大規模數據 → Mini-batch GD 或 Adam。
非凸優化(如神經網絡)→ Adam/RMSprop。
線性模型 → 可對比最小二乘法(小數據時更高效)。
關鍵建議:
數據標準化(加速收斂)。
調試學習率(可從0.01開始嘗試)。
監控損失曲線(判斷是否收斂或震蕩)。
使用sklearn求解線性回歸過程
?我們舉個簡單的例子看看步驟
那么,我們如何進一步確定擬合出來的效果好不好呢?
代碼示例如下:
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score# 1. 直接在程序中定義上面示例的10組數據,我們假設X是房屋面積,y是房價 # 格式:X和y的順序一一對應 X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]) y = np.array([7, 9, 11, 13, 15, 17, 19, 21, 23, 25])# 2. 創建線性回歸模型并訓練 model = LinearRegression() model.fit(X, y) # 傳入特征和目標變量進行訓練# 3. 模型預測(使用訓練數據進行預測,查看擬合效果) y_pred = model.predict(X)# 4. 計算評估指標 mse = mean_squared_error(y, y_pred) # 均方誤差 r2 = r2_score(y, y_pred) # R2決定系數(越接近1越好)# 5. 輸出模型結果 print("=== 線性回歸模型結果 ===") print(f"回歸方程:房價 = {model.coef_[0]:.4f} × 房間面積 + {model.intercept_:.4f}") print(f"均方誤差(MSE):{mse:.4f}") print(f"R2決定系數:{r2:.4f}")# 6. 示例:預測新的房間面積對應的房價 new_area = 150 # 假設新房間面積為150平方米 predicted_price = model.predict([[new_area]])[0] print(f"\n預測面積為{new_area}平方米的房價:{predicted_price:.2f}萬元")
結果:
結果跟預期是一致的,可見訓練是有效的。
當然,這只是機器學習最最基礎的一種場景了,我們后續由淺入深慢慢深入了解。
實戰:波士頓房價預測
使用的是波士頓房屋數據
上面的13行是輸入數據的特征,最后一行是房屋價格,也就是機器學習中說的標簽。
我們開始測試
線性回歸模型假設多個影響房價的因素和房價之間是線性關系,屬于多元線性回歸,我們可以用線性方程來表示:
線性回歸模型訓練的目的就是找到一組參數使得模型預測的誤差最小,這里面用到了損失函數,最小二乘法,正則化等理論,這里不-一證明了,我們直接看模型訓練和預測的效果。注意:因為波士頓房價數據下架了,所以用加州房價來替代,差不多的。
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score# 加載加州房價數據集 california = fetch_california_housing() X = california.data # 特征數據 y = california.target # 目標數據(房價中位數)# 劃分訓練集和測試集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 創建線性回歸模型 model = LinearRegression()# 訓練模型 model.fit(X_train, y_train)# 在測試集上進行預測 y_pred = model.predict(X_test)# 計算評估指標 mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) r2 = r2_score(y_test, y_pred)# 輸出結果 print("線性回歸模型評估結果:") print(f"MSE: {mse:.4f}") print(f"RMSE: {rmse:.4f}") print(f"R2 Score: {r2:.4f}")# 可視化預測結果 plt.figure(figsize=(10, 6)) plt.scatter(y_test, y_pred, alpha=0.6) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--') plt.xlabel('實際房價 (10萬美元)') plt.ylabel('預測房價 (10萬美元)') plt.title('線性回歸模型預測結果') plt.grid(True) plt.tight_layout() plt.savefig('prediction_results.png')# 顯示特征系數(重要性) print("\n特征系數(重要性):") for i, feature in enumerate(california.feature_names):print(f"{feature}: {model.coef_[i]:.4f}")print("\n模型訓練和評估已完成,預測結果圖已保存為 prediction_results.png")
結果如下:
更多待補充。