Makine Öğrenmesi - II. Doğrusal Olmayan İlişkiler (Non-Linear Relationships)

Destek Vektör Regresyonu (Support Vector Regression - SVR)

Yayın tarihi :04-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Destek Vektör Regresyonu (Support Vector Regression - SVR), oluşturulan modelde ne kadar hatanın kabul edilebileceğini tanımlamayı sağlayan regresyon modelidir. Girilen hatalara göre kendisine uygun bir çizgi bulur veya hiper düzlem oluşturur.

Kullanımı için SVR kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.svm import SVR

Söz dizimi: SVR(kernel='rbf', degree=3, gamma='scale', coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=- 1)

  • kernel, algoritmada kullanılacak yöntem türünü temsil eder. ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ olmak üzere 5 değer alabilir. Default olarak da rbf bulunmaktadır.

Örneğin bir araba fiyatlarını tahmin eden model oluşturulduğunda, tahmin değeri ile gerçek değeri arasında 5.000 TL fark olması bizim tarafımızdan kabul edilebilir olarak görülüyorsa bunu modele belirtebiliriz.

Doğrusal regresyon konusunda gördüğümüz aşağıdaki grafiği hatırlayın;

Bu grafikte kırmızı olan regresyon çizgisine ek olarak SVR modelinde kabul edilebilir hata değerleri de girilerek(yeşil çizgi ile gösterilen) kendisine alan oluşturacaktır. Temel olarak doğrusal en küçük karaler doğrusal regresyonundan da SVR (kernel değeri linear olan)'yi ayıran fark bu hata paylarının kabul edilmesidir.

SVR konusunda örnek yaparak daha iyi anlamaya çalışalım.

Örnek-1: Rastgele değerlerden X ve y değişkenleri oluşturalım ve bu değişkenlere SVR'nin linear, poly ve rbf kernel yöntemlerini uygularak grafikte gösterelim.

# 0-1 aralığında 50x1 X değeri oluştur ve X değerlerini küçükten büyüğe sırala
X=np.sort(np.random.rand(50,1),axis=0)

# Oluşturulan X değerlerininin sin değerini y değerine eşitle
y=np.sin(X).ravel()

# y değeri elemanlarına 3'er sıra atlayarak gürültü ekle
y[::3]=4*(1-np.random.rand(17))

# SVR kernel değerlerini linear, poly, rbf olarak liste oluştur.
svrs=[SVR(kernel="linear"),SVR(kernel="poly"),SVR(kernel="rbf")]
svrs_name=["linear","poly","rbf"]

# grafik özellikleri
line_colors=["r","g","b"] #plot çizgi renkleri
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5)) #1 satırda 3 sütun ve genişlik:15, yükseklik:5

# grafik çizimi
for row,svr in enumerate(svrs):
    axes[row].plot(X,
                   svr.fit(X,y).predict(X),
                   lw=2,
                   c=line_colors[row])
    axes[row].scatter(X,y,s=50) 

Çıktı:

Yukarıdaki ilk şekilde X değerine SVR(kernel="linear") regresyon işlemi sonucunda çıkan sonuçun doğrusal olduğu gözlemlendi. Diğer 2 grafikte de kernel olarak poly ve rbf uygulanarak görselleştirildi. 

Örnek-2: Hitters veri setine SVR işlemi uygulayarak çıkan sonuçları gözlemleyelim.

import pandas as pd
import numpy as np
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error

from sklearn.svm import SVR
df=pd.read_csv("Hitters.csv")
df.head()

Çıktı:

df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 322 entries, 0 to 321
Data columns (total 21 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   Unnamed: 0  322 non-null    object 
 1   AtBat       322 non-null    int64  
 2   Hits        322 non-null    int64  
 3   HmRun       322 non-null    int64  
 4   Runs        322 non-null    int64  
 5   RBI         322 non-null    int64  
 6   Walks       322 non-null    int64  
 7   Years       322 non-null    int64  
 8   CAtBat      322 non-null    int64  
 9   CHits       322 non-null    int64  
 10  CHmRun      322 non-null    int64  
 11  CRuns       322 non-null    int64  
 12  CRBI        322 non-null    int64  
 13  CWalks      322 non-null    int64  
 14  League      322 non-null    object 
 15  Division    322 non-null    object 
 16  PutOuts     322 non-null    int64  
 17  Assists     322 non-null    int64  
 18  Errors      322 non-null    int64  
 19  Salary      263 non-null    float64
 20  NewLeague   322 non-null    object 
dtypes: float64(1), int64(16), object(4)
memory usage: 53.0+ KB
#Veri setindeki boş alanlar kaldırıldı
df=df.dropna().reset_index(drop=True) 
#Unnamed sütunu kaldırıldı.
df.drop("Unnamed: 0",axis=1,inplace=True) 
#Veri setimizde object değerler olduğu için "get_dummies" işlemi uygulayalım
df=pd.get_dummies(df,drop_first=True)

#x ve ye değerlerini atayalım
x,y=df.drop("Hits",axis=1),df[["Hits"]]

#train ve test için veri setini ayıralım
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=13,test_size=.2)

#son durumda train ve test verilerinin boyutlarına bakalım
x_train.shape,x_test.shape,y_train.shape,y_test.shape

Çıktı:

((210, 19), (53, 19), (210, 1), (53, 1))
#SVR'i doğrusal olarak değerlendirelim.
svr=SVR(kernel="linear") #varsayılan olarak rbf'dir.

#Makine öğrenmesi işlemi yapalım
svr.fit(x_train,y_train)

#x_test verisini tahmin ettirip ilk 5 değerini yazdıralım
predict_svr=svr.predict(x_test)
predict_svr[0:5]

Çıktı:

array([ 38.81944967,  55.90496631, 109.15306062, 164.8166957 ,
        21.31110371])
#Tahmin edilen değerler ile gerçek değerlerin; hata değerini ve başarı yüzdesini görüntüleyelim
print("mean_squared_error:{}".format((mean_squared_error(y_test,predict_svr))**.5))
print("r2_score yüzde değeri:{}".format(r2_score(y_test,predict_svr)*100))

Çıktı:

mean_squared_error:11.87583116035977
r2_score yüzde değeri:92.57084993136608
#SVR'i doğrusal olmayan olarak değerlendirelim.
svr=SVR(kernel="rbf") #default olarak rbf'dir.
#Makine öğrenmesi işlemi yapalım
svr.fit(x_train,y_train)
#x_test verisini tahmin ettirip ilk 5 değerini yazdıralım
predict_svr=svr.predict(x_test)
predict_svr[0:5]

Çıktı:

array([103.90562036, 100.51353132, 113.97979471, 121.50719442,
       105.9362463 ])
#Tahmin edilen değerler ile gerçek değerlerin; hata değerini ve başarı yüzdesini görüntüleyelim
print("mean_squared_error:{}".format((mean_squared_error(y_test,predict_svr))**.5))
print("r2_score yüzde değeri:{}".format(r2_score(y_test,predict_svr)*100))

Çıktı:

mean_squared_error:44.02285151099815
r2_score yüzde değeri:-2.086294870865202
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.