Объяснение: Если ошибка на обучающей выборке намного меньше, чем на тестовой, модель могла переобучиться. В таком случае стоит пересмотреть её параметры или использовать больше данных для обучения.
Эти примеры показывают, как правильно делить данные и почему это важно. На практике разделение выборки – это ключевой шаг, без которого невозможно объективно оценить качество модели.
Пример 5: Линейная регрессия
Линейная регрессия – один из самых простых и понятных методов машинного обучения, который используется для предсказания числовых значений. Он основывается на предположении, что между входными признаками и целевым признаком существует линейная зависимость.
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
```
Теперь создадим небольшой набор данных с информацией о квартирах:
```python
# Создадим искусственные данные: площадь (кв. метры), этаж и цена (в миллионах рублей)
data = pd.DataFrame({
"Площадь": [30, 45, 60, 75, 90, 105, 120, 135, 150, 165],
"Этаж": [2, 3, 5, 1, 8, 10, 12, 15, 17, 20],
"Цена": [3.5, 5.2, 6.8, 7.1, 9.3, 10.5, 12.7, 14.2, 15.8, 17.5]
})
```
Этот набор данных содержит три столбца:
– Площадь – площадь квартиры в квадратных метрах
– Этаж – на каком этаже расположена квартира
– Цена – реальная стоимость квартиры в миллионах рублей (целевой признак)
Шаг 2: Разделение данных на обучающую и тестовую выборки
Мы разделим данные на обучающую выборку (80%) и тестовую выборку (20%). Это необходимо для проверки модели на новых данных, которые она не видела во время обучения.
```python
# Отделяем признаки (X) и целевую переменную (y)
X = data[["Площадь", "Этаж"]]
y = data["Цена"]
# Разделяем данные: 80% для обучения, 20% для тестирования
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Выведем размер обучающей и тестовой выборки
print("Размер обучающей выборки:", X_train.shape[0])
print("Размер тестовой выборки:", X_test.shape[0])
```
Почему это важно?
– Обучающая выборка используется для того, чтобы модель нашла закономерности в данных.
– Тестовая выборка нужна, чтобы проверить, насколько хорошо модель предсказывает значения на новых данных.
Шаг 3: Обучение модели линейной регрессии
Теперь создадим модель линейной регрессии и обучим её на наших данных.
```python
# Создаем объект модели линейной регрессии
model = LinearRegression()
# Обучаем модель на обучающих данных
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.
Метрики помогают не только оценить качество модели, но и понять, как её можно улучшить, например, добавив новые признаки или изменив параметры алгоритма.
О проекте
О подписке