Модели Sklearn дают разные результаты при преобразовании ноутбука Jupyter в блокнот данных - PullRequest
0 голосов
/ 25 сентября 2019

Ниже я покажу свой код (блокнот 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())

enter image description here

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, это так.

...