WatsonStudioの「AutoAI 」を使ってみた（評価編）


#１．はじめに
[WatsonStudioの「AutoAI」を使ってみた（学習編）](https://qiita.com/paco_itengineer/items/910b7ee4b6373ff21e4e)に続きまして、今回は評価編を書こうと思います。今回も、可能なかぎり「マニュアルは読まない！」のポリシーでやっていこうと思います。（が、途中で一部参照してしまいました）

前回、モデルの構築をして保存するところで終わっているので、今回はtest.csvで予測をするためにデプロイするところから始めます。最後の方では**Kaggleにsubmit**してみたり、**SonyのPredictionOneと比較**したりもします。

一応、予測に使ったpythonのコードも公開してありますが、あまりコーディングは得意ではなく、ミスがあったらすみません💦💦


#２．環境
・Windows10
・WatsonStudio(IBMCloud)
・python3.6.4(Anaconda) ※ローカル環境

#３．手順
##（１）デプロイする
①WatsonStudioのAssetのページを開くと、下の方に前回作ったモデルが表示されているので、クリックします。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/47596a3e-4adf-181c-9a16-a3946d2e1bb2.png)


②Deploymentsタブをクリックします。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/f18810e3-5b35-2b15-b4f1-0214f3c8def7.png)

③まだ、デプロイできていないので「Add Deployment」をクリックします。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/c5b9760d-deaf-42c9-4adb-e56f68eb758e.png)

④適当な名前を付けて「Save」をクリックします。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/02d5b2bd-2880-ac3f-bd2b-805a8e8c2793.png)

⑤１分くらいでデプロイが完了。Nameをクリックします。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/1674372e-a106-13d8-0000-45141eaa470f.png)

##（２）予測を試す
①デプロイやモデルの情報が表示されます。testタブをクリックします。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/9725893c-7367-2589-8d05-e11151a3fbed.png)

②入力欄に以下のjason（test.csvの１レコード目）を入力して、「Predict」をクリックすると、右側に結果が表示されました:grinning:

```
{"input_data":[{
        "fields": ["PassengerId","Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"],
        "values": [[892,3,"Kelly, Mr. James","male",34.5,0,0,330911,7.8292,null,"Q"]]
}]}
```
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/26b98cb7-655c-3a1a-60d6-fac976390c27.png)

結果は「0」です。正解が分からないのであっているかわかりません💦（意味なし！）
prediction(予測値)=0.589、probability(確信度)=0.411でした。

でも、やりたいのはこれじゃないんですよ。まとまった評価結果が見たいのですよ。どうしたらいいんだ？？？

##（３）一括で予測を実行する（Python)
###パラメータの確認
①「Implementation」のタブを選択して、Code Snippetsで「Python」を選択すると、呼び出し方が出てきました！なるほど、Pythonで自分で書けってことか！！！
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/e9eae3b2-65ba-40df-0d93-dd3d933ed720.png)

②これを見ても、Authorization: Bearer <token>とか、ML-Instance-IDとかよくわからなない。ここまで**「マニュアルを一切読まない!!」**というポリシーを通してきましたが、あきらめて読むことにしました。

**Watson Machine Learning authentication**
https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html

③上記ドキュメントによると以下の５項目を使う必要があるようです。どこにあるんじゃ！
>apikey      : 123456789
>instance_id : ABCDEFG
>url         : https://HIJKL
>username    : MNOPQRS
>password    : TUVWXYZ

④いろいろ探した結果見つかりました。[IBMCloudのリソースリスト](https://cloud.ibm.com/resources)から、「Machine Learning」のサービスをクリックします。

⑤表示された画面の「サービス資格情報」をクリックし、「資格情報の表示」をするとでてきました！５項目とも見つかりました！！！
![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/e416fe72-277a-6b41-a72e-4cc870d31b0e.png)


###実行
以下のドキュメントを参考に進めていきます。
**認証関連**
https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html
**デプロイ**
https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-deploy_new.html?audience=wdp

以下のコードで実行しました。ローカルのJupyterの環境を使っている関係で、細かく区切られていて見づらくなってしまいました。すみません。

```python

import requests
import pandas as pd
import urllib3, requests, json
```
```python
# IM_tokenの取得
apikey = "XXX" #先ほど調べた値
url     = "https://iam.bluemix.net/oidc/token"
headers = { "Content-Type" : "application/x-www-form-urlencoded" }
data    = "apikey=" + apikey + "&grant_type=urn:ibm:params:oauth:grant-type:apikey"
IBM_cloud_IAM_uid = "bx"
IBM_cloud_IAM_pwd = "bx"
response  = requests.post( url, headers=headers, data=data, auth=( IBM_cloud_IAM_uid, IBM_cloud_IAM_pwd ) )
iam_token = response.json()["access_token"]
```
```python

#ml_instance_idの設定
ml_instance_id="XXX" #先ほど調べた値
```
```python

#headerの作成
header = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + iam_token, 'ML-Instance-ID': ml_instance_id}
```
```python

#test.csvの読み込み
df_test = pd.read_csv('test.csv')
df_test.head()
```
```python

# null値をNoneに変換
df_test = df_test.where((pd.notnull(df_test)), None)
df_test.head()
```
```python

#jsonに設定するカラム名と値をそれぞれリストで取得
array_of_feature_columns = df_test.columns.tolist()
array_of_values = df_test.values.tolist()
```
```python

# payload変数の組立
payload_scoring = {"input_data": [{
    "fields": array_of_feature_columns, 
    "values": array_of_values
    }]}
```
```python

#予測の実行（scoring_end_point はImplementationに書いてあった値）
scoring_end_point = "https://us-south.ml.cloud.ibm.com/v4/deployments/xxx/predictions" 
response_scoring = requests.post(scoring_end_point, json=payload_scoring, headers=header)
```
```python

#結果の取得
response_scoring = json.loads(response_scoring.text)
df_result = pd.DataFrame(response_scoring["predictions"][0]["values"],columns = ["Survived","hoge"])[["Survived"]]
```
```python

#PassengerId,Survivedのデータフレームを作成（出力用）
df_result['PassengerId'] = df_test["PassengerId"]
df_result=df_result[df_result.columns[::-1]]
```
```python

#出力
df_result.to_csv("submission.csv",index=False)
```

#４．KaggleへのSubmit
では、出力された**submission.csv**をKaggleにSubmitしてみます。

結果は、以下の通り。**スコア0.72727**。うん、いまいちですね💦まあ、変数全投入していますし、こんなものでしょうか。
![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/ef86f70f-d80e-f853-b68d-23fe001399d8.png)


ちなみに、PredictionOneの結果は、**スコアが0.75598**になりました。
![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/668a5bb6-88f6-9e54-9589-31162748bb45.png)

#５．感想と考察
##（１）感想
精度は・・・いまいちでしたね💦💦
念の為お断りをしておきますと、今回は、何の前処理も変数選択もなしに、そのままデータを突っ込んだのでこのような結果になっています。決してAutoAIの精度が悪いわけではなく、本来の使い方としては、PassengerIDやNameのようなユニーク値は除去するなど、最低限の前処理をしてから実行するものだと思います。

これからは**「ハイパーパラメーターのチューニングはAutoMLにお任せして、人間はデータ収集や前処理を頑張る」**という時代になるのかな~と思いました。

##（２）変数選択について
後で確認したところ、PredictionOneは自動的に**PassengerId,Name,Ticketを除外**して処理していました。なかなかやりますね！！

##（３）PredictionOneと同じ変数でのAutoAIのスコア
AutoAIにおいても手動でPassengerId,Name,Ticketの３項目を除去して学習すると、**Kaggleのスコアは0.77511**になりました。

|ツール|変数|モデル|Kaggleスコア|
|:-------------:|:-----------------:|:-----------------:|:------------------:|
|　AutoAI　|手動で３変数削除|XGBClassifier|0.77511|
|PredictionOne|自動で３変数削除|２値分類|0.75598|
|AutoAI|全変数|ExtraTreesClassifier|0.72727|


##（４）AutoAIの特性
**AutoAIは、データサイエンティストをハイパーパラメータのチューニング作業から解放する可能性があるツール**だと思いました。このツールを使うことで、どのようなデータを集めるべきかとか、どのような前処理をするかといった部分を検討することに注力できるようになるのではないかと思います。**IBMCloud上でサービスとしてデプロイできる**のがとても便利で、より効率的にモデルの構築からサービス化までをつなげることができるようになる便利なツールです。


##（５）PredictioOneの特性
**PredictioOneは一切コードを書かなくても一連の手順がこなせてしまう**ところがすごいです。ITの専門ではない事業部門の方が「機械学習したらどうなるのかな？」と思ったときに、さくっと使ってみるのにとてもいいツールだと思いました。このツールで事業部門の方が試行錯誤し、事業としての方向性が見えてきたら、データサイエンティストやITの専門家に委託するという流れが作れるのではないかと思います。

#６．関連記事
**SONYのAutoMLサービス「PredictionOne」を使ってみた**
https://qiita.com/paco_itengineer/items/7b6f1c62ae7263ac1a43

**WatsonStudioの「AutoAI」を使ってみた（学習編）**
https://qiita.com/paco_itengineer/items/910b7ee4b6373ff21e4e

**WatsonStudioの「AutoAI 」を使ってみた（評価編）**
https://qiita.com/paco_itengineer/items/ca1f97f17bb91ac351eb

**GoogleCloudPlatformの「AutoMLTable」を使ってみた**
https://qiita.com/paco_itengineer/items/4cf064d272f007fcae57