第3集:线性回归——预测连续变量
在机器学习的世界中,线性回归是最基础、最直观的算法之一。它用于解决回归问题,即预测连续变量(如房价、销售额等)。尽管简单,但线性回归却是许多复杂模型的基石。今天我们将深入探讨线性回归的基本原理,并通过实践部分使用 Boston 房价数据集 构建一个线性回归模型。
线性回归的基本原理
什么是线性回归?
线性回归是一种监督学习算法,其目标是找到一条直线(或超平面),使得这条直线能够最好地拟合数据点。对于单变量线性回归,公式如下:
y
=
w
0
+
w
1
x
y = w_0 + w_1x
y=w0+w1x
其中:
y
y
y 是目标变量(预测值)。
x
x
x 是输入特征。
w
0
w_0
w0 是截距(偏置项)。
w
1
w_1
w1 是权重(斜率)。
图1:线性回归示意图
(图片描述:波士顿房价预测)
在线性回归中,我们的任务是找到最佳的 w 0 w_0 w0 和 w 1 w_1 w1,使得预测值与真实值之间的误差最小化。
损失函数与梯度下降法
损失函数
为了衡量模型的好坏,我们定义了一个损失函数(Loss Function)。最常用的损失函数是 均方误差(Mean Squared Error, MSE):
M
S
E
=
1
n
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
MSE=n1i=1∑n(yi−y^i)2
其中:
n
n
n 是样本数量。
y
i
y_i
yi 是第 i 个样本的真实值。
y
^
i
\hat{y}_i
y^i 是第 i 个样本的预测值。
MSE 的目标是让所有样本的预测误差平方和最小。
梯度下降法
梯度下降是一种优化算法,用于最小化损失函数。其核心思想是沿着损失函数的负梯度方向更新参数
w
w
w,直到达到最优解。更新公式为:
w
:
=
w
−
α
⋅
∂
J
(
w
)
∂
w
w := w - \alpha \cdot \frac{\partial J(w)}{\partial w}
w:=w−α⋅∂w∂J(w)
其中:
α
\alpha
α 是学习率(控制步长)。
J
(
w
)
J(w)
J(w) 是损失函数。
图2:梯度下降过程
(图片描述:三维曲面表示损失函数,小球从高处滚向最低点,代表参数逐步优化的过程。)
多元线性回归模型
当输入特征不止一个时,我们使用 多元线性回归。公式扩展为:
y
=
w
0
+
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
p
x
p
y = w_0 + w_1x_1 + w_2x_2 + ... + w_px_p
y=w0+w1x1+w2x2+...+wpxp
这可以写成矩阵形式:
y
=
X
⋅
w
\mathbf{y} = \mathbf{X} \cdot \mathbf{w}
y=X⋅w
其中:
y
\mathbf{y}
y 是目标变量向量。
X
\mathbf{X}
X 是特征矩阵。
w
\mathbf{w}
w 是权重向量。
如何评估回归模型性能
评估回归模型的性能通常使用以下指标:
1. 均方误差(MSE)
MSE 衡量预测值与真实值之间的平均误差平方。越小越好。
2. 决定系数(R²)
R² 表示模型对数据变异性的解释能力,取值范围为 [0, 1]。越接近 1,说明模型拟合效果越好。
示例代码(Python实现):
from sklearn.metrics import mean_squared_error, r2_score
# 计算 MSE 和 R²
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}, R²: {r2:.2f}")
实践部分:使用 Boston 房价数据集构建线性回归模型
数据集简介
Boston 房价数据集包含波士顿地区房屋价格及其相关特征,共有 506 条记录和 13 个特征。目标是预测房屋的中位数价格(单位:千美元)。
完整代码
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 加载数据
boston = load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
data['PRICE'] = boston.target
# 分割数据集
X = data.drop('PRICE', axis=1)
y = data['PRICE']
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)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"模型评估结果:")
print(f"MSE: {mse:.2f}, R²: {r2:.2f}")
运行结果:
模型评估结果:
MSE: 24.29, R²: 0.67
可视化展示
在波士顿房价预测任务中,通过可视化展示线性回归的预测直线和散点图可以帮助我们直观地理解模型的拟合效果。以下增加可视化模块的完整实现。
完整代码(包含可视化模块)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 加载数据
boston = load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
data['PRICE'] = boston.target
# 分割数据集
X = data[['RM']] # 使用房间数(RM)作为单一特征进行可视化
y = data['PRICE']
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)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"模型评估结果:")
print(f"MSE: {mse:.2f}, R²: {r2:.2f}")
# 可视化模块:绘制预测直线与散点图
plt.figure(figsize=(10, 6))
# 将 X_test 和 y_pred 转换为 NumPy 数组,并确保是一维的
X_test_array = X_test.values.flatten() # 转换为一维数组
y_pred_array = y_pred.flatten() # 转换为一维数组
# 绘制真实值的散点图
plt.scatter(X_test_array, y_test, color='blue', label='True Values', alpha=0.6)
# 绘制预测直线
plt.plot(X_test_array, y_pred_array, color='red', linewidth=2, label='Predicted Line')
# 添加标题和标签
plt.title('Linear Regression: Predicted vs True Values', fontsize=16)
plt.xlabel('Average Number of Rooms (RM)', fontsize=12)
plt.ylabel('House Price (in $1000s)', fontsize=12)
plt.legend()
# 显示图表
plt.show()
代码解析
1. 选择单一特征进行可视化
为了简化可视化过程,我们选择了 RM
(每栋住宅的平均房间数)作为唯一特征。这样可以将问题从多元线性回归降维到一元线性回归,便于绘制二维散点图和预测直线。
2. 绘制散点图
- 使用
plt.scatter
绘制测试集中真实房价与房间数的关系。 - 设置颜色为蓝色,透明度为 0.6,以便更好地观察数据分布。
3. 绘制预测直线
- 使用
plt.plot
绘制线性回归模型的预测直线。 - 预测值由
model.predict(X_test)
计算得出。 - 设置颜色为红色,线宽为 2,突出显示预测直线。
4. 添加标题、标签和图例
- 图表标题说明了可视化内容。
- 添加 x 轴和 y 轴标签,分别表示房间数和房价。
- 使用
plt.legend()
添加图例,区分真实值和预测值。
可视化结果
图1:线性回归预测直线与散点图
(图片描述:二维平面上展示了测试集的真实房价(蓝色散点)和线性回归模型的预测直线(红色)。大部分散点分布在直线附近,表明模型具有一定的拟合能力。)
通过增加可视化模块,我们可以直观地看到线性回归模型如何拟合数据。这种可视化方法不仅有助于理解模型的表现,还能帮助发现潜在的问题(如欠拟合或过拟合)。
总结
本文介绍了线性回归的核心概念,包括基本原理、损失函数、梯度下降法以及模型评估方法。通过实践部分,我们成功使用 Boston 房价数据集构建了一个线性回归模型,并对其性能通过数据分析和可视化进行了评估。是一篇非常具有实战价值的文章。
尽管线性回归简单易懂,但它仍然是许多实际问题的首选工具。希望这篇文章能帮助你更好地理解这一经典算法!
下集预告:第4集:逻辑回归——分类问题的基础
参考资料
- Scikit-learn 文档: https://scikit-learn.org/stable/documentation.html
- Boston 房价数据集: https://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html