22 Şubat 2020 Cumartesi

SQL Server 2019 üzerinde Makine Öğrenimi - 4 (Machine Learning Services in Database (R and Python)) (Eğitilmiş Model ile Tahminleme)

Serinin bu yazını kadar SQL Server özelliklerinden bir olan Machine Learning Services in Database özelliğini kullanabilmek için gerekli ortamı hazırladık. R ve Python gibi dillerdeki scriptlerin nasıl çalıştırıldığından bahsettik. Bir Machine Learning modeli eğittik ve SQL Server tablosunda depoladık. Bu yazıdaki işleyeceğimiz senaryoyu uygulayabilmek için önceki yazılara göz atmanızı öneririm.

Önceki yazılara şu linklerden erişebilirsiniz:

SQL Server 2019 üzerinde Makine Öğrenimi - 1 (Machine Learning Services in Database (R and Python))

SQL Server 2019 üzerinde Makine Öğrenimi - 2 (Machine Learning Services in Database (R and Python)) (Tablo ve DataFrame ile Çalışmak)

SQL Server 2019 üzerinde Makine Öğrenimi - 3 (Machine Learning Services in Database (R and Python)) (ML modeli eğitmek ve depolamak)

Bu yazımızda daha önce eğittiğimiz ve SQL Server tablosunda varbinary olarak depoladığımız modeli Python scriptinde okuyup model nesnesi haline getireceğiz. Daha sonra bu nesne yardımıyla tahminleme yapacağız.

Senaryomuz tam olarak şöyle:
  1. Daha önce varbinary olarak depoladığımız eğitilmiş modelimizi seçeceğiz.
  2. Seçtiğimiz modeli kullanarak tahminleme yaptığımız Python scriptini bir procedure ile kapsülleyeceğiz.
  3. Tahminlemek istediğimiz verileri yeni proceduree parametre olarak verip tahmin sonuçlarını görüntüleyeceğiz.
Bu yazıda SSMS ve Azure Data Studio aracını kullanabilirsiniz. Ben önceki yazılarda olduğu gibi Azure Data Studio aracını kullanmaya devam edeceğim.

Senaryomuzu adım adım işleyelim.

1- Depoladığımız modeli seçelim:


Daha önce MPGCarsDB isimli veritabanındaki mpgcars tablosunda bulunan verilerle model eğitmiş ve bu modeli mpgcars_model isimli tabloya yüklemiştik. Bu tablodan filtreleyerek seçtiğimiz modeli tahminleme yaptığımız Python kodlarına göndereceğiz.

Depoladığımız modele bakalım:

USE MPGCarsDB
GO

select * from mpgcars_model



2- Tahminleme yapacak procedureü kapsülleyen procedure yazalım:


Python scriptlerini sp_execute_external_script procedureünün @script parametresi ile çalıştırıyorduk. Bu procedureün @input_data_1 parametresine tahmin için kullanacağımız satırları veren SELECT sorgusunu yazıyoruz. Bu satırları procedure içerisinde @input_data_1_name parametresiyle belirttiğimiz mpgcars adıyla kullanabileceğiz. Tahminlemek için bir eğitilmiş modele ihtiyacımız var. Bu eğitilmiş modeli, tanımını @params parametresinde yaptığımız @modelbin isimli parametreye verip script içerisinde kullanacağız. Sonrasında tahminlemede kullanılacak satırları ve tahminleri WITH RESULT SETS ile belirttiğimiz formatta bir tablo olarak görebileceğiz. 

sp_execute_external_script procedureünü kolaylık olsun diye usp_PredictUsingModelBin isimli procedure ile kapsülleyelim ve eğitilmiş model ile SELECT sorgusunu parametrede gönderelim.

CREATE OR ALTER PROC usp_PredictUsingModelBin (@Tmodelbin varbinary(max),@rows nvarchar(500))
AS
BEGIN
EXEC sp_execute_external_script
        @language = N'Python',
        @input_data_1=@rows,
        @input_data_1_name=N'mpgcar',
        @script = N'
#modeli serileştirmek için
import pickle
import pandas as pd
import numpy as np

modelLR = pickle.loads(modelbin)
#print(modelLR)

tahminler_LR=modelLR.predict(mpgcar)
print(tahminler_LR)

gercek_tahmin_LR=np.hstack((mpgcar,tahminler_LR))

OutputDataSet=pd.DataFrame(gercek_tahmin_LR)
'
    ,@params = N'@modelbin varbinary(max)' 
    ,@modelbin = @Tmodelbin

    WITH RESULT SETS (
                (
                    cylinders int ,
                    displacement float ,
                    horsepower int ,
                    weight float ,
                    acceleration float,
                    modelyear int ,
                    origin int ,
                    mpgTahmin float
                )
            )
END

Yukarıdaki Ptyhon scriptinde pickle.loads(modelbin) satırında varbinary olarak depoladığımız eğitilmiş modeli modelLR değişkenine atadık. Artık kolayca modelLR.predict(mpgcar) satırında olduğu gibi tahmin sonuçlarını alabiliriz.

Tahmin sonuçları biz dizi olarak geliyor. Tahminleri ve tahmin için kullanılan satırları np.hstack((mpgcar,tahminler_LR)) ile birleştirip OutputDataSet değişkenine atayarak tablo formatında döndürüyoruz.

3- Tahminleri alalım:


Eğitilmiş modeli bir değişkene alalım ve yukarıda oluşturduğumuz procedureün parametrelerine ilgili değerleri vererek 4 satır için tahmin sonuçlarını görüntüleyelim.

DECLARE @trainedModel varbinary(max)
SELECT
    @trainedModel=model
FROM mpgcars_model
WHERE language='Python' and model_name='sklearn.linear_model.LinearRegression'

exec usp_PredictUsingModelBin
@Tmodelbin=@trainedModel,
@rows='SELECT * FROM (VALUES
                     (4,140,86,2790,15,82,1),
                     (4,97,67,2145,18,80,3),
                     (8,440,215,4312,8,70,1),
                     (8,455,225,3086,10,70,1)
) as t
 (cylinders,displacement,horsepower,weight,acceleration,modelyear,origin)'


Siz de farklı sayılar deneyebilirsiniz. Örneğin horsepower ve weight alanlarında değişiklik yaparak mpg (miles per galon) miktarının ne olabileceğine dair tahminleri alabilirsiniz.

Bu şekilde raw modeli deserialize edip model nesnesi elde etmek ve tahminleme yapmak hızlı olsa da çok daha hızlı yöntemler de mevcut. SQL Server tahminler üretmek için R ve Ptyhon runtimeın ihtiyaç duymayacağınız iki yöntem sunuyor. Bunlar Realtime Scoring ve Native Scoring olarak isimlendiriliyor. Bazı kısıtları olsa bu yöntemler daha hızlı.

Tabi çok daha yüksek performans ihtiyacı mevcutsa Machine Learning Service değil de Machine Learning Server ile çalışmanız daha isabetli olacaktır.

Seri boyunca uçtan uca SQL Server üzerinde Machine Learning Service in Database özelliğini kullanarak bir ML çalışmasının nasıl yapılabileceğini incelemiş olduk. Python, R, Java kodlarını kullanarak, hatta CLR entegrasyonu sayesine .NET kodlarını kullanarak SQL Server'a yeni yetenekler kazandırabilirsiniz.

faydalı olması dileğiyle...


Hiç yorum yok:

Yorum Gönderme