Полиномиальная регрессия с использованием scikit-learn

29

Я пытаюсь использовать scikit-learn для полиномиальной регрессии. Из того, что я прочитал, полиномиальная регрессия является частным случаем линейной регрессии. Я прыгал, что, возможно, одна из обобщенных линейных моделей Scikit может быть параметризована для соответствия полиномам более высокого порядка, но я не вижу возможности сделать это.

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

Я что-то упускаю здесь очевидное?

Михай Дамиан
источник

Ответы:

25

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

x=[2113]

Использование только этого вектора в линейной регрессии подразумевает модель:

y=α1x

Мы можем добавить столбцы, которые являются степенями вектора выше, которые представляют добавление полиномов к регрессии. Ниже мы покажем это для полиномов до степени 3:

X=[24811113132133]

Это наша новая матрица данных, которую мы используем в линейной регрессии Склеарна, и она представляет модель:

y=α1x+α2x2+α3x3

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

Cam.Davidson.Pilon
источник
26

теория

Полиномиальная регрессия является частным случаем линейной регрессии. С основной идеей, как вы выбираете свои функции. Рассматривая многомерную регрессию с 2 переменными: x1и x2. Линейная регрессия будет выглядеть так:y = a1 * x1 + a2 * x2.

Теперь вы хотите иметь полиномиальную регрессию (давайте сделаем полином 2 степени). Мы создадим несколько дополнительных функций: x1*x2, x1^2и x2^2. Итак, мы получим вашу «линейную регрессию»:

y = a1 * x1 + a2 * x2 + a3 * x1*x2 + a4 * x1^2 + a5 * x2^2

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

Практикуйтесь с scikit-learn

Вам не нужно делать все это в scikit. Полиномиальная регрессия уже доступна там (в версии 0.15 . Проверьте, как ее обновить здесь ).

from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

X = [[0.44, 0.68], [0.99, 0.23]]
vector = [109.85, 155.72]
predict= [[0.49, 0.18]]
#Edit: added second square bracket above to fix the ValueError problem

poly = PolynomialFeatures(degree=2)
X_ = poly.fit_transform(X)
predict_ = poly.fit_transform(predict)

clf = linear_model.LinearRegression()
clf.fit(X_, vector)
print clf.predict(predict_)
Сальвадор Дали
источник
1
Что если я не хочу, чтобы условия взаимодействия были такими, как x1 * x2, нужно ли создавать X_ вручную? в конструкторе PolynomialFeatures () есть параметр "Interaction_only", и по умолчанию это False. Но установка в True делает противоположность того, что я хочу: он сохраняет ТОЛЬКО условия взаимодействия и не сохраняет x1 ^ 2, x2 ^ 2 и т. Д.
DenisFLASH
Ссылка на YouTube утверждает, что видео больше не существует. У вас есть другая ссылка на это?
Маркон
@Markon любое видео из этого списка достаточно хорошо: youtube.com/results?search_query=curse+of+dimensionality
Сальвадор Дали
@SalvadorDali это то, для чего сокращение размерности
user3916597
Интересно, должны ли мы центрировать данные до или после подачи заявления PolynomialFeatures?
Renakre
2

Если вы используете многомерную регрессию, а не просто одномерную регрессию, не забывайте о перекрестных терминах. Например, если у вас есть две переменные и , и вы хотите, чтобы полиномы были до степени 2, вы должны использовать где последний член ( ) - это тот, который я имею говоря о.x 2 y = a 1 x 1 + a 2 x 2 + a 3 x 2 1 + a 4 x 2 2 + a 5 x 1 x 2 a 5 x 1 x 2x1x2y=a1x1+a2x2+a3x12+a4x22+a5x1x2a5x1x2

Vermeer Grange
источник