线性回归看似简单,却是传统深度学习的"敲门砖"和"地基"。从预测房价到股票走势,从医学数据分析到工业参数优化,这个诞生于19世纪的算法至今仍在深度学习领域占据核心地位。本文将用最通俗的语言拆解线性回归的数学本质,手把手带你实现完整项目,让你从"知其然"到"知其所以然"!

预测房价和股市

预测房价和股市

另外,我还整理相关资料,需要的话可以分享给你

➔➔➔➔点击查看原文,获取更多机器学习干货和资料!https://mp.weixin.qq.com/s/S8YCS01JEeAOeC0KV2jLig

一、线性回归:从小学算术到深度学习的桥梁

1.1 什么是线性回归?

线性回归的核心思想可以用一句话概括:用直线(或高维空间中的超平面)拟合数据的趋势

假设我们有一组数据,其中是输入特征(如房屋面积),是输出标签(如房价)。线性回归的目标是找到一个函数:

使得(预测值)尽可能接近(真实值)。这里的称为权重(weight),称为偏置(bias),是我们需要求解的参数。

线性回归

线性回归

1.2 数学推导:如何找到最优的和?

(1)损失函数:衡量预测的"好坏"

要找到最优参数,首先需要定义"什么是好的预测"。通常用均方误差(MSE) 作为损失函数(Loss Function),计算预测值与真实值的平均平方差:

损失函数的值越小,说明预测效果越好。

(2)梯度下降:寻找损失函数的最小值

线性回归的求解本质是最小化损失函数。梯度下降(Gradient Descent)是最常用的方法,其核心思想是:沿着损失函数的负梯度方向不断更新参数,直到损失函数收敛到最小值

  • 对的偏导数(梯度):

  • 对的偏导数(梯度):

参数更新公式(为学习率,控制更新步长):

(3)解析解:一步到位求最优解

对于简单的线性回归,还可以直接通过数学公式求解最优参数(正规方程):

其中和分别是和的平均值。

二、实战项目:用线性回归预测波士顿房价(经典数据集)

下面我们用Python实现线性回归,预测波士顿房价(注:因原数据集涉及种族问题已下架,此处使用替代数据集california_housing)。

2.1 环境准备

确保安装以下库:

pip install numpy pandas matplotlib scikit-learn

2.2 完整代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import os

# 设置中文显示(服务器环境可能无需,但保留兼容)
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题

# 创建结果保存目录
os.makedirs("linear_regression_results", exist_ok=True)

# 1. 加载数据集
housing = fetch_california_housing()
X = housing.data  # 特征:平均收入、房龄、平均房间数等
y = housing.target  # 标签:房价(单位:10万美元)
feature_names = housing.feature_names

# 2. 数据预处理
# 划分训练集和测试集(7:3)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 特征标准化(加速梯度下降收敛)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 3. 训练线性回归模型(sklearn内置)
model = LinearRegression()
model.fit(X_train_scaled, y_train)

# 4. 模型评估
y_pred = model.predict(X_test_scaled)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"测试集均方误差(MSE):{mse:.4f}")
print(f"R²分数(越接近1越好):{r2:.4f}")
print("\n特征权重(反映特征对房价的影响):")
for name, weight in zip(feature_names, model.coef_):
    print(f"{name}: {weight:.4f}")
print(f"偏置(b):{model.intercept_:.4f}")

# 5. 可视化结果
# 图1:真实值vs预测值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5, label="预测值")
plt.plot([y.min(), y.max()], [y.min(), y.max()], "r--", label="理想预测线")
plt.xlabel("真实房价(10万美元)")
plt.ylabel("预测房价(10万美元)")
plt.title("真实值 vs 预测值")
plt.legend()
plt.savefig("linear_regression_results/true_vs_pred.png", dpi=300)
plt.close()

# 图2:残差分布(预测值-真实值)
residuals = y_pred - y_test
plt.figure(figsize=(10, 6))
plt.hist(residuals, bins=30, alpha=0.7)
plt.xlabel("残差(预测值-真实值)")
plt.ylabel("频数")
plt.title("残差分布直方图")
plt.axvline(x=0, color="r", linestyle="--")
plt.savefig("linear_regression_results/residuals_hist.png", dpi=300)
plt.close()

# 图3:特征权重条形图
plt.figure(figsize=(12, 6))
plt.bar(feature_names, model.coef_)
plt.xlabel("特征名称")
plt.ylabel("权重值")
plt.title("各特征对房价的影响权重")
plt.axhline(y=0, color="k", linestyle="--")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("linear_regression_results/feature_weights.png", dpi=300)
plt.close()

# 6. 手动实现简单线性回归(单特征,用于展示原理)
# 选择相关性最高的特征(平均收入)
median_income_idx = feature_names.index("MedInc")
X_train_single = X_train_scaled[:, median_income_idx].reshape(-1, 1)
X_test_single = X_test_scaled[:, median_income_idx].reshape(-1, 1)

# 手动实现梯度下降
class SimpleLinearRegression:
    def __init__(self, learning_rate=0.01, epochs=1000):
        self.w = None
        self.b = None
        self.learning_rate = learning_rate
        self.epochs = epochs
        self.loss_history = []
        
    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.w = np.zeros(n_features)
        self.b = 0
        
        for epoch in range(self.epochs):
            # 预测值
            y_pred = np.dot(X, self.w) + self.b
            # 计算损失
            loss = np.mean((y_pred - y) ** 2)
            self.loss_history.append(loss)
            # 计算梯度
            dw = (2 / n_samples) * np.dot(X.T, (y_pred - y))
            db = (2 / n_samples) * np.sum(y_pred - y)
            # 更新参数
            self.w -= self.learning_rate * dw
            self.b -= self.learning_rate * db
            
    def predict(self, X):
        return np.dot(X, self.w) + self.b

# 训练单特征模型
simple_model = SimpleLinearRegression(learning_rate=0.01, epochs=1000)
simple_model.fit(X_train_single, y_train)
y_pred_single = simple_model.predict(X_test_single)

# 图4:单特征拟合效果
plt.figure(figsize=(10, 6))
plt.scatter(X_test_single, y_test, alpha=0.5, label="真实数据")
plt.plot(X_test_single, y_pred_single, "r-", linewidth=2, label="拟合直线")
plt.xlabel("标准化后的平均收入")
plt.ylabel("房价(10万美元)")
plt.title("单特征线性回归拟合效果")
plt.legend()
plt.savefig("linear_regression_results/single_feature_fit.png", dpi=300)
plt.close()

# 图5:损失函数下降曲线
plt.figure(figsize=(10, 6))
plt.plot(range(simple_model.epochs), simple_model.loss_history)
plt.xlabel("迭代次数(Epochs)")
plt.ylabel("均方误差(MSE)")
plt.title("梯度下降过程中损失函数的变化")
plt.savefig("linear_regression_results/loss_curve.png", dpi=300)
plt.close()

print("\n所有结果图已保存至 'linear_regression_results' 目录")

2.3 代码说明与结果解读

  1. 数据集:使用加州房价数据,包含8个特征(如平均收入、房龄等)和房价标签。

  2. 核心步骤

    • 数据划分:训练集(70%)用于训练模型,测试集(30%)用于评估效果。

    • 特征标准化:消除量纲影响,使梯度下降更快收敛。

    • 模型训练:使用sklearnLinearRegression(基于正规方程)和手动实现的梯度下降。

  3. 评估指标

    • MSE(均方误差):衡量预测值与真实值的平均偏差。

    • R²分数:越接近1说明模型拟合效果越好(最大值为1)。 Loss Curve During Gradient Descent

  4. 可视化结果

    • 真实值vs预测值:理想情况下点应分布在红色虚线上。

    • 残差分布:若残差近似正态分布且均值接近0,说明模型无明显偏差。

    • 特征权重:正数表示特征与房价正相关(如收入越高房价越高),负数则相反。

    • 单特征拟合:展示线性回归的"直线拟合"本质。

    • 损失曲线:梯度下降过程中损失逐渐减小并收敛,验证算法有效性。

Linear Regression Comprehensive Results

Linear Regression Comprehensive Results

三、为什么线性回归是深度学习的基础?

  1. 思想奠基:线性回归的"拟合-优化"思路(定义损失函数→求解最优参数)是所有深度学习模型的核心框架。

  2. 扩展桥梁

    • 逻辑回归(分类任务)是线性回归的扩展(加激活函数)。

    • 神经网络的每一层本质是"线性变换+激活函数",多层叠加即深度学习。

  3. 优化启蒙:梯度下降算法在深度学习中被广泛使用,理解线性回归的梯度更新有助于掌握复杂模型的优化原理。

通过本文,你不仅学会了线性回归的数学原理和代码实现,更掌握了·。下一篇我们将讲解逻辑回归,带你从回归问题迈向分类任务!

另外我整理了线性回归的相关资料,感兴趣的自取!

➔➔➔➔点击查看原文,获取更多机器学习干货和资料!https://mp.weixin.qq.com/s/S8YCS01JEeAOeC0KV2jLig

更多推荐