Karar Ağacı (Decision Tree) Regresyonu -Makine Öğrenmesi (2020)
Makine Öğrenmesinde tahmin algoritmalarından Karar Ağacı Regresyonu ile karşınızdayım :)
1- Veri Setini Getirme/İnceleme
# VERİ SETİNİ GETİRME
import seaborn as sns
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
data = sns.load_dataset("tips")
df = pd.DataFrame(data)
# Eksik Verileri Ortalama ile Doldurma
imputer = SimpleImputer(missing_values=np.nan, strategy="mean")
imputer = imputer.fit(df[["total_bill"]])
df[["total_bill"]] = imputer.transform(df[["total_bill"]])
# Kategorik Olmayan Değişkenler
total_bill = df[["total_bill"]]
tip = df[["tip"]]
size = df[["size"]]
# Kategorik Değişkenler İçin 0-1 Dönüşümü
smoker = pd.get_dummies(df[["smoker"]])
time = pd.get_dummies(df[["day"]])
# Kukla Değişkeni Silme
smoker = smoker.drop("smoker_Yes", axis=1)
# Verileri Birleştirme
new_data = pd.concat([total_bill, size, smoker, time, tip], axis=1)
# Train ve Test Belirleme
training = new_data.iloc[:, 0:7]
testing = new_data.iloc[:, 7:8]
# Train Test Ayırma
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(training, testing, test_size=0.30, random_state=42)
2- Model Eğitme
from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(random_state = 0)
dtr.fit(x_train, y_train)
3- Tahmin
y_pred = dtr.predict(x_test)
4- Gerçek v Tahmin Değerlerini Karşılaştırma
y_tahmin = pd.DataFrame(data = y_pred)
y_tahmin.index = y_test.index
result = pd.concat([y_tahmin, y_test],axis=1)
result.columns = [["Tahmin","Gerçek"]]
print(result)
5- Stats Model (Normal)
Decision Tree algoritmamızda default değerlerle eğittiğimizde “statsmodels” ile R2 değerimiz yani regresyon model uyumunun 0.494 olduğunu buluyıruz. İleriki aşamada Tune işlemi ile bu uyumluluk değerinin arttırılmasını sağlayacağız.
!! Modelimizin tahmininde, stats model tablomuzda bulunan P > |t| sütununda 0.05 ‘den büyük değerlere sahip değişkenler tahminlerde sapmalar ortaya çıkarmaktadır. Bu değişkenleri çıkarak x_train, y_train değerlerin yeniden belirlenmelidir.
import statsmodels.api as sm
from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(random_state = 0)
dtr.fit(x_train, y_train)
decision_tree = sm.OLS(dtr.predict(x_train), x_train)
model = decision_tree.fit()
model.summary()
6- Mean Squared Error -MSE (Normal)
Burada da modelimizde oluşacan hataların bir skor olarak değerini görmek için y_train ve y_test değerlerini x_train ve x_test’ler kullanılarak elde edilen tahmin değerleriyle karşılaştırıyoruz.
from sklearn.metrics import mean_squared_error
mse = np.sqrt(mean_squared_error(y_train, model.predict(x_train)))
print("Train RMSE: ", mse)
mse = np.sqrt(mean_squared_error(y_test, model.predict(x_test)))
print("Test RMSE: ", mse)
7- Model Tuning
Yukarıda 0..5'den büyük değere sahip olan değişkenleri çıkartık ve bunun için yeniden train_test_split ile ayırma işlemi gerçekleştirdik.
# Train ve Test Belirleme
training = new_data.iloc[:, 0:2]
testing = new_data.iloc[:, 7:8]
# Train Test Ayırma
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(training, testing, test_size=0.30, random_state=42)
8- Stats Model (Tuned)
Yeniden hazırladığımız verisetimizi kullanarak eğitim işleminden geçiriyoruz. Burdan eğitiğimiz modeli “statsmodel” içine gönderiyoruz. Tablodaki değerleri incelediğimizde;
R2 değerimizde mükemmel bir artış ortaya çıkarak, modeldeki 2 değişkenin tahmin algoritmasından kaldırılmasının sonucu görmüş oluyoruz.
P > |t| sütununa bakarasak 0.05'den büyük değerler olmadığından verisetimizi yeniden düzenlemek zorunda kalmıyoruz :)
import statsmodels.api as sm
from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(random_state = 0)
dtr.fit(x_train, y_train)
decision_tree = sm.OLS(dtr.predict(x_train), x_train)
model = decision_tree.fit()
model.summary()
9- Mean Squared Error -MSE (Tuned)
Normal modeldeki gibi bir hata hesaplama yaptığımızda değerlerin çok çok az arttığını görüyoruz, buradan modelimizin uyumluluk skoru (R2) artsada yine de hata skorunun artmayacağı anlamına gelmeyeceğini anlamış oluruz.
from sklearn.metrics import mean_squared_error mse = np.sqrt(mean_squared_error(y_train, model.predict(x_train))) print(“Train RMSE: “, mse) mse = np.sqrt(mean_squared_error(y_test, model.predict(x_test))) print(“Test RMSE: “, mse)
Umarım faydalı olmuştur. Diğer algoritmalarda görüşmek üzere :)
Önceki Yazı (Destek Vektör Regresyonu)/ Sonraki Yazı (Random Forest)