%load_ext autoreload
%autoreload 2
使用numpy数组进行训练
将你的数据框转换为数组,以减少内存使用并加快训练速度
大多数机器学习库使用numpy数组,即使您提供的是数据框,它最终也会被转换为numpy数组。通过向这些模型提供数组,我们可以加快过程,因为转换只会发生一次。
数据设置
from mlforecast.utils import generate_daily_series
= generate_daily_series(5) series
拟合和交叉验证方法
import numpy as np
from lightgbm import LGBMRegressor
from sklearn.linear_model import LinearRegression
from mlforecast import MLForecast
= MLForecast(
fcst ={'lr': LinearRegression(), 'lgbm': LGBMRegressor(verbosity=-1)},
models='D',
freq=[7, 14],
lags=['dayofweek'],
date_features )
如果您使用MLForecast
中的fit/cross_validation方法,您需要做的就是提供as_numpy
参数,这样会在将特征传递给模型之前将其转换为数组。
=True) fcst.fit(series, as_numpy
MLForecast(models=[lr, lgbm], freq=<Day>, lag_features=['lag7', 'lag14'], date_features=['dayofweek'], num_threads=1)
在预测时,新的特征也将被转换为数组,因此这也可以更快。
1) fcst.predict(
unique_id | ds | lr | lgbm | |
---|---|---|---|---|
0 | id_0 | 2000-08-10 | 5.268787 | 6.322262 |
1 | id_1 | 2000-04-07 | 4.437316 | 5.213255 |
2 | id_2 | 2000-06-16 | 3.246518 | 4.373904 |
3 | id_3 | 2000-08-30 | 0.144860 | 1.285219 |
4 | id_4 | 2001-01-08 | 2.211318 | 3.236700 |
对于交叉验证,我们只需指定 as_numpy=True
。
= fcst.cross_validation(series, n_windows=2, h=2, as_numpy=True) cv_res
预处理方法
将特征作为numpy数组处理在某些情况下也很有帮助,例如当你有类别列而库不支持它们时,例如LightGBM与polars。为了在LightGBM和polars中使用类别特征,我们必须将它们转换为整数表示,并告诉LightGBM将这些特征视为类别特征,我们可以通过以下方式实现:
= generate_daily_series(5, n_static_features=1, engine='polars')
series_pl 2) series_pl.head(
shape: (2, 4)
unique_id | ds | y | static_0 |
---|---|---|---|
cat | datetime[ns] | f64 | cat |
"id_0" | 2000-01-01 00:00:00 | 36.462689 | "84" |
"id_0" | 2000-01-02 00:00:00 | 121.008199 | "84" |
= MLForecast(
fcst =[],
models='1d',
freq=[7, 14],
lags=['weekday'],
date_features )
为了使用预处理方法获取特征数组,我们还必须请求 X, y 元组。
= fcst.preprocess(series_pl, return_X_y=True, as_numpy=True)
X, y 2] X[:
array([[ 0. , 20.30076749, 36.46268875, 6. ],
[ 0. , 119.51717097, 121.0081989 , 7. ]])
特征名称可以在 fcst.ts.features_order_
中找到。
fcst.ts.features_order_
['static_0', 'lag7', 'lag14', 'weekday']
现在我们可以只训练一个LightGBM模型,指定特征名称以及哪些特征应被视为类别特征。
= LGBMRegressor(verbosity=-1)
model
model.fit(=X,
X=y,
y=fcst.ts.features_order_,
feature_name=['static_0', 'weekday'],
categorical_feature; )
我们现在可以将这个模型添加到我们的模型字典中,如自定义训练指南中所述。
= {'lgbm': model} fcst.models_
并用它进行预测。
1) fcst.predict(
shape: (5, 3)
unique_id | ds | lgbm |
---|---|---|
cat | datetime[ns] | f64 |
"id_0" | 2000-08-10 00:00:00 | 448.796188 |
"id_1" | 2000-04-07 00:00:00 | 81.058211 |
"id_2" | 2000-06-16 00:00:00 | 4.450549 |
"id_3" | 2000-08-30 00:00:00 | 14.219603 |
"id_4" | 2001-01-08 00:00:00 | 87.361881 |
Give us a ⭐ on Github