Python项目实战:用机器学习预测明天的天气!

从零开始,使用公开的历史天气数据,借助 Python 和机器学习模型,完成一个简单的天气预测任务。本项目将涵盖数据获取、预处理、特征工程、模型训练与评估等完整流程,帮助初学者学习如何用机器学习解决实际问题。

数据集获取

我们使用 Weather Data Dataset,该数据集包含过去若干年的天气记录,包括温度、湿度、风速等。可以通过以下链接下载数据集:

https://www.kaggle.com/datasets/muthuj7/weather-dataset

下载数据后,将文件解压并放置在项目的工作目录中。我们接下来会通过 Pandas 读取和处理数据。

数据预处理

在机器学习中,数据的质量直接决定了模型的效果。我们先读取数据并进行基础分析。

3.1 读取数据
import pandas as pd
# 读取 CSV 文件data = pd.read_csv('weatherHistory.csv')
# 查看数据基本信息print(data.info())print(data.head())

输出结果显示,数据集包含以下主要列:

  • Temperature (C):温度(摄氏度)
  • Humidity:湿度
  • Wind Speed (km/h):风速
  • Pressure (millibars):气压
  • Precipitation (mm):降水量
3.2 检查缺失值
# 检查缺失值情况print(data.isnull().sum())

如发现缺失值,可以使用以下方法进行处理:

  • 对于数值型特征,使用均值填充:data.fillna(data.mean(), inplace=True)
  • 对于时间序列型数据,可以使用插值法:data.interpolate(method='time', inplace=True)
3.3 特征选择

由于我们要预测温度,因此 “Temperature (C)” 是目标变量,而其他特征可以作为输入特征。我们选择以下特征进行建模:

  • Humidity
  • Wind Speed (km/h)
  • Pressure (millibars)
  • Precipitation (mm)
# 选择特征和目标变量features = data[['Humidity''Wind Speed (km/h)''Pressure (millibars)']]target = data['Temperature (C)']

4. 数据可视化

在训练模型前,我们先对数据进行简单的可视化分析,了解各特征与温度之间的关系。

4.1 温度分布
import matplotlib.pyplot as plt
# 绘制温度分布图plt.hist(target, bins=30, edgecolor='k')plt.title('Temperature Distribution')plt.xlabel('Temperature (C)')plt.ylabel('Frequency')plt.show()
图片
4.2 特征与目标变量的关系
import seaborn as snsimport matplotlib.pyplot as plt
# 设置图表尺寸和样式plt.figure(figsize=(128))sns.set(style="whitegrid", font_scale=1.2)
# 绘制特征与温度的相关性热力图corr_matrix = data.corr()sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=0.5)
plt.title('Feature Correlation Heatmap', fontsize=16)plt.xticks(rotation=45)plt.yticks(rotation=0)plt.show()
图片
从热力图中可以看出,湿度和气压 与温度的相关性较高,这些特征对预测温度可能有较大的贡献。

5. 模型选择与训练

我们尝试使用两种常见的机器学习算法来预测温度:

  • 线性回归
  • 随机森林回归
5.1 使用线性回归模型
from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error, r2_score
# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)
# 训练线性回归模型lr_model = LinearRegression()lr_model.fit(X_train, y_train)
# 预测并评估模型y_pred = lr_model.predict(X_test)mse = mean_squared_error(y_test, y_pred)r2 = r2_score(y_test, y_pred)
print(f'线性回归模型的均方误差 (MSE): {mse:.2f}')print(f'线性回归模型的决定系数 (R²): {r2:.2f}')
线性回归模型的均方误差 (MSE): 53.93线性回归模型的决定系数 (R²): 0.41
5.2 使用随机森林回归模型
from sklearn.ensemble import RandomForestRegressor
# 训练随机森林模型rf_model = RandomForestRegressor(n_estimators=100, random_state=42)rf_model.fit(X_train, y_train)
# 预测并评估模型y_pred_rf = rf_model.predict(X_test)mse_rf = mean_squared_error(y_test, y_pred_rf)r2_rf = r2_score(y_test, y_pred_rf)
print(f'随机森林模型的均方误差 (MSE): {mse_rf:.2f}')print(f'随机森林模型的决定系数 (R²): {r2_rf:.2f}')
随机森林模型的均方误差 (MSE): 39.18随机森林模型的决定系数 (R²): 0.57

模型评估与优化

从模型的评估结果可以看出,随机森林的效果优于线性回归。接下来,我们可以通过调整随机森林的超参数来进一步优化模型性能。

6.1 超参数调优
from sklearn.model_selection import GridSearchCV
# 定义参数网格param_grid = {    'n_estimators': [50100200],    'max_depth': [None, 1020],    'min_samples_split': [2510]}
# 使用网格搜索进行超参数调优grid_search = GridSearchCV(RandomForestRegressor(random_state=42), param_grid, cv=3, scoring='neg_mean_squared_error')grid_search.fit(X_train, y_train)
print(f'最佳参数: {grid_search.best_params_}')print(f'最佳评分: {-grid_search.best_score_:.2f}')
最佳参数: {'max_depth'10'min_samples_split'2'n_estimators'200}最佳评分: 35.62
7. 预测与可视化
# 使用最佳模型进行预测best_model = grid_search.best_estimator_y_final_pred = best_model.predict(X_test)
# 绘制真实值与预测值的对比图plt.figure(figsize=(106))plt.plot(y_test.values, label='True Temperature')plt.plot(y_final_pred, label='Predicted Temperature')plt.legend()plt.title('True vs Predicted Temperature')plt.xlabel('Sample Index')plt.ylabel('Temperature (C)')plt.show()
图片

8. 总结与扩展

我们从零开始完成了一个基于机器学习的天气预测项目,包括数据获取、预处理、建模、评估与优化等完整流程。实际应用中,还可以通过引入更多天气特征(如风向、云量等)或使用更高级的深度学习模型(如 LSTM)来进一步提高预测精度。

海南练习生 数据挖掘练习生

THE END