Makine Öğrenmesi Modelini joblib ve pickle ile Kaydetme, Yükleme ve Sürümleme
Eğitilmiş bir modeli her seferinde yeniden eğitmek zorunda kalmamak için diske kaydedersiniz. joblib ve pickle ile kaydetmeyi, modeli yüklemeyi, ön işleme adımlarını birlikte saklamayı ve sürüm uyumu ile güvenlik risklerini yönetmeyi öğrenirsiniz.
Bir bakışta
- Model kaydetmek, eğitilmiş nesnenin diske yazılıp daha sonra aynen geri yüklenmesidir. Böylece tahmin için her seferinde yeniden eğitim gerekmez.
- Büyük sayısal dizilere sahip modellerde joblib sık tercih edilir. Python'un yerleşik pickle yöntemi de aynı işi görür; joblib büyük dizileri daha verimli işler.
- Yalnız modeli değil, ön işleme adımlarını da birlikte kaydedin. Pipeline kaydetmek, eğitimdeki dönüşümün tahminde de aynen uygulanmasını güvenceye alır.
- Kayıt dosyası kütüphane sürümüne bağlıdır. Farklı sürümde yüklemek hata verebilir ya da sessizce farklı davranabilir; sürümü kaydedin.
- Kaynağından emin olmadığınız bir model dosyasını yüklemeyin. Pickle tabanlı dosyalar yüklenirken kod çalıştırabilir.
Model kaydetmek neden gerekir?
Bir modeli eğitmek dakikalar, saatler hatta günler sürebilir. Tahmin ise çoğu zaman milisaniyeler alır. Eğitimin sonunda modelin öğrendiği değerleri, yani ağırlıkları ve parametreleri diske yazarsanız, aynı modeli sonradan yeniden eğitmeden yükleyip tahmin yapabilirsiniz. Üretimde bir uygulama, rapor betiği ya da başka bir ekip bu kayıt dosyasını kullanır.
Kaydetmek aynı zamanda tekrarlanabilirliktir. Bir sonuç raporladığınızda hangi modelle elde edildiğini göstermeniz gerekir. Kayıtlı ve etiketli bir model dosyası, o sonucun yeniden üretilebilmesini sağlar. Model değiştiğinde eskisini kaybetmeden geri dönebilmek de buna bağlıdır.
Python'da bu işi iki yaygın araç yapar: yerleşik pickle modülü ve joblib kütüphanesi. İkisi de bellekteki bir Python nesnesini dosyaya yazıp geri okur. Derin öğrenme çerçevelerinin kendi kayıt biçimleri de vardır.
joblib ile kaydetme ve yükleme
scikit-learn modelleri için en sık kullanılan yol joblib'dir. Önce modeli eğitirsiniz, sonra tek satırla kaydedersiniz:
import joblib
model.fit(X_egitim, y_egitim) joblib.dump(model, "model.joblib")
Yüklemek için:
yuklenen = joblib.load("model.joblib") tahmin = yuklenen.predict(X_yeni)
Yüklenen nesne, kaydedilen modelin birebir aynısıdır; predict ve diğer yöntemleri doğrudan çalışır. Dosya adındaki uzantı bir gelenektir, kütüphane için bir zorunluluk değildir; yine de uzantıyı tutarlı kullanmak dosyaların ne olduğunu belli eder.
joblib özellikle büyük sayısal dizilere sahip modellerde, örneğin çok sayıda ağaçtan oluşan bir topluluk modelinde, pickle'a göre daha verimli çalışır. Yerleşik pickle ile aynı işi şöyle yaparsınız:
import pickle
with open("model.pkl", "wb") as dosya: pickle.dump(model, dosya)
with open("model.pkl", "rb") as dosya: yuklenen = pickle.load(dosya)
İkisinden hangisini seçerseniz seçin, dosyayı ikili (binary) modda açtığınızdan emin olun.
Pipeline kaydetmek: ön işlemeyi de saklayın
Yalnız modeli kaydedip ön işlemeyi kaydetmemek en sık yapılan hatalardan biridir. Eğitimde ölçekleme, kategorik kodlama ya da eksik değer doldurma uyguladıysanız, tahminde de aynı dönüşümü aynı parametrelerle uygulamanız gerekir. Ölçekleyicinin eğitimde öğrendiği ortalama ve yayılım, yeni veride yeniden hesaplanırsa sonuç tutarsız olur.
Çözüm, ön işleme ve modeli tek pipeline nesnesinde birleştirip bütünüyle kaydetmektir:
from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression
boru = make_pipeline(StandardScaler(), LogisticRegression()) boru.fit(X_egitim, y_egitim) joblib.dump(boru, "boru.joblib")
Yüklenen nesne ham girdiyi alır, aynı ölçeklemeyi uygular ve tahmin döndürür. Böylece üretimde ayrı bir ön işleme kodu yazmaz, kodlama farklarından doğan hataları engellersiniz.
Pipeline kullanmıyorsanız ölçekleyici ve kodlayıcı gibi tüm dönüşüm nesnelerini de ayrı ayrı kaydedin ve yüklerken aynı sırayla uygulayın. Özellik sırasını ve sütun adlarını da belgeleyin; model beklediği sırada veri gelmezse yanlış tahmin üretebilir.
Sürüm uyumu ve güvenlik
Kayıt dosyası, modeli eğiten kütüphanenin iç yapısına bağlıdır. Dosyayı farklı bir kütüphane sürümüyle yüklediğinizde uyarı alabilir, hata görebilir ya da daha kötüsü modelin sessizce farklı davranmasıyla karşılaşabilirsiniz. Bu yüzden modeli kaydettiğiniz ortamın Python ve kütüphane sürümlerini mutlaka kayda geçirin. Bir bağımlılık dosyası ya da ortam özeti, modelle birlikte saklanması gereken en önemli yardımcı belgedir.
Güvenlik ayrı bir uyarıdır. pickle tabanlı dosyalar yüklenirken, içine gömülmüş kodu çalıştırabilir. Bu yüzden kaynağından emin olmadığınız bir model dosyasını yüklemeyin; yalnız kendi ürettiğiniz ya da güvenilir bir kanaldan aldığınız ve bütünlüğünü doğruladığınız dosyaları açın. Modeli dışarıdan alıyorsanız dosyanın özetini (hash) kontrol etmek ve dosyayı yalıtılmış bir ortamda denemek iyi bir önlemdir.
Uzun ömürlü ya da dil bağımsız ihtiyaçlarda alternatif biçimler de vardır. Farklı dil ve platformlarda çalışacak modeller için ortak değişim biçimleri, derin öğrenme için çerçevenin kendi kayıt biçimi kullanılır. Hangi biçimin ne kadar desteklendiği çerçeveye göre değişir; güncel durumu ilgili kütüphanenin belgelerinden kontrol edin.
Kayıt biçimi, modelin türüne ve kullanım yerine göre seçilir
Hangi yolu seçmeli?
- scikit-learn modeli, aynı Python ortamında kullanılacakjoblib ile kaydetBüyük sayısal dizilerde verimlidir.
- Küçük model, yalnız standart kütüphane isteniyorpickle ile kaydet
- Derin öğrenme modeliÇerçevenin kendi kayıt biçimiAğırlık ve mimari birlikte saklanabilir.
- Başka dil ya da platformda çalışacakOrtak değişim biçimiDesteği ilgili belgeden kontrol edin.
Sürümleme: modeli düzenli adlandırmak ve izlemek
Modelleri model.joblib gibi tek bir adla bırakıp üzerine yazmak, hangi sonucun hangi modelden geldiğini kaybettirir. En basit sürümleme alışkanlığı, dosya adına model türünü, eğitim tarihini ya da sürüm etiketini yazmaktır. Bir adım ileri gidip her modelin yanına küçük bir üst veri dosyası koymak çok yararlıdır: eğitimde kullanılan veri kümesi, özellik listesi, hiperparametreler, değerlendirme sonuçları ve kütüphane sürümleri.
Ekip büyüdüğünde ya da model sayısı arttığında dosya adlarıyla yönetim yetmez. Model kayıt defterleri, her model sürümünü kaydeder, aşamalarını (deneme, hazırlık, üretim gibi) izler ve geri dönüşü kolaylaştırır. Bu kavram ayrı bir konudur ve model kayıt defteri sözlük sayfasında ele alınır.
Veri sürümünü de unutmayın. Aynı kod farklı veriyle farklı model üretir; modelin hangi veri sürümüyle eğitildiğini kayıt altına almak, sonradan sorun çıktığında nedeni bulmanızı sağlar. Kaydedilen modeli yükleyip basit bir sağlama testi, yani bilinen bir girdi için beklenen çıktıyı kontrol etmek de dağıtımdan önce iyi bir alışkanlıktır.
Sık yapılan hatalar ve sonraki adım
Sık yapılan hatalar:
- Ön işleme adımlarını kaydetmeden yalnız modeli saklamak.
- Kütüphane sürümünü not etmemek.
- Güvenilmeyen kaynaktan model dosyası yüklemek.
- Dosyayı ikili mod yerine metin modunda açmak.
- Modelin üzerine yazarak eski sürümü kaybetmek.
- Yüklenen modeli tahminden önce sağlama testine sokmamak.
- Model dosyasını koda ya da gizli bilgilerle birlikte açık bir depoya koymak.
Model dosyası hazır olduğunda sıradaki adım onu bir uygulamanın kullanabileceği biçimde sunmaktır. Bunun yolları, yani modeli bir ağ hizmeti olarak yayımlamak, ayrı bir konudur ve modeli API olarak sunma sayfasında anlatılır. Kaydetme adımı, o sunumun güvenilir olması için gerekli temeli oluşturur: aynı dosyayı yükleyen her ortam aynı tahmini üretmelidir.
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Makine Öğrenmesi (Uygulamalı) Programı, model doğrulama ve hiperparametre optimizasyonundan sonra modeli üretime taşıma ve bitirme projesi modülüyle biter. Eğittiği modeli bir uygulamaya teslim etmesi gereken veri bilimciler için uygundur.
Veri Bilimi Sertifika Programı MLOps ve yorumlanabilirlik konularını, Data Science Bootcamp ise Python temellerini içerir.
İlgili Mindset programı
Makine Öğrenmesi (Uygulamalı) Programı
Sık sorulan sorular
joblib ile pickle arasındaki fark nedir?
İkisi de Python nesnelerini diske yazar. pickle yerleşik bir modüldür; joblib ise büyük sayısal dizili nesneleri, örneğin birçok makine öğrenmesi modelini, daha verimli kaydeder. scikit-learn modelleri için joblib sık tercih edilir; küçük modellerde ikisi de iş görür.
Kaydettiğim modeli başka bilgisayarda yükleyebilir miyim?
Evet, ancak Python ve kütüphane sürümleri uyumlu olmalıdır. Sürümler farklıysa uyarı, hata ya da farklı davranış görebilirsiniz. Modeli eğittiğiniz ortamın bağımlılıklarını kaydedin ve hedef ortamda aynısını kurun.
Pickle dosyası güvenli midir?
Yalnızca kaynağını bildiğiniz dosyalar için. pickle tabanlı dosyalar yüklenirken içlerindeki kodu çalıştırabilir. İnternetten ya da tanımadığınız birinden gelen model dosyasını, doğrulama yapmadan yüklemeyin.
Derin öğrenme modellerini de joblib ile kaydedebilir miyim?
Genellikle önerilmez. Derin öğrenme çerçevelerinin kendi kayıt yöntemleri ağırlıkları ve mimariyi uygun biçimde saklar. Hangi yöntemin hangi sürümlerle uyumlu olduğunu çerçevenin güncel belgelerinden kontrol edin.
Modeli ne zaman yeniden kaydetmeliyim?
Her yeniden eğitimde yeni bir sürüm olarak kaydedin ve eskisinin üzerine yazmayın. Veri, özellikler ya da hiperparametreler değiştiğinde de yeni sürüm gerekir. Üst veri dosyasıyla hangi değişikliğin yapıldığını not edin.