Regresi polinomial menggunakan scikit-learning

29

Saya mencoba menggunakan scikit-learning untuk regresi polinomial. Dari apa yang saya baca regresi polinomial adalah kasus khusus dari regresi linier. Saya berharap bahwa mungkin salah satu model linear umum scikit dapat diparameterisasi agar sesuai dengan polinomial berurutan lebih tinggi tetapi saya tidak melihat opsi untuk melakukan itu.

Saya berhasil menggunakan Support Vector Regressor dengan kernel poli. Itu bekerja dengan baik dengan subset dari data saya, tetapi butuh banyak waktu untuk menyesuaikan set data yang lebih besar jadi saya masih perlu menemukan sesuatu yang lebih cepat (bahkan jika memperdagangkan beberapa presisi).

Apakah saya melewatkan sesuatu yang jelas di sini?

Damian Mihai
sumber

Jawaban:

25

Diberikan data , vektor kolom, dan y , vektor target, Anda dapat melakukan regresi polinomial dengan menambahkan polinomial x . Sebagai contoh, pertimbangkan jikaxyx

x=[2113]

Hanya menggunakan vektor ini dalam regresi linier menyiratkan model:

y=α1x

Kita dapat menambahkan kolom yang merupakan kekuatan dari vektor di atas, yang mewakili penambahan polinomial ke regresi. Di bawah ini kami tunjukkan ini untuk polinomial hingga daya 3:

X=[24811113132133]

Ini adalah matriks data baru kami yang kami gunakan dalam regresi linier sklearn, dan ini mewakili model:

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

Perhatikan bahwa saya tidak menambahkan vektor konstan , karena sklearn akan secara otomatis memasukkan ini.1

Cam.Davidson.Pilon
sumber
26

Teori

Regresi polinomial adalah kasus khusus dari regresi linier. Dengan ide utama bagaimana Anda memilih fitur Anda. Melihat regresi multivariat dengan 2 variabel: x1dan x2. Regresi linier akan terlihat seperti ini:y = a1 * x1 + a2 * x2.

Sekarang Anda ingin memiliki regresi polinomial (mari kita membuat polinomial 2 derajat). Kami akan membuat beberapa fitur tambahan: x1*x2, x1^2dan x2^2. Jadi kami akan mendapatkan 'regresi linier' Anda:

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

Ini dengan baik menunjukkan kutukan konsep dimensi yang penting , karena jumlah fitur baru tumbuh jauh lebih cepat daripada linear dengan pertumbuhan derajat polinomial. Anda dapat melihat konsep ini di sini .

Berlatih dengan scikit-belajar

Anda tidak perlu melakukan semua ini di scikit. Regresi polinom sudah tersedia di sana (dalam versi 0.15 . Periksa cara memperbaruinya di sini ).

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
sumber
1
Bagaimana jika saya tidak ingin memiliki istilah interaksi sebagai x1 * x2, apakah saya harus membuat X_ secara manual? ada parameter "interaksi_hanya" di konstruktor PolynomialFeatures (), dan secara default False. Tetapi menyetelnya ke True membuat kebalikan dari yang saya inginkan: HANYA membuat istilah interaksi tetap, dan tidak menyimpan x1 ^ 2, x2 ^ 2, dll.
DenisFLASH
Tautan ke youtube mengklaim bahwa video tidak ada lagi. Apakah Anda memiliki tautan lain ke sana?
Markon
@Markon semua video dari daftar ini cukup baik: youtube.com/result?search_query=curse+of+dimensionality
Salvador Dali
@SalvadorDali untuk itulah pengurangan dimensionalitas dilakukan
user3916597
Saya ingin tahu apakah kita harus memusatkan data sebelum atau setelah mendaftar PolynomialFeatures?
renakre
2

Jika Anda menggunakan regresi multivariat dan bukan hanya regresi univariat, jangan lupakan persyaratan silang. Misalnya jika Anda memiliki dua variabelx1 dan x2, dan Anda ingin polinomial hingga daya 2, Anda harus menggunakan y=Sebuah1x1+Sebuah2x2+Sebuah3x12+Sebuah4x22+Sebuah5x1x2 dimana istilah terakhir (Sebuah5x1x2) adalah yang saya bicarakan.

Vermeer Grange
sumber