【AzureML】サンプルデータの収入予測をやってみた

今回はサンプルデータの[特徴の選択による二項分類 - 収入の予測](https://github.com/Azure/MachineLearningDesigner/blob/master/articles/samples/binary-classification-feature-selection-income-prediction.md)を利用してみたいと思います。

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

# サンプルを開く
今回利用するサンプルを開きます。
利用するのは`Binary Classification with Feature Selection - Income Prediction`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/7361e120-3612-4efc-ae6c-15fe1c7b98cc.png)
利用するデータも見ておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/3c105868-fc1f-9bbc-1f53-7aa577553c5b.png)
年齢や学歴、収入などが入ったデータみたいですね。



# サンプルの内容
今回のブロックは以下のようになってます。
前回とは結構違うようですね。気になる点を見ていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/e7b0371b-2832-0cbd-8b47-eadacb92b0bb.png)

`Filter Based Featuer Selection`というブロックがあります。何をやっているかがコメントに書いてあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/5f54963f-8bb6-83a5-6723-7a9d876b000d.png)

どうやら`ChiSquared`によって５個のカラムを選んでいるようです。
`ChiSquared`はカイ二乗検定というものらしいで、関係があるかどうかの判定を行うために使います。
つまりここでは関係の強いカラム５つを選定しているようです。TargetColumnに`income`が設定されているので、これについての関係の強さを見ているのでしょう。
実際にどうなっているのか、ここだけ切り取って実行してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/270820da-e8bf-0e56-f4bf-ac02fe6eb002.png)
実行結果はこのようになっていますね。カラムが6つだけになっています。
ちゃんと算出結果を見ることもできますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/1f53d7fd-1c39-ce2c-c53a-2aa72b3716f0.png)
これによってデータ量の多すぎるものを関係の強いものに絞って学習することができますね。

それでは元のサンプルに戻ってみましょう。
アルゴリズムのある左のブロック群は前回までと同様の流れを組んでいますね。
テストのほうはなんだか複雑になっています。
それぞれ確認してみましょう。

`Select Columns Transform`は入力されたデータと同じカラムを返すブロックのようです。
そのカラム情報を`Apply Transformation`に渡すことでテストデータのカラムを学習データと同じものにしているようです。
その後テストデータとして利用されていますね。
また、SelectColumnsInDatasetでincomeのデータを削除して再度結果を出しています。
これはおそらく利用時に取得できるデータを作成してるのではないでしょうか。
モデルの評価をするだけなら必要ないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/67ad0554-6af6-e899-e12f-ca67b1f99c16.png)

# サンプルをいじってみる
それでは少しいじってみましょう。
先日のように複数のモデルの比較をしてみたいと思います。
また、3つの評価の比較はできていなかったので、pythonコードを記述して結果を結合してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/d73c7d2d-6c43-4f8b-8296-b97edc8e120a.png)

pythonコードでやってることは単純で、二つのEvaluteModelのデータを`pd.concat()`で結合してるだけですね。
既存のjoinブロックだと横に結合されちゃったのでpythonコードでやってみました。
結果がこれですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/51880b9f-7737-fc44-2415-f80caa3c2d43.png)

ちゃんと3つのデータが並んで比較できます！よかった！
ただ、EvaluteModelブロックのほうが可視化されてわかりやすいので普段はそちらを使うことがおすすめですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/0db1282c-bdec-7eb2-d4b1-f99746b0c623.png)
特に閾値を変動させつつ精度を確認できるのはすごくわかりやすくていいと思います！
これで最適な閾値や自身の望む閾値の精度を簡単に確認できますね。

上のグラフだと少しわかりにくいですが、データを複数選んでおくとグラフも複数表示されて比較できるようになってます。
これもいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/580a8b14-17f6-a137-57d3-d7b4b42726ec.png)


# まとめ
今回は[特徴の選択による二項分類 - 収入の予測](https://github.com/Azure/MachineLearningDesigner/blob/master/articles/samples/binary-classification-feature-selection-income-prediction.md)を使ってモデルの作成を行ってみました。
また、pythonコードの直接実行もやってみました。簡単に実行できるので、簡単な処理や現状pythonでやってる内容などをそのまま簡単に流用できそうなのはいいですね。
今回は初の二項のサンプルを実行してみましたが、ほとんど回帰と変わらずにブロックを組み上げることができました。
特にEvaluteModelの可視化部分がわかりやすくていいですね。上述しましたが、閾値を変動させて精度を直接確認できる点がとてもよかったと思います。
次回はこのEvaluteModelのデータや予測結果などをblobにcsvとして出力できないのかをいろいろ試してみたいと思います。