すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:エラー分析

最終更新日:Jul 16, 2026

Platform for AI (PAI) では、責任ある AI ツールボックスを Data Science Workshop (DSW) に統合し、AI モデルの予測エラーを体系的に特定して解決できます。このチュートリアルでは、国勢調査データセットを使用して、二項分類モデルのエラー分析を行う手順を説明します。

仕組み

エラー分析では、予測エラーを体系的に特定、分類、解決することで、モデルの精度と公平性を向上させます。主な原則は次のとおりです:

  • エラーの特定:モデルの予測エラーを特定します。これは、モデルの予測とグラウンドトゥルースを比較して差分を見つけることで行います。エラーは、偽陽性や偽陰性など、さまざまな種類に分類できます。

  • エラーの分類:特性に基づいてエラーを分類します。これにより、データ不均衡、特徴量の不足、モデルのバイアスなどの根本原因をより深く理解できます。このプロセスでは、ドメイン知識と人による判断が必要になる場合があります。

  • 根本原因の分析:各エラーカテゴリの原因を分析します。このステップは、モデルの最適化に直接つながるため重要です。データ品質、モデル設計の問題、特徴量エンジニアリング、またはデータ表現の問題の分析が含まれる場合があります。

  • 是正措置の実施:分析結果に基づき、開発チームはモデルの課題に対処するための具体的な対策を実施できます。これには、データクレンジング、データセットのバランス調整、モデルアーキテクチャの変更、新しい特徴量の導入、別のアルゴリズムの使用などが含まれる場合があります。

  • 反復と評価:エラー分析は 1 回限りの作業ではなく、反復的なプロセスです。モデルを変更するたびに、変更が有効だったか、性能が向上したか、または新たな問題を引き起こしていないかを評価するために、再度エラー分析を実施する必要があります。

  • 文書化とレポート:透明性と解釈可能性を確保するため、エラー分析のプロセス、結果、是正措置を十分に文書化します。これにより、チームメンバーがモデルの制約を理解しやすくなり、プロジェクトの他のフェーズへの有用なフィードバックも提供できます。

このチュートリアルでは、PAI DSW の responsible-ai-toolbox を使用して、国勢調査データに基づいて個人の年収が 50K を超えるかどうかを予測するモデルのエラー分析を行います。

事前準備

  • DSW インスタンス。お持ちでない場合は、Create a DSW instance をご参照ください。推奨構成は次のとおりです:

    • 推奨インスタンスタイプ:ecs.gn6v-c8g1.2xlarge

    • イメージ:Python 3.9 以降を推奨します。このチュートリアルでは、公式イメージ tensorflow-pytorch-develop:2.14-pytorch2.1-gpu-py311-cu118-ubuntu22.04 を使用します。

    • モデル:responsible-ai-toolbox は、Scikit-learn フレームワークの回帰モデルと二項分類モデルをサポートします。

  • トレーニングデータセット:独自のトレーニングデータセットを使用します。このチュートリアルのサンプルデータセットを使用する場合は、Step 3: Prepare the dataset をご参照ください。

  • アルゴリズムモデル:独自のアルゴリズムモデルを使用します。このチュートリアルのサンプルモデルを使用する場合は、Step 5: Train the model をご参照ください。

手順 1:DSW ギャラリーへの移動

  1. PAI console にログインします。

  2. 左上隅で、必要に応じてリージョンを選択します。

  3. 左側メニューで、クイックスタート > [Notebook gallery] を選択します。"Responsible AI-Error Analysis" を検索し、カード上の DSW で開く をクリックします。

  4. DSW インスタンスを選択し、ノートブックを開く をクリックします。"Responsible AI-Error Analysis" ノートブックが開きます。

手順 2:依存関係のインポート

評価に使用する responsible-ai-toolbox の依存関係である raiwidgets をインストールします。

!pip install raiwidgets==0.34.1

モデルのトレーニング用に、責任ある AI と Scikit-learn の依存関係をインポートします。

# Responsible AI の依存関係をインポート

import zipfile
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

import pandas as pd
from lightgbm import LGBMClassifier
from raiutils.dataset import fetch_dataset
import sklearn
from packaging import version
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

手順 3:データセットの準備

census dataset をダウンロードして展開します。展開後のフォルダには、トレーニングデータ adult-train.csv とテストデータ adult-test.csv が含まれます。

# データセットファイルの名前を指定します。
outdirname = 'responsibleai.12.28.21'
zipfilename = outdirname + '.zip'

# データセットをダウンロードして展開します。
fetch_dataset('https://publictestdatasets.blob.core.windows.net/data/' + zipfilename, zipfilename)
with zipfile.ZipFile(zipfilename, 'r') as unzip:
    unzip.extractall('.')

手順 4:データの前処理

  1. トレーニングデータ adult-train.csv とテストデータ adult-test.csv を読み込みます。

  2. トレーニングデータとテストデータを、特徴量変数と目的変数に分割します。目的変数は、モデルが予測する実際の結果です。特徴量変数は、各データインスタンスにおいて目的変数以外の変数です。この例では、目的変数は income で、特徴量変数には workclasseducationmarital-status などが含まれます。

  3. トレーニング用に、トレーニングデータを NumPy 形式に変換します。

# トレーニングデータとテストデータを読み込みます。
train_data = pd.read_csv('adult-train.csv', skipinitialspace=True)
test_data = pd.read_csv('adult-test.csv', skipinitialspace=True)


# 特徴量と目的変数の列を定義します。
target_feature = 'income'
categorical_features = ['workclass', 'education', 'marital-status',
                        'occupation', 'relationship', 'race', 'gender', 'native-country']

# 特徴量と目的変数を分割する関数を定義します。
def split_label(dataset, target_feature):
    X = dataset.drop([target_feature], axis=1)
    y = dataset[[target_feature]]
    return X, y


# 特徴量と目的変数を分割します。
X_train_original, y_train = split_label(train_data, target_feature)
X_test_original, y_test = split_label(test_data, target_feature)


# NumPy 形式に変換します。
y_train = y_train[target_feature].to_numpy()
y_test = y_test[target_feature].to_numpy()

# テストサンプルを定義します。
test_data_sample = test_data.sample(n=500, random_state=5)

CSV 形式の独自データセットを読み込むには:

import pandas as pd

# CSV 形式の独自データセットを読み込みます。
# pandas を使用して CSV ファイルを読み取ります。
try:
    data = pd.read_csv(filename)
except:
    pass

手順 5:モデルのトレーニング

Scikit-learn を使用してトレーニングパイプラインを構築し、二項分類モデルをトレーニングします。

# scikit-learn のバージョンに基づいて ohe_params パラメータを定義します。
if version.parse(sklearn.__version__) < version.parse('1.2'):
    ohe_params = {"sparse": False}
else:
    ohe_params = {"sparse_output": False}

# 特徴量変換のための分類パイプラインを定義します。入力パラメータ X はトレーニングデータを表します。
def create_classification_pipeline(X):
    pipe_cfg = {
        'num_cols': X.dtypes[X.dtypes == 'int64'].index.values.tolist(),
        'cat_cols': X.dtypes[X.dtypes == 'object'].index.values.tolist(),
    }
    num_pipe = Pipeline([
        ('num_imputer', SimpleImputer(strategy='median')),
        ('num_scaler', StandardScaler())
    ])
    cat_pipe = Pipeline([
        ('cat_imputer', SimpleImputer(strategy='constant', fill_value='?')),
        ('cat_encoder', OneHotEncoder(handle_unknown='ignore', **ohe_params))
    ])
    feat_pipe = ColumnTransformer([
        ('num_pipe', num_pipe, pipe_cfg['num_cols']),
        ('cat_pipe', cat_pipe, pipe_cfg['cat_cols'])
    ])

    pipeline = Pipeline(steps=[('preprocessor', feat_pipe),
                               ('model', LGBMClassifier(random_state=0))])

    return pipeline
    
# 分類モデルのトレーニングパイプラインを作成します。
pipeline = create_classification_pipeline(X_train_original)

# モデルをトレーニングします。
model = pipeline.fit(X_train_original, y_train)

手順 6:責任ある AI コンポーネントの追加

責任ある AI にエラー分析コンポーネントを追加し、計算を実行します。

# RAI ダッシュボードのコンポーネントをインポートします。
from raiwidgets import ResponsibleAIDashboard
from responsibleai import RAIInsights

# RAIInsights オブジェクトを定義します。
from responsibleai.feature_metadata import FeatureMetadata
feature_metadata = FeatureMetadata(categorical_features=categorical_features, dropped_features=[])
rai_insights = RAIInsights(model, train_data, test_data_sample, target_feature, 'classification',
                           feature_metadata=feature_metadata)

# エラー分析コンポーネントを追加します。
rai_insights.error_analysis.add()

# RAI の計算を実行します。
rai_insights.compute()

手順 7:責任ある AI ダッシュボードの作成

  1. フィルターを適用して特定のデータセグメントを分析し、さまざまなコホートを作成します。例:

  • Age が 65 未満で、hours-per-week が 40 を超える。

  • Marital status が "Never-married" または "Divorced"。

  • Index が 20 未満。

  • Predicted Y が >50K。

  • True Y が >50K。

  1. ResponsibleAIDashboard をインポートし、responsible-ai-toolbox を使用してモデルを分析します。

from raiutils.cohort import Cohort, CohortFilter, CohortFilterMethods
import os
from urllib.parse import urlparse

# Age が 65 未満で、hours-per-week が 40 を超える。
cohort_filter_age = CohortFilter(
    method=CohortFilterMethods.METHOD_LESS,
    arg=[65],
    column='age')
cohort_filter_hours_per_week = CohortFilter(
    method=CohortFilterMethods.METHOD_GREATER,
    arg=[40],
    column='hours-per-week')

user_cohort_age_and_hours_per_week = Cohort(name='Cohort Age and Hours-Per-Week')
user_cohort_age_and_hours_per_week.add_cohort_filter(cohort_filter_age)
user_cohort_age_and_hours_per_week.add_cohort_filter(cohort_filter_hours_per_week)

# Marital status が "Never-married" または "Divorced"。
cohort_filter_marital_status = CohortFilter(
    method=CohortFilterMethods.METHOD_INCLUDES,
    arg=["Never-married", "Divorced"],
    column='marital-status')

user_cohort_marital_status = Cohort(name='Cohort Marital-Status')
user_cohort_marital_status.add_cohort_filter(cohort_filter_marital_status)

# Index が 20 未満。
cohort_filter_index = CohortFilter(
    method=CohortFilterMethods.METHOD_LESS,
    arg=[20],
    column='Index')

user_cohort_index = Cohort(name='Cohort Index')
user_cohort_index.add_cohort_filter(cohort_filter_index)

# Predicted Y が >50K。
cohort_filter_predicted_y = CohortFilter(
    method=CohortFilterMethods.METHOD_INCLUDES,
    arg=['>50K'],
    column='Predicted Y')

user_cohort_predicted_y = Cohort(name='Cohort Predicted Y')
user_cohort_predicted_y.add_cohort_filter(cohort_filter_predicted_y)

# True Y が >50K。
cohort_filter_true_y = CohortFilter(
    method=CohortFilterMethods.METHOD_INCLUDES,
    arg=['>50K'],
    column='True Y')

user_cohort_true_y = Cohort(name='Cohort True Y')
user_cohort_true_y.add_cohort_filter(cohort_filter_true_y)

cohort_list = [user_cohort_age_and_hours_per_week,
               user_cohort_marital_status,
               user_cohort_index,
               user_cohort_predicted_y,
               user_cohort_true_y]

# 責任ある AI ダッシュボードを作成します。
metric_frame_tf = ResponsibleAIDashboard(rai_insights, cohort_list=cohort_list, feature_flights="dataBalanceExperience")

# リダイレクト用の URL を設定します。
metric_frame_tf.config['baseUrl'] =  'https://{}-proxy-{}.dsw-gateway-{}.data.aliyun.com'.format(
    os.environ.get('JUPYTER_NAME').replace("dsw-",""),
    urlparse(metric_frame_tf.config['baseUrl']).port,
    os.environ.get('dsw_region') )

手順 8:エラー分析の確認

URL をクリックして、責任ある AI ダッシュボードを開きます。

[2024-05-29 11:04:57,458] WARNING in __init__: WebSocket transport not available. Install gevent-websocket for improved performance.

    ResponsibleAI started at http://localhost:8704

エラー分析を確認します:

ツリーマップ

  1. [Tree Map] をクリックします。[Select metric] ドロップダウンリストから [Error rate] を選択して、エラー分析を実行します。ツリービューでは、モデルの特徴量の値に基づいてデータを二分木に分割します。たとえば、このツリーのルートノード直下の 2 つのブランチは次を表します:

    • marital-status == Married-civ-spouse (54/224)

    • marital-status != Married-civ-spouse (18/276)

  2. この例には 500 件のサンプルが含まれ、予測エラーは 72 件であるため、エラー率は 14.4% (72/500) です。二分木の各ノードには、ブランチの条件を満たすデータポイントの総数に加え、予測エラー数とエラー率が表示されます。

  3. 赤いノードに注目します。赤色が濃いほど、エラー率が高いことを示します。

  4. この例では、最も濃い赤のリーフノードをクリックします。これにより、次のすべての条件を満たすデータでは、モデルの予測エラー率が最大 43.40% に達することがわかります:

    • marital-status == Married-civ-spouse

    • fnlwgt <= 207583

    • hours-per-week > 40.5

ヒートマップ

  1. [Heat map] をクリックして、ヒートマップビューに切り替えます。[Select metric] ドロップダウンリストから [Error rate] を選択します。

  2. (オプション) パラメータを設定します:

    • クォンタイルビニング:連続変数を複数の区間に分割し、各区間に同数のデータポイントが含まれるようにする手法です。

      • OFF に設定すると、デフォルトの一様ビニング戦略を使用します。この場合、各区間の長さは同じです。

      • ON に設定すると、クォンタイルビニングを有効にします。各区間には同数のデータポイントが含まれ、区間間でデータが均等に分布します。

    • ビニングのしきい値:データをビニングする区間数です。この例ではデフォルトは 8 で、agehours-per-week を 8 つの等間隔の区間に分割します。

  3. ヒートマップでは、クロス分析のために 2 つの入力特徴量を選択します。この例では agehours-per-week を使用します。

  4. 赤いセルに注目します。赤色が濃いほど、エラー率が高いことを示します。

  5. 2 つの特徴量が次の範囲に入る場合、エラー率が最も高くなります (最大 100%):

    • age[71.8, 80.9]、hours-per-week[39.0, 51.0]

    • age[44.4, 53.5]、hours-per-week[75.0, 87.0]

    • age[16.9, 26.1]、hours-per-week[63.0, 75.0]

    • ...