Python中的多元线性回归:使用多个预测变量建模
多元线性回归通过引入多个自变量,扩展了简单线性回归。该模型在多维空间中拟合一个超平面,利用预测变量 X₁ 到 Xₙ 来预测目标变量 Y。每个系数 βᵢ 反映其对应因素的独立影响,同时保持其他变量不变。本文将使用广告数据集,基于电视、广播和报纸广告预算来预测销售额。
数学公式
模型方程为:
Y = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₙXₙ + ε
其中,β₀ 是截距项,βᵢ 为回归系数,ε 表示残差。最优的 β 值通过普通最小二乘法(OLS)计算得出:
β̂ = (XᵀX)⁻¹Xᵀy
此处,X 是扩展后的特征矩阵(包含一列全为1的常数项),y 是目标向量。关键假设包括变量间存在线性关系以及残差满足同方差性。
数据准备
将数据划分为训练集与测试集(80/20),以评估模型泛化能力并防止过拟合。对分类变量采用独热编码(One-Hot Encoding),数值型变量使用 StandardScaler 标准化——这有助于提升系数的可解释性。
关键步骤包括:
- 检查缺失值和异常值。
- 对分类变量进行编码。
- 划分数据集:
train_test_split(X, y, test_size=0.2, random_state=42)。 - 特征标准化:
StandardScaler().fit_transform(X_train)。
在广告数据集上的实现
数据集:共200条观测记录,目标是根据电视、广播和报纸广告预算预测销售额。
导入与加载数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")
df = pd.read_csv("Advertising.csv")
if 'Unnamed: 0' in df.columns:
df = df.drop('Unnamed: 0', axis=1)
df.columns = ['TV', 'Radio', 'Newspaper', 'Sales']
print(df.head())
print(f"Data size: {df.shape}")
前几行数据:
| TV | Radio | Newspaper | Sales |
|-------|-------|-----------|-------|
| 230.1 | 37.8 | 69.2 | 22.1 |
| 44.5 | 39.3 | 45.1 | 10.4 |
探索性数据分析与相关性分析
描述性统计:
| | TV | Radio | Newspaper | Sales |
|-------|--------|-------|-----------|-------|
| mean | 147.04 | 23.26 | 30.55 | 14.02 |
| std | 85.85 | 14.85 | 21.78 | 5.22 |
与销售额的相关性:电视(0.78)、广播(0.58)、报纸(0.23)。
散点图显示电视与销售、广播与销售之间存在强线性关系,而报纸与销售的关系较弱。
模型训练
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
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)
print(f"Intercept: {model.intercept_:.4f}")
for name, coef in zip(X.columns, model.coef_):
print(f"{name}: {coef:.4f}")
结果:
- 截距:2.9791
- 电视:0.0447
- 广播:0.1892
- 报纸:0.0028
解读:每增加1000美元电视广告投入,销售额约上升44.7单位;广播广告带来约189.2单位的额外增长。报纸广告的影响几乎可以忽略。
模型评估
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}, RMSE: {rmse:.2f}, MAE: {mae:.2f}, R²: {r2:.4f}")
评估指标:
- MSE:3.17
- RMSE:1.78
- MAE:1.46
- R²:0.8994
R² 达到 0.90,说明模型能解释90%的销售额变异。RMSE 和 MAE 提供了误差的实际单位大小。
残差诊断
- 残差直方图:围绕零点对称。
- 残差与预测值图:无明显模式(满足同方差性)。
- 实际值与预测值散点图显示数据点紧密聚集在对角线附近。
关键洞察
- 多元回归可在控制混杂因素的前提下,分离各预测变量的影响。
- 报纸广告系数接近零,表明其对预测贡献极小。
- R² = 0.90 显示模型解释力强,但务必检查方差膨胀因子(VIF)以排除多重共线性。
- 始终分析残差,验证线性和正态性假设是否成立。
- OLS 不强制要求特征缩放,但标准化可显著提升系数的可读性。
— Editorial Team
暂无评论。