返回首页

Python 中的多元回归:scikit-learn

本文介绍了广告数据集上的多元线性回归。描述了数学基础、数据准备、训练 LinearRegression 模型、质量指标 (R²=0.90) 和残差诊断。

构建多元回归:TV、Radio、销售
Advertisement 728x90

Python中的多元线性回归:使用多个预测变量建模

多元线性回归通过引入多个自变量,扩展了简单线性回归。该模型在多维空间中拟合一个超平面,利用预测变量 X₁ 到 Xₙ 来预测目标变量 Y。每个系数 βᵢ 反映其对应因素的独立影响,同时保持其他变量不变。本文将使用广告数据集,基于电视、广播和报纸广告预算来预测销售额。

数学公式

模型方程为:

Y = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₙXₙ + ε

Google AdInline article slot

其中,β₀ 是截距项,βᵢ 为回归系数,ε 表示残差。最优的 β 值通过普通最小二乘法(OLS)计算得出:

β̂ = (XᵀX)⁻¹Xᵀy

此处,X 是扩展后的特征矩阵(包含一列全为1的常数项),y 是目标向量。关键假设包括变量间存在线性关系以及残差满足同方差性。

Google AdInline article slot

数据准备

将数据划分为训练集与测试集(80/20),以评估模型泛化能力并防止过拟合。对分类变量采用独热编码(One-Hot Encoding),数值型变量使用 StandardScaler 标准化——这有助于提升系数的可解释性。

关键步骤包括:

  • 检查缺失值和异常值。
  • 对分类变量进行编码。
  • 划分数据集:train_test_split(X, y, test_size=0.2, random_state=42)
  • 特征标准化:StandardScaler().fit_transform(X_train)

在广告数据集上的实现

数据集:共200条观测记录,目标是根据电视、广播和报纸广告预算预测销售额。

Google AdInline article slot

导入与加载数据

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

Advertisement 728x90

继续阅读