🎯 MÓDULO 6: \"Projeto Final: Construindo um Sistema de Detecção de Fraudes com Métricas Reais de Negócio\"\n\n### Objetivo:\nAplicar TUDO aprendido em um projeto integrador realista: desde o carregamento de dados brutos até um modelo avaliado com métricas de negócio, incluindo pré-processamento, codificação, dimensionamento, seleção de características e validação robusta.\n\n---\n\n### 6.1 Conjunto de Dados do Projeto: transacoes_fraude.csv\n\nCaracterísticas simuladas:\n- valor_transacao (float)\n- idade_cliente (int)\n- tipo_cartao (categórica: \"Visa\", \"Mastercard\", \"Amex\")\n- pais_origem (categórica)\n- hora_do_dia (int 0-23)\n- dias_desde_ultima_transacao (int)\n- eh_fraude (bool: 0 ou 1) → apenas 1.5% de fraudes!\n\n---\n\n### 6.2 Fase 1: Diagnóstico Inicial e Limpeza\n\npython\n# Carregar e explorar\ndf = pd.read_csv(\"transacoes_fraude.csv\")\nprint(df.info())\nprint(df.isnull().sum())\n\n# Imputar idade com mediana, tipo de cartão com moda\ndf['idade_cliente'].fillna(df['idade_cliente'].median(), inplace=True)\ndf['tipo_cartao'].fillna(df['tipo_cartao'].mode()[0], inplace=True)\n\n# Limitar valor da transação usando IQR\nQ1 = df['valor_transacao'].quantile(0.25)\nQ3 = df['valor_transacao'].quantile(0.75)\nIQR = Q3 - Q1\nlim_inf, lim_sup = Q1 - 1.5*IQR, Q3 + 1.5*IQR\ndf['valor_transacao'] = df['valor_transacao'].clip(lim_inf, lim_sup)\n\n\n---\n\n### 6.3 Fase 2: Codificação e Dimensionamento\n\npython\n# Codificação\nfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder\nfrom sklearn.compose import ColumnTransformer\n\n# Codificação de Rótulos para variáveis ordinais (nenhuma aqui, mas por precaução)\n# One-Hot para variáveis categóricas nominais\ncaracteristicas_categoricas = ['tipo_cartao', 'pais_origem']\ncaracteristicas_numericas = ['valor_transacao', 'idade_cliente', 'hora_do_dia', 'dias_desde_ultima_transacao']\n\npreprocessador = ColumnTransformer(\n transformers=[\n ('num', StandardScaler(), caracteristicas_numericas),\n ('cat', OneHotEncoder(drop='first', handle_unknown='ignore'), caracteristicas_categoricas)\n ])\n\nX = df.drop('eh_fraude', axis=1)\ny = df['eh_fraude']\n\nX_processado = preprocessador.fit_transform(X)\n\n\n---\n\n### 6.4 Fase 3: Seleção de Características e Treinamento\n\npython\nfrom sklearn.feature_selection import SelectKBest, f_classif\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.linear_model import LogisticRegression\n\n# Dividir dados\nX_train, X_test, y_train, y_test = train_test_split(X_processado, y, test_size=0.2, stratify=y, random_state=42)\n\n# Seleção de características\nseletor = SelectKBest(score_func=f_classif, k=10)\nX_train_selecionado = seletor.fit_transform(X_train, y_train)\nX_test_selecionado = seletor.transform(X_test)\n\n# Treinar modelo\nmodelo = LogisticRegression(penalty='l2', C=1.0, random_state=42)\nmodelo.fit(X_train_selecionado, y_train)\n\n\n---\n\n### 6.5 Fase 4: Avaliação Profunda com Métricas de Negócio\n\npython\nfrom sklearn.metrics import classification_report, roc_auc_score, confusion_matrix\nimport seaborn as sns\n\ny_pred = modelo.predict(X_test_selecionado)\ny_proba = modelo.predict_proba(X_test_selecionado)[:,1]\n\nprint(\"=== RELATÓRIO DE CLASSIFICAÇÃO ===\")\nprint(classification_report(y_test, y_pred, target_names=['Legítimo', 'Fraude']))\n\nprint(f\"\\nAUC-ROC: {roc_auc_score(y_test, y_proba):.4f}\")\n\n# Matriz de confusão\ncm = confusion_matrix(y_test, y_pred)\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues',\n xticklabels=['Legítimo', 'Fraude'],\n yticklabels=['Legítimo', 'Fraude'])\nplt.title(\"Matriz de Confusão - Detecção de Fraudes\")\nplt.ylabel(\"Real\")\nplt.xlabel(\"Previsto\")\nplt.show()\n\n# Validação cruzada para confiança\npontuacoes_cv = cross_val_score(modelo, X_train_selecionado, y_train, cv=StratifiedKFold(5), scoring='roc_auc')\nprint(f\"\\nValidação Cruzada AUC-ROC: {pontuacoes_cv.mean():.4f} (+/- {pontuacoes_cv.std()*2:.4f})\")\n\n\n---\n\n### 6.6 Fase 5: Ajuste de Limiar para Maximizar Revocação\n\npython\nfrom sklearn.metrics import precision_recall_curve\n\n# Encontrar limiar que maximiza F1 ou revocação\nprecisao, revocacao, limites = precision_recall_curve(y_test, y_proba)\n\n# Calcular F1 para cada limiar\npontuacoes_f1 = 2 * (precisao * revocacao) / (precisao + revocacao)\nmelhor_limiar = limites[np.argmax(pontuacoes_f1)]\n\nprint(f\"Melhor limiar para F1: {melhor_limiar:.3f}\")\n\n# Prever com novo limiar\ny_pred_novo = (y_proba >= melhor_limiar).astype(int)\n\nprint(\"\\n=== COM LIMIAR AJUSTADO ===\")\nprint(classification_report(y_test, y_pred_novo, target_names=['Legítimo', 'Fraude']))\n\n\n---\n\n### 📝 Entregáveis do Projeto:\n\n1. Jupyter Notebook com todas as fases documentadas.\n2. Gráficos: distribuição inicial, matriz de confusão, curva ROC, curva Precisão-Revocação.\n3. Tabela de comparação: métricas no limiar 0.5 vs. limiar ótimo.\n4. Conclusão escrita: Quão bom é o modelo? Qual métrica você priorizaria em produção e por quê? O que melhoraria na próxima iteração?\n\n---\n\n### 💡 Notas Finais do Curso:\n\n✅ Pré-processamento não é um mal necessário—é seu superpoder. \n✅ Nunca confie na acurácia em problemas desbalanceados. Use AUC-ROC, Revocação, F1. \n✅ Validação cruzada estratificada é sua aliada para construir modelos robustos. \n✅ Documente cada passo. Seu eu futuro (e sua equipe) agradecerão. \n✅ Em produção, monitore não apenas a acurácia, mas a distribuição dos seus dados. Ela pode mudar com o tempo!

Course Info

Course: AI-course1

Language: PT

Lesson: Module6