Makine Öğrenmesi - I-Doğrusal İlişkiler (Linear Relationships)

II. Lasso Regresyon

Yayın tarihi :25-Ara-21
Bölüm kodlarını ve/veya veri setlerini indir.

Lasso Regresyon Nedir?

Lasso regresyon, makine öğrenimi alanında kullanılan modellerin karmaşıklığını minimum düzeylere indirmek için oldukça yaygın kullanılan düzenlileştirme tekniği olarak tanımlanabilir. Genel hatlarıyla Ridge regresyona benzeyen bu tekniğin Ridge ile arasındaki en temel farklılıklar;

  • Ridge regresyonda ceza ağırlıklarının karesi kullanılırken, Lasso regresyonda mutlak ağırlıkların kullanılmasına bağlı düzenlileştirme yapılır.
  • Bu regresyon tekniğinde mutlak ağırlık değerlerinin kullanılmasından dolayı ağırlık katsayısı(veya eğim) 0'a kadar küçültülebilir.

Genel hatlarıyla Ridge regresyona benzeyen Lasso regresyonu, belirtilen özellikler açısından da farklılaşma göstermektedir. Bu farklılaşmadan ötürü Lasso regresyon tekniği "En Küçük Mutlak ve Seçim Operatörü(Least Absolute and Selection Operator) " olarak adlandırılmaktadır. 

Düzenlileştirme sürecinde Lasso regresyon tekniğinin kullanımı sonucunda, yukarıda bahsedildiği üzere ağrılık katsayılarında küçültmeler veya 0'a eşitleme yapılabilinmektedir. Bu küçültme süreci ise, veri kümesi içerisinde bulunan tüm verilerin ortalama değerleri hesaplanarak bir merkez belirlenilir ve küçülme işlemi belirlene merkeze doğru gerçekleşmektedir. Genel olarak bu regresyon teknik, Ridge regresyonun hedeflediği gibi karmaşık modeller için değil, daha basit ve daha seyrek modellerde kullanılmaktadır. Ayrıca, çalışmalarda kullanılacak modellerin maksimum düzeylerde çoklu bağlantı gösterebildiği durumlarda seçim veya eleme gibi eylemlerin yapılmasına olanak sağlamaktadır. Bu durumdan dolayı ise, çalışmalarda kullanılmak istenilen modellerin seçim sürecinde bazı özelliklerin otomatikleştirilebilmesi sağlar ve bu durum oldukça ciddi kullanım kolaylığı olarak ifade edilebilir. 

Bu düzenlileştirme regresyon tekniği İstatistik bilimi alanında L1 normu olarak bilinmektedir ve düzenlileştirme süreci "L1 düzenlemesi" olarak ifade edilebilir. L1 sürecinde model düzenlileştirilmesi, katsayıların büyüklüklerinin mutlak ağırlıklarıyla eşdeğer ceza eklenerek gerçekleştirilmektedir. Ayrıca, yukarıda bahsedildiği üzere yapı içerisinde bulunan herhangi bir katsayı, oldukça büyük ceza eklenerek 0'a eşitlenebilmektedir. Bu eşitleme imkanı sonucunda istenilmeyen özellikler 0'a eşitlerenerek modelden çıkartılır ve kullanılacak model yapısı oldukça basit ve anlaşılabilir bir forma dönüştürülebilir. 

Evrensel olarak Lasso regresyon denklemi;

Bu denklemde belirtilen "λ(lambda) " terimi, küçülme miktarını ifade etmektedir. Bu terimin alabileceği değerler açısından;

  • Eğer λ değeri "0" olarak ifade edilirse; verilere ait bütün özelliklerin dikkate alındığı anlamına gelmektedir. Bu durumun gözlenmesine bağlı olarak, tahminlemelere dayalı bir model oluşturabilmek için sadece "Artık Kareler Toplamı(Residual sum of squares) " dikkate alınmaktadır. Bu durum ise kısaca basit doğrusal regresyon olarak ifade edilebilir.
  • Eğer λ değeri "∞" değerler içerisinde ifade edilirse; verilere ait bütün özelliklerin dikkate alınmadığı anlaşılabilinmektedir. Bu durumu daha basit bir şekilde ifade etmek gerekirse; eğer λ değeri sonsuza(∞) yaklaşırsa, her yakınlaşmayla paralel olarak verilerin özellikleri ortadan kaldırılır. 

Bu bilgiler dikkate alınarak λ değerinde yaşanabilecek artışla paralel olarak sapma oranlarında artışlar yaşanmaktadır. Bu durumun tersi olarak ise λ değerinde yaşanabilecek azalmalara paralel olarak varyans değerlerinde artışlar yaşanılmaktadır. 

Sonuç olarak, eğer bir model düzenlileştirme yönteminde L1 normu kullanılmış ise, bu düzenlileştirmenin Lasso regresyon kullanılarak yapıldığı anlamına gelmektedir. Ancak L2 normu kullanıldıysa, bir önceki dersin konusu olan Ridge regresyonla düzenlileştirme yapıldığı anlaşılabilinmektedir.

Lasso Regresyon Neden Kullanılır?

Lasso regresyon, makine öğrenimini çalışmalarında oldukça yaygın bir şekilde kullanılmaktadır. Bu kullanımın en temel etkenleri arasında;

  • Oldukça büyük veriler üzerinde çalışma yapabilmek,
  • Tahminsel hesaplamalarda oldukça verimli sonuçların elde edilmesi,
  • Veri kümeleri içerisinden aynı anda değişken seçimleri ve seçimler doğrultusunda regresyon yapabilmek,

gibi faktörler yer almaktadır. 

Lasso Regresyon Limitleri Nelerdir?

Genel itibariyle Lasso regresyonun en temel 2 farklı limitinin olduğu söylenebilir. Bunlar;

  • Kullanılan tahmin edicilerin(predictors (p)) oranı(veya sayısı), gözlemlerin(number of observation (n)) oranınından büyük olsa bile en yüksek "n" tahmin edici sayısı 0'dan farklı olarak seçilir.
  • Minimum iki veya daha fazla sayıda doğrudaş değişkenler mevcut ise, düzenlileştirme için kullanılan Lasso regresyon herhangi bir değişkeni otomatik olarak rastgele seçer. Bunun sonucunda ise verilerin yorumlanmasında başarı performansı azalabilir. 

Lasso regresyonun kullanımı yukarıda verilen durumlar açısından sınırlandırılmaya uğrar. 

Ridge Regresyonu Nasıl kullanılır?

Kullanım için "Lasso" regresyon algoritmasının içe aktarılması gerekmektedir.

from sklearn.linear_model import Lasso

Söz dizimi: Lasso(alpha=1.0, *, fit_intercept=True, normalize='deprecated', precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')

  • alpha, düzenleyicinin gücünü temsil etmektedir ((1 / (2 * n_samples)) * ||y - Xw||^2_2 + alpha * ||w||_1). Değerin büyük olması daha güçlü düzenlendirmeyi sağlayacaktır.

Örnek-1: "Cars" veri seti üzerinden, Price sütununa Lasso regresyon 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.

# Kütüphaneler içe aktarılır.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score

from sklearn.linear_model import Lasso
# Veri seti okunur
df=pd.read_excel("cars.xls")

EDA (Exploratory Data Analysis-Keşfedici veri analizi)

Not: Veri seti hakkında genel bir bilgi almak için EDA işlemi yapılır.

#İlk 5 satır listelendi
df.head()

Çıktı:

#Son 5 satır listelendi
df.tail()

Çıktı:

#rasgele 3 satır
df.sample(3)

Çıktı:

#Veri seti boyutu
df.shape

Çıktı:

(804, 12)
#Veri seti hakkında genel bilgi
df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 804 entries, 0 to 803
Data columns (total 12 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Price     804 non-null    float64
 1   Mileage   804 non-null    int64  
 2   Make      804 non-null    object 
 3   Model     804 non-null    object 
 4   Trim      804 non-null    object 
 5   Type      804 non-null    object 
 6   Cylinder  804 non-null    int64  
 7   Liter     804 non-null    float64
 8   Doors     804 non-null    int64  
 9   Cruise    804 non-null    int64  
 10  Sound     804 non-null    int64  
 11  Leather   804 non-null    int64  
dtypes: float64(2), int64(6), object(4)
memory usage: 75.5+ KB
#Veri seti içinde boş değerlerin toplamı
df.isnull().sum()

Çıktı:

Price       0
Mileage     0
Make        0
Model       0
Trim        0
Type        0
Cylinder    0
Liter       0
Doors       0
Cruise      0
Sound       0
Leather     0
dtype: int64
#Veri seti sütunlarının(değişkenlerinin) istatistiksel değerleri
df.describe()

Çıktı:

#sütunların birbirleri ile korelasyonu
df.corr()

Çıktı:


!! Sütunlar arasındaki korelasyon işlemleri detaylarına buradan ulaşabilirsiniz.


#Korelasyon görüntülenmesi. 
sns.heatmap(df.corr(),annot=True,linewidths=2)

Çıktı:

#aykırı değerler var mı?
fig, axs = plt.subplots(ncols=8,figsize=(20,5))
i=0
for item in df.corr().index:
    sns.boxplot(x=item,data=df,ax=axs[i])
    i+=1
#Grafikler incelendiğinde aykırı değerlerin fazla olmadığını görüyoruz.

Çıktı:

sns.scatterplot(data=df,y="Price",x="Mileage")

Çıktı:


sns.countplot(data=df,x="Cylinder")

Çıktı:

sns.countplot(data=df,x="Type",hue="Doors")

Çıktı:


Model Oluşturma

Veri setimizde object değerler olduğundan dolayı get_dummies işlemi uygulayalım.

df=pd.get_dummies(data=df,drop_first=True)
df.sample(4)

Çıktı:


#get_dummies() işlemi sonucunda (804,12) olan veri seti boyutumuz (804,94) olarak güncellenmiş oldu. 94 sütunluk bir veri seti haline geldi.
df.shape

Çıktı:

(804, 94)
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,test_size=0.2,random_state=13)
#satır sayılarının eşit olduğuna(x_train ile y_train, x_test ile y_test) dikkat ediniz
x_train.shape,x_test.shape,y_train.shape,y_test.shape

Çıktı:

((643, 93), (161, 93), (643, 1), (161, 1))
#Lasso modülünü L değerine eşitleyelim.
L=Lasso()
#Makine öğrendi
L.fit(x_train,y_train)
#test için ayrılan x_test verilerinin hedef değerlerinin ne olabileceğini tahmin etti.
predict_L=L.predict(x_test)
predict_L[0:5]

Çıktı:

array([11802.77667696, 21090.57378701, 16372.35589653, 11015.26734174,
       15709.10719874])
#gerçekte olan değerlerin İlk 5 satır listelendiı
y_test[0:5]

Çıktı:


Lasso Regrasyon modülü ile x_test verilerine karşılık tahmin edilen değerler (predict_L) ve gerçekte olması gereken değerler (y_test) yukardıda listelenmiş oldu. Makine öğrenmesi modelinin (Lasso Regresyon) performansını ölçmek için MSERMSEMAER2_Score değerlerine bakalım. 

#MSE
(mean_squared_error(y_test,predict_L))

Çıktı:

1297318.7148462872
#RMSE
(mean_squared_error(y_test,predict_L))**.5

Çıktı:

1138.9989968592101
#MAE
mean_absolute_error(y_test,predict_L)

Çıktı:

738.0510074426261
#r2_score
r2_score(y_test,predict_L)*100

Çıktı:

98.902040987547

Price ve diğer sütunlar arasında Lasso Regrasyonu kullanarak %98.9 doğrulukla sonuç elde etmiş olduk. Artık yapacağımız tahminlerde %98.9 oranında doğrulukla bize araba fiyatını verecektir.  

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.