当前位置: 首页 > news >正文

用天气预测理解分类算法-从出门看天气到逻辑回归

一、生活中的决策难题:周末郊游的「天气判断」

周末计划郊游时,你是不是总会打开天气预报反复确认?看到 "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% 准确率

六、逻辑回归的天气预测能力分析
优点:
  1. 解释性强:能清晰看到 "降雨量权重最高",符合生活常识
  1. 速度快:手机 APP 能实时运行,快速给出预测结果
  1. 概率输出:不只是说 "适合郊游",还能告诉你 "85% 概率适合"
缺点:
  1. 线性限制:无法捕捉非线性关系(比如极端高温和极端低温都不适合)
  1. 特征依赖:需要人工选择有价值的特征(比如忘记考虑紫外线强度)
七、提升预测准确性的技巧
  1. 特征工程:对气温做分段处理(比如设置舒适区间得分)

# 气温舒适度特征:20-28℃得1分,否则得0分

temp_comfort = ((X[:,0] > 20) & (X[:,0] < 28)).astype(int)

X = np.column_stack((X, temp_comfort)) # 添加新特征

  1. 特征标准化:消除单位差异影响

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X) # 标准化所有特征

  1. 正则化调参:防止过度拟合个别极端天气

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. 观察影响结果的关键因素(天气特征)
  1. 给不同因素分配合理的重要性(权重)
  1. 通过数据学习找到最优的判断标准
  1. 用这个标准预测未来情况

下次查看天气预报时,你可以试着用逻辑回归的思路分析:哪些因素对决策影响最大?它们的 "权重" 应该是多少?通过今天的学习,你不仅掌握了逻辑回归的核心原理,还能亲手实现一个简单的天气预测模型。

现在,试着修改代码中的天气特征或参数,看看模型预测结果会如何变化吧! 🌤️

还想看更多,来啦!!!

1,大数据比赛篇全国职业院校技能大赛-大数据比赛心得体会_全国职业职业技能比赛 大数据-CSDN博客

2,求职简历篇(超实用)大学生简历写作指南:让你的简历脱颖而出-CSDN博客

3,AIGC心得篇aigc时代,普通人需要知道的-CSDN博客

4,数据分析思维篇学习数据分析思维的共鸣-CSDN博客

5,中年危机篇“中年危机”如何转变为“中年机遇”-CSDN博客

其他需求,看主页哦!

http://www.lryc.cn/news/615203.html

相关文章:

  • Kubernetes(K8s)不同行业的典型应用场景及价值分析 原创
  • windows、linux应急响应入侵排查
  • Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)
  • 【2025】Datawhale AI夏令营-多模态RAG-Task1、Task2笔记-任务理解与Baseline代码解读
  • 金融通用智能体(Financial General Agent, FGA)的端到端解决方案
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)
  • C语言:构造类型
  • TDengine IDMP 产品基本概念
  • 使用 Visual Studio 2022 编译 PortAudio 项目
  • occworld(1):论文解读
  • Ghost备份分区设置分包大小方法
  • 任务发布悬赏查询管理地推抖音快手微信任务赚佣金网站源码功能详解二开
  • 谷歌警告云存储桶劫持攻击
  • 让大模型 “睡觉”:把版本迭代当作人类睡眠来设计(附可直接改造的训练作息表与代码)
  • n沟道增强型mos管
  • B.10.01.6-DDD领域驱动设计:从理论到落地的完整指南
  • Typora上传图片保存到assets目录下
  • 第十四届蓝桥杯青少年组省赛 编程题真题题解
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • WinForm 复合控件(用户控件):创建与使用指南
  • 深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器
  • sqli-labs通关笔记-第39关 GET数值型堆叠注入(手工注入+脚本注入两种方法)
  • 数据分析框架从 “工具堆砌” 转向 “智能协同”
  • 大语言模型提示工程与应用:提示工程-提升模型准确性与减少偏见的方法
  • node.js 零基础入门
  • 学习嵌入式第二十四天
  • Kotlin 协程线程切换机制详解
  • M8-11 RFID模块通过RS485转Profinet网关与PLC通信的配置指南
  • 安装NodeJS和TypeScript简要指南
  • 虚拟机远程连接报错解决办法