Exercícios 3

Aula 3

1) Dados

Para esse exercício, será necessário carregar alguns dados sobre violência policial letal nos Estados Unidos:

link <- "https://raw.githubusercontent.com/FLS-6497/datasets/main/aula3/PKAP_raw_data.csv"
dados <- readr::read_csv(link)
import pandas as pd

link = 'https://raw.githubusercontent.com/FLS-6497/datasets/main/aula3/PKAP_raw_data.csv'
c = pd.read_csv(link)

Para quem usa R, também será importante instalar algumas bibliotecas previamente:

install.packages(c("mlr3verse", "mlr3measures"))

a) Exploração de features

Faça gráficos de barras com a frequência da variável race por cada uma das variáveis officer_ na base de dados. O resultado deve indicar quantas vítimas de mortes por violência letal policial de diferentes raças (whites e blacks) ocorreram em diferentes categorias (e.g., office_offduty). Dica: algumas variáveis precisam ser recategorizadas porque possuem muitas categorias com poucas ocorrências.

b) Nova base

Crie uma nova base de dados que inclua apenas as variáveis mencionadas na Tabela 1 do paper de Streeter. Dica: será necessário criar novas variáveis e descartar outras existentes na base. Para quem usa Python, também é importante recodificar variáveis para o formato de one hot encoding (em R, a maioria das funções de regressão já faz essa conversão por baixo dos panos).

2) Classificador logístico

Usando um framework (mlr3 ou sci-kit), treine um modelo logístico para predizer mortes de blacks (crie uma dummy indicando 1 para essa ocorrência) usando as variáveis anteriores.

O código base será mais ou menos o seguinte:

library(mlr3learners)
library(mlr3)

# Treina o modelo
tsk <- as_task_classif(race ~ officer_offduty + ..., positive = "Black", data = dados)
learner <- lrn("classif.log_reg")
learner$train(tsk)

# Avalia predicoes
pred <- learner$predict(tsk)
pred$confusion
measure <- msr("classif.acc")
pred$score(measure)
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

# Carrega os dados
link = 'https://raw.githubusercontent.com/FLS-6497/datasets/main/aula3/PKAP_raw_data.csv'
c = pd.read_csv(link, encoding='latin')

# Transforma as variaveis (precisam ser float)
Y = pd.get_dummies(c['race']).Black
X = pd.get_dummies(c['officer_offduty'])

# Treina o modelo
mod = LogisticRegression()
mod.fit(X, Y)

# Avalia predicoes
pred = mod.predict(X)
classification_report(Y, pred)
confusion_matrix(Y, pred)

Dica: consulte (de verdade!) a documentação de referência de cada framework; é a melhor maneira de aprender a se virar.

3) Treino e teste

a) Criar função

Crie uma função para sortear da base uma amostra de treino e, outra, de teste. Para isso, a função pode retornar uma lista com as duas amostras. Crie também um argumento na função que permita selecionar o percentual de observações na amostra de treino (o default precisará ser 0.7).

b) Modelo com treino e teste

Com a função anterior, retreine seu modelo anterior na amostra de treino e, depois, aplique as predições na amostra de teste.

c) Tamanho das amostras de treino

Com a função anterior, retreine seu modelo usando diferentes tamanhos de amostra de treino, de 0.3 a 0.9 com intervalos de 0.05. Crie um gráfico para reportar alguma métrica de validação (pode ser acurácia ou precisão, ou ainda F1) e, no eixo X, inclua a informação sobre o percentual usado

4) Validação

a) Nova função

Modifique a função criada anteriormente para que ela já separe a amostra em treino e teste, rode um modelo logístico e retorne alguma métrica de validação.

b) Cross-validation

Use a função criada anteriormente para rodar 500 modelos logísticos em diferentes amostras de treino e de teste. Reporte os resultados desse exercício com um histograma dos valores de validação de alguma métrica.

5) Comparação de modelos

Adapte a função criada anteriormente para rodar um outro modelo de classificação binário, como naive bayes ou K-Nearest Neighbors (explore a documentação dos frameworks para descobrir outras opções e saber mais). Com esse novo modelo, rode 500 vezes e compare os resultados com o do modelo logístico criado anteriormente.