機械学習に強くなりたかったのでAzure DP-100を取得しました

# 経緯
Microsoftの [DP-100](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/dp-100/) 試験を 2024/12/23 に受けてきました。じつは二度目の挑戦でして、まず今年の6月に [AIスキルチャレンジ](https://qiita.com/hikiroku/items/75a3e38a4b50217234eb) の無料バウチャーで受験したが不合格、それから10月に一旦DP-900を取得して、今回 811/1000 点でパス、という経緯です。わりかし苦労したので、体験記として残しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361516/bf2dcda4-2901-8539-0c32-5ab030818d32.png)

# 試験範囲について
DP-100はデータサイエンティスト認定の中級試験という位置付けで、合格するとMicrosoft認定資格「[Microsoft Certified: Azure Data Scientist Associate](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-data-scientist/?practice-assessment-type=certification)」が取得でき、Azure上で機械学習ワークロードを実装し実行できる能力があると認められることになります。2024/12/23現在の出題範囲は下記でした。

* 機械学習ソリューションの設計と準備 (20 ～ 25%)     
* データの探索とモデルのトレーニング (35 ～ 40%)     
* モデルのデプロイのための準備 (20 ～ 25%)     
* モデルのデプロイと再トレーニング (10 ～ 15%) 

なお 2025/01/16 付で出題範囲変更が予告されており、**[AI アプリケーションの言語モデルを最適化する (25〜30%)](https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/dp-100#optimize-language-models-for-ai-applications-2530)** としてプロンプトエンジニアリングやRAG、ファインチューニングが出題されるようになるようです。これまでの傾向からすると、出題範囲変更が日本語版に反映されるのは来年1/16からさらに8週間後になると思われます。これまで機械学習一本槍だった認定資格に、いきなり生成AIが25%以上出題されるようになるということで、時代の流れを感じますね...。これまで機械学習専門でやられてた方にとっては難化、すでに生成AIの素養がある方にとっては易化ということになると思います。なお変更前の内容でも画像処理の物体検出やNLPのエンティティ抽出といった概念が出題されるので、AI-900の内容を先に学習しておくと多少有利です。

# 試験対策
公式のラーニングパスと演習問題以外に、今回はご縁があってトレノケート社の提供するハンズオン付きオンライン講座を会社で受講できることになったので、これのDP-100コースを受講しました。毎朝2時間×5日間の集中講座、講師はMicrosoft MVPの得上竜一(@tottokug@github) さん、ラーニングパスの内容を日本語で解説いただき、Teamsチャットで質問も随時可能でした。ハンズオンは下記のラボが起動できるVMを期間限定で使える形式でしたが、インストラクションを日本語で読めるのが有難かったです。

https://github.com/MicrosoftLearning/mslearn-azure-ml

試験勉強は [MS公式の演習問題](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-data-scientist/practice/assessment?assessment-type=practice&assessmentId=62&practice-assessment-type=certification) に絞りました。問題は100種類程度しかないようで、5周もすれば暗記できてしまうのですが、単に正答するだけでなく問題文と選択肢をじっくり読んで、MS Learnで検索して、出題意図を推しはかるところまで頑張ってみました。DP-100は試験範囲が狭いので、ラーニングパスとハンズオンと公式演習をひととおりこなすと、ノートブックでの実験 ⇒ モデルのトレーニング ⇒ エンドポイントにデプロイして運用、という一連の流れが腹落ちするので、「DP-100完全に理解した」という段階まで行けて達成感があり楽しかったです。（この自信は試験会場で無残に打ち砕かれたのですが...。）

# 実際の試験
実際の試験では初耳の話が次から次に出題されて往生しました。結果811点でしたが、自信をもって回答できたのは体感だと半分以下で、試験時間内はひたすらMS Learnとにらめっこしてたような状態でした。MS Learnの検索に時間を割けるように、点を拾えるところではパッと拾える状態にしておくのが合格のカギかなと思いますので、私なりのポイントを以下、記載します。

# MSLearnの検索
左上で「コンテンツ領域」を「すべて」、「製品」を「Azure Machine Learning」と選択して検索する。意図せずコンテンツ領域に「リファレンス」などが選択されてしまうことがあるので注意。公式演習を解きながら事前にMS Learnの検索も練習しておいたほうがよい。試験会場ではMS Learnのページ内検索(Ctrl+F)ができない(?)。

## 機能メリットを問う問題
「AutoMLは専門知識不要」「デザイナーはローコード」「MLflowモデルは環境情報まで内包しており可搬」といった、ソリューションの機能メリット（謳い文句）を押さえておけば取れる問題があるので、各サービスの謳い文句は理解しておくとよい。Azureサービス以外の登場人物もひととおり「CondaってMavenみたいなやつ」「Pandas DataframeってLocalDBみたいな感じ」といった雑な理解をしておくと全体像がつかみやすい。

## コマンドを問う問題
問題文で「AzureML Python SDK v2」と「Azure CLI」のどちらが指定されているかに注意する。コマンドの書式が違うので選択肢を刈り込める。

|種類|コマンド例|ポイント|
|---|---|---|
|Python SDK v2|`ml_client.jobs.create_or_update()`|Python書式|
|Azure CLI|`az ml model register`|`az` ではじまる<br>スペース区切り|

たとえば「ブルーグリーンデプロイ」で青にトラフィックの90%を振り分けるコマンドはそれぞれ下記のようになる([MSLearn](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2&tabs=azure-cli#remove-the-old-deployment))。公式演習にはこのパラメータの指定方法を問う問題があって一瞬、シラネーヨと思ってしまうのだが、落ち着いて考えてみればPythonとCLIでは書式がまったく異なるので、問題文がPythonSDKとAzureCLIのどちらについて問うてるのかに注意すれば正答率を上げられる。

```Shell:
# Azure CLI
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"
```

```python:
# AzureML Python SDK v2
endpoint.traffic = {"blue": 90, "green": 10}
ml_client.begin_create_or_update(endpoint).result()
```

## 機械学習アルゴリズムの選択方法
このシナリオに適するアルゴリズムを答えよ、のような問題。MSLearn検索で答えられるので暗記する必要はない。キーワード「アルゴリズムの選択」などでMSLearnを検索し、下記のページを見つけて、問題文の要件(分類/回帰、非線形対応有無など）にあうものを選んで回答する。糖尿病予測なら分類ファミリ、売上予測なら回帰ファミリ。「ロジスティック回帰」はその名に反して分類アルゴリズムなので注意。

https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-select-algorithms?view=azureml-api-1#comparison-of-machine-learning-algorithms

## サンプリングアルゴリズム
ハイパーパラメータのサンプリング手法の問題。これは簡単なので覚えてしまうとよい。不連続の場合は `QNormal` や `Choice` といった離散値っぽい名前のクラスを使用する（頭に量子化のQが付くので見分ける）。

|種類|ポイント|
|---|---|
|ランダム|ランダムに選択。不連続と連続の両対応|
|Sobol|ランダムだがシードを持ち再現可能|
|グリッド|総当たり選択。不連続のみ|
|ベイジアン|早期終了できない|

https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-tune-hyperparameters?view=azureml-api-2


## 早期終了ポリシー
これも回答しやすい。キーワード「早期終了ポリシー」などでMSLearnを検索し、下記のページを見つけて、問題文の要件にあうものを回答する。バンディットポリシー＝過去最良の結果と比較、中央値の停止＝過去の中央値と比較、切り捨て選択＝過去の下位N%と比較。

https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-tune-hyperparameters?view=azureml-api-2#early-termination


## 分類モデルの評価メトリクス
定義の式はMSLearnで検索すれば見つかる。ややこしいので理解は事前にしておいて、本番で自信が無ければいちおう検索というイメージがよい。

|種類|定義|ポイント|
|---|---|--|
|適合率、精度[^seido]<br>プレシジョン|TP/(TP+FP)|偽陽性が少ないほど良い値が出る<br>適合率だけを上げるには、絶対確実なときしか陽性判定を出さなければよいので、見逃しが増えてしまう|
|再現率<br>リコール|TP/(TP+FN)|偽陰性が少ないほど良い値が出る<br>再現率だけを上げるには、疑わしきは陽性判定すればよいので、誤検知が増えてしまう|

## その他
一般用語のように見えて実はテクニカルターム、というものがあるので読み飛ばさないよう注意する。「環境」「コマンドジョブ」「スコアリングスクリプト」など。公式演習に「AzureML Python SDK v2でトレーニングスクリプトを実行するには？」という問題があり、正答は「コマンドクラス」なのだが、これはPythonSDK v2においては（v1とは違って） `command` クラスを使って外部スクリプトを実行するのだ、ということを理解できているかどうかを問うているようだ。というように公式演習の単語を読み飛ばさず、出題意図まで推し量りながら理解するように努めると、合格が近くなると思います。公式演習はその場で英語に切り替えられない点が玉に瑕ですが、解説にMSLearnのリンクまで書かれているので、学習効率が高くオススメです。

```python
# define the command
command_job = command(
    code="./src",
    command="train.py",
    environment=env,
    compute="cpu-cluster",
)

returned_job = ml_client.jobs.create_or_update(command_job)
returned_job
```
https://learn.microsoft.com/ja-jp/azure/machine-learning/migrate-to-v2-command-job?view=azureml-api-2



[^seido]:MSLearn上ではPrecisionが「精度」と翻訳されていることがある。誤訳だと思うが…。