4 отдельных метода машинного обучения для регрессионной модели — пример исследования: прогноз совместного использования велосипедов

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

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

Линейная регрессия

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

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

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

Вот некоторые преимущества использования линейной регрессии:

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

Вот некоторые недостатки использования линейной регрессии:

  • Он может моделировать только линейные отношения.
  • Он может быть чувствителен к выбросам.

КНН Регрессор

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

Значение k — это гиперпараметр, который должен выбрать пользователь. Значение k может повлиять на точность регрессора KNN. Большее значение k сделает регрессор более устойчивым к шуму, но также может сделать регрессор менее точным. Меньшее значение k сделает регрессор более точным, но он также может быть более чувствительным к шуму.

Вот некоторые преимущества использования регрессоров KNN:

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

Вот некоторые недостатки использования регрессоров KNN:

  • Они могут быть дорогостоящими в вычислительном отношении, особенно для больших наборов данных.
  • Они могут быть чувствительны к шуму.

Регрессор дерева решений

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

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

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

Вот некоторые преимущества использования регрессоров дерева решений:

  • Их относительно легко понять и интерпретировать.
  • Их можно использовать для решения различных задач регрессии.
  • Они не чувствительны к переоснащению.

Вот некоторые недостатки использования регрессоров дерева решений:

  • Их обучение на больших наборах данных может оказаться дорогостоящим в вычислительном отношении.

Регрессор СВМ

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

Гиперплоскость — это линия или плоскость, которая делит данные на две области, причем каждая область содержит все точки данных, попадающие в определенные пределы гиперплоскости. Регрессор SVM находит гиперплоскость с максимальным запасом, что означает, что она находится дальше всего от любой точки данных.

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

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

Вот некоторые преимущества использования регрессоров SVM:

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

Вот некоторые недостатки использования регрессоров SVM:

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

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

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

Загрузите данные

Данные представляют собой ежедневное количество взятых напрокат велосипедов в период с 2011 по 2012 год в системе велопроката Capital с соответствующей информацией о погоде и сезоне. Здесь — источник данных.

# Importing libraries
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# Import the data
bike = pd.read_csv("day.csv")
bike.head(5)

Проверка данных

df.info()
bike.describe(include='all').T

Данные состоят из 731 записи с 16 столбцами без нулевых значений. Информация в столбцах:

  • мгновенно: индекс записи
  • день: дата
  • сезон: сезон (1: зима, 2: весна, 3: лето, 4: осень)
  • год: год (0: 2011, 1:2012)
  • mnth: месяц (от 1 до 12)
  • час: час (от 0 до 23)
  • праздник: является ли этот день выходным или нет (извлечено из http://dchr.dc.gov/page/holiday-schedule)
  • будний день: день недели
  • рабочий день: если день не является ни выходным, ни праздничным, значение равно 1, в противном случае — 0.
  • погода: 1: Ясно, Мало облаков, Небольшая облачность, Небольшая облачность — 2: Туман + Облачно, Туман + Небольшие облака, Туман + Мало облаков, Туман — 3: Небольшой снег, Небольшой дождь + Гроза + Рассеянные облака, Небольшой дождь + Рассеянный облака — 4: Сильный дождь + Ледяные покровы + Гроза + Туман, Снег + Туман
  • temp: Нормализованная температура в градусах Цельсия.
  • atemp: Нормализованное ощущение температуры в градусах Цельсия.
  • гул: Нормализованная влажность. Значения разделены на 100 (макс.) — скорость ветра: нормированная скорость ветра. Значения разделены на 67 (макс.)
  • случайный: количество случайных пользователей
  • зарегистрировано: количество зарегистрированных пользователей
  • cnt: общее количество арендованных велосипедов, включая как повседневные, так и зарегистрированные.
# Check missing data
round((bike.isnull().sum())/len(bike),2)

# Check duplicate data
bike[bike.duplicated()]

Нет пропущенных значений или дублированных данных. Данные очищены, поэтому мы переходим к предварительной обработке.

Предварительная обработка

# Importing liberaries for preprocessing
from sklearn.preprocessing import RobustScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

scale_cols = bike.select_dtypes(include=['float64']).columns.to_list()

preprocessing = ColumnTransformer(
    transformers=[
        ('scaling', RobustScaler(), scale_cols)
    ]
)

Столбцы имеют числовые значения, есть только один столбец «дата» — это объект, но мы не используем его для моделирования, поэтому предварительная обработка — это только масштабирование данных.

Моделирование

Модели взяты из библиотеки scikit-learn, оценивать модели мы будем с помощью перекрестной проверки. Используемая матрица представляет собой среднеквадратичную ошибку.

# Import library for model processing
from sklearn.model_selection import train_test_split, KFold, cross_val_score, cross_validate
from tqdm import tqdm

# Import library for tranformed data's features
from sklearn.compose import TransformedTargetRegressor
import numpy as np

# Models
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR

# Define x and y values
x = bike.drop(["instant","dteday","casual","registered"], axis=1)
y = bike["cnt"]

# Split data to Train and Test data
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=24)

# The models
models = [
    LinearRegression(),
    KNeighborsRegressor(),
    DecisionTreeRegressor(),
    SVR()
]

# List for score matrix
rmse_score = []
rmse_mean = []
rmse_std = []

r2_score = []
r2_mean = []
r2_std = []

# Calculate model's matrix score
for model in tqdm(models):
    
    # Cross validate split
    crossval = KFold(n_splits=5, shuffle=True, random_state=24)

    # Create pipeline for presprocessing and model
    estimator = Pipeline([
        ('preprocessing', preprocessing),
        ('model', model)
    ])

    # Calculate the accuracy from cross validation
    scores = cross_val_score(
        estimator, 
        X_train, 
        y_train, 
        cv=crossval, 
        scoring='neg_root_mean_squared_error', 
        error_score='raise'
        )

    # rms scrore
    rmse_mean.append(round(scores.mean(),2))
    rmse_std.append(round(scores.std(),2))
    
#     # r2 score
#     r2_mean.append(scores['test_r2'].mean())
#     r2_std.append(scores['test_r2'].std())
    
# Model Matrix Evaluation
model_matrix = pd.DataFrame({
    'Model': ['LinearReg', 'KNNReg',  'DecisionTreeReg', 'SVR'],
    'RMSE_Mean': rmse_mean,
    'RMSE_Std': rmse_std,
#     'r2_Mean': r2_mean,
#     'r2_Std': r2_std
})
model_matrix.sort_values(by='RMSE_Mean', ascending=False)

Результат показывает, что KNN-регрессор имеет наименьшую ошибку, за ним следуют линейная регрессия, дерево решений и машина опорных векторов. Однако эта ошибка все еще слишком велика, поэтому настройка гиперпараметра все равно необходима. Дело в том, что в случае проблемы регрессии мы можем сравнивать эти модели, чтобы получить модель, которая лучше всего соответствует задаче, или мы можем использовать эти модели для создания более сложной модели, например ансамблевой модели. Спасибо.