<jupyter_start><jupyter_text>**KAGGLE: 0.77511**  **Módulos**<jupyter_code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix<jupyter_output><empty_output><jupyter_text>**Datasets**<jupyter_code>treino_orig = pd.read_csv('./datasets/train.csv')
holdout_orig = pd.read_csv('./datasets/test.csv')

treino = treino_orig.copy()
holdout = holdout_orig.copy()<jupyter_output><empty_output><jupyter_text>**Filtragem das features**<jupyter_code>treino.head()
na = pd.DataFrame()
na['treino'] = (treino.isna().sum() / len(treino.index) * 100)
na['holdout'] = (holdout.isna().sum() / len(holdout.index) * 100)
na.sort_values(['treino','holdout'] ,ascending=False)
treino.drop(['Cabin','PassengerId','Name','Ticket','Fare'], axis=1, inplace=True)
holdout.drop(['Cabin','PassengerId','Name','Ticket','Fare'], axis=1, inplace=True)<jupyter_output><empty_output><jupyter_text>**Categorização da idade**<jupyter_code>treino['Age'] = treino['Age'].fillna(-1)
holdout['Age'] = holdout['Age'].fillna(-1)

maximo = int(max(treino['Age'].max(), holdout['Age'].max()))
passo = 2
faixas = list(np.arange(-2, maximo+1+passo, passo))

faixas_etarias = faixas[:-1]
faixas_limites = faixas

treino['faixa_etaria'] = pd.cut(treino['Age'], faixas_limites, labels=faixas_etarias)
holdout['faixa_etaria'] = pd.cut(holdout['Age'], faixas_limites, labels=faixas_etarias)

pvt = treino.pivot_table(index='faixa_etaria', values='Survived')
pvt.plot.bar(figsize=(15,5));
faixas_etarias = ['Faltante','Criança','Intermediário','Idoso']
faixas_limites = [-2,0,6,75,100]

treino['faixa_etaria'] = pd.cut(treino['Age'], faixas_limites, labels=faixas_etarias)
holdout['faixa_etaria'] = pd.cut(holdout['Age'], faixas_limites, labels=faixas_etarias)

pvt = treino.pivot_table(index='faixa_etaria', values='Survived')
pvt.plot.bar(figsize=(10,5));
treino.drop(['Age'], axis=1, inplace=True)
holdout.drop(['Age'], axis=1, inplace=True)<jupyter_output><empty_output><jupyter_text>**Grupo de pessoas / Famílias**<jupyter_code>treino['Grupo'] = treino['SibSp'] + treino['Parch']
holdout['Grupo'] = holdout['SibSp'] + holdout['Parch']

treino.pivot_table(index='Grupo', values='Survived').plot.bar();
treino['Grupo'] = pd.cut(treino['Grupo'], [-1,0,3,20], labels=['sozinho','pequeno','grande'])
holdout['Grupo'] = pd.cut(holdout['Grupo'], [-1,0,3,20], labels=['sozinho','pequeno','grande'])

treino.pivot_table(index='Grupo', values='Survived').plot.bar();
treino.drop(['SibSp','Parch'], axis=1, inplace=True)
holdout.drop(['SibSp','Parch'], axis=1, inplace=True)<jupyter_output><empty_output><jupyter_text>**Tratamento de "Missing Values"**<jupyter_code>na = pd.DataFrame()
na['treino'] = (treino.isna().sum() / len(treino.index) * 100)
na['holdout'] = (holdout.isna().sum() / len(holdout.index) * 100)
na['tipo'] = treino.dtypes
na.sort_values(['treino','holdout'] ,ascending=False)
#holdout['Fare'].fillna(holdout['Fare'].mean(), inplace=True)

treino['Embarked'].fillna(treino['Embarked'].value_counts().index[0], inplace=True)
na['treino'] = (treino.isna().sum() / len(treino.index) * 100)
na['holdout'] = (holdout.isna().sum() / len(holdout.index) * 100)
na['tipo'] = treino.dtypes
na.sort_values(['treino','holdout'] ,ascending=False)<jupyter_output><empty_output><jupyter_text>**Tratamento de features categóricas**<jupyter_code>treino.head()
treino = pd.get_dummies(treino)
holdout = pd.get_dummies(holdout)
treino.head()<jupyter_output><empty_output><jupyter_text>**Split do dataset**<jupyter_code># Separa "features"(X) e "target"(y)
feat = treino.drop('Survived', axis=1)
targ = treino['Survived']

# Faz o split
X_treino, X_teste, y_treino, y_teste = train_test_split(feat, targ, test_size=0.2, random_state=0)

print('Treino:', X_treino.shape, y_treino.shape)
print('Teste:', X_teste.shape, y_teste.shape)
print('Holdout:', holdout.shape)<jupyter_output>Treino: (712, 13) (712,)
Teste: (179, 13) (179,)
Holdout: (418, 13)<jupyter_text>**Definindo o modelo, treinando e avaliando o resultado**<jupyter_code>modelo = DecisionTreeClassifier(max_depth=3, random_state=0)
modelo.fit(X_treino, y_treino)

feat_imp = pd.DataFrame(list(zip(X_treino, modelo.feature_importances_)))
feat_imp.columns = ['Feature','Importance']
feat_imp.set_index('Feature', inplace=True)
feat_imp.sort_values('Importance', ascending=False)<jupyter_output><empty_output><jupyter_text>**Predição com o dataset de teste**<jupyter_code>pred_teste = modelo.predict(X_teste)
print(pred_teste.shape)
pred_teste
print('Falecidos:',y_teste.value_counts()[0])
print('Sobreviventes:',y_teste.value_counts()[1])
conf_mat = confusion_matrix(y_teste, pred_teste)
print('O modelo previu:')
print(f'* {conf_mat[0][0]} falecidos corretamente')
print(f'* {conf_mat[1][1]} sobreviventes corretamente')
print(f'* {conf_mat[0][1]} falecidos como sobreviventes')
print(f'* {conf_mat[1][0]} sobreviventes como falecidos')
print(classification_report(y_teste, pred_teste, digits=4, target_names=['Falecidos', 'Sobreviventes']))<jupyter_output>precision    recall  f1-score   support

    Falecidos     0.8435    0.8818    0.8622       110
Sobreviventes     0.7969    0.7391    0.7669        69

     accuracy                         0.8268       179
    macro avg     0.8202    0.8105    0.8146       179
 weighted avg     0.8255    0.8268    0.8255       179<jupyter_text>**Predição com o dataset de holdout**<jupyter_code>pred_holdout = modelo.predict(holdout)
print(pred_holdout.shape)
pred_holdout<jupyter_output>(418,)<jupyter_text>**Resultado para submissão**<jupyter_code>resultado = pd.DataFrame({'PassengerId': holdout_orig['PassengerId'], 'Survived': pred_holdout})
resultado.set_index('PassengerId', inplace=True)
resultado.head()
t = datetime.now().strftime('%Y%m%d_%H%M')
resultado.to_csv(f'./submissions/titanic_v0.4_{t}.csv')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.18221042150680386, 'fraction_numerical': 0.030534351145038167, 'mean_word_length': 8.14567526555387, 'pattern_counts': {'":': 0, '<': 46, '<?xml version=': 0, '>': 46, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '217733', 'license': 'MIT', 'n_tokens_mistral': 2536, 'n_tokens_neox': 2404, 'n_words': 327, 'path': 'Titanic/Titanic_v0.4.ipynb', 'repo_name': 'RolandJunior/Kaggle', 'size': '6026'}