Ниже я покажу свой код (блокнот Jupyter) для прогнозирования временных рядов с использованием скреарновского регрессора Хьюбера и регрессора случайных лесов.
Когда я перемещаю код в блоки данных и использую те же версиииз библиотек (с dbutils.library.installPyPI) модели выдвигают разные прогнозы.
Код ноутбука Jupyter:
import pandas as pd
import numpy as np
from numpy import split,array,nan,isnan
from math import sqrt
import sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import HuberRegressor
print(sklearn.__version__)
0.21.3
Это мой набор данных:
melt5 = pd.read_excel("Melt5.xlsx")
print(melt5.head())

model1 = HuberRegressor(epsilon=1,max_iter=100,alpha=0.0005,warm_start=False,fit_intercept=True,tol=0.00001)
model2 = RandomForestRegressor(n_estimators=32, n_jobs=-1, random_state=0, max_features=2, max_depth=14, min_samples_leaf=7)
melt5 = melt5.drop(['Product_Code'], axis=1)
a=18
for month in range(a,a+1):
train = melt5[melt5['Month'] < month]
val = melt5[melt5['Month'] == month]
xtr, xts = train.drop(['Sales'], axis=1), val.drop(['Sales'], axis=1)
ytr, yts = train['Sales'].values, val['Sales'].values
model1.fit(xtr,ytr)
model2.fit(xtr,np.log1p(ytr))
H1,R1 = model1.predict(xts),np.expm1(model2.predict(xts))
for month in range(a+1,a+2):
train = melt5[melt5['Month'] < month]
val = melt5[melt5['Month'] == month]
xtr, xts = train.drop(['Sales'], axis=1), val.drop(['Sales'], axis=1)
ytr, yts = train['Sales'].values, val['Sales'].values
model1.fit(xtr,ytr)
model2.fit(xtr,np.log1p(ytr))
H2,R2 = model1.predict(xts),np.expm1(model2.predict(xts))
for month in range(a+2,a+3):
train = melt5[melt5['Month'] < month]
val = melt5[melt5['Month'] == month]
xtr, xts = train.drop(['Sales'], axis=1), val.drop(['Sales'], axis=1)
ytr, yts = train['Sales'].values, val['Sales'].values
model1.fit(xtr,ytr)
model2.fit(xtr,np.log1p(ytr))
H3,R3 = model1.predict(xts),np.expm1(model2.predict(xts))
Теперь давайте посмотрим этот код в Databricks:
dbutils.library.installPyPI('numpy','1.16.2')
dbutils.library.installPyPI('pandas','0.24.2')
dbutils.library.installPyPI('statsmodels','0.9.0')
dbutils.library.installPyPI('xlrd','1.2.0')
dbutils.library.installPyPI('termcolor','1.1.0')
dbutils.library.installPyPI('matplotlib','3.0.3')
dbutils.library.installPyPI('scikit-learn','0.21.3')
dbutils.library.installPyPI('scipy','1.2.1')
dbutils.library.installPyPI('pip','19.0.3')
dbutils.library.installPyPI('joblib','0.13.2')
dbutils.library.restartPython()
import pandas as pd
import numpy as np
from numpy import split,array,nan,isnan
from math import sqrt
import sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import HuberRegressor
print(sklearn.__version__)
0.21.3
model1 = HuberRegressor(epsilon=1,max_iter=100,alpha=0.0005,warm_start=False,fit_intercept=True,tol=0.00001)
model2 = RandomForestRegressor(n_estimators=32, n_jobs=-1, random_state=0, max_features=2, max_depth=14, min_samples_leaf=7)
melt5 = pd.read_excel("/dbfs/mnt/container_name/input_files/Melt5.xlsx")
melt5 = melt5.drop(['Product_Code'], axis=1)
a=18
for month in range(a,a+1):
train = melt5[melt5['Month'] < month]
val = melt5[melt5['Month'] == month]
xtr, xts = train.drop(['Sales'], axis=1), val.drop(['Sales'], axis=1)
ytr, yts = train['Sales'].values, val['Sales'].values
model1.fit(xtr,ytr)
model2.fit(xtr,np.log1p(ytr))
H1,R1 = model1.predict(xts),np.expm1(model2.predict(xts))
for month in range(a+1,a+2):
train = melt5[melt5['Month'] < month]
val = melt5[melt5['Month'] == month]
xtr, xts = train.drop(['Sales'], axis=1), val.drop(['Sales'], axis=1)
ytr, yts = train['Sales'].values, val['Sales'].values
model1.fit(xtr,ytr)
model2.fit(xtr,np.log1p(ytr))
H2,R2 = model1.predict(xts),np.expm1(model2.predict(xts))
for month in range(a+2,a+3):
train = melt5[melt5['Month'] < month]
val = melt5[melt5['Month'] == month]
xtr, xts = train.drop(['Sales'], axis=1), val.drop(['Sales'], axis=1)
ytr, yts = train['Sales'].values, val['Sales'].values
model1.fit(xtr,ytr)
model2.fit(xtr,np.log1p(ytr))
H3,R3 = model1.predict(xts),np.expm1(model2.predict(xts))
Эти 2 фрагмента кода абсолютно одинаковы, модели sklearnэто та же версия.Прогнозы случайного леса точно такие же, за исключением R3 [141], то есть R3 [141] = 372.8428747186311 в Jupyter NB, но R3 [141] = 378.8207392093935 в Databricks.Почти все предсказания Хьюбера различны, а некоторые отличаются на целых 6%.
Я не могу придумать ни одной причины, по которой прогнозы (для обеих моделей) не идентичны.
Обратите внимание, что когда я передаю свою модель statsmodels VAR, прогнозы в Jupyter NB или Databricks идентичны.Так что для statsmodels это не проблема, а для sklearn, это так.