线性回归入门:用 Python 从零实现简单预测模型
线性回归是机器学习中最基础也最实用的算法之一,特别适合初学者入门。它的核心思想是找到变量之间的线性关系,从而实现对未知数据的预测。本文将用通俗的语言解释线性回归的基本概念,并通过一个完整的 Python 案例,带您从零开始实现一个简单的线性回归模型。
一、什么是线性回归?
简单来说,线性回归就是用一条直线来 "最好地" 拟合数据点,从而描述自变量和因变量之间的关系。
举个生活中的例子:我们想研究 "学习时间" 和 "考试成绩" 之间的关系。收集到以下数据:
学习时间(小时) | 考试成绩(分) |
---|---|
1 | 60 |
2 | 65 |
3 | 75 |
4 | 80 |
5 | 85 |
通过观察可以发现,学习时间越长,成绩通常越高,呈现出一种近似直线的关系。线性回归就是要找到这条最能代表这种关系的直线,以便预测 "学习 6 小时能得多少分"。
二、线性回归的数学表达
简单线性回归(只有一个自变量)的数学公式非常简单:
y = wx + b
其中:
y
是我们要预测的结果(因变量),比如考试成绩x
是输入的特征(自变量),比如学习时间w
是斜率(权重),表示 x 每增加 1 个单位,y 平均增加多少b
是截距,表示当 x=0 时,y 的取值
我们的目标就是找到最合适的w
和b
,使得这条直线尽可能接近所有的数据点。
三、如何找到最佳的 w 和 b?
寻找最佳参数的过程称为 "模型训练",核心思想是让预测值与真实值之间的误差最小。常用的方法是最小二乘法,即最小化所有数据点的 "预测值与真实值之差的平方和"。
用数学公式表示,就是最小化以下损失函数:
损失 = Σ(y真实 - y预测)² = Σ(y真实 - (wx + b))²
幸运的是,我们不需要手动计算这个复杂的公式,Python 的机器学习库已经帮我们实现了这个过程。
四、用 Python 实现线性回归的完整步骤
下面我们通过一个具体案例,展示如何用 Python 实现线性回归。我们将使用scikit-learn
库(机器学习常用库)和matplotlib
库(绘图库)。
步骤 1:安装必要的库
如果还没有安装这些库,可以用以下命令安装:
pip install numpy pandas scikit-learn matplotlib
步骤 2:导入库
首先,我们需要导入后续会用到的 Python 库:
import numpy as np # 用于数值计算
import matplotlib.pyplot as plt # 用于绘图
from sklearn.linear_model import LinearRegression # 线性回归模型
步骤 3:准备数据
我们用上面提到的 "学习时间与考试成绩" 数据来进行演示:
# 学习时间(自变量x)
study_time = np.array([1, 2, 3, 4, 5]).reshape(-1, 1) # reshape是为了满足模型输入要求# 考试成绩(因变量y)
scores = np.array([60, 65, 75, 80, 85])
我们可以先绘制散点图,直观地看看数据分布:
plt.scatter(study_time, scores, color='blue')
plt.xlabel('学习时间(小时)')
plt.ylabel('考试成绩(分)')
plt.title('学习时间与考试成绩的关系')
plt.show()
运行这段代码,会看到一个散点图,显示学习时间和成绩之间的正相关关系。
步骤 4:创建并训练模型
使用scikit-learn
库中的LinearRegression
类来创建模型并进行训练:
# 创建线性回归模型
model = LinearRegression()# 训练模型(拟合数据)
model.fit(study_time, scores)
训练完成后,我们可以查看模型找到的最佳参数w
和b
:
# 获取斜率w
w = model.coef_[0]# 获取截距b
b = model.intercept_print(f"斜率w: {w:.2f}")
print(f"截距b: {b:.2f}")
print(f"回归方程: y = {w:.2f}x + {b:.2f}")
运行结果应该类似:
斜率w: 6.50
截距b: 55.50
回归方程: y = 6.50x + 55.50
这个结果告诉我们:学习时间每增加 1 小时,考试成绩平均增加 6.5 分。
步骤 5:可视化拟合结果
我们可以将拟合出的直线与原始数据点一起绘制,直观地查看拟合效果:
# 绘制原始数据点
plt.scatter(study_time, scores, color='blue', label='实际数据')# 绘制拟合直线
plt.plot(study_time, model.predict(study_time), color='red', linewidth=2, label=f'拟合直线: y = {w:.2f}x + {b:.2f}')plt.xlabel('学习时间(小时)')
plt.ylabel('考试成绩(分)')
plt.title('学习时间与考试成绩的线性回归')
plt.legend() # 显示图例
plt.grid(alpha=0.3) # 显示网格
plt.show()
从图中可以看到,红色直线很好地穿过了数据点,代表了学习时间和成绩之间的线性关系。
步骤 6:模型评估
我们可以用决定系数(R²)来评估模型的拟合效果,R² 的取值范围是 [0,1],越接近 1 表示拟合效果越好:
# 计算R²
r2 = model.score(study_time, scores)
print(f"决定系数R²: {r2:.2f}")
在这个案例中,R² 应该接近 1,说明拟合效果很好。
步骤 7:进行预测
有了训练好的模型,我们就可以用它来预测新的数据了。比如预测学习 6 小时的考试成绩:
# 预测学习6小时的成绩
new_time = np.array([[6]]) # 注意输入格式是二维数组
predicted_score = model.predict(new_time)print(f"学习6小时,预测成绩为: {predicted_score[0]:.2f}分")
运行结果应该是约 94.5 分(6.5×6 + 55.5 = 94.5)。
五、完整代码汇总
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression# 1. 准备数据
study_time = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
scores = np.array([60, 65, 75, 80, 85])# 2. 绘制原始数据散点图
plt.scatter(study_time, scores, color='blue')
plt.xlabel('学习时间(小时)')
plt.ylabel('考试成绩(分)')
plt.title('学习时间与考试成绩的关系')
plt.show()# 3. 创建并训练模型
model = LinearRegression()
model.fit(study_time, scores)# 4. 获取模型参数
w = model.coef_[0]
b = model.intercept_
print(f"斜率w: {w:.2f}")
print(f"截距b: {b:.2f}")
print(f"回归方程: y = {w:.2f}x + {b:.2f}")# 5. 可视化拟合结果
plt.scatter(study_time, scores, color='blue', label='实际数据')
plt.plot(study_time, model.predict(study_time), color='red', linewidth=2, label=f'拟合直线: y = {w:.2f}x + {b:.2f}')
plt.xlabel('学习时间(小时)')
plt.ylabel('考试成绩(分)')
plt.title('学习时间与考试成绩的线性回归')
plt.legend()
plt.grid(alpha=0.3)
plt.show()# 6. 模型评估
r2 = model.score(study_time, scores)
print(f"决定系数R²: {r2:.2f}")# 7. 进行预测
new_time = np.array([[6]])
predicted_score = model.predict(new_time)
print(f"学习6小时,预测成绩为: {predicted_score[0]:.2f}分")
六、线性回归的应用场景
线性回归虽然简单,但在实际生活中有很多应用:
- 房价预测:根据房屋面积、房龄等因素预测房价
- 销量预测:根据广告投入预测产品销量
- 成绩预测:根据学习时间、出勤率等预测考试成绩
- 健康预测:根据体重、运动量预测血压、血糖等指标
七、总结
本文介绍了线性回归的基本概念和 Python 实现方法,主要包括:
- 线性回归的核心是用一条直线拟合数据,找到变量间的线性关系
- 简单线性回归的数学表达式是 y = wx + b
- 用 scikit-learn 库可以快速实现线性回归模型
- 模型训练后可以得到参数 w 和 b,并用于预测新数据
线性回归是机器学习的基础,掌握它有助于理解更复杂的算法。下一篇文章我们将介绍更复杂的多元线性回归,即多个自变量的情况。
希望这篇文章能帮助您入门线性回归,如果有任何问题,欢迎在评论区留言讨论!