この記事は、2017 年 5 月 29 日 に Data Platform Tech Sales Team Blog にて公開された内容です。
4月19日の Data Amp で SQL Server 2017 の Python Integration が正式に発表されました。これは SQL Server 2016 で機能追加された SQL Server 2016 R Services を SQL Server 2017 Machine Learning Services に拡張し、R に加えて Python による Advanced Analytics を利用可能にするという内容です。
そこで今回は Python を T-SQL を用いて実行する In-Database Python を試してみようと思います。
インストール
まずインストールです。
SQL Server 2017 CTP2.1 のセットアップで Machine Learning サービス(データベース内)にチェックを入れます。
そのままインストールを進めていくと、「Python のインストールに同意する」画面があらわれるので、承認ボタンをクリックすることで「次へ」ボタンを押すことができるようになります。
インストールが完了したら、サーバー構成オプションで「external script enabled オプション」を有効にしておきます。
EXEC sp_configure 'external scripts enabled', 1; |
CTP2.1 では RECONFIGURE WITH OVERRIDE が効かなかったのでインスタンスの再起動が必要でした。
また CTP 2.0 では既知の不具合があり、次のログインを作成する必要があります。
CREATE LOGIN [TESTSQLSERVERSQLRUserGroup] FROM WINDOWS |
インプットとアウトプット
SELECT ステートメントの結果セットを sp_execute_external_script ストアドプロシージャの @input_data_1 で渡すと、Python スクリプト内で InputDataSet 予約変数で受けることができます。下のスクリプトから分かるように、この InputDataSet はデータフレームとして渡ってきます。
CREATE TABLE #t1(a int, b char(10)); INSERT INTO #t1 VALUES (1,'test1'); GO execute sp_execute_external_script @language = N'Python' ,@script = N' print(type(InputDataSet)) ' ,@input_data_1 = N'SELECT * FROM #t1' GO
|
(1 行処理されました) 外部スクリプトからの STDOUT メッセージ: C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibsite- packagesrevoscalepy <class 'pandas.core.frame.DataFrame'> |
また Python スクリプト内の OutputDataSet 予約変数もデータフレームタイプを持ち、結果セットとしてT-SQLへ返すことができます。
execute sp_execute_external_script @language = N'Python' , @script = N' import numpy as np import pandas as pd n = np.arange(0, 9, 1) n = n.reshape(3, 3) OutputDataSet = pd.DataFrame(n) ' WITH RESULT SETS (([col1] char(5), [col2] char(5), [col3] char(5))) GO |
簡単な機械学習の実行
これだけ分かれば大抵のことはできるでしょう。さっそく Python で機械学習を試してみましょう。
データは以前 関連記事「Azure Machine Learning Studio を使ってモデルをスクラッチから構築してみよう」で使った "Wine Data Set" を利用しました。
あらかじめこの Wine Data Set をダウンロードし、wine というテーブルにロードしておきます。インプットとして渡せるデータ型については参考リンク "Python Libraries and Data Types" を参照してください。
create table wine ( [Class] int, [Alcohol] float, [Malic acid] float, [Ash] float, [Alcalinity of ash] float, [Magnesium] float, [Total phenols] float, [Flavanoids] float, [Nonflavanoid phenols] float, [Proanthocyanins] float, [Color intensity] float, [Hue] float, [OD280/OD315 of diluted wines] float, [Proline] float ) GO bulk insert wine from 'D:wine.data' with ( BATCHSIZE = 1000, FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0A', DATAFILETYPE = 'char' ) GO |
もともとこのデータセットは 3 つの分類種別を持っていて、今回使った Python の LogisticRegression モデルは多クラス分類に対応しているのですが、上述の関連記事では同じデータセットを 2 クラス分類の例として使用したので、ここでも 2 クラスのデータに絞ってモデルを構築してみました。
execute sp_execute_external_script @language = N'Python' , @script = N' df = InputDataSet # データのスプリット df_train = df.sample(frac=0.7) df_test = df.drop(df_train.index) # 学習用データ X_train = df_train.loc[:,["Alcohol","Malic acid"]] y_train = df_train["class"] # テスト用データ X_test = df_test.loc[:,["Alcohol","Malic acid"]] y_test = df_test["class"] # モデルの初期化 from sklearn.linear_model import LogisticRegression logreg = LogisticRegression(penalty="l2",C=100,max_iter=100) # 学習の実行とスコアの算出 logreg.fit(X_train, y_train) score = logreg.score(X_test, y_test) # 結果の出力 print("The Score is "+str(score)) ' ,@input_data_1 = N'SELECT [class], [Alcohol],[Malic acid] FROM dbo.wine WHERE [class] < 3' GO |
実行するとホールドアウト法によるスコアが 0.87 となりました。
外部スクリプトからの STDOUT メッセージ: C:Program FilesMicrosoft SQL ServerMSSQL14.MSSQLSERVERPYTHON_SERVICESlibsite- packagesrevoscalepy The Score is 0.871794871795 |
今回は基本的な In-Database Python の操作を試してみました。Python を用いてゴリゴリデータ抽出・整形を行うところを、T-SQL の SELECT ステートメントで必要なデータだけを Python スクリプトに渡すことができるので便利だと感じました。
また今回は revoscalepy で提供されている強力な Python 関数を利用しませんでしたが、これらの関数を利用することで In-Database Python のスケーラビリティとパフォーマンスを Advanced Analytics の分野に利用できることは素晴らしいことだと思います。
N
参考リンク
Microsoft Machine Learning Services
https://docs.microsoft.com/en-us/sql/advanced-analytics/r/r-services
Machine Learning Services with Python
https://docs.microsoft.com/en-us/sql/advanced-analytics/python/sql-server-python-services
Python Libraries and Data Types
https://docs.microsoft.com/en-us/sql/advanced-analytics/python/python-libraries-and-data-types
Introducing revoscalepy
https://docs.microsoft.com/en-us/sql/advanced-analytics/python/what-is-revoscalepy
関連記事
Azure Machine Learning Studio を使ってモデルをスクラッチから構築してみよう
https://blogs.msdn.microsoft.com/dataplatjp/2017/01/18/azure-machine-learning-studio/