Belajar Mesin - Regresi Polinomial

Regresi Polinomial (Polynomial Regression)

Jika titik data Anda jelasnya tidak cocok untuk regresi linear (garis yang melintasi titik data), maka regresi polinomial mungkin pilihan yang ideal.

Seperti regresi linier, regresi polinomial menggunakan hubungan antara variabel x dan y untuk menemukan cara terbaik untuk menggambar garis diantara titik data.


Prinsip kerja

Python memiliki beberapa metode untuk menemukan hubungan antara titik data dan menggambar garis regresi polinomial. Kita akan menunjukkan bagaimana menggunakan metode ini daripada melalui formula matematika.

Dalam contoh di bawah ini, kami mendaftarkan 18 kendaraan yang melalui persimpangan tarif khusus.

Kami telah merekam kecepatan kendaraan dan waktu lulus (jam).

Sumbu x menunjukkan jam dalam sehari, sumbu y menunjukkan kecepatan:

Contoh

Pertama, gambar grafik titik:

import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()

Hasil:


Jalankan Contoh

Contoh

impor numpy dan matplotlibdan kemudian gambar garis regresi polinomial:

import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Hasil:


Jalankan Contoh

Pengertian contoh

Impor modul yang dibutuhkan:

import numpy
import matplotlib.pyplot as plt

Buat array yang merepresentasikan nilai sumbu x dan sumbu y:

x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]

NumPy memiliki cara untuk membangun model polinomial:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Lalu tentukan cara tampilan baris, mulai dari posisi 1 sampai posisi 22:

myline = numpy.linspace(1, 22, 100)

Gambar grafik titik asli:

plt.scatter(x, y)

Gambar garis regresi polinomial:

plt.plot(myline, mymodel(myline))

Tampilkan grafik:

plt.show()

R-Squared

penting untuk mengetahui bagaimana hubungan antara nilai sumbu x dan sumbu y berapa baik, jika tidak ada hubungan, regresi polinomial tidak dapat digunakan untuk memprediksi apapun.

Hubungan ini diukur dengan nilai yang disebut r-squared (r-kuat).

Jangkauan nilai r-squared adalah 0 sampai 1, di mana 0 menunjukkan hubungan yang tak relevan, sementara 1 menunjukkan hubungan 100% relevan.

Python dan modul Sklearn akan menghitung nilai untuk Anda, yang Anda lakukan adalah memasukkan array x dan y:

Contoh

Bagaimana kesadaran data saya dalam regresi polinomial?

import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Jalankan Contoh

Keterangan:Hasil 0.94 menunjukkan adanya hubungan yang bagus, dan kita dapat menggunakan regresi polinomial dalam prediksi mendatang.

Prediksi nilai masa mendatang

Sekarang, kita dapat menggunakan informasi yang telah dikumpulkan untuk memprediksi nilai masa mendatang.

Contohnya: mari kita coba memprediksi kecepatan kendaraan yang melalui persimpangan tarif di pukul 17 sore:

Untuk hal ini, kami memerlukan yang sama seperti contoh di atas mymodel Array:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Contoh

Prediksi kecepatan kendaraan di pukul 17 sore:

import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)

Jalankan Contoh

Kecepatan prediksi adalah 88.87, dan kita juga dapat melihatnya di gambar:


Kesadaran yang buruk?

Kami akan membuat contoh dimana regresi polinomial bukan metode terbaik untuk memprediksi nilai masa mendatang.

Contoh

Nilai untuk sumbu x dan y ini akan menyebabkan kinerja regresi polinomial sangat buruk:

import numpy
import matplotlib.pyplot as plt
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Hasil:


Jalankan Contoh

Nilai r-squared bagaimana?

Contoh

Anda seharusnya mendapatkan nilai r-squared yang sangat rendah.

import numpy
from sklearn.metrics import r2_score
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Jalankan Contoh

Hasil: 0.00995 menunjukkan hubungan yang buruk, dan mengatakan bahwa dataset ini tidak cocok untuk regresi polinomial.