【AzureML】サンプルデータの顧客関係の予測をやってみた

今回はサンプルデータの[顧客関係の予測](https://github.com/Azure/MachineLearningDesigner/blob/master/articles/samples/binary-classification-customer-relationship-prediction.md)を利用してみたいと思います。

ワークスペースやクラスターの作成、実行方法等は[最初の記事](https://qiita.com/K-Nomu3/items/6b9c89b958380ea67b64)を参考にしてください。

# サンプルを開く
それではサンプルを開いてみていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/4bebe606-a70f-b790-23c4-cd8f9c35f4f8.png)

今回は割とすっきりしていて見やすいですね。
利用するデータについても見ていきます。今回は二つあるようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/347330d1-5f41-6c3b-db92-6f02dc25567e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/05e292f1-0c3c-ed8c-517e-5f01708e276e.png)
一つには様々なデータが入っており、もう一方には1と-1のデータが入っていますね。


# サンプルの内容
モデルを２つ作っているのと、前処理しているところに目が行きますね。
気になる点をピックアップしてみていきましょう。

## AddColumns
データの結合をしていますね。
前回の記事でも結合は出てきてましたが、そちらは`AddRows`となっており、行を追加するものでした。
今回のAddColumnsは列の追加になります。
なので新しく別データを追加していることになりますね。
片方の行が少ない場合は小さいソースのカラムに欠損値が埋め込まれるようです。
また、このブロックでは追加するデータを選択することはできず、全データを追加することになるようです。
データの取捨選択は別のブロックを用いて行う必要があるようですね。

## SMOTE
さて、続いてSMOTEブロックを見ていきましょう。
SMOTEとは前処理の一種で、二値のデータのカラムをもとに、少ないデータをかさましすることでバランスを調整する手法になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/36d049d7-a411-0f5b-5968-16cde42e4367.png)

`LabelColumn`では基にするカラムを選択します。
`SmotePercentage`では増加させる量を指定します。ここでは少ないデータの数の何パーセントを増加させるかを選ぶことができます。
|多いデータ|少ないデータ|SmotePrecentage|処理後の少ないデータ|
|--|--|--|--|
|570|178|100|356|
|570|178|200|534|
|570|178|300|712|

また、このパラメータには100の倍数しか指定できない点に注意しましょう。
`Number of nearest neighbors`についてですが...あまり理解できませんでした。
ここに指定する数が多いほど特徴を取得できる、とのことなので関係の強そうなデータを生成できるということだと思います。
指定する数が少ないほど元のサンプルに近い特徴を使用する、とのことなので元のデータに似たデータを生成できるということだと思います。
`Random seed`では乱数のシード値を設定できます。これにより同じデータが流れてきた際には同様のデータを生成することができ、場合によって結果が変わってしまうことを防ぎます。

それでは実行結果を見てみましょう。
まずは予測結果を見てみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/3008ce9b-24c0-5756-99f1-911e8151c28e.png)
なぜかスコアデータが入ってないように見えます。
よくよく見てみると列が223列とありますがデータ内では99列目までしか映ってないみたいです。

# サンプルをいじってみる

## 予測結果を確認する
確認するためにデータをエクスポートしてみたいと思います。
エクスポートについては昨日やっているのでそちらをご確認ください。
ブロックはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/1d86cc53-21c8-ba6c-3aa8-aa85deadfab9.png)

また、ScoreModelのパラメータに、`Append score columns to output`という項目があり、
これは出力結果にスコアと予測結果と実際の値以外のデータを含むかどうかを決めるものらしいので、これをTrueからFalseにして確認してみたいと思います。

まずエクスポートしたcsvを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/e31fa30d-f7e1-a004-28db-77bfbbeb3406.png)
ちゃんとデータが入っていました。
あまりにも列が多いとAzureML上だと確認できなくなるようですね。表示最大は100列のようです。

続いてFalseにした結果を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/d57ca876-942e-ed71-768b-d64f9f07b24f.png)

ちゃんと予測値とスコアと実際の値の3列だけになっていますね。
このブロックにつなげた出力も見ておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/2f558329-1313-6977-db5f-6b50478b2617.png)
ちゃんと3つだけのデータが出力されていました。

## blobからのデータ読み込み

今回利用したデータには2種類あったので、片方をblobから読み込んで実行できるかを試してみたいと思います。
異なるデータソースが結合できたら便利そうですね。
修正箇所は一番上のデータを`ImportData`に変えた点のみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/15a82306-6efb-02fe-1046-95fa44cb6000.png)

データソースはデータストア、データストアの場所を選択後データのパスを指定します。
ブロックに「！」が表示されていますが、ExportDataのブロックでも表示されたままになっていたので問題はないかなと思います。
それでは実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/28abf993-dd63-8957-d81e-968984b4863e.png)

こちらが実行結果になります。
前回同様の値が出ています。どうやら問題なくデータを読み込むことができたようです！


# まとめ
今回は[顧客関係の予測](https://github.com/Azure/MachineLearningDesigner/blob/master/articles/samples/binary-classification-customer-relationship-prediction.md)を利用しました。
また、サンプルデータをblobから読み込んで利用してみました。これによってblobに集めたデータで簡単に前処理からモデル作成を行えることがわかりました。
データソースにはHTTP経由のURLも選択できたので、URLでデータのやり取りもできるようです。
こちらも今度試してみたいと思います。