jesuszambrano13's picture
Upload 158 files
84ec0e0 verified
Raw
History Blame Contribute Delete
2.14 kB
"""Explicabilidad b谩sica del modelo, basada en reglas.
Para explicabilidad profunda (SHAP) ver ``notebooks/03_model_explainability.ipynb``.
"""
from __future__ import annotations
from typing import Any, Dict, List
from .features import safe_float
def simple_explanation(features: Dict[str, Any], prediction: Dict[str, Any]) -> Dict[str, Any]:
"""Explicaci贸n local basada en variables principales del feature row."""
positive: List[str] = []
negative: List[str] = []
if safe_float(features.get("text_power_score", 0)) >= 0.5:
positive.append("Alta potencia textual: presencia de CTA, beneficio, urgencia o confianza.")
else:
negative.append("Potencia textual limitada; el mensaje puede requerir mayor claridad persuasiva.")
if safe_float(features.get("engagement_rate", 0)) >= 0.05:
positive.append("Engagement relativo favorable frente a las visualizaciones disponibles.")
elif safe_float(features.get("views", 0)) > 0:
negative.append("Engagement relativo bajo frente a las visualizaciones disponibles.")
if safe_float(features.get("duration_fit_score", 0)) >= 0.8:
positive.append("Duraci贸n compatible con formatos publicitarios cortos o de alta retenci贸n.")
else:
negative.append("Duraci贸n extensa o poco ajustada para una pauta inicial eficiente.")
if safe_float(features.get("ocr_frame_coverage", 0)) > 0:
positive.append("Texto visible detectado por OCR sobre los frames analizados.")
if features.get("visual_text_density") == "alta":
negative.append("Densidad alta de texto visual: puede saturar la atenci贸n del usuario.")
if features.get("transcript_text"):
positive.append("Se aprovech贸 la transcripci贸n del audio para reforzar el an谩lisis textual.")
return {
"explicacion_local": {
"factores_favorables": positive,
"factores_de_riesgo": negative,
"resumen": (
f"La predicci贸n fue clasificada como {prediction.get('level')} "
f"con probabilidad {prediction.get('probability')}."
),
}
}