Поліноміальна регресія за допомогою scikit-learn


29

Я намагаюся використовувати scikit-learn для поліноміальної регресії. З того, що я читаю, поліноміальна регресія є особливим випадком лінійної регресії. Я сподівався, що, можливо, одна із узагальнених лінійних моделей scikit може бути параметризована для розміщення поліномів вищого порядку, але я не бачу варіанту для цього.

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

Чи пропускаю я щось очевидне тут?

Відповіді:


25

З огляду на дані , вектор стовпця та , цільовий вектор, ви можете виконати поліноміальну регресію, додавши поліноми . Наприклад, врахуйте, якщоxyx

x=[2113]

Використання саме цього вектора в лінійній регресії має на увазі модель:

y=α1x

Ми можемо додати стовпці, що є потужностями вектора вище, які представляють додавання поліномів до регресії. Нижче ми показуємо це для поліномів до потужності 3:

X=[24811113132133]

Це наша нова матриця даних, яку ми використовуємо в лінійній регресії sklearn, і вона представляє модель:

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

Зауважте, що я не додав постійний вектор , оскільки sklearn автоматично включить це.1


26

Теорія

Поліноміальна регресія - особливий випадок лінійної регресії. Основна ідея того, як ви вибираєте свої функції. Дивлячись на багатоваріантну регресію з двома змінними: 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 () є параметр "intera__only", і за замовчуванням це False. Але встановлення його на True відповідає зворотному тому, що я хочу: він зберігає ТОЛЬКІ умови взаємодії, а не зберігає x1 ^ 2, x2 ^ 2 тощо.
DenisFLASH

Посилання на youtube стверджує, що відео вже не існує. Чи є у вас якесь інше посилання на це?
Маркон

@Markon будь-яке відео з цього списку досить добре: youtube.com/results?search_query=curse+of+dimмерity
Сальвадор Далі

@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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.