Python ile Ağaç Tabanlı Modellerle Machine Learning
Elie Kawerk
Data Scientist
Bir modelin genelleme hatasını nasıl tahmin ederiz?
Doğrudan yapılamaz çünkü:
$f$ bilinmiyor,
genelde tek bir veri kümeniz vardır,
gürültü öngörülemez.
Çözüm:
Test setine, $\hat{f}$'in performansından emin olana dek dokunulmamalıdır.
$\hat{f}$'i eğitim setinde değerlendirmek yanlıdır; $\hat{f}$ tüm eğitim noktalarını zaten görmüştür.
Çözüm → Çapraz Doğrulama (ÇD):
K-Katlı ÇD,
Ayırmalı (Hold-Out) ÇD.


$\hat{f}$ yüksek varyans gösteriyorsa:
$\hat{f}$'in ÇV hatası > eğitim seti hatası.
$\hat{f}$ yüksek önyargı gösteriyorsa:
$\hat{f}$'in ÇV hatası ≈ eğitim seti hatası >> istenen hata.
$\hat{f}$ eğitim setini yetersiz uyar (underfit). Çözüm:
from sklearn.tree import DecisionTreeRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error as MSE from sklearn.model_selection import cross_val_score# Set seed for reproducibility SEED = 123 # Split data into 70% train and 30% test X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=SEED)# Instantiate decision tree regressor and assign it to 'dt' dt = DecisionTreeRegressor(max_depth=4, min_samples_leaf=0.14, random_state=SEED)
# 10 katlı ÇV ile elde edilen MSE listesini hesaplayın # Tüm CPU çekirdeklerini kullanmak için n_jobs'u -1 yapın MSE_CV = - cross_val_score(dt, X_train, y_train, cv= 10, scoring='neg_mean_squared_error', n_jobs = -1)# 'dt'yi eğitim setine uydurun dt.fit(X_train, y_train) # Eğitim setinin etiketlerini tahmin edin y_predict_train = dt.predict(X_train) # Test setinin etiketlerini tahmin edin y_predict_test = dt.predict(X_test)
# ÇV MSE
print('CV MSE: {:.2f}'.format(MSE_CV.mean()))
CV MSE: 20.51
# Eğitim seti MSE
print('Train MSE: {:.2f}'.format(MSE(y_train, y_predict_train)))
Train MSE: 15.30
# Test seti MSE
print('Test MSE: {:.2f}'.format(MSE(y_test, y_predict_test)))
Test MSE: 20.92
Python ile Ağaç Tabanlı Modellerle Machine Learning