
Полная версия
Алгоритмы машинного обучения: базовый курс
# Обучаем модель на обучающих данных
model.fit(X_train, y_train)
```
Что здесь происходит?
– `LinearRegression()` – создаёт объект модели линейной регрессии.
– `.fit(X_train, y_train)` – обучает модель, находя оптимальные коэффициенты (вес признаков), которые позволяют наилучшим образом предсказывать цену квартиры.
Шаг 4: Анализ коэффициентов модели
После обучения можно посмотреть, какие коэффициенты модель подобрала для признаков.
```python
# Вывод коэффициентов
print("Коэффициенты модели:", model.coef_)
print("Свободный член (intercept):", model.intercept_)
```
Что это означает?
– Коэффициенты (`coef_`) показывают, как изменится предсказание цены, если изменить один из признаков на единицу.
– Свободный член (`intercept_`) – это базовое значение, с которого начинается предсказание, когда все признаки равны нулю.
Шаг 5: Предсказание на новых данных
Теперь, когда модель обучена, мы можем использовать её для предсказания цен квартир.
```python
# Делаем предсказания на тестовых данных
y_pred = model.predict(X_test)
# Выводим предсказанные и реальные значения
print("Реальные цены:", y_test.values)
print("Предсказанные цены:", y_pred)
```
Здесь модель делает прогноз стоимости квартир, основываясь на их площади и этаже.
Шаг 6: Оценка качества модели
Чтобы понять, насколько хорошо модель работает, сравним её предсказания с реальными значениями.
```python
# Вычисляем среднюю абсолютную ошибку (MAE)
mae = mean_absolute_error(y_test, y_pred)
# Вычисляем среднеквадратичную ошибку (MSE)
mse = mean_squared_error(y_test, y_pred)
# Выводим ошибки
print(f"Средняя абсолютная ошибка (MAE): {mae:.2f} млн рублей")
print(f"Среднеквадратичная ошибка (MSE): {mse:.2f}")
```
Что значат эти метрики?
– MAE (Mean Absolute Error) – показывает, насколько в среднем предсказанная цена квартиры отличается от реальной. Например, если MAE = 0.8, значит, предсказание модели в среднем отличается от настоящей цены на 800 тысяч рублей.
– MSE (Mean Squared Error) – похожая метрика, но возводит разницу в квадрат, чтобы сильнее наказывать большие ошибки.
Если ошибки слишком большие, значит, модель недостаточно точна и, возможно, ей нужно больше данных или другие признаки.
Шаг 7: Визуализация результатов
Давайте построим график, чтобы посмотреть, насколько хорошо модель предсказывает цены.
```python
# График: реальные vs предсказанные цены
plt.scatter(y_test, y_pred)
plt.xlabel("Реальные цены (млн рублей)")
plt.ylabel("Предсказанные цены (млн рублей)")
plt.title("Сравнение реальных и предсказанных цен")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='–')
plt.show()
```
Красная линия – это идеальный результат (предсказания совпадают с реальными значениями). Если точки расположены близко к ней, значит, модель хорошо справляется с предсказаниями.
Выводы
Мы прошли все основные шаги работы с линейной регрессией:
1. Подготовили данные и разделили их на обучающую и тестовую выборки.
2. Обучили модель на обучающих данных.
3. Посмотрели коэффициенты, которые нашла модель.
4. Сделали предсказания на тестовых данных.
5. Оценили качество предсказаний с помощью метрик.
6. Визуализировали результаты.
Если модель показывает хорошие результаты, её можно использовать для предсказания цен квартир на новых данных. Если же ошибки слишком большие, стоит попробовать добавить больше признаков (например, учитывать год постройки, тип дома или транспортную доступность) или использовать более сложные методы, такие как полиномиальная регрессия или градиентный бустинг.
Метрики оценки качества моделей
После того как модель машинного обучения обучена, необходимо понять, насколько хорошо она справляется со своей задачей. Для этого используются **метрики качества** – числовые показатели, которые помогают объективно оценить, насколько точны предсказания модели.
Выбор метрики зависит от типа задачи:
– Для регрессии (предсказание числовых значений, например, стоимости квартиры) применяются метрики, измеряющие разницу между предсказанными и реальными значениями.
– Для классификации (определение принадлежности объекта к одной из категорий, например, спам/не спам) используются метрики, оценивающие долю правильных ответов модели.
Метрики для задач регрессии
В задачах регрессии важно, насколько предсказанные значения близки к реальным. Рассмотрим основные метрики.
Средняя абсолютная ошибка (MAE – Mean Absolute Error)
MAE показывает, насколько в среднем предсказанное значение отличается от реального.
Пример: Если MAE = 50000 рублей, это значит, что в среднем цена квартиры, предсказанная моделью, отличается от настоящей на 50 тысяч рублей.
Как вычисляется:
– Находится разница между каждым предсказанным и реальным значением.
– Берётся абсолютное значение разницы (чтобы ошибки не компенсировали друг друга).
– Все ошибки усредняются.
Пример кода:
```python
from sklearn.metrics import mean_absolute_error
y_real = [3.5, 5.2, 6.8, 7.1, 9.3] # Реальные цены
y_pred = [3.6, 5.0, 7.0, 7.3, 9.5] # Предсказанные цены
mae = mean_absolute_error(y_real, y_pred)
print(f"Средняя абсолютная ошибка (MAE): {mae:.2f} млн рублей")
```
Среднеквадратичная ошибка (MSE – Mean Squared Error)
MSE похожа на MAE, но ошибки возводятся в квадрат перед усреднением.
Зачем это нужно?
Большие ошибки сильнее наказываются, что помогает модели учитывать случаи, когда предсказание сильно отличается от реального значения. Однако из-за возведения в квадрат ошибка измеряется в других единицах (если предсказываем цену в миллионах рублей, MSE будет в миллионах в квадрате).
Пример кода:
```python
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_real, y_pred)
print(f"Среднеквадратичная ошибка (MSE): {mse:.2f}")
```
Корень из среднеквадратичной ошибки (RMSE – Root Mean Squared Error) RMSE устраняет недостаток MSE: он измеряется в тех же единицах, что и предсказываемая величина. Это делается путем извлечения квадратного корня из MSE.
Пример кода:
```python
rmse = mean_squared_error(y_real, y_pred, squared=False)
print(f"Корень из среднеквадратичной ошибки (RMSE): {rmse:.2f} млн рублей")
```
Коэффициент детерминации (R² – R-squared, "коэффициент объяснённой дисперсии") Показывает, какую долю вариации целевой переменной объясняет модель.
– R² = 1 означает идеальную модель (все точки лежат на линии предсказания).
– R² = 0 значит, что модель предсказывает не лучше случайного угадывания.
– R² < 0 говорит о том, что модель вообще не подходит.
Пример кода:
```python
from sklearn.metrics import r2_score
r2 = r2_score(y_real, y_pred)
print(f"Коэффициент детерминации (R²): {r2:.2f}")
```
Метрики для задач классификации
В задачах классификации важно оценить, насколько правильно модель относит объекты к нужным категориям.
Точность (Accuracy) Показывает, какая доля предсказаний оказалась верной.
Формула:

Пример: Если модель правильно определила 90 писем как "не спам" и 10 как "спам" из 100 писем, точность составит 90%.
Пример кода:
```python
from sklearn.metrics import accuracy_score
y_real = [1, 0, 1, 1, 0, 0, 1, 0, 1, 1] # Истинные метки (1 – спам, 0 – не спам)
y_pred = [1, 0, 1, 0, 0, 0, 1, 0, 1, 1] # Предсказанные моделью метки
accuracy = accuracy_score(y_real, y_pred)
print(f"Точность (Accuracy): {accuracy:.2f}")
```
Недостаток Accuracy:
Если классы сильно несбалансированы (например, 95% данных – это "не спам", а 5% – "спам"), модель может просто всегда предсказывать "не спам" и получать 95% точности, но при этом не распознавать спам.
Матрица ошибок (Confusion Matrix)
Показывает, сколько раз модель правильно и неправильно предсказала каждый класс.
```python
from sklearn.metrics import confusion_matrix
conf_matrix = confusion_matrix(y_real, y_pred)
print("Матрица ошибок:\n", conf_matrix)
```
Где:
– `TN` (True Negative) – правильно определённые объекты класса "не спам"
– `TP` (True Positive) – правильно определённые объекты класса "спам"
– `FN` (False Negative) – спам, который модель не распознала
– `FP` (False Positive) – "не спам", ошибочно классифицированный как спам
Precision, Recall, F1-score
Когда классы несбалансированы, точность уже не так важна. Лучше использовать Precision (точность) и Recall (полноту):
– Precision – из всех предсказанных "спам", сколько реально является спамом.
– Recall – из всех реальных "спам", сколько модель нашла.
F1-score – среднее значение Precision и Recall.
Пример кода:
```python
from sklearn.metrics import precision_score, recall_score, f1_score
precision = precision_score(y_real, y_pred)
recall = recall_score(y_real, y_pred)
f1 = f1_score(y_real, y_pred)
print(f"Точность (Precision): {precision:.2f}")
print(f"Полнота (Recall): {recall:.2f}")
print(f"F1-метрика: {f1:.2f}")
```
Выводы:
Выбор метрики зависит от задачи.
– В регрессии лучше всего использовать RMSE или R², если важно понять, насколько модель точна.
– В классификации точность (Accuracy) хороша только при сбалансированных классах. При дисбалансе лучше смотреть на Precision, Recall и F1-score.
Метрики помогают не только оценить качество модели, но и понять, как её можно улучшить, например, добавив новые признаки или изменив параметры алгоритма.
Глава 5. Несувервизорное обучение
– Кластеризация: алгоритмы K-means и DBSCAN
– Снижение размерности: PCA
– Пример: сегментация данных
В мире машинного обучения многие задачи требуют работы с данными, для которых нет заранее подготовленных ответов. Представьте, что у вас есть огромный массив информации, но вы не знаете, как её структурировать, какие закономерности в ней скрыты и какие группы объектов можно выделить. Именно для таких случаев используется несупервизорное (без учителя) обучение.
В отличие от супервайзного обучения, где модель обучается на размеченных данных (где есть входные параметры и правильные ответы), несупервайзное обучение работает без заранее определённых меток. Оно помогает выявлять скрытые структуры в данных, группировать похожие объекты и уменьшать размерность данных, чтобы упростить их анализ.
В этой главе мы разберём два ключевых направления несупервайзного обучения:
– Кластеризацию, которая позволяет объединять похожие объекты в группы без предварительного знания о них. Мы рассмотрим два популярных алгоритма: K-means, который находит кластеры по заданному числу групп, и DBSCAN, который может выявлять группы любой формы, включая выбросы.
– Снижение размерности, которое помогает упростить анализ данных, убирая лишние признаки. Мы разберём метод PCA (анализ главных компонент), который позволяет визуализировать многомерные данные и находить в них основные закономерности.
В завершение мы рассмотрим практический пример, связанный с сегментацией данных, где продемонстрируем, как несупервайзное обучение может помочь выявить структуру в неразмеченной информации.
Кластеризация: алгоритмы K-means и DBSCAN
Кластеризация – это один из важнейших методов в рамках несупервизорного обучения, который позволяет разделить набор данных на группы, или кластеры, таким образом, что объекты внутри одного кластера схожи между собой, а объекты из разных кластеров – различаются. Этот метод используется, когда мы не знаем заранее, как классифицировать объекты, но хотим понять, есть ли в данных какие-то скрытые структуры или закономерности.
Одними из самых популярных и широко используемых алгоритмов кластеризации являются K-means и DBSCAN. Оба алгоритма имеют свои особенности и применяются в разных ситуациях, в зависимости от структуры данных.
Алгоритм K-means
K-means – это простой, но мощный алгоритм, который хорошо работает, когда данные имеют явно выраженные кластеры с похожими размерами и формой. В процессе работы K-means нужно заранее указать число кластеров, которое модель должна найти в данных. Идея алгоритма заключается в том, чтобы минимизировать внутрикластерное расстояние между объектами, при этом максимизируя расстояние между кластерами.
Процесс работы алгоритма можно представить как многократное распределение объектов по кластерам и пересчёт центроидов (средних значений) каждого кластера. Начинается всё с того, что случайным образом выбираются начальные центроиды. Затем каждый объект данных назначается к ближайшему центроиду. После этого алгоритм пересчитывает новые центроиды, исходя из данных, которые к ним были отнесены. Этот процесс повторяется до тех пор, пока центроиды не перестанут изменяться, или изменения будут незначительными.
Однако есть несколько ограничений у K-means. Одним из них является необходимость заранее знать количество кластеров, что не всегда возможно, особенно если структура данных неочевидна. Также алгоритм чувствителен к начальному выбору центроидов, что может повлиять на итоговый результат, особенно в случае, когда данные сильно перекошены или содержат выбросы.
Алгоритм DBSCAN
В отличие от K-means, алгоритм DBSCAN (Density-Based Spatial Clustering of Applications with Noise) не требует указания числа кластеров заранее. Этот алгоритм основан на плотности объектов в пространстве. DBSCAN пытается группировать объекты, которые находятся в областях с высокой плотностью, и отделяет их от областей с низкой плотностью, которые могут считаться выбросами.
Одним из сильных преимуществ DBSCAN является его способность обнаруживать кластеры произвольной формы, в то время как K-means склонен работать лучше только с кластерами, имеющими круглую или сферическую форму. Алгоритм также эффективно справляется с выбросами, которые он не включает в кластеры, что позволяет избежать искажения результатов, как это может случиться в K-means, если выбросы слишком сильно влияют на расчёт центроидов.
Однако, несмотря на свою гибкость, DBSCAN также имеет некоторые ограничения. Например, он чувствителен к параметрам, которые нужно установить – радиусу окрестности для поиска соседей и минимальному числу объектов, которое должно быть в окрестности, чтобы её можно было считать кластером. Выбор этих параметров может сильно повлиять на результаты работы алгоритма.
Когда использовать какой алгоритм?
Выбор между K-means и DBSCAN зависит от характера данных. Если у вас есть данные, которые можно разделить на кластеры с ясными центроидами и одинаковыми размерами, то K-means может быть лучшим выбором. Этот алгоритм также подойдёт, если вы точно знаете количество кластеров и хотите быстро получить решение.
Однако если ваши данные содержат выбросы или кластеры сложной формы, или если вы не уверены в количестве кластеров, DBSCAN может быть более подходящим вариантом. Он более гибок и способен выявлять такие структуры, которые другие алгоритмы могли бы проигнорировать.
Кроме того, можно комбинировать оба алгоритма: сначала использовать DBSCAN для предварительного выделения потенциальных кластеров и выбросов, а затем применить K-means для более точного уточнения границ кластеров, если есть уверенность в их числе.
Пример использования K-means и DBSCAN
Давайте более детально рассмотрим пример использования алгоритмов K-means и DBSCAN для сегментации пользователей на основе их покупательских привычек. В этом примере мы будем работать с данными о суммах покупок и частоте покупок, и покажем, как каждый из алгоритмов решает задачу кластеризации.
Предположим, у нас есть набор данных о покупках клиентов, представленных двумя признаками:
– Сумма покупок: сколько денег клиент потратил в магазине.
– Частота покупок: как часто клиент делает покупки (например, количество покупок за месяц).
Мы будем использовать два алгоритма для сегментации данных:
1. K-means – для создания чётких кластеров с заранее определённым количеством.
2. DBSCAN – для выявления кластеров произвольной формы и обработки выбросов, где не нужно указывать количество кластеров.
Шаг 1: Подготовка данных
Для простоты примера создадим искусственные данные, представляющие 100 клиентов. Признаки: сумма покупок и частота покупок. Мы будем использовать Python и библиотеки `sklearn`, `numpy` и `matplotlib` для визуализации.
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
# Создаем искусственные данные
np.random.seed(42)
# Генерируем данные: 2 кластера с разными суммами покупок и частотами покупок
X, _ = make_blobs(n_samples=100, centers=[[20, 2], [50, 10]], cluster_std=[5, 7], random_state=42)
# Масштабируем данные для лучшего представления в модели
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Визуализируем данные
plt.scatter(X_scaled[:, 0], X_scaled[:, 1])
plt.title("Изначальные данные")
plt.xlabel("Сумма покупок")
plt.ylabel("Частота покупок")
plt.show()
```
Шаг 2: Применение K-means
Для начала применим алгоритм K-means, указав, что хотим разделить данные на 2 кластера. Мы заранее предполагаем, что в данных есть два типа клиентов – те, кто делает покупки часто, но с меньшими суммами, и те, кто совершает большие покупки реже.
```python
# Применяем алгоритм K-means
kmeans = KMeans(n_clusters=2, random_state=42)
y_kmeans = kmeans.fit_predict(X_scaled)
# Визуализируем результаты
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_kmeans, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X', label='Центроиды')
plt.title("Результаты кластеризации K-means")
plt.xlabel("Сумма покупок")
plt.ylabel("Частота покупок")
plt.legend()
plt.show()
```
В результате кластеризации K-means мы получаем два чётких кластера, и каждый клиент будет отнесён к одному из них. Центроиды этих кластеров будут отображены на графике красными крестиками.
Шаг 3: Применение DBSCAN
Теперь применим алгоритм DBSCAN. В отличие от K-means, DBSCAN не требует указания количества кластеров и может находить кластеры произвольной формы. Мы также используем параметры для настройки алгоритма:
– eps – максимальное расстояние между объектами, которые могут быть отнесены к одному кластеру.
– min_samples – минимальное количество объектов для формирования кластера.
```python
# Применяем алгоритм DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
y_dbscan = dbscan.fit_predict(X_scaled)
# Визуализируем результаты DBSCAN
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_dbscan, cmap='viridis')
plt.title("Результаты кластеризации DBSCAN")
plt.xlabel("Сумма покупок")
plt.ylabel("Частота покупок")
plt.show()
```
В результате работы DBSCAN мы видим, что алгоритм выделил два основных кластера, а некоторые объекты (которые в модели считаются выбросами) не были отнесены ни к одному кластеру и обозначены как -1. Эти объекты можно рассматривать как редкие или аномальные пользователи.
Шаг 4: Сравнение результатов
Теперь давайте сравним результаты кластеризации с помощью K-means и DBSCAN.
– K-means создаёт два чётких, заранее заданных кластера. Это полезно, когда вы точно знаете, что данные могут быть разделены на несколько групп с определённым количеством кластеров.
– DBSCAN позволяет обнаружить кластеры произвольной формы и игнорировать выбросы, что полезно, когда данные содержат аномальные точки или неравномерно распределены.
Итог
– K-means оказался эффективным для данных, где кластеры имели форму, которую можно было представить в виде окружностей или шаров с ясными центроидами. Алгоритм требует указания числа кластеров заранее.
– DBSCAN оказался более гибким, так как он сам обнаруживает количество кластеров и может работать с выбросами. Этот алгоритм идеально подходит для ситуаций, когда данные могут иметь сложную форму или содержат аномалии.
Оба алгоритма имеют свои сильные стороны, и выбор между ними зависит от структуры ваших данных. Если вы знаете, сколько кластеров вам нужно, и уверены, что они будут симметричными и не содержат выбросов, то K-means – это хорошее решение. Если же данные имеют более сложную структуру и выбросы, лучше использовать DBSCAN.
Снижение размерности: PCA
Снижение размерности – это важная техника в области машинного обучения и анализа данных, которая позволяет уменьшить количество признаков (или переменных) в наборе данных, сохраняя при этом как можно больше информации. Это особенно полезно в случае, когда данные имеют большое количество признаков, что может привести к проблемам с вычислительными ресурсами, а также ухудшению производительности моделей из-за так называемого проклятия размерности. Одним из самых популярных методов снижения размерности является PCA (Principal Component Analysis), или анализ главных компонент.
Основные идеи PCA
Метод PCA помогает уменьшить размерность данных, преобразуя исходные признаки в новые переменные, которые называются главными компонентами. Эти компоненты являются линейными комбинациями исходных признаков и упорядочены так, что первая главная компонента захватывает максимальную дисперсию данных, вторая – наибольшую дисперсию, оставшуюся после первой, и так далее. Таким образом, первые несколько главных компонент обычно содержат большинство информации о данных, что позволяет отказаться от менее значимых компонент.
PCA – это линейный метод, который ищет новые оси координат, вдоль которых данные максимально разнесены. Эти оси называются основными компонентами. Процесс можно представить следующим образом:
1. Нахождение главных компонент: с помощью математических методов (например, сингулярного разложения матрицы) PCA находит новые оси, которые наиболее информативны для данных.
2. Проекция данных на новые оси: исходные данные проецируются на найденные главные компоненты, что приводит к новому представлению данных в пространстве меньшей размерности.
3. Выбор количества компонент: можно выбрать количество компонент, которые сохраняют наибольшее количество информации, и отбросить менее значимые компоненты.
Зачем нужно снижать размерность?
1. Ускорение обучения: с уменьшением числа признаков модели обучаются быстрее, так как уменьшается количество вычислений.
2. Предотвращение переобучения: уменьшая количество признаков, можно снизить риск переобучения модели, так как она не будет "подгоняться" под шум в данных.
3. Визуализация данных: для многомерных данных снижение размерности позволяет визуализировать данные, что помогает понять их структуру.
4. Уменьшение коллинеарности: если признаки в данных сильно коррелируют друг с другом, это может приводить к проблемам в работе моделей. PCA помогает уменьшить коллинеарность, заменяя связанные признаки на независимые компоненты.
Как работает PCA?
1. Центрирование данных: перед применением PCA данные нужно центрировать, т.е. вычесть среднее значение каждого признака из всех его значений. Это делается для того, чтобы компоненты были вычислены относительно нулевой средней.
2. Ковариационная матрица: затем вычисляется ковариационная матрица для центрированных данных. Ковариация показывает, как два признака изменяются относительно друг друга. Чем выше ковариация, тем сильнее взаимосвязь между признаками.
3. Сингулярное разложение или собственные значения и собственные векторы: используя сингулярное разложение матрицы или вычисление собственных значений и собственных векторов ковариационной матрицы, мы находим главные компоненты. Эти компоненты соответствуют векторам, которые указывают направления максимальной дисперсии данных.
4. Проекция данных: теперь можно проецировать исходные данные на найденные компоненты. Это преобразует данные в новое пространство меньшей размерности.
Пример использования PCA
Допустим, у нас есть набор данных с множеством признаков, и мы хотим уменьшить их количество, чтобы улучшить производительность модели. Рассмотрим следующий пример с использованием библиотеки scikit-learn на Python.