Uçtan Uca ML Pipeline Nedir? Ne İşe Yarar?
Günümüzde makinelerin, arabaların ve envai çeşit ürünün otonomlaştığı bu devirde makine öğrenmesi modellerimiz neden otonomlaşmasın? MLOps kavramı gün geçtikçe daha büyük yer kaplamaya başladı. Modellerin manuel oluşumlardan kurtarılıp düzenli, tekrarlı ve yeniden üretebilir noktaya taşınması gün be gün önem kazanıyor. Peki bu süreci bir temele oturtmak istesek ve büyük resmi görmeye çalışsak nasıl yapardık? İşte burada ML Pipeline devreye giriyor.
ML Pipeline Nedir? Ne İşe Yarar?
Makine öğreniminin gücünden ve etkisinden yararlandıkça kurumlar ve şirketler, birden fazla projede modeller geliştirmekte ve bu modelleri canlıya almaktadırlar. Modellerin sayısı artıkça kontrol edilebilirliğin ve otomize süreçlerin ihtiyacı doğmuştur. ML pipeline(ardışık düzenler), makine öğrenmesi modelleri üretebilmek için gereken iş akışlarını otomize etmenin bir yoludur. Bir ML pipeline, bu süreçlerin standartlaştırılmasına, takip edilebilir kılınmasına ve daha doğru modeller kurulmasına yardımcı olur.
ML pipeline modelin ön hazırlığından canlıya alınmasını ve hatta sonrasında devam eden süreçlerin hepsini kapsar ve bir döngüye alır. Bunu her bir adımı ayırarak modüler bir yaklaşım ile sağlar. Daha anlaşılır açıklamak gerekirse bu yaklaşım veri ayıklama ve ön işlemeden model eğitim ve modelin deploy edilmesine kadar ardışık adımları benzersiz ve orantılı bir şekilde böler. Bu modüler yaklaşım, kuruluşların makine öğrenimi modellerini bütünsel bir şekilde görmelerine yardımcı olarak uçtan uca süreci düzenlemelerine ve yönetmelerine destek sağlar.
ML Pipeline Yararları Nelerdir?
Ml pipeline’ın yararlarını anlamak adına hepimizin geçtiği yollara bakmakta fayda var. Örneğin bir modeli canlı ortama çıkarttığımız süreçte modelin çalışması ile hataların gelmesi de muhtemeldir ve veri bilimciler olarak bizlerin sadece bir modele ve o modelin çıkartacağı hatalara konsantre olması normaldir. Eğer elimizde bir model varsa bu sorunun üstesinden gelmek kolaydır. Peki ya elimizde birden fazla model varsa?
Yoğun iş temposu içinde farklı iş yüklerimizi göz önüne aldığımızda birden fazla modelin yaşattığı hatalara ne kadar konsantre olabiliriz? Bu hatalar beklenmedik anlarda ortaya çıkarsa nasıl kontrol altına alabiliriz?
Başka bir pencereden bakmak gerekirse dünya hızla değişiyor. Her gün milyonlarca veri üretiliyor ya da beklenmedik olaylar ile karşılaşılıyor. Örneğin pandemi, bir anda tüm yaşamımıza etki etti ve 4 sene içinde hayatımızda birçok alana tesir etti. Bu değişim ve etkiler kurduğumuz modelleri teğet geçer mi? Bugün kurduğumuz model yarın eskimeye başlamıştır bile. Bu sebeple modellerin güncelliğini sağlamalıyız. Peki bunu ne sıklıkla yapmalıyız? Bu güncellemelerin versiyonlarını nasıl kontrol edebiliriz?
Manuel ML öğrenim süreçleri otomize olmadıkları zaman bir kişiye ait olurlar. Yani bir makine öğrenimi sürecinde karşılaşılan hatalar ya da yapılan geliştirmeler kişi bazlı sınırlanabilir. Burada gerekli olan know-how aktarımı dokümanlar ile yapılarak süreç başkalarına aktarılmak istense de bu aktarım verimli olmayabilir ya da localde yazılan bir kod o localde kalır. Manuel veya komut dosyasına dayalı süreç o model üzerinde çalışan (bilimci, mühendis, analist) paydaşlar arasında bir kopukluk doğurabilir. Performans izleme ve sürüm kontrolü adına yanlışlar doğabilir.
Tüm bunlara ek olarak pipelinelar, veri bilimciler diğer aşamaları hazırlamaya odaklanırken, modellemenin bölümlerini (veri ön işleme gibi) otomatik olarak çalıştırabileceği anlamına da gelir. Bu aynı zamanda insani hataları arındırmaktır. ML pipelinelar paralel olarak çalıştırılabilir, bu da sürecin verimliliğini artırır. Her aşama açıkça tanımlanıp optimize edildiğinden, süreç kolayca ölçeklenebilir ve makine öğrenimi pipelineları yeniden kullanılabilir ve yeni model ihtiyaçlarını karşılayacak şekilde uyarlanabilir. Bu da bizi büyük bir iş yükünden kurtarmış olur.
Bir Pipeline Oluştururken Neler Göz Önünde Bulundurulmalı?
Öncelikle veri toplama sürecinden başlayıp canlı ortama kadar her adım göz önünde bulundurulmalı ve parça parça bölünmelidir. Bu bölünmüş parçalar birbirine bağlanmalıdır. Böylelikle hatalara anında müdahale edilecek alan küçültülmüş olur ve aynı zamanda uçtan uca makine öğrenimi döngüsü oluşur. Bu süreci oturturken/oturttuktan sonra testler devam etmelidir, döngü izlenmelidir ve pipeline süreç içerisinde optimize edilmelidir.
Pipeline MLOps’un Neresinde?
Makine öğrenim süreci uçtan uca birçok birimin farklı adımlarda ortak çalışmasını kapsar. Pipeline ise farklı adımlardaki ortak çalışmaları etkili bir biçimde birbirine bağlar. MLOps yaşam döngüsü ise eğitim, dağıtım ve modelin devam eden optimizasyonunu kapsar. Bu sebeple pipeline, daha etkili yönetim biçimi olarak kullanılan MLOps’un içindedir.
ML Pipeline Mimarisi
Her pipeline, üzerine kurulan modele göre değişimler gösterebilir. Bu değişimler kurumların hedeflerine ve projelerin büyüklüğüne göre de şekillenebilir. Fakat pipeline’ların ortak özellikleri vardır. Bunlar sırayla;
· Veri toplama ve temizleme
· Veri doğrulama
· Modelin eğitimi
· Modelin değerlendirilmesi ve doğrulanması
· Optimizasyon ve yeniden eğitimdir.
Bunlara ek olarak pipeline’ın monitör edilmesi, test süreçleri, pipeline versiyonları ve optimizasyonlar da olmazsa olmaz bir süreçtir. Benzer yapılar ve kurumların özelleştirdiği yapılar arasında kurulan pipeline’lar veri alımından canlıya giden süreçleri kontrol edecek, optimize edilerek etkili, güncel, başarısı yüksek ve kişiden bağımsız modeller çıkartmamızı sağlayacaktır.
ML Pipeline Uygulaması
İlk olarak kullanılacak kütüphaneler eklenir.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score,f1_score,precision_score,recall_score
Ardından modelleme için kullanılacak veri import edilir.
data = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/diabetes.csv", sep=",")
Modelleme kısmı için veri train ve test olarak ayrılır. Test verisi oranı 0.2 olarak verilmiştir.
train,test = train_test_split(data,test_size=0.2)train_x = train.drop(["Outcome"],axis=1)
train_y = train["Outcome"]
test_x = test.drop(["Outcome"],axis=1)
test_y = test["Outcome"]
Create Pipelines
Modelleme için 3 model denenmiştir. Bu modeller CART, Logistic Regression ve Random Forest modelleridir.
3 model için Pipeline oluşturulması sağlanır.
- MinMax Scaler ile data preprocessing
- PCA ile boyut indirgeme
- Modelin eğitilmesi işlemleri her bir model için sağlanmaktadır.
1. Decision Tree (CART) Pipeline
Pipeline için sklearn kütüphanesinde yer alan Pipeline fonksiyonundan yararlanılmaktadır. Modelde PCA, Min-Max scale ve model eğitme işlemini sağlayacak bir pipeline yazılmıştır.
Verbose parametresinde eğer “True” değeri verilirse, her bir adım sonrası geçen sürenin yazılması sağlanacaktır.
DecisionTreePipeline = Pipeline([('pca', PCA(n_components = 3)),
('myscaler', MinMaxScaler()),
('decision_tree', DecisionTreeClassifier())], verbose = True)
Logistic Regression Pipeline
LogisticPipeline = Pipeline([('pca', PCA(n_components = 3)),
('myscaler', MinMaxScaler()),
('logistic_regression', LogisticRegression())], verbose = True)
Random Forest Pipeline
RandomForestPipeline = Pipeline([('pca', PCA(n_components = 3)),
('myscaler', MinMaxScaler()),
('random_forest', RandomForestClassifier())], verbose = True)
Model Training
Bu adımda oluşturulan pipeline’lar üzerinden modellerin eğitimi sağlanmaktadır.
Pipelines = [DecisionTreePipeline,LogisticPipeline,RandomForestPipeline]
En iyi modelin seçimi için değişkenler tanımlanır.
classifier = 0.0
accuracy = 0.0
pipeline = ""
Pipeline için bir dictionary oluşturulur ve model eğitilir.
pipelineDic = {0:'Decision Tree',1:'Logistic Regression', 2:'Random Forest'}for pipe in Pipelines:
pipe.fit(train_x,train_y)
Her bir model için test accuracy değerlerinin hesaplanması sağlanır.
for i,model in enumerate(Pipelines):
print("{} Test Accuracy: {}".format(pipelineDic[i],model.score(test_x,test_y)))
for i,model in enumerate(Pipelines):
if model.score(test_x,test_y)>accuracy:
accuracy = model.score(test_x,test_y)
pipeline = model
classifier = i
print('En iyi model: {}'.format(pipelineDic[classifier]))
ML pipeline performansı ve etkinliği temel olarak belirlediği için veri ile uğraşanların makine öğrenimi süreçlerinin merkezinde olmalıdır. Sonuç olarak eğer canlı ortamda bir veya birden fazla ML modeliniz varsa bunları yönetmek ya da güncel tutmak istiyorsanız pipeline olmazsa olmaz bir yardımcıdır.
Yararlanılabilecek Kaynaklar: