File size: 1,312 Bytes
b51df68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import LabelEncoder
import joblib

# ARQUIVOS
CSV_NORMAL = "resultados_carga_normal.csv"
CSV_ANORMAL = "resultados_carga_anomala.csv"
OUTPUT_MODEL = "modelo_anomalia.pkl"


def preprocess(df):
    # Converte success TRUE/FALSE para 1/0 se necessário
    if df["success"].dtype == object:
        df["success"] = df["success"].map(lambda x: 1 if str(x).lower() == "true" else 0)

    # Apenas colunas importantes
    return df[["elapsed", "success"]]


def train_baseline():
    print("🔵 Treinando baseline com resultados normais...")

    df = pd.read_csv(CSV_NORMAL)
    X = preprocess(df)

    model = IsolationForest(contamination=0.05, random_state=42)
    model.fit(X)

    joblib.dump(model, OUTPUT_MODEL)
    print("✅ Modelo salvo como", OUTPUT_MODEL)


def validate_anomalies():
    print("🔴 Validando com dados anômalos...")

    df = pd.read_csv(CSV_ANORMAL)
    X = preprocess(df)

    model = joblib.load(OUTPUT_MODEL)

    preds = model.predict(X)

    percent_anom = (preds == -1).mean() * 100

    print(f"🚨 Percentual de anomalias detectadas: {percent_anom:.2f}%")


if __name__ == "__main__":
    train_baseline()
    validate_anomalies()