Полный гайд по линейной регрессии | robot_dreams
Для отслеживания статуса заказа — авторизируйтесь
Введите код, который был выслан на почту Введите код с SMS, который был выслан на номер
 
Код действителен в течение 5 минут Код с sms действителен в течение 5 минут
Вы уверены, что хотите выйти?
Сеанс завершен
На главную
Что такое линейная регрессия: полный гайд от robot_dreams

Что такое линейная регрессия: полный гайд от robot_dreams

С примерами кода на Python

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

Где применяется линейная регрессия

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

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

Формула линейной регрессии

В общем виде линейная модель выглядит как объект x = (x1, x2, ..., xd) с набором признаков с общим числом d. Формула линейной регрессии d. Формула линейной регрессии:

где:

  • Y — это зависимая переменная (отклик), которую мы пытаемся предсказать;
  • β₀, β₁, β₂, ..., βₖ — это коэффициенты регрессии (веса), которые умножаются на соответствующие предикторы X, X, ..., X. Веса предикторов определяют, как каждый предиктор влияет на зависимую переменную. Вместо термина «предиктор» могут использоваться другие понятия: «независимая переменная», «фактор», «входные данные» и пр.
  • ε — это расхождение между предсказанными значениями и фактическими, нормально распределенная случайная величина (об ошибках поговорим чуть ниже).

В общем виде линейная модель выглядит как функция:

где:

  • w0 — свободный коэффициент или сдвиг (он же bias);
  • wJ — веса или коэффициенты.

Для удобства нотации линейной модели можно сделать предположение, что в нашей выборке всегда присутствует единичный константный признак. Это позволит нам считать, что коэффициент при нем это и будет свободный w0. Такое предположение говорит о том, что модель можно записывать просто как скалярное произведение а(x)= < w,х >, что удобно для анализа.

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

Подготовка данных для модели

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

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

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

Шкалирование

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

Когда необходимо шкалирование

Предположим, у нас есть набор данных о продажах автомобилей:

  • Одна переменная — это цена автомобиля. Может быть от нескольких тысяч до нескольких миллионов долларов.
  • Другая — количество проданных машин. Может варьироваться от нескольких штук до нескольких тысяч штук.

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

Что значит масштабировать в контексте линейной регрессии? Например, мы можем разделить цену автомобиля на 1000, а количество проданных автомобилей — на 100. После масштабирования обе переменные будут иметь диапазон значений от 0 до 1. Это сделает модель более устойчивой к шумам и аномалиям, а также улучшит ее предсказательную точность.

Пример шкалирования

Вот пример шкалирования признаков с использованием стандартизации (Z-преобразования) в Python с помощью библиотеки scikit-learn:

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# Генерируем пример данных (здесь X — признаки, y — целевая переменная)
X, y = ...
# Разделяем данные на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# Создаем объект стандартизации
scaler = StandardScaler()
# Применяем стандартизацию к обучающим данным и параллельно обучаем шкалировщик
X_train_scaled = scaler.fit_transform(X_train)
# Применяем ту же стандартизацию к тестовым данным (без повторного обучения)
X_test_scaled = scaler.transform(X_test)
# Создаем и обучаем модель линейной регрессии на отмасштабированных данных
model = LinearRegression()
model.fit(X_train_scaled, y_train)
# Оцениваем производительность модели
score = model.score(X_test_scaled, y_test)
# Получаем коэффициенты регрессии
coefficients = model.coef_
intercept = model.intercept_
print("Производительность модели (R-squared):", score)
print("Коэффициенты регрессии:", coefficients)
print("Свободный член:", intercept)

Этот метод преобразует каждый признак так, чтобы он имел среднее значение 0 и стандартное отклонение 1. Затем мы обучаем модель линейной регрессии на отмасштабированных данных и оцениваем производительность модели.

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

Бинаризация данных

Один из популярных методов подготовки информации — бинаризация данных, то есть процесс преобразования количественных признаков в бинарные (двоичные) признаки на основе определенного порогового значения. В результате бинаризации признаков каждое значение либо становится 0, если оно меньше порогового значения, либо 1, если оно больше или равно порогу.

Пример бинаризации в Python с использованием библиотеки NumPy

Библиотека устанавливается командо pip install numpy.

Предположим, мы имеем дело с количественным признаком AGE («Возраст»), и вы хотите преобразовать его в бинарный признак «Старше 35 лет». Сделать это можно так:

import numpy as np
# Создаем массив с возрастами
ages = np.array([20, 25, 32, 35, 41, 46, 52, 53, 62])
# Задаем порог для бинаризации
threshold = 35
# Применяем бинаризацию
binary_ages = (ages >= threshold).astype(int)
print(binary_ages)

Результат бинаризации:

[0 0 0 1 1 1 1 1 1]

В этом примере 1 обозначает, что возраст старше или равен 35 лет, а 0 — моложе 35 лет.

Label Encoding

Label Encoding (Кодирование меток) применяется в задачах, когда нужно представить категории (например, текстовые или дискретные значения) в виде чисел, чтобы их можно было использовать в алгоритмах машинного обучения. Каждой уникальной категории присваивается уникальное целое число.

Пример использования Label Encoding в задаче линейной регрессии

Допустим, мы анализируем данные о продажах недвижимости, и у нас есть категориальный признак «Класс жилья» с категориями, упорядоченными по степени роскоши: «Эконом», «Стандарт», «Премиум». В этом случае можно использовать Label Encoding для преобразования этого признака в числовой формат, чтобы линейная регрессия могла работать с ним.

Пример кода на Python с использованием библиотеки scikit-learn:

from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LinearRegression
# Создаем набор данных с признаками, включая категориальный "Класс жилья"
data = {
    'Площадь': [100, 150, 120, 80, 200],
    'Класс жилья': ['Эконом', 'Стандарт', 'Премиум', 'Эконом', 'Премиум'],
    'Цена': [200000, 300000, 350000, 150000, 450000]
}
# Инициализируем LabelEncoder
label_encoder = LabelEncoder()
# Преобразуем категориальный признак "Класс жилья" в числовой формат
data['Класс жилья'] = label_encoder.fit_transform(data['Класс жилья'])
# Разделяем данные на признаки и целевую переменную
X = data[['Площадь', 'Класс жилья']]
y = data['Цена']
# Создаем и обучаем линейную регрессию
model = LinearRegression()
model.fit(X, y)
# Делаем прогноз
predicted_prices = model.predict(X)
print(predicted_prices)

One-Hot encoding

Для преобразования категориальных переменных в числовые можно применять метод One-Hot encoding. Его алгоритм следующий:

  • Для каждой категориальной переменной создается вектор.
  • Для каждого компонента вектора присваивается значение 1, если значение категориальной переменной соответствует этому компоненту, и 0, если нет.
  • Векторы объединяются в единый набор данных.

Пример One-Hot encoding с использованием библиотеки Python pandas

Пример реализации программно:

import pandas as pd
# Создаем датафрейм с категориальными переменными
data = {'Цвет': ['Красный', 'Зеленый', 'Синий', 'Красный', 'Зеленый']}
df = pd.DataFrame(data)
# Применяем One-Hot encoding с помощью функции get_dummies
one_hot_encoded = pd.get_dummies(df, columns=['Цвет'])
print(one_hot_encoded)

Этот код демонстрирует применение One-Hot encoding с использованием библиотеки pandas. Мы создали DataFrame с категориальной переменной «Цвет», после чего использовали функцию pd.get_dummies() для выполнения One-Hot encoding. Результат:

 

   Цвет_Зеленый  Цвет_Красный  Цвет_Синий

0             0            1           0

1             1            0           0

2             0            0           1

3             0            1           0

4             1            0           0

Программная реализация модели линейной регрессии

Для создания и обучения линейной регрессионной модели важна не только подготовка данных, но и определение модели с помощью метода LinearRegression() — именно его мы вызывали в примерах выше. Давайте его рассмотрим подробнее.

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

Метод LinearRegression() — це виклик конструктора класу LinearRegression, який визначено в бібліотеці scikit-learn (sklearn). Цей конструктор створює екземпляр моделі лінійної регресії. Строго кажучи, LinearRegression() — це абстрактна сутність, математична модель, що описує лінійну залежність.

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

  • fit_intercept (по умолчанию=True) — этот параметр указывает, нужно ли оценивать пересечение (intercept) модели. Если он установлен в True, то модель будет включать в себя свободный член (пересечение) в уравнении линейной регрессии.
  • normalize (по умолчанию=False) — этот параметр управляет нормализацией признаков перед обучением модели. Если установлен в True, то признаки будут нормализованы перед обучением модели. Нормализация полезна, если признаки имеют разный масштаб.
  • n_jobs (по умолчанию=None) — этот параметр указывает количество ядер CPU, которые можно использовать для обучения модели. Если установлен в None, то будет использоваться одно ядро. Если вы укажете положительное число, то модель будет обучаться параллельно, что может ускорить процесс на многопроцессорных системах.
  • positive (за замовчуванням=False) — данный параметр позволяет настроить модель для выполнения регрессии с ограничением на положительные коэффициенты.
import numpy as np
from sklearn.linear_model import LinearRegression
# Создаем сгенерированные данные (в реальности данные должны быть загружены)
# Площадь домов в квадратных метрах
X_area = np.array([130, 150, 158, 175, 102, 144, 218, 228, 133, 158])
# Количество комнат в доме
X_rooms = np.array([3, 2, 3, 4, 2, 3, 4, 5, 3, 3])
# Цены на недвижимость
y = np.array([245000, 312000, 279000, 308000, 199000, 219000, 405000, 324000, 319000, 255000])
# Создаем объект модели линейной регрессии
model = LinearRegression()
# Обучаем модель на данных
# Объединяем два предиктора в одну матрицу
X = np.column_stack((X_area, X_rooms))
model.fit(X, y)
# Теперь модель обучена и может делать предсказания
# Давайте спрогнозируем цену для дома площадью 250 кв. метров и 8 комнатами
house_area = 250
house_rooms = 8
predicted_price = model.predict(np.array([[house_area, house_rooms]]))
print(f'Предсказанная цена для дома площадью {house_area} кв. метров и {house_rooms} комнатами: ${predicted_price[0]:.2f}')

Результат прогнозирования

Способы загрузки данных

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

Давайте рассмотрим несколько примеров загрузки данных в Python:

Загрузка данных из CSV-файла с использованием библиотеки pandas:

import pandas as pd
# Загрузка данных из CSV-файла
data = pd.read_csv('имя_файла.csv')

Загрузка данных из внешних источников, таких как API:

import requests
import pandas as pd
# Запрос данных с веб-API
response = requests.get('https://api.example.com/data')
data = pd.read_json(response.text)

Загрузка данных из Excel-файла с использованием библиотеки pandas:

import pandas as pd
# Загрузка данных из Excel-файла
data = pd.read_excel('имя_файла.xlsx')

Измерение ошибки в задачах регрессии

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

Среднеквадратичная ошибка

Наиболее популярной метрикой в задачах регрессии является среднеквадратичная ошибка (Mean Squared Error, MSE). MSE измеряет среднеквадратичное отклонение между фактическими значениями и предсказанными значениями модели. Большие ошибки делают больший вклад в эту метрику.

Модифицированным вариантом этой метрики является корень из средней квадратической ошибки (RMSE). Поскольку RMSE имеет ту же размерность, что и исходные данные, она лучше интерпретируема.

RMSE

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

Эта метрика особенно актуальна, когда нужно бороться с выбросами. RMSE штрафует большие ошибки (квадратично) сильнее, чем маленькие, и таким образом делает модель более чувствительной к выбросам.

Выбросы в данных

Выброс (outlier) — это значение в данных, которое существенно отличается от остальных значений в наборе данных. Выбросы могут быть как аномалиями (ошибками или аномальными событиями), так и реальными, но необычными значениями.

Пример выброса

Предположим, что у нас есть данные о зарплатах (Y) и опыте работы (X) для группы работников:

  • Опыт работы (годы): 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20
  • Зарплата (тыс. долларов): 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 150, 200

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

Очевидно, что следует применить методы обработки данных:

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

Заключение

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

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

Ещё статьи
Экспертки о том, как оценивают кандидатов на нетехнических интервью
Часть 2. Работа с записями: вставка, чтение, изменение и удаление