Utiliza Isolation Forest para detectar fraudes o registros estadísticamente sospechosos que escapan a los filtros tradicionales.
Use Isolation Forest to detect fraud or statistically suspicious records that escape traditional filters.
Este ejercicio es solo para aprendizaje y pruebas. No ejecutes modelos contra datos reales, sensibles, financieros, médicos, personales o ambientes de producción sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios, revisión humana y cumplimiento de los protocolos de ciberseguridad y privacidad de tu organización.
This exercise is for learning and testing only. Do not run models against real, sensitive, financial, medical, personal, or production data without authorization, backups, prior testing, least-privilege permissions, change control, human review, and compliance with your organization's cybersecurity and privacy protocols.
Crear un modelo sencillo de detección de anomalías usando Isolation Forest. La idea no es definir reglas manuales, sino dejar que el algoritmo identifique registros raros en función de variables numéricas como monto y frecuencia.
Create a simple anomaly detection model using Isolation Forest. The idea is not to define manual rules, but to let the algorithm identify unusual records based on numeric variables such as amount and frequency.
| ID | Monto | Frecuencia | Descripción |
|---|---|---|---|
| 1001 | 120 | 2 | Compra normal |
| 1002 | 95 | 1 | Compra normal |
| 1003 | 150 | 3 | Compra normal |
| 1004 | 1800 | 18 | Posible anomalía |
| 1005 | 110 | 2 | Compra normal |
| 1006 | 2500 | 1 | Posible anomalía |
from sklearn.ensemble import IsolationForest model = IsolationForest(contamination=0.01) # -1 = anomalía/anomaly, 1 = normal df['es_anomalia'] = model.fit_predict(df[['monto', 'frecuencia']])
# ==========================================================
# Python Advanced Topic 02
# Rule-Free Anomaly Detection with Isolation Forest
# ==========================================================
import pandas as pd
from sklearn.ensemble import IsolationForest
# 1. Create synthetic data
records = [
{"id": 1001, "monto": 120, "frecuencia": 2},
{"id": 1002, "monto": 95, "frecuencia": 1},
{"id": 1003, "monto": 150, "frecuencia": 3},
{"id": 1004, "monto": 1800, "frecuencia": 18},
{"id": 1005, "monto": 110, "frecuencia": 2},
{"id": 1006, "monto": 2500, "frecuencia": 1},
{"id": 1007, "monto": 130, "frecuencia": 2},
{"id": 1008, "monto": 105, "frecuencia": 1},
{"id": 1009, "monto": 160, "frecuencia": 3},
{"id": 1010, "monto": 145, "frecuencia": 2}
]
df = pd.DataFrame(records)
# 2. Select numeric columns for the model
features = df[["monto", "frecuencia"]]
# 3. Train Isolation Forest
# contamination estimates the expected percentage of anomalies
model = IsolationForest(contamination=0.20, random_state=42)
# 4. Predict anomalies
# 1 = normal record, -1 = anomaly
df["resultado_modelo"] = model.fit_predict(features)
# 5. Add readable label
df["clasificacion"] = df["resultado_modelo"].map({1: "Normal", -1: "Anomaly"})
# 6. Add anomaly score
# Lower scores are more suspicious
_df_scores = model.decision_function(features)
df["anomaly_score"] = _df_scores.round(4)
# 7. Export report
output_file = "anomaly_detection_report.csv"
df.to_csv(output_file, index=False)
# 8. Show suspicious records first
print(df.sort_values("anomaly_score"))
print(f"\nReport created: {output_file}")id monto frecuencia resultado_modelo clasificacion anomaly_score 5 1006 2500 1 -1 Anomaly -0.1264 3 1004 1800 18 -1 Anomaly -0.0937 8 1009 160 3 1 Normal 0.0125 2 1003 150 3 1 Normal 0.0198 9 1010 145 2 1 Normal 0.0441 6 1007 130 2 1 Normal 0.0512 0 1001 120 2 1 Normal 0.0584 4 1005 110 2 1 Normal 0.0617 7 1008 105 1 1 Normal 0.0669 1 1002 95 1 1 Normal 0.0721 Report created: anomaly_detection_report.csv
| ID | Monto | Frecuencia | Clasificación | Anomaly Score |
|---|---|---|---|---|
| 1006 | 2500 | 1 | Anomaly | -0.1264 |
| 1004 | 1800 | 18 | Anomaly | -0.0937 |
| 1001 | 120 | 2 | Normal | 0.0584 |
| 1002 | 95 | 1 | Normal | 0.0721 |
contamination según el contexto real.contamination based on the real context.Este patrón permite pasar de filtros rígidos a una evaluación estadística más flexible. Es útil cuando los registros sospechosos no siguen una regla simple, pero sí se comportan diferente al grupo principal.
This pattern moves from rigid filters to a more flexible statistical evaluation. It is useful when suspicious records do not follow a simple rule, but behave differently from the main group.