先日、SQL Server の Python を勉強するための取り掛かりについての話題になったので、自分なりのまとめを。
SQL Server の ML サービスですが、SQL Server 2016 までの R サービスがベースになっているため、基本的な内容については、R サービスの内容を使用することができるかと。
R サービスの際のコンテンツとしては、次のものが基本となるかと。
基本的な動作を確認するには、チュートリアルを最初から流してみるといいかと思います。
Microsoft から提供されているチュートリアルとしては次のようなものがあります。
- SQL Server Python Tutorials
- sql-server-samples/samples/features/machine-learning-services/python/getting-started/
- Get Started with SQL Server Machine Learning Services
Python の ML サービスを学習する流れとしては、
- SQL Server と Python のスクリプトの連携の基本的な内容を学習する
- Python を使用したデータ加工方法を学習する
- Python を使用したデータ分析方法を学習する
というようなステップで分けると考えやすいのではと思います。
Contents
SQL Server と Python のスクリプトの連携の基本的な内容を学習する
この部分については、 sp_execute_external_script の基本的な構文を理解するのが最初になります。
SQL Server の ML サービスのとしては、
- データベースの内部に高度なデータ分析基盤 (Advanced Analytics) がある
- データを外部に出すことなく分析ができる
というような、特徴があります。
アプリケーション側にデータ分析基盤を持った場合は、アプリケーションからデータベースにアクセスを行い、データの分析を行うというような流れとなります。
アプリケーションとデータベースが近くにあった場合でも、一度データがネットワーク上に流れるため、ネットワークのオーバーヘッドや一時的にデータを流すことによるセキュリティについての考慮が必要となることがあります。
データベースの内部に、データ分析基盤を持っている場合には、データは外部に流れないため、セキュリティについての検討事項が減ってくるのではないでしょうか。
(完全に検討しなくてはよいというわけではなく、「少なくなる」ということを意識しておく必要がありますが)
Python とのスクリプトの連携ですが、以下のようなスクリプトが基本形となるのではないでしょうか。
DROP PROCEDURE IF EXISTS usp_ML GO CREATE PROCEDURE usp_ML (@output varbinary(max) OUTPUT) AS EXEC sp_execute_external_script @language= N'Python', @script = N' import pickle version = input_data["version"][0] print(inputvalue) outputbin = pickle.dumps(version) output_data = input_data ', @input_data_1 = N'SELECT @@version AS version', @input_data_1_name = N'input_data', -- 入力データの変数名を InputDataSet から変更する場合に利用 @output_data_1_name = N'output_data', -- 出力データの変数名を OutputDataSet から変更する場合に利用 @params = N'@inputvalue int, @outputbin varbinary(max) output', @inputvalue = 1, @outputbin = @output OUTPUT WITH RESULT SETS (( version nvarchar(max) )) GO
sp_execute_external_script ですが、そのまま実行するよりは、ストアドプロシージャでラップして実行を行うことの方が多いのではと思います。
上記のスクリプトでは、次のような処理が行われています。
- ストアドプロシージャから Python スクリプトを実行し、実行結果をバイナリで取得する
- Python スクリプトには、SQL の実行結果を連携
- 後続処理で使用する Python のオブジェクトを pickle でシリアライズし、シリアライズした結果をストアドプロシージャの実行時変数に設定
- Python スクリプト内のデータセットをストアドプロシージャのコール元に返す
次のような方法で実行することが可能です。
DECLARE @output varbinary(max) DECLARE @T1 TABLE(C1 nvarchar(max)) DROP TABLE IF EXISTS ML_P CREATE TABLE ML_P (C1 varbinary(max)) INSERT INTO @T1 EXEC usp_ML @output OUTPUT INSERT INTO ML_P VALUES (@output) GO
Python スクリプトからのデータセットの出力結果については、テーブルに INSERT するような方法で実行を行っています。
Python の実行結果をデータセットで受け取る場合にはこのような方法がとられるのではないでしょうか。
もう一つ、Python のオブジェクトをシリアライズしたバイナリデータを受け取っています。
これは、Python のオブジェクトを「後続処理」「再利用」するための方法として利用されます。
主には「機械学習の学習済みモデルを再利用」するために使用されるのではないでしょうか。
今回は pickle を使用していますが、この辺はバイナリデータとして受け取れれば他の方法でもよいのではと。
後続の処理でシリアライズしたオブジェクトを使用する場合には次のような実行を行います。
シリアライズしたオブジェクトは SQL Server のテーブルに格納されていますので、その内容を変数としてスクリプト内に渡し、Python スクリプト内ではデシリアライズして、処理を実行しています。
機械学習の場合は、この、デシリアライズされているオブジェクトは機械学習のモデルになるかと。
DECLARE @output varbinary(max) = (SELECT C1 FROM ML_P) EXEC sp_execute_external_script @language= N'Python', @script = N' import pickle version = pickle.loads(inputvalue) print("=" * 10) print(version) ', @params = N'@inputvalue varbinary(max)', @inputvalue = @output
SQL Server と Python スクリプトの連携については、この辺の基本パターンを理解するのがファーストステップではないでしょうか。
Python を使用したデータ加工方法を学習する
この部分から Python についての基本スキルが必要になってくる箇所になるのではないでしょうか。
SQL Server 内の Python スクリプトの利用ですが、SQL Server のスクリプトとして一から作成するのではなく、Python の IDE で作成した Python スクリプトを SQL Server に移植する形で実行するのが一般的な方法になるかと思います。
開発環境については、各自の使いやすいものを使用することになるかと思いますが、次のようなものがあるかと。
ここで、通常の Python の基本的な使い方についても覚える必要が出てきますので、公式ドキュメントを勉強する必要も出てくるかと。
Python 3.5.4 ドキュメント
また、Python スクリプトの入力と出力のデータについては、pandas のデータセットとして取り扱われるため、pandas のオブジェクトの取り扱い方は覚えておくとよいのではないでしょうか。
Python 2.x 系の本になるようですが、Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理 の内容が参考になりそうなのではと思っています。
ML サービスで使用されている Python については、3.5.2 が使われているため、この 3.x 版があれば即買うのですが。
ML サービスで SQL Server のデータを取り扱う際には、機械学習の予測モデルに渡すためのデータの加工/整形が発生しますので、この部分の Python のスキルが必須で必要になってくるかと。
Python を使用したデータ分析方法を学習する
この部分がコアになってくるかと。
SQL Server 内で Python が実行実行できるようになったことで、R Services が ML Services へとサービス名の変更が行われましたが、基本的に実装されている内容としては、次の内容となります。
- SQL Server 内で Python スクリプトが実行できるようになった
ML Services は、SQL Server として機械学習のモデルを内包しているものではなく、機械学習のモデルによりデータの予測をするための基盤として使うものになります。
そのため、データを分析するための機械学習のモデルについては自分で作成を行う必要が出てきます。
この部分については、既存の Python の機械学習のモデルがあれば、再利用が可能なのでしょうが、ない場合は自分で学ぶ必要が出てくるため、ここの学習コストが当面の悩みですね。
ここについては、 ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 が評価が高いので、私もこれを購入して勉強をしようかと考えています。
私の場合は Python についても学習をする必要があるので、udemy の Python のコースを利用しています。
Udemy では、Python + 機械学習のコースがいくつか提供されています。
定価の状態ですと、1 万円以上するのですが、不定期のようですがキャンペーンを実施しているようで、キャンペーン中であれば、1,000 円台で購入ができますので、そのタイミングを狙っています。
ニューラルネットワークや、scikit-learn を使用した機械学習が学べるようですので、機械学習を初歩から学ぶためには、取り掛かりやすのではないでしょうか。
私の場合、数学的な知識もないため、数学についても勉強しなくてはいけませんが…。