Azureを使ってSalesforceでAIを活用する ~前編~

ドラえもん、鉄腕アトム、ターミネーター、、、人間のように考えてふるまう人工知能はアニメや映画の中では比較的見かけますが、現実世界では2016年現在まだ登場していません。
これらのような振る舞いが人間と変わらない人工知能は「強いAI」と分類され、そこまでではない特定部分での問題解決や推論を行う人工知能は「弱いAI」と定義されています。
将来的にドラちゃん(強いAI)が登場するかは分かりませんが、人工知能研究から派生した弱いAIに分類される人工知能は、既に我々の生活のさまざまな場面で活用が進んでいます。
部屋の形や障害物を認識する自動掃除機、購買履歴や類似ユーザーから他の商品をお勧めするECサイト、迷惑メールの判定、ボスにザラキを使ったり姫を優先して回復する僧侶などなど・・

近年の人工知能の活用の広がりにはビッグデータの蓄積と、集めたデータを「機械学習」と呼ばれる方法を使ってコンピュータが分類、予測できるようになったことが大きいと言われています。

また機械学習をさらに進化させたディープラーニングはコンピュータ自身が世界を認識して特徴を取り出すことができ、人工知能のさらなるブレイクスルーになるのではと期待が高まっています。

SalesforceにおいてもAIに関連する投資の情報はいくつも出ており、昨年のDreamforceでもSalesforceIQという営業担当者のメールやカレンダーを使用して、営業活動をAIによって支援するサービスも登場しています。

このようにAIの波が押し寄せている中、エンジニアとしては人工知能・機械学習についてキャッチアップしておきたいと思っている人も多いのではないでしょうか。
ただ機械学習はデータ集合を解析するので統計学との関連が深く、本格的に活用するにはそれなりに高度な数学の知識が求められます。
また機械学習の利用するためのライブラリはPythonとRのものが非常に多く、これらに馴染みのないエンジニアには学習のハードルを高める1つになっています。

しかしここ数年、クラウドで機械学習のモデルを構築できるサービスがいくつかも登場しています。
Azure Machine Learning、Amazon Machine Learning、Google Cloud Machine Learning、IBM Watson(Bluemix)など・・
これらクラウドサービスはライブラリを利用した場合に比べると自由度は劣ると言われていますが、クラウドの利点であるすぐにサービスとして利用することもできます。またGUIで操作できたり、WebAPIとして公開して他システムと連携できるようなものもあります。
もちろんこれらのサービスを使っても、細かいパラメータの調整やさらなる精度を高めるには統計学の知識が必要になってきますが、それでも機械学習を体験してみるには非常に便利なサービスです。

さて、前置きが長くなりましたが、今回は機械学習を利用できるクラウドサービスの1つであるMicrosoftのAzure Machine Learning(以下AzureML)を使い、Salesforceとの連携を構築して機械学習を体験してみましょう。

仮想シナリオ

あなたの会社はSalesforceの構築を請け負う開発ベンダーです。
見積時に想定するオブジェクト数や画面数、外部システムとの連携本数などから工数を算出しているので、これらの見積データと実際にかかった実績工数を機械学習に学ばせて、今後のプロジェクト見積時に参考値として予測工数を出せるようにしましょう。

概要図

全体的な流れは次の通りです。

Salesforceの見積オブジェクト

項目名 データ型
見積番号 自動採番
プロジェクト名 テキスト
新規顧客 チェックボックス
契約形態 選択リスト
オブジェクト数 数値
開発画面数 数値
Apexトリガ数 数値
連携スクリプト数 数値
参画メンバー数 数値
総期間数(月) 数値

見積番号とプロジェクト名は工数に影響するものではないので学習データからは除外します。

また実際に見積をしたり、より精度の高い予測値を出す場合はこの項目だけでは全然足りないでしょう。「画面の難易度」「オブジェクトの項目数」「連携での変換有無」「トリガでの処理規模」「メンバーのスキルレベル」などなど・・

ただ、今回はシンプルにするため、これらの項目のみを学習させることにします。

余談ですが「何が工数に影響するか?」というのは人間が設計する必要がありますが、実際は関係ない情報を与えてもコンピュータはその情報から工数への影響度を考えて予測をしてしまいます。例えば「見積番号」や「メンバーの平均身長」といった情報を与えることもできますが、これは明らかに現実世界で工数に影響を与えるものではありません。
この「何が必要か?」をコンピュータ自身が見つけ出して物事を判断するのが、機械学習をより進化させたディープラーニングと呼ばれるものです。興味ある方は調べてみてください。

学習用データを作る


まずは学習させるためのデータを作ります。
今回のシナリオではSalesforceにある「見積」レコードと、プロジェクトが終わった後に実際にかかった工数をどこからか持ってくるものとして、以下のようなcsvを作りました。

各数値はリアルなものではなく適当なプロジェクトを想定してオブジェクト数や画面数を記入した後、筆者の経験から実績工数を算出しました。

今回の機械学習は「教師有り学習」と呼ばれるもので、見積の各要素(オブジェクト数や画面数など)と、実際にかかった実績工数を正解ラベルとして学習させ、各要素がどのような値であると実績工数になるかを学習させるものです。

注意点としてファイルの文字コードがShift-JISだと文字化けしてしまうので、UTF-8で作っておきましょう。

AzureMLで学習させる

AzureのアカウントやAzureMLのWorkSpaceは事前に出来ているものとします。この辺はググればすぐに出てきます。

まずは学習用のcsvをAzureMLのデータセットとしてアップロードします。

アップロードが完了すると一覧に表示されます。

次に機械学習の実験モデルを作るためにEXPERIMENTSを新規作成します。
テンプレートは特に選択せずBlankにします。

Experimentに適当な名前を付けます。

Experimentでは左キャンパスに各モジュールがあるので配置したいモジュールを中央キャンパスにドラッグし、モジュール同士をつなぎ合わせてフローチャートのように処理を作成していきます。
そして今回作ったものは以下のようになります。

①アップロードしたデータセットを読み込みます
②学習用と評価用にデータを分けます。今回は7:3にしています
③学習のためのアルゴリズムで今回は実数の予測なので線形回帰のモジュールを使います
④学習データとアルゴリズムを読み込む学習モデルです
⑤④の学習済モデルと評価用のデータを使って実際に値を予測します
⑥予測値を評価します

AzureMLでは各モジュールのアウトプットをVisualizeすることができるので、いくつか流れに沿ってみてみましょう

まず①でcsvを読み込んだ結果です。これはそのままですね。

④の学習モデルで学習した結果が以下の通りです。
各要素が予測対象である実績工数にどのくらい影響を与えているか学習結果が参照できます。

⑤のScoreModelのアウトプットを見てみましょう。
ここでは機械学習された学習モデルを使って実際に工数を予測した結果が見れます。
こうしてみると正解ラベルと予測スコアがそれなりに近いことが分かります。

ラストの⑥では予測値を評価した結果が見れます。
線形回帰では様々な誤差値を見れますが、一番分かりやすいのはCoeffcient of Detemination(決定係数)で、これは予測値と正解値のズレを表したものです。
1に近いほどコンピュータが算出した予測が正解に近いということになります。
今回は0.820278という結果でした。

さて、ではこの学習モデルをWebAPIとして公開しましょう。
公開の仕方は簡単で下メニューの「DEPLOY WEB SERVICE」から実行できます。
するとWebServiceのinputとouputが自動で追加されます。

このまま公開してしまうとinputのインターフェースがcsvのヘッダーのままになりますが、今回のcsvは正解ラベルとなる実績工数のカラムがあります。
学習させるためには必要となりますが、学習済みとなったモデルをAPIとして公開する場合に必要なのは見積の項目だけです。
なのでinputのインタフェースから実績工数を外すためにSelect Columns in Datasetのモジュールを使って見積のカラムだけに絞り込みます。

Runを実行してエラーがないことを確認したらAzureML側は完成です。
自動生成されるAPIドキュメントのページを見ると APIKeyやEndPoint、JSONのインタフェースなどが確認できます。


おさらい

ここまでやったことをおさらいしましょう。
まず学習用のcsvとして見積の情報と、その見積でプロジェクトが終わった(と仮定した)実績工数を準備しました。
次にAzureMLで学習用csvを使って学習モデルを作り、最後にその学習モデルをAPIとして公開しました。

後はSalesforce側からこのAPIに見積情報を渡してスコアを受け取るのですが、長くなってきたので今回はここまでにしたいと思います。
続きは近日公開予定の後編で!

後編が公開されました