Scikit-Learn Modellerini Kalıcı Olarak Kaydetme

By | 10 Mart 2016

Hali hazırda çalıştığım robotik projesinin bir kısmında, lazer verilerini kullanarak karşıdaki cismi sınıflandırmam gerekti. Yapay sinir ağı bile kullanmaya gerek kalmadan, çok basit bir KNN ile sorunu çözdüm. Sonrasında ise, doğal olarak, modeli kaydedip bir daha eğitmeden kullanmam gerekti.

Bunun için temelde birçok yöntem var. Hepsi de genel olarak nesne serileştirmeyi (object serialization) baz alıyor. Özetle modelinizi istediğiniz şekilde eğitiyorsunuz ve serileştirip bir dosyaya yazıyorsunuz. Sonrasında ise dosyayı taşıyıp, istediğiniz yerde birebir kullanıyorsunuz.

Hemen basit bir Scikit-Learn modeli oluşturup örneğe başlayalım. Örnekte, Iris veri setini kullanıp, bunu Gaussian Naive Bayes sınıflandırıcısına veriyorum:

Modeli örnek olsun diye aldım, şu an için doğruluk değerleri umrumda değil. Yine de merak ediyorsanız, sklearn paketinin altındaki metrics modülü ile gözatabilirsiniz. Şimdi bu modeli kaydetmek için birden fazla yol var.

pickle:

pickle modülü, Python nesnelerini serileştirmenizi sağlayan ufak ama güçlü bir kütüphane. Kullanımı oldukça basit. Tek dikkat etmeniz gereken şey, yazdıracağınız dosyayı ikili (binary) formatta kullanmanız.

Modeli daha sonradan içe aktarmak için, yine ikili (binary) formatta okuma yapıp load fonksiyonuna parametre olarak vermeniz yeterli:

cPickle:

cPickle modülü, pratikte pickle modülü ile neredeyse aynı. Tek farkı, nesne serileştirme için kullanılan algoritmaların Python yerine C ile implemente edilmiş olması. Bu nedenle, büyük ölçekli nesne serileştirme işlemlerinde daha iyi performans sağlıyor. Burada yaptığımız örnek için çok da büyük bir performans farkı yaratmayacak elbette.

Benzer bir şekilde kaydedilmiş modeli içe aktarmak için:

joblib:

Bu modül sklearn paketinin altında bulunuyor. Doğrudan Scikit-Learn modellerini serileştirmek için tasarlanmış. Diğer nesne serileştirme modüllerine nazaran, büyük Numpy dizilerini daha verimli bir şekilde taşıyor. Ama dikkat etmeniz gereken bir unsur var: Bu modül ile modelinizi serileştirip dosyaya kaydettiğinizde, modelin içindeki tüm Numpy dizileri farklı birer dosyaya kaydediliyor. Bu nedenle, modelin içe aktarılabilmesi için tüm dosyaların  aynı klasörde bulunması şart.

Kullanımı diğerlerine göre biraz daha kolay, zira dosya oluşturmakla siz uğraşmıyorsunuz:

Modeli içe aktarırken de benzer bir şekilde load metotunu kullanıyorsunuz:

Görüldüğü gibi işlemin kendisi oldukça basit. Tüm bunlarda dikkat etmeniz gereken tek şey, güvenmediğiniz kaynaklardan gelen modelleri (veya daha genel olarak serileştirilmiş Python verilerini) yüklememeniz.