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.