Makine Öğrenmesi - I-Doğrusal İlişkiler (Linear Relationships)
Kısmi En Küçük Kareler Regresyonu (PLS)
Kısmi En Küçük Kareler Regresyonu (Partial Least Squares Regression - PLS), yakın kızılötesi spektroskopi verilerini analiz etmek için kullanılan yaygın bir regresyon tekniğidir.
Bir önceki dersimizde Temel Bileşen Regresyonu (PCR) konusundan bahsedilmişti. PCR, PCA kullanılarak türetilen bir dizi temel bileşen kullanılarak oluşturulmuş oldukça basit bir regresyon modelidir. PCR'ın tahmin (hedef) değişkeni hakkında herhangi bir bilgi kullanmadığı, sadece değişkenlerin kuvvet değerlerine göre işlem yaptığından dolayı da denetemisiz olduğundan bahsedilmişti.
PLS ise PCR ile aynı işlemi yapar ama hedef değişkenini de dikkate alarak denetimli olarak çalışır.
Söz dizimi: PLSRegression(n_components=2, *, scale=True, max_iter=500, tol=1e-06, copy=True)
- n_components, tutlacak değişkenlerin sayısını ifade eder. Default olarak değeri 2 dir.
- scale, ölçeklendirme yapılıp yapılmayacağını temsil eder.
Örnek-1: "Cars" veri seti üzerinden, Price sütununa PLSRegression algoritmasını uygulayalım. Veri setimiz araba özelliklerini ve bu özelliklere göre fiyatının ortaya çıktığı 804 satırlık bir veri setidir.
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.cross_decomposition import PLSRegression
from sklearn.metrics import mean_squared_error,r2_score, mean_absolute_error
df=pd.read_excel("cars.xls")
df.head()
Çıktı:
#veri setinde object değerler olduğu için get_dummies işlemi yapalım
df=pd.get_dummies(df,drop_first=True)
df.shape
Çıktı:
(804, 94)
#bağımsız(x) ve bağımlı(y) değişkenlerini ayıralım
x,y=df.drop("Price",axis=1),df[["Price"]]
x.head()
Çıktı:
y.head()
Çıktı:
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=13,test_size=.2)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
Çıktı:
((643, 93), (161, 93), (643, 1), (161, 1))
pls=PLSRegression(n_components=2)
#Makine öğrenmesi ve x_test verileri üzerinden tahminleme
pls.fit(x_train,y_train)
predict_pls=pls.predict(x_test)
predict_pls[0:5]
Çıktı:
array([[13647.36561701], [18690.0063761 ], [16686.1844918 ], [ 9840.61922449], [15300.57562844]])
y_test[0:5]
Çıktı:
(mean_squared_error(y_test,predict_pls))**.5
Çıktı:
2183.5023625082276
r2_score(y_test,predict_pls)*100
Çıktı:
95.96496991592409
PLS Regresyonunda n_components (tutulacak değişken sayısı) değeri 2 seçildiğinde veri setimizdeki Price sütununun değerini, %95.96 doğrulukla tahmin etmiş olduk. n_components değerini 3 olarak seçerek tekrar tahminleme işlemi yapalım.
pls=PLSRegression(n_components=3)
pls.fit(x_train,y_train)
predict_pls=pls.predict(x_test)
(mean_squared_error(y_test,predict_pls))**.5
Çıktı:
1754.7516696252633
r2_score(y_test,predict_pls)*100
Çıktı:
97.39402182996429
PLS Regresyonunda n_components değeri 3 seçildiğinde veri setimizdeki Price sütununun değerini, %97.39 doğrulukla tahmin etmiş olduk. Bu veri setimizde n_components değeri artırıldığında tahmin edilen doğruluk değerinin de artacağını gözlemlemiş olduk. n_components değeri 4 yapıldığında da %98.85 doğruluk değeri elde edilecektir.