Regresión polinómica usando scikit-learn

29

Estoy tratando de usar scikit-learn para la regresión polinómica. Por lo que leí, la regresión polinómica es un caso especial de regresión lineal. Esperaba que tal vez uno de los modelos lineales generalizados de scikit pueda parametrizarse para ajustarse a polinomios de orden superior, pero no veo ninguna opción para hacerlo.

Logré usar un regresor de vectores de soporte con un núcleo de polietileno. Eso funcionó bien con un subconjunto de mis datos, pero lleva mucho tiempo ajustar conjuntos de datos más grandes, por lo que aún necesito encontrar algo más rápido (incluso si se opera con cierta precisión).

¿Me estoy perdiendo algo obvio aquí?

Mihai Damian
fuente

Respuestas:

25

Con los datos , un vector de columna, y , el vector de destino, puede realizar una regresión polinómica agregando polinomios de . Por ejemplo, considere sixyx

x=[2113]

Usar solo este vector en regresión lineal implica el modelo:

y=α1x

Podemos agregar columnas que son potencias del vector anterior, que representan agregar polinomios a la regresión. A continuación mostramos esto para polinomios hasta la potencia 3:

X=[24811113132133]

Esta es nuestra nueva matriz de datos que usamos en la regresión lineal de sklearn, y representa el modelo:

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

Tenga en cuenta que no agregué un vector constante de 's, ya que sklearn lo incluirá automáticamente.1

Cam.Davidson.Pilon
fuente
26

Teoría

La regresión polinómica es un caso especial de regresión lineal. Con la idea principal de cómo seleccionar sus características. Mirando la regresión multivariada con 2 variables: x1y x2. La regresión lineal se verá así:y = a1 * x1 + a2 * x2.

Ahora desea tener una regresión polinómica (hagamos un polinomio de 2 grados). Vamos a crear una serie de características adicionales: x1*x2, x1^2y x2^2. Entonces obtendremos su 'regresión lineal':

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

Esto muestra muy bien una importante maldición conceptual de dimensionalidad , porque el número de nuevas características crece mucho más rápido que linealmente con el crecimiento del grado de polinomio. Puedes echar un vistazo a este concepto aquí .

Practica con scikit-learn

No necesita hacer todo esto en scikit. La regresión polinómica ya está disponible allí (en la versión 0.15 . Consulte cómo actualizarla aquí ).

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 Dalí
fuente
1
¿Qué sucede si no quiero tener términos de interacción como x1 * x2, tengo que construir X_ manualmente? hay un parámetro "interacción_solo" en el constructor PolynomialFeatures (), y por defecto es False. Pero el establecimiento en True hace lo contrario de lo que quiero: se mantiene sólo los términos de interacción, y no mantienen x1 ^ 2, x2 ^ 2, etc
DenisFLASH
El enlace a YouTube afirma que el video ya no existe. ¿Tienes algún otro enlace a eso?
Markon
@Markon cualquier video de esta lista es lo suficientemente bueno: youtube.com/results?search_query=curse+of+dimensionality
Salvador Dali
@SalvadorDali para eso está la reducción de dimensionalidad
user3916597
Me pregunto si deberíamos centrar los datos antes o después de la solicitud PolynomialFeatures.
renakre
2

En caso de que esté utilizando una regresión multivariada y no solo una regresión univariada, no olvide los términos cruzados. Por ejemplo, si tiene dos variables y , y desea polinomios hasta la potencia 2, debe usar donde el último término ( ) es el que soy hablando sobre.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
fuente