Modeliniz Günümüzde de Hala Yeteri Kadar Başarılı ve Kullanılabilir Mi?

Ata Özarslan
İstanbul Data Science Academy
5 min readApr 17, 2024

--

Eğer daha önce veri bilimiyle ilgili çalışmalar yaptıysanız, model geliştirme sürecindeki nihai modelimize karar verirken, belli başlı noktalarda beklentinizi karşılamasına özellikle dikkat etmişsinizdir. Bu noktalar genellikle;

  • Modelin Yeterli Sayıda Veriyle Beslenip-Beslenmediği
  • Model Başarı Metriklerinin Beklenen Düzeyde Olup-Olmadığı
  • Model Tahminlerinin Sebeplerini Açıklayıp-Açıklamama

gibi noktalar olmaktadır. Ancak gerçek hayatta bir model oluşturmak tek seferlik bir süreç değildir. Oluşturduğunuz modeli gerçek dünyada uygulamak istediğinizde hesaba katılmayan birçok durumla karşılaşma ihtimalimiz oldukça fazladır. İşte bu durumlara ilişkin bazı örnekler,

Veri Kalitesi (Data Quality) Sorunları:

  • Veri işlem hatları bozulabilir.
  • Veri ön işleme adımlarında hatalar oluşabilir.
  • Veri üreticileri işleri berbat edebilir.

Sonuç olarak, model hatalı veri girdileri alabilir ve bu sebeple güvenilmez tahminler yapabilir.

Veri Kayması (Data Drift):

  • Model eğitiminde kullanılan veriyle, günümüzde girdi olarak gelen veriler farklı eğilimler gösterebilir.

Örneğin, model geliştirme sürecinde müşteri kitleniz ağırlıklı olarak daha genç yaşlı kişilerden oluşuyorken zamanla daha yaşlı kesimi hitap eden bir şirkete dönüşmüş olabilirsiniz.

Kavram Kayması (Concept Drift):

  • Model eğitiminde kullanılan özelliklerin, model tahminine olan etkileri zamanla farklılaşabilir veya tamamen değişebilir.

Örneğin, normal şartlarda ev alacakken en çok evin büyüklüğü ve konumu gibi özelliklere dikkat eden müşteriler, ülkede deprem gibi büyük bir doğal afet yaşandıktan sonra eğilimlerini değiştirerek fay hatlarına uzak ve son yıllarda yapılan genç binalara yönelebilirler.

Concept Drift vs Data Drift (https://www.evidentlyai.com/ml-in-production/concept-drift)

Yani özetle tüm bu durumları ele alarak, modelleri deploy ettikten sonra belirli aralıklarla takip etmeli ve gerektiği durumlarda modellerde güncelleme yapmalısınız. Bu iyi bir MLOps döngüsünün en önemli işlem adımlardan biri!

Model Geliştirme Yaşam Döngüsü (https://data.solita.fi/mlops-from-data-scientists-computer-to-production/)

1. Veri Kayması (Data Drift) Tespiti

Veri kaymasını tespit edebilmek için sektörde kullanılan birçok yöntem ve araç bulunur.

Öncelikle modelimizi besleyen veri ve model tahmininde kullanacağımız veri arasında önemli bir farklılık (kayma) olup olmadığını Python’da Kolmogorov-Smirnov (K-S) Testi yardımıyla tespit etmeye çalışalım.

Kolmogorov-Smirnov (K-S) testi, iki veri kümesinin aynı dağılımdan gelip gelmediğini belirlemek için kullanılan parametrik olmayan bir istatistiksel testtir. Genellikle bir veri örneğinin belirli bir popülasyondan gelip gelmediğini veya aynı popülasyondan gelip gelmediklerini test etmek için kullanılır. Burada Sıfır Hipotezi (H0) iki veri kümesinin aynı dağılımda olduğunu belirtirken, Alternatif Hipotez (H1) veri kümelerinin farklı dağılımlarda olduğu söyler.

Bunun için Sklearn kütüphanesi içerisinde bulunan California Housing veri setini kullanalım.

from sklearn import datasets

california_housing = datasets.fetch_california_housing(as_frame=True).frame
california_housing
Çalışmada Kullanılacak Veri Seti

NOT: İkinci bölümde oluşturacağımız raporda çıktılarımızı görebilmek için hedef değişkenimizi barındıran sütunun isminin target, tahminlerimizin bulunduğu sütunun isminin ise prediction olması gerekmektedir!

# Sütun ismi değiştirme
california_housing.rename(columns={'MedHouseVal': 'target'}, inplace=True)

Şimdi örnek olması açısından veri setimizi 2 parçaya bölelim ve bu parçaların Ev Yaşları (HouseAge) arasındaki uyumluluğu test edelim.

from scipy.stats import ks_2samp

new_data = california_housing.tail(10320) # Son 10320 Veri
old_data = california_housing.head(10320) # İlk 10320 Veri

ks_2samp(old_data.HouseAge, new_data.HouseAge)[1] # P Value Değerine Erişme

2 örneklemli Kolmogorov-Smirnov (K-S) testimiz, bize test sonucunda elde edilen p-value değerini8.628087865866243e-274 olarak verdi. Bu sonuç bizim H0 hipotemizi reddetmemiz gerektiğini gösteriyor. Yani, seçtiğimiz veri kümelerinin aynı dağılımda olmadığını (veri kayması) söylüyor. Şimdi bu durumu bir de görseller üzerinden inceleyelim.

import matplotlib.pyplot as plt

plt.figure(figsize=[15,5])
plt.subplot(1,2,1)
plt.hist(old_data.HouseAge, bins=25)
plt.title('House Age on Old Data');

plt.subplot(1,2,2)
plt.hist(new_data.HouseAge, bins=25)
plt.title('House Age on New Data');
Ayırdığımız Eski ve Yeni Verilerin Ev Yaşı Dağılımları

Şimdi de aynı işlemi Evidently kütüphanesini kullanarak yapmayı deneyelim.

Evidently, veri bilimcileri ve makine öğrenimi mühendisleri için açık kaynaklı bir Python kütüphanesidir. Doğrulamadan üretime kadar verilerin ve makine öğrenimi modellerinin değerlendirilmesine, test edilmesine ve izlenmesine yardımcı olur. Tablo ve metin verileri ile çalışabilir. Daha detaylı bilgi için:

Bunun için evidently kütüphanesinin Report, DataDriftTable ve DatasetDriftMetric fonksiyonlarından yararlanacağız.

from evidently.report import Report
from evidently.metrics import DataDriftTable, DatasetDriftMetric

# Raporda incelenmek istenen metriklerinin belirlenmesi
data_drift_dataset_report = Report(metrics=[DatasetDriftMetric(),
DataDriftTable()])

# İlk ve ikinci veri seti kullanılarak raporun oluşturulması
data_drift_dataset_report.run(reference_data=old_data, current_data=new_data)
data_drift_dataset_report

Bu işlemlerin ardından bizi üzerinde interaktif inceleme yapabileceğimiz güzel bir dashboard karşılayacak.

Buradaki dashboard bize birçok güzel bilgi sağlıyor. Örneğin;

  • Veri setimizin %62.5'inde veri kayması olması veri setimizin genelinde dikkate alınması gereken bir kayma olduğunu söylüyor
  • HouseAge sütunda ise bir veri kayması tespit edildiği ve bu kaymanın daha iyi anlaşılması için detaylarını görseller yardımıyla incelememize olanak sağlıyor.

Buradaki grafiklerin ve açıklamaların ne anlama geldiğinin açıklamalarına erişmek için https://docs.evidentlyai.com/presets/data-drift adresini ziyaret edebilirsiniz.

2. Kavram Kayması (Concept Drift) Tespiti

Yukarıdaki örnek senaryolarla veri setlerimizde zamanla oluşabilecek veri kaymalarını tespit etme yöntemleri hakkında bilgi sahibi olduk. Şimdi ise sıra kavram kaymasına geldi.

Kavram kaymasını tespit etmek için;

  • Zamanla değişen model performans metriklerini kıyaslayabilir
  • Özellikler ve hedef değişken arasındaki korelasyon değişimlerini inceleyebilir
  • Alan bilginizi kullanarak o günün şartlarına göre sezgisel tespitler yapabilirsiniz.

Hadi bizde bu durumları kendi veri setimizde incelemeye çalışalım.

Bunun için öncellikle yukarıda old_data ve new_data olarak ayırdığımız veri setlerini kullanarak birer tane model oluşturmamız lazım.

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# Modelde kullanılacak özellikleri ve hedef değişkeni tanımlama
X = old_data.drop(columns='target')
y = old_data.target

# Eğitim ve test için kullanılacak veri setlerini ayırma
X_train_first, X_test_first, y_train_first, y_test_first = train_test_split(X, y, test_size=0.3, random_state=42)

# Random Forest algoritmasını kullanarak Regresyon modeli oluşturma
rf_first = RandomForestRegressor()
rf_first.fit(X_train_first, y_train_first)
# Modelin R2 başarısını görüntüleme
print(f'R2 Score: {rf_first.score(X_test_first, y_test_first)}')

# Test veri setini kullanarak model tahminlerinin alınması
test_data_first = pd.concat([X_test_first, y_test_first], axis=1)
test_data_first['prediction'] = rf_first.predict(X_test_first)

İlk modelimiz bize test veri setinde yaklaşık 0.845'lik bir R2 değerine ulaştığını söylüyor. Şimdi aynı işlemi diğer veri setimiz için de uygulayalım.

X = new_data.drop(columns='target')
y = new_data.target

X_train_second, X_test_second, y_train_second, y_test_second = train_test_split(X, y, test_size=0.3, random_state=42)

rf_second = RandomForestRegressor()
rf_second.fit(X_train_second, y_train_second)
print(f'R2 Score: {rf_second.score(X_test_second, y_test_second)}')

test_data_second = pd.concat([X_test_second, y_test_second], axis=1)
test_data_second['prediction'] = rf_first.predict(X_test_second)

İkinci modelimizin ise yaklaşık 0.816'lık bir R2 değeri elde ettiğini görüyoruz. Metrik olarak değerlendirildiğinde aralarında ciddi bir fark gözükmese de bu analizi daha da detaylandırarak, modellerimizin neyi yapıp neyi yapamadığını daha iyi anlayabiliriz.

Bunun için tekrardan Evidently kütüphanesinin bizlere sunmuş olduğu raporlardan biri olan RegressionPreset raporundan yararlanacağız.

from evidently.metric_preset import RegressionPreset

# Regresyon modelleriyle ilgili birçok raporu bir arada sunan rapor
model_drift_report = Report(metrics=[RegressionPreset()])

# Tahminleri barındıran ilk ve ikinci veri seti kullanılarak raporun oluşturulması
model_drift_report.run(reference_data=test_data_first, current_data=test_data_second)
model_drift_report

Buradaki grafiklerin ve açıklamaların ne anlama geldiğinin açıklamalarına erişmek için https://docs.evidentlyai.com/presets/reg-performance adresini ziyaret edebilirsiniz.

--

--