Scikit-Learn Spark Deployment
Makine öğrenimi modelleri, günümüzde birçok alanda veri analizinin ve tahminlerin temelini oluşturuyor. Scikit-learn ise en başından beri Python ile yapılan çalışmalarda, basit arayüzü ve geniş algoritma yelpazesi ile ML çalışmalarında en yaygın kütüphane. Ancak, scikit-learn ile büyük veri kümelerinde çalışmak, performans ve ölçeklenebilirlik açısından bazı zorluklar doğurabiliyor. Bu noktada, büyük veri üzerindeki başarısıyla meşhur Apache Spark devreye giriyor. Spark’ın büyük veri üzerindeki başarısı dağıtık çalışabilmesine ve muazzam ölçeklenme kabiliyetine bağlı. Scikit-lean ML geliştirmede ne kadar başarılı ise Spark da dağıtık veri işlemede o kadar başarılı.
Pandas&scikit-learn ikilisiyle yapılan makine öğrenmesi çalışmalarını Spark ile de yapabiliriz. Çünkü Spark’ın da ML kütüphanesi var ve bu konuda scikit-learn’den esinleniyor. Ancak dağıtık olarak bir çok algoritmayı yazmanın zorluğundan kaynaklı kütüphane zenginliği scikit-learn kadar değil.
Bu yazının çözmeye çalıştığı sorun şu: Model geliştirmeyi pandas&scikit-learn ile yaptım ancak modelin kullanılacağı ortam büyük veri ortamı ve rada Spark var. ben bu sklearn modelini Spark data frame üzerinde kullanabilir miyim? Evet kullanabilirsiniz. hem de dağıtık olarak. Spark’ın broadcast özelliği ile model tüm executor’lara dağıtılır ve her veri parçası paralel olarak tahminlemeye girer. Dolayısıyla buradaki durum Spark’ın avantajlarını model eğitiminde kullanmaktan ziyade model ile tahminleme yapmaya dair. Aşağıda anlamamıza yardımcı olacak şekli görüyoruz.
Şekil-1’deki sklearn logosu spark broadcast ile her bir executor’a gönderilmiş sklearn modelini temsil ediyor. 3 executor üzerinde bir çok parça ile aynı anda tahminleme yapılabilmesini sağlıyor.
Bu blog yazısında, scikit-learn modellerinin Spark üzerinde deploy edilmesini anlatan bir örnek sunacağız. Bu örnekte, Spark’ın brodcast özelliğini kullanarak modelin paralel olarak dağıtık veri setleri üzerinde prediction için kullanılmasını sağlayacağız. Bu örnek ve pratik ipuçları, scikit-learn modellerinizi Spark ile kolayca deploy etmenize yardımcı olacaktır.
Ortam:
Spark versiyon: 3.5.1
Python versiyon: 3.8.10
IDE: Jupyter Lab
Scikit-Learn ile Model Geliştirme
Model geliştirelim. Modelimiz basit olacak. Advertising verisi ile basit bir regresyon yapacağız.
import pandas as pd
Veriyi Okuyalım
df = pd.read_csv("https://raw.githubusercontent.com/erkansirin78/datasets/master/Advertising.csv") print(df.head())
Çıktısı:
ID TV Radio Newspaper Sales 0 1 230.1 37.8 69.2 22.1 1 2 44.5 39.3 45.1 10.4 2 3 17.2 45.9 69.3 9.3 3 4 151.5 41.3 58.5 18.5 4 5 180.8 10.8 58.4 12.9
Model Problemi
TV, Radyo ve Gazete ilanları için ödenen reklam bütçesi x1000 dolar karşılığında ne kadar satış olmuş? Sales x1000 adet.
Bağımsız değişkenler
# Feature matrix X = df.iloc[:, 1:-1].values print(X.shape) print(X[:3])
Çıktı
(200, 3) [[230.1 37.8 69.2] [ 44.5 39.3 45.1] [ 17.2 45.9 69.3]]
Bağımlı/Hedef değişken
# Output variable y = df.iloc[:, -1] print(y.shape) print(y[:6])
Çıktı
(200,) 0 22.1 1 10.4 2 9.3 3 18.5 4 12.9 5 7.2 Name: Sales, dtype: float64
Eğitim ve test setleri
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
Model eğitimi
from sklearn.ensemble import RandomForestRegressor estimator = RandomForestRegressor(n_estimators=200) estimator.fit(X_train, y_train)
Model testi
y_pred = estimator.predict(X_test) from sklearn.metrics import r2_score r2 = r2_score(y_true=y_test, y_pred=y_pred) print(f"R2: {r2}")
Çıktı
R2: 0.9822621361303673
R2 değerine göre model başarısı gayet yüksek görünüyor.
Modeli diske kaydet
import joblib joblib.dump(estimator, "randomforest_with_advertising.pkl")
Modeli diskten okuma
estimator_loaded = joblib.load("randomforest_with_advertising.pkl")
Diskten okunan model ile elle hazırlanan bazı setlerle tahmin yapma.
X_manual_test = [[230.1,37.8,69.2]] print("X_manual_test", X_manual_test) prediction = estimator_loaded.predict(X_manual_test) print("prediction", prediction)
Scikit-learn modelin Spark ortamında Spark DataFrame Üzerinde Deployment’ı
Spark ortamımız lokal olacak.
Spark Session ve SparkContext
from pyspark.sql import DataFrame, Column, SparkSession spark = SparkSession.builder.appName("Spark ML").master("local[*]").getOrCreate() sc = spark.sparkContext
Tahmin verisetinin spark ile okunması
from pyspark import SparkFiles github_url="https://raw.githubusercontent.com/erkansirin78/datasets/master/Advertising.csv" sc.addFile(github_url) df = spark.read.csv(SparkFiles.get("Advertising.csv"),header= True, inferSchema=True) df.show(5)
Çıktı
+---+-----+-----+---------+-----+ | ID| TV|Radio|Newspaper|Sales| +---+-----+-----+---------+-----+ | 1|230.1| 37.8| 69.2| 22.1| | 2| 44.5| 39.3| 45.1| 10.4| | 3| 17.2| 45.9| 69.3| 9.3| | 4|151.5| 41.3| 58.5| 18.5| | 5|180.8| 10.8| 58.4| 12.9| +---+-----+-----+---------+-----+ only showing top 5 rows
Prediction fonksiyonu
def prediction(df:DataFrame, model, spark_context:SparkContext) -> Column: """ Predicts using a given model and a Spark dataframe. Parameters ---------- df : pyspark.sql.dataframe.DataFrame Spark dataframe containing the data to be predicted model : object Model object to be used for prediction spark_context : Spark Context Spark Context instance Returns ------- pyspark.sql.column.Column Spark dataframe column containing the predicted values """ model = spark_context.broadcast(model) @udf('integer') def predict_data(*cols): return int(model.value.predict((cols,))) return predict_data(*df.columns)
Spark DataFrame üzerinde Prediction
df_pred = df.withColumn("PREDICTION", prediction(df=df.select('TV','Radio','Newspaper'), model=estimator_loaded, spark_context=sc)) df_pred.show(5)
Çıktı
+---+-----+-----+---------+-----+----------+ | ID| TV|Radio|Newspaper|Sales|PREDICTION| +---+-----+-----+---------+-----+----------+ | 1|230.1| 37.8| 69.2| 22.1| 21| | 2| 44.5| 39.3| 45.1| 10.4| 10| | 3| 17.2| 45.9| 69.3| 9.3| 8| | 4|151.5| 41.3| 58.5| 18.5| 18| | 5|180.8| 10.8| 58.4| 12.9| 13| +---+-----+-----+---------+-----+----------+ only showing top 5 rows
Tahminler artık Spark DataFrame’in bir parçası.
Tüm kodları içeren notebook burada.
Model deployment ve daha fazlası için kendinizi geliştirmek istiyorsanız MLOps Videocamp tam size göre.
Bu yazımız da bu kadar. Bir sonrakine dek hoşça kalın…
Kaynaklar
- Kapak görseli Laura Rivera on Unsplash