用天气预测理解分类算法-从出门看天气到逻辑回归
一、生活中的决策难题:周末郊游的「天气判断」
周末计划郊游时,你是不是总会打开天气预报反复确认?看到 "25℃、微风、无雨" 就兴奋收拾行李,看到 "35℃、暴雨" 就果断取消计划。这个判断过程,其实就是一个典型的二分类问题:
if 温度20-28℃ + 无降雨 + 风力<3级 → 适合郊游(y=1)
else → 不适合郊游(y=0)
这种根据多个天气因素做 "是 / 否" 判断的场景,正是逻辑回归的典型应用。今天我们就用 "是否适合郊游" 的天气预测为例,一步步揭开逻辑回归的神秘面纱。
二、从生活经验到数学模型:逻辑回归的核心逻辑
1. 特征收集:给天气「记账」
假设我们记录了 100 个周末的天气数据,每次记录四个关键特征:
- \(x_1\):气温(℃)
- \(x_2\):湿度(%)
- \(x_3\):降雨量(mm)
- \(x_4\):风力(级)
以及一个结果:当天是否适合郊游(\(y=1\)表示适合,\(y=0\)表示不适合)
我们的目标是找到一个公式,输入这四个天气特征就能预测是否适合郊游。
2. 线性组合:给天气因素「打分」
判断是否适合郊游时,不同天气因素的重要性不同。比如降雨量的影响通常比湿度大,我们可以用线性组合表示这种权重分配:
\(z = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + \theta_4x_4\)
- \(\theta_0\)是基础分(即使所有特征一般也有基础概率)
- \(\theta_1\)是气温权重(正值,舒适温度加分)
- \(\theta_2\)是湿度权重(负值,湿度过高减分)
- \(\theta_3\)是降雨量权重(负值,下雨严重减分)
- \(\theta_4\)是风力权重(负值,风太大减分)
举个例子:如果\(\theta_0=-10\),\(\theta_1=0.5\),\(\theta_2=-0.2\),\(\theta_3=-3\),\(\theta_4=-1\)
当气温 25℃,湿度 60%,降雨量 0mm,风力 2 级时:
\(z = -10 + 0.5×25 + (-0.2)×60 + (-3)×0 + (-1)×2\)
\(= -10 + 12.5 - 12 + 0 - 2 = -11.5\)?不对,这显然有问题!
哦,这里发现错误:舒适气温应该是中间值最好,太低或太高都不好。所以实际应用中特征可能需要转换(比如用气温与 25℃的差值),这里简化为:
修正后计算:\(z = -5 + 0.3×25 + (-0.1)×60 + (-2)×0 + (-0.5)×2 = -5 + 7.5 - 6 + 0 -1 = -4.5\)?还是不对,说明权重需要合理设置。
正确示例:当\(\theta_0=-20\),\(\theta_1=1.2\)(气温 20-28℃为正值),\(\theta_2=-0.1\),\(\theta_3=-5\),\(\theta_4=-1.5\)
\(z = -20 + 1.2×25 + (-0.1)×60 + (-5)×0 + (-1.5)×2\)
\(= -20 + 30 - 6 + 0 - 3 = 1\)(正值,适合郊游)
3. Sigmoid 函数:概率「转换器」
线性组合的结果\(z\)可正可负,我们需要把它转换成 0-1 之间的概率。Sigmoid 函数就像一个 "概率转换器":
\(\hat{y} = \frac{1}{1 + e^{-z}}\)
它的神奇特性:
- 当\(z=0\)时,\(\hat{y}=0.5\)(一半概率适合郊游)
- 当\(z=3\)时,\(\hat{y}≈0.95\)(很可能适合)
- 当\(z=-3\)时,\(\hat{y}≈0.05\)(很可能不适合)
用刚才的正确示例,\(z=1\)时:
\(\hat{y} = 1/(1+e^{-1}) ≈ 0.73\)(73% 概率适合郊游)
三、模型学习:让电脑学会看天气
1. 损失函数:给预测「打分」
如果模型预测某天气 73% 适合郊游(\(\hat{y}=0.73\)),但实际当天大雨取消了(\(y=0\)),这就是预测错误。损失函数用来衡量错误程度:
\(\text{Loss} = -y \log(\hat{y}) - (1-y) \log(1-\hat{y})\)
通俗解释:
- 实际适合郊游(\(y=1\))却预测概率低,损失大
- 实际不适合(\(y=0\))却预测概率高,损失大
2. 梯度下降:优化预测模型
我们需要找到最优的\(\theta\)值让损失最小,梯度下降就像 "盲人找最低点":
- 先随便猜一组参数(比如全为 0)
- 计算当前 "坡度"(梯度)
- 沿着坡度向下走一小步(更新参数)
- 重复直到走到 "谷底"(损失最小)
更新公式:\(\theta_j = \theta_j - \alpha × 梯度\),\(\alpha\)是步长(学习率)
四、代码实战:手把手实现「郊游天气预测器」
# 1. 导入工具包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 2. 生成模拟天气数据(100个周末)
np.random.seed(42) # 固定随机种子,结果可重复
n_samples = 100
# 特征1:气温(15-35℃)
temperature = np.random.uniform(15, 35, n_samples)
# 特征2:湿度(30%-90%)
humidity = np.random.uniform(30, 90, n_samples)
# 特征3:降雨量(0-50mm)
rainfall = np.random.uniform(0, 50, n_samples)
# 特征4:风力(1-8级)
wind = np.random.uniform(1, 8, n_samples)
# 组合特征
X = np.column_stack((temperature, humidity, rainfall, wind))
# 生成标签(是否适合郊游)
# 简单规则:气温适宜(20-28℃)+ 少雨 + 风力小更适合
y = (
(temperature > 20) & (temperature < 28) & # 气温适宜
(rainfall < 5) & # 少雨
(wind < 3) & # 风力小
(humidity < 70) # 湿度适中
).astype(int)
# 3. 划分训练集和测试集(80%训练,20%测试)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 4. 创建并训练模型
model = LogisticRegression() # 初始化模型
model.fit(X_train, y_train) # 用训练数据学习参数
# 5. 测试模型效果
y_pred = model.predict(X_test) # 预测测试集
accuracy = accuracy_score(y_test, y_pred) # 计算准确率
print(f"模型准确率:{accuracy:.2f}(越高越好)") # 通常能达到0.8以上
# 6. 查看模型学到的参数(特征重要性)
print("\n模型学到的权重:")
print(f"基础分(θ₀):{model.intercept_[0]:.2f}")
print(f"气温权重(θ₁):{model.coef_[0][0]:.2f}")
print(f"湿度权重(θ₂):{model.coef_[0][1]:.2f}")
print(f"降雨量权重(θ₃):{model.coef_[0][2]:.2f}")
print(f"风力权重(θ₄):{model.coef_[0][3]:.2f}")
# 7. 预测新的天气情况
# 比如:25℃,60%湿度,0mm降雨,2级风
new_weather = np.array([[25, 60, 0, 2]])
pred_prob = model.predict_proba(new_weather)[0][1] # 适合郊游的概率
print(f"\n该天气适合郊游的概率:{pred_prob:.2f}")
print("预测结果:", "适合郊游" if pred_prob > 0.5 else "不适合郊游")
# 8. 可视化决策边界(取气温和降雨量两个特征)
plt.figure(figsize=(10, 6))
# 绘制训练数据点
plt.scatter(
X_train[:, 0], X_train[:, 2], # 气温和降雨量
c=y_train,
cmap='bwr', # 红色适合,蓝色不适合
alpha=0.6,
label='训练数据'
)
# 绘制测试数据点(X标记)
plt.scatter(
X_test[:, 0], X_test[:, 2],
c=y_test,
cmap='bwr',
marker='x',
s=100,
label='测试数据'
)
plt.xlabel('气温(℃)')
plt.ylabel('降雨量(mm)')
plt.title('郊游天气预测:是否适合郊游')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
五、关键概念通俗解释
术语 | 通俗解释 | 天气类比 |
特征 | 影响结果的因素 | 气温、降雨量等天气因素 |
权重 | 特征的重要程度 | 降雨量比湿度影响更大 |
Sigmoid 函数 | 分数转概率的工具 | 60 分以上算及格的评分标准 |
损失函数 | 衡量预测错误的程度 | 预报晴天却下雨的错误程度 |
梯度下降 | 优化参数的方法 | 根据错误调整判断标准 |
准确率 | 预测正确的比例 | 10 次预报对了 8 次 → 80% 准确率 |
六、逻辑回归的天气预测能力分析
优点:
- 解释性强:能清晰看到 "降雨量权重最高",符合生活常识
- 速度快:手机 APP 能实时运行,快速给出预测结果
- 概率输出:不只是说 "适合郊游",还能告诉你 "85% 概率适合"
缺点:
- 线性限制:无法捕捉非线性关系(比如极端高温和极端低温都不适合)
- 特征依赖:需要人工选择有价值的特征(比如忘记考虑紫外线强度)
七、提升预测准确性的技巧
- 特征工程:对气温做分段处理(比如设置舒适区间得分)
# 气温舒适度特征:20-28℃得1分,否则得0分
temp_comfort = ((X[:,0] > 20) & (X[:,0] < 28)).astype(int)
X = np.column_stack((X, temp_comfort)) # 添加新特征
- 特征标准化:消除单位差异影响
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 标准化所有特征
- 正则化调参:防止过度拟合个别极端天气
model = LogisticRegression(C=0.5) # C值越小,正则化越强
八、完整可运行代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
# 生成天气数据
np.random.seed(42)
n_samples = 100
temperature = np.random.uniform(15, 35, n_samples)
humidity = np.random.uniform(30, 90, n_samples)
rainfall = np.random.uniform(0, 50, n_samples)
wind = np.random.uniform(1, 8, n_samples)
X = np.column_stack((temperature, humidity, rainfall, wind))
# 生成标签
y = (
(temperature > 20) & (temperature < 28) &
(rainfall < 5) &
(wind < 3) &
(humidity < 70)
).astype(int)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.2, random_state=42
)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 评估模型
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy:.2f}")
# 预测新天气
new_weather = np.array([[25, 60, 0, 2]]) # 25℃,60%湿度,无雨,2级风
new_weather_scaled = scaler.transform(new_weather)
pred_prob = model.predict_proba(new_weather_scaled)[0][1]
print(f"适合郊游概率:{pred_prob:.2f} → {'适合' if pred_prob>0.5 else '不适合'}")
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(X_train[:, 0], X_train[:, 2], c=y_train, cmap='bwr', alpha=0.6, label='训练数据')
plt.scatter(X_test[:, 0], X_test[:, 2], c=y_test, cmap='bwr', marker='x', s=100, label='测试数据')
plt.xlabel('气温(标准化后)')
plt.ylabel('降雨量(标准化后)')
plt.title('天气预测决策图')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
九、总结
逻辑回归本质上是把人类的经验判断转化为数学公式的过程:
- 观察影响结果的关键因素(天气特征)
- 给不同因素分配合理的重要性(权重)
- 通过数据学习找到最优的判断标准
- 用这个标准预测未来情况
下次查看天气预报时,你可以试着用逻辑回归的思路分析:哪些因素对决策影响最大?它们的 "权重" 应该是多少?通过今天的学习,你不仅掌握了逻辑回归的核心原理,还能亲手实现一个简单的天气预测模型。
现在,试着修改代码中的天气特征或参数,看看模型预测结果会如何变化吧! 🌤️
还想看更多,来啦!!!
1,大数据比赛篇全国职业院校技能大赛-大数据比赛心得体会_全国职业职业技能比赛 大数据-CSDN博客
2,求职简历篇(超实用)大学生简历写作指南:让你的简历脱颖而出-CSDN博客
3,AIGC心得篇aigc时代,普通人需要知道的-CSDN博客
4,数据分析思维篇学习数据分析思维的共鸣-CSDN博客
5,中年危机篇“中年危机”如何转变为“中年机遇”-CSDN博客
其他需求,看主页哦!