时间序列预测一直依赖于特定领域的模型。传统的统计方法(如ARIMA)和深度学习方法(如LSTM)在结构化数据集上表现良好。然而,对于跨行业和地区的大型、多样化时间序列,需要一种更具泛化能力的方法。谷歌的TimesFM是一种基础模型,能够在不同领域进行泛化,预测能源、金融、天气和工业生产等领域的趋势。与特定任务的模型不同,TimesFM从庞大的数据集中学习模式,并将这些知识应用于不同的应用场景。
本项目使用TimesFM来预测北达科他州的石油产量。
传统的预测模型需要仔细调优。ARIMA在平稳数据上表现良好,但在处理突然变化时遇到困难。LSTM能够捕捉序列信息,但需要大量的训练。基于Transformer的模型(如N-BEATS和PatchTST)提高了准确性,但它们仍然需要在特定数据集上进行训练。
TimesFM通过在不同的时间序列数据上进行预训练来解决这一问题。它学习基本的模式,并将这些模式应用于新的数据集,而无需重新训练。这使得预测更快、更具可扩展性。
我们拥有北达科他州约4万口井的月度产量数据。我们首先加载数据,并选择产量最高的2口井。这确保了预测重点关注具有有意义趋势的活跃井点。
import timesfm
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import TimeSeriesSplit
# Load real oil production data
df = pd.read_csv("north_dakota_production.csv")
# Select top two wells with nonzero oil production
top_wells = df[df["Oil"] > 0].nlargest(2, "Oil")["API_WELLNO"]
df = df[df["API_WELLNO"].isin(top_wells)].rename(columns={"API_WELLNO": "unique_id", "Date": "ds", "Oil": "y"})
df["ds"] = pd.to_datetime(df["ds"])
我们使用TimeSeriesSplit将数据分为训练集和测试集。这确保了模型在训练过程中只能看到过去的数据。
# Train-test split using TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5, test_size=int(0.2 * len(df)))
train_idx, test_idx = list(tscv.split(df))[-1]
train_df, test_df = df.iloc[train_idx], df.iloc[test_idx]
现在,我们初始化TimesFM,并从Hugging Face加载一个预训练的检查点。这使得我们可以访问一个在大规模时间序列上训练的基础模型。
我们使用TimesFM来生成预测。模型处理训练集,并为测试期做出预测。
# Initialize TimesFM Model
tfm = timesfm.TimesFm(
hparams=timesfm.TimesFmHparams(
per_core_batch_size=32, horizon_len=128, input_patch_len=32, output_patch_len=128,
num_layers=50, model_dims=1280, use_positional_embedding=False
),
checkpoint=timesfm.TimesFmCheckpoint(huggingface_repo_id="google/timesfm-2.0-500m-pytorch"),
)
# Generate forecast
forecast_df = tfm.forecast_on_df(inputs=train_df, freq="M", value_name="y", num_jobs=-1)
forecast_df["ds"] = pd.to_datetime(forecast_df["ds"])
# Aggregate forecast
forecast_df = forecast_df.groupby("ds")["timesfm"].mean().reset_index()
# Restrict forecast to match test period
forecast_df = forecast_df[forecast_df["ds"].between(test_df["ds"].min(), test_df["ds"].max())]
最后,我们可视化结果,将实际产量与TimesFM的预测进行比较。
# Plot results
plt.figure(figsize=(12, 6))
plt.plot(df["ds"], df["y"], label="Monthly Oil Production", color="black", alpha=0.3)
plt.plot(test_df["ds"], test_df["y"], label="Test Data", color="blue")
plt.plot(forecast_df["ds"], forecast_df["timesfm"], label="Forecast", color="red")
# Save and show
plt.savefig("timesfm_test_forecast_tufte.png", dpi=300)
plt.show()
评估TimesFM的性能
TimesFM的预测与石油生产的总体趋势相符。即使训练数据有限,该模型也表现出良好的泛化能力。这证实了预训练的时间序列模型在极少适应的情况下可以优于传统方法。
它并不能完全取代特定领域的模型。但它为无需特征工程的预测提供了一个强大的基线。
由于它是一个基础模型,因此不需要为每个任务重新训练。它从庞大的数据集中学习通用模式。这为企业提供了一个跨领域的即用型预测引擎。
基础模型已经改变了自然语言处理的格局。时间序列预测领域也正在发生同样的转变。TimesFM标志着大规模、跨领域预测模型的开端。