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...

Hiç yorum yok:

Yorum Gönder