小明的困惑:“每天的销量总是不稳定,有时候面包卖光了,顾客来了买不到;有时候又做太多,卖不完只能扔掉。如果能提前预测明天的销量,我就能控制生产,避免浪费!有没有什么办法能帮我预测明天的销量呢?”
当然有!机器学习的回归算法 就是用来预测连续值(如销量、房价、温度等)的理想工具。在这个章节,我们将教小明如何使用线性回归 来预测每天的销量,并通过数据分析和模型优化来提高预测精度。
5.1 什么是回归?
在机器学习中,回归 (Regression) 是用来预测一个连续数值的算法,比如:
- 预测房价:一套房子会卖多少钱?
- 预测气温:明天的气温是多少度?
- 预测销量:明天的面包销量是多少?
回归 vs. 分类
任务 | 回归 (Regression) | 分类 (Classification) |
---|---|---|
预测目标 | 一个具体数值 | 一个类别标签 |
示例 | 预测明天能卖多少个面包(80 个?100 个?) | 预测顾客是否会成为忠实会员(是/否) |
算法示例 | 线性回归、随机森林回归、XGBoost 回归 | 逻辑回归、决策树、随机森林分类 |
比喻一下:
- 分类就像是在预测一个人喜欢吃哪种口味的蛋糕(草莓🍓 / 巧克力🍫 / 抹茶🍵)。
- 回归就像是在预测这个人今天会吃几个蛋糕(1 个?2 个?还是 5 个?)。
小明的目标 是预测每天的销量(具体数值),所以我们要用 回归算法 来解决这个问题!
5.2 影响销量的因素有哪些?
预测销量之前,我们先想想:
哪些因素会影响每天的销量?
影响因素 | 可能的影响 |
---|---|
昨天的销量 | 如果昨天卖得很好,今天可能也会不错 |
天气情况 | 天气晴朗☀️时,顾客更愿意出门消费 |
是否有促销 | 促销时销量通常会上升 📈 |
星期几 | 周末的销量可能比工作日高 |
节假日 | 例如母亲节,蛋糕店销量会大涨!🎂 |
所以,我们的回归模型的输入特征 (X) 可能包括:
yesterday_sales
(昨日销量)promotion_flag
(是否促销:1=是,0=否)weather_index
(天气指数:0=糟糕,1=完美)weekday
(星期几)
最终,我们希望找到一个公式:
sales
=
w
1
×
昨日销量
+
w
2
×
是否促销
+
w
3
×
天气指数
+
w
4
×
weekday
+
b
\text{sales} = w_1 \times \text{昨日销量} + w_2 \times \text{是否促销} + w_3 \times \text{天气指数} + w_4 \times \text{weekday} + b
sales=w1×昨日销量+w2×是否促销+w3×天气指数+w4×weekday+b
其中:
- ( w_1, w_2, w_3, w_4 ) 是机器学习模型学到的参数,表示每个因素对销量的影响程度。
- ( b ) 是偏置项,表示基础销量。
5.3 线性回归:销量预测的第一步
🌟 线性回归的基本概念
线性回归 (Linear Regression) 是最基础的回归算法,它的核心思想是:
- 找到一条最适合的数据直线,使得模型预测值和实际销量的误差最小。
示例:天气指数 vs. 销量
假设我们收集了过去 10 天的销量数据,并发现天气和销量之间存在一定的线性关系:
天气指数 | 销量 |
---|---|
0.2 | 500 |
0.3 | 700 |
0.5 | 900 |
0.7 | 1100 |
0.9 | 1300 |
如果画出天气指数 vs. 销量的散点图,我们会发现数据点大致呈上升趋势:
- 天气指数越高(天气越好),销量越高。
此时,线性回归会找出一条最佳拟合直线,例如:
销量
=
1000
×
天气指数
+
200
\text{销量} = 1000 \times \text{天气指数} + 200
销量=1000×天气指数+200
- 当天气指数 = 0.2 时,预测销量 = 1000×0.2 + 200 = 400
- 当天气指数 = 0.9 时,预测销量 = 1000×0.9 + 200 = 1100
这样,我们就能利用天气指数预测未来的销量!
5.4 用 Python 训练线性回归模型
现在,我们让小明使用 Python 训练一个线性回归模型,来预测每日销量。
📌 代码示例
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 读取数据
df_sales = pd.read_csv("sales_data.csv")
# 选择特征
X = df_sales[['yesterday_sales', 'promotion_flag', 'weather_index', 'weekday']]
y = df_sales['sales_amount']
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练线性回归模型
lr = LinearRegression()
lr.fit(X_train, y_train)
# 预测测试集的销量
y_pred = lr.predict(X_test)
# 计算模型的误差
mse = mean_squared_error(y_test, y_pred) # 均方误差
r2 = r2_score(y_test, y_pred) # R² 分数
print("均方误差 (MSE):", mse)
print("R² 分数:", r2)
5.5 如何评价模型的好坏?
训练完模型后,我们要看看它的表现如何,通常用两个指标:
✅ 1. 均方误差 (MSE)
均方误差(Mean Squared Error, MSE)表示预测值和真实值之间的平均平方误差:
M
S
E
=
1
n
∑
(
预测值
−
真实值
)
2
MSE = \frac{1}{n} \sum (预测值 - 真实值)^2
MSE=n1∑(预测值−真实值)2
- MSE 越小,表示误差越小,模型预测越准。
- 如果 MSE 太大,说明模型预测不准,可能需要优化。
✅ 2. R² 决定系数
R² 代表模型的拟合优度,表示模型能解释数据变化的程度:
R
2
=
1
−
∑
(
预测值
−
真实值
)
2
∑
(
真实值
−
平均值
)
2
R^2 = 1 - \frac{\sum (预测值 - 真实值)^2}{\sum (真实值 - 平均值)^2}
R2=1−∑(真实值−平均值)2∑(预测值−真实值)2
- R² 越接近 1,模型越好 🎯
- R² 接近 0,说明模型预测能力很差 ❌
5.6 小明的收获
小明看到 R² 分数后,兴奋地说:
“原来天气、促销和昨天的销量对明天的销量影响这么大!以后天气好时,我就多准备点面包;如果有促销活动,我就提前安排备货!”
机器学习的价值:
✅ 避免卖不完浪费
✅ 避免缺货损失顾客
✅ 让数据驱动决策,而不是靠猜测!
5.7 结论
- 线性回归可以帮助我们预测每日销量 📈
- 天气、促销、昨日销量等因素会影响未来销量 🌤️
- 使用 MSE 和 R² 评估模型表现,确保预测准确度 🎯
下一步,我们将探索如何优化模型,提高预测准确率!🚀