記事公開日
最終更新日
第10回 オープンデータを利用した予測/分類(3/3)-2
3.1.2. Azure SQL Databaseの利用
前項では、Azure BLOBからデータをインポートしたり、エクスポートしたりする手順を紹介しました。その際、CSVファイルを例に紹介しましたが、本来であればCSVファイルのように構造化データに近いデータ(半構造化データなどと呼ばれることもあります)は、BLOBではなく型や、列を指定した上でSQLデータベースに格納したほうが望ましいと考えられます。
そこで本項では、Azure SQL Databaseにデータセットを保管し、インポートまたはエクスポートを行う手順を紹介します。大まかな方針は、予めAzure上にSQL Databaseを作成しておいて、Azure SQL DatabaseからAzure Machine LearningへインポートするためのデータセットをVisual Studioに付属しているSQLクライアントである「SQL Server オブジェクトエクスプローラー」を使用してアップロードするというものになります。SQL Server Management StudioやVisual Studio Codeなど、そのほかのクライアントアプリケーションを使用する場合も、設定する認証情報や送信するSQL文は変わりません。
今回アップロードするファイルは、Azure Machine Learningに予め用意されている「Iris Two Class Data」を編集してCSVファイルにした、「iris.csv」です。
3.1.2.1. SQL Databaseの作成
はじめに、Azure上にSQL Serverを作成します。
Azureポータルを開き、「SQLデータベース」メニューをクリックします。
開いたパネルの上部にある「+追加」ボタンをクリックします。
「データベース名」から「ソースの選択」まで、必須項目を入力します。「リソースグループ」には、ストレージアカウントの作成時に指定したのと同じ値を設定しました。また、今回はデータベースのみ作成し中身は別途SQLクライアントから追加するため、「ソースの選択」には「空のデータベース」を選択しました。
「サーバー」をクリックして、開いたパネルにある「+新しいサーバーの作成」をクリックします。右側に表示されたパネルで必要事項を入力することによって、サーバーの設定を行います。設定項目一覧を以下に示します。
「場所」の設定値には「東日本」や「西日本」を指定したかったのですが、次の価格レベルの設定の際に全ての項目が無効化されてしまい、サーバー作成を完了することができなかったため、今回は「東南アジア」を選択しました。
項目 |
値 |
解説 |
サーバー名 |
qesml |
全Azure SQL サーバーの内で一意の文字列 |
サーバー管理者ログイン |
qes |
サーバー管理者のユーザー名を入力 |
(Microsoftアカウント名とは無関係の文字列) |
||
パスワード・ |
******** |
サーバー管理者のパスワードを入力 |
パスワードの確認 |
(長さ8文字以上で、英大文字/英小文字/数字/記号のうち3種類を含む文字列) |
|
場所 |
東南アジア |
デプロイ先のリージョンを選択 |
V12サーバーの作成 |
はい |
既定値のまま |
Azureサービスに |
有効 |
既定値のまま |
サーバーへのアクセスを許可する |
入力が終わったら、「選択」ボタンをクリックします。
次に、「価格レベル」をクリックします。
今回は学習目的として使用するので、最も安価な「Basic」を選択します。価格レベルは、必要に応じて後から変更することができます。「Basic」をクリックした後、「選択」ボタンをクリックします。
「作成」ボタンをクリックします。
作成処理が完了すると、「デプロイメントが成功しました」と通知されます。
一度、Azureポータルのトップページに戻り、「リソースグループ」メニューをクリックします。
「リソースグループ」パネルにある、先ほど作成したSQL Databaseを含むリソースグループ名(今回は「AML」)をクリックします。
「AMLリソースグループ」パネル左側にある「概要」をクリックします。右側に、名前が「qesml」で種類が「SQLデータベース」となっている行が存在することを確認します。
この行をクリックすると、「SQLデータベース」パネルが表示されます。
作成したSQL Databaseへプログラムから接続するために接続文字列を取得する必要がある場合は、パネルの右側にある「データベース接続文字列の表示」をクリックして、接続文字列を表示し、控えておきます。
3.1.2.2. SQL Databaseへのデータ投入
作成したSQL Databaseに対して、データセットの中身をインポートしていきます。
Azureポータルを開き、「SQLデータベース」メニューをクリックします。
作成したSQLデータベースの名前(今回は「qesml」)をクリックして、パネルを開きます。
パネルの右上にある「ツール」ボタンをクリックします。
「ツール」パネルに表示される「Visual Studioで開く」行をクリックします。
「Visual Studioで開く」パネルの「Visual Studioで開く」ボタンをクリックします。
ダイアログが開くので、「許可」ボタンをクリックします。
Visual Studioが起動します。
Visual Studioが起動した後、しばらく待つと「接続」ダイアログが表示されます。
サーバー管理者のパスワードを入力して「接続」ボタンをクリックします。
「接続しています…」というメッセージが表示された後、「新しいファイアウォール規則の作成」ダイアログが表示されます。必要があれば接続している通信環境に応じて設定値を変更した後、「☑OK」ボタンをクリックします。
「実行中…」というメッセージが表示された後、すべてのダイアログが消えてメインウィンドウだけ表示された状態になります。
さらにしばらく待つと、「SQL Serverオブジェクトエクスプローラー」パネルが表示されます。
「SQL Serverオブジェクトエクスプローラー」のツリーで、「SQL Server」→「qesml」→「データベース」→「qesml」→「テーブル」まで展開します。「テーブル」を右クリックして、「新しいテーブルの追加」メニューをクリックします。
SQL文を入力します。「rice.csv」をインポートするため、テーブル名は「rice」とします。また、各列のデータ型は、Class列は「0」または「1」なので整数型、その他の列は全体の桁数が2桁、小数点以下の桁数が1桁の小数なので数値型としました。
CREATE TABLE [dbo].[rice]( [Year] [int] NOT NULL, [HighestTemp] [float] NOT NULL, [LowestTemp] [float] NOT NULL, [Rainfall] [float] NOT NULL, [SunHours] [float] NOT NULL, [WindSpeed] [float] NOT NULL, [Pressure] [float] NOT NULL, [Acreage] [int] NOT NULL, [Yields] [int] NOT NULL, [Pref] [int] NOT NULL, [Latitude] [float] NOT NULL, [Longitude] [float] NOT NULL ) ON [PRIMARY] |
SQL文を入力し終わった後、タブの下にある「更新」ボタンをクリックします。
「データベース更新のプレビュー」ウィンドウが表示されるので、「データベースの更新」ボタンが有効になるまでしばらく待ちます。
「データベースの更新」ボタンが有効になったら、クリックします。
処理が終了した後、「更新が完了しました。」というメッセージが表示されます。
左側のパネルにある「最新の情報に更新」ボタンをクリックし、ツリーのテーブル直下に、作成した「rice」(dbo.rice)テーブルが表示されることを確認します。
次に、テーブルの中身を追加していきます。「rice」テーブルを右クリックして、「データの表示」メニューをクリックします。
「rice」テーブルの内容が表形式で表示されます。まだデータを追加していないので、列名のみが表示されています。
タブの下にある「スクリプト」ボタンをクリックします。
SQL文を入力するための新しいタブが開きます。
「rice.csv」の各行に対応したINSERT文を作成し、エディタに入力します。
INSERT INTO [dbo].[rice] ([Year], [HighestTemp], [LowestTemp], [Rainfall], [SunHours], [WindSpeed], [Pressure], [Acreage], [Yields], [Pref], [Latitude], [Longitude]) VALUES (2004,13.696,5.946,3.089,4.558,3.574,1009.008,120500,623900,1,43.064,141.347);
INSERT INTO [dbo].[rice] ([Year], [HighestTemp], [LowestTemp], [Rainfall], [SunHours], [WindSpeed], [Pressure], [Acreage], [Yields], [Pref], [Latitude], [Longitude]) VALUES (2005,12.733,5.354,3.388,4.659,3.548,1007.879,119100,682600,1,43.064,141.347);
INSERT INTO [dbo].[rice] ([Year], [HighestTemp], [LowestTemp], [Rainfall], [SunHours], [WindSpeed], [Pressure], [Acreage], [Yields], [Pref], [Latitude], [Longitude]) VALUES (2006,12.957,5.727,3.138,4.727,3.824,1009.756,115400,643900,1,43.064,141.347); … |
入力が完了したら、タブの下にある「実行」ボタンをクリックします。
処理が終了すると、「メッセージ」タブに処理結果が出力されます。
表形式で「iris」テーブルの中身が表示されているタブに戻して、タブの下にある「最新の情報に更新」ボタンをクリックします。
INSERT文で追加した内容が表示されることを確認します。
3.1.2.3. Azureファイアウォールの設定
最初にVisual StudioからAzure SQL Databaseへ接続した際に指定した「Azureファイアウォール」の設定を、Azureポータル上で確認する手順を紹介します。通常のインターネット接続であれば必要になる場面は少ないと思われますが、モバイル回線など、グローバルIPアドレスが動的に割り当てられる環境では、初回設定時と次回接続時でグローバルIPアドレスが異なるために、接続が拒否されてエラーとなる可能性があります。そのような状況では、Azureポータルにアクセスして、ファイアウォール設定を変更することで解決することができます。
まずAzureポータルから、「SQLデータベース」パネルを開きます。上部にある「サーバーファイアウォールの設定」ボタンをクリックします。
「ファイアウォール設定」パネルが開きます。Visual Studioの「新しいファイアウォール規則の作成」ダイアログで設定したIPアドレスが登録されていることを確認できます。
必要に応じて、IPアドレスやIPアドレスの範囲を追加したり削除したりできます。
設定変更が終わった後、画面上部の「保存」ボタンをクリックします。
「サーバーのファイアウォール規則が正常に更新されました」という通知が表示されることを確認します。
ファイアウォール規則を削除した後、再びVisual StudioからAzure SQL Databaseへアクセスしようとすると、エラーメッセージが表示されます。
この場合、再度Azure SQL Databaseに接続するためには、以下のいずれかの方法によってファイアウォール規則(ルール)を追加し直す必要があります。クライアント側のIPアドレスが変化した場合にも、同様の手順でファイアウォール規則の変更を行う必要があります。
l Azureポータルでのルール追加
l マスターデータベース上でのTransact-SQL「sp_set_firewall_rule」実行
Ø SQL Server Management Studioを使用して実行
Ø ADO.NETを使用してプログラムから実行
3.1.2.4. クエリエディターの利用
ここまで、Visual Studioの「SQL Serverオブジェクトエクスプローラー」を使用してデータベースを作成し、データを追加する手順を紹介しました。この手順とは別に、Azureポータル上に用意されている「クエリエディター」を使用することによっても同様の結果を得ることができます。しかし、「クエリエディター」は現在プレビュー版の扱いのため、画面表示や手順が今後変更される可能性があるため注意が必要になります。
まず、Azureポータルを開き、「SQLデータベース」の「ツール」パネルを開き、「クエリエディター (プレビュー)」をクリックします。
「クエリエディター」が開くので、画面上部にある「ログイン」ボタンをクリックします。
認証情報を入力し、「☑OK」ボタンをクリックします。
ログイン処理に若干時間がかかるため、このまましばらく待ちます。
「次として承認済み」という通知が表示された後、SQL文を入力します。今回は、テーブルの作成とデータの挿入の両方のSQL文をまとめて入力しました。
-- テーブル「rice」の作成 CREATE TABLE [dbo].[rice]( [Year] [int] NOT NULL, [HighestTemp] [float] NOT NULL, [LowestTemp] [float] NOT NULL, [Rainfall] [float] NOT NULL, [SunHours] [float] NOT NULL, [WindSpeed] [float] NOT NULL, [Pressure] [float] NOT NULL, [Acreage] [int] NOT NULL, [Yields] [int] NOT NULL, [Pref] [int] NOT NULL, [Latitude] [float] NOT NULL, [Longitude] [float] NOT NULL ) ON [PRIMARY]
-- データの追加 INSERT INTO [dbo].[rice] ([Year], [HighestTemp], [LowestTemp], [Rainfall], [SunHours], [WindSpeed], [Pressure], [Acreage], [Yields], [Pref], [Latitude], [Longitude]) VALUES (2004,13.696,5.946,3.089,4.558,3.574,1009.008,120500,623900,1,43.064,141.347);
INSERT INTO [dbo].[rice] ([Year], [HighestTemp], [LowestTemp], [Rainfall], [SunHours], [WindSpeed], [Pressure], [Acreage], [Yields], [Pref], [Latitude], [Longitude]) VALUES (2005,12.733,5.354,3.388,4.659,3.548,1007.879,119100,682600,1,43.064,141.347);
INSERT INTO [dbo].[rice] ([Year], [HighestTemp], [LowestTemp], [Rainfall], [SunHours], [WindSpeed], [Pressure], [Acreage], [Yields], [Pref], [Latitude], [Longitude]) VALUES (2006,12.957,5.727,3.138,4.727,3.824,1009.756,115400,643900,1,43.064,141.347); … |
入力し終わった後、「実行」ボタンをクリックします。
データの追加処理まで完了すると、「クエリが成功しました」というメッセージが出力されます。この時、「影響を受ける行」の件数が先ほど入力したINSERT文の件数と同じであることを確認します。
続いて、追加されたデータの中身が正しいかを確認するために、SELECT文を実行してみます。エディタ部分に以下のSQL文を入力して、「実行」ボタンをクリックします。
SELECT * FROM rice |
処理が終了すると、画面下部の「結果」パネルにデータが出力されます。境界をドラッグアンドドロップして表示領域を広げたり、グリッドサイズを調整したりといった操作ができます。
3.1.2.5. Azure Machine Learning側の設定
作成したSQLサーバーの「サーバー名」、「サーバー管理者ログイン」、「パスワード」、SQLデータベースの「データベース名」を使って、Azure SQL DatabaseのデータをAzure Machine Learningにインポート/エクスポートするための手順を紹介します。
まず、Azure BLOBからAzure Machine Learningへデータを入出力する実験を開き、「SAVE AS」ボタンをクリックして、別名で保存します。
「Import Data」モジュールが選択された状態で、右側のパネルにある「Data source」の値を「Azure SQL Database」に変更します。
すると、以降の設定値が全て空になるので、引き続き、Azure SQL Databaseに接続し、データを読み込むための必要事項を設定します。設定項目と設定値は以下の通りです。
次に、「Export Data」モジュールが選択された状態で、右側のパネルに、Azure SQL Databaseに接続し、データを書き出すための必要事項を設定します。設定項目と設定値は以下の通りです。
設定が終わったら、一度保存しておきます。
ここまでの手順でAzure Machine Learningの実験上での作業はほぼ完了していますが、実験を実行(Run)する前に、「Export Data」モジュールで指定したデータ書き出し先のテーブル「rice_result」を作成しておく必要があるため、一旦Azure Machine Learningを離れて、Azureポータル上で作業を行います。
Azureポータルの「SQLデータベース」パネルから、「クエリエディター」を開き、以下のSQL文を入力します。「rice」データベースを作成したときとは異なり、「Scored Labels」列を追加してあることに注意が必要です。
CREATE TABLE [dbo].[rice_result]( [Year] [int] NOT NULL, [HighestTemp] [float] NOT NULL, [LowestTemp] [float] NOT NULL, [Rainfall] [float] NOT NULL, [SunHours] [float] NOT NULL, [WindSpeed] [float] NOT NULL, [Pressure] [float] NOT NULL, [Acreage] [int] NOT NULL, [Yields] [int] NOT NULL, [Pref] [int] NOT NULL, [Latitude] [float] NOT NULL, [Longitude] [float] NOT NULL [Scored Labels] [float] NOT NULL, ) ON [PRIMARY] |
入力が終わった後、「実行」ボタンをクリックします。実行が終了し、「クエリが成功しました」と出力されることを確認します。
また、作成した「rice_result」テーブルに対してSELECT文を実行してみて、エラーが出力されないことを確認しておきます。
「rice_result」テーブルの作成が完了したら、Azure Machine Learningの実験画面に戻り、「Run」ボタンをクリックして処理を実行します。
全てのモジュールについて実行が終了した後、「Import Data」モジュール下部の丸印からメニューを開き、「Visualize」メニューをクリックします。
「rice.csv」モジュールと同様のデータセットが表形式で表示されることを確認します。
インポートに成功していることが確認できたので、次は、「rice_result」テーブルへ正常にエクスポートされていることを、Azureポータル上の クエリエディターで確認します。以下のSQL文を入力します。
SELECT * FROM rice_result |
「実行」ボタンをクリックします。
画面下部の「結果」パネルを開き、「Score Model」モジュール下部の丸印から「Visualize」メニューを実行した結果と同様の表が出力されていることを確認します。
3.1.3. Azure Table Storageの利用
前項では、SQLデータベースに格納したデータをインポートする手順を紹介しました。Azureには、Azure Table Storageという、NoSQL(Not Only SQL)データベースも用意されています。それぞれ以下に挙げるような長所が存在するので、扱いたいデータの特徴に合わせてSQLデータベースに格納するか、NoSQLデータベースに格納するかを選択すると良いでしょう。
l Azure SQL Database(SQLデータベース)の長所
Ø トランザクション処理を行うことで、金融情報のように、整合性が厳密に問われるようなデータを正確に扱うことができる
Ø 商用のデータベース製品が多く、サポートを期待できる
l Azure Table Storage(NoSQLデータベース)の長所
Ø トランザクション処理を行わないため、読み書き処理が高速
Ø スケーラビリティが高く、容易にデータ数を増やすことが可能
Ø 構造化データだけでなく、テキストやマルチメディアファイルのような非構造化データを格納することが可能
Ø 分散処理を行うことで、可用性が高い
NoSQLが適しているデータの例として以下のようなものが考えられます。
項目 |
特徴 |
IoTセンサーデータの保存 |
若干の欠落を許容しても、大量のデータを収集するために高速さとスケーラビリティの高さが必要 |
マスターデータの保存 |
データ更新がほぼ発生せず、参照が多くを占めるため、トランザクション処理の重要性が低い |
SNS |
リアルタイム処理のため、高速さが必要 |
データ解析 |
既にファイルなどに保存されているデータを読み込ませた後、一部分を切り出して分析するため、トランザクション処理の重要性が低い |
ここでは、Azure Table Storageにデータを格納し、Azure Machine Learningからデータセットを入出力する手順を紹介します。格納するデータは、rice.csvと同様のものです(後述しますが列の名前を若干変更する必要があります)。
はじめに、Azure Table Storage上にデータセットを用意します。今回は、Azureポータルを使用せずにStorage Explorerのみを用いて作業を進めてみます。
まず、Storage Explorerを開きます。「Storage Accounts」→ストレージアカウント名→「Tables」で右クリックメニューを開き、「Create Table」を実行します。
「Tables」配下に「qesml」テーブルを作成します。
作成した「qesml」テーブルを選択します。
ここで、CSVファイルをインポートする前に、列の名前を設定し直す必要があります。Table Storageでは、Partition KeyとRow Keyが必須のプロパティと定められており、なおかつ、Partition KeyとRow Keyの組み合わせによってエンティティ(個々のデータ)が区別されなければなりません。そこで今回は、「Pref」を「PartitionKey」に、「Year」を「RowKey」に列名のみ変更することで対応します。既存の列を変更できない場合は、新たに列を追加する必要があります。変更後、上書き保存を行います。
Storage Explorerに戻って、ツールバーの「Import」ボタンをクリックします。ダイアログボックスが表示されるので、「rice.csv」を選択し、「開く」ボタンをクリックします。
「import Entities」ダイアログが表示されるので、「Import」ボタンをクリックします。
インポートされたデータセットが表示されます。
必要に応じて、アカウントキーを取得しておきます。これもStorage Explorerから実行できます。
前項のSQL Databaseの時と同様にAzure Machine Learningの実験を作成し、「Import Data」モジュールのプロパティを設定します。
ここで、「Run」をクリックして実行する前に、列名を変更するためのモジュールを配置します。
CSVファイルをAzure Table Storageにインポートする際に、Azure Table Storageの制約を満たすために列名を変更していましたが、ストレージから読み出した後は
「PartitionKey」、「RowKey」という列名にしておく必要性がないため、可読性のために実施しておきます。列名を変更するだけで列に含まれる各データの値を変更するわけではないので、必要に応じて実施してください。
まず、「Clean Missing Data」モジュールと「Split Data」モジュールの間に、「Edit Metadata」モジュール2個と「Select Columns in Dataset」モジュール1個を配置します。
1つ目の「Edit Metadata」モジュールを選択し、右側にあるパネルで以下の値を設定します。
2つ目の「Edit Metadata」モジュールを選択し、右側にあるパネルで以下の値を設定します。
「Select Columns in Dataset」モジュールを選択し、右側パネルにある「Launch column selector」をクリックします。
表示されたcolumn selector画面で、「Timestamp」列以外のすべての列を選択します。
「Run」をクリックして実行し、「Import Data」モジュールに緑色のチェックマークが表示されることを確認します。
3.1.4. 公開されたWebページの利用
前項では、Azureの中のサービスからデータをインポートしたり、エクスポートしたりする手順を紹介しました。いずれの場合も、入手したデータを一度ローカルに保存した後、Azureの各サービスにアップロードするという手順が必要でした。本項で紹介する「Web URL via HTTP」を使うことで、Web上に公開されているデータファイルを直接読み込むことができ、手間を省くことができます。ただし、「Webページ」と表現されていますが取得できるファイル形式がCSV、TSV、ARFF、SvmLight形式に限定されているため、HTMLファイルをスクレイピングしてデータを取得するというようなことはできません。
今回は、CSVファイルをGitHubのサーバから取得し、クラス分類を行う実験を作成しながら、実際の操作手順の例を紹介します。
以下のモジュールを配置します。
配置した各モジュールに対して、以下のような設定を行います。
① Import Data
GitHubで公開されているオープンソースのCSVファイルの例として、今回は、Pythonでデータ分析を行う際に広く利用されているpandasライブラリのリポジトリに存在するアヤメのデータのURLを指定しました。このファイルには、先頭に「SepalLength,SepalWidth,PetalLength,PetalWidth,Name」と書かれた見出し行が存在しているため、「CSV or TSV has header row」を有効化していますが、他のファイルを指定した場合には、データのみで見出し行が含まれていないこともあるので、ファイルの内容を確認し、データに応じて設定します。
② Split Data
もとのCSVファイルに含まれているデータを半分ずつランダムに分割して、学習用データと評価用データとするための設定です。総データ数によっては1:1に分割するのではなく、割合を3:7や2:8に変更しても精度よく分類できるかもしれません。その場合は「Fraction of rows in the first output dataset」に「0.3」や「0.2」を設定します。
③ Multiclass Decision Forest
「Multiclass Decision Forest」モジュールの設定値は既定値のままです。パラメーターを調整することで、分類精度が向上する可能性があります。
④ Train Model
分類対象のデータ列を指定します。クラス分類なので、カテゴリカルデータの「Name」を指定しています。
各モジュールの設定が終了したら、モジュール同士を図のように接続し、「SAVE」ボタンをクリックして一度保存しておきます。
「Run」ボタンをクリックして実行します。
「Evaluate Model」モジュールまで実行が終了した後、「Import Data」モジュール下部の丸印から「Visualize」メニューをクリックします。
指定したURLに存在するファイルと同じ内容のデータが表示されることを確認します。
次に、「Evaluate Model」モジュール下部の丸印から「Visualize」メニューをクリックします。
アヤメのデータセットをクラス分類した結果が表示されます。全体の精度「Overall accuracy」が 、全クラスの平均精度「Average accuracy」が になりました。