AWS Certified Machine Learning – Specialty 合格しました

先月、AWS認定の機械学習の試験を受験し、合格しました！
その記録を残しておきます。

（私のバックグラウンドを書きますと、AWSを勉強し始めたのは8月後半からで、9月終わりごろにソリューションアーキテクトアソシエイト、10月終わりごろにビッグデータ専門知識を取り、11月の今回が3つ目の試験です。機械学習に関してはだいぶ昔に機械学習の勉強会を聴講していましたが、実務経験は多くはないです。）

前回の受験の記録
[AWS Certified Big Data - Specialty 合格しました](https://qiita.com/suzuki-navi/items/8b2fe5a35a4439013461)

# 勉強方法

以下のリンクは、2013年～2014年ごろに聴講していた勉強会の資料です。今回の試験のために勉強会に出ていたわけではありませんが、私の機械学習に関する知識はこれがベースだった気がします。

- [プログラマの為の数学勉強会](https://nineties.github.io/math-seminar/)
- [パターン認識・機械学習勉強会](https://nineties.github.io/prml-seminar/)

（検索すればYouTubeに講義の動画がたぶん全部あります。1回2時間ぐらいなので、全部見るのは大変です。一時期は私も運営側で動画の編集とかしていました）

今回の試験のための勉強に関しては、どう勉強したらいいのかわからず、行き当たりばったりでサイト上のいろんな記事を読むぐらいでした。機械学習についての一般的な内容の記事や、AWSのSageMakerを中心とする機械学習関係のドキュメントです。最初に書籍も読んだのですが、書籍が試験に生きたかと言えばそうでもない気がします。

以下は、参考にした先輩の方々の記事です。

- [AWS Certified Machine Learning – Specialty に合格してきました - YOMON8.NET](https://yomon.hatenablog.com/entry/2019/05/awscertml)
- [AWSの機械学習エンジニア認定試験を受けてきた - Qiita](https://qiita.com/si1242/items/c7b5d2f3916bf6b159de)
- [AWS Certified Machine Learning – Specialty合格までにやったこと ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/i-passed-mls-exam/)

機械学習の用語はいままであいまいだったものをできるだけ正確に覚えるようにしました。この記事後半の勉強ノートに書いた用語です。

AWSについては、サービスごとの公式ドキュメントや以下のリンクの資料は読みました。ドキュメントは全部読んだわけではないです。パラパラと読んでたぐらいです。

[AWS クラウドサービス活用資料集 | サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

SageMakerにどんな機械学習のアルゴリズムがあるのかはある程度は把握しておきました。全部覚えるまではしなかったのですが、ちゃんと全部把握しておいたほうがよかったです。

[Amazon SageMaker 組み込みアルゴリズムを使用する - Amazon SageMaker](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/algos.html)

以下の私の記事は、今回の受験にあたって手を動かそうと思ってやった内容です。しかし、手を動かしたことが試験に役立ったかといえば、正直あまり実感はないです。

- 機械学習を試すための前準備
    - [Jupyter NotebookをDockerを使って簡単にインストールし起動（nbextensions、Scalaにも対応） - Qiita](https://qiita.com/suzuki-navi/items/37615024d4748aac6688)
    - [PandasのDataFrameに対する基本操作をJupyter Notebook上で試す - Qiita](https://qiita.com/suzuki-navi/items/6bd8377ca7974779a822)
    - [ヒストグラム・散布図をJupyter Notebook上で表示する - Qiita](https://qiita.com/suzuki-navi/items/9f5fd47734b22b4adf71)
- 機械学習を試してみる
    - [SVMをJupyter Notebook上のscikit-learnで試す - Qiita](https://qiita.com/suzuki-navi/items/5745eff3392ec9f75249)
    - [混合ガウスモデルによるクラスタリングをJupyter Notebook上で試す - Qiita](https://qiita.com/suzuki-navi/items/d7c27c9ce815750cdc59)
    - [Kaggleのタイタニック号のチュートリアルを試す - Qiita](https://qiita.com/suzuki-navi/items/d0e33a5379b4bfb848bc)
- AWSのサービスを試してみる
    - [言語の判定をGoogle Cloud TranslationとAmazon Comprehendとで比較してみる - Qiita](https://qiita.com/suzuki-navi/items/2647f1f65ef731d42aa4)

ということで、結局どう勉強したら効率よく試験に臨めるのかはよくわからないままです。

# 試験当日

65問180分。前回のビッグデータの試験と違って今回は時間が余りました。簡単だから余ったのではなく、考えても無駄と判断して、余りました。90分ぐらいで一巡して、60分ぐらいで見直しフラグを付けた問題を見直すのを2巡ぐらいして、残り時間はもう意味がないと思い、終了させました。見直しフラグを付けたのは全体の6割ぐらい。

前回のビッグデータの試験よりも、時間は余ったし見直しフラグを付けた数も少なかったのは、ビッグデータに比べて問題文が短かったのかもしれません。が、簡単だったわけではなく、わからない問題はぜんぜんわからないし、ビッグデータのときと同じくらいには、もうダメだっていう気持ちでした。もうダメだと思いながらも前回は合格したので、今回もひょっとしたら意外といけるのかもという油断もありつつ。

ビッグデータの試験と同様、問題文は日本語と英語とで都度切り替えられますが、基本は日本語で解きました。日本語の問題文の意味がわからなくて、英語にしてみたらわかったというのが1問か2問ぐらいありました。

わからないサービス仕様や用語があったとしても、後のほうの別の問題を解くときにその問題の整合性のためにこういうことなんだろうって想像つくことがあり、そしたら前の問題に戻って新しく得た知識をもとに問題が解けたというケースもありました。2つぐらいそれで助かりました。（正解がわからないので、本当に助かったのかは不明ですが）

AWS関係なく機械学習の一般的な知識を問うものと、機械学習関係のAWSのサービス知識を問うものがあります。ビッグデータの試験に比べてAWS関係ない問題の割合が高かったと思います。

## リモート監視での試験について

AWSでリモート監視でない試験を受けたことがまだないので、どこまでがリモート監視特有の事情なのかはわかりませんが、

前回はリモート監視の会場で試験マシンのスキャナーの調子が悪く、身分確認に非常に時間がかかってしまいましたので、試験予約の段階で別のマシンにしました。今回がAWSの試験3回目で、予約時に記載されている4桁のコードが個別のマシンを識別することがわかってましたので、よさそうなマシン、かつ端の席を選びました。

が、なんとまたスキャナーの調子が悪かったです。調子悪くて時間がかかるとセッションが切れて、初めからやりなおしになって、6桁のコードをもらいなおさないといけないのです。が、セッション切れを想定して、6桁のコードを最初に記憶しておく、というぐらいには慣れてきました。

さらなる不具合として、ネットワークの調子が悪く、2回も一時中断になりました。2回合わせて30分ぐらい。時間を正確には見ていないのですが、残り時間が減ってる感じはしなかったので、中断中は時計も止めてくれるっぽい。

さらにさらなる不具合として、キーボードでの日本語入力ができず、リモート監視員とのチャットに日本語が使えなかったです。しかたなくカタコトの英単語で書いていたのですが、しばらくしたら監視員も英語で書くようになってしまいました。いや、日本語でやりとりしたいんだけど・・・ってなりました。

ちなみにリモート監視員の書く日本語は、たぶん英語からの機械翻訳です。何度か受験すると機械翻訳の日本語でのチャットにも慣れてきます。最後に「部屋を残すことができます」と言われます。よくわからない日本語だったら脳内でいったん英語に翻訳してからもう一度日本語に翻訳するとわかります。「部屋を残すことができます」の意味はわかりますでしょうか？退室していいよってことですね。

# 結果

スコア807で合格した。

# 勉強ノート

自分のノートの一部です。このあたりのキーワードは事前に調べていた、というものです。

## 機械学習に関する用語

- AUCとROC曲線
- TF-IDF
    - TF
        - Term Frequency
        - 文章ごとに単語の占める割合
        - 文書と単語ごとの数値で、全体としては行列（2次元配列）
    - IDF
        - Inverse Document Frequency
        - 単語ごとの数値で、全体としては1次元配列
        - 頻出単語ほど小さい値
- unigramとbigram
- 深層学習
    - learning rate
    - batch size
    - epoch
    - dropout

### 混同行列と指標

混同行列、confusion matrix

| | | | 予測値 | 正解 |
| ---- | ---- | ---- | ---- | ---- |
| TP | True Positive | 正しく正と判断 | 正 | 正 |
| FP | False Positive | 誤って正と判断 | 正 | 負 |
| FN | False Negative | 誤って負と判断 | 負 | 正 |
| TN | True Negative | 正しく負と判断 | 負 | 負 |

| | がん検診での例 |
| ---- | ---- |
| TP | がんだと正しく判定 |
| FP | がんでないにも関わらずがんであると判定される誤検知 |
| FN | がんであるにも関わらずがんではないと判定される見逃し |
| TN | がんではないと正しく判定 |

正解率、精度、accuracy

```math
Accuracy = \frac{TP + TN}{TP + FP + FN + TN}
```

再現率、感度、検出率、真陽性率、recall

```math
Recall = \frac{TP}{TP + FN}
```

- 0.0はダメ、1.0に近いほどよい
- 検索の場合：マッチしてほしいアイテムの中で、実際にマッチした割合
- 反対は偽陰性率、False negative rate

適合率、precision

```math
Precision = \frac{TP}{TP + FP}
```

- 見つけ出したもののうち正解の割合
- 0.0はダメ、1.0に近いほどよい
- 検索の場合：マッチしたアイテムの中で、本当にマッチしてほしいアイテムの割合

F値

```math
F = \frac{2 Recall \,Precision}{Recall + Precision}
```

- 0.0はダメ、1.0に近いほどよい

偽陽性率、False positive rate

```math
\frac{FP}{TN + FP}
```

- 本当はnegativeなものの中で、検出してしまった割合
- 1.0はダメ、0.0に近いほどよい

偽陰性率、False negative rate

```math
\frac{FN}{TP + FN}
```

- 本当はpositiveなものの中で、検出できなかった割合
- 1.0はダメ、0.0に近いほどよい
- 再現率、recallの反対

これら指標の名前は英語もわかっておいたほうがいいです。問題文の日本語訳がよくわからないことがあるためです。

## AWSのサービスの概要

- SageMaker
    - どちらかというとデータサイエンティスト・機械学習エンジニア向けのサービス
    - 利点はインフラの管理をAWSに任せられること
- Rekognition
    - 画像や動画から顔/テキストの検出、安全でないコンテンツなどの検出が出来るサービス
    - 動画はKinesis Video Streamsと組み合わせ可能
- Comprehend
    - テキストからエンティティ分析/キーフレーズ分析/言語の分析（何語か?を分析）/感情分析/構文分析ができるサービス
- Kinesis Analytics
    - ストリーミングデータからリアルタイムにSQLみたいなことができるサービス
    - 一部機械学習の機能がある
- EMR
    - Hadoop、Sparkなどのマネジメントサービス

※AWSのre:Inventで機械学習関係のサービスが最近いっぱい発表されていますが、新しいサービスは試験にはなかなか出ないと思います。