AI交通流量预测入门:用Python和Prophet搭建预测模型
AI交通流量预测听起来复杂,但入门阶段可以先用成熟的时间序列库跑通一个最小可用模型。
本文面向零基础读者,用Python和Prophet库演示如何根据历史车流量数据预测未来时段流量。
整个过程在本地电脑或一台普通Linux服务器上都能完成,不需要GPU,也不需要深度学习框架。
跑模型之前要准备什么
你需要一台能运行Python 3.8以上版本的电脑或服务器,推荐使用Linux系统(Ubuntu 20.04或22.04均可)。
如果使用Windows,建议安装Anaconda来管理环境。
还需要准备一份历史交通流量数据,至少包含两列:时间戳和流量值。
时间戳格式建议为YYYY-MM-DD HH:MM:SS,流量值可以是每小时通过车辆数或传感器计数。
数据量建议不少于两周,采样间隔保持一致,比如每小时一条记录。
先确认Python和pip可用:
python3 --version
pip3 --version
然后创建虚拟环境并安装依赖:
python3 -m venv traffic-env
source traffic-env/bin/activate
pip install pandas prophet matplotlib
Prophet依赖较多,安装过程可能较慢,耐心等待即可。
安装完成后用python -c "from prophet import Prophet; print('ok')"验证,输出ok说明环境正常。
把数据整理成Prophet需要的格式
Prophet要求输入DataFrame包含两列:ds(时间戳)和y(数值)。
假设你有一份CSV文件traffic.csv,列名为timestamp和flow,用下面的代码读取并重命名:
import pandas as pd
df = pd.read_csv('traffic.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.rename(columns={'timestamp': 'ds', 'flow': 'y'})
df = df.sort_values('ds').reset_index(drop=True)
print(df.head())
检查输出,确保ds列是日期时间类型,y列是数值,且没有缺失值。
如果存在缺失,可以用df = df.dropna()删除,或者用前后值填充。
训练模型并生成预测
下面是最小训练代码,直接复制到train.py中运行:
from prophet import Prophet
import pandas as pd
# 读取并整理数据(同上)
df = pd.read_csv('traffic.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.rename(columns={'timestamp': 'ds', 'flow': 'y'})
df = df.sort_values('ds').reset_index(drop=True)
# 划分训练集和测试集,最后24条作为测试
train = df.iloc[:-24]
test = df.iloc[-24:]
# 创建模型,开启周和日季节性
model = Prophet(weekly_seasonality=True, daily_seasonality=True)
model.fit(train)
# 构造未来24个时间点
future = model.make_future_dataframe(periods=24, freq='H')
forecast = model.predict(future)
# 提取预测结果中的yhat和上下界
result = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(24)
print(result)
运行后你会看到未来24小时的预测流量和置信区间。yhat是预测值,yhat_lower和yhat_upper是预测区间,可以用来判断不确定性。
避开这几个常见坑
第一,时间戳格式不统一会导致Prophet解析失败,务必在读取后立即用pd.to_datetime转换并检查。
第二,数据中存在明显异常值(比如传感器故障导致的极大值)会拉偏预测,建议先用箱线图或分位数法识别并剔除。
第三,采样频率与freq参数要匹配,如果数据是每小时一条,make_future_dataframe中freq='H';
如果是每15分钟一条,应改为freq='15min'。
第四,Prophet默认包含年、周、日季节性,如果数据跨度不足一年,年季节性可能过拟合,可以关闭:Prophet(yearly_seasonality=False)。
验证预测效果是否可信
用测试集计算误差指标是最直接的方式。
在上面的代码基础上加入以下计算:
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
# 对齐测试集和预测结果
pred = forecast.set_index('ds').loc[test['ds'], 'yhat'].values
true = test['y'].values
mae = mean_absolute_error(true, pred)
rmse = np.sqrt(mean_squared_error(true, pred))
print(f'MAE: {mae:.2f}, RMSE: {rmse:.2f}')
MAE表示平均绝对误差,单位与流量值一致;
RMSE对较大误差更敏感。
如果误差在可接受范围内(比如小于平均流量的20%),说明模型初步可用。
还可以用model.plot(forecast)和model.plot_components(forecast)可视化趋势和季节性,帮助判断模型是否合理。
常见疑问
问:没有历史数据可以预测吗?
答:时间序列预测依赖历史规律,至少需要一段时间的连续数据。如果没有,可以先使用公开交通数据集或模拟数据练习流程。
问:Prophet适合实时预测吗?
答:Prophet训练和预测速度较快,但更适合批量预测未来数小时到数天的流量。实时逐条预测建议考虑轻量级模型或在线学习方案。
问:预测结果波动很大怎么办?
答:先检查数据中是否有异常值或缺失值,再调整Prophet的changepoint_prior_scale参数(默认0.05,调小可让趋势更平滑),或增加训练数据量。
按照以上步骤,你可以在半小时内完成第一个AI交通流量预测模型。
先跑通流程,再根据实际数据调整季节性和参数,逐步提升预测准确度。