AIモデルを利用した高度な要因分析の薦め

**DataRobot AIアクセラレータで実現する合理的な変数選択とインサイト獲得**

DataRobot Japanでヘルスケア業界のお客様を担当しているデータサイエンティストの伊地知です。本稿はDataRobot Japanのシニアデータサイエンティスト詹金（Senkin）の監修のもと執筆しました。

## はじめに
[弊社山本が執筆したブログ記事](https://qiita.com/DataRobot_PR/items/2def418c7aada62c6dcd)のように、DataRobotはコードファーストデータサイエンティストがノートブック環境から実行できる高度なAI分析ソリューションのサンプルスクリプトを、[AIアクセラレータ](https://docs.datarobot.com/ja/docs/api/accelerators/index.html#ai-accelerators)という名称でご提供しています。AIアクセラレータとしてリリースしたソリューションはいずれもDataRobot AIプラットフォームのGUIから操作できる機能だけでは実施できない分析ユースケースや機能に対応しており、日々新しいAIアクセラレータがDataRobot社のデータサイエンティスト達の監修のもとで公開されています。
本稿では、DataRobotユーザー様から非常に多くご相談を受ける要因分析に焦点を当て、機械学習技術を使った高度な要因分析の方法論を解説します。さらに、その方法論に基づき弊社が開発したAIアクセラレータ『[Robust Feature Impact Script](https://docs.datarobot.com/ja/docs/api/accelerators/adv-approaches/rob-fi.html)』をご紹介します。

## AI（機械学習）モデルを利用した要因分析のリスクと解決方法

要因分析の切り口から統計解析と機械学習について考察した２篇のブログ記事[[1](https://www.datarobot.com/jp/blog/statistical_analysis_ml_part_1/)] [[2](https://www.datarobot.com/jp/blog/statistical_analysis_ml_part_2/)] において、筆者はAI（機械学習）モデルを利用して要因分析を行う際に分析者がよく直面する問題である「分析結果の不安定性」を指摘しました。

- 検定データを最も精度良く予測するモデルがパーティショニング条件によって変わる
- 目的変数と強い関係性を持つとして選択される説明変数とその序列が変わる

解析結果の再現性を担保するべき要因分析で、このように分析結果が大きく変動してしまうリスクはできるだけ低減させる必要があります。そこで、弊社ではDataRobotの高度な機械学習自動化技術を利用すれば以下のような解決方法があるとして、数年前からPythonサンプルスクリプトをユーザー様にご提供してきました。

- 「サンプリングされた少量の学習データが潜在的に有するバイアス」の影響を、より頑強性（ロバストネス）の高いモデルを作成してできるだけ小さくする
- そのため、意識的に「多様な素性の機械学習アルゴリズムから作られたモデル単体を様々な方法で組み合わせたアンサンブルモデル」を作り、その結果を利用する
- 加えて、パーティショニング時のデータサンプリング条件（ランダムシード）を変更しながら何度も機械学習モデルを作って「特徴量のインパクト」を計算し、その結果を利用する

この方法を模式的に表現すると下図のようになります。ランダムシード（乱数）に基づく擬似的なブートストラップサンプリングが実施され、各々の分割データセットから得られたインサイトをさらに集計していますが、これは擬似的なメタ解析を行なってインサイトの信頼性/再現性をできるだけ高めようとしていると解釈することができます。

![図1. ランダムシードに基づくデータサンプリング:分割とモデリングの概念.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/5eeebf46-5f48-7824-a520-2d3ec4638f24.png)
　　　図1. ランダムシードに基づくデータサンプリング/分割とモデリングの概念

![図2. 複数のアンサンブルモデルから得られたインサイトを集計して重要な説明変数を同定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/db6e3db2-f10e-098d-c4b5-e63a9ed1d672.png)
図2. 複数のアンサンブルモデルから得られたインサイトを集計して重要な説明変数を同定

DataRobotは分割データセットの作成、交差検定による複数の単体モデル構築、アンサンブルモデルの構築、Permutation Importanceによる説明変数（特徴量）重要度の計算、などを全て自動で実行できるため、大量の単体モデルを作成するこのような解析も現実的な時間で行えます。

ところで、一つのランダムシード（乱数）条件によって行われる分析はDataRobotの一つのエクスペリメント（旧称プロジェクト）となりますが、本分析手法では上図に示したように複数のエクスペリメントで得られた結果を集計する必要があります。この操作はGUI上ではできないため、弊社シニアデータサイエンティストの詹金は上述のサンプルスクリプトをもとにDataRobot Python SDKを使った『[Robust Feature Impact Script](https://docs.datarobot.com/ja/docs/api/accelerators/adv-approaches/rob-fi.html)』を開発し、AIアクセラレータとして今年弊社グローバルGitHubサイトに[公開](https://github.com/datarobot-community/ai-accelerators/blob/main/advanced_ml_and_api_approaches/Robust_Feature_Impact/Robust_Feature_Impact.ipynb)しました。

## Borutaのコンセプトを利用した説明変数選択の方法論
『Robust Feature Impact Script』の解説の前に、要因分析において重要な「説明変数（特徴量）の選択」をどのように行うべきか、を考えてみましょう。筆者はステップワイズ法によって一つずつ変数を減らしながら重要な説明変数を絞り込んでいくアプローチは、説明変数の数が多いデータでは多重検定リスクの観点から使うべきではないと考えています[[1](https://www.google.com/url?q=https://www.datarobot.com/jp/blog/statistical_analysis_ml_part_1/&sa=D&source=docs&ust=1731017146914653&usg=AOvVaw1zQeqTu6Fy57kx5ti7aULw)]。

説明変数（特徴量）の選択という課題に対して、Miron B. Kursa, Witold R. RudnickiらはBoruta Package[[3](https://www.jstatsoft.org/article/view/v036i11)]による解析的なアプローチを提案しました。この機械学習アルゴリズムも用いた方法は非常に強力ですが、そのアイデアの骨子を簡潔に表すと「予測に寄与しない、ガウス分布に従うランダム変数特徴量（ダミー変数）を組み込んだモデルを構築し、ダミー変数との比較を行なって変数選択を実施する」というものです。オリジナルのBorutaはランダムフォレストアルゴリズムと統計的検定を使って重要な特徴量を判別していますが、弊社のAIアクセラレータ『[Robust Feature Impact Script](https://docs.datarobot.com/ja/docs/api/accelerators/adv-approaches/rob-fi.html)』(RFIS)ではBorutaのコンセプトを応用した以下の操作を実行させるようにデザインしました。

1. ガウス分布に従うダミー変数（ホワイトノイズ特徴量）を複数組み込んだモデルを構築
2. 変数重要度をPermutation Importance[[4](https://www.datarobot.com/jp/blog/permutation-importance/)]で算出（図3）
3. 最も順位が低いダミー変数よりもさらに順位が低い説明変数は重要でないと判断し除去
4. 残った説明変数と目的変数を含む新たな学習データテーブルを出力

上記の操作により出力された新たなデータテーブルに対して再度RFISを実行して、さらに説明変数を絞り込んでいくこともできます。最終的に最も順位の低いダミー変数よりもさらに順位が低いオリジナル変数が存在しなくなったら解析終了とします。
　　　　<img width="600" alt="図3. ダミー変数（ホワイトノイズ変数）を組み込んで構築したモデルから得られた 特徴量の重要性に関するインサイトの例  .png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/daf7fdd2-764c-f507-fa9e-ff29da5ceb48.png">
　　　図3. ダミー変数（ホワイトノイズ変数）を組み込んで構築したモデルから得られた
　　　　　　　　　　　　特徴量の重要性に関するインサイトの例

なお、どこまで説明変数を絞り込んだら終了とするかや、ダミー変数より重要度が小さい特徴量の除去ルール、については、実際には多分にヒューリスティックな側面があり、またドメイン知識を駆使しながら恣意的な選択を行う余地も大いにあります。即ち、このプロセスを全て自動化し、機械的に変数を絞り込んでいくことはできない、と筆者は考えています。

例えば、説明変数の数が多いうちは重要度が最も大きい値をとるダミー変数よりも順位が低い変数は除去対象とし、ある程度絞り込まれてきたら最も重要度の小さいダミー変数よりさらに順位が低い変数だけを除去するように切り替える、といった操作は実際に行われています。また、あるダミー変数の重要度が非常に大きい、というような解析結果が出てきたら、それはたまたまだったと解釈する、などの操作も実際に行われています。

## Robust Feature Impact Scriptの概要

それではAIアクセラレータ『[Robust Feature Impact Script](https://docs.datarobot.com/ja/docs/api/accelerators/adv-approaches/rob-fi.html)』（RFIS）の概要を見ていきましょう。なお本稿ではDataRobot NotebooksにRFISをアップロードして実行させた画面で解説していきます。DataRobot Notebooksについてご興味のある方は弊社ブログ記事[[5](https://www.datarobot.com/jp/blog/integrated-environment-for-accelerating-data-science-innovation-with-datarobot-codespaces-notebooks/)][[6](https://www.google.com/url?q=https://www.datarobot.com/jp/blog/benefits-of-using-datarobot-codespaces-notebooks-from-an-administrators-perspective/&sa=D&source=docs&ust=1731018365217760&usg=AOvVaw0la1My2r9YKbrnvYKYLV8T)]などをご覧いただければ幸いです。

**サンプルデータ**
[DataRobotのGitHubページ](https://www.google.com/url?q=https://github.com/datarobot-community/ai-accelerators/blob/main/advanced_ml_and_api_approaches/Robust_Feature_Impact/Robust_Feature_Impact.ipynb&sa=D&source=docs&ust=1731017960601516&usg=AOvVaw0lJR0JcLvIEFvLcJpFuvam)からダウンロードできるサンプルデータに対して分析を行なった結果を示しながら解説します。同じサンプルデータはRFISの最初のセルに表記されているURLからもアクセスできます。
![ サンプルデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/5cb16325-05ee-d5af-9463-8e7e0490a3cc.png)

**分析条件の設定**
Set upのセルで必要なライブラリを読み込んだら、次にBind variablesのセルでAPIトークンやエンドポイント、さらに分析条件の設定を行います。RFISで分析の度に設定が必要な項目は全てこのセルに集約されています。以下は設定項目についての説明です。

**実行環境の設定(NO.1)**
```python
# 1: Run this notebook at Local or DataRobot Notebooks
ENV = "local"  # ("local" or "dr_notebooks")
```

- 実行環境を指定する設定です。ローカル環境で実行する場合は"local"を、DataRobot Notebooks/Codespaces環境で実行する場合は"dr_notebooks"を指定します。

**API/エンドポイント等の設定(NO.2)**
```python
# 2: DataRobot APIトークンとエンドポイントの設定
TOKEN = "<INSERT YOUR DataRobot API Token>"  # DataRobot Notebooks使用時はスキップ可能
END_POINT = "https://app.datarobot.com/api/v2"
AI_CATALOG_DATA_ID = "<INSERT YOUR AI CATALOG DATASET ID>"
AWS_KEY = "<INSERT YOUR AWS ACCESS KEY>"
AWS_SECRET = "<INSERT YOUR AWS SECRET>"
AWS_S3_INPUT_PATH = "<INSERT YOUR AWS S3 INPUT PATH>"
AWS_S3_OUTPUT_PATH = "<INSERT YOUR AWS S3 OUTPUT PATH>"
```

- 外部サービスへの接続に必要な認証情報（DataRobot APIにアクセスするためのトークンとエンドポイントURL、AI Catalogのデータセット識別子）を設定します。（DataRobot Notebooks/Codespaces環境を使用する場合、TOKENの設定はスキップできます）
- AWSを利用する場合は、ここでアクセスキー、シークレットキー、S3の入出力パスを設定します。

**データの入出力設定(NO.3)**
```python
# 3: Input and Output Path(file should be csv with UTF-8 encoding)
input_folder = "./input/"
output_folder = "./output/"
os.makedirs(output_folder, exist_ok=True)
os.makedirs(input_folder, exist_ok=True)
file_name = "500_Lending_Club_Loans.csv"
input_file = input_folder + file_name

data_source = "local"  # ("local" or "ai_catalog" or "aws_s3", dr_notebooks can not use local)
data_output = ["ai_catalog", "aws_s3"]  # ("ai_catalog" or "aws_s3", multiple selects)
```

- データの読み込みと保存に関する設定を行います。入力データと出力データのフォルダパスを指定し、必要に応じて自動的にフォルダを作成します。
- 分析対象のファイルはUTF-8エンコードのCSV形式である必要があります。データソースはローカルファイル、AI Catalog、AWS S3から選択できますが、DataRobot Notebooks環境ではローカルファイルは指定できません。
- 分析結果の出力先はAI CatalogとAWS S3から複数選択することが可能です。

**モデリングの基本設定(NO.4, 5, 6)**
```python
# 4: Target, if multiclass, use 0,1,2... as target
target = "is_bad"

# 5: Regression task or not
regression = False

# 6: If regression choose 1, if binaryclass choose 2, if multiclass the number of class
class_num = 2
```

- 4：予測対象となる列名をtargetに指定します。なお多クラス分類の場合は、予測ターゲット（目的変数）のクラスラベルを「0,1,2…」と0から始まる番号にしてください。
- 5：回帰分析（True）か分類分析（False）かを指定します。
- 6：回帰分析の場合はclass_numを1、二値分類の場合は2、多クラス分類の場合は該当するクラス数を指定します。

**交差検定条件とランダムシードを変えて実行するエクスペリメント数の設定(NO.7, 8)**
```python
# 7: Cross Validation folds, 10 is recommended
cv = 10

# 8: Run how many times with random seed, 10 is recommended
iteration = 10
# max iteration is 10
if iteration > 10:
    iteration = 10
```
- 7：交差検定の条件設定を行います。データ数が数百行から数千行程度のスモールデータを分析する場合を想定して、交差検定のフォールド数の推奨値を10としています（こうすると学習データの割合が増えるためモデル精度が向上する効果を期待できます）。分析対象のデータレコード数が1万行を超えているなら5分割交差検定で問題ありません。
- 8：異なるランダムシード（乱数）で何種類の分割データセットを作成するかをここで設定します。できるだけ多くした方が良いのですが、現実的な計算時間内で分析を行うことを考慮し、2024年11月時点では10種類の分割データセットから10個のエクスペリメントを実行する設定をMaxとしています。（設定値が10を超える場合は自動的に10に制限されます）

**モデル精度評価指標と特徴量の設定(NO.9, 10, 11)**
```python
# 9: Choose metric to measure best performance like "AUC" "MAE" "R Squared", if use default choose 0
metrics = "LogLoss"

# 10: Choose feature importance aggregation method like "median" "min", median is recommended
how = "median"

# 11: Keep series id column, if have multiple ids ["ID1","ID2"], if none []
keep_column = ["ID"]
```

- 9：モデルの精度評価指標を設定します。DataRobot GUIでも選択できるLogLoss、AUC、MAE、R Squaredなどを使えます。デフォルト設定を使用する場合は0を指定します。
- 10：説明変数（特徴量）の重要度を集計してどのように順位付けするかを設定します。中央値（median）に基づく順位付けが標準ですが、最小値（min）での順位付けも可能です。
- 11；分析に必要なID列がある場合は、keep_columnで設定します。複数のIDがある場合は配列形式で指定し、必要ない場合は空配列を設定します。

**その他分析オプションの設定(NO.12, 13, 14, 15)**
```python
# 12: Use relative value or absolute values of feature impact. Absolute value is recommended
impact_abs = True

# 13: If enable partial dependency plot of top 5 features. If True the running time become longer
pdp = True

# 14: If use groupkfold input group column ["Group_ID"], if not input False
group_col = False

# 15: If add error features(dummy features). If true will add 3 0~100 random numeric features(error_1, error_2, error_3)
error_feature = True
```

- 12：Permutaion Importanceによる特徴量のインパクト（Feature Impact）を絶対値で表示するか相対値で表示するかを設定します。特段の理由がない限り絶対値での表示が推奨されますが、相対値（GUIのデフォルト）での表示も可能です。
- 13：ここをTrueに設定すると重要度上位5つの説明変数について部分依存プロット（PDP: Partial Dependence Plot）を出力します。ただしこの処理には時間がかかるため、先に重要な説明変数を絞り込んだ後での使用を推奨します。
- 14：グループパーティションによるk分割交差検定を実施するかどうかを設定します。実施する場合はグルーピングに使用する列名を指定し、実施しない場合はFalseを設定します。
- 15：Borutaによる変数選択を行う場合は、error_featureをTrueに設定することで、3つのガウス分布に従うダミー変数（error_1, error_2, error_3）が追加されます。

## スクリプトの実行
設定が終わったらスクリプトを実行します。一回の分析で100個を超える単体モデル/アンサンブルモデルが構築され、それぞれに対してインサイトが出力されます。これらの作業を人手でやるのは工数の観点から現実的ではなく、DataRobot AI Platformの機械学習自動化技術を利用することで初めて成立する分析手法であると言えるでしょう。

## 出力される図表/データ
RFISを使って分析を実行すると、下図のようにoutputフォルダ下に様々なインサイト/データが出力されます。

　　　　　　　　　　<img width="400" alt="図4. RFISから出力されたグラフ:データの例.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/86efbbd1-3c52-ed81-2b85-5fb99dca4cab.png">
　　　　　　　　　　　　図4. RFISから出力されたグラフ/データの例

graphフォルダ下には、「特徴量のインパクト」を集計した結果をバープロット、ボックスプロット、バイオリンプロット、で表示したグラフが格納されます。下図の例では、3つのダミー変数が8位-10位に表示されており、それより順位の低い説明変数は重要でないとして除去しても良いかもしれません。
![図5. RFISが出力したボックスプロットの例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/4b3af351-2231-539b-2103-9f111364c51a.png)
　　　　　　　　　　図5. RFISが出力したボックスプロットの例

pdpフォルダ下には、特に重要な説明変数にフォーカスした部分依存グラフ(PDP)が格納されます。各ランダムシードで構築されたアンサンブルモデル毎にPDPを描き、それらの平均値を太い曲線で表現しています。
![図5. RFISが出力した部分依存グラフの例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/af684ff1-6a51-35b8-de06-603c83bc5dba.png)
　　　　　　　　　　図6. RFISが出力した部分依存グラフの例

log_file.csvには、モデル構築条件や、各ランダムシード（乱数）でどのようなモデルがどのような精度で構築できたかが記録されています。

seeds_check.csvには、各ランダムシード（乱数）でどのような説明変数が重要だったのかと、permutation importanceの絶対値が記録されています。

robust_feature_入力データファイル名.csvは、3つのうち最も重要度の小さいダミー変数よりさらに重要度が小さかった説明変数を除去したオリジナルデータです。目的変数とIDの列も残っているので、さらに説明変数を絞り込みたい場合にはこのデータを入力データとしてRFISを実行します。

　　　　<img width="600" alt="図6. RFISで重要度の小さい説明変数を除去した後のオリジナルデータの例.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/380c3994-33de-4141-8b0d-1f19d7c7bef3.png">
　　　　　図7. RFISで重要度の小さい説明変数を除去した後のオリジナルデータの例

## AIモデルを利用した高度な要因分析のまとめ
本稿では以下を解説しました。
- 説明変数の数が多いがデータサイズとしては数百行から数千行程度のスモールデータからでも安定して再現性の高いインサイトを得るためには、機械学習自動化技術を駆使した解析的アプローチが有効である。
- ランダムシード（乱数）を変更した分割データセットによる分析結果を集計するメタ解析アプローチにより、データバイアスによる解析結果のブレなどがあっても重要度の高い説明変数を同定することが可能である。
- DataRobot社のシニアデータサイエンティストが開発したAIアクセラレータ『[Robust Feature Impact Script](https://docs.datarobot.com/ja/docs/api/accelerators/adv-approaches/rob-fi.html)』（RFIS）は、DataRobot Python SDKを使用して複数のエクスペリメントを実行し集計している。またBorutaのコンセプトに基づき、合理的な変数選択方法を提供している。

RFISはDataRobot GitHubページからすぐダウンロードでき、DataRobot Notebooksや他のノートブック環境に読み込んで簡単な設定を行うだけで実行することができます。要因分析を行いたいデータがあるが説明変数の数が多過ぎて困っている、というようなケースでぜひお試しいただければ幸いです。

## DataRobotトライアルのご案内
DataRobotでは、トライアル環境を提供しています。
[こちらからアカウントを作成](https://www.datarobot.com/jp/trial/?utm_source=qiita&utm_medium=3rdPartyPromoter&utm_campaign=FTJP-qiita)し、DataRobotの主要な機能をお試しいただけます。

AIの開発や運用にご興味がある方、すでに携わっている方も、ぜひDataRobotを体験してみてください。コードファーストデータサイエンティストの皆様は、DataRobot Notebooks/Codespaces環境で様々なAIアクセラレータをお試しいただき、AIプロジェクトの効率化と価値創出の加速をぜひご体感ください。

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


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

**References**
[1] https://www.datarobot.com/jp/blog/statistical_analysis_ml_part_1/ 
[2] https://www.datarobot.com/jp/blog/statistical_analysis_ml_part_2/ 
[3] https://www.jstatsoft.org/article/view/v036i11 
[4] https://www.datarobot.com/jp/blog/permutation-importance/ 
[5] https://www.datarobot.com/jp/blog/integrated-environment-for-accelerating-data-science-innovation-with-datarobot-codespaces-notebooks/
[6] https://www.datarobot.com/jp/blog/benefits-of-using-datarobot-codespaces-notebooks-from-an-administrators-perspective/