LISTA DE EXERCÍCIOS

LISTA DE EXERCÍCIO 5 - VALIDAÇÃO CRUZADA

import seaborn as sns

# Carregar o conjunto de dados do Titanic
titanic_df = sns.load_dataset('titanic')

# Verificar dados faltantes em cada coluna
missing_data = titanic_df.isnull().sum()
print(missing_data)

# Excluir a coluna 'deck', dados faltantes e criar um sex numerico
titanic_df = titanic_df.drop(columns=['deck'])
titanic_df = titanic_df.dropna(subset=['age'])
titanic_df = titanic_df.dropna(subset=['embark_town'])
titanic_df = titanic_df.dropna(subset=['embarked'])
titanic_df['sex_numeric'] = titanic_df['sex'].map({'female': 0, 'male': 1})

#BANCO DE DADOS FINAL QUE VAMOS TRABALHAR
missing_data = titanic_df.isnull().sum()
print(missing_data)
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64
survived       0
pclass         0
sex            0
age            0
sibsp          0
parch          0
fare           0
embarked       0
class          0
who            0
adult_male     0
embark_town    0
alive          0
alone          0
sex_numeric    0
dtype: int64

Divisão em treino e teste: 1. Quantas observações tem no conjunto de dados? E quantos atributos? O conjunto de dados possui quantas classes? Ele é desbalanceado?

Na primeira pesquisa, para medir o balanceamento, eu achei essa resposta:

desbalanceado = contagem_classes.min() / contagem_classes.max() < 0.5 print(“Desbalanceado?”, desbalanceado)

num_observacoes = titanic_df.shape[0]
num_atributos = titanic_df.shape[1]
print("Número de observações:", num_observacoes)
print("Número de atributos:", num_atributos)

# Verificar se o conjunto de dados é desbalanceado (contagem de cada classe)
contagem_classes = titanic_df['survived'].value_counts()
print("Contagem de cada classe:")
print(contagem_classes)

# Verificar se é desbalanceado
desbalanceado = contagem_classes.min() / contagem_classes.max() < 0.5
print("Desbalanceado?", desbalanceado)
Número de observações: 712
Número de atributos: 15
Contagem de cada classe:
survived
0    424
1    288
Name: count, dtype: int64
Desbalanceado? False

2. Separe o conjunto de dados em treino e teste sem fixar o parâmetro random_state.

from sklearn.model_selection import train_test_split

# Selecionar características e alvo
X1 = titanic_df[['pclass', 'age', 'sex_numeric']]
y1 = titanic_df['survived']

# Dividir os dados em conjuntos de treinamento e teste SEM RANDOM STATE
X1_train, X1_test, y1_train, y1_test = train_test_split(X1, y1, test_size=0.2)

3. Crie um modelo de regressão logística utilizando a biblioteca do scikit-learn.

from sklearn.linear_model import LogisticRegression
import numpy as np

# Criar e treinar o modelo de regressão logística
model1 = LogisticRegression()
model1.fit(X1_train, y1_train)

# Coeficientes do modelo
coefficients1 = model1.coef_[0]
intercept1 = model1.intercept_

# Exibir os coeficientes e o intercept
print("Coeficientes:", coefficients1)
print("Intercept:", intercept1)
Coeficientes: [-1.13100529 -0.03070119 -2.43533978]
Intercept: [4.44520796]
# Calculando e exibindo Odds Ratios
odds_ratios1 = np.exp(coefficients1)
print("Odds Ratios:", odds_ratios1)
Odds Ratios: [0.32270868 0.9697653  0.08756799]

Assim, infere-se que para cada aumento de uma unidade de classe (de 1ª para 2ª, de 2ª para 3ª), as chances de sobreviêcnia são multiplicadas por 0.27, indicando uma forte diminuição na probabilidade de sobreviência.

No que tange a idade, este valor está muito próximo de 1, sugerindo que a idade tem um impacto menor.

Considerando que o sexo foi codificado como 0 para feminino e 1 para masculino, um odds ratio de 0.085 indica que ser masculino está associado a uma diminuição drástica nas chances de sobrevivência comparado a ser feminino.

4. Calcule as métricas de acurácia, f1-score, precisão e recall.

from sklearn.metrics import classification_report

# Previsões no conjunto de teste
y1_pred = model1.predict(X1_test)

# Gerar o relatório de classificação
report1 = classification_report(y1_test, y1_pred)
print("Relatório de Classificação:\n", report1)
Relatório de Classificação:
               precision    recall  f1-score   support

           0       0.79      0.88      0.83        83
           1       0.80      0.68      0.74        60

    accuracy                           0.80       143
   macro avg       0.80      0.78      0.79       143
weighted avg       0.80      0.80      0.79       143

Clique para expandir!

Aqui está o conteúdo escondido que será mostrado quando você clicar no título do painel!

  • Item 1
  • Item 2
  • Item 3