Makine Öğrenmesi (9/10)

tarafından Emin Fidan
0 yorum 271 görüntüleyenler

Polinom Regresyonu

Veri noktalarınız açıkça doğrusal bir regresyona (tüm veri noktalarında düz bir çizgi) uymayacaksa, polinom regresyonu için ideal olabilir.

 

Polinom regresyonu, lineer regresyon gibi, veri noktalarından bir çizgi çizmenin en iyi yolunu bulmak için x ve y değişkenleri arasındaki ilişkiyi kullanır.

Nasıl Çalışır?

Python’un veri noktaları arasında bir ilişki bulma ve bir dizi polinom regresyonu çizme yöntemleri vardır. Matematik formülünden geçmek yerine bu yöntemleri nasıl kullanacağınızı göstereceğiz.

Aşağıdaki örnekte, belirli bir gişeden geçerken 18 aracı kaydettik.Aracın hızını ve geçtiği saati kaydettik

x ekseni günün saatlerini ve y ekseni hızı temsil eder:

Örnek  :

Bir dağılım grafiği çizerek başlayalım:

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()

Sonuç :

Örnek :
Numpy ve matplotlib'i import edelim ve sonra Polinom Regresyonu çizgisini çizelim:
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()
Sonuç :

Örnek Açıklaması 
İhtiyacımız olan modülleri import edelim :
import numpy
import matplotlib.pyplot as plt
X ve y ekseninindeğerlerinitemsiledendizileroluşturun:
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'nin bir polinom modeli oluşturmamızı sağlayan bir yöntemi vardır:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Ardından çizginin nasıl görüntüleneceğini belirtelim, 1. pozisyondan başlıyoruz ve 22. pozisyonda bitiriyoruz:
myline = numpy.linspace(1, 22, 100)

Orijinal dağılım grafiğini çizelim:
plt.scatter(x, y)
Polinom regresyon çizgisini çizelim:
plt.plot(myline, mymodel(myline))
Diyagramı görüntüleyelim:
plt.show()

R-Kare:

X ve y ekseninin değerleri arasındaki ilişkinin ne kadar iyi olduğunu bilmek önemlidir, eğer bir ilişki yoksa polinom regresyonu hiçbir şeyi tahmin etmek için kullanılamaz. 
İlişki, r-kare adı verilen bir değerle ölçülür. 
R kare değeri 0 ile 1 arasında değişmektedir, burada 0 ilişki yoktur ve 1%100 ilişkilidir anlamındadır.

Python ve Sklearn modülü sizin için bu değeri hesaplayacak, tek yapmanız gereken x ve y dizilerini vermek:

Örnek: 
Verilerim polinom regresyonuna ne kadar uyuyor?
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)))

Çıktı :0.9432150416451027

Not: Sonuç 0.94, çok iyi bir ilişki olduğunu gösterir ve gelecekteki tahminlerde polinom regresyonunu kullanabiliriz.

Gelecekteki Değerleri Tahmin Etme:
Şimdi topladığımız bilgileri gelecekteki değerleri tahmin etmek için kullanabiliriz.
Örnek:Gişelerden 17: 00'da geçen bir arabanın hızını tahmin etmeye çalışalım:
Bunu yapmak için yukarıdaki örnekte aynı mymodel dizisine ihtiyacımız var:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Örnek:17: 00'da geçen bir arabanın hızını tahmin edelim:
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)
Çıktı :88.87331269697987

Örnek, bir hızın 88.87 olduğunu tahmin etti ve bu da şemadan da okunabiliyordu:

Kötü Uyum ?
Polinom regresyonunun gelecekteki değerleri tahmin etmek için en iyi yöntem olmayacağı bir örnek oluşturalım.
Örnek :
x ve y ekseni için bu değerler, polinom regresyonuna çok kötü uyum sağlamalıdır:
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()

Ve r-kare değeri ?
Örnek :
Çok düşük bir r kare değeri almalıyız.
 
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)))
Çıktı :0.009952707566680652
Sonuç: 0.00995 çok kötü bir ilişki olduğunu gösterir ve bu veri setinin polinom regresyonu için uygun olmadığını gösterir.
- Burak Can Görgülü

Beğeneceğinizi düşündüğümüz yazılar