DataRobot AI アクセラレーター：生成AIを活用したクラスタリング結果の自動ラベリング

DataRobotで製造業界のお客様を担当しているデータサイエンティストの山本です。前回の[記事](https://qiita.com/DataRobot_PR/items/2def418c7aada62c6dcd)では、[DataRobot AI アクセラレーター](https://github.com/datarobot-community/ai-accelerators/tree/a3bf72e76a29ab200715f73a6815ea95a28fbdfb)の概要を紹介しました。本記事では具体例として、 教師なし学習のクラスタリング結果に対して、生成AI技術で自動的にラベリングするタスクを行うAIアクセラレーターをご紹介します。

## 1.はじめに
クラスタリングは、データを類似した特徴を持つグループ（クラスター）に分類する教師なし学習手法です。しかし、得られたクラスターの意味を解釈し、適切なラベルを付けるには、通常、ドメイン専門家の知識の助けを借りながら、時間をかけて慎重に作業を行う必要があります。

この課題に対して、今回はDataRobot AIアクセラレーターの中から[「Smart cluster labeling using Generative AI」](https://github.com/datarobot-community/ai-accelerators/blob/main/generative_ai/smart_cluster_naming/smart_cluster_labeling.ipynb)テンプレートを活用し、生成AIを用いてクラスターに自動的にラベルを付ける方法をご紹介します。この手法でもドメイン専門家の知識は必要ですが、ラベリング作業にかかる時間を大幅に短縮できる効果が期待できます。

## 2.このアクセラレーターについて
このアクセラレーターでは、DataRobotのクラスタリングモデルとOpenAI GPT-3.5を組み合わせて使用します。大きく2つのタスクを実行させる仕様になっており、まず[DataRobotのAutoMLでクラスタリングモデルを構築](https://docs.datarobot.com/ja/docs/modeling/special-workflows/unsupervised/clustering.html)し、そのクラスターインサイトを抽出します。

その後、抽出されたインサイトをプロンプトとしてGPT-3.5に送信し、各クラスターの特徴を反映した人間にわかりやすいラベルを生成します。

## 3. 活用手順:
（1）データ準備とモデル構築: 

サンプルデータとして[糖尿病患者の再入院データ（10,000件）](https://s3.amazonaws.com/datarobot_data_science/test_data/10k_diabetes.xlsx)を使用します。
このデータセットのオリジナルは米国の病院で取られたもので、何らかの疾患で入院していた糖尿病患者さんが退院後30日以内に再入院するリスクを分析するための情報を含んでいます。

データ項目としては、患者さんの基本属性（人種、性別、年齢、体重）、入退院情報（種類、期間、退院先）、治療内容（検査数、処置数、投薬数）、過去の医療利用状況（外来、救急、入院回数）等が記録されています。また、診断情報（主要・二次・三次診断とその詳細）、糖尿病関連指標（血糖値、HbA1c）、糖尿病薬の使用状況も含まれています。

なお、上記リンクからダウンロードできるサンプルデータは、デモンストレーション用にオリジナルデータをDataRobot社が若干加工したものになりますので、本データを分析して得られる知見は実際の臨床知見とは異なる可能性があることをお断りしておきます。

   – DataRobotのPython SDKを使用してクラスタリングプロジェクトを作成します。
```python
   project = dr.Project.create(diabetes_dataset, project_name="unsupervised clustering")
   project.analyze_and_model(
       unsupervised_mode=True,
       mode=dr.enums.AUTOPILOT_MODE.COMPREHENSIVE,
       unsupervised_type=dr.enums.UnsupervisedTypeEnum.CLUSTERING,
 )
```
このコードで、DataRobotのProject.createメソッドを使用してプロジェクトを作成し、analyze_and_modelメソッドでAutoMLを開始します。引数unsupervised_mode=Trueでクラスタリングを指定し、モデリングモードはCOMPREHENSIVE mode（包括的モード）を指定しています。

（2）クラスターインサイトの抽出:

   – 構築されたモデルからクラスターインサイトを計算
```python
   model = dr.ClusteringModel.get(project.id,　
project.get_models(order_by="metric")[-1].id)
   insights = model.compute_insights()
```
このコードでは、プロジェクト内の最後のモデル（通常は最良のモデル）を選択し、そのモデルの[クラスターインサイト](https://docs.datarobot.com/ja/docs/modeling/analyze-models/understand/cluster-insights.html#cluster-insights)を計算します。

（3）クラスター情報の生成:

   – 抽出されたインサイトを整形し、クラスターごとの特徴をまとめる
```python
   def get_cluster_info(insights_list, top_n_values=3):
       # ... [関数の詳細は省略] ...
       return " ".join(df_full["final"].values.tolist())

   cluster_info = get_cluster_info(insights_top, 3)  
```
Get_cluster_info関数は、[クラスターインサイト](https://docs.datarobot.com/ja/docs/modeling/analyze-models/understand/cluster-insights.html#cluster-insights)を解析し、各クラスターの特徴を人間が理解しやすい形式にまとめます。数値特徴と分類特徴を別々に処理し、最終的に各クラスターの説明文を生成します。

（4）GPT-3.5を使用したラベル生成:

   – クラスター情報をプロンプトとしてGPT-3.5に送信し、ラベルを生成
```python
    def get_cluster_names(cluster_info, label_types="human friendly and descriptive"):
       prompt = f'you are an business analyst. You have run a clustering model and following text in double quotes shows the cluster level values."{cluster_info}". Please provide {label_types} cluster names for each cluster. Output format is json with fields cluster description, cluster name, cluster id.'
       response = get_completion(prompt)
       return prompt, response

   prompt, cluster_names = get_cluster_names(cluster_info, "noob friendly")
```

このコードは、DataRobotで分類したクラスタリングの結果にGTP-3.5を適用してクラスタリングの結果の解釈とラベル付けを依頼するものです。
特に、コードの中には、LLMへ投入するプロンプトが設定されています。これらプロンプトの設定は以下の通りです。

ロールの設定: “you are an business analyst”（あなたはビジネスアナリストです）と指定することで、AIにビジネス視点での解釈を促します。

状況の説明: クラスタリングモデルを実行したことを伝え、クラスターレベルの値を提示します。

タスクの指示: “{label_types} cluster names”（この例では”noob friendly”）という指定により、どのような種類のクラスター名が欲しいかを指示します。これにより、初心者向けや専門家向けなど、異なるレベルのラベルを生成できます。

出力形式の指定: JSON形式で、各クラスターの説明、名前、IDを含むように指示しています。

（5）DataRobotプロジェクトの更新:

   – 生成されたラベルをDataRobotのプロジェクトに反映させ、可視化を行います。
```python
      cluster_json = json.loads(cluster_names)
   cluster_name_mappings = [
       ("Cluster " + str(cluster["cluster_id"]), cluster["cluster_name"])
       for cluster in cluster_json["clusters"]
   ]
   model.update_cluster_names(cluster_name_mappings)   
```   

 GPT-3.5から返されたJSON形式の応答をパースし、クラスターIDと新しいクラスター名のマッピングを作成します。そして、update_cluster_namesメソッドを使用してDataRobotプロジェクト内のクラスター名を更新します。

以上のコードフローで、DataRobotで構築されたクラスタリングモデルの結果からGPT-3.5を使用して人間にわかりやすいラベルを付けることにより、クラスタリング結果を容易に理解し、有用なインサイトを得ることが可能になります。
![AI アクセラレーター_コードフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/639d1b21-ea5a-00d8-2a52-c69dfdacc0fe.png)

## 4. 結果と考察
以下に、このアクセラレーターを使用してサンプルデータのクラスター分析を行い、糖尿病患者属性のクラスターを解釈させた結果を示します(表1)

表1　糖尿病患者の再入院のクラスター自動分析結果

| クラスター名 | クラスター名(日本語) | 自動生成されたクラスターの解釈(英語) | 自動生成されたクラスターの解釈(日本語) |
|:-:|:-:|:-:|:-:|
|Young Adults with Well-Managed Diabetes | 若年成人の管理良好な糖尿病患者グループ  |This cluster represents younger patients with relatively well-controlled diabetes, characterized by lower HbA1c levels and fewer complications. |このクラスターは、HbA1cレベルが低く、合併症が少ない、比較的管理の行き届いた若年患者を表しています。|
|Middle-Aged Patients with Moderate Complications | 中年患者の中程度合併症グループ  |  This group consists of middle-aged patients with moderate diabetes complications and slightly elevated HbA1c levels. They may require more intensive management. | このグループは、中程度の糖尿病合併症とやや高めのHbA1cレベルを持つ中年患者で構成されています。より集中的な管理が必要かもしれません。  |
| Elderly Patients with Complex Health Issues  |複雑な健康問題を抱える高齢患者グループ| This cluster represents older patients with multiple comorbidities, higher HbA1c levels, and more frequent hospital admissions. They require comprehensive care and close monitoring.  | このクラスターーは、複数の併存疾患、高いHbA1cレベル、より頻繁な入院を特徴とする高齢患者を表しています。包括的なケアと綿密なモニタリングが必要です。|

従来のクラスター分析ではデータがどのクラスターに所属しているか、を計算するだけであって、各クラスターの内容を人間が解釈する助けになるような情報も併せて出力させることはできませんでした。これに対して、本アクセラレーターではクラスターの解釈の助けになる知見を得られていることが確認できます。

本アクセラレーターの利点をまとめます：
**1.迅速な洞察獲得**: 従来、人間の専門家によるクラスターの解釈に長時間を要していたところ、LLMの助けを借りて数分で初期解釈が得られるようになりました。これにより、データアナリストは迅速にパターンを把握し、各グループに適した戦略を立てることができます。
**2.柔軟な解釈レベル**: プロンプトを制御することで、同一のクラスターに対して、「初心者向け」と「専門家向け」など、異なる詳細レベルの説明を生成できます。例えば以下のような説明です。
　・初心者向け: 「高齢の糖尿病患者グループ」
　・専門家向け: 「高齢・長期入院・複合疾患を持つ2型糖尿病患者グループ」

これにより、ユーザーの知識レベルや必要な情報のレベルに応じて、応じて適切な説明を選択できます。

**3.専門知識の補完**: ドメイン知識が不足している場合でも、クラスタリング結果の初期解釈が可能になります。これは、新しい分野での分析で有力な仮説を検討する場合に特に有用と思われます。
**4.効率的なリソース活用**: クラスターの初期解釈に役立つ情報の提供を自動化することで、専門家は高度な専門知識を要する深い分析や戦略立案により時間を割くことができます。

## 5. まとめ
本記事では、DataRobot AIアクセラレーター[「Smart cluster labeling using Generative AI」](https://github.com/datarobot-community/ai-accelerators/blob/main/generative_ai/smart_cluster_naming/smart_cluster_labeling.ipynb)を活用し、従来のデータ分析手法（教師なし学習）に生成AIシステムを組み合わせることで、データ分析プロセスを大幅に効率化し、より迅速で洞察に富んだ意思決定を支援できることを示しました。ただし、自動生成されたラベルは初期解釈の指針として活用し、最終的な判断や重要な意思決定には、必ず人間の専門家による検証を経るべきです（Human-in-the-Loop）。

本手法は、記事中で示した医療リアルワールドデータ分析のほか、顧客セグメンテーション、異常検知、文書分類など、様々な分野のクラスタリング分析に適用可能です。ドメイン知識が不足しているプロジェクトや、迅速な結果解釈が必要な場合にも、ぜひこのアクセラレーターをお試しください。

## 6. DataRobotトライアルのご案内
DataRobotでは、トライアル環境を提供しています。以下のURLからアカウントを作成し、DataRobotの主要な機能をお試しいただけます。

[DataRobotトライアルに申し込む](https://www.datarobot.com/jp/trial/?utm_source=qiita&utm_medium=3rdPartyPromoter&utm_campaign=FTJP-qiita)

AIや機械学習モデルの開発や運用に興味がある方、すでに携わっている方も、ぜひこの機会にDataRobotを体験してみてください。DataRobot AI アクセラレーターを含む様々な機能をお試しいただき、AIプロジェクトの効率化と価値創出の加速をぜひご体感ください。

ご質問やサポートが必要な場合は、アカウント作成時に提供される連絡先情報をご利用ください。より詳細な情報や個別のデモンストレーションをご希望の場合は、DataRobotの営業担当までお気軽にお問い合わせください。


### 関連動画（DataRobot University）のご案内
こちらの記事で紹介している内容の講義動画を、オンライン学習コンテンツ[「DataRobot University」](https://jp.learn.datarobot.com/learn/learning-path/ai-accelerator )でご覧いただくことができます。なお、こちらの動画はDataRobotのお客様限定のコードが必要となります。コードが分からない方は代理店窓口の方にお問い合わせ下さい。