Regresja wielomianowa za pomocą scikit-learn

29

Próbuję użyć scikit-learn do regresji wielomianowej. Z tego, co czytam, regresja wielomianowa jest szczególnym przypadkiem regresji liniowej. Miałem nadzieję, że może jeden z uogólnionych modeli liniowych scikit może zostać sparametryzowany, aby pasował do wielomianów wyższego rzędu, ale nie widzę takiej możliwości.

Udało mi się użyć Support Vector Regressor z wielordzeniowym jądrem. Działa to dobrze z podzbiorem moich danych, ale dopasowanie dużych zestawów danych zajmuje dużo czasu, więc nadal muszę znaleźć coś szybciej (nawet jeśli handluję z pewną precyzją).

Czy brakuje mi czegoś oczywistego?

Mihai Damian
źródło

Odpowiedzi:

25

Biorąc pod uwagę dane , wektor kolumny i , wektor docelowy, możesz wykonać regresję wielomianową, dołączając wielomiany z . Na przykład zastanów się, czyxyx

x=[2)-113)]

Zastosowanie tylko tego wektora w regresji liniowej implikuje model:

y=α1x

Możemy dodać kolumny, które są potęgami wektora powyżej, które reprezentują dodawanie wielomianów do regresji. Poniżej pokazujemy to dla wielomianów do potęgi 3:

X=[2)48-11-113)13)2)13)3)]

To jest nasza nowa macierz danych, której używamy w regresji liniowej Sklearn, i reprezentuje ona model:

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

Zauważ, że nie dodałem stałego wektora , ponieważ sklearn automatycznie to uwzględni.1

Cam.Davidson.Pilon
źródło
26

Teoria

Regresja wielomianowa jest szczególnym przypadkiem regresji liniowej. Z myślą główną o tym, jak wybrać swoje funkcje. Patrząc na regresję wielowymiarową z 2 zmiennymi: x1i x2. Regresja liniowa będzie wyglądać następująco:y = a1 * x1 + a2 * x2.

Teraz chcesz mieć regresję wielomianową (zróbmy wielomian 2 stopnie). Stworzymy kilka dodatkowych funkcji: x1*x2, x1^2i x2^2. Otrzymamy więc twoją „regresję liniową”:

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

To ładnie pokazuje ważną koncepcję przekleństwa wymiarowości , ponieważ liczba nowych funkcji rośnie znacznie szybciej niż liniowo wraz ze wzrostem stopnia wielomianu. Tutaj możesz zapoznać się z tą koncepcją .

Ćwicz z scikit-learn

Nie musisz robić tego wszystkiego w scikit. Regresja wielomianowa jest już tam dostępna (w wersji 0.15 . Sprawdź, jak ją zaktualizować tutaj ).

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_)
Salvador Dali
źródło
1
Co jeśli nie chcę mieć warunków interakcji jako x1 * x2, czy muszę ręcznie konstruować X_? w konstruktorze PolynomialFeatures () jest parametr „interact_only” i domyślnie jest to False. Ale ustawienie wartości True powoduje odwrotność tego, czego chcę: zachowuje TYLKO warunki interakcji i nie utrzymuje x1 ^ 2, x2 ^ 2 itd.
DenisFLASH,
Link do youtube twierdzi, że wideo już nie istnieje. Czy masz jakiś inny link do tego?
Markon
@ Markon każdy film z tej listy jest wystarczająco dobry: youtube.com/results?search_query=curse+of+dimensionality
Salvador Dali
@SalvadorDali, do czego służy redukcja wymiarowości
użytkownik3916597
Zastanawiam się, czy powinniśmy wyśrodkować dane przed czy po złożeniu wniosku PolynomialFeatures?
renakre
2

x1x2)y=za1x1+za2)x2)+za3)x12)+za4x2)2)+za5x1x2)za5x1x2)) to ten, o którym mówię.

Vermeer Grange
źródło