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

Platform For AI:責任あるAI: エラー分析

最終更新日:Jul 22, 2024

責任あるAIは、AIモデル開発者とエンタープライズ顧客にとって非常に重要です。 責任あるAIは、AIモデルが安全で、安定し、公正で、社会的に倫理的であることを保証するために、モデル開発、トレーニング、微調整、評価、および展開において重要な役割を果たします。 Alibaba Cloud Platform for AI (PAI) のData Science Workshop (DSW) を使用すると、責任あるAIツールを統合して、生成されたAIモデルの公平性分析、エラー分析、および解釈可能性分析を実行できます。

仕組み

エラー分析は、モデルのパフォーマンスを理解し、改善するための重要なステップです。 エラー分析は、AIモデル予測のエラーを体系的に識別、分析、修正して、モデルの精度と公平性を向上させます。 次のセクションでは、エラー分析の原則について説明します。

  • エラー識別: モデルによって生成された不正確な予測を識別します。 システムは、モデルの予測結果を真の値と比較して、矛盾するケースを識別する。 エラーは、偽陽性および偽陰性などの異なるタイプに分類することができる。

  • エラーの分類: 属性に基づいてエラーを分類します。 エラーの分類は、データの不均衡、不十分な機能、モデルの偏りなど、エラーの根本原因を特定するのに役立ちます。 このプロセスには、ドメイン知識と人間の判断が必要です。

  • 原因分析: 各エラーカテゴリの原因を分析します。 原因分析は、モデル最適化に重大な影響を及ぼし、データ品質の分析と、モデル設計、機能エンジニアリング、またはデータ表現に関連する問題の修正を伴う場合があります。

  • 改善操作: エラー分析の結果に基づいて、モデルの問題を解決する操作を実行できます。 動作は、データのクリーニング、データセットの再バランス、モデルアーキテクチャの修正、新しい特徴の導入、または異なるアルゴリズムの使用を含むことができる。

  • 反復および評価: エラー解析は、連続的な反復プロセスである。 モデルを変更するたびに、エラー分析を実行して変更の影響を評価し、モデルパフォーマンスの改善を監視し、新しい問題を特定する必要があります。

  • ドキュメントとレポート: 透明性と説明性を確保するために、特定された問題や実行された是正措置など、エラー分析プロセスをドキュメント化することを推奨します。 これにより、チームメンバーはモデルの制限を理解し、他のプロジェクトステージを改善するためのインサイトを提供できます。

このトピックでは、担当ツールボックスを使用してDSWのモデルでエラー分析を実行する方法について説明します。 このトピックでは、年収が50Kを超えるかどうかを予測するモデルを評価します。

環境とリソースの準備

  • DSWインスタンス: DSWインスタンスがない場合は、DSWインスタンスを作成します。 詳細については、「DSWインスタンスの作成」をご参照ください。 次の設定を使用することを推奨します。

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

    • 画像: Python 3.9以降。 このトピックでは、使用される公式の画像はtensorflow-pytorch-developed: 2.14-pytorch2.1-gpu-py311-cu118-ubuntu22.04です。

    • モデル: 責任-ai-ツールボックスは、Sklearn、PyTorch、およびTensorFlowフレームワークに基づく回帰およびバイナリ分類モデルをサポートしています。

  • トレーニングデータセット: データセットを使用することを推奨します。 サンプルデータセットを使用する場合は、「ステップ3」を参照してください。 このトピックのデータセット "のセクションを準備します。

  • アルゴリズムモデル: アルゴリズムモデルの使用を推奨します。 サンプルアルゴリズムモデルを使用する場合は、「ステップ5」を参照してください。 このトピックのモデル "セクションをトレーニングします。

ステップ1: DSWギャラリーに移動

  1. PAIコンソールにログインします。

  2. 左上隅で、ビジネス要件に基づいてリージョンを選択します。

  3. 左側のナビゲーションウィンドウで、ビッグデータとAIエクスペリエンス > DSWギャラリーを選択します。 責任あるAIエラー分析を検索し、[DSWで開く] をクリックします。

  4. AIワークスペースDSWインスタンスを選択し、[OK] をクリックします。 システムがResponsible AIエラー分析ノートブックを開きます。

ステップ2: 依存関係パッケージのインポート

その後の評価のために、責任のある-ai-toolbox依存関係パッケージ (raiwidgets) をインストールします。

! pip install raiwidgets==0.34.1

Responsible AIとSklearnの依存関係パッケージをインポートして、その後のトレーニングを行います。

# Import Response AI-related dependency package.

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: データセットの準備

必要なデータセットをダウンロードして解凍します。 パッケージには、adult-train.csvという名前のトレーニングデータとadult-test.csvという名前のテストデータが含まれます。

# Specify the name of the dataset file.
outdirname = 'responsibleai.12.28.21'
zipfilename = outdirname + '.zip'

# Download the dataset and decompress the file.
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であり、特徴変数はワーククラス教育、および婚姻状況である。

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

# Load training data and test data.
train_data = pd.read_csv('adult-train.csv', skipinitialspace=True)
test_data = pd.read_csv('adult-test.csv', skipinitialspace=True)


# Specify the columns in which the feature variables and the target variable reside.
target_feature = 'income'
categorical_features = ['workclass', 'education', 'marital-status',
                        'occupation', 'relationship', 'race', 'gender', 'native-country']

# Specify a function to split the feature variables and the target variable.
def split_label(dataset, target_feature):
    X = dataset.drop([target_feature], axis=1)
    y = dataset[[target_feature]]
    return X, y


# Split the feature variables and the target variable.
X_train_original, y_train = split_label(train_data, target_feature)
X_test_original, y_test = split_label(test_data, target_feature)


# Convert to the numpy format.
y_train = y_train[target_feature].to_numpy()
y_test = y_test[target_feature].to_numpy()

# Specify the test sample.
test_data_sample = test_data.sample(n=500, random_state=5)

データセットを読み込むこともできます。 次のセクションでは、CSV形式のデータセットのサンプルコマンドを示します。

import pandas as pd

# Load your dataset in the CSV format.
# Use pandas to read CSV files.
try:
    data = pd.read_csv(filename)
except:
    pass

ステップ5: モデルのトレーニング

この例では、Sklearnを使用してデータトレーニングパイプラインを定義し、バイナリ分類モデルをトレーニングします。

# Define the ohe_params parameter based on different versions of Sklearn
if version.parse(sklearn.__version__) < version.parse('1.2'):
    ohe_params = {"sparse": False}
else:
    ohe_params = {"sparse_output": False}

# Define classification pipeline for feature conversion. The X parameter represents training data.    
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
    
# Create a classification model training pipeline.
pipeline = create_classification_pipeline(X_train_original)

# Train the model.
model = pipeline.fit(X_train_original, y_train)

ステップ6: 責任あるAIコンポーネントの追加

次のスクリプトを実行して、Responsible AIのエラー分析コンポーネントを追加し、rai_insightsを使用してコンピューティングを実行します。

# Import RAI dashboard components.
from raiwidgets import ResponsibleAIDashboard
from responsibleai import RAIInsights

# Define the RAIInsights object.
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)

# Add an error analysis component.
rai_insights.error_analysis.add()

# Perform computing by using RAI.
rai_insights.compute()

ステップ7: 責任あるAIダッシュボードの作成

  1. エラー分析のさまざまなフィルタリング条件に基づいてデータグループを作成します。 例:

  • 年齢は65歳未満で、週あたりの時間は40時間を超えています。

  • 婚姻状況は未婚または離婚です。

  • データグループのインデックスは20未満です。

  • 予測Yは50Kより大きい。

  • 真のYは50Kより大きい。

  1. ResponsibleAIDashboardを導入して、担当ツールボックスを使用してモデルを分析します。

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

# Age is less than 65 and hours-per-week is greater than 40 hours.
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 is Never-married or 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)

# Data group index is less than 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 is greater than 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 is greater than 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]

# Create a Responsible AI dashboard.
metric_frame_tf = ResponsibleAIDashboard(rai_insights, cohort_list=cohort_list, feature_flights="dataBalanceExperience")

# Specify the URL link.
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: Responsible AIダッシュボードにアクセスしてエラー分析を表示

URLをクリックして、責任あるAIダッシュボードにアクセスします。

image

エラー分析:

ツリーマップ

image

  1. [ツリーマップ] をクリックし、[メトリックの選択] セクションで [エラー率] を選択してエラー分析を実行します。 ツリーマップは、バイナリツリーを使用して、モデルの特徴に基づいてデータを分割します。 たとえば、次のセクションでは、ルートノードの下のバイナリブランチについて説明します。

    • marital-status ==既婚civ-配偶者 (54/224)

    • 婚姻状況! =既婚civ-配偶者 (18/276)

  2. この例は、72個の予測誤差を有する500個のサンプルを含む。 エラー率は14.4% である。 各ノードには、分岐条件に基づいて、総データ数、予測エラー、エラー率が表示されます。

  3. 赤いノードに注意してください。 より暗い色は、より高い誤り率を示す。

  4. この例では、最も深い赤い葉ノードは、次の条件を持つバイナリーツリーパスの43.40% データエラー率を示しています。

    • marital-status ==既婚-civ-配偶者

    • fnlwgt <= 207583

    • hours-per-week > 40.5

ヒートマップ

image

  1. [ヒートマップ] をクリックし、[メトリックの選択] セクションで [エラー率] を選択してエラー分析を実行します。

  2. オプションです。 以下のパラメーターを設定できます。

    • 量子ビニング: 連続変数を同じデータポイントを持つ区間に分割する方法。

      • OFF: quantileビニングを無効にします。 間隔の長さが等しいデフォルトの等しい間隔戦略を使用します。

      • ON: 分位ビニングを有効にします。 各区間は、均一分布のために同数のデータ点を含む。

    • ビニングしきい値: データが分割される間隔の数。 しきい値を調整して、インターバル番号を変更します。 この例では、デフォルト値は8です。これは、年齢と週あたりの時間を8つの間隔に分割することを指定します。

  3. ヒートマップでは、クロスデータ分析用に2つのフィーチャを選択できます。 この例では、年齢と週あたりの時間がヒートマップ分析のために選択されています。

  4. 赤いノードに注意してください。 より暗い色は、より高い誤り率を示す。

  5. 分析は、最も高いエラーレート (100%) が以下の特徴範囲に存在することを示す。

    • 年齢 [71.8、80.9] 、週あたりの時間 [39.0、51.0]

    • 年齢 [44.4、53.5] 、週あたりの時間 [75.0、87.0]

    • 年齢 [16.9、26.1] 、週あたりの時間 [63.0、75.0]

    • ...