Skip to main content
PsicoScan asigna a cada tamizaje uno de 5 tipos de caso y un nivel de semáforo de 4 grados. La clasificación la realiza 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

NivelEtiqueta UIColor hexSignificado
VERDESin riesgo#22c55eSin indicadores de riesgo
AMARILLORevisión#eab308Cuestionario con sesgo o inconsistencias
ROJOPrioritario#ef4444Riesgo emocional detectado
ROJO_URGENTEURGENTE#7f1d1dRiesgo 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.
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.
if d.inc >= 1.2:
    return TamizajeOutput(
        tipo_caso="INCONSISTENCIA",
        semaforo="AMARILLO",
        observaciones="Cuestionario con inconsistencias. Solicitar repeticion.",
    )
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.
if d.pos >= 8:
    return TamizajeOutput(
        tipo_caso="IMPRESION_POSITIVA",
        semaforo="AMARILLO",
        observaciones="Sesgo de impresion positiva detectado. Revisar con psicologo.",
    )
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.
if d.neg >= 5 and d.glo_t >= 70:
    return TamizajeOutput(
        tipo_caso="IMPRESION_NEGATIVA",
        semaforo="ROJO",
        observaciones="Impresion negativa con indices elevados. Atencion prioritaria.",
    )
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.
es_urgente = (
    d.glo_t >= 65 and d.dep_t >= 80
    or d.items_criticos_count >= 15
)
ROJO_URGENTE requiere acción inmediata. El protocolo del centro debe contemplar contacto directo con el estudiante en el mismo día, notificación a padres o tutores y, si se confirma ideación suicida o crisis aguda, derivación a servicios de salud mental de urgencias.
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.
tiene_riesgo = (
    d.glo_t >= 60 or d.emo_t >= 65 or d.dep_t >= 70
    or d.items_criticos_count >= 10
)
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 casoSemáforoCriterio principalAcción recomendada
INCONSISTENCIAAMARILLOINC ≥ 1.2Repetir cuestionario
IMPRESION_POSITIVAAMARILLOPOS ≥ 8Revisión con psicólogo
IMPRESION_NEGATIVAROJONEG ≥ 5 y GLO_T ≥ 70Atención prioritaria
CON_RIESGOROJO_URGENTE(GLO_T ≥ 65 y DEP_T ≥ 80) o críticos ≥ 15Atención inmediata
CON_RIESGOROJOGLO_T ≥ 60 o EMO_T ≥ 65 o DEP_T ≥ 70 o críticos ≥ 10Cita con psicólogo ≤ 5 días
SIN_RIESGOVERDENinguna condición anteriorSeguimiento 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 suicida124, 141, 149, 76
Petición de ayuda directa92, 118, 145
Violencia familiar19, 80, 125
Acoso escolar / ciberbullying37, 96, 115, 147, 163
Estresores traumáticos71, 21, 86, 97
Alteraciones del pensamiento119, 164, 167, 90
Imagen corporal grave88, 130
El campo 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 archivo ml-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.
def predecir(self, datos: TamizajeInput) -> TamizajeOutput:
    if self.modelo:
        return self._predecir_ml(datos)
    return self._predecir_reglas(datos)
Si el campo 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.

Build docs developers (and LLMs) love