零基础入门机器学习 -- 第三章第一个机器学习模型——线性回归
3.1 线性回归的概念
在现实生活中,许多事情都遵循某种线性关系,比如:
- 房价 vs 面积:房子的面积越大,价格通常越高。
- 工资 vs 工作经验:工作经验越多,薪资往往更高。
- 汽车油耗 vs 车速:在一定范围内,车速越快,油耗可能越高。
线性回归(Linear Regression) 是机器学习中最基础的算法之一,它用于研究两个变量之间的线性关系,即一个变量(自变量)如何影响另一个变量(因变量)。
3.2 线性回归的数学直觉
线性回归的核心思想是找到一条最合适的直线,用来预测未知数据。
假设我们要预测房价(价格)与房屋面积(平方英尺)的关系,我们可以绘制一个散点图:
📌 示例:房价 vs 面积
面积(平方英尺) | 价格(万元) |
---|---|
500 | 50 |
700 | 75 |
1000 | 100 |
1200 | 130 |
1500 | 160 |
当我们把数据点画在图上,可能会看到一个趋势:面积越大,房价越高。
1. 线性回归的公式
线性回归试图找到如下直线:
y = mx + b
其中:
- ( y ) 是预测值(如房价)
- ( x ) 是输入值(如面积)
- ( m ) 是斜率,表示面积对房价的影响程度
- ( b ) 是截距,表示当面积为 0 时,房价的基准值
2. 直觉理解
- 斜率(m):如果 ( m ) 很大,表示面积对房价的影响很大(房价涨得快)。
- 截距(b):如果 ( b ) 很大,说明即使房子面积很小,房价也不会太低。
我们让计算机来学习这条直线,使得它能最小化误差,即预测值与真实值之间的偏差尽可能小。
3.3 实践案例:预测房价
3.3.1 使用 Python 构建线性回归模型
我们使用 scikit-learn
(简称 sklearn
)来实现线性回归。sklearn
是 Python 机器学习的标准库,提供了各种算法和数据处理工具。
📌 3.3.2 代码实现
我们使用 sklearn.linear_model.LinearRegression
进行训练,并绘制预测结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 训练数据:房屋面积(平方英尺)
X = np.array([500, 700, 1000, 1200, 1500]).reshape(-1, 1) # 需要转换成二维数组
# 目标数据:房价(万元)
y = np.array([50, 75, 100, 130, 160])
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X, y)
# 预测房价
X_test = np.array([600, 800, 1100, 1400]).reshape(-1, 1) # 新面积数据
y_pred = model.predict(X_test) # 预测房价
# 输出预测结果
for i in range(len(X_test)):
print(f"面积 {X_test[i][0]} 平方英尺的预测房价:{y_pred[i]:.2f} 万元")
# 解决中文显示问题
plt.rcParams["font.sans-serif"] = ["SimHei"] # Windows 和 Mac 可能需要不同字体
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
# 绘制训练数据
plt.scatter(X, y, color='blue', label="实际数据")
# 绘制预测的线
plt.plot(X, model.predict(X), color='red', label="回归直线")
# 添加标题和标签
plt.xlabel("面积(平方英尺)")
plt.ylabel("房价(万元)")
plt.title("线性回归:房价预测")
plt.legend()
plt.show()
📌 3.3.3 代码解析
np.array([...]).reshape(-1, 1)
:将数据转换成二维数组(因为sklearn
需要二维输入)。LinearRegression().fit(X, y)
:用X
(面积)训练模型,使它学习面积与房价的关系。model.predict(X_test)
:用训练好的模型预测新房价。
📌 3.3.4 运行结果
示例预测输出:
面积 600 平方英尺的预测房价:61.37 万元
面积 800 平方英尺的预测房价:83.28 万元
面积 1100 平方英尺的预测房价:116.15 万元
面积 1400 平方英尺的预测房价:149.01 万元
图表显示:
- 蓝色点:训练数据
- 红色直线:模型学习到的最优拟合线
3.4 关键难点总结
-
为什么要转换
X.reshape(-1, 1)
?- 因为
sklearn
要求X
是二维数组(即n 行 1 列
)。 - 如果
X
是一维数组,需要.reshape(-1, 1)
。
- 因为
-
如何衡量模型的好坏?
model.score(X, y)
返回决定系数(R² 值),接近1
说明模型拟合较好。
-
如果数据不符合线性关系怎么办?
- 线性回归适用于线性关系的数据。如果数据是非线性的,应该考虑多项式回归或神经网络。
3.5 课后练习
📌 练习 1:预测汽车价格
数据:
车型 | 里程(万公里) | 价格(万元) |
---|---|---|
A | 1 | 20 |
B | 3 | 15 |
C | 5 | 10 |
D | 7 | 6 |
E | 9 | 4 |
🚀 任务:
- 用 Python 实现线性回归,预测6 万公里和 8 万公里的汽车价格。
📌 练习 2:不同的数据集,结果会怎样?
- 修改房价数据,尝试增加/减少数据点,观察预测结果的变化。
- 思考:数据点少会导致什么问题?(过拟合还是欠拟合?)
3.6 练习讲解
如果你完成了练习 1,代码可能会类似于:
X = np.array([1, 3, 5, 7, 9]).reshape(-1, 1)
y = np.array([20, 15, 10, 6, 4])
model = LinearRegression()
model.fit(X, y)
X_test = np.array([6, 8]).reshape(-1, 1)
y_pred = model.predict(X_test)
print(y_pred)
你会发现二手车价格的下降趋势是线性的,而房价可能更复杂(非线性)。
3.7 本章小结
✅ 线性回归适用于线性关系的数据。
✅ sklearn
的 LinearRegression
可以快速实现训练和预测。
✅ **数据预处理(如 reshape
)**是机器学习的基本技能。
✅ 可视化有助于理解模型效果。
🚀 下一章:我们将学习分类问题,并使用 逻辑回归 来预测数据类别! 🎯