Как использовать SVM для решения задач регрессии

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

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

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

Фактически, SVM могут довольно эффективно обрабатывать регрессионное моделирование. Возьмем, к примеру, бронирование гостиниц.

Прогнозирование средних дневных ставок для клиентов отелей

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

  • Отмена (независимо от того, отменяет ли клиент свое бронирование или нет)
  • Страна происхождения
  • Сегмент рынка
  • Тип депозита
  • Тип клиента
  • Требуемые парковочные места
  • Неделя прибытия

Обратите внимание, что значения ADR также заполняются для клиентов, которые отменили заказ - переменная ответа в этом случае отражает ADR, который был бы оплачен, если бы клиент продолжил бронирование.

Оригинальное исследование Антонио, Алмейды и Нуньеса (2016) доступно в разделе «Ссылки» ниже.

Построение модели

Используя описанные выше функции, модель SVM обучается и проверяется на обучающем наборе (H1), при этом прогнозы сравниваются с фактическими значениями ADR для набора тестов (H2).

Модель обучается следующим образом:

>>> from sklearn.svm import LinearSVR
>>> svm_reg = LinearSVR(epsilon=1.5)
>>> svm_reg.fit(X_train, y_train)
LinearSVR(C=1.0, dual=True, epsilon=1.5, fit_intercept=True,
          intercept_scaling=1.0, loss='epsilon_insensitive', max_iter=1000,
          random_state=None, tol=0.0001, verbose=0)
>>> predictions = svm_reg.predict(X_val)
>>> predictions
array([100.75090575, 109.08222631,  79.81544167, ...,  94.50700112,
        55.65495607,  65.5248653 ])

Теперь та же модель используется для функций в тестовом наборе для генерации прогнозируемых значений ADR:

bpred = svm_reg.predict(atest)
bpred

Давайте сравним прогнозируемую ADR с фактической ADR на основе средней абсолютной ошибки (MAE) и среднеквадратичной ошибки (RMSE).

>>> mean_absolute_error(btest, bpred)
29.50931462735928
>>> print('mse (sklearn): ', mean_squared_error(btest,bpred))
>>> math.sqrt(mean_squared_error(btest, bpred))
44.60420935095296

Обратите внимание, что чувствительность SVM к дополнительным обучающим экземплярам задается параметром epsilon (ϵ), то есть чем выше параметр, тем большее влияние дополнительные обучающие экземпляры оказывают на результаты модели.

В этом случае использовалось большое поле 1,5. Вот производительность модели при использовании запаса 0,5.

>>> mean_absolute_error(btest, bpred)
29.622491512816826
>>> print('mse (sklearn): ', mean_squared_error(btest,bpred))
>>> math.sqrt(mean_squared_error(btest, bpred))
44.7963000500928

Мы видим, что практически не было изменений в параметрах MAE или RMSE путем изменения параметра ϵ.

Тем не менее, мы хотим убедиться, что модель SVM не переоснащается. В частности, если мы обнаружим, что наилучшее соответствие достигается, когда ϵ = 0,, то это может быть признаком переобучения модели.

Вот результаты, когда мы полагаем ϵ = 0.

  • MAE: 31,86
  • RMSE: 47,65

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

Как производительность SVM сравнивается с нейронной сетью?

При использовании тех же функций, как точность производительности SVM сравнивается с точностью нейронной сети?

Рассмотрим следующую конфигурацию нейронной сети:

>>> model = Sequential()
>>> model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='elu'))
>>> model.add(Dense(1669, activation='elu'))
>>> model.add(Dense(1, activation='linear'))
>>> model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 8)                 72        
_________________________________________________________________
dense_1 (Dense)              (None, 1669)              15021     
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 1670      
=================================================================
Total params: 16,763
Trainable params: 16,763
Non-trainable params: 0
_________________________________________________________________

Модель обучается в течение 30 эпох с размером пакета 150:

>>> model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
>>> history=model.fit(X_train, y_train, epochs=30, batch_size=150,  verbose=1, validation_split=0.2)
>>> predictions = model.predict(X_test)

На испытательном наборе получены следующие значения MAE и RMSE:

  • MAE: 29,89
  • RMSE: 43,91

Мы заметили, что когда ϵ был установлен на 1,5 для модели SVM, MAE и RMSE были равны 29,5 и 44,6 соответственно. В этом отношении SVM соответствует нейронной сети по точности прогнозирования на тестовом наборе.

Вывод

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

Однако в этом примере мы видели, что модель SVM оказалась достаточно эффективной при прогнозировании значений ADR для нейронной сети.

Большое спасибо за чтение, и любые вопросы или отзывы приветствуются.

Блокнот Jupyter и набор данных для этого примера доступны в репозитории MGCodesandStats GitHub. Другие соответствующие ссылки доступны ниже.

Заявление об ограничении ответственности: эта статья написана на условиях «как есть» без каких-либо гарантий. Он был написан с целью предоставить обзор концепций науки о данных и никоим образом не должен интерпретироваться как профессиональный совет.

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