一、线性回归基本概念
1. 定义
线性回归通过线性方程(一次函数)来描述一个或多个自变量(X)与因变量(y)之间的关系:
y = β₀ + β₁X₁ + β₂X₂ + ... + βₙXₙ + ε
其中:
-
y:因变量(目标变量)
-
X₁, X₂,..., Xₙ:自变量(特征)
-
β₀:截距项(偏置)
-
β₁, β₂,..., βₙ:回归系数(权重)
-
ε:误差项(随机扰动)
2. 类型
-
简单线性回归:只有一个自变量
y = β₀ + β₁X + ε
-
多元线性回归:有多个自变量
y = β₀ + β₁X₁ + β₂X₂ + ... + βₙXₙ + ε
二、模型假设
线性回归的有效性依赖于以下经典假设:
-
线性关系:自变量与因变量存在线性关系
-
误差项独立性:误差项之间相互独立(无自相关)
-
误差项同方差性:误差项的方差恒定
-
误差项正态分布:误差项服从均值为0的正态分布
-
无多重共线性:自变量之间没有高度相关性
-
无内生性:自变量与误差项不相关
三、参数估计方法
1. 最小二乘法(Ordinary Least Squares, OLS)
最常用的参数估计方法,目标是使残差平方和(RSS)最小化:
RSS = Σ(yᵢ - ŷᵢ)² = Σ(yᵢ - (β₀ + β₁X₁ + ... + βₙXₙ))²
求解过程:
-
将问题表示为矩阵形式:
y = Xβ + ε
-
最小化目标函数:
argmin(||y - Xβ||²)
-
求解正规方程(Normal Equation)得到解析解:
β = (XᵀX)⁻¹Xᵀy
2. 梯度下降法(Gradient Descent)
当特征维度很高(XᵀX计算代价大)时使用迭代方法:
# 伪代码
初始化 β
while 未收敛:
计算梯度: ∇β = -Xᵀ(y - Xβ)
更新参数: β = β - α∇β # α为学习率
四、模型评估指标
1. 回归评估指标
-
均方误差(MSE):
MSE = (1/n)Σ(yᵢ - ŷᵢ)²
-
均方根误差(RMSE):
RMSE = √MSE
-
平均绝对误差(MAE):
MAE = (1/n)Σ|yᵢ - ŷᵢ|
-
R²决定系数:
R² = 1 - RSS/TSS = 1 - Σ(yᵢ-ŷᵢ)²/Σ(yᵢ-ȳ)²
(取值范围[0,1],越接近1说明模型解释力越强)
2. 统计检验
-
t检验:检验单个系数是否显著不为0
-
F检验:检验所有系数是否联合显著
-
DW检验:检验残差自相关(Durbin-Watson)
五、线性回归的Python实现
1. 使用NumPy手动实现
import numpy as np
class LinearRegression:
def __init__(self):
self.coef_ = None # 系数(β₁...βₙ)
self.intercept_ = None # 截距(β₀)
def fit(self, X, y):
# 添加截距项
X = np.insert(X, 0, 1, axis=1)
# 计算参数: β = (XᵀX)⁻¹Xᵀy
XTX = np.dot(X.T, X)
XTX_inv = np.linalg.inv(XTX)
XTy = np.dot(X.T, y)
beta = np.dot(XTX_inv, XTy)
self.intercept_ = beta[0]
self.coef_ = beta[1:]
def predict(self, X):
return self.intercept_ + np.dot(X, self.coef_)
# 使用示例
if __name__ == "__main__":
# 示例数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 5])
# 训练模型
lr = LinearRegression()
lr.fit(X, y)
# 预测
print("Coefficients:", lr.coef_)
print("Intercept:", lr.intercept_)
print("Prediction for X=6:", lr.predict(np.array([[6]])))
2. 使用scikit-learn实现
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
# 加载数据
data = load_diabetes()
X, y = data.data, data.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)
# 评估
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)
print("MSE:", mean_squared_error(y_test, y_pred))
print("R²:", r2_score(y_test, y_pred))
六、线性回归的优化与扩展
1. 正则化方法
-
岭回归(Ridge Regression):L2正则化
argmin(||y - Xβ||² + α||β||²)
-
Lasso回归:L1正则化
argmin(||y - Xβ||² + α||β||₁)
(具有特征选择能力)
-
弹性网络(Elastic Net):L1和L2正则化结合
argmin(||y - Xβ||² + α₁||β||₁ + α₂||β||²)
2. 多项式回归
通过添加特征的高次项来拟合非线性关系:
y = β₀ + β₁X + β₂X² + ... + βₙXⁿ
实现示例:
from sklearn.preprocessing import PolynomialFeatures
# 将特征转换为多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
# 使用线性回归拟合
model = LinearRegression()
model.fit(X_poly, y)
3. 鲁棒回归
对异常值不敏感的回归方法:
-
Huber回归
-
RANSAC回归
七、线性回归的局限性
-
线性假设:只能捕捉线性关系,无法处理复杂非线性模式
-
对异常值敏感:异常值会显著影响模型参数
-
多重共线性问题:当特征高度相关时,估计不可靠
-
需要完整数据:不能自动处理缺失值
-
高维限制:当特征数量多于样本数量时(XᵀX不可逆)
八、实际应用注意事项
-
数据预处理:
-
特征标准化/归一化(特别是使用正则化时)
-
处理缺失值
-
处理分类变量(独热编码等)
-
-
特征工程:
-
添加交互项
-
创建多项式特征
-
特征选择(减少多重共线性)
-
-
模型诊断:
-
检查残差图(应随机分布)
-
检查Q-Q图(检验正态性)
-
检查方差膨胀因子(VIF)检测多重共线性
-
-
变量转换:
-
对数转换处理非线性关系
-
Box-Cox转换处理非正态分布
-
九、线性回归的应用场景
-
经济学:预测GDP、物价指数等
-
金融:股票价格预测、风险评估
-
市场营销:销售预测、广告效果分析
-
医学:疾病风险预测、药物反应分析
-
工程:质量控制、工艺优化
-
社会科学:人口增长预测、教育成效分析
十、线性回归与其他算法的关系
-
与逻辑回归:逻辑回归是线性回归加上sigmoid函数,用于分类问题
-
与神经网络:单层神经网络等价于线性回归
-
与SVM:线性SVM可以看作是一种特殊形式的线性回归
-
与决策树:决策树可以捕捉线性回归无法处理的复杂非线性关系