【DataRobotデモ】病気の葉の判定

# はじめに
今回は機械学習プラットフォーム「DataRobot」のデモ紹介記事として、植物の葉の病気を、画像から判定するという活用例を紹介したいと思います。
# DataRobotについて
DataRobot社は、人工知能（AI）に対するユニークなコラボレーション型のアプローチであるバリュー・ドリブン AIのリーダーです。

https://www.datarobot.com/jp/

DataRobot社の製品であるDataRobotは、自動機械学習（AutoML）プラットフォームであり、機械学習モデルの構築、トレーニング、評価、デプロイメントを自動化することができます。複雑なデータ分析を迅速かつ簡単に実行し、優れた予測モデルの作成をサポートすることが可能です。
# 本記事の主な想定読者
- 機械学習の基礎的な用語がわかる方
（学習-テスト、交差検定等の用語について、この記事では詳しく説明しません）
- 機械学習の活用事例を知りたい方
- DataRobotを導入していて、モデリングにあたっての最低限の操作方法を知りたい方
- DataRobotを導入していないが、操作方法等の感覚を手軽に知りたい方


# 課題と扱うデータについて
本記事では、植物画像のデータセットを取り扱います。
画像から葉っぱの病気を早期発見することで、最終的には食料自給率改善等につながる可能性があります。

今回使うデータセットは、複数の植物について健康な状態と病気の状態の画像を集めたもので、「何の植物か＋病名」でクラス分けされています（病名が無ければ植物名のみ）。以下がクラス名の例です。
・`Tomato`（＝健康なトマト）
・`Bell pepper bacterial spot`（＝細菌病にかかったピーマン）

また、クラスと画像の一例も表示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/4f436aa5-4ea3-6a1e-bcb2-07a3358c3282.png" width=75%>
以下に、今回扱う全15個のクラス名と、各クラスの画像枚数を示します。枚数については、各クラス152枚用意しています。本論とはそれほど関係ないため、各クラスの意味については省略しますが、`Bell pepper` `Potato` `Tomato` の3つが健康な葉っぱのクラスです。
|クラス名|画像枚数|
|:---|:---|
|Bell pepper|152|
|Bell pepper bacterial spot|152|
|Potato|152|
|Potato early blight|152|
|Potato late blight|152|
|Tomato|152|
|Tomato bacterial spot|152|
|Tomato early blight|152|
|Tomato late blight|152|
|Tomato leaf mold|152|
|Tomato leaf spot|152|
|Tomato spider mites|152|
|Tomato target spot|152|
|Tomato mosaic virus|152|
|Tomato yellow leaf curl virus|152|

本記事ではDataRobotを使って、画像を入力した際に、その画像が上記15クラスのうちどれに当てはまるかを予測するモデルを作成していきたいと思います。
# DataRobotへのデータインポート
早速DataRobotを使っていきたいと思います。まずはデータのインポートです。
こちらがDataRobotのトップ画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/fecae120-4dbe-27ab-eca5-6264472367a2.png)
一般的なテーブルデータであれば、画面に書いてあるようにExcelファイルを直接ドラッグ＆ドロップでデータがアップロードできますが、画像データが含まれる場合、アップロード方法が多少異なります。

まず、以下画像のように、クラス名と同じ名前のフォルダを作り、各フォルダの中に対応する画像を入れてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/a80c4271-3ec5-5a5c-2ccd-e217510ed0fe.png" width=75%>
次に、上記画像の一番下にあるExcelファイルを準備します。このファイルには下記画像のように、1枚1枚の画像について、クラス（1行目）と、その画像のパス（2行目）を記載してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/3714f1d6-d3ff-5c4e-6dec-b3b2be31b38c.png)
そして、これらをまとめて<b>一つのZIPファイル</b>にして、DataRobotへドラッグアンドドロップします。
無事にアップロードできるとこちらの画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/940abb0a-d42a-8377-6409-800919900d08.png)
下にスクロールしていくと、ZIPの中にある、Excelファイルの情報が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/468cc858-14af-863f-0ebe-dc9b337ede8e.png)
classの部分をクリックしてみると、15個のクラスのデータ数が同じになっていることが確認できます。また今回は各画像のクラスを予測したいので、この「class」を**ターゲットに設定**します。（classの部分にカーソルをあてると「ターゲットとして使う」という文字が出てくるので、クリックすると設定できます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/a110bfa4-2913-2cd6-e680-642629ba8105.png)
次に、imageの部分をクリックします。画像が全部で2280枚（15クラス×152枚）になっていることと、一部の画像プレビューが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/ac496e15-811e-909a-9e63-2ef154c3530d.png)
画面を一番上までスクロールすると、左側に予測対象（class）の分布が表示され、自動で分類問題だと判定されていることが確認できます。また、真ん中の開始ボタンが押せるようになっています。このまま開始ボタンを押してもモデリングはできますが、今回は**多クラス分類問題**なので、**パーティションの設定**をしてみようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/50b15307-d9f3-225e-6667-5c7ae699272f.png)
# パーティション設定
「高度なオプションを表示」→「パーティション」の順にクリックすると、以下の画面が表示されます。ここでは、データをどのように学習・検証用に分割するかを設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/d27e08fe-0f8e-8cb0-540a-f571e719b907.png)
デフォルトでは、「ランダム」抽出での「交差検定」が選択されています。実はDataRobotは多クラス分類では「層化抽出」が選択できません（2023/8月現在）
ランダム抽出だと、設定次第では交差検定の各Foldやホールドアウトのデータの分布に差が出てしまう可能性があります。
そこで、今回は多クラス分類での層化抽出を設定するために、DataRobotの「パーティション特徴量」機能を使ってみます。

この機能を使うために、まずはデータインポート時に作成したExcelファイルに追加で操作を加えます。
ファイルに新しく「partition」列を作成します。（列名に特に指定は無いです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/5c8e62b0-364f-9356-db58-659f38455f0a.png)
DataRobotでは、パーティション用の列を設定することで、**その列の中で同じ値を持つデータは同じFoldに入る**ように設定できます。（言葉で説明するよりも、以下画像の方が分かりやすいと思います）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/6690a6b1-ff2b-3aa8-3078-5c219d2bfd13.png)
今回は上の画像にならって、各Fold内の15個のクラスの分布がほぼ同等となるように、0~4の数値をpartition列に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/a5c47c96-19ca-d139-3723-1cc67042470f.png)
このデータを再度DataRobotにアップロードして、「高度なオプションを表示」→「パーティション」→「パーティション特徴量」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/7c50aba0-b65e-2c36-900a-27ee8f4dbe7b.png)
次に、パーティション用の列にpartition列を設定して、どの値をホールドアウトにするかを設定します。今回は「4」がついているデータをホールドアウトにします。これで多クラス分類問題における層化抽出の設定が完了しました。データにパーティション用の値を設定するのは少し手間がいりますが、それでも全て手作業で行うよりはるかに楽ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/7146cff2-a968-4931-f4d0-721538071c08.png)
DataRobotでは他にも、画像を扱う際に重要な**オーグメンテーション**を始めとして、様々な設定が可能ですが、今回は他の設定はいじらずこのまま進めます。
# モデリング開始
モデリング前の設定が完了したので、画面一番上に戻り、開始ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/5e46b42a-e3ae-9fa5-015c-81974b459d7b.png)
あとは待つだけでモデリングが完了します。DataRobotには数千の設計図（ブループリント）を用意されており、アップロードしたデータの分布やデータ型に合ったアルゴリズムを数十程度ピックアップしてモデルを作成していきます。
# モデルの精度評価
学習が完了したモデルはモデルタブから確認ができます。
リーダーボードには各モデルが精度がよい順(画面では`logloss`順)に並んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/cce4f5b5-f1fe-786b-75a0-df8d2550059e.png)
精度指標は切り替えることができます。試しに`正解率`に切り替えてみたところ、値は94%以上でした。15クラスの分類問題にしてはかなり高い正解率です！開始ボタンを押すだけでここまでの精度が出せるのは非常に魅力的ではないでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/93007cbe-8f89-55a4-7be5-0bcb7975996f.png)


では、いずれの指標でも良い結果だった`Keras Slim Residual Neural Network Classifier using Training Schedule (1 Layer: 64 Units)`の詳細を確認していきます。ブループリントではモデルがどのように作成されたか処理を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/b6151946-5ec6-324e-e083-02f339e516ed.png)
このモデルは、画像を事前学習済みモデルである`Mobilenet V3`に入力し、その出力を別のニューラルネットワークに入力して予測をしているようです。
DataRobotではモデルごとに適したデータ前処理が自動的に行われるようになっているので、ユーザは特に意識することなく様々なモデルを作成することが可能です。

次に、混同行列を確認していきいます。（見づらかったので、背景色を変更しました）
以下画像左側のグラフは、横軸が予測ラベル、縦軸が実測ラベルで、緑色が正しく予測できたデータ、赤色が間違って予測したデータ、円の大きさ＝データ数、になっています。
`Bell Pepper`や`Potato`関連のクラスと比較して、`Tomato`関連のクラスで間違った予測をしている傾向が確認できます。`Tomato`はクラス数が多いので、`Bell Pepper`や`Potato`よりも分類の難易度が高いことが影響していそうです。
![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/9851c9e4-c193-aa31-f18e-c2395224f0dc.png)
また、軸のクラス名を選択すると、右側にそのクラスにだけで見た際の混同行列や分類精度指標（`F1score`,`Recall`,`Precision`）が確認できます。このようにして、クラスごとの分類精度に偏りがないかどうかが確認できます。
# モデルの解釈
今回は1データに対応する入力が画像1枚のみのため、特徴量のインパクト・特徴量ごとの作用・予測の説明といったDataRobotの機能は使用できません。
代わりに、画像データ特有の機能である**画像埋め込み・アクティベーションマップ**を使用します。

**画像埋め込み機能**では、DataRobotが算出した画像の類似度に基づき、**画像を2次元平面上にマッピングした結果**が確認できます。（似ている画像は近くに、似ていない画像は遠くに配置）
表示する画像は100枚まで、という制約はありますが、これを見ることで「似ている」「似ていない」の判断が人の感覚と合っていそうかが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/f6ddb105-2f76-800d-f3c1-e6135c6fc959.png)
また、フィルターを使うことで、このマッピングを詳細に確認できます。例えば、実測値が`Tomato early blight`の画像を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/dcc363ac-e8fb-f57a-36d5-5cafec38c797.png)
右上に、１枚だけ外れている画像があるのが分かります。確かに左下の画像たちと比べて全体的な色味や形状が違うような気がします（定性的ですが）。この画像をクリックすると、以下のように、モデルの予測値を確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/089c4053-6fcc-cb13-c981-1c9e658c5566.png" width=75%>
これを見ると、このモデルは、この画像を`Tomato leaf mold`だと予測している（つまり、間違った予測をしている）ことが分かります。
表示枚数の制約上全ての画像について確認をすることはできないですが、このような見方をすることで誤った予測をしているデータに対して考察を行うことができそうですね！

次に、**アクティベーションマップ機能**では、モデルが予測をする上で、**画像のどの部分を特に重要視したか**ということをヒートマップで確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/2932f2af-9108-e777-0828-57d7b0488cff.png)
これを見ると、この画像はしっかりと画像内の葉っぱの部分を見て予測を判断している、ということが確認できますね。画像データの場合「精度が良いけど**実は全然違うもの（例：背景）で判断していた**」ということもデータの取得方法によっては起こりうるので、ここは要注意です！

また、画像埋め込み機能と同様に、フィルターを使うこともできます。
例えば、`Bell pepper bacterial spot`（細菌病のピーマン）と予測された画像を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/8a3efb69-4ea8-2044-9cc6-f84af1da63fc.png)
定性的ですが、葉っぱの健康そうな部分よりはそうでない部分の方が重要度が高いという判断をしていそうです。

このように、DataRobotの上記機能を活用することで、モデルに対する理解を深めることができます。例えば、元の画像データに何かしら問題がありそうだということが分かれば、画像の追加・撮影方法やラベルの見直し等、データ側の改善を検討できます。また、画像は問題ないのにうまく判別できていない、ということであれば今回スキップしたオーグメンテーションを試す等、モデル側の改善を検討できます。
# 予測
最後に、作成したモデルを使って新しいデータに対する予測を行います。
「予測を作成」画面で、最初にデータをアップロードしたときと同様に、予測したい対象データをドラッグ＆ドロップなどすることで新しい画像に対する予測ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/3d0f0b5d-0d47-efb1-70d0-235c1038f622.png)
参考までに、10件の画像に対して予測をさせてみました。以下の画像について、何の植物で、健康かどうか（健康でないなら何の病気か）わかるでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523414/fefdbc39-ba49-3854-da10-b08f18bf4e88.png)
これらの画像をDataRobotに入力し、出力された予測結果を整理したのが以下です。
今回の画像は正解クラスもわかっていたので、予測との比較も行っています
|番号|DataRobotの予測|正解|正誤|
|:-:|:-|:-|:-|
|1|Tomato early blight|Tomato early blight|正|
|2|Potato early blight|Potato early blight|正|
|3|Tomato|Tomato|正|
|4|Tomato leaf spot|Tomato leaf spot|正|
|5|Tomato spider mites|Tomato target spot|誤|
|6|Potato late blight|Potato late blight|正|
|7|Bell pepper|Bell pepper|正|
|8|Tomato|Tomato|正|
|9|Tomato mosaic virus|Tomato mosaic virus|正|
|10|Tomato yellow leaf curl virus|Tomato yellow leaf curl virus|正|

上から5データ目で`Tomato target spot`を`Tomato spider mites`と予測してしまっていますが、それ以外は正しく予測できていることがわかります。

そして、実際にこのモデルを現実世界で活用するとなると、例えば現場の農家でカメラで撮影→画像をアップロード→モデルで病気かどうかを判別→結果を手元に返す・・といったようなフローが必要になり、更にはこの一連のフローの自動化も必要になってくるのではないでしょうか。DataRobotでは機械学習モデルの運用をサポートする機能MLOpsもかなり充実しており、この辺りのサポートもとても豊富です。
こちらについては後日紹介記事を書きたいと思っていますのでご期待ください！
# まとめ
今回は、DataRobotの基本機能を使って、病気の葉の判定を行ってみました。
記事だけでは分からない部分もあると思いますが、コーディング等を行うことなく、簡単に良い精度の機械学習モデルを作成することができました。
今後も他の課題を想定したデモ記事や、機能紹介記事を紹介していきたいと思います！！
## 仲間募集

NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>

クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>

データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>

DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>


## ソリューション紹介

<details><summary> Trusted Data Foundationについて</summary><div>

～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</div></details>


<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～
https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</div></details>


<details><summary>NTTデータとTableauについて </summary><div>

ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。
https://enterprise-aiiot.nttdata.com/service/tableau

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。
https://enterprise-aiiot.nttdata.com/service/informatica

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</div></details>