Ana içeriğe geç

Orta13 dk

Polinom regresyon

Önkoşul:Regresyon başarı metrikleri

Kanca

Şimdiye kadarki evlerde fiyat, metrekareyle DÜZ bir çizgi halinde arttı. Ama gerçekte lüks segmentte fiyat artışı hızlanır — 200 metrekarelik bir ev, 100 metrekarelik iki evden daha pahalı olabilir. Doğrusal regresyon bu eğriliği hiç yakalayamıyorsa, elimizdeki tek araç “doğru çizmek” mi kalıyor?

Sezgi

Polinom regresyon, aslında hâlâ doğrusal regresyondur — sadece özniteliklere yeni bir tanesini, metrekarenin KARESİNİ, ekliyoruz. Model artık fiyat = b + m1×metrekare + m2×metrekare² formunda; bu hâlâ katsayılara göre doğrusal bir denklem (4. derste gördüğümüz çoklu regresyonun özel bir hali), ama x-y grafiğinde bir EĞRİ çizer.

Doğal bir soru akla gelir: “Kareyi eklemek işe yarıyorsa, küpü, dördüncü kuvveti, on beşinciyi de eklesem daha mı iyi olur?” Bu dersin can alıcı noktası tam burada — hayır, ve nedenini gerçek sayılarla göreceğiz.

Mekanizma

Önce eğrisel bir ilişkiyle üretilmiş veriye bakalım:

Eğrisel veri

# Gerçek ilişki doğrusal DEĞİL: bir eşik metrekareden sonra fiyat artışı hızlanıyor (lüks segment etkisi)
n = 40
metrekare = 40 + rng.random(n) * 160
fiyat = 3 + 0.01 * metrekare + 0.0006 * metrekare**2 + rng.normal(0, 1.0, size=n)

X = metrekare.reshape(-1, 1)
print(f"n={n} ev, metrekare aralığı: {metrekare.min():.0f}-{metrekare.max():.0f}")
print(f"fiyat aralığı: {fiyat.min():.2f}-{fiyat.max():.2f}")
n=40 ev, metrekare aralığı: 40-196
fiyat aralığı: 3.60-27.92

Düz bir doğru bu veriye nasıl uyar?

Doğrusal model yetersiz kalıyor

dogrusal_model = LinearRegression()
dogrusal_model.fit(X, fiyat)
dogrusal_tahmin = dogrusal_model.predict(X)
dogrusal_mse = mean_squared_error(fiyat, dogrusal_tahmin)
print(f"Doğrusal model MSE: {dogrusal_mse:.3f}")
print(f"Doğrusal model eğim/kesişim: {dogrusal_model.coef_[0]:.4f} / {dogrusal_model.intercept_:.2f}")
Doğrusal model MSE: 2.606
Doğrusal model eğim/kesişim: 0.1513 / -4.30

MSE=2.606. Şimdi metrekarenin karesini yeni bir öznitelik olarak ekleyelim:

Derece=2 polinom regresyon

# Metrekarenin KARESİNİ de yeni bir öznitelik olarak ekliyoruz -> hâlâ DOĞRUSAL regresyon,
# sadece öznitelikler dönüştürülmüş durumda.
donusturucu = PolynomialFeatures(degree=2, include_bias=False)
X_polinom = donusturucu.fit_transform(X)
print(f"Yeni öznitelik matrisi şekli: {X_polinom.shape}  (sütunlar: [metrekare, metrekare^2])")
print(f"İlk ev: metrekare={X_polinom[0, 0]:.2f}, metrekare^2={X_polinom[0, 1]:.2f}")

polinom_model = LinearRegression()
polinom_model.fit(X_polinom, fiyat)
polinom_tahmin = polinom_model.predict(X_polinom)
polinom_mse = mean_squared_error(fiyat, polinom_tahmin)
print(f"\nPolinom model katsayıları: {polinom_model.coef_.round(5)}  (metrekare, metrekare^2)")
print(f"Polinom model MSE: {polinom_mse:.3f}")
print(f"İyileşme: doğrusal modelden {dogrusal_mse / polinom_mse:.1f} kat daha düşük MSE")
Yeni öznitelik matrisi şekli: (40, 2)  (sütunlar: [metrekare, metrekare^2])
İlk ev: metrekare=53.70, metrekare^2=2884.11

Polinom model katsayıları: [-0.0113   0.00069]  (metrekare, metrekare^2)
Polinom model MSE: 0.983
İyileşme: doğrusal modelden 2.7 kat daha düşük MSE

MSE 0.983’e düştü — 2.7 kat iyileşme. Model artık fiyatin metrekareyle nasıl hızlanarak arttığını yakalayabiliyor.

Peki dereceyi 15’e çıkarırsak?

Derece=15: daha esnek ama daha kötü

# Peki derece 2 yerine 15 kullansaydık? Aşırı esnek bir eğri, GÜRÜLTÜYÜ bile ezberlemeye başlar.
donusturucu_15 = PolynomialFeatures(degree=15, include_bias=False)
X_15 = donusturucu_15.fit_transform(X)
model_15 = LinearRegression()
model_15.fit(X_15, fiyat)
tahmin_15 = model_15.predict(X_15)
mse_15 = mean_squared_error(fiyat, tahmin_15)
print(f"Derece=15 model, EĞİTİM verisi MSE: {mse_15:.3f}  (derece=2'nin MSE={polinom_mse:.3f}'ünden bile KÖTÜ)")
print("Nedeni: metrekare^15 gibi devasa, ÖLÇEKLENMEMİŞ değerler sayısal kararsızlığa yol açıyor.")

# Ama yeni (görülmemiş) noktalarda dene:
yeni_metrekare = np.array([70.0, 120.0, 180.0]).reshape(-1, 1)
yeni_gercek = 3 + 0.01 * yeni_metrekare.ravel() + 0.0006 * yeni_metrekare.ravel()**2
yeni_tahmin_derece2 = polinom_model.predict(donusturucu.transform(yeni_metrekare))
yeni_tahmin_derece15 = model_15.predict(donusturucu_15.transform(yeni_metrekare))
print(f"\nYeni evler için gerçek fiyata yakın değerler: {yeni_gercek.round(2)}")
print(f"Derece=2 tahminleri:  {yeni_tahmin_derece2.round(2)}")
print(f"Derece=15 tahminleri: {yeni_tahmin_derece15.round(2)}  (gerçekçi olmayan, savrulan değerler)")
Derece=15 model, EĞİTİM verisi MSE: 10.934  (derece=2'nin MSE=0.983'ünden bile KÖTÜ)
Nedeni: metrekare^15 gibi devasa, ÖLÇEKLENMEMİŞ değerler sayısal kararsızlığa yol açıyor.

Yeni evler için gerçek fiyata yakın değerler: [ 6.64 12.84 24.24]
Derece=2 tahminleri:  [ 6.48 12.51 24.34]
Derece=15 tahminleri: [ 9.7   9.99 30.37]  (gerçekçi olmayan, savrulan değerler)

Şaşırtıcı sonuç: derece=15 modelin EĞİTİM verisindeki MSE’si (10.934), derece=2’nin MSE’sinden (0.983) bile kötü — hem de derece=15 çok daha “esnek” bir eğri olmasına rağmen. Çoğu kişi “daha yüksek derece = daha esnek eğri = veriye daha iyi uyar” sanır. Değil, çünkü metrekare^15 gibi devasa, ölçeklenmemiş sayılar (örneğin 200 metrekare için 200¹⁵ ≈ 3.3×10³⁴) modelin iç hesaplamalarını sayısal olarak kararsız hale getiriyor — matematiksel çözüm artık güvenilir değil. Yeni evler için tahminler de bunu doğruluyor: derece=2 gerçek değerlere çok yakın kalırken, derece=15 savruluyor (180 m² için gerçek ≈24.24 iken derece=15 tahmini 30.37).

Matematik

Polinom regresyon: doğrusal regresyonun bir hali
y^=b+m1x+m2x2++mdxd\hat{y} = b + m_1 x + m_2 x^2 + \cdots + m_d x^d
SembolAnlamı
ddPolinomun derecesi — kaç kuvvete kadar öznitelik ekleneceği
m1,m2,,mdm_1, m_2, \ldots, m_dHer kuvvetin katsayısı — hâlâ doğrusal en küçük kareler ile bulunur
xdx^ddd derece için eklenen yeni öznitelik (orijinal xx‘in dd‘inci kuvveti)

Bu denklem xx‘e göre EĞRİSEL olsa da, m1,m2,,mdm_1, m_2, \ldots, m_d katsayılarına göre hâlâ DOĞRUSALDIR — bu yüzden aynı en küçük kareler makinesi (3. ve 4. derste gördüğümüz) çalışmaya devam eder. Fark sadece giriş verisinin nasıl hazırlandığında: xx‘in kendisi yerine [x,x2,,xd][x, x^2, \ldots, x^d] sütunlarını kullanıyoruz.

Kod

Metrekare-fiyat serpme grafiği; kırmızı düz doğru ile veriye zayıf uyan doğrusal model, yeşil eğri ile veriye çok daha iyi uyan derece=2 polinom model karşılaştırılıyor.
Derece=2 eğrisi (yeşil), fiyatın metrekareyle hızlanarak arttığı gerçek örüntüyü yakalıyor; doğrusal model (kırmızı) bunu kaçırıyor.

Derece=15 modelin eğrisi bu grafiğe dahil edilmedi çünkü değerleri o kadar aşırı ki grafiğin ölçeğini bozardı — bu da kararsızlığın bir başka belirtisi.

Nerede işe yarar

Polinom regresyon, doğrusal olmayan ama hâlâ “pürüzsüz” ilişkiler için pratik bir araçtır:

  • Fiyat eğrileri, büyüme eğrileri. Bir eşikten sonra hızlanan veya yavaşlayan ilişkiler.
  • Kısa vadeli fiziksel/mühendislik modelleri. Sınırlı bir aralıkta eğrisel davranışı yakalamak (örn. bir sensörün kalibrasyon eğrisi).
  • Keşif aracı. Veriye önce derece=2 veya 3 uygulayıp, doğrusal modelden ne kadar iyileşme geldiğine bakarak ilişkinin gerçekten eğrisel olup olmadığını anlamak.

Bu 3 hatayı yaparsın:

  1. Dereceyi “daha iyi olur” diye sürekli artırmak — bu derste gördüğümüz gibi, çok yüksek derece hem sayısal kararsızlığa hem de (7. derste detaylı göreceğimiz) aşırı öğrenmeye yol açar.
  2. Yüksek dereceli özniteliklerde ölçekleme yapmamak — metrekare^15 gibi devasa sayılar, küçük sayılarla aynı modelde bulunduğunda hesaplamaları bozar.
  3. Polinom eğrisini, veri aralığının DIŞINDA (örn. 300 m² gibi hiç görülmemiş bir değerde) tahmin için kullanmak — eğriler, veri aralığının dışında genellikle gerçekçi olmayan şekilde savrulur.

Kendini test et

1. Polinom regresyon, doğrusal regresyondan matematiksel olarak nasıl farklıdır?
  1. Tamamen farklı bir algoritma kullanır
  2. Aslında farklı değildir — sadece girdiye x², x³ gibi yeni öznitelikler eklenir, katsayılar hâlâ doğrusal olarak bulunur (doğru cevap)
  3. Polinom regresyon en küçük kareleri kullanmaz
  4. Polinom regresyon sadece sınıflandırma için kullanılır

Neden: Polinom regresyon, x'in kuvvetlerini yeni öznitelikler olarak ekler; model katsayılara göre hâlâ doğrusaldır, bu yüzden aynı en küçük kareler yöntemiyle çözülür.

2. Notebook'ta derece=15 modelin EĞİTİM verisi MSE'si neden derece=2'den bile kötü çıktı?
  1. Veri seti çok küçüktü
  2. Ölçeklenmemiş yüksek kuvvetler (metrekare^15 gibi devasa sayılar) sayısal kararsızlığa yol açtı (doğru cevap)
  3. scikit-learn hatalı çalıştı
  4. Derece=15 aslında derece=2den daha iyiydi, sadece farklı ölçekte

Neden: metrekare^15 gibi aşırı büyük, ölçeklenmemiş değerler modelin iç hesaplamalarını sayısal olarak kararsız hale getirir; bu yüzden çözüm eğitim verisinde bile güvenilir olmaktan çıkar.

3. Derece=2 ve derece=15 modellerinin yeni (görülmemiş) evler için tahminleri karşılaştırıldığında ne gözlemlendi?
  1. İkisi de aynı derecede isabetliydi
  2. Derece=2 gerçek değerlere yakın kalırken, derece=15 belirgin şekilde savruldu (doğru cevap)
  3. Derece=15 her zaman daha isabetliydi
  4. İkisi de tamamen hatalıydı

Neden: 180 m² için gerçek değer ≈24.24 iken derece=2 tahmini 24.34 (çok yakın), derece=15 tahmini ise 30.37 (belirgin şekilde sapmış) çıktı.

Özet

Özet

  • Polinom regresyon, x'in kuvvetlerini (x², x³, ...) yeni öznitelikler olarak ekleyen bir doğrusal regresyon türüdür.
  • Derece arttıkça model daha esnek bir eğri çizebilir, ama bu her zaman daha iyi sonuç anlamına gelmez.
  • Çok yüksek dereceler, ölçeklenmemiş devasa sayılar yüzünden sayısal kararsızlığa yol açabilir.
  • Yüksek dereceli bir modelin eğitim verisindeki performansı bile kararsızlık yüzünden kötüleşebilir.
  • Doğru dereceyi seçmek bir denge işidir — bu dengeyi bir sonraki derste (bias-variance) formel olarak inceleyeceğiz.
Sonraki adım: Aşırı öğrenme ve bias-variance →