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):降水量
# 检查缺失值情况
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 sns
import matplotlib.pyplot as plt
# 设置图表尺寸和样式
plt.figure(figsize=(12, 8))
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. 模型选择与训练
我们尝试使用两种常见的机器学习算法来预测温度:
-
线性回归
-
随机森林回归
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from 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
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': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10]
}
# 使用网格搜索进行超参数调优
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
# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_final_pred = best_model.predict(X_test)
# 绘制真实值与预测值的对比图
plt.figure(figsize=(10, 6))
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