Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.preprocessing import StandardScaler, LabelEncoder | |
| from sklearn.neural_network import MLPClassifier | |
| from sklearn.metrics import classification_report, accuracy_score, confusion_matrix | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| import joblib | |
| # Carregar o dataset unificado | |
| csv_path = "./unified_dataset.csv" # Caminho relativo a partir da pasta src | |
| try: | |
| df = pd.read_csv(csv_path) | |
| print("Dataset carregado com sucesso!") | |
| except Exception as e: | |
| print(f"Erro ao carregar o dataset: {e}") | |
| exit() | |
| # Verificar o dataset | |
| print(df.head()) | |
| print(f"Tamanho do dataset: {df.shape}") | |
| # Separar features (X) e labels (y) | |
| X = df.drop(columns=["label"]) # Todas as colunas exceto 'label' | |
| y = df["label"] # Coluna 'label' | |
| # Codificar as labels (transformar strings em números) | |
| label_encoder = LabelEncoder() | |
| y = label_encoder.fit_transform(y) | |
| # Dividir o dataset em treino e teste | |
| X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) | |
| # Normalizar as features (importante para MLP) | |
| scaler = StandardScaler() | |
| X_train = scaler.fit_transform(X_train) | |
| X_test = scaler.transform(X_test) | |
| # Criar e treinar a MLP | |
| mlp = MLPClassifier( | |
| hidden_layer_sizes=(128, 64), # Duas camadas ocultas com 128 e 64 neurônios | |
| activation="relu", # Função de ativação ReLU | |
| solver="adam", # Otimizador Adam | |
| max_iter=500, # Número máximo de iterações | |
| random_state=42, | |
| verbose=True # Mostrar progresso durante o treinamento | |
| ) | |
| print("Treinando a MLP...") | |
| mlp.fit(X_train, y_train) | |
| # Fazer previsões no conjunto de teste | |
| y_pred = mlp.predict(X_test) | |
| # Avaliar o modelo | |
| print("\nRelatório de classificação:") | |
| print(classification_report(y_test, y_pred, target_names=label_encoder.classes_)) | |
| print(f"Acurácia: {accuracy_score(y_test, y_pred):.4f}") | |
| # Gerar a matriz de confusão | |
| conf_matrix = confusion_matrix(y_test, y_pred) | |
| # Plotar a matriz de confusão | |
| plt.figure(figsize=(10, 7)) | |
| sns.heatmap(conf_matrix, annot=True, fmt="d", cmap="Blues", | |
| xticklabels=label_encoder.classes_, | |
| yticklabels=label_encoder.classes_) | |
| plt.xlabel("Predito") | |
| plt.ylabel("Verdadeiro") | |
| plt.title("Matriz de Confusão") | |
| plt.show() | |
| # Extrair valores relevantes da matriz de confusão | |
| print("\nValores relevantes da matriz de confusão:") | |
| # Acurácia por classe | |
| class_accuracy = conf_matrix.diagonal() / conf_matrix.sum(axis=1) | |
| for i, accuracy in enumerate(class_accuracy): | |
| print(f"Acurácia da classe {label_encoder.classes_[i]}: {accuracy:.4f}") | |
| # Erros mais comuns (maiores valores fora da diagonal) | |
| conf_matrix_df = pd.DataFrame(conf_matrix, index=label_encoder.classes_, columns=label_encoder.classes_) | |
| conf_matrix_df.values[np.diag_indices_from(conf_matrix_df)] = 0 # Zerar a diagonal para focar nos erros | |
| most_common_errors = conf_matrix_df.stack().sort_values(ascending=False).head(5) | |
| print("\nErros mais comuns:") | |
| print(most_common_errors) | |
| # Salvar o modelo | |
| model_filename = "mlp_classifier.joblib" | |
| joblib.dump(mlp, model_filename) | |
| print(f"Modelo salvo como {model_filename}") | |
| # Salvar o LabelEncoder (para decodificar as previsões) | |
| label_encoder_filename = "label_encoder.joblib" | |
| joblib.dump(label_encoder, label_encoder_filename) | |
| print(f"LabelEncoder salvo como {label_encoder_filename}") |