Введение
В этом практическом занятии мы покажем, как с помощью алгоритма RANSAC в scikit-learn надежно подобрать линейную модель для ошибочных данных. Обычный линейный регрессор чувствителен к выбросам, и нарисованная прямая может легко отклониться от истинной взаимосвязи данных. Регурессор RANSAC автоматически разделяет данные на точки, принадлежащие модели (inliers), и выбросы (outliers), и нарисованная прямая определяется только точками, принадлежащими модели. Мы будем использовать набор данных make_regression из scikit-learn для генерации случайных данных с выбросами, а затем подбирать как линейную модель, так и регрессор RANSAC для этих данных.
Советы по использованию ВМ
После запуска ВМ кликните в верхнем левом углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импортируем библиотеки и генерируем данные
Мы импортируем необходимые библиотеки, генерируем случайные данные с использованием набора данных make_regression и добавляем к ним выбросы.
import numpy as np
from matplotlib import pyplot as plt
from sklearn import linear_model, datasets
## Generate data
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,
)
## Add outlier data
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)
Подберем линейную модель
Мы подберём линейную модель для данных с использованием класса LinearRegression из scikit-learn.
## Fit line using all data
lr = linear_model.LinearRegression()
lr.fit(X, y)
Подберем регрессор RANSAC
Мы подберём регрессор RANSAC для данных с использованием класса RANSACRegressor из scikit-learn.
## Robustly fit linear model with RANSAC algorithm
ransac = linear_model.RANSACRegressor()
ransac.fit(X, y)
inlier_mask = ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
Предскажем данные оцененных моделей
Мы предскажем данные линейной модели и регрессора RANSAC и сравним их результаты.
## Predict data of estimated models
line_X = np.arange(X.min(), X.max())[:, np.newaxis]
line_y = lr.predict(line_X)
line_y_ransac = ransac.predict(line_X)
Сравним оцененные коэффициенты
Мы сравним оцененные коэффициенты истинной модели, линейной модели и регрессора RANSAC.
## Compare estimated coefficients
print("Estimated coefficients (true, linear regression, RANSAC):")
print(coef, lr.coef_, ransac.estimator_.coef_)
Визуализируем результаты
Мы построим график данных и нарисуем прямые, соответствующие линейной модели и регрессору RANSAC.
## Visualize the results
lw = 2
plt.scatter(
X[inlier_mask], y[inlier_mask], color="yellowgreen", marker=".", label="Inliers"
)
plt.scatter(
X[outlier_mask], y[outlier_mask], color="gold", marker=".", label="Outliers"
)
plt.plot(line_X, line_y, color="navy", linewidth=lw, label="Linear regressor")
plt.plot(
line_X,
line_y_ransac,
color="cornflowerblue",
linewidth=lw,
label="RANSAC regressor",
)
plt.legend(loc="lower right")
plt.xlabel("Input")
plt.ylabel("Response")
plt.show()
Резюме
В этом практическом занятии мы показали, как с помощью алгоритма RANSAC из scikit-learn надежно подобрать линейную модель для ошибочных данных. Мы сгенерировали случайные данные с использованием набора make_regression, добавили выбросы в данные, подобрали как линейную модель, так и регрессор RANSAC для данных, предсказали данные двух моделей, сравнили их оцененные коэффициенты и визуализировали результаты. Регурессор RANSAC автоматически разделяет данные на инлайеры и аутлайеры, и нарисованная прямая определяется только идентифицированными инлайерами, что делает этот метод более надежным для подбора моделей для данных с выбросами.