一、線性回歸簡介核心思想:線性回歸是一種通過屬性的線性組合來做預測的模型。它的目標很明確,就是找到一條合適的直線、平面或者更高維度的超平面,讓預測出來的值和實際真實值之間的差距盡可能小。比如在預測房屋價格時,就可以根據房屋大小這個屬性,擬合出一條能預測價格的直線。一般形式:對于一個有多個屬性描述的樣本,線性回歸會把這些屬性分別乘以對應的權重,再加上一個偏置項,得到預測結果。用向量的形式可以更簡潔地表示這種組合關系。二、模型求解:最小二乘法基本原理:最小二乘法是基于 “歐氏距離” 來尋找最優模型的方法。它的核心是找到一條線,讓所有樣本點到這條線的歐氏距離加起來最小,也就是讓預測值和真實值之間的誤差總和最小。參數估計:這個過程就是找到最合適的權重和偏置項,使得誤差函數的值最小。這里的誤差函數反映的是所有樣本預測誤差的平方和。求解過程:通過對誤差函數分別關于權重和偏置項求導,然后讓導數等于 0,就能計算出權重和偏置項的最優值。三、線性回歸的評估指標誤差平方和 / 殘差平方和(SSE/RSS):它是把每個樣本的預測值和真實值之間的差值平方后加起來的結果,能反映出預測值和真實值之間的總誤差大小。平方損失 / 均方誤差(MSE):是誤差平方和的平均值,它消除了樣本數量對誤差結果的影響,方便不同數據集之間進行誤差比較。R 方(\(R^2\)):這個指標用來衡量模型對數據的擬合效果。它的值越接近 1,說明模型對真實數據的解釋能力越強,擬合效果也就越好。簡單來說,就是看預測值能解釋真實值變化的程度。四、多元線性回歸模型形式:當樣本有多個屬性時,多元線性回歸會把每個屬性都考慮進來,每個屬性都有對應的權重,再加上一個偏置項,共同組成預測公式。矩陣表示:對于多元線性回歸,可以用矩陣的形式來表示模型和相關計算,這樣在處理大規模數據時會更方便高效。五、實踐應用:sklearn 中的線性回歸相關函數:在 Python 的 sklearn 庫中,linear_model.LinearRegression()函數可以直接實現線性回歸算法。主要參數:fit_intercept:用于設置模型是否包含偏置項,如果設置為 False,那么擬合的直線會經過原點,默認是包含偏置項的。normalize:設置是否對數據進行歸一化處理,默認是不進行歸一化。應用示例:比如用這個函數可以實現對波士頓房價的預測,通過輸入房屋的各種屬性,得到預測的房價。通過本次學習,我對線性回歸的基本概念、求解方法、評估方式和實際應用有了全面的了解。線性回歸作為一種簡單實用的模型,在很多預測場景中都發揮著重要作用。
代碼參考
# 導入必要的庫
import pandas as pd ? ? ? ? ?# 用于數據處理和分析的工具庫
import numpy as np ? ? ? ? ? # 用于數值計算的基礎庫
import matplotlib.pyplot as plt ?# 用于數據可視化的庫
from sklearn.datasets import load_diabetes ?# 從sklearn加載糖尿病數據集
from sklearn.model_selection import train_test_split ?# 用于劃分訓練集和測試集
from sklearn.linear_model import LinearRegression ?# 線性回歸模型
from sklearn.metrics import mean_squared_error, r2_score ?# 模型評估指標
# 1. 加載糖尿病數據集
# 該數據集包含442名糖尿病患者的10項生理特征和1年后的病情發展指標
diabetes = load_diabetes()
# 2. 數據處理與格式化
# 將特征數據轉換為DataFrame格式,便于查看和處理
# diabetes.data包含特征數據,diabetes.feature_names是特征名稱列表
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
# 將目標值(標簽)轉換為Series格式,目標值表示患者1年后的病情發展情況
y = pd.Series(diabetes.target, name='DiseaseProgression')
# 3. 數據探索:查看數據集基本信息
print("數據集基本信息:")
print(f"特征數量:{X.shape[1]}") ?# X.shape[1]表示列數,即特征數量
print(f"樣本數量:{X.shape[0]}") ?# X.shape[0]表示行數,即樣本數量
print("\n特征名稱:", diabetes.feature_names) ?# 打印所有特征的名稱
print("\n數據統計描述:")
# 打印數據的統計信息(均值、標準差、最小值、最大值等)
print(X.describe())
# 4. 劃分訓練集和測試集
# train_test_split函數用于將數據集隨機劃分為訓練集和測試集
# test_size=0.3表示測試集占總數據的30%,訓練集占70%
# random_state=42設置隨機種子,確保每次運行劃分結果一致,保證實驗可復現
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 5. 構建線性回歸模型并訓練
# 創建線性回歸模型實例,fit_intercept=True表示模型會計算偏置項(截距)
model = LinearRegression(fit_intercept=True)
# 使用訓練集數據訓練模型,即通過最小二乘法找到最優的權重和偏置
# 模型會學習特征(X_train)與目標值(y_train)之間的線性關系
model.fit(X_train, y_train)
# 6. 輸出模型參數(權重和偏置)
print("\n模型參數:")
# 遍歷每個特征及其對應的系數(權重)
# 系數的大小和符號表示該特征對預測結果的影響程度和方向
for feature, coef in zip(diabetes.feature_names, model.coef_):
print(f"{feature}: {coef:.4f}") ?# 保留4位小數輸出
# 輸出偏置項(intercept),即線性方程中的常數項
print(f"偏置(intercept): {model.intercept_:.4f}")
# 7. 使用訓練好的模型進行預測
# 用測試集的特征數據進行預測,得到模型的預測結果y_pred
y_pred = model.predict(X_test)
# 8. 模型評估:計算評估指標
# 計算均方誤差(MSE):預測值與真實值差值的平方的平均值
mse = mean_squared_error(y_test, y_pred)
# 計算均方根誤差(RMSE):MSE的平方根,與目標值單位一致,更易解釋
rmse = np.sqrt(mse)
# 計算R方(R2):表示模型解釋的方差比例,范圍0-1,越接近1說明擬合效果越好
r2 = r2_score(y_test, y_pred)
# 打印評估指標結果
print("\n模型評估指標:")
print(f"均方誤差(MSE):{mse:.4f}")
print(f"均方根誤差(RMSE):{rmse:.4f}")
print(f"R方(R^2):{r2:.4f}")
# 9. 結果可視化:真實值與預測值對比
# 創建畫布,設置大小為10x6英寸
plt.figure(figsize=(10, 6))
# 繪制散點圖:x軸為真實值,y軸為預測值,alpha設置點的透明度
plt.scatter(y_test, y_pred, alpha=0.5, label='預測值 vs 真實值')
# 繪制參考線:y=x的虛線,表示理想情況下預測值等于真實值
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='理想預測線')
# 設置坐標軸標簽和圖表標題
plt.xlabel('真實病情發展指標')
plt.ylabel('預測病情發展指標')
plt.title('糖尿病病情預測:真實值 vs 預測值')
# 添加圖例和網格線
plt.legend()
plt.grid(alpha=0.3) ?# alpha設置網格線透明度
# 顯示圖表
plt.show()
# 10. 特征重要性可視化
# 計算各特征系數的絕對值,用于表示特征重要性(絕對值越大影響越大)
coef_abs = np.abs(model.coef_)
# 創建畫布,設置大小為10x6英寸
plt.figure(figsize=(10, 6))
# 繪制柱狀圖展示各特征的重要性
plt.bar(diabetes.feature_names, coef_abs)
# 設置圖表標題和坐標軸標簽
plt.title('特征重要性(基于系數絕對值)')
plt.xlabel('特征名稱')
plt.ylabel('系數絕對值')
# 添加y軸網格線,便于查看數值
plt.grid(axis='y', alpha=0.3)
# 顯示圖表
plt.show()