Régression quantile illustrée#

La régression quantile est moins sensible aux points aberrants. Elle peut être définie comme une régression avec une norme L1 (une valeur absolue). Ce notebook explore des régressions avec des quantiles différents.

[2]:
%matplotlib inline

Un jeu de données non symétrique#

[3]:
import numpy.random as npr
import numpy

n = 1000
eps = npr.normal(n)
X = npr.rand(n, 1) * 5
X1 = npr.normal(size=(n, 1)) * 1
X2 = npr.normal(size=(n // 2, 1)) * 10
X2 = numpy.vstack([X2, numpy.zeros((n // 2, 1))])
eps = -numpy.abs(X1) + numpy.abs(X2)
Y = (0.5 * X + eps).ravel()
X.shape, Y.shape
[3]:
((1000, 1), (1000,))
[4]:
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(X, Y, "c.");
../../_images/notebooks_dsgarden_quantile_regression_example_4_0.png

Régression linéaire et régression quantile#

[5]:
from sklearn.linear_model import LinearRegression

clr = LinearRegression()
clr.fit(X, Y)
[5]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
[6]:
from mlinsights.mlmodel import QuantileLinearRegression

clq = QuantileLinearRegression()
clq.fit(X, Y)
[6]:
QuantileLinearRegression(copy_X=True, delta=0.0001, fit_intercept=True,
             max_iter=10, n_jobs=1, normalize=False, quantile=0.5,
             verbose=False)
[7]:
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(X, Y, "c.")
lin = clr.predict(X)
ax.plot(X, lin, "ro", label="L2")
qu = clq.predict(X)
ax.plot(X, qu, "bo", label="L1")
ax.legend()
ax.set_title("Régression linéaire et quantile");
../../_images/notebooks_dsgarden_quantile_regression_example_8_0.png

Différents quantiles#

[8]:
clqs = {}
for qu in [0.1, 0.25, 0.5, 0.75, 0.9]:
    clq = QuantileLinearRegression(quantile=qu)
    clq.fit(X, Y)
    clqs["q=%1.2f" % qu] = clq
[9]:
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(X, Y, "c.")
for k, v in sorted(clqs.items()):
    p = v.predict(X)
    ax.plot(X, p, "o", label=k)
ax.legend()
ax.set_title("Régressions quantiles");
../../_images/notebooks_dsgarden_quantile_regression_example_11_0.png
[10]: