File size: 6,343 Bytes
63c4fc9 85a037f 5bc5923 63c4fc9 5bc5923 63c4fc9 5bc5923 fb89f24 5bc5923 63c4fc9 5bc5923 4d81db2 5bc5923 4d81db2 5bc5923 a209eb5 4d81db2 5bc5923 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
import pandas as pd
import numpy as np
import streamlit as st
import tensorflow as tf
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input, Embedding, Flatten, Concatenate, Dense, BatchNormalization, Dropout
from tensorflow.keras.models import Model
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LogisticRegression
# app.py
# Função de Preprocessamento
def preprocess_data(base_final):
# Convertendo indenização e tempo para numéricos
base_final['indenizacao_num'] = pd.to_numeric(base_final['indenizacao'], errors='coerce')
base_final['tempo_num'] = pd.to_numeric(base_final['tempo_meses'], errors='coerce')
# Identificar variáveis categóricas e numéricas
categorical_cols = ['classe', 'comarca', 'danos', 'resultado']
numerical_cols = base_final.select_dtypes(include=['float64', 'int64']).columns
# Imputação para variáveis categóricas
from sklearn.impute import SimpleImputer
imputer_cat = SimpleImputer(strategy='most_frequent')
base_final[categorical_cols] = imputer_cat.fit_transform(base_final[categorical_cols])
# Imputação para variáveis numéricas
imputer_num = SimpleImputer(strategy='mean')
base_final[numerical_cols] = imputer_num.fit_transform(base_final[numerical_cols])
# Criar dummies para todas as variáveis categóricas
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(drop='first', sparse_output=False)
dummies = pd.DataFrame(
encoder.fit_transform(base_final[categorical_cols]),
columns=encoder.get_feature_names_out(categorical_cols),
index=base_final.index
)
# Combinar variáveis contínuas com dummies
base_final_preprocessed = pd.concat([base_final, dummies], axis=1)
base_final_preprocessed.drop(columns=categorical_cols, inplace=True)
base_final_preprocessed = base_final_preprocessed.select_dtypes(include=[np.number])
return base_final_preprocessed
# Função de Modelagem para Indenização
def model_indenizacao(base_final_preprocessed):
X = base_final_preprocessed.drop(columns=['tempo_num', 'indenizacao_num'], errors='ignore')
y_indenizacao = base_final_preprocessed['indenizacao_num']
# Divisão entre treino e teste
X_train, X_test, y_train_indenizacao, y_test_indenizacao = train_test_split(X, y_indenizacao, test_size=0.3, random_state=42)
rf_model_indenizacao = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model_indenizacao.fit(X_train, y_train_indenizacao)
y_pred_indenizacao = rf_model_indenizacao.predict(X_test)
rmse_indenizacao = np.sqrt(mean_squared_error(y_test_indenizacao, y_pred_indenizacao))
return rf_model_indenizacao, rmse_indenizacao
# Função de Modelagem para Tempo
def model_tempo(base_final_preprocessed):
X = base_final_preprocessed.drop(columns=['tempo_num', 'indenizacao_num'], errors='ignore')
y_tempo = base_final_preprocessed['tempo_num']
# Divisão entre treino e teste
X_train, X_test, y_train_tempo, y_test_tempo = train_test_split(X, y_tempo, test_size=0.3, random_state=42)
rf_model_tempo = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model_tempo.fit(X_train, y_train_tempo)
y_pred_tempo = rf_model_tempo.predict(X_test)
rmse_tempo = np.sqrt(mean_squared_error(y_test_tempo, y_pred_tempo))
return rf_model_tempo, rmse_tempo
# Função de Classificação de Risco
def model_risco(base_final, X_test, rf_model_indenizacao, rf_model_tempo):
logistic_model = LogisticRegression(max_iter=500)
logistic_model.fit(X_test, (base_final['resultado'] == 'Procedente').astype(int))
y_pred_proba = logistic_model.predict_proba(X_test)[:, 1]
y_pred_indenizacao = logistic_model.predict(X_test)
provisionamento_esperado = (y_pred_indenizacao * y_pred_proba).sum()
# Classificação de Risco
X_test_df = base_final.loc[X_test.index].copy()
X_test_df['prob_perda'] = y_pred_proba
X_test_df['risco'] = np.select(
[X_test_df['prob_perda'] < 0.3,
(X_test_df['prob_perda'] >= 0.3) & (X_test_df['prob_perda'] < 0.7),
X_test_df['prob_perda'] >= 0.7],
['Remoto', 'Possível', 'Provável'],
default='Desconhecido'
)
return provisionamento_esperado, X_test_df
# Título do App
st.title("Sistema Jurídico - Modelagem de Indenização e Tempo de Processo")
# Upload de arquivo
uploaded_file = st.file_uploader("Faça o upload do arquivo Excel", type=["xlsx"])
if uploaded_file:
# Carregar os dados
base_final = pd.read_excel(uploaded_file)
st.subheader("Passo 1: Preprocessamento")
base_final_preprocessed = preprocess_data(base_final)
st.write("Dados preprocessados:", base_final_preprocessed.head(100))
st.subheader("Passo 2: Modelos Preditivos")
rf_model_indenizacao, rmse_indenizacao = model_indenizacao(base_final_preprocessed)
st.write(f"RMSE (Indenização): {rmse_indenizacao:.2f}")
rf_model_tempo, rmse_tempo = model_tempo(base_final_preprocessed)
st.write(f"RMSE (Tempo do Processo): {rmse_tempo:.2f}")
st.subheader("Passo 3: Provisionamento e Classificação de Risco")
provisionamento_esperado, X_test_df = model_risco(base_final, base_final_preprocessed, rf_model_indenizacao, rf_model_tempo)
st.write(f"Provisionamento esperado: R$ {provisionamento_esperado:.2f}")
st.write("Classificação de Risco:", X_test_df[['risco', 'indenizacao_num']].head(100))
# st.subheader("Passo 4: Classificação de Tempo do Processo")
# X_test_df['tempo_estimado'] = rf_model_tempo.predict(X_test_df)
# X_test_df['categoria_tempo'] = np.select(
# [X_test_df['tempo_estimado'] < 6,
# (X_test_df['tempo_estimado'] >= 6) & (X_test_df['tempo_estimado'] < 12),
# X_test_df['tempo_estimado'] >= 12],
# ['Curto', 'Moderado', 'Longo'],
# default='Desconhecido'
# )
# st.write("Classificação de Tempo:", X_test_df[['categoria_tempo', 'tempo_meses']].head(100))
# Gráficos opcionais
st.subheader("Distribuição de Previsões")
st.bar_chart(X_test_df['risco'].value_counts()) |