Ajustamento Robusto de Estimadores Lineares

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, aprenderemos a utilizar a biblioteca scikit-learn do Python para realizar ajustes robustos de estimadores lineares. Ajustaremos uma função seno com um polinómio de ordem 3 para valores próximos de zero e demonstraremos o ajuste robusto em diferentes situações. Utilizaremos o desvio absoluto mediano para avaliar a qualidade da previsão em novos dados não corrompidos.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook e aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.

Importar Bibliotecas Necessárias e Gerar Dados

Primeiro, precisamos importar as bibliotecas necessárias e gerar dados para o nosso ajuste. Vamos gerar uma função seno com algum ruído e corromper os dados introduzindo erros em X e y.

from matplotlib import pyplot as plt
import numpy as np

from sklearn.linear_model import (
    LinearRegression,
    TheilSenRegressor,
    RANSACRegressor,
    HuberRegressor,
)
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

np.random.seed(42)

X = np.random.normal(size=400)
y = np.sin(X)
## Certifique-se de que X é 2D
X = X[:, np.newaxis]

X_test = np.random.normal(size=200)
y_test = np.sin(X_test)
X_test = X_test[:, np.newaxis]

y_errors = y.copy()
y_errors[::3] = 3

X_errors = X.copy()
X_errors[::3] = 3

y_errors_large = y.copy()
y_errors_large[::3] = 10

X_errors_large = X.copy()
X_errors_large[::3] = 10

Ajustar uma Função Seno com um Polinómio de Ordem 3

Ajustaremos uma função seno com um polinómio de ordem 3 para valores próximos de zero.

x_plot = np.linspace(X.min(), X.max())

Demonstração de Ajustamento Robusto em Diferentes Situações

Agora, demonstraremos o ajuste robusto em diferentes situações utilizando quatro estimadores diferentes: OLS, Theil-Sen, RANSAC e HuberRegressor.

estimators = [
    ("OLS", LinearRegression()),
    ("Theil-Sen", TheilSenRegressor(random_state=42)),
    ("RANSAC", RANSACRegressor(random_state=42)),
    ("HuberRegressor", HuberRegressor()),
]
colors = {
    "OLS": "turquoise",
    "Theil-Sen": "gold",
    "RANSAC": "lightgreen",
    "HuberRegressor": "black",
}
linestyle = {"OLS": "-", "Theil-Sen": "-.", "RANSAC": "--", "HuberRegressor": "--"}
lw = 3

Representar os Resultados

Agora, representaremos os resultados para cada uma das diferentes situações.

for title, this_X, this_y in [
    ("Apenas Erros de Modelação", X, y),
    ("X Corrompido, Pequenos Desvios", X_errors, y),
    ("y Corrompido, Pequenos Desvios", X, y_errors),
    ("X Corrompido, Grandes Desvios", X_errors_large, y),
    ("y Corrompido, Grandes Desvios", X, y_errors_large),
]:
    plt.figure(figsize=(5, 4))
    plt.plot(this_X[:, 0], this_y, "b+")

    for name, estimator in estimators:
        model = make_pipeline(PolynomialFeatures(3), estimator)
        model.fit(this_X, this_y)
        mse = mean_squared_error(model.predict(X_test), y_test)
        y_plot = model.predict(x_plot[:, np.newaxis])
        plt.plot(
            x_plot,
            y_plot,
            color=colors[name],
            linestyle=linestyle[name],
            linewidth=lw,
            label="%s: erro = %.3f" % (name, mse),
        )

    legend_title = "Erro de Desvio Médio\nAbsoluto em relação aos Dados Não Corrompidos"
    legend = plt.legend(
        loc="upper right", frameon=False, title=legend_title, prop=dict(size="x-small")
    )
    plt.xlim(-4, 10.2)
    plt.ylim(-2, 10.2)
    plt.title(title)
plt.show()

Resumo

Neste laboratório, aprendemos a utilizar a biblioteca scikit-learn do Python para realizar ajustes robustos de estimadores lineares. Ajustamos uma função seno com um polinómio de ordem 3 para valores próximos de zero e demonstramos o ajuste robusto em diferentes situações. Utilizámos o desvio absoluto mediano em relação a novos dados não corrompidos para avaliar a qualidade da previsão.