Читать книгу «Алгоритмы машинного обучения: базовый курс» онлайн полностью📖 — Тайлера Венс — MyBook.

Глава 7. Линейные модели

– Линейная и логистическая регрессия

– Регуляризация: Ridge и Lasso

– Проблемы переобучения


Линейные модели занимают центральное место в машинном обучении, поскольку они являются одними из самых простых и интерпретируемых методов анализа данных. Несмотря на свою кажущуюся простоту, эти модели обладают высокой эффективностью и широко применяются в задачах прогнозирования, классификации и анализа взаимосвязей между переменными.

Основной идеей линейных моделей является представление зависимости между входными признаками и целевой переменной в виде линейной комбинации. Это позволяет быстро обучать модели, легко интерпретировать полученные коэффициенты и эффективно решать задачи с большим числом наблюдений. Однако линейные модели подвержены ряду проблем, таких как переобучение и чувствительность к выбросам, что требует применения специальных методов регуляризации и оценки их качества.

В этой главе мы рассмотрим две ключевые линейные модели: линейную регрессию, используемую для предсказания числовых значений, и логистическую регрессию, которая применяется в задачах классификации. Также разберем методы регуляризации, такие как Ridge и Lasso, которые помогают предотвратить переобучение, улучшая обобщающую способность модели. В завершение обсудим основные причины переобучения линейных моделей и способы их устранения, чтобы добиться наилучших результатов при работе с реальными данными.

Линейная и логистическая регрессия

Линейная регрессия – один из самых простых и интуитивно понятных методов прогнозирования. Её суть заключается в том, что зависимость между входными переменными и выходной переменной представляется в виде линейной функции. Например, если нужно предсказать стоимость квартиры, то учитываются такие факторы, как её площадь, количество комнат и район, а модель пытается найти такие коэффициенты, которые позволят наиболее точно восстановить зависимость между этими параметрами и ценой.

Линейная регрессия обучается на основе имеющихся данных, подбирая такие значения коэффициентов, чтобы разница между реальными и предсказанными значениями была минимальной. После того как модель обучена, её можно использовать для предсказания новых значений на основе аналогичных входных данных. Этот метод особенно полезен, когда зависимость между переменными действительно близка к линейной, однако в реальной жизни данные часто содержат шум, выбросы или нелинейные зависимости, что может затруднить получение точных предсказаний.

В отличие от линейной регрессии, которая применяется для предсказания числовых значений, логистическая регрессия используется для задач классификации, где требуется определить, к какому классу относится объект. Например, если нужно предсказать, купит ли пользователь товар в интернет-магазине, то модель принимает во внимание такие параметры, как частота посещений сайта, средний чек предыдущих покупок и время, проведённое на странице товара. Вместо предсказания конкретного числа, как в линейной регрессии, логистическая регрессия выдаёт вероятность того, что объект принадлежит к определённому классу.

Основная особенность логистической регрессии заключается в том, что выходные значения ограничены диапазоном от 0 до 1, что делает этот метод особенно удобным для задач бинарной классификации. Например, в задаче медицинской диагностики модель может предсказывать вероятность наличия заболевания у пациента на основе его симптомов и анализов. Если вероятность выше определённого порога, пациента относят к группе с повышенным риском, если ниже – к здоровой группе.

Хотя логистическая регрессия является инструментом для классификации, она лучше всего работает в случаях, когда классы хорошо разделимы с помощью линейной границы. Если данные имеют сложную структуру или включают сильно пересекающиеся группы, точность модели может снижаться. В таких случаях могут потребоваться более сложные методы, такие как нейросети или градиентный бустинг, но логистическая регрессия остаётся хорошей отправной точкой, благодаря своей интерпретируемости и эффективности на больших наборах данных.

Линейная и логистическая регрессия – это универсальные инструменты, которые можно применять в самых разных задачах: от предсказания продаж в бизнесе до медицинской диагностики и анализа пользовательского поведения. Их простота, скорость обучения и интерпретируемость делают их важной частью арсенала аналитиков данных и специалистов по машинному обучению.

Примеры использования линейной и логистической регрессии

Разберем два примера: первый – применение линейной регрессии для предсказания стоимости квартиры, второй – использование логистической регрессии для классификации пассажиров «Титаника» на выживших и погибших.

Пример 1: Линейная регрессия для предсказания стоимости квартиры

Допустим, у нас есть данные о квартирах, включая площадь, количество комнат и удаленность от центра города. Наша цель – предсказать стоимость квартиры на основе этих параметров.

Шаг 1: Загрузка данных и подготовка

Сначала установим необходимые библиотеки и загрузим данные.

```python

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LinearRegression

from sklearn.metrics import mean_absolute_error, mean_squared_error

# Создадим искусственный набор данных

data = {

'Площадь': [30, 45, 50, 60, 75, 90, 110, 150, 200, 250],

'Комнат': [1, 1, 2, 2, 3, 3, 4, 5, 6, 7],

'Удаленность_от_центра': [10, 8, 7, 5, 4, 3, 2, 1, 1, 1],

'Цена': [3.5, 5.0, 6.0, 7.5, 9.0, 11.0, 13.5, 18.0, 24.0, 30.0]

}

df = pd.DataFrame(data)

# Разделим данные на входные признаки (X) и целевую переменную (y)

X = df[['Площадь', 'Комнат', 'Удаленность_от_центра']]

y = df['Цена']

# Разделим выборку на обучающую и тестовую

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

```

Шаг 2: Обучение модели линейной регрессии

Создадим и обучим модель.

```python

# Создаем модель линейной регрессии

model = LinearRegression()

# Обучаем модель

model.fit(X_train, y_train)

# Предсказываем цены квартир на тестовых данных

y_pred = model.predict(X_test)

```

Шаг 3: Оценка качества модели

Оценим точность предсказаний, используя метрики MSE и MAE.

```python

mse = mean_squared_error(y_test, y_pred)

mae = mean_absolute_error(y_test, y_pred)

print(f"Среднеквадратичная ошибка (MSE): {mse:.2f}")

print(f"Средняя абсолютная ошибка (MAE): {mae:.2f}")

```

Шаг 4: Визуализация результатов

Посмотрим, насколько предсказанные значения соответствуют реальным.

```python

plt.scatter(y_test, y_pred)

plt.xlabel("Фактическая цена (млн)")

plt.ylabel("Предсказанная цена (млн)")

plt.title("Сравнение предсказанных и реальных цен")

plt.show()

```

Вывод: если модель обучилась хорошо, точки на графике будут близки к диагональной линии, что указывает на точность предсказаний.

Пример 2: Логистическая регрессия для предсказания выживания на «Титанике»

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

Шаг 1: Загрузка и подготовка данных

Загрузим и обработаем известный набор данных Titanic.

```python

from sklearn.linear_model import LogisticRegression

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import accuracy_score, classification_report

import seaborn as sns

# Загружаем данные Titanic

url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"

df = pd.read_csv(url)

# Оставляем только нужные колонки

df = df[['Survived', 'Pclass', 'Age', 'SibSp', 'Parch']]

# Удаляем строки с пропущенными значениями

df.dropna(inplace=True)

# Разделяем на признаки и целевую переменную

X = df[['Pclass', 'Age', 'SibSp', 'Parch']]

y = df['Survived']

# Стандартизация данных для улучшения качества модели

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

# Разбиваем на обучающую и тестовую выборки

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

```

Шаг 2: Обучение модели логистической регрессии

Создадим и обучим модель.

```python

# Создаем модель логистической регрессии

log_model = LogisticRegression()

# Обучаем модель

log_model.fit(X_train, y_train)

# Предсказываем выживаемость пассажиров

y_pred = log_model.predict(X_test)

```

Шаг 3: Оценка качества модели

Выведем метрики точности и классификационный отчет.

```python

accuracy = accuracy_score(y_test, y_pred)

print(f"Точность модели: {accuracy:.2f}")

print(classification_report(y_test, y_pred))

```

Шаг 4: Интерпретация результатов

Посмотрим, какие факторы сильнее всего влияют на предсказания модели.

```python

feature_names = ['Pclass', 'Age', 'SibSp', 'Parch']

coefficients = log_model.coef_[0]

# Визуализируем влияние факторов

plt.figure(figsize=(8, 5))

sns.barplot(x=feature_names, y=coefficients)

plt.xlabel("Признаки")

plt.ylabel("Коэффициенты модели")

plt.title("Влияние факторов на вероятность выживания")

plt.show()

```

Вывод: если коэффициент у какого-то признака положительный, значит, этот фактор увеличивает вероятность выживания, а если отрицательный – снижает.

Сравнение и выводы

Линейная и логистическая регрессия применяются в разных задачах, но оба метода имеют схожий принцип работы.

– Линейная регрессия хорошо подходит для предсказания числовых значений, например, стоимости квартир. Ее коэффициенты позволяют понять, какие факторы оказывают наибольшее влияние на итоговое значение.

– Логистическая регрессия применяется в задачах классификации. Она предсказывает вероятность принадлежности к определенному классу, что полезно для медицинской диагностики, оценки риска отказа клиентов, предсказания выживаемости пассажиров и других задач.

Оба метода просты, эффективны и легко интерпретируются, что делает их отличным выбором для базовых задач машинного обучения.

Регуляризация: Ridge и Lasso

В машинном обучении линейные модели часто сталкиваются с проблемой переобучения, особенно если количество признаков велико или среди них есть коррелированные. В таких случаях модель может подстраиваться под шум в данных, что приводит к плохим результатам на новых примерах.

Чтобы решить эту проблему, применяют регуляризацию – метод, который добавляет штраф за сложность модели и тем самым ограничивает величину коэффициентов. Основные виды регуляризации для линейных моделей – Ridge (L2-регуляризация) и Lasso (L1-регуляризация).

Почему нужна регуляризация?

Рассмотрим пример: у нас есть модель линейной регрессии, которая предсказывает стоимость квартиры на основе площади, количества комнат и удаленности от центра. Если данные содержат шум или признаки сильно скоррелированы, модель может присвоить слишком большие веса несущественным параметрам, что приведет к переобучению.

Регуляризация помогает сгладить влияние отдельных признаков, контролируя их коэффициенты, и делает модель более устойчивой.

Ridge-регуляризация (L2)

Ridge-регуляризация, также называемая L2-регуляризацией, накладывает штраф на сумму квадратов коэффициентов модели. Это не дает им становиться слишком большими и помогает справиться с многоколоинейностью (сильной зависимостью между признаками).

L2-регуляризация полезна, если у вас есть много признаков и вы не хотите отбрасывать ни один из них, но хотите уменьшить их влияние.

Пример: Ridge-регрессия на данных о квартирах

```python

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.linear_model import Ridge

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import mean_absolute_error

# Создаем искусственные данные

data = {

'Площадь': [30, 45, 50, 60, 75, 90, 110, 150, 200, 250],

'Комнат': [1, 1, 2, 2, 3, 3, 4, 5, 6, 7],

'Удаленность_от_центра': [10, 8, 7, 5, 4, 3, 2, 1, 1, 1],

'Цена': [3.5, 5.0, 6.0, 7.5, 9.0, 11.0, 13.5, 18.0, 24.0, 30.0]

}

df = pd.DataFrame(data)

# Разделяем на признаки (X) и целевую переменную (y)

X = df[['Площадь', 'Комнат', 'Удаленность_от_центра']]

y = df['Цена']

# Нормализация признаков

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

# Разделение на обучающую и тестовую выборки

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# Обучение модели Ridge-регрессии с коэффициентом регуляризации alpha=1.0

ridge_model = Ridge(alpha=1.0)

ridge_model.fit(X_train, y_train)

# Предсказание

y_pred = ridge_model.predict(X_test)

# Оценка качества модели

mae = mean_absolute_error(y_test, y_pred)

print(f"Средняя абсолютная ошибка (MAE): {mae:.2f}")

# Визуализация коэффициентов

ridge_coefs = ridge_model.coef_

plt.bar(['Площадь', 'Комнат', 'Удаленность_от_центра'], ridge_coefs)

plt.xlabel("Признаки")

plt.ylabel("Коэффициенты модели")

plt.title("Влияние факторов в Ridge-регрессии")

plt.show()

```

Вывод: Ridge-регрессия уменьшает значения коэффициентов, но не обнуляет их. Это делает модель устойчивой к переобучению.

Lasso-регуляризация (L1)

Lasso-регуляризация, или L1-регуляризация, добавляет штраф за сумму абсолютных значений коэффициентов. В отличие от Ridge, она не просто уменьшает их, но может полностью занулить некоторые из них, что приводит к отбору наиболее важных признаков.

L1-регуляризация полезна, если среди признаков много незначимых, и модель должна автоматически их исключить.

Пример: Lasso-регрессия на тех же данных

```python

from sklearn.linear_model import Lasso

# Обучение модели Lasso-регрессии

lasso_model = Lasso(alpha=0.1)

lasso_model.fit(X_train, y_train)

# Предсказание

y_pred = lasso_model.predict(X_test)

# Оценка модели

mae = mean_absolute_error(y_test, y_pred)

print(f"Средняя абсолютная ошибка (MAE): {mae:.2f}")

# Визуализация коэффициентов

lasso_coefs = lasso_model.coef_

plt.bar(['Площадь', 'Комнат', 'Удаленность_от_центра'], lasso_coefs)

plt.xlabel("Признаки")

plt.ylabel("Коэффициенты модели")

plt.title("Влияние факторов в Lasso-регрессии")

plt.show()

```

Вывод: если один из коэффициентов оказался нулевым, значит, Lasso-регрессия сочла этот признак незначимым и удалила его. Это делает ее полезной для отбора признаков.

Сравнение Ridge и Lasso

Выводы

1. Обе регуляризации помогают бороться с переобучением. Если модель слишком сильно запоминает обучающую выборку, это может ухудшить ее способность обобщать данные.

2. Ridge (L2) снижает веса признаков, но не обнуляет их, что делает его полезным, когда все признаки имеют значение.

3. Lasso (L1) может занулять некоторые коэффициенты, позволяя автоматически исключать ненужные признаки.

4. Если не уверены, какую регуляризацию выбрать, попробуйте обе и оцените качество модели с помощью кросс-валидации.

Регуляризация – инструмент, который делает линейные модели более устойчивыми и удобными для работы, особенно при большом количестве признаков.


Проблемы переобучения

Когда модель машинного обучения показывает отличные результаты на тренировочных данных, но плохо работает на новых примерах, это называется переобучением. Такая модель не способна выявлять общие закономерности, а лишь запоминает конкретные примеры, что приводит к низкой обобщающей способности.

Переобучение возникает, когда модель слишком сложная для имеющихся данных. Например, если в модели слишком много параметров, она может запомнить все нюансы обучающего набора, включая случайные шумы и выбросы. Это приводит к тому, что при работе с новыми данными модель делает ошибочные предсказания, поскольку не может применить знания в более широком контексте.

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

Одной из причин переобучения может быть избыточное количество признаков. Если их слишком много, модель начинает искать зависимости даже там, где их нет. Например, в задаче предсказания стоимости квартиры можно добавить случайный параметр, например, число букв в названии ближайшего магазина. Если модель окажется слишком гибкой, она может решить, что этот параметр влияет на цену, и будет использовать его в предсказаниях, хотя на самом деле никакой связи нет.