Regressão polinomial usando o scikit-learn

29

Estou tentando usar o scikit-learn para regressão polinomial. Pelo que li, a regressão polinomial é um caso especial de regressão linear. Eu esperava que talvez um dos modelos lineares generalizados do scikit possa ser parametrizado para se ajustar a polinômios de ordem superior, mas não vejo opção para isso.

Consegui usar um Regressor de vetores de suporte com um kernel poli. Isso funcionou bem com um subconjunto dos meus dados, mas leva muito tempo para caber em conjuntos de dados maiores, por isso ainda preciso encontrar algo mais rápido (mesmo que esteja negociando alguma precisão).

Estou perdendo algo óbvio aqui?

Mihai Damian
fonte

Respostas:

25

Dados os dados , um vetor de coluna e y , o vetor de destino, você pode executar a regressão polinomial anexando polinômios de x . Por exemplo, considere sexyx

x=[2-113]

Usar apenas esse vetor na regressão linear implica o modelo:

y=α1x

Podemos adicionar colunas que são potências do vetor acima, que representam a adição de polinômios à regressão. Abaixo, mostramos isso para polinômios até a potência 3:

X=[248-11-113132133]

Esta é a nossa nova matriz de dados que usamos na regressão linear do sklearn e representa o modelo:

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

Note que eu não adicionei um vetor constante de 's, pois o sklearn o incluirá automaticamente.1

Cam.Davidson.Pilon
fonte
26

Teoria

A regressão polinomial é um caso especial de regressão linear. Com a idéia principal de como você seleciona seus recursos. Observando a regressão multivariada com 2 variáveis: x1e x2. A regressão linear ficará assim:y = a1 * x1 + a2 * x2.

Agora você deseja ter uma regressão polinomial (vamos fazer polinômio de 2 graus). Vamos criar algumas características adicionais: x1*x2, x1^2e x2^2. Portanto, obteremos sua 'regressão linear':

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

Isso mostra bem uma importante maldição conceitual da dimensionalidade , porque o número de novos recursos cresce muito mais rápido do que linearmente com o crescimento do grau de polinômio. Você pode dar uma olhada neste conceito aqui .

Pratique com o scikit-learn

Você não precisa fazer tudo isso no scikit. A regressão polinomial já está disponível lá (na versão 0.15 . Veja como atualizá-la aqui ).

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í
fonte
1
E se eu não quiser ter termos de interação como x1 * x2, preciso construir o X_ manualmente? existe um parâmetro "transaction_only" no construtor PolynomialFeatures () e, por padrão, é False. Mas defini-lo como True faz o oposto do que eu quero: ele mantém apenas os termos de interação, e não manter x1 ^ 2, x2 ^ 2, etc.
DenisFLASH
O link para o youtube afirma que o vídeo não existe mais. Você tem algum outro link para isso?
Markon 10/10/16
@Markon qualquer vídeo a partir desta lista é bom o suficiente: youtube.com/results?search_query=curse+of+dimensionality
Salvador Dali
@SalvadorDali é para isso que serve a redução de dimensionalidade
#
Gostaria de saber se devemos centralizar os dados antes ou depois da aplicação PolynomialFeatures?
Renakre 5/05
2

Caso você esteja usando uma regressão multivariada e não apenas uma regressão univariada, não esqueça os termos cruzados. Por exemplo, se você tem duas variáveis e x 2 e deseja polinômios com potência 2, você deve usar y = a 1 x 1 + a 2 x 2 + a 3 x 2 1 +x1x2y=uma1x1+uma2x2+uma3x12+uma4x22+uma5x1x2uma5x1x2) é sobre o que estou falando.

Vermeer Grange
fonte