Blogger Syntax Highliter

Tuesday, August 25, 2015

Azure ML の Web Services で Excel が表示されない場合の対処法

 

Azure Machine LearningでExperimentをWeb Service向けにデプロイすると、Web Servicesに対応したExcelワークブックを取得することができます。

02

ところがExperimentでのモデルの作り方によってはWeb Serviceに対応したExcelが表示されない場合があります。今回は表示されない場合でもExcelワークブックを使うための対処法を紹介します。

01

 

1. Web Service Parametersを確認する

 1つ目の対処法は、Web Service Parameterを削除する方法です。Training ExperimentでReaderやWriterを使っていた場合、自動的にWeb Service Parametersが設定される場合があります。この状態でWebデプロイ向けのPredictive Experimentを作成すると、Web Service Parametersの設定が残ってしまい、Web Service Parametersが設定されているため、Web Service画面でExcelが表示されません。

 Predictive ExperimentでWriterなどでWeb Service Parametersを使用していない場合は、Web InputのWeb Service Parametersを削除した後に、Deploy Web Serviceすることで、Excelが表示されるようになります。

08

 

2. ExcelのVBAを編集する

 2つ目の対処法はExcelのVBAを編集する方法です。Web Service Parametersが設定されてたWeb Serviceでは、表示されているExceワークブックを使うことができません。Excel内のWeb Service URLやAccess Key、Schemaを変更すれば動きそうな気がしますが、Excel内のVBA(2015/8/24時点)ではWeb Service Parametersに関するデータを送らないため、無効な引数としてエラーが返ってきます。

03

 

Web Service Parametersの入力を含めるためにはExcelのVBAを、API version 2に適したデータに修正する必要があります。例として下記のように変更します。Web Service Parametersのパラメータや、入力名は適した名前に変更してください。

 

きれいなコードではありませんが、ご参考に。

VBAでJsonを使えないのかな。。。

Saturday, August 8, 2015

Azure MLのテキストアナリティクスを使って日本の会社を分類してみる

 

Azure MLのティストアナリティクスを使って、日本の会社を分類してみます。と言っても、日本語の業務内容から分類するには、日本語文章を形態素解析が必要なため少し面倒なので、もっと簡単な方法で簡易的に試してみます。

 

日本語会社名から分類

日本の会社名は漢字で構成されている場合が多いため、使われている漢字から業種を推測することができます。日本人の大人でも、業務内容の知らない会社の業種を完璧に当てることは難しいのですが、漢字の意味を知っていればそれなりに判断することができます。

今回は漢字の意味を知らないAzure MLに、会社名をもとに業種を分類させてみようと思います。Azure MLには、教師あり学習として日経225の会社名と業種を渡して学習させました。

 

日経225の会社一覧からデータの作成

会社一覧のデータは、業種がわかるものが必要です。今回は日経225インデックスの銘柄一覧サイトの情報をもとに、手作業で会社の一覧情報を作りました。

https://indexes.nikkei.co.jp/nkave/index/component?idx=nk225

Excelで入力した後、CSV形式で出力します。

01

出力されたCSVデータの文字コードはShift-JISなので、メモ帳を使ってUTF-8に変更します。(「名前を付けて保存」で文字コードを指定します。)これでAzure MLで読み込む準備が整いました。

02

 

Azure Machine Learningでデータセットを作成

UTF-8にしたCSVを、Azure MLにインポートします。データのインポートは、Dataset追加から行います。

03

 

Azure Machine Learningで日本の会社名から業種を分類するExperimentを作成

今回は、Azure ML が持つテキストアナリティクスのFeature Hashingを使います。通常は単語がスペース区切りになっている英文に利用しますが、日本語の社名は漢字の組み合わせで何となく業種がわかるので、一文字単位でスペース区切りにしてFeature Hashingを行います。下図のようなExperimentを作成します。

04

Project Columnsでは、会社名であるName1カラムとどのような業種を表すsectorカラムを取り出しています。取り出した会社名を今回の用途のために Feature Hashing しやすいように、Execute Python Scriptを使って、文字をスペース区切りにします。作成した文字列はURLエンコード化されてname_txカラムとして追加します。なぜURLエンコードしたのかは、以前の記事をご参照ください。

Pythonだとこんな感じの文字処理になるのでしょうか、、。C#を使いたいです。

 

 

Feature Hashingでは、name_txを選択して、Hashing bitsizeを16ぐらいに、N-gramsを3ぐらいにして、文字のつながりを指定します。xx機械、xx製薬など2文字以上のつながりが多いですよね。

Feature Hashingされたデータは、16ビット分のカラムが作成されており、学習をする際に負荷をかけるため、Filter Based Feature Selectionで特徴のあるデータだけ残します。Feature Scoring MethodはChi Squared(カイ二乗)で、target columnはsectorを選択します。Number of desired featureは1000ぐらいにして、1000個の特徴のあるカラムにします。

あとは、Classification系の教師あり学習を選びます。今回はメモリ使用を抑えた簡易的なMulticlass Desision Jungleを使いました。

最後に、Feature Hashingされた大量のカラムがあると結果が見にくいので、結果を抽出するためにScored Labelsとsectorとname1のみ出力するようにのProject Columnsで調整しています。

結果は

日経225の80%を学習に使い、20%を試した結果は下図の通りです。業種によっては少ない学習数ですが、思っていたより良い感じに分類してくれています。マツダが機械になったのは不思議です。

05

 

最後に

Feature Hashing本来の使い方とは少し異なりますが、考え方は同じなので試してみましたが、思ったより良い結果が出ました。そもそも、会社のことを知らない日本人が見ても分類することは難しいので、完全な結果は出ないことはわかると思いますが、人間が一つ一つ分類するのが難しい大量の単語を一気に分類するときには使えそうですね。