Introdução
Neste laboratório, demonstraremos como ajustar robustamente um modelo linear a dados com falhas utilizando o algoritmo RANSAC no scikit-learn. O regressor linear ordinário é sensível a valores discrepantes, e a linha ajustada pode facilmente ser desviada da verdadeira relação subjacente dos dados. O regressor RANSAC automaticamente divide os dados em inliers e outliers, e a linha ajustada é determinada apenas pelos inliers identificados. Usaremos o conjunto de dados make_regression do scikit-learn para gerar dados aleatórios com valores discrepantes e, em seguida, ajustaremos tanto um modelo linear quanto um regressor RANSAC aos dados.
Dicas da Máquina Virtual
Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.
Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. 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 prontamente o problema para si.
Importar bibliotecas e gerar dados
Importaremos as bibliotecas necessárias, geraremos dados aleatórios usando o conjunto de dados make_regression e adicionaremos valores discrepantes aos dados.
import numpy as np
from matplotlib import pyplot as plt
from sklearn import linear_model, datasets
## Gerar dados
n_samples = 1000
n_outliers = 50
X, y, coef = datasets.make_regression(
n_samples=n_samples,
n_features=1,
n_informative=1,
noise=10,
coef=True,
random_state=0,
)
## Adicionar dados de valores discrepantes
np.random.seed(0)
X[:n_outliers] = 3 + 0.5 * np.random.normal(size=(n_outliers, 1))
y[:n_outliers] = -3 + 10 * np.random.normal(size=n_outliers)
Ajustar um modelo linear
Ajustaremos um modelo linear aos dados utilizando a classe LinearRegression do scikit-learn.
## Ajustar a linha usando todos os dados
lr = linear_model.LinearRegression()
lr.fit(X, y)
Ajustar um regressor RANSAC
Ajustaremos um regressor RANSAC aos dados utilizando a classe RANSACRegressor do scikit-learn.
## Ajustar robustamente o modelo linear com o algoritmo RANSAC
ransac = linear_model.RANSACRegressor()
ransac.fit(X, y)
inlier_mask = ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
Prever dados de modelos estimados
Preveremos os dados do modelo linear e do regressor RANSAC e compararemos os seus resultados.
## Prever dados dos modelos estimados
line_X = np.arange(X.min(), X.max())[:, np.newaxis]
line_y = lr.predict(line_X)
line_y_ransac = ransac.predict(line_X)
Comparar coeficientes estimados
Vamos comparar os coeficientes estimados do modelo verdadeiro, do modelo linear e do regressor RANSAC.
## Comparar coeficientes estimados
print("Coeficientes estimados (verdadeiro, regressão linear, RANSAC):")
print(coef, lr.coef_, ransac.estimator_.coef_)
Visualizar os resultados
Vamos plotar os dados e as linhas ajustadas do modelo linear e do regressor RANSAC.
## Visualizar os resultados
lw = 2
plt.scatter(
X[inlier_mask], y[inlier_mask], color="yellowgreen", marker=".", label="Valores interiores"
)
plt.scatter(
X[outlier_mask], y[outlier_mask], color="gold", marker=".", label="Valores exteriores"
)
plt.plot(line_X, line_y, color="navy", linewidth=lw, label="Regressão linear")
plt.plot(
line_X,
line_y_ransac,
color="cornflowerblue",
linewidth=lw,
label="Regressor RANSAC",
)
plt.legend(loc="lower right")
plt.xlabel("Entrada")
plt.ylabel("Resposta")
plt.show()
Resumo
Neste laboratório, demonstramos como ajustar robustamente um modelo linear a dados com erros utilizando o algoritmo RANSAC no scikit-learn. Gerámos dados aleatórios usando o conjunto de dados make_regression, adicionámos valores discrepantes aos dados, ajustámos um modelo linear e um regressor RANSAC aos dados, previmos os dados dos dois modelos, comparámos os seus coeficientes estimados e visualizámos os resultados. O regressor RANSAC divide automaticamente os dados em valores interiores e exteriores, e a linha ajustada é determinada apenas pelos valores interiores identificados, tornando-o um método mais robusto para ajustar modelos a dados com valores discrepantes.