abayes - Modèle linéaire bayésien autorégressif

(Autoregressive Bayesian linear model)

Created at: 2020-09-09 01:07:06
Language: Python
License: MIT

Régression linéaire bayésienne autorégressive en ligne

Cet outil minimaliste est dédié à la régression linéaire bayésienne mise en œuvre par Max Halford dans son article de blog Régression linéaire bayésienne pour les praticiens . J'ai légèrement modifié le code pour obtenir une version autorégressive du modèle d'origine.

Pour l'instant, le modèle supposera systématiquement que les résidus suivent une distribution normale. Il faudra attendre les prochaines mises à jour de la librairie pour inclure de nouvelles distributions.

La régression linéaire bayésienne présente de nombreux avantages. Il permet de mesurer l' incertitude du modèle et de construire des intervalles de confiance . La simplicité de ce modèle et sa capacité à répondre « je ne sais pas » le rend pratique et adapté à de nombreux problèmes concrets .

Son pendant autorégressif en ligne est un bel outil pour la boîte à outils des programmeurs, des hackers et des praticiens.

Installation:

pip install git+https://github.com/raphaelsty/abayes

Exemple:

Essayons de prédire ma consommation de glaces. J'ai créé un jeu de données factice où j'enregistre ma consommation de crème glacée pour chaque mois de l'année et pendant 3 ans.

from abayes import dataset
df = dataset.LoadIceCream()
df.head()
dessin

Nous initialisons le modèle auto-régressif avec une périodicité de 24. Nous utiliserons les années n-1 et n-2 pour prédire ma consommation de glace à l'année n.

from abayes import linear

model = linear.AbayesLr(
    p     = 24,
    alpha = 0.3,
    beta  = 1.,
)

model.learn(df['y'].values)

forecast = model.forecast(12)

lower_bound, upper_bound = model.forecast_interval(12, alpha = 0.90)
terrain
import matplotlib.pyplot as plt

%config InlineBackend.figure_format = 'retina'

range_train    = range(len(df['y']))
range_forecast = range(len(df['y']), len(df['y']) + len(forecast))

fig, ax = plt.subplots(figsize=(15, 6))

ax.plot(range_train, df['y'], color='deepskyblue', label ='train')

ax.plot(range_forecast, forecast, color='red', linestyle='--', label ='forecast')

ax.fill_between(
    x     = range_forecast,
    y1    = lower_bound,
    y2    = upper_bound,
    alpha = 0.1,
    color = 'red',
    label = 'confidence'
)

plt.xticks(
    range(len(df['y']) + len(forecast)), 
    df['time'].tolist() + [f"2020/{'%02d' % i}" for i in range(1, 13)], 
    rotation='vertical'
)

ax.set_title('Quantity of ice cream')

ax.set_xlabel('Period')

ax.set_ylabel('Quantity')

ax.legend()

plt.show()

Le modèle peut également apprendre par mini-lot.

import numpy as np

from abayes import linear

model = linear.AbayesLr(
    p     = 24,
    alpha = 0.3,
    beta  = 1,
)

for time, y in enumerate(df['y'].values):
    
    # Online autoregressive model needs to store enough data to make a prediction (> period).
    if time > 24:
        
        lower_bound, upper_bound = model.forecast_interval(1, alpha = 0.9)
        y_pred = model.forecast(1)
        
        print('\n')
        print(f'time: {time}')
        print(f'\t y: {y}')
        print(f'\t Most likely value: {y_pred[0]:6f}')
        print(f'\t Confidence interval: [{lower_bound[0]:6f} ; {upper_bound[0]:6f}]')
    
    model.learn(np.array([y]))
time: 25
	 y: 46
	 Most likely value: 16.066921
	 Confidence interval: [-231.651593 ; 263.785435]


time: 26
	 y: 27
	 Most likely value: 50.016886
	 Confidence interval: [-179.828306 ; 279.862078]


time: 27
	 y: 30
	 Most likely value: 16.442225
	 Confidence interval: [-214.224545 ; 247.108994]


time: 28
	 y: 101
	 Most likely value: 21.766659
	 Confidence interval: [-205.891318 ; 249.424635]


time: 29
	 y: 135
	 Most likely value: 106.731389
	 Confidence interval: [-124.906692 ; 338.369470]


time: 30
	 y: 250
	 Most likely value: 143.074596
	 Confidence interval: [-75.066693 ; 361.215885]


time: 31
	 y: 210
	 Most likely value: 231.908803
	 Confidence interval: [38.905614 ; 424.911993]


time: 32
	 y: 127
	 Most likely value: 165.226916
	 Confidence interval: [-17.324602 ; 347.778435]


time: 33
	 y: 50
	 Most likely value: 78.684325
	 Confidence interval: [-75.679416 ; 233.048066]


time: 34
	 y: 14
	 Most likely value: -14.522046
	 Confidence interval: [-157.498855 ; 128.454763]


time: 35
	 y: 56
	 Most likely value: 52.063575
	 Confidence interval: [-50.776582 ; 154.903732]

Licence

Ce projet est un logiciel libre et open source sous licence MIT.