大家好,欢迎来到《算法入门》系列。今天我们要聊的是机器学习中最基础、最经典的算法之一——线性回归。如果你是刚入门的朋友,不用担心,我们将用最简单、最通俗的语言带你从零开始理解它。既然是“入门”,那我们就从最基础的概念讲起。
线性回归,顾名思义,就是通过“线性”的方式来拟合数据,并找出自变量与因变量之间的关系。简单来说,线性回归的目标就是用一条直线来预测结果。
假设你有一组数据,想要预测某个变量(例如:房价)与其他变量(例如:房屋面积、卧室数量等)之间的关系。那么,线性回归就能帮助你建立这种关系,并通过一个公式来预测未来的结果。
举个例子 假设你是一个房地产公司老板,你有以下数据:
房屋面积 (平方米) | 房价 (万元) |
---|---|
50 | 80 |
60 | 100 |
70 | 120 |
80 | 140 |
你可以看到,随着房屋面积的增加,房价也逐渐增加。线性回归的任务就是找出一个公式,预测在给定面积下,房价大概是多少。
线性回归的核心思想是:假设输入变量(特征)与输出变量(目标)之间存在线性关系。我们可以用以下简单的公式来表示:
其中:
我们的目标就是通过数据,找到最适合的 β₀ 和 β₁。这就相当于在图上画一条直线,让这条直线最准确地通过所有数据点(或者至少离数据点最近)。
线性回归的训练过程实际上就是在找最合适的 β₀ 和 β₁。我们希望通过最小化一个叫做“损失函数”的东西来做到这一点。最常见的损失函数是均方误差 (MSE),也就是每个预测值与真实值之间差距的平方和,再取平均。 损失函数的公式如下:
其中:
是真实值
是预测值
是样本数量
我们的目标是通过调整 β₀ 和 β₁ 的值,使得损失函数的值最小。直观上看,就是要让预测值尽可能接近真实值。
训练过程的核心步骤是通过梯度下降法来优化参数。这是一个不断调整参数的过程。每次调整的方向都与当前误差的梯度有关,直到找到使得损失函数最小的参数。
好,我们了解了线性回归的基本原理。接下来我们用 Python 实际操作一下,看看如何用线性回归来预测房价。 首先,我们需要导入一些必要的库:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
接着,我们准备一下数据:
# 房屋面积 (平方米)
X = np.array([[50], [60], [70], [80]])
# 房价 (万元)
y = np.array([80, 100, 120, 140])
然后,我们创建一个线性回归模型,并进行训练:
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X, y)
现在,我们可以查看模型的参数(β₀ 和 β₁):
# 截距(β₀)
print("截距 β₀:", model.intercept_)
# 斜率(β₁)
print("斜率 β₁:", model.coef_)
模型训练完成后,我们可以用它来进行预测:
# 预测房价
predictions = model.predict(X)
# 打印预测值
print("预测房价:", predictions)
为了更直观地理解模型效果,我们可以绘制数据点和拟合的直线:
# 绘制数据点
plt.scatter(X, y, color='blue', label='实际数据')
# 绘制拟合直线
plt.plot(X, predictions, color='red', label='拟合直线')
# 添加标签
plt.xlabel('房屋面积 (平方米)')
plt.ylabel('房价 (万元)')
plt.title('房屋面积与房价的关系')
# 显示图例
plt.legend()
# 显示图形
plt.show()
运行这段代码后,你将看到和下面一样的一张图,图中包含了数据点(蓝色)和拟合的直线(红色)。这个直线就是你用线性回归模型预测房价的结果。
为了具体演示如何应用线性回归,我们将使用一个来自 Kaggle 的数据集。使用波士顿房价数据集(Boston Housing Dataset),来帮助你理解线性回归的原理与应用。
波士顿房价数据集包含了506个房屋信息,每条记录描述了一个区域的各类统计特征,包括犯罪率、房间数量、房屋年龄等,目标变量是房价的中位数(MEDV)。数据集中的特征包括:
我们的目标是找到一个最优的权重,使得通过这些权重计算出的预测值尽可能接近真实的房价。
在进行线性回归建模之前,我们首先需要对数据进行一些预处理。以下是对波士顿数据集的一些基本操作: 导入所需库并加载数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 加载波士顿房价数据集
df = pd.read_csv('/kaggle/input/the-boston-houseprice-data/boston.csv')
df.head()
输出结果如下所示:
了解数据的分布情况和相关性是建模过程中的重要一步。可以通过散点图、热力图等可视化工具帮助分析数据特征与目标变量之间的关系。
# 可视化CRIM与MEDV的关系
plt.scatter(df['CRIM'], df['MEDV'])
plt.xlabel('Crime Rate (CRIM)')
plt.ylabel('Median Value of Homes (MEDV)')
plt.title('Crime Rate vs Home Prices')
plt.show()
# 相关性矩阵
corr_matrix = df.corr()
import seaborn as sns
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.show()
我们将数据集分为训练集和测试集,用于模型训练和验证。
# 特征与目标变量
X = df.drop('MEDV', axis=1)
y = df['MEDV']
# 分割数据集(80% 训练集,20% 测试集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
这里的random_state=42是设置随机种子,如果你和我设置成一样,就可以得到完全一样的结果。
使用Scikit-learn的LinearRegression类,我们可以非常简单地训练一个线性回归模型:
# 创建线性回归模型
model = LinearRegression()
# 在训练集上训练模型
model.fit(X_train, y_train)
# 输出模型的截距和回归系数
print('截距 (Intercept):', model.intercept_)
print('回归系数 (Coefficients):', model.coef_)
训练完成后,我们可以在测试集上进行预测,并评估模型的性能。常用的回归模型评估指标包括均方误差(MSE)和决定系数(R²)。
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算均方误差(MSE)和决定系数(R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'均方误差 (MSE): {mse}')
print(f'决定系数 (R²): {r2}')
可以看到效果并不是太好,不过这里只做演示使用,后续讲到模型优化部分,我在教大家如何优化当前模型。
我们还可以通过可视化预测结果来观察模型的拟合情况:
import matplotlib.pyplot as plt
# 设置画布的大小
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, c='steelblue', label='数据点', alpha=0.7)
# 添加对角线(表示理想情况下的预测)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r--', label='理想线')
plt.xlabel('真实值 (True Values)', fontsize=14, color='darkgreen')
plt.ylabel('预测值 (Predictions)', fontsize=14, color='darkgreen')
plt.title('True vs Predicted Home Prices', fontsize=16, fontweight='bold', color='navy')
# 设置轴刻度标签的字体大小和颜色
plt.tick_params(axis='both', which='major', labelsize=12, colors='gray')
# 设置图例的位置和字体大小
plt.legend(loc='upper left', fontsize=12)
plt.show()
这张图会显示测试集中的实际房价与预测房价的对比。红色虚线表示完美预测的情况,即预测值与实际值完全一致。
回顾一下上述所学到的内容:
线性回归虽然简单,但它是机器学习的基础,为更复杂的模型打下了坚实的基础。希望你能通过今天的学习,对线性回归有一个清晰的理解。如果你对这个算法有任何问题,随时可以问我哦!
好了到了这里各位道友就开始正式迈入金丹期了,预祝各位道友丹途坦荡。
下次我们将继续探索其他机器学习算法,敬请期待!
数据集地址:https://www.kaggle.com/datasets/fedesoriano/the-boston-houseprice-data