Робастная оценка линейной модели

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы покажем, как с помощью алгоритма RANSAC в scikit-learn надежно подобрать линейную модель для ошибочных данных. Обычный линейный регрессор чувствителен к выбросам, и нарисованная прямая может легко отклониться от истинной взаимосвязи данных. Регурессор RANSAC автоматически разделяет данные на точки, принадлежащие модели (inliers), и выбросы (outliers), и нарисованная прямая определяется только точками, принадлежащими модели. Мы будем использовать набор данных make_regression из scikit-learn для генерации случайных данных с выбросами, а затем подбирать как линейную модель, так и регрессор RANSAC для этих данных.

Советы по использованию ВМ

После запуска ВМ кликните в верхнем левом углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49257{{"Робастная оценка линейной модели"}} end

Импортируем библиотеки и генерируем данные

Мы импортируем необходимые библиотеки, генерируем случайные данные с использованием набора данных 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 автоматически разделяет данные на инлайеры и аутлайеры, и нарисованная прямая определяется только идентифицированными инлайерами, что делает этот метод более надежным для подбора моделей для данных с выбросами.