ClasificadorML en ml-api/services/clasificador.py: primero intenta usar el modelo Random Forest entrenado (modelo.pkl); si no existe, aplica reglas heurísticas sobre los índices T del SENA.
Semáforo de riesgo
| Nivel | Etiqueta UI | Color hex | Significado |
|---|---|---|---|
VERDE | Sin riesgo | #22c55e | Sin indicadores de riesgo |
AMARILLO | Revisión | #eab308 | Cuestionario con sesgo o inconsistencias |
ROJO | Prioritario | #ef4444 | Riesgo emocional detectado |
ROJO_URGENTE | URGENTE | #7f1d1d | Riesgo emocional alto confirmado |
Los 5 tipos de caso
Las reglas se evalúan en este orden exacto dentro de_predecir_reglas(). La primera condición que se cumpla determina el resultado; las siguientes no se evalúan.
INCONSISTENCIA — AMARILLO
INCONSISTENCIA — AMARILLO
Criterio:
INC >= 1.2La escala INC mide la coherencia interna del cuestionario sumando las diferencias absolutas entre 10 pares de ítems semánticamente similares. Un valor ≥ 1.2 indica respuestas azarosas o una comprensión deficiente.Acción recomendada: Solicitar al estudiante que repita el cuestionario en condiciones más adecuadas.IMPRESION_POSITIVA — AMARILLO
IMPRESION_POSITIVA — AMARILLO
Criterio:
POS >= 8La escala POS detecta a estudiantes que responden de forma excepcionalmente positiva a ítems de ajuste ideal. Una puntuación ≥ 8 sugiere minimización de problemas o deseabilidad social elevada.Acción recomendada: Revisar el caso con el psicólogo; el perfil real puede diferir del reportado.IMPRESION_NEGATIVA — ROJO
IMPRESION_NEGATIVA — ROJO
Criterio:
NEG >= 5 AND GLO_T >= 70La escala NEG contiene ítems de contenido extremo-patológico raramente endosados. Si se activa junto con un índice global muy elevado (T ≥ 70), la combinación indica exageración de síntomas con un perfil clínico genuinamente alto.Acción recomendada: Atención prioritaria; evaluar si la exageración es un pedido de ayuda encubierto.CON_RIESGO (ROJO_URGENTE)
CON_RIESGO (ROJO_URGENTE)
Criterio:
(GLO_T >= 65 AND DEP_T >= 80) OR items_criticos_count >= 15Se activa cuando converge riesgo global muy alto con depresión severa, o cuando hay una cantidad crítica de ítems de alerta activos. Es el nivel más grave del sistema.CON_RIESGO (ROJO)
CON_RIESGO (ROJO)
Criterio:
GLO_T >= 60 OR EMO_T >= 65 OR DEP_T >= 70 OR items_criticos_count >= 10Riesgo emocional detectado sin alcanzar el umbral de urgencia. Puede cumplirse por cualquiera de las cuatro condiciones.Acción recomendada: Programar cita con el psicólogo en un plazo máximo de 5 días hábiles.SIN_RIESGO — VERDE
SIN_RIESGO — VERDE
Criterio: Ninguna de las condiciones anteriores se cumplió.Los índices globales están dentro del rango normal y no hay ítems críticos activos en número significativo.Acción recomendada: Seguimiento periódico normal según el calendario del centro.
Tabla resumen de clasificación
| Tipo de caso | Semáforo | Criterio principal | Acción recomendada |
|---|---|---|---|
INCONSISTENCIA | AMARILLO | INC ≥ 1.2 | Repetir cuestionario |
IMPRESION_POSITIVA | AMARILLO | POS ≥ 8 | Revisión con psicólogo |
IMPRESION_NEGATIVA | ROJO | NEG ≥ 5 y GLO_T ≥ 70 | Atención prioritaria |
CON_RIESGO | ROJO_URGENTE | (GLO_T ≥ 65 y DEP_T ≥ 80) o críticos ≥ 15 | Atención inmediata |
CON_RIESGO | ROJO | GLO_T ≥ 60 o EMO_T ≥ 65 o DEP_T ≥ 70 o críticos ≥ 10 | Cita con psicólogo ≤ 5 días |
SIN_RIESGO | VERDE | Ninguna condición anterior | Seguimiento periódico |
Ítems críticos
El sistema mantiene un conjunto fijo de 25 ítems (_CRITICOS en clasificador.py) cuyas respuestas indican riesgo grave independientemente del nivel global del tamizaje. Un ítem se considera activo cuando la respuesta es ≥ 3 (“Algunas veces”).
| Categoría | Ítems |
|---|---|
| Riesgo de autolesión / ideación suicida | 124, 141, 149, 76 |
| Petición de ayuda directa | 92, 118, 145 |
| Violencia familiar | 19, 80, 125 |
| Acoso escolar / ciberbullying | 37, 96, 115, 147, 163 |
| Estresores traumáticos | 71, 21, 86, 97 |
| Alteraciones del pensamiento | 119, 164, 167, 90 |
| Imagen corporal grave | 88, 130 |
items_criticos_count del TamizajeInput contiene el recuento de ítems activos y es uno de los inputs directos de las reglas de clasificación.
Sobreescritura por el modelo ML
Cuando existe el archivoml-api/models/modelo.pkl, el método predecir() llama a _predecir_ml() en lugar de _predecir_reglas(). El modelo Random Forest recibe el vector de 25 features calculado directamente desde la cadena de 188 respuestas brutas y predice la clase del semáforo.
respuestas (cadena de 188 dígitos) no está presente en la petición, _predecir_ml() cae automáticamente al motor de reglas como respaldo.
La versión del clasificador se expone en
GET /api/v1/modelo/info. El valor "0.1.0-reglas" indica que se están usando las reglas heurísticas; "1.0.0-ml" indica que el modelo entrenado está activo.