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: Sklearn model broadcast on Spark

Ş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

  1. Kapak görseli Laura Rivera on Unsplash

Yazar Hakkında
Toplam 177 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara