18 Şubat 2020 Salı

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

Bu seride SQL Server 2019 özelliklerinden Machine Learning Services kullanarak R, Python scriptlerinin nasıl çalıştırıldığına ve veriyi SQL dışına çıkarmadan nasıl makine öğrenimi yapabileceğimize odaklanıyoruz. Serinin ilk yazısında özelliği tanıtıp ortamı hazırlamıştık. İkinci yazısında da Python kodları ile diskten veri okuma ve SQL tablosunu Python kodlarıyla yeniden bağlanmadan nasıl işleyebileceğimizi incelemiştik. Bu yazıya hazır olmadığınızı düşünüyorsanız. önceki yazılara bir göz atmanızı öneririm. 

Önceki yazılara ulaşmak için şu linkleri takip edebilirsiniz:


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)

Bu yazımızda artık SQL Server Machine Learning Services özelliği sayesinde SQL Server içerisinden çıkmadan sp_execute_external_script procedureünü kullanarak Python kodlarıyla makine öğrenimini nasıl yapacağımıza odaklanabiliriz.

Bu yazının senaryosu şöyle:
  1. Önceki bölümde incelediğimiz mpgcars veri setini diskten okuyup inceleyeceğiz.
  2. Linear Regression algoritmasını, mpgcars veri setindeki bazı kolonları kullanarak mpg kolonunu tahmin etmesi için eğiteceğiz. Bu scriptleri Python kernalında test edeceğiz.
  3. Daha önce MPGCarsDB isimli veritabanı ve mpgcars isimli tablo oluşturmuştuk. Bu SQL tablosunu sp_execute_external_script'e mpgcars isimli input olarak göndereceğiz.  İkinci adımdaki scriptte gerekli düzenlemeleri yaparak sp_execute_external_script'in gövdesine alacağız. Sonrasında kolayca çalıştırmak için bu kodların tümünü başka bir procedure ile kapsülleyeceğiz.
  4. Model hakkındaki bilgileri ve eğitilmiş modeli binary formatta SQL tarafında oluşturduğumuz bir tabloya yükleyeceğiz.
Bir önceki yazıda da belirttiğim gibi hem SSMS hem de Azure Data Studio araçlarını tercih edebilirsiniz. Ben kernallar arası geçiş yapması kolay olduğu için Azure Data Studio ile ilerleyeceğim.

Azure Data Studio analiz işlemleri için bir sürü eklenti ve kolaylık sunan yeni bir araç. SQL Server 2019 kurulum dosyasından veya aşağıdaki linkten indirip kurabilirsiniz:


Senaryomuzu adım adım uygulayalım.

1. mpgcars veri setini inceleyelim:


Azure Data Tools üzerinde Python Kernalını seçiyorum ve aşağıdaki Python kodları ile mpgcars veri setini inceliyorum. Burada araştırdığım şey mpg (miles per galon) kolonu ile diğer kolonlar arasındaki ilişki. Bunun için mpgcars.corr ile kolonlar arası korelasyona bakıyorum. Büyük oranda güçlü korelasyonlar mevcut. matplotlib kütüphanesi yardımıyla da scatter grafiğinde mpg ve diğer kolonlar arası ilişki inceliyorum. 

Örneğimizde weight ile mpg kolonu arasında linear (doğrusal) bir ilişki olduğunu görmek mümkün. Diğer kolonlarda da benzer durum var. Bu durum Linear Regresyon kullanmam için beni motive ediyor. Çünkü Linear Regresyon algoritması hem basit, hem hızlı, hem de veri kümesinin uzayda bir doğru boyunca seyrettiğini varsayıyor. Bir miktar hata ile bu seyri bir doğru denklemi ile ifade etmek mümkün olacak.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

#diskten okuyalım.
mpgcars=pd.read_csv("G:\MLinDBData\mpgcars.csv")
mpgcars=mpgcars[mpgcars["horsepower"]!="?"]

#scatter grafik oluşturalım
#plt.figure(figsize = (25, 5))
plt.scatter(mpgcars["weight"],mpgcars["mpg"])

#grafiğe ve eksenlere başlık ekleyelim
plt.title('mpg vs weight')
plt.xlabel("weight")
plt.ylabel("miles per galon")

# grafiği diske kaydedelim.
plt.savefig("G:\MLinDBData\mpg-vs-horsepower")

#korelasyon
mpgcars.corr(method ='pearson')["mpg"]


Bu arada dilerseniz plt.savefig satırında benim yaptığım gibi grafikleri bir yere kaydedebilirsiniz. Daha gelişmiş analizler yapmak mümkün. Ancak buradaki görselleştirme kütüphanelerine hakim olmanız gerekir. Eğer daha hızlı ilerlemek isterseniz Power BI Desktop uygulamasını kullanabilirsiniz. Blogda bu konuda bir çok video ve makale mevcut.

Azure Data Studio aracını kullananlar için beğendiğim bir eklentiyi önermek isterim. SandDance for Azure Studio eklentisi ile veriyi eğlenceli şekilde kum taneleriyle inceleyebilirsiniz. iki ve üç boyutlu inceleme imkanı olan bu aracı sorgu sonucunu aldığınız ekranda hemen sağda bulunan bir ikonla kullanmaya başlayabiliyorsunuz. Sonrası grafiğinizi seçmek ve eksenleri yerleştirmekten ibaret.

Eklentiyi soldaki eklentiler kısmında aratarak kurabilirsiniz:


SandDance eklentisini kurup tablonuzu sorguladıktan sonra sağ alt köşedeki ikon ile eklentiyi kullanmaya başlayabilirisiniz.



Biz mpgcars tablomuzdaki horsepower ve mpg kolonlarını scatter grafik olarak görüntüleyelim:



2. Modeli eğitelim:


Araçların özelliklerine bakarak her bir galon yakıtla ne kadar mil gideceğini tahmin edecek bir model eğiteceğiz. Linear Regresyon algoritmasını, mpg kolonunu bazı kolonlar yardımıyla tahmin edebilmek için eğitecek sonrasında başarısını test edeceğiz. Bunun için veriyi train ve test olarak ikiye ayırıyoruz. Örneğimizde %70-%30 olarak ayırdık. Algoritmayı %70'lik kısımla eğitip, eğitilmiş modelin sonucunu bildiğimiz %30'u tahmin etmesini isteyeceğiz. Model başarısını kontrol etmek için her Machine Learning problem tipine özel birtakım metrikler mevcut. Biz Regression yaptığımız için en kullanışlı metriklerden biri olan Root Mean Squared Error yani farkların karelerinin ortalamasının kare köküne bakacağız. Bu metrik test verileri ile tahminlerimiz arasında aşağı yukarı ne kadarlık sapma olduğunu bize vermiş olacak.

#y=f(X) 
# y: tahmin edilecekler yani target, X sonuçları bulmak için kullanacağımız kolonlar yani features, f ise tahmin için kullanacağımız eğitilmiş modelimiz.
#tahminde kullanılacak ve tahmin edilecek kolonları seçelim
features=["cylinders","displacement","horsepower","weight","acceleration"]
target=["mpg"]

X=mpgcars[features]
y=mpgcars[target]

#split için gerekli kütüphaneler
from sklearn.model_selection import train_test_split

#test ve train olarak veriyi ayıralım.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30random_state=123)

print("-----> satır, sutun sayısı")
print("X_train Satır Sutun: ",X_train.shape)
print("X_test Satır Sutun: ",X_test.shape)

#Linear Regression için gerekli kütüphane
from sklearn.linear_model import LinearRegression

#modeli eğitelim
modelLR=LinearRegression().fit(X_train,y_train)

##------Modeli Scorelayalım---------
y_tahmin=modelLR.predict(X_test)

from sklearn.metrics import mean_squared_error
import numpy as np

# Roat mean Squared Error
RMSE = np.sqrt(mean_squared_error(y_test,y_tahmin))
print("RMSE : ",RMSE)

## modeli serileştirelim. Daha sonra kullanmak üzere depolayacağız.
#modeli serileştirmek için
import pickle

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


Modeli oluşturduktan sonra tahminleme yapmak oldukça basit. Veri Bilimi çalışmalarının odağı doğru sorunun sorulması, problem tipinin belirlenmesi, verinin hazırlanması, sonucu etkileyecek alanların (alan, kolon, feature, domain, attribute aynı anlamdadır) seçilmesi-oluşturulması, algoritmanın seçimi, train ve test verinin seçimi, algoritma parametrelerinin optimizasyonu, sonuçların değerlendirilmesi için bir takım metrik ve grafiklerin incelenmesi, tahminlerin gerçek dünyadaki maliyetlerinin hesaplanması gibi bir çok konuyu kapsar. Çoğunlukla Veri Bilimi çalışmalarının araca, matematik-istatistik bilgisine ve probleme dair tecrübeye dayalı ön görü ve deneme yanılmanın yoğun olduğu bir süreçtir diyebiliriz. 

Biz bu yazıda SQL Server içerisinde Machine Learning çalışmalarını yapmanın mümkün olduğunu deneyimleyecek kadar konuyu ele alalım istedik. Bu konudaki detayları farklı platformlarda aktarmaktayız. Şimdilik burada oldukça yüzeysel geçiyoruz.

Linear Regresyon algoritması verileri en az hata ile ifade edecek bir doğru denklemi bulmayı hedefler. Eğitilmiş model üzerinden bu doğru denkleminin eğimini ve ekseni kestiği noktaları alabilirsiniz. Modeli eğitmeye başladığımız nokta LinearRegression().fit satırıdır. X_train ile mpg harici bazı kolonları verdik. Seçtiğimiz algoritma bu veri kümesine bakarak mpg kolonundan oluşan y_train veri setini en az hata ile ifade eden bir fonksiyon elde edecek. İşte bu fonksiyona eğitilmiş model diyoruz.

Eğitilmiş modeli modelLR.predict satırında tahminlemede kullanıyoruz. Bu sefer test verileriyle çalışarak X_test ile y_test sonuçlarını bulmaya çalışıyoruz. Sonrasında bulduğumuz y_tahmin ile y_test arasındaki sapmayı ifade eden RMSE (Root Mean Sequared Error) metriğine bakıyoruz. Burada çıkan sapma sizin için kabul edilebilir büyüklükteyse benim yaptığım gibi pickle.dumps ile modeli binary hale getirip SQL tarafında depolayabilirsiniz.

3. Kolaylık olsun diye kodları kapsülleyelim:


Yukarıdaki Python kodları ile yaptığımız çalışmayı SQL Server tarafında çalışacak hale getireceğiz. Python kodlarını sp_execute_external_script procedureünğn script parametresine olduğu gibi yapıştırabiliriz. Script içerisinde kullandığımız mpgcars veri setini SQL Server tarafından @input_data_1 ile göndereceğiz ve bu inputu @input_data_1_name parametresi ile mpgcars olarak kullanabileceğiz.

Script içerisinde eğittiğimiz modeli binary formata çevirip ve modelBin değişkenine atamıştık. Bu değişkenin tanımının scriptin altında @params parametresinde görebilirsiniz. Buradan gelen değeri en üstte tüm kodları kapsüllediğimiz procedureün @model isimli OUTPUT olarak tanımlanan parametresine ileteceğiz. sp_execute_external_script procedureünün bizim yazdığımız usp_TrainedModeBinary procedureü tarafından kapsüllendiğini gözden kaçırmayalım.

CREATE OR ALTER PROC usp_TrainedModeBinary (@model varbinary(max) OUT)
AS
BEGIN

EXEC sp_execute_external_script
             @language = N'Python',
             @input_data_1=N'SELECT mpg,cylinders,displacement,horsepower,weight,acceleration,modelyear,origin,carname FROM MPGCarsDB.dbo.mpgcars',
             @input_data_1_name=N'mpgcars',
             @script = N'
#y=f(X)
# y: tahmin edilecekler yani target, X sonuçları bulmak için kullanacağımız kolonlar yani features, f ise tahmin için kullanacağımız eğitilmiş modelimiz.
#tahminde kullanılacak ve tahmin edilecek kolonları seçelim
features=["cylinders","displacement","horsepower","weight","acceleration","modelyear","origin"]
target=["mpg"]

X=mpgcars[features]
y=mpgcars[target]

#split için gerekli kütüphaneler
from sklearn.model_selection import train_test_split

#test ve train olarak veriyi ayıralım.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=123)

print("-----> satır, sutun sayısı")
print("X_train Satır Sutun: ",X_train.shape)
print("X_test Satır Sutun: ",X_test.shape)

#Linear Regression için gerekli kütüphane
from sklearn.linear_model import LinearRegression

#modeli eğitelim
modelLR=LinearRegression().fit(X_train,y_train)

##------Modeli Scorelayalım---------
y_tahmin=modelLR.predict(X_test)

from sklearn.metrics import mean_squared_error
import numpy as np

# Roat mean Squared Error
RMSE = np.sqrt(mean_squared_error(y_test,y_tahmin))
print("RMSE : ",RMSE)

## modeli serileştirelim. Daha sonra kullanmak üzere depolayacağız.
#modeli serileştirmek için
import pickle

modelbin=pickle.dumps(modelLR)
#print(modelbin)
'
             ,@params = N'@modelbin varbinary(max) OUTPUT'
             ,@modelbin = @model OUTPUT
END

4. Scriptten gelen binary modeli bir SQL Server tablosuna kaydedelim:


Eğitilmiş modeli kaydedelim ki sahada kullanırken tekrar tekrar modeli eğitmek durumunda kalmayalım. Modeli eğitmek uzun süre bir işlem olduğu için her tahminden önce bunu yapmak mümkün olmayabilir. Model eğitme işlemi yavaş olduğu için aralıklarla yapılır ve  başarılı bir fonksiyon haline gelmiş eğitilen model tahminlemelerde kullanılmak üzere depolanır. 

Biz bu modeli şimdi oluşturacağımız tabloda binary olarak depolayalım. Böylece daha sonra tahminlemede kullanmak üzere serileştirip model nesnesi haline getirebiliriz.

--mpg eğitilmiş modelin saklanacağı tablo
CREATE TABLE mpgcars_model
(
       language nvarchar(20),
       model_name nvarchar(50),
       model varbinary(max),
       model_date datetime DEFAULT(GETDATE())
)
GO

--modeli alalım.
DECLARE @TrainedModel varbinary(max)

exec usp_TrainedModeBinary @model=@TrainedModel OUT

--select @m
INSERT INTO mpgcars_model(language,model_name,model,model_date) VALUES('Python','sklearn.linear_model.LinearRegression',@TrainedModel,GETDATE())

--TRUNCATE TABLE mpgcars_model
select * from mpgcars_model


Bu yazıda özellikleri verilen bir aracın mpg değerini tahmin edebilecek bir model eğittik. Bu modeli binary olarak SQL Server tablosunda depoladık. Sonraki yazımızda bu modeli serileştirip model nesnesi elde edeceğiz. Elde ettiğimiz bu model nesnesiyle tahminleme yapabileceğiz.

faydalı olması dileğiyle...



17 Şubat 2020 Pazartesi

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

Serinin bir önceki yazısında SQL Server 2019 özelliklerinden biri olan Machine Learning Services'in nasıl kurulduğundan ve SQL Server içerisinde R, Python scriptlerinin nasıl çalıştırıldığından bahsetmiştik.

Bu yazıda diskteki bir csv dosyasından veri okuma, bu veriyi SQL tablosuna yükleme ve SQL tablosundaki verileri script içerisine gönderip üzerinde çalışma konusuna odaklanacağız. Eğer ortamınızın hazır olduğundan emin değilseniz önceki yazımıza aşağıdaki linkten bir göz atabilir,  gerekli hazırlığı yapabilirsiniz.


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


Bu yazımızda özetle şu işlemleri yapacağız:
  1. Diskteki bir yolda bulunan csv dosyasını SQL Server içerisinden Python scriptleri ile dataframe olarak okuyacağız. Önceki yazımızdan hatırlayacağınız üzere Python scriptlerini çalıştırmak için sp_execute_external_script procedureünü kullanacağız. Bu csv dosyası içerisinde 399 satır, 9 kolonda otomobil modelleri, beygir gücü, ağırlığı, her bir galon yakıtla ne kadar mil gittiği gibi birtakım bilgiler mevcut. Beygir gücü kolonunda bazı satırlarda ? mevcut. Bu satırları da script içerisinde filtreleyeceğiz.
  2. MPGCarsDB isimli veritabanı ve mpgcars isimli tablo oluşturacağız.
  3. İlk maddede Python scriptlerini çalıştırmak için kullandığımız sp_external_script kod bloğumuzu başka bir procedure ile kapsülleyeceğiz. Böylece sadece dosya yolunu verdiğimizde geriye tablo döndüren temiz bir procedureümüz olacak.
  4. Yeni procedureden gelen verileri oluşturduğumuz tabloya yükleyeceğiz.
  5. Son olarak serinin devamında kullanacağımız için sql tablosundaki veriyi Python scriptine nasıl göndereceğimize bakacağız.
Bu çalışmayı SSMS veya Azure Data Studio aracıyla ile yapabilirsiniz. Azure Data Studio aracı hem Python hem de SQL çalışma ortamları arasında geçiş yapmanızı kolaylaştırabiliyor. Notebook açarak tüm analiz serüveninin çıktılarını tek bir dosyada toplayabiliyorsunuz.

Azure Data Studio analiz işlemleri için bir sürü eklenti ve kolaylık sunan yeni bir araç. SQL Server 2019 kurulum dosyasından veya aşağıdaki linkten indirip kurabilirsiniz:


Bu çalışmada yazdığım Python scriptlerini test etmek için, SQL ve Python arasında kolayca geçiş yapabilmek için Azure Data Studio'yu kullanmayı tercih ettim.

1. Diskteki csv dosyasını okuyalım:


Öncelikle csv dosyasını okuyalım. Bunun için Pandas kütüphanesini kullanacağız. Pandas kütüphanesi Numpy kütüphanesi üzerine inşa edilmiş olup veriyi bilindik tablo mantığına yakın formatta olan DataFrame şeklinde tutmamızı ve işlememizi sağlar. Numpy kütüphanesi ise verileri diziler şeklinde tutabildiğimiz yüksek performans ve esneklik sağlayan temel kütüphanelerdendir. Odağımız Python scriptleri değil. Bu sebeple scriptlerin sadece odağımıza uygun olan kısımlarını açıklayacağız.

sp_execute_external_script procedurü dil ve çalıştırmak istediğiniz script parametrelerinin dışında parametrelerde almaktadır. Örneğimizde içeride bir değişken olarak kullanacağımız @yol parametresini belirttik. Tabi öncelikle @yol parametresini @params parametresinde tanımladık. Artık @yol dışarıdan değer göndermek amacıyla procedure parametresi olarak belirtilebilecek ve script içerisinde yol isimli değişken olarak kullanılabilecek.

Script içerisindeki bir veri kümesini SQL Server tarafında bir tablo olarak okuyabilmek için OutputDataSet değişkenine atıyoruz. Bu reserve edilmiş ismi değiştirmek mümkün. OutputDataSet değişkenine atanan dataframe nesnesi WITH RESULT SETS blogundaki kolon tanımlarına göre SQL tablosu formatında çıktıya dönüşür. Sonrasında bu çıktıyı bir SQL tablosuna bilindik yollarla insert edebilirsiniz.

Tarif ettiğimiz bu işi yapan kodlara bir göz atalım.

EXEC sp_execute_external_script
         @language = N'Python'
        ,@script = N' 
import pandas as pd

mpgcars=pd.read_csv(yol)

filtre=mpgcars["horsepower"]!="?";

OutputDataSet = mpgcars[filtre];
    '
        ---------------
        ,@params = N'@yol nvarchar(max)'
        ,@yol=N'G:\MLinDBData\mpgcars.csv'
        ---------------
    WITH RESULT SETS (
                        (
                        mpg             float
                        ,cylinders       float
                        ,displacement    float
                        ,horsepower      int
                        ,weight          float
                        ,acceleration    float
                        ,modelyear       int
                        ,origin          int
                        ,carname         nvarchar(150)
                        )

                )  


csv doyasının içeriğini okuduk. Bu dosyaya ve YTÜ'de yaptığımız bir sunuma aşağıdaki linkten erişebilirsiniz:

2. Veritabanı ve tabloyu oluşturalım:


Şimdi de senaryomuza uygun olarak MPGCarsDB veritabanını ve mpgcars tablolarını oluşturalım. Bilindik SQL komutlarını yazıyoruz.

CREATE DATABASE MPGCarsDB
GO
USE MPGCarsDB

--mpg datasının saklanacağı tablo
CREATE TABLE mpgcars
(
    mpg float,
    cylinders int,
    displacement  float,
    horsepower int,
    weight float,
    acceleration float,
    modelyear int,
    origin  int,
    carname nvarchar(50)
)

3. Yeni procedure ile scripti kapsülleyeyim:


Yeni bir procedure ile Python scriptlerini yazdığımız procedureü kullanım kolaylığı olsun diye kapsüllüyoruz. Bu yeni sadece procedure @pyol parametresi alacak ve sp_execute_external_script için tanımladığımız @yol parametresine aynen atanacak.

USE MPGCarsDB
GO

--Diskten csv okuyalım ve tabloya basalım
CREATE OR ALTER PROC usp_MpgCars_ReadfromDisk (@pYol nvarchar(max))
AS
BEGIN
---Diskteki csv dosyasını okuyalım
EXEC sp_execute_external_script
         @language = N'Python'
        ,@script = N'
import pandas as pd

mpgcars=pd.read_csv(yol)

filtre=mpgcars["horsepower"]!="?";

OutputDataSet = mpgcars[filtre];
    ' 
        ---------------
        ,@params = N'@yol nvarchar(max)'
        ,@yol=@pYol
        ---------------
    WITH RESULT SETS (
                        (
                        mpg             float
                        ,cylinders       float
                        ,displacement    float
                        ,horsepower      int
                        ,weight          float
                        ,acceleration    float
                        ,modelyear       int
                        ,origin          int
                        ,carname         nvarchar(150)
                        )
                )--sp_execute_external_script sonu
END


4. Yeni procedureden gelen verileri tabloya insert edelim:


Yukarıda tanımladığımız procedureden gelen verileri bilindik insert yöntemleri ile tabloya yüklüyoruz.

INSERT INTO mpgcars
    exec usp_MpgCars_ReadfromDisk 'G:\MLinDBData\mpgcars.csv'


select * from mpgcars

Buraya kadar geldiğinizde mpgcars isimli tablomuzda csv dosyasındaki satırlardan horsepower kısmında ? olmayan satırların varlığını doğrulayabilirsiniz. Bu tabloyu daha sonra makine öğrenimi çalışmamızda kullanacağız. 

Diskteki bir veriyi script içerisine Python kodları ile aldık. Peki SQL Server içerisindeki bir tabloyu script içerisine nasıl gönderebiliriz? Bunun için SQL Server'a ek bir bağlantı kurmaya gerek kalmıyor. Doğrudan sp_execute_external_script parametresinden bir select sonucunu script içerisine dataframe olarak gönderebiliyoruz.

5. SQL tablosunu script içerisine göndermek:


sp_execute_external_script procedureünün @input_data_1 parametresine bir select sorgusu yazabilir bu sorgu sonucunu içeride rezerve edilmiş InputDataSet isimli değişkenle kullanabiliriz. Rezerve edilmiş OutpuDataSet isimli değişkenle de tekrar SQL tarafına tablo olarak gönderebileceğimizi yukarıda anlatmıştık.

Dilerseniz bu rezerve edilmiş isimleri değiştirebilirsiniz. @input_data_1_name parametresi ile select sorgunuzun dataframe olarak tutulacağı değişkeni, @output_data_1_name parametresi ile SQL tarafına iletmek istediğinizde atama yapacağınız değişkeni yeniden isimlendirebilirsiniz.

Örneğin mpgcars isimli SQL tablomuzun tüm kolonlarını çekelim. Bu tabloyu script içerisinde parametrede belirttiğim mpgcars ismiyle kullanabilirim. Üzerinde çalıştıktan sonra ki burada sadece iki kolonu seçtik, SQL tarafına tablo olarak göndermek için yine parametrede belirttiğim cikti isimli değişkene atıyorum.

EXEC sp_execute_external_script
         @language = N'Python'
        ,@input_data_1=N'SELECT * FROM MPGCarsDB.dbo.mpgcars'
        ,@input_data_1_name=N'mpgcars'
        ,@output_data_1_name=N'cikti'
        ,@script = N'
cikti = mpgcars[["horsepower","mpg"]]
'
       WITH RESULT SETS (
                        (
                             mpg   float
                            ,horsepower int
                        )

                    )



Serinin bu bölümünde diskteki bir dosyayı okuma, SQL tablosuna yükleme ve SQL tablosuna script içerisinden erişme işlemlerinin nasıl yapılabileceğine değindik. Sonraki yazımızda SQL Server 2016-2017-2019 ile duyurulan Machine Learning Service özelliğini kullanarak temel bir makine öğrenimi çalışmasının nasıl yapıldığına odaklanacağız.

Daha önce YTÜ de bu konu hakkında düzenlediğimiz etkinlikteki dokümanlara ve yukarıdaki scriplerin olduğu notebooka aşağıdaki linkten erişebilirsiniz:
https://1drv.ms/u/s!Ap5-WHzOJRrThIhOLNMJUm5ZzqiXTw?e=bjyug4

Faydalı olması dileğiyle...

16 Şubat 2020 Pazar

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

Farklı platformlarca yayınlanan araştırmalara göre Veri Bilimi çalışmalarında en sık kullanılan diller sıralamasında Python, R, SQL, Scala başı çekmektedir. 

Özellikle Python, R ve SQL kullanımı ve kaynakları bir hayli yaygın. KDNuggets'in 2015-2017 yılları arasındaki araştırmasında da bu dillerin en üstte konumlandığını görüyoruz.


SQL'in yaygın olarak kullanılan yapısal sorgulama dili olduğu aşikar. R daha çok akademik çevrelerce geliştirilen ve kullanılan zengin kütüphane havuzuna sahip veri işleme, görselleştirme ve makine öğrenimi gibi daha bir çok çalışmayı yapabileceğiniz bir dildir. Python ise programlama dünyasında bir çok platformda kullanılabildiği için giderek daha fazla kullanıcı kitlesine sahip olup Veri Bilimi çalışmalarında R'a yakın geniş bir kütüphane havuzu sunan ve her geçen gün Veri Bilimi alanında zenginliği ve popülaritesi artan bir dildir. Scala ise JVM üzerinde çalışan java benzeri bir dil olup hadoop, spark platformlarında büyük verileri işlerken yüksek performans sunduğu için çokça tercih edilmektedir. Daha performanslı diller de mevcut ancak popülaritesi düşük olduğu için yazımızın odağının dışında tutuyoruz.

Microsoft uzun zaman önce bu diller ile Veri Bilimi çalışmaları yapabileceğimiz çeşitli platformlar sundu ve bir yandan da yeni platformları sunmaya, geliştirmeye devam etmektedir. Bunların bir kısmı bulut tabanlı bir kısmı ise kendi kaynaklarınız üzerinde çalışabiliyor. Bunların bazıları ücretsiz bazıları da lisanslama veya kullandıkça öde usulüyle ücretli olarak hizmete sunulmaktadır.

Zamanla bu ürünlerin her birine göz atarız ancak bu yazıda SQL Server üzerinde gelen Machine Learning Services in Database özelliğine odaklanalım istiyorum. ML in Database ile verilerinizi SQL Server dışına çıkarmadan SQL, R, Pyhton ve Java dilleri ile işleyebilir, görselleştirebilir, makine öğrenimi teknikleri ile modeller eğiterek tahminlemeler yapabilirsiniz.

Bu özellik ilk olarak SQL Server 2016 ile duyuruldu. Tabi o zamanki adı R in Database olarak geçiyordu. Sonraki versiyonda R ve Python desteği getirildi ve bu özellik SQL Server 2017'de Machine Learning Services in Database olarak isimlendirildi. Son olarak SQL Server 2019 versiyonunda bir miktar daha geliştirildi ve Java desteği getirildi.

Nasıl kurulur?


SQL Server 2019 kurulumunu yaparken Features adımına geldiğinizde Instance Features bölümünde "Machine Learning Service and Language Extention" ve "Shared Features" bölümünde "Machine Learning Server (Standalone)" özelliklerini görebilirsiniz. Microsoft bu özelliklerin ikisini aynı makine kurmanızı önermiyor. Birini tercih etmeniz gerekir. Her ikisinde de hemen hemen aynı şeyleri yapabilirsiniz.


Shared Features kısmındaki "Machine Learning Server (Standalone)" kurulumunu her bir server için bir defa yapabilirsiniz ve "Database Engine Service" kurmanıza gerek yoktur. Yani bağımsız bir Machine Learning Server oluşturabilirsiniz. Bunun bir çok avantajı mevcut. Daha yüksek performanslı çalışmalar yapabilir modelleriniz için web service oluşturabilirsiniz. Bu özelliği kurmak için Installation tabında bir kısa yol daha var. Sonuç olarak yine aynı seçimi yapmanızı sağlan bir kısa yol sadece.

Daha fazlasın için:

Instance Features kısmındaki "Machine Learning Service and Language Extention" özelliği ise "Database Engine Service" kurmanızı zorunlu kılar ve aynı makineye birden fazla kurulum yapmanıza imkan tanır. Bu özellik sayesinde SQL sorgularımız içerisinde bir procedure ile kurulumda seçtiğim dillerde yazdığımız kodları çalıştırabiliriz. Bu özellik sayesinde örneğin müşteri listesine okurken bir yandan da eğittiğimiz bir model yardımıyla bu müşterinin potansiyel alıcı olup olmadığını tahminleyebiliriz. Bir ürünün muhtemel fiyatını tahmin etmek, bir anomali tespiti yapmak üstelik bunları veriyi SQL Server dışına çıkarmadan yapabilmek mümkün, harika ve oldukça kolay.

Daha fazlası için:

Kurulumu tamamladığınızda Java, R ve Python için bir takım bileşenler yüklenir. Kurulum sonrasında SQL Server Launchpad servisi (Python ve R tarafına odaklanırsak) bazı örnekler, R ve Python çalışma ortamları, bir takım araçlar, önceden eğitilmiş modeller ve ek R ve Python paketleri kullanıma hazır hale gelmektedir.


Kurulum sonrasında dillere ait bileşenlerin bulunduğu klasörleri ve Launchpad serivisini görebilirsiniz.


Nasıl Çalışır?


En basit haliyle; sp_execute_external_script isimli procedureün parametrelerinde belirtiğimiz script ve scriptin dili, Launchpad serivisi tarafından algılanır ve o dilin ilgili 'runtime'ında çalıştırılmak üzere gönderilir. Çalışma tamamlandığında ise sonuçlar yine Launchpad servisi üzerinden SQL Server'a iletilir. Kullanılan dile göre arada bir takım dll ve exe de devreye girer. 

Bu çalışma mantığı Linux ve Windows için hemen hemen aynıdır. İletişimi sağlayan Launchpad servisi olduğu için harici scriptler çalıştırılırken bu servis mutlaka açık tutulmalıdır.

Bir Python kodu için süreç aşağıdaki gibi işler. R kodu için çalışan alternatif exe ve dll isimlerini de hemen sağda belittim.

Nasıl Yapılır?


Öncelikle external script özelliğini SQL Server Instance seviyesinde aktif etmek gerekir. Ardından hem SQL Server hem de Launchpad servisi yeniden başlatılmalıdır.

Şu kodlarla external script özelliğini aktif edebilirsiniz:

--Python ve R kodlarını çalıştırabilmek için
sp_configure 'external scripts enabled',1
RECONFIGURE

--Engine ve Launchpad servislerini restart et.

--restart sonrası kontrol et.
sp_configure 'external scripts enabled'


Sonrasında sp_execute_external_script procedure yardımıyla kurduğunuz dillere ait scriptleri kolayca çalıştırabilirsiniz:



Bir giriş örneği olarak R ve Python dillerine özel aşağıdaki kodlarla x ve y değişkenlerine değer atayalım ve x+y*x sonucunu hesaplayalım.

--R
EXEC sp_execute_external_script
    @language = N'R',  
    @script = N'
x < - 10
y < - 20

print(x+y*x)
'

--Python
EXEC sp_execute_external_script
    @language = N'Python',  
    @script = N'
x = 10
y = 20

print(x+y*x)
'

İlk çalıştırmada ortam hazırlandığı için sonuç biraz geç gelecektir. Ancak sonraki çalıştırmalarda yüksek hızda sonuçlar alabilirsiniz. Procedureün çalışması tamamlandığında print ettiğiniz bilgilileri Messages kısmından görüntüleyebilirsiniz. Daha sonraki çalışmalarda bu procesure üzerinden tablo da döndürerek Result kısmından tabloyu görüntüleyebileceğiz.




Bu yazımızı kurulum ve özellikle ilk tanışma çerçevesinde tutalım. Serinin devamında biraz daha derine dalıp temel bir makine öğrenimi çalışmasının nasıl yapıldığına ve SQL Server içerisinde eğitilen modellerin nasıl depolanıp kullanıldığına odaklanacağız.

Faydalı olması dileğiyle...

19 Ocak 2020 Pazar

Power BI Demo Serisi - (Time Intelligence - 3)

Abdullah Kise : " Bu seride bazı Time Intelligence fonksiyonlarını ele alacağız. Tarihsel analizlerde işimizi kolaylaştıran tarih tablolarının sıfırdan nasıl oluşturulabileceğini inceleyeceğiz. 

Bu tarih tablosunu kullanan Time Intelligence fonksiyonları sayesinde baktığımız bir değerin şimdiki zamanda, kayan zamanlarda, paralel periyotlarda ve kesin olarak verilen tarihlerdeki hallerini inceleyebileceğiz. Serimiz bir kaç bölümden oluşuyor. Bu bölümde modelleme katmanında DAX formülleri yardımıyla tarihsel analizler yapıyoruz. Contexte duyarlı tarihsel fonksiyonlar üzerinde çalışıyoruz. MTD, YTD, YoY, YoY% gibi hesaplamaların nasıl yapıldığına bakıyoruz." 



Aşağıdaki linkten kaynak olarak kullandığımız Excel dosyasına ve videoda geliştirilen Power BI dosyasına erişebilirsiniz: