为何Darts库中ARIMA模型的historical_forecast方法运行缓慢?
问题:Darts ARIMA滚动窗口回测耗时远高于手动实现的AR(7)
我用Darts库实现AR(7)模型,采用滚动窗口技术测试模型效果。数据集规模为1825天(5年),滚动窗口大小设为365,预测步长为1。使用ARIMA模型的historical_forecasts方法时,运行耗时长达约3分钟。
出于好奇,我手动实现了该回测逻辑:构建滞后数据集,用sklearn的LinearRegression(),每次迭代滑动训练窗口并预测次日数据,总耗时仅约5秒,且预测结果与Darts的ARIMA模型几乎一致。
以下是基于Darts自带数据集的可复现代码,能直观展示耗时差异:手动实现的AR(7)耗时0.3秒,而Darts的ARIMA耗时9秒。测试使用的参数为start=48, train_length=48, forecast_horizon=1, retrain=False。
# Dependendencies import numpy as np import time from darts.datasets import AirPassengersDataset from darts.models import ARIMA from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_percentage_error # Load dataset as a Darts TimeSeries series = AirPassengersDataset().load() # Convert it to a pandas dataframe data = series.pd_dataframe() # Take first time time1 = time.time() # Create the lagged columns to perform AR(7) for i in range(1, 8): curr_col = "#Passengers_lag_" + str(i) data[curr_col] = data["#Passengers"].shift(i) # Remove first 7 rows data.dropna(inplace=True) # Perform rolling_window LinearRegression() window_size = 48 predictions_ar7_by_hand = [] for t in range(window_size, data.shape[0]): # Take the corresponding window of size 48 for training X_train, Y_train = data.iloc[(t - window_size) : t, 1:], data.iloc[(t - window_size) : t, 0] # Take the corresponding testing values X_test, Y_test = data.iloc[t: t+1, 1:], data.iloc[t: t+1, 0].values[0] # Fit model lr = LinearRegression().fit(X_train, Y_train) # Predict using X_test prediction = lr.predict(X_test)[0] print('------------------------------') print(f"Test value: {Y_test}") print(f"Predicted value: {prediction}") predictions_ar7_by_hand.append(prediction) print('**************** Finished ARIMA by hand **********************') print(f"Time: {time.time()-time1}") # Take second time time2 = time.time() # Forecast using ARIMA by Darts ar7 = ARIMA(p=7, d=0, q=0) predictions_ar7 = ar7.historical_forecasts(series, start=48, train_length=48, forecast_horizon=1, retrain=False) print('**************** Finished ARIMA by DARTS **********************') print(f"Time: {time.time()-time2}") # Convert it to a pandas dataframe predictions_ar7 = predictions_ar7.pd_dataframe() # Insert the results in the same df predictions_ar7['#Passengers_arima_by_hand'] = [np.nan for x in range(7)] + predictions_ar7_by_hand # Rename some columns predictions_ar7.rename(columns={'#Passengers': '#Passengers_arima_by_darts'}, inplace=True) # Add original data predictions_ar7['#Passengers'] = data['#Passengers'] # Remove NaN, only 7 rows predictions_ar7.dropna(inplace=True) # Print the results print("*********** RESULTS **********") mape1 = mean_absolute_percentage_error(predictions_ar7['#Passengers'], predictions_ar7['#Passengers_arima_by_darts']) mape2 = mean_absolute_percentage_error(predictions_ar7['#Passengers'], predictions_ar7['#Passengers_arima_by_hand']) mape3 = mean_absolute_percentage_error(predictions_ar7['#Passengers_arima_by_darts'], predictions_ar7['#Passengers_arima_by_hand']) print(f"MAPE by Darts: {mape1}, MAPE by hand: {mape2}, MAPE between two arima: {mape3}")
想了解这种耗时差异的具体原因,小数据集上的差异尚可接受,但原数据集上的3分钟耗时相比简易实现过于夸张。
内容的提问来源于stack exchange,提问作者paolopazzo
相关产品推荐
相关产品推荐

