WiDS Datathon2021にAutoAIを使った予測でSubmitしてみる

#はじめに
[WiDS Datathon2021](https://www.widsconference.org/datathon.html)は2021年の[WiDS Worldwide conference](https://www.widsconference.org/conference.html)の開催前の時期に合わせて[Kaggle](https://www.kaggle.com/)を使って行われるCompetitionです。

[Women in Data Science (WiDS Worldwide)](https://www.widsconference.org/)は、性別に関係なく、世界中のデータサイエンティストにインスピレーションを与え、教育を行い、現場の女性を支援することを目的としした活動です。

##参加資格
[WiDS Datathon2021](https://www.widsconference.org/datathon.html)の参加資格は、4人以内のチームで（1人でもOK）、チームの半数が女性であること**のみ**です。女性の皆さん、間に合えばどんどん参加しましょう! 男性の皆さんもチームに半分以上の女性を誘って参加しましょう!

##スケジュール
全て2021年、日時はUTCです。

- 1月6日 KaggleでDatathon開始
- 2月26日 チームのMerge期限。この日は、競技者がチームに参加したり、Mergeしたりできる最終日です。
- **3月1日 Leaderboard Prizeの対象となる最終的なKaggleの提出期限**
- 3月8日 WiDSワールドワイドカンファレンスにて、Datathon Leaderboardの受賞者を発表

##今回の課題
今回の課題は、ICUに入院した患者が特定のタイプの糖尿病（Diabetes Mellitus）と診断されたかどうかを判断するという課題です。

##参加方法
[WiDS Datathon2021](https://www.widsconference.org/datathon.html)の参加方法は、[こちら](https://www.widsconference.org/datathon_details.html)に記載されています。Prizeもここに記載されています、

簡単に言うと、WiDSのサイトで[register](http://bit.ly/widsdatathon2021_registration)してから、 [WiDS Datathon page on Kaggle](https://www.kaggle.com/c/widsdatathon2021/overview/description)で参加してねってことです。

#AutoAIを使って予測してみる
AutoAIはIBM Cloud上のWatson Studio(あるいはCloud Pak for Data)で使える、学習データを渡すと自動で機械学習モデルを作成できるツールです。

実は昨年のWiDS DatathonもAutoAIを使って参加してみました。さすがに入賞するほどの結果は出なかったのですが、半分以上くらいの順位は出たと記憶しています。今年もAutoAIチャレンジってことで、AutoAIで参加してみます。

尚、残念なお知らせですが、学習データ量の関係で、**無料枠内では最後まではできませんでした。**　

無料でやってみたかった方は、AutoAIの使い方だと思って別データで試してみていただければと思います。

以下はIBM Cloud上のWatson Studio(あるいはCloud Pak for Data)を使う前提で書いています。

##1. データ準備
[WiDS Datathon page on Kaggle](https://www.kaggle.com/c/widsdatathon2021/overview/description)に`Join Competition`して(kaggleへのユーザー登録が必要です)、データタブから必要なファイルをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/53f9f499-04d9-1e1a-9c50-f209e4cc1056.png)

ダウンロードアイコンからダウンロードすると、提供されているすべてのファイルがZipされたファイルがダウンロードできます。適当な場所にunzipしておきましょう。

以下が各ファイルの概要です:

- TrainingWiDS2021.csv - トレーニングデータです。130,157件あります。列の詳細については、Data Dictionaryファイルにあります。
- UnlabeledWiDS2021.csv - 非ラベルデータ（糖尿病かどうか(diabetes_mellitus)が提供されていないデータ）です。これらの情報のdiabetes_mellitus変数を予測するように求められています。
- SampleSubmissionWiDS2021.csv - 正しいフォーマットのサンプル提出ファイルです。
- SolutionTemplateWiDS2021.csv - 提出物に含まれるべきすべての行のリストです。
- DataDictionaryWiDS2021.csv - データに関する情報です。


##2. AutoAIを使うための前準備
###2-1. Watson Studio サービスとプロジェクトの作成
まずはWatson Studio サービスとプロジェクトの作成をします。手順は以下になります。
[Watson Studio サービスとプロジェクトの作成](https://qiita.com/nishikyon/items/ba698b638300848b746e)

###2-2. Machine Learningサービスの作成
これはIBM CloudのWebコンソールのカタログから作成しても、Watson Studioから作成してもOKです。同じリージョンで既に作成済みであればそれを使用することが可能です（同じリージョンである必要があります。）

作成するのは以下です。
- 作成するサービス: `Machine Learning`
- リージョンの選択: Watson Studioと同じリージョン

####方法1: Watson Studioから作成
- [Watson Studio(Cloud Pak for Data)からサービスを作成](https://qiita.com/nishikyon/private/feff6467e1f75fcc0dfd)

####方法2： IBM CloudのWebコンソールから作成
- [Watson APIを使うための前準備: サービスの作成と資格情報の取得の「1. Watson サービスの作成」](https://qiita.com/nishikyon/items/9b8f697db7ad0a693839#1-watson-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90)

###2-3. デプロイメント・スペースの作成
作成したモデルを利用するにはデプロイメント・スペースへのデプロイが必要なので、先に作成しておきます。
以下の手順で実施してください(前提は実施済みなので、1から実施）。

- [Watson Studio(Could Pak for Data): デプロイメント・スペースの作成](https://qiita.com/nishikyon/private/e9452c159aadf15f08ee)

###2-4. Machine Learningサービスとプロジェクトの関連付け
以下の手順で実施してください(前提は実施済みなので、1から実施）。

- [AutoAI: Machine Learningサービスとプロジェクトの関連付け](https://qiita.com/nishikyon/private/5c782e51dcb5ef737f4d)

##3. AutoAIでモデル作成
いよいよ AutoAIでモデル作成します。Watson Studio(またはCloud Pak for Data)でプロジェクトを開いた状態（2-4が終了している状態）から説明します。

###3-1. 上部にある`プロジェクトに追加`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a46ddd12-3794-0303-cadf-e2a6fd3e7188.png)

###3-2. 「資産タイプの選択」画面から`AIエクスペリメント`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8ec819ae-a766-47a4-facc-e936d52fa27b.png)

###3-3. 「新規 AutoAI エクスペリメント」の画面で`名前`を入力し、`作成`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/baa91606-c03b-5898-3173-c0e552f9dab7.png)

###3-4. 「データ・ソースの追加」画面が表示されるので、「1. データ準備」でダウンロードした`TrainingWiDS2021.csv`ファイルをドロップするか、参照から選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4ccf6839-1443-3b71-8141-3c99bb950f0a.png)

##3-5. 予測列をセットして実行
しばらく待つと、「AutoAI エクスペリメントの構成」画面が表示されるので、「詳細の構成」にある「予測する内容」の「予測列」のドロップダウンから, 予測すべき値「糖尿病かどうか」の列`diabetes_mellitus`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/62774d76-d9e0-52e6-8c5a-897fc8c0e3e0.png)

AutoAIはデーターから2項分類であると予測タイプを判断しました。問題なければ`エクスペリメントの実行`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7a6518c9-28ea-19b7-acb2-0a3b72a8c383.png)

しばらくすると以下の画面になり、実行の状況が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/062fec7d-c290-fd21-fbdd-8c96f5c3653a.png)

しかし残念ながら無料プランでは力及ばず、、、1つパイプラインを作成完了でキャパオーバーになりました。1時間くらいで力尽きてたようです、、、、。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c966bd99-1221-9dc6-afb0-a90c24352e28.png)

キャパが足りてた場合は、デフォルトの設定で8つパイプラインができるのですが、、、。
もちろん作成完了したこの1つのパイプラインは保存し、モデルとしてDeployできます。
とりあえず作成できたこのパイプラインのモデルを使うことにしたいのですが、もうキャパがなく後続作業ができないため、**ここから先は実際には別有料環境を混ぜてやっています**。

「キャンセル」をクリックして、作成できたパイプラインをモデルに保存します。

##3-6. モデルの保存
「パイプライン・リーダーボード」にある保存したいパイプラインの行にマウスを重ねると、右側に「名前をつけて保存」というボタンが表示されるので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8e939a05-f531-c00b-3c2e-0621aaae361a.png)

「モデル」が選択されていることを確認し、名前を変更したい場合は変更して、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c3e52172-ee1d-9d8b-9f22-fa56aebaaa90.png)


「モデルが正常に保存されました」のメッセージが右上に表示されるので、「プロジェクトに表示」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/32cd335a-575b-08da-c70d-697ca3ef92d7.png)

モデルの概要が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/3eeb0933-f2c1-3df5-f272-c83cd841675f.png)

##3-7. モデルのプロモート
このモデルがWebサービスで使用できるようにモデルをデプロイメント・スペースにプロモートします。
右上の「Promote to deployment space」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/5fff2f41-a7bf-da63-503d-7b4d2466076e.png)

「スペースへのプロモート」が表示されます。ターゲット・スペースが「2.AutoAIを使うための前準備」で作成したデプロイメントスペースになっていることを確認し、「プロモート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a5ab0042-b07c-5424-efff-42a460843939.png)

「デプロイメント・スペースに正常にプロモートされました」のメッセージが表示されれば、プロモート完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/115cca07-280d-a47d-072e-01f17c542872.png)

>実際無料枠でできたのはここまです。
>この先も無料枠で行いたい場合は、デプロイメント・スペースをエクスポートし、別の無料枠があるアカウントのWatson Studio(またはCloud Pak for Data)でデプロイメント・スペースをエクスポートしたファイルから作成して続けてください。

#4. モデルのデプロイ
デプロイメント・スペースでプロモートしたモデルをデプロイします。
右上のナビゲーションメニューをクリックし、「デプロイメント・スペース」→「すべてのスペースの表示」をクリックします。

- 「すべてのスペースの表示」の下にデプロイメント・スペース名が表示されていれば、そこをクリックして直接デプロイメント・スペースを開くこともできます、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/91e8e2af-551b-9036-918b-6ce30f056132.png)

デプロイメント・スペース一覧が表示されるので、モデルをプロモートしたデプロイメント・スペース名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a58b5f77-a3cf-05c5-e016-72bbb8e49399.png)

ここで後ほど使用するkaggleからダウンロードした予測すべき値が入ったファイル`UnlabeledWiDS2021.csv`をデプロイメント・スペースにアップロードしておきます。

`ここにファイルをドロップするか、アップロードするファイルを参照します。`の四角いエリアに`UnlabeledWiDS2021.csv`をドラッグ・アンド・ドロップします。または`ここにファイルをドロップするか、アップロードするファイルを参照します。`をクリックしてファイルダイアログを表示して`UnlabeledWiDS2021.csv`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c0fa471c-2e20-5f4d-2243-74036717375a.png)

アップロードされ、「データ資産」として表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/80e97a77-13fb-b021-dbc6-eb65052c9d2c.png)



「資産」タブに表示されているプロモートしたモデル名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e423dfe2-a88b-97ad-a788-078c3977d564.png)

右上の「デプロイメントの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c8a67a51-a141-2653-5e17-f8d6b5d8f772.png)

kaggleからダウンロードした`UnlabeledWiDS2021.csv`をサクッと渡して結果を出したいので「デプロイメント・タイプ」は「バッチ」を選択し、名前を入力、ハードウェア定義を選択して、`作成`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0f7049af-c581-12f3-1c64-bad266aa8b07.png)

「デプロイ済み」と表示されればデプロイ完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/83a13bd0-f501-d0b5-eca4-526652a9523d.png)

#5. ジョブの実行
`ジョブの作成+`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/83c1cc68-73bb-eb71-b1d8-0d3e907a4e6b.png)

「詳細の定義」のページで「名前」を入力し、`次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0b3840ac-bbcf-057c-1c42-e30066960cf7.png)

「構成」のページで「ハードウェア仕様」を確認し（必要に応じて変更）、`次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/27331724-ccf2-b2e9-6f68-178da90766e2.png)

「スケジュール」のページはそのまま、`次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d04fbf9d-be6d-7c8e-3110-0c6474742055.png)

「データの選択」のページで、`データ・ソースの選択`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b2af3ee7-75f5-ad9b-ef5f-69bb903d662a.png)

`UnlabeledWiDS2021.csv`にチェックを入れ、`確認`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/85e0ddba-f8f1-ba93-ea0f-4a9cd2b1e771.png)

Warningが出ますが、そのままにして、出力の下にある「名前」を入力します。結果を出力するファイルの名前になります。名前を入力したら`次へ`をクリッックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/917617d8-01a9-d8c1-a6e7-4d6b4829196c.png)

「レビューして作成」のページで確認後、`作成`をクリッックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/5dd0e9ee-d1e5-eace-2e93-32e7f8893efd.png)

作成したジョブが一覧に表示されます。作成したジョブ名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a31bc1e3-e4ad-1ad7-d1f1-9120a29cad82.png)

ジョブの実行状況が見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0cba81c5-be66-a24b-bbff-b184a8d684cf.png)


状況が「完了」になったら、上部にあるデプロイメント・スペース名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/15405135-3991-12f4-ffc1-6c712b514d88.png)

「資産」タブをクリックすると。「データ資産」にジョブで指定した出力ファイルができています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/ddda7bf1-7c36-a781-4e4c-a10fb902da14.png)

ダウンロードアイコンをクリックして、出力ファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/5d787561-90d2-7371-0322-82c02b83f44f.png)

中身を確認します。predictionが予測結果で、probabilityは配列で、ラベル0、1の確信度になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/63b213fb-cf33-9df9-8b8b-56c03881a565.png)



#6. 提出ファイルとしてフォーマットして、Submit


`SampleSubmissionWiDS2021.csv`をみるとencounter_id,diabetes_mellitus(の確率)を入れることになっていますので、この形にフォーマットします。idは出力ファイルにありませんが、入力ファイル`UnlabeledWiDS2021.csv`の行の順で予測されているので、この中のとencounter_idと結合して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/273cb075-4fd3-0051-28d6-9e39b4778af1.png)

フォーマットはExcelなんかでやってもよいですが、まあここはpythonでやっておきます。
以下のコードでフォーマットしました。

```py
mport pandas as pd

#バッチの出力ファイル
RESULT_FILE = '/Users/xxxx/WiDS_Datathon/result.csv'
#バッチの入力ファイル
INPUT_FILE = '/Users/xxxx/WiDS_Datathon/widsdatathon2021/UnlabeledWiDS2021.csv'
#Submission用に作成するファイル名
OUTPUT_FILE = '/Users/xxxx/WiDS_Datathon/submission.csv'


def create_submission_file():
    df_result = pd.read_csv(RESULT_FILE)
    df_input = pd.read_csv(INPUT_FILE)

    df_output = pd.DataFrame()

    df_output['encounter_id'] = df_input['encounter_id'].copy()
    df_output['diabetes_mellitus'] = df_result['probability'].apply(lambda x: eval(x)[1]).copy()

    #print(df_output[0:5])

    df_output.sort_values('encounter_id', inplace=True)
    df_output.reset_index(inplace=True, drop=True)

    #print(df_output[0:5])

    df_output.to_csv(OUTPUT_FILE, index=False)
    return


if __name__ == '__main__':
    create_submission_file()
```

作成された`submission.csv`を[WiDS Datathon2021](https://www.widsconference.org/datathon.html)でSubmitします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/869c0d2b-91f1-0884-e4cd-50a69af9d2d9.png)

Submitの結果はScoreは0.85009、**2021年2月17日現在の順位は507チーム中288位でした。**
AutoAIのモデルで昨年は上位30％だったのに今年は半分以下だったので、やはり最後までモデル作成ができたものがあればという感じですね、、、。

#まとめ
最後にフォーマットでCodeを書きましたが、AutoAIでkaggleに出せるそこそこ?のモデルがコーディングなしで簡単に作成できるのがわかったと思います。みなさんもkaggleにAutoAIで挑戦してみてください。入賞は難しいかもしれませんが、「そこそこ」いけます!



機械学習の腕に自身のあるかたはぜひ入賞目指して自分の力で[WiDS Datathon2021](https://www.widsconference.org/datathon.html)にSubmitしてみてください!!

以上です。