Aracılığıyla paylaş


Hızlı Başlangıç: SQL makine öğrenmesi ile R kullanan veri yapıları, veri türleri ve nesneler

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Azure SQL Yönetilen Örnek

Bu hızlı başlangıçta , SQL Server Machine Learning Services'da veya Büyük Veri Kümelerinde R kullanırken veri yapılarını ve veri türlerini kullanmayı öğreneceksiniz. R ile SQL Server arasında veri taşımayı ve oluşabilecek yaygın sorunları öğreneceksiniz.

Bu hızlı başlangıçta , SQL Server Machine Learning Services'da R kullanırken veri yapılarını ve veri türlerini kullanmayı öğreneceksiniz. R ile SQL Server arasında veri taşımayı ve oluşabilecek yaygın sorunları öğreneceksiniz.

Bu hızlı başlangıçta , SQL Server R Services'de R kullanırken veri yapılarını ve veri türlerini kullanmayı öğreneceksiniz. R ile SQL Server arasında veri taşımayı ve oluşabilecek yaygın sorunları öğreneceksiniz.

Bu hızlı başlangıçta Azure SQL Yönetilen Örneği Machine Learning Services'da R kullanırken veri yapılarını ve veri türlerini kullanmayı öğreneceksiniz. R ile SQL Yönetilen Örneği arasında veri taşımayı ve oluşabilecek yaygın sorunları öğreneceksiniz.

Önden bilmeniz gereken yaygın sorunlar şunlardır:

  • Veri türleri bazen eşleşmiyor
  • Gizli dönüştürmeler gerçekleşebilir
  • Kast ve dönüştürme işlemleri bazen gereklidir
  • R ve SQL farklı veri nesneleri kullanır

Önkoşullar

Bu hızlı başlangıcı çalıştırmak için aşağıdaki önkoşullara ihtiyacınız vardır.

Her zaman bir veri çerçevesi döndür

Betiğiniz R'den SQL Server'a sonuç döndürdüğünde, verileri data.frame olarak döndürmesi gerekir. Betikte oluşturduğunuz herhangi bir başka türdeki nesne (liste, faktör, vektör veya ikili veri olsun) saklı yordam sonuçlarına dahil edilmek istiyorsa veri çerçevesine dönüştürülmelidir. Neyse ki, diğer nesneleri bir veri çerçevesine değiştirmeyi destekleyen birden çok R işlevi vardır. Hatta ikili modeli seri hale getirerek veri çerçevesinde döndürebilirsiniz. Bu işlemi bu hızlı başlangıçta daha sonra yapacaksınız.

İlk olarak, vektörler, matrisler ve listeler gibi bazı R temel R nesnelerini deneyelim ve veri çerçevesine dönüştürmenin SQL Server'a geçirilen çıkışı nasıl değiştirdiğini görelim.

R'deki bu iki "Hello World" betiğini karşılaştırın. Betikler neredeyse aynı görünür, ancak ilki üç değerden oluşan tek bir sütun döndürürken, ikincisi her biri tek bir değere sahip üç sütun döndürür.

Örnek 1

EXECUTE sp_execute_external_script
       @language = N'R'
     , @script = N' mytextvariable <- c("hello", " ", "world");
       OutputDataSet <- as.data.frame(mytextvariable);'
     , @input_data_1 = N' ';

Örnek 2

EXECUTE sp_execute_external_script
        @language = N'R'
      , @script = N' OutputDataSet<- data.frame(c("hello"), " ", c("world"));'
      , @input_data_1 = N'  ';

Şema ve veri türlerini tanımlama

Sonuçlar neden bu kadar farklı?

Yanıt genellikle R str() komutu kullanılarak bulunabilir. R betiğinizde herhangi bir yere, belirtilen R nesnesinin veri şemasını bilgilendirme iletisi olarak döndürecek işlev olan str(object_name) ekleyin.

Örnek 1 ve Örnek 2'nin neden bu kadar farklı sonuçlara sahip olduğunu öğrenmek için, her deyimde değişken tanımının str(OutputDataSet) sonuna aşağıdaki gibi bir çizgi @script ekleyin:

Str işlevi eklenmiş örnek 1

EXECUTE sp_execute_external_script
        @language = N'R'
      , @script = N' mytextvariable <- c("hello", " ", "world");
      OutputDataSet <- as.data.frame(mytextvariable);
      str(OutputDataSet);'
      , @input_data_1 = N'  '
;

Str işlevi eklenmiş örnek 2

EXECUTE sp_execute_external_script
  @language = N'R', 
  @script = N' OutputDataSet <- data.frame(c("hello"), " ", c("world"));
    str(OutputDataSet);' , 
  @input_data_1 = N'  ';

Şimdi, çıkışın neden farklı olduğunu görmek için İletiler'deki metni gözden geçirin.

Sonuçlar - Örnek 1

STDOUT message(s) from external script:
'data.frame':	3 obs. of  1 variable:
$ mytextvariable: Factor w/ 3 levels " ","hello","world": 2 1 3

Sonuçlar - Örnek 2

STDOUT message(s) from external script:
'data.frame':	1 obs. of  3 variables:
$ c..hello..: Factor w/ 1 level "hello": 1
$ X...      : Factor w/ 1 level " ": 1
$ c..world..: Factor w/ 1 level "world": 1

Gördüğünüz gibi, R söz dizimindeki küçük bir değişikliğin sonuçların şeması üzerinde büyük bir etkisi vardı. Bunun nedenini açıklamayacağız, ancak R veri türleri arasındaki farklar Hadley Wickham'ın "Advanced R" (Gelişmiş R) bölümündeki Veri Yapıları bölümünde ayrıntılı olarak açıklanmıştır.

Şimdilik, R nesnelerini veri çerçevelerine zorlama sırasında beklenen sonuçları denetlemeniz gerektiğini unutmayın.

Tavsiye

İç veri yapısı hakkında bilgi döndürmek için , is.matrixgibi is.vectorR kimlik işlevlerini de kullanabilirsiniz.

Veri nesnelerinin örtük olarak dönüştürülmesi

İki veri nesnesi aynı sayıda boyuta sahipse veya herhangi bir veri nesnesi heterojen veri türleri içeriyorsa, her R veri nesnesinin diğer veri nesneleriyle birleştirildiğinde değerlerin nasıl işleneceğini gösteren kendi kuralları vardır.

İlk olarak, küçük bir test verileri tablosu oluşturun.

CREATE TABLE RTestData (col1 INT NOT NULL)

INSERT INTO RTestData
VALUES (1);

INSERT INTO RTestData
VALUES (10);

INSERT INTO RTestData
VALUES (100);
GO

Örneğin, R kullanarak matris çarpması gerçekleştirmek için aşağıdaki deyimi çalıştırdığınızı varsayalım. Tek sütunlu matrisi üç değerle dört değer içeren bir diziyle çarpabilir ve sonuç olarak 4x3 matrisi bekleyebilirsiniz.

EXECUTE sp_execute_external_script
    @language = N'R'
    , @script = N'
        x <- as.matrix(InputDataSet);
        y <- array(12:15);
    OutputDataSet <- as.data.frame(x %*% y);'
    , @input_data_1 = N' SELECT [Col1]  from RTestData;'
    WITH RESULT SETS (([Col1] int, [Col2] int, [Col3] int, Col4 int));

Kapakların altında üç değerden oluşan sütun tek sütunlu matrise dönüştürülür. Matris, R'deki bir dizinin yalnızca özel bir durumu olduğundan, iki bağımsız değişkenin uyumlu olması için dizi 'y' örtük olarak tek sütunlu bir matrise dönüştürülür.

Results

Kol1 Col2 Sütun3 Sütun4
12 13 14 15
120 130 140 Yüz elli
1200 1300 1400 1500

Ancak, dizisinin yboyutunu değiştirdiğinizde ne olacağını unutmayın.

execute sp_execute_external_script
   @language = N'R'
   , @script = N'
        x <- as.matrix(InputDataSet);
        y <- array(12:14);
   OutputDataSet <- as.data.frame(y %*% x);'
   , @input_data_1 = N' SELECT [Col1]  from RTestData;'
   WITH RESULT SETS (([Col1] int ));

Şimdi R sonuç olarak tek bir değer döndürür.

Results

Kol1
1542

Why? Bu durumda, iki bağımsız değişken aynı uzunlukta vektörler olarak işlenebildiği için R, iç ürünü matris olarak döndürür. Doğrusal cebir kurallarına göre beklenen davranış budur; ancak aşağı akış uygulamanız çıkış şemasının hiçbir zaman değişmemesini bekliyorsa sorunlara neden olabilir!

Tavsiye

Hata mı alıyorsunuz? Saklı yordamı ana veya başka bir veritabanında değil, tabloyu içeren veritabanı bağlamında çalıştırdığınızdan emin olun.

Ayrıca, bu örnekler için geçici tablolar kullanmaktan kaçınmanızı öneririz. Bazı R istemcileri, geçici tabloları silerek toplu işlemler arasındaki bağlantıyı sonlandırır.

Farklı uzunluktaki sütunları birleştirme veya çarpma

R, farklı boyutlardaki vektörlerle çalışmak ve bu sütun benzeri yapıları veri çerçeveleri halinde birleştirmek için büyük esneklik sağlar. Vektör listeleri tablo gibi görünebilir, ancak veritabanı tablolarını yöneten tüm kurallara uymaz.

Örneğin, aşağıdaki betik 6 uzunluğunda bir sayısal dizi tanımlar ve bunu R değişkeninde df1depolar. Ardından sayısal dizi, yeni bir veri çerçevesi df2oluşturmak için üç (3) değer içeren RTestData tablosunun tamsayılarıyla birleştirilir.

EXECUTE sp_execute_external_script
    @language = N'R'
    , @script = N'
               df1 <- as.data.frame( array(1:6) );
               df2 <- as.data.frame( c( InputDataSet , df1 ));
               OutputDataSet <- df2'
    , @input_data_1 = N' SELECT [Col1]  from RTestData;'
    WITH RESULT SETS (( [Col2] int not null, [Col3] int not null ));

Veri çerçevesini doldurmak için R, dizideki öğe sayısıyla eşleşmesi için RTestData'dan alınan öğeleri df1gerektiği kadar tekrarlar.

Results

Sütun2 Kolon3
1 1
10 2
100 3
1 4
10 5
100 6

Veri çerçevesinin yalnızca tabloya benzediğini ve aslında vektörlerin listesi olduğunu unutmayın.

Verileri atama veya dönüştürme

R ve SQL Server aynı veri türlerini kullanmaz, bu nedenle verileri almak için SQL Server'da bir sorgu çalıştırdığınızda ve bunu R çalışma zamanına geçirdiğinizde, genellikle bir tür örtük dönüştürme gerçekleşir. R'den SQL Server'a veri döndürdüğünüzde başka bir dönüştürme kümesi gerçekleşir.

  • SQL Server, sorgudaki verileri Launchpad hizmeti tarafından yönetilen R işlemine gönderir ve daha fazla verimlilik için iç temsile dönüştürür.
  • R çalışma zamanı, verileri bir data.frame değişkenine yükler ve veriler üzerinde kendi işlemlerini gerçekleştirir.
  • Veritabanı altyapısı, güvenli bir iç bağlantı kullanarak verileri SQL Server'a döndürür ve verileri SQL Server veri türleri açısından sunar.
  • SQL sorguları verebilen ve tablosal veri kümelerini işleyebilen bir istemci veya ağ kitaplığı kullanarak SQL Server'a bağlanarak verileri alırsınız. Bu istemci uygulaması verileri başka şekillerde etkileyebilir.

Bunun nasıl çalıştığını görmek için AdventureWorksDW veri ambarı üzerinde bunun gibi bir sorgu çalıştırın. Bu görünüm, tahmin oluştururken kullanılan satış verilerini döndürür.

USE AdventureWorksDW
GO

SELECT ReportingDate
         , CAST(ModelRegion as varchar(50)) as ProductSeries
         , Amount
           FROM [AdventureWorksDW].[dbo].[vTimeSeries]
           WHERE [ModelRegion] = 'M200 Europe'
           ORDER BY ReportingDate ASC

Uyarı

AdventureWorks'ün herhangi bir sürümünü kullanabilir veya kendi veritabanınızı kullanarak farklı bir sorgu oluşturabilirsiniz. Önemli olan metin, tarih saat ve sayısal değerler içeren bazı verileri işlemeyi denemektir.

Şimdi bu sorguyu saklı yordama giriş olarak yapıştırmayı deneyin.

EXECUTE sp_execute_external_script
       @language = N'R'
      , @script = N' str(InputDataSet);
      OutputDataSet <- InputDataSet;'
      , @input_data_1 = N'
           SELECT ReportingDate
         , CAST(ModelRegion as varchar(50)) as ProductSeries
         , Amount
           FROM [AdventureWorksDW].[dbo].[vTimeSeries]
           WHERE [ModelRegion] = ''M200 Europe''
           ORDER BY ReportingDate ASC ;'
WITH RESULT SETS undefined;

Hata alırsanız, büyük olasılıkla sorgu metninde bazı düzenlemeler yapmanız gerekir. Örneğin, WHERE yan tümcesindeki dize koşulu iki tek tırnak işareti kümesi içine alınmalıdır.

Sorguyu çalıştırdıktan sonra, R'nin str giriş verilerini nasıl değerlendirdiğini görmek için işlevin sonuçlarını gözden geçirin.

Results

STDOUT message(s) from external script: 'data.frame':    37 obs. of  3 variables:
STDOUT message(s) from external script: $ ReportingDate: POSIXct, format: "2010-12-24 23:00:00" "2010-12-24 23:00:00"
STDOUT message(s) from external script: $ ProductSeries: Factor w/ 1 levels "M200 Europe",..: 1 1 1 1 1 1 1 1 1 1
STDOUT message(s) from external script: $ Amount       : num  3400 16925 20350 16950 16950
  • datetime sütunu R veri türü POSIXct kullanılarak işlenmiştir.
  • "ProductSeries" metin sütunu, kategorik değişken anlamına gelen bir faktör olarak tanımlanmıştır. Dize değerleri varsayılan olarak faktör olarak işlenir. R'ye bir dize geçirirseniz, iç kullanım için bir tamsayıya dönüştürülür ve çıkışta dizeye geri eşlenir.

Özet

Bu kısa örneklerden bile SQL sorgularını giriş olarak geçirirken veri dönüştürmenin etkilerini denetleme gereksinimini görebilirsiniz. Bazı SQL Server veri türleri R tarafından desteklenmediğinden, hatalardan kaçınmanın şu yollarını göz önünde bulundurun:

  • Verilerinizi önceden test edin ve şemanızdaki R koduna geçirildiğinde sorun olabilecek sütunları veya değerleri doğrulayın.
  • Giriş veri kaynağınızdaki sütunları SELECT * kullanmak yerine tek tek belirtin ve her sütunun nasıl ele alınacağını bilin.
  • Sürprizlerden kaçınmak için giriş verilerinizi hazırlarken gerekli açık atamaları gerçekleştirin.
  • Hatalara neden olan ve modelleme için yararlı olmayan veri sütunlarını (GUID'ler veya satır kılavuzları gibi) geçirmekten kaçının.

Desteklenen ve desteklenmeyen veri türleri hakkında daha fazla bilgi için bkz. R kitaplıkları ve veri türleri.

Sonraki Adımlar

SQL makine öğrenmesi ile gelişmiş R işlevleri yazma hakkında bilgi edinmek için şu hızlı başlangıcı izleyin: