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

III. Elastic-Net Regresyon

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

Elastic-Net Nedir?

Elastic-Net, Ridge Regrasyon ve Lasso Regrasyonunun birbirlerine entegre edilmesiyle oluşturulan oldukça popüler bir regresyon türü olarak tanımlanabilir. Bu regresyon türünde temel olarak L1 ve L2 düzenlemeleri belirli bir kombinasyon halinde birlikte kullanılmaktadır. Böylelikle bu regresyon türü, çalışmalarda kullanılmak istenilen modelleri düzenleyebilmek ve iyileştirebilmek için hem Ridge regresyondan, hem de Lasso regresyondan alınan cezaları kullanabilmektedir. Bu bilgilerden hareketle;

"Elastic-Net Regresyon(ENR) = Ridge Regresyon + Lasso Regresyon" olarak tanımlanmaktadır. 

Lasso regresyon dersinde bahsedildiği üzere, Lasso regresyonun istenilmeyen bazı limitlerinin olduğunu ifade edilmiştir. Bu limitler arasında önem açısından ilk sırada bulunan durumun; "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." olduğu ifade edilmiştir. Meydana gelebilecek bu durum karşısında Elastic-Net kullanımına bağlı olarak "n" sayısı açısından limitler kaldırılır. Yani, Elastic-Net kullanılarak modelin yeterli doygunluğa ulaşabilmesi için model yapısına "n" sayıda değişkenler dahil edilebilinmektedir. Bu ifadelerden hareketle, Elastic-Net kullanımı sonucunda diğer regresyon çeşitlerinin limitleriyle başarılı bir şekilde mücadele edildiği söylenebilir. 

Bahsedilen bu durumları örnek üzerinden daha basit bir şekilde ifade etmek gerekirse;

Örneğin makine öğreniminde regresyon süreci için Lasso tekniğinin kullanıldığını ve bu kullanıma bağlı olarak bazı limitlerin(sınırlandırmaların) meydana geldiği varsayalım. Bu sınırlandırmaları ortadan kaldırmak için Elastic-Net'in kullanılmasına bağlı olarak, Ridge regresyonunun ceza terimini oluşturan ikinci dereceden ifadelerinden faydalanılmaktadır. Ceza açısından kullanılan ikinci dereceden ifadeler, kayıp fonksiyonu olarak bilinen yapının dışa doğru genişlemesine neden olmaktadır. Böylelikle Elastic-Net, bilinen en iyi regresyon türlerinde(Ridge ve Lasso) meydana gelebilecek sınırlandırmalar ile yine en iyi regresyonların özelliklerini kaynak olarak kullanarak oldukça başarılı bir şekilde mücadele edebilmektedir. 

Elastic-Net Regresyonu Nasıl kullanılır?

Kullanım için "Elastic-Net" regresyon algoritmasının içe aktarılması gerekmektedir.

from sklearn.linear_model import ElasticNet

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

  • alpha, ceza terimlerini çarpan sabittir. (alpha = a + b and l1_ratio = a / (a + b)). 

Örnek-1: "Cars" veri seti üzerinden, Price sütununa Elastic-Net 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, mean_absolute_error, r2_score

from sklearn.linear_model import ElasticNet
# 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))
ElasticNet modülünü E değerine eşitleyelim.
E=ElasticNet()
#Makine öğrendi
E.fit(x_train,y_train)
#test için ayrılan x_test verilerinin hedef değerlerinin ne olabileceğini tahmin etti.
predict_E=E.predict(x_test)
predict_E[0:5]

Çıktı:

array([14346.04912622, 23226.06464918, 19811.71857704, 13034.66882562,
       20159.22925434])
#gerçekte olan değerlerin İlk 5 satır listelendiı
y_test[0:5]

Çıktı:

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

#MSE
(mean_squared_error(y_test,predict_E))

Çıktı:

41372769.37513721
#RMSE
(mean_squared_error(y_test,predict_E))**.5

Çıktı:

6432.1667714027135
#MAE
mean_absolute_error(y_test,predict_E)

Çıktı:

4598.649852791985
#r2_score
r2_score(y_test,predict_E)*100

Çıktı:

64.98500755001145

Price ve diğer sütunlar arasında Elastic-Net Regrasyonu kullanarak %64.9 doğrulukla sonuç elde etmiş olduk. Ridge ve Lasso Regresyonlarına göre oldukça düşük bir değer çıkmış oldu. 

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.