O PAI permite integrar o Responsible AI toolbox ao DSW para identificar e resolver erros de previsão em modelos de IA de forma sistemática. Este tutorial orienta você na análise de erros de um modelo de classificação binária usando um conjunto de dados censitários.
Como funciona
A análise de erros identifica, categoriza e resolve erros de previsão sistematicamente para melhorar a precisão e a imparcialidade do modelo. Os princípios fundamentais são:
Identificar erros: localize os erros de previsão do modelo comparando as previsões com os valores reais (ground truth) para encontrar discrepâncias. Classifique os erros em diferentes tipos, como falsos positivos e falsos negativos.
Categorizar erros: classifique os erros com base em suas características para compreender melhor as causas raiz, como desequilíbrio de dados, features insuficientes ou viés do modelo. Esse processo pode exigir conhecimento de domínio e julgamento humano.
Analisar causas raiz: investigue as causas de cada categoria de erro. Esta etapa é crítica porque orienta diretamente a otimização do modelo. A análise pode envolver qualidade dos dados, problemas de design do modelo, engenharia de features ou problemas de representação de dados.
Tomar medidas corretivas: com base na análise, adote medidas específicas para resolver os problemas do modelo. Tais medidas podem incluir limpeza de dados, reequilíbrio do conjunto de dados, modificação da arquitetura do modelo, introdução de novas features ou uso de algoritmos diferentes.
Iterar e avaliar: a análise de erros não é uma tarefa única, mas um processo iterativo. Após cada modificação no modelo, execute uma nova análise de erros para avaliar se as alterações foram eficazes, melhoraram o desempenho ou introduziram novos problemas.
Documentar e relatar: para garantir transparência e interpretabilidade, documente detalhadamente o processo de análise de erros, as descobertas e as ações corretivas. Isso também ajuda os membros da equipe a entender as limitações do modelo e fornece feedback valioso para outras fases do projeto.
Este tutorial utiliza o responsible-ai-toolbox no PAI DSW para analisar erros em um modelo que prevê se a renda anual de um indivíduo excede 50K com base em dados censitários.
Antes de começar
-
Uma instância DSW. Caso não possua uma, consulte Create a DSW instance. A configuração recomendada é a seguinte:
Tipo de instância recomendado: ecs.gn6v-c8g1.2xlarge
Imagem: recomenda-se Python 3.9 ou superior. Neste tutorial, a imagem oficial utilizada é tensorflow-pytorch-develop:2.14-pytorch2.1-gpu-py311-cu118-ubuntu22.04.
Modelo: o responsible-ai-toolbox suporta modelos de regressão e classificação binária do framework Scikit-learn.
Conjunto de dados de treinamento: utilize seu próprio conjunto de dados de treinamento. Para usar o conjunto de dados de exemplo deste tutorial, consulte Step 3: Prepare the dataset.
Modelo de algoritmo: utilize seu próprio modelo de algoritmo. Para usar o modelo de exemplo deste tutorial, consulte Step 5: Train the model.
Etapa 1: Acessar a galeria do DSW
Faça login no PAI console.
No canto superior esquerdo, selecione uma região conforme sua necessidade.
No painel de navegação à esquerda, escolha QuickStart > Notebook gallery. Pesquise por "Responsible AI-Error Analysis" e clique em Open in DSW no cartão correspondente.
Selecione uma instância DSW e clique em Open Notebook. O notebook "Responsible AI-Error Analysis" será aberto.
Etapa 2: Importar dependências
Instale a dependência raiwidgets do responsible-ai-toolbox, utilizada para avaliação.
!pip install raiwidgets==0.34.1
Importe as dependências do Responsible AI e do Scikit-learn para treinar o modelo.
# Import dependencies for 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
Etapa 3: Preparar o conjunto de dados
Baixe e extraia o conjunto de dados censitários. A pasta extraída contém os dados de treinamento adult-train.csv e os dados de teste adult-test.csv.
# Specify the name of the dataset file.
outdirname = 'responsibleai.12.28.21'
zipfilename = outdirname + '.zip'
# Download and extract the dataset.
fetch_dataset('https://publictestdatasets.blob.core.windows.net/data/' + zipfilename, zipfilename)
with zipfile.ZipFile(zipfilename, 'r') as unzip:
unzip.extractall('.')
Etapa 4: Pré-processar os dados
Carregue os dados de treinamento
adult-train.csve os dados de testeadult-test.csv.Divida os dados de treinamento e teste em variáveis de features e variáveis alvo. A variável alvo é o resultado real que o modelo prevê. As variáveis de features são as variáveis em cada instância de dados, exceto a variável alvo. Neste exemplo, a variável alvo é
income, e as variáveis de features incluemworkclass,educationemarital-status.Converta os dados de treinamento para o formato NumPy para treinamento.
# Load the training and test data.
train_data = pd.read_csv('adult-train.csv', skipinitialspace=True)
test_data = pd.read_csv('adult-test.csv', skipinitialspace=True)
# Define the columns for the features and the target variable.
target_feature = 'income'
categorical_features = ['workclass', 'education', 'marital-status',
'occupation', 'relationship', 'race', 'gender', 'native-country']
# Define a function to split the features 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 features 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()
# Define a test sample.
test_data_sample = test_data.sample(n=500, random_state=5)
Para carregar seu próprio conjunto de dados no formato CSV:
import pandas as pd
# Load your own dataset in CSV format.
# Use pandas to read the CSV file.
try:
data = pd.read_csv(filename)
except:
pass
Etapa 5: Treinar o modelo
Crie um pipeline de treinamento de dados usando Scikit-learn para treinar um modelo de classificação binária.
# Define the ohe_params parameter based on the scikit-learn version.
if version.parse(sklearn.__version__) < version.parse('1.2'):
ohe_params = {"sparse": False}
else:
ohe_params = {"sparse_output": False}
# Define the classification pipeline for feature transformation. The input parameter X represents the 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 the classification model training pipeline.
pipeline = create_classification_pipeline(X_train_original)
# Train the model.
model = pipeline.fit(X_train_original, y_train)
Etapa 6: Adicionar o componente Responsible AI
Adicione o componente de análise de erros ao Responsible AI e execute a computação.
# Import the 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 the error analysis component.
rai_insights.error_analysis.add()
# Perform the RAI computation.
rai_insights.compute()
Etapa 7: Criar o painel do Responsible AI
Crie diferentes coortes aplicando filtros para analisar segmentos específicos de dados. Alguns exemplos incluem:
Idade menor que 65 e horas por semana maior que 40.
Estado civil é "Never-married" ou "Divorced".
Índice menor que 20.
Y previsto é >50K.
Y verdadeiro é >50K.
Importe o
ResponsibleAIDashboarde use o responsible-ai-toolbox para analisar o modelo.
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.
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)
# 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 >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 >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 the Responsible AI dashboard.
metric_frame_tf = ResponsibleAIDashboard(rai_insights, cohort_list=cohort_list, feature_flights="dataBalanceExperience")
# Set the URL for redirection.
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') )
Etapa 8: Visualizar a análise de erros
Clique na URL para abrir o painel do Responsible 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
Visualize a análise de erros:
Mapa de árvore
-
Clique em Tree Map. Na lista suspensa Select metric, selecione Error rate para analisar os erros. A visualização em árvore divide os dados em uma árvore binária com base nos valores das features do modelo. Por exemplo, os dois ramos sob o nó raiz desta árvore representam:
marital-status == Married-civ-spouse(54/224)
marital-status != Married-civ-spouse(18/276)
Este exemplo contém 500 amostras com 72 erros de previsão, resultando em uma taxa de erro de 14,4% (72/500). Cada nó na árvore binária mostra o número total de pontos de dados que atendem à condição do ramo, juntamente com o número de erros de previsão e a taxa de erro.
Concentre-se nos nós vermelhos. Um tom de vermelho mais escuro indica uma taxa de erro mais alta.
-
Neste exemplo, clique no nó folha de vermelho mais escuro. Isso revela que a taxa de erro de previsão do modelo chega a 43,40% para dados que atendem a todas as seguintes condições:
marital-status == Married-civ-spouse
fnlwgt <= 207583
hours-per-week > 40,5
Mapa de calor
Clique em Heat map para alternar para a visualização de mapa de calor. Na lista suspensa Select metric, selecione Error rate.
-
(Opcional) Configure os parâmetros:
-
Quantile binning: método que divide uma variável contínua em vários intervalos, cada um contendo o mesmo número de pontos de dados.
Defina como OFF para usar a estratégia padrão de agrupamento uniforme, onde cada intervalo tem o mesmo comprimento.
Defina como ON para ativar o quantile binning. Cada intervalo conterá o mesmo número de pontos de dados, garantindo uma distribuição uniforme dos dados entre os intervalos.
Binning threshold: número de intervalos para agrupar os dados. Neste exemplo, o padrão é 8, o que divide
ageehours-per-weekem 8 intervalos iguais.
-
No mapa de calor, selecione duas features de entrada para análise cruzada. Este exemplo usa
ageehours-per-week.Observe as células vermelhas. Um tom de vermelho mais intenso indica uma taxa de erro maior.
-
A taxa de erro é mais alta (chegando a 100%) quando as duas features se enquadram nas seguintes faixas:
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]
...