タイタニックデータセットでAutoAIのお手並み拝見

# はじめに
AutoAIは、最近(2019年6月)発表されたばかりの、IBM Cloud上で稼働する機械学習モデルの自動生成・最適化を行うツールです。
機械学習モデルのベンチマークとして有名な、Kaggleから提供されているTitanic Data を元ネタにその精度を実際に測ってみました。

[2020-04-25] 初期セットアップ手順修正

# 問題設定
オリジナルデータは、[Kaggleサイト](https://www.kaggle.com/c/titanic/data)からダウンロードしています。
元の学習用データ ``train.csv``は下のような構造のデータです。

![スクリーンショット 2019-06-22 19.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b2a45738-23e2-4a70-fd09-3f4b8351e036.png)

いろいろなKaggleベンチマーク挑戦サイトを見ると``Name, Ticket, Cabin``といった項目からも頑張って情報をとってきているようですが、AutoAIの仕組みを見る限りそこまでのことはできていない模様。
そこで、割り切ってこの3列を落とした形でツールにかける方針としました。

最終的には、次のような問題設定としています。

**学習用データ** ``train_titanic.csv``  
元学習データ``train.csv``から、``PassengerId, Name, Ticket, Cabin``を落としたもの。

![スクリーンショット 2019-06-22 19.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0309c6df-1385-0354-8ff0-7f306dd0f5ac.png)

**検証用データ** ``test_titanic.csv``
元データ ``test.csv``と``gender_submission.csv``を``PassengerId``でJOINした後、``PassengerId, Name, Ticket, Cabin``を落としたもの。

![スクリーンショット 2019-06-22 19.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a58ed6a3-e9d4-4099-8cfb-b140601171ca.png)

# 必要ファイルのダウンロード
以下の実習では、次の3つのファイルを利用します。
どのファイルもgithubにアップしてあってダウンロード可能ですので、事前にダウンロードしておいて下さい。

|ファイル名  |目的  |URL  |短縮URL |
|---|---|---|---|
|train_titanic.csv  |学習用  |https://raw.githubusercontent.com/makaishi2/sample-data/master/data/titanic_train.csv  |http://bit.ly/2MnDW3R|
|autoai-test.ipynb |精度検証用  |https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/autoai-test.ipynb  |http://bit.ly/2L9ZZJ5|
|titanic-autoai.json |Webサービステスト用 |https://raw.githubusercontent.com/makaishi2/sample-data/master/data/titanic-test-web-autoai.json|http://bit.ly/2N3k9XD|

なお、上で紹介した正解データ``test_titanic.csv``に関してはJupyter Notebookの内部で取得しています。短縮URLは http://bit.ly/2Y6SF4C ですので、こちらから直にダウンロードして確認することも可能です。
また、検証用Jupyter Notebookをきれいな形で見たい場合は [Jupyter リンク](https://github.com/makaishi2/sample-data/blob/master/notebooks/autoai-test.ipynb)を参照して下さい。

# クラウド環境の準備
これでデータの準備は整いました。いよいよ先ほど説明した学習データを使って、AutoAIによりタイタニックのモデルを作ってみたいと思います。
そのためには、IBM Cloudでアカウントを作って、IBM Studioのプロジェクトを準備する必要があります。
しかし、今回のモデルを作るための準備としてはIBM Cloudの中で一番簡単に作ることのできる**Lite Acount**(クレジットカードなしで登録でき、しかも無期限に利用可能)で対応可能です。
そのための手順については、別記事
[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)
に書いておきましたので、こちらを参照して下さい。
ちなみに、この手順でAutoAIのために必要なのは、「Studioのプロジェクト作成」までと「**Watson MLの登録**」です。
「Notebookの作成、ファイルの読み込み」は、Jupyter環境を自分のPCに持っていない場合は、後半の検証プログラム実行環境として利用できます。Jupyer環境をすでに自分のPCに持っている場合は使わなくても結構です。

# モデル作成
IBM Cloudの準備もできたので、モデルの作成にとりかかります。Watson Studioのプロジェクトの準備までできていたら、モデルを作るのは本当に簡単です。

## AutoAIの呼出し
まず、プロジェクト管理画面上部の「Add to project」のリンクをクリックします。下のようなメニューが出てくるので、**AutoAI Experiments**を選択します。

![スクリーンショット 2019-06-22 22.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0fc4f386-9740-46f7-983f-842eed557ed5.png)

下のような画面が出てくるので、まず画面左中程のAsset Nameの欄に「AutoAI Titanic Test」など適当な名前を入力します。
「Watson Machine learning Service Instance」に先ほど設定したWatson MLの名前が設定されていることを確認した上で、画面右下のCreateボタンをクリックします。

![スクリーンショット 2019-06-22 22.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b863d70b-6ecb-35f8-0a9d-af847bcbf1ce.png)

## 学習用データの指定
すると下のような画面が出てくるので、前のステップで用意した``titanic_train.csv``ファイルをdrag and dropします。

![スクリーンショット 2019-06-22 22.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/13bb6fbb-b2f8-3551-25c1-3d6b3c5399cd.png)

## 目的変数の指定
今度は、下のような画面になります。まず、画面右の「**Select column to predict**」の質問に答えます。目的変数が何かという質問ですので、``Survived``をクリックします。
画面下の**selected predictions**と**OPTIMIZATION METRIC**はそれぞれ事前に選ばれている**Binary Classification**と**ROC AUC**で構いません。最後に画面右下の**Run experiments**のボタンをクリックします。

![スクリーンショット 2019-06-22 22.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fe215b2f-03ec-7430-7c93-fd11865042a5.png)

これでモデル作成のための入力はすべて完了です。下のような画面が出てきたら、あとはすべてWatsonに任せて下さい。

![スクリーンショット 2019-06-22 22.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d22589aa-5bcf-0dfa-9e43-e9708711ea11.png)

## 最適なモデルの選定と保存
10分程度待っていると、下のような画面になります。これで4つのモデル候補がすべてできあがりました。
![スクリーンショット 2019-06-22 22.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b2bec362-dd79-f76c-8daa-499db6366207.png)

画面を下の方にスクロールすると、次のような画面が出てきます。これは、4つの候補の精度を比較している画面になります。
この中で一番精度のいいモデルをリポジトリに登録し、Webサービス化することにします。そのため、画面赤枠の「Save as model」をクリックします。

![スクリーンショット 2019-06-22 22.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/847dc204-2393-891e-92c4-9acedebad76f.png)

すると、下のような画面になるので、**Model name**を適当に入力し、画面右下の「Save」ボタンをクリックします。

![スクリーンショット 2019-06-22 22.30.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e065a3dd-900b-2958-25e9-9471c4fbc2cd.png)

正常に登録ができると、下の画面になるはずです。ここで、赤枠で囲んだ「View in project」をクリックします。

![スクリーンショット 2019-06-22 22.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4ee33ba0-957f-8b74-b89c-f9bfe70e3e50.png)

## Webサービスの生成
下のように、ML Modelの管理画面になったら、まず**Deployments**タブをクリックし、次に画面右下の**Add Deployment**のリンクをクリックします。

![スクリーンショット 2019-06-22 22.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/668c7af0-e43c-8f56-abae-2b038df26dc5.png)

次の画面がでてきたら、**Name**の欄に「**Titanic AutoAI Web**」など適当な名前を入力し、画面右下の「**Save**」ボタンをクリックします。

![スクリーンショット 2019-06-22 22.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/451bf461-3982-986b-8fa7-aa10e8d3cbd0.png)

すると下の図のようなDeploymentsタブの画面に遷移します。ブラウザを時々リフレッシュすると、Statusが「**initializing**」から「**ready**」に変わっていくはずです。「**ready**」になったら準備完了なので、一番左のWebサービス名のリンクをクリックします。

![スクリーンショット 2019-06-22 22.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3a2050d1-3562-48fa-ee1d-7b870d2fec5e.png)
![スクリーンショット 2019-06-22 22.32.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/dead7034-fd73-7c83-48a7-4c9bd3a4574a.png)

## Webサービスのテスト
今度はWebサービスの管理画面に遷移しますので、事前にダウンロードしておいたファイル``titanic-autoai.json``を利用して動作テストをします。
①一番右の「Test」タブを選択します。
②``titanic-autoai.json``をテキストエディタで開いて、ファイルの中身を丸ごと②の場所にコピペします。
③「Predict」ボタンをクリックします。

![スクリーンショット 2019-06-25 8.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a83cb624-0bc6-e225-f649-87ddce83155a.png)

下の画面右のように、**prediction**(=予測値)、**probability**(=確信度)の値が返ってくればテストは成功です。

![スクリーンショット 2019-06-25 8.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3fbe3843-9bd6-bbbd-731a-046e9eb54323.png)

いよいよ次のステップとして、Jupyter Notbook上のPythonプログラムで、Kaggleで提供されているテストデータを利用して、テストデータ全量の精度を検証してみます。



# 認証情報の確認
これからはPythonプログラムで精度検証を行うのですが、その際、Watson Machine LearningのWebサービスAPIを呼び出します。そのため、Watson Machine Learningの認証情報を事前に確認しておく必要があります。認証情報取得の手順を以下で説明します。

## Watson Machine Learningのサービス名の確認
まず、今までのセットアップ手順で自動的に一つ作られているはずである、Watson Machine Learingのサービス名を確認します。

下の図のようにプロジェクト管理のメイン画面で、一番右の「**Settings**」タブをクリックします。

![スクリーンショット 2019-06-23 11.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f2c744bf-30b2-8b99-efd1-5d79c9003383.png)


下の方にスクロールすると、次のような画面になりますので、**SERVICE TYPE**が**Watson Machine Learning**のサービスの**NAME**の欄を調べて下さい。下の図の場合だと、**pm-20-ox**になります。

![スクリーンショット 2019-06-23 11.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9ce47516-cd09-184b-b83b-c06d59b04b2c.png)

## Watson ML管理画面の表示
管理画面右上の「**三**」の場所をクリックします。

![スクリーンショット 2019-06-23 11.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8729ba9d-1f08-6975-4d0f-48683e93ae29.png)

下のようなメニューが表示されますので、一番下の**IBM Cloud**をクリックします。

![スクリーンショット 2019-06-23 11.53.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/87fdb70d-0c21-d8ab-6334-680b17173ffb.png)

下のメニューになったら、上から2つめの「**Resource List**」を選択します。

![スクリーンショット 2019-06-23 11.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a1f11332-d20b-b564-9747-723ef483c1fd.png)

リソース一覧の画面では「**サービス**」の欄をクリックして下さい。先ほど調べたWatson Machine Learningのサービス名があるはずので、それをクリックします。

![スクリーンショット 2019-06-23 12.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/41bc39ec-e4a4-625c-515c-aade0da5bdc3.png)

下のようなWatson Machine Learningサービスの管理画面になります。
① 左のメニューから**サービス資格情報**を選択します。
② 資格情報の一覧の中から適当なものを選び(複数ある場合はどれでも可)画面右の**資格情報の表示**の欄をクリックします。

![スクリーンショット 2019-06-23 12.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/88992982-53cc-ef89-255b-37c85058c6f0.png)

下のような画面になるはずなので、左上のアイコンをクリックして下さい。これで資格情報全体がクリップボードにコピーされました。

![スクリーンショット 2019-06-23 12.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/abdd92c5-cefe-445c-84cb-bc30e9f2e4d8.png)

テキストエディタを開いて、先ほどコピーした内容を張り付けます。これから使う精度検証プログラムで必要なのは、下の4項目(``instance_id, password, url, username``)だけなので
それ以外は削除していったん保存しておきます。

![スクリーンショット 2019-06-23 12.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3bb6e5d1-41da-07d3-be9a-c4c4359d49e6.png)

ちょっと手順は長かったですが、これで認証情報の取得は完了です。もう一つ必要な設定情報としてWeb ServiceのScoring URLがあります。以下の手順でこちらを確認します。

# Scoring URLの確認
[Watson Studioログイン画面](https://dataplatform.cloud.ibm.com/)から再度Watson Studioにログインします。

下の画面になったら、左上の「三」のアイコンをクリックします。

![スクリーンショット 2019-06-23 13.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8bfb4125-42ac-ddf8-fb30-c4314cd82749.png)

プロジェクトの一覧が表示されます。先ほど作業したプロジェクトが表示されている場合は、それを選択して下さい。
もし、なかった場合は「**View All Projects**」を選択し、そこから先ほど作業していたプロジェクトを見つけます。

![スクリーンショット 2019-06-23 13.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cf4435fe-c929-414c-06aa-5d68949577ad.png)

プロジェクト管理の画面になったら、右から3つめの、「**Deployments**」タブを選択します。
先ほど作ったTitanic用のWebサービスがあるはずなので、そのリンクをクリックして下さい。

![スクリーンショット 2019-06-23 13.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8df27de6-8138-e30e-70c7-839ffbd4493d.png)

Webサービスの管理画面になったら、真ん中の「**Implementation**」タブをクリックします。
一番上にある、「**Scoring End-point**」のURLをコピーして、テキストエディタなどに保存しておいて下さい。

![スクリーンショット 2019-06-23 13.30.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/46fd4779-4ab3-3b58-2d63-52ba9787b785.png)

これで、精度検証用のプログラムを動かすための準備は全部整いました。それではいよいよ精度検証を実際に行ってみましょう。

# Jupyter Notebookによる精度検証
これからWatson Machine Learning上に登録されたWebサービスを呼び出すことで、Kaggleデータセットの検証を行います。
Watson APIを呼び出す場合は、そのためのライブラリをPython環境に事前に導入する必要があったのですが、これから実行するWatson MLの呼出しコードで使っているライブラリは、デフォルトで入っていると思われる``urllib3, requests, json``のみです。
なので、これからご紹介するサンプルコードは、Watson Studio上のJupyter環境ではもとより、パソコン(検証はMacで行っています)のanaconda環境でも簡単に試すことができます。

## サンプルnotebookの読み込み
事前にダウンロード済みのnorebookファイル``autoai-test.ipynb``をJupyter環境に読み込んで下さい。

## 認証情報の設定
読み込んだ直後のnotebookは下の図のようになっているはずです。この中の``wml_credentails``のセルを、事前準備した認証情報で置き換えて下さい。

![スクリーンショット 2019-06-23 13.53.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1e1878ce-e3cb-2265-dcd2-11853d44e08e.png)

## Scoring URLの設定
もう一箇所設定が必要なのが、Web Service呼出しのためのScoring URLです。こちらについても事前準備したURLの文字列をセルにコピーして下さい。

## テスト実行
お待たせしました。これで、AutoAIテストのための準備はすべて完了です。
ここまでの設定がすべて正しく行われていれば、すべてのセルを上から順番に実行すれば、Kaggleのテストデータ全418件に関するAUtoAIモデルの予測結果が取得され、それに基づいた精度と混同行列が表示されます。
乱数を使っている関係でいつも同じ結果になるわけではありませんが、私が試した結果をご参考までに添付しておきます。この例だと精度(Accuracy)86.6%、ROC AUC値0.908ということになります。相当高い精度ですね。

![スクリーンショット 2019-06-23 18.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5297bd9d-dedb-3315-2ccf-00289f5b7341.png)

![スクリーンショット 2019-06-23 18.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2978ffc7-8ff1-c519-7b54-d8c7f376ee44.png)

(※) https://www.kaggle.com/c/titanic/leaderboard で調べてみたら、11,300人中170位くらいでした。(2019-06-25現在)

# (参考)検証用データからWebサービスを呼び出すサンプルコード
Watson ML上のサービスを呼び出すやりかたは多少クセがあります。
細かい実装はjupyter notebookをみてもらえばその中に全部書かれているのですが、ポイントになるパラメータの作り方を簡単に解説します。Titanic Dataでなく、独自のモデルで同じように精度検証を行う場合にも適用できるよう、汎用的なコードにしていますので、参考とされて下さい。

```py3
# テスト用csv読み込み
df_titanic_test = pd.read_csv('titanic_test.csv')

# 正解データ correctの抽出
correct = df_titanic_test['Survived'].values

# API呼出し用入力データ配列の作成
df_sub = df_titanic_test.copy()

# 目的変数列の削除
df_sub = df_sub.drop('Survived', axis=1)

# np.nan値をNoneに置き換え
df_sub = df_sub.where((pd.notnull(df_sub)), None)

# DataFrameから項目名Listの生成
fields = df_sub.columns.tolist()

# DataFrameから入力用Listの生成
values = df_sub.values.tolist()

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

# APIの呼出し
response_scoring = requests.post(scoring_url,  json=payload_scoring, headers=header)

# 戻り値のparse
res = json.loads(response_scoring.text)

pred = res['predictions'][0]
pred_values = pred['values']
pred_fields = pred['fields']
df_res = pd.DataFrame(pred_values, columns = pred_fields)
```