Makine Öğrenmesi - II. Doğrusal Olmayan İlişkiler (Non-Linear Relationships)
Doğrusal Olmayan Regresyonları Birlikte Kullanma
Doğrusal olmayan regrasyon modelleri olarak;
- K-En Yakın Komşu (KNN)
- Destek Vektör Regresyonu (SVR)
- Bernoulli Kısıtlı Boltzmann Makinası (RBM)
- Karar Ağaçları
- Torbalama Ağaçları
- Rastgele Ormanlar
- Ekstra Ağaçlar
- Gradient Boosting
- Extreme Gradient Boosting
- Light Gradient Boosted Machine
olmak üzere 10 farklı lineer regresyon modeli incelenmiş oldu.
Yukarda sayılan regresyon modellerinde aynı veri seti üzerinde tahmin işlemi yapıldığında MSE, RMSE, MAE, R2_Score değerlerinde farklılıklar olacaktır. İlgili değerlerinin hangi regresyon modelinde daha iyi sonuç verdiğini tek bir tabloda görebilmek için aşağıdaki fonksiyonu kullanabilir;
def nonLinearRegressionFunc(dataset,columnName):
#İlgili kütüphaneler eklendi
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.neural_network import MLPRegressor
from sklearn.tree import DecisionTreeRegressor,ExtraTreeRegressor
from sklearn.ensemble import BaggingRegressor,RandomForestRegressor,ExtraTreesRegressor,GradientBoostingRegressor
from xgboost import XGBRegressor #yüklemek için: pip install xgboost
from lightgbm import LGBMRegressor #yüklemek için: pip install lightgbm
import warnings #uyarı çıktılarını gösterme
warnings.filterwarnings("ignore")
#Regresyon modelleri değişkenlere eşitlendi
KNN=KNeighborsRegressor()
svr=SVR()
MLP=MLPRegressor()
#Ber=BernoulliRBM()
DTR=DecisionTreeRegressor()
ETR=ExtraTreeRegressor()
BR=BaggingRegressor()
RFR=RandomForestRegressor()
ETR2=ExtraTreesRegressor()
GBR=GradientBoostingRegressor()
XGB=XGBRegressor()
LGBM=LGBMRegressor()
#modelleri ve isimlerini bir liste halinde tutalım
modelList=[KNN,svr,MLP,DTR,ETR,BR,RFR,ETR2,GBR,XGB,LGBM]
modelNames=["KNeighborsRegressor","SVR","MLPRegressor","DecisionTreeRegressor","ExtraTreeRegressor",
"BaggingRegressor","RandomForestRegressor","ExtraTreesRegressor","GradientBoostingRegressor",
"XGBRegressor","LGBMRegressor"]
#x ve y değerlerine atama yapıldı
dataset=dataset.dropna(axis=0) #veri setinde boş değişken değeri varsa o satırı kaldıralım.
x,y=dataset.drop(columnName,axis=1),dataset[[columnName]]
#x değerlerine get_dummies modülü uygulandı
x=pd.get_dummies(x,drop_first=True)
#x ve y değerlerine train_test_split modülü uygulandı
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.2,random_state=13)
#Model eğitme ve tahminleme işlemleri
#MSE,RMSE,MSA ve r2_score için boş bir liste oluşturalım
MSE=[]
RMSE=[]
MAE=[]
R2=[]
for model in modelList:
#model eğitildi
model.fit(x_train,y_train)
#x_test tahmin edildi
predictModel=model.predict(x_test)
#MSE,RMSE,MSA ve r2_score listelerine çıkan bu sonuçları eklendi
MSE.append(mean_squared_error(y_test,predictModel))
RMSE.append((mean_squared_error(y_test,predictModel)**.5))
MAE.append(mean_absolute_error(y_test,predictModel))
R2.append(r2_score(y_test,predictModel))
#Şuan elimizde 11'er tane elemanı bulunan MSE,RMSE,MSA ve r2_score listesi bulunmakta.
#Bu listeleri bir tablo halinde dışarıya aktaralım.
datas={"MSE":MSE,"RMSE":RMSE,"MAE":MAE,"R2_SCORE":R2}
result=pd.DataFrame(data=datas,index=modelNames)
#Sonuçlar "r2_score" değerine göre sıralansın
return result.sort_values("R2_SCORE",ascending=False)
Yukarıda bulunan "nonLinearRegressionFunc" isimli yazmış olduğumuz fonksiyona verisetini ve regresyon yapmak istediğimiz değişken ismini verdiğimizde bize 11 tane regresyon modelinde tahminleme yaprak sonucu döndürecektir. Bunu test etmek için bir kaç tane veri setini kullanalım. Ama dikkat edilmesi gereken konu veri seti fonksiyona verilmeden önce EDA işlemleri yapılarak temizlenmelidir, deneme amaçlı temiz veri setleri verelim.
Örnek-1:
#cars veri seti
#"Price" sütununda lineer olmayan regresyon yapalım
import pandas as pd
dfCars=pd.read_excel("cars.xls")
dfCars.sample(2)
Çıktı:
nonLinearRegressionFunc(dfCars,"Price")
Çıktı:
Örnek-2:
#diamonds veri seti
#"price" sütununda regresyon yapalım
import seaborn as sns
dfDiamonds=sns.load_dataset("diamonds")
dfDiamonds.sample(2)
Çıktı:
nonLinearRegressionFunc(dfDiamonds,"price")
Çıktı: