Golden SkyGolden SkyGuía Técnica

Referencia técnica · Paso 6a · Lift — significancia

Lift y significancia

La mitad "¿es real?" de la selección: cómo se mide la ventaja de una regla (lift, edge, z-score), cómo se testea contra el azar (p-value binomial), cómo se corrige por probar miles de hipótesis (FDR), y el filtro anti-espurio por información mutua.

§0Notación

pactiveP(TP | regla activa)
pglobalbaseline P(TP) — p0
nseñales de la regla
kaciertos (TP) bajo la regla
Nbarras con target válido
mtotaluniverso de reglas evaluadas
qnivel de FDR
MIinformación mutua regla–target

§1Lift, edge y z-score

Tres formas de la misma ventaja: relativa (lift), absoluta (edge), y estandarizada por el tamaño de muestra (z-score).

pactive = mean( target[ regla = 1 ] )  ·  pglobal = mean( target )
lift = pactivepglobal  ·  edge = pactive − pglobal
SE = pglobal(1 − pglobal)n  ·  z = edgeSE

lift = cuántas veces más concentra aciertos que la base (1.0 = igual al azar). edge = ventaja absoluta en puntos de probabilidad. z = edge medido en errores estándar → escala con √n: una ventaja fina sobre muchas señales puntúa más que una grande sobre pocas.

§2p-value binomial one-sided

Bajo la hipótesis nula de que la regla no aporta (su tasa de acierto es la base p0), ¿qué tan improbable es observar k aciertos en n señales?

H0: P(TP|regla) = p0 X ~ Binom( n, p0 )
alpha  (H1: P > p0):   p = P(X ≥ k) = sf(k − 1)
filter (H1: P < p0):   p = P(X ≤ k) = cdf(k)

Dos tests one-sided: uno busca reglas que aciertan más que la base (candidatas ALPHA), el otro reglas que aciertan menos (candidatas FILTER, para no operar). p0 se acota a [1e−9, 1−1e−9]; con n ≤ 0, p = 1.

§3FDR · Benjamini-Hochberg

Con miles de reglas testeadas, algunas pasan por azar. La corrección de tasa de falso descubrimiento ajusta el listón según cuántas hipótesis se probaron.

benjamini_hochberg ordenar   p(1) ≤ p(2) ≤ … ≤ p(m)
k* = max { k : p(k)kmtotal · q }
rechazar H0 (regla significativa)  ∀ i ≤ k*

mtotal = universo original de reglas evaluadas, no solo las sobrevivientes → mantiene el control real del FDR. El feature_type se decide solo por FDR (sin umbrales duros de lift): ALPHA = lift > 1 cuyo p-value alpha sobrevive BH; FILTER = lift < 1 cuyo p-value filter sobrevive.

§4Información mutua · filtro anti-espurio

Un lift alto sin dependencia estadística real es sospechoso. La información mutua mide esa dependencia, y un piso descarta la que es indistinguible del sesgo del estimador.

mi_asymptotic_floor MI = mutual_info_classif( regla ; target )  // sklearn, discreto
mi_floor = max( 0.7213N · 10 ,   1×10⁻⁴ )
rechazar si   lift > 1.10   ∧   MI < mi_floor

0.7213 / N es el sesgo esperado del estimador plug-in de MI bajo independencia (tabla 2×2, corrección de Miller-Madow). El multiplicador ×10 y el floor 1e−4 son empíricos. Opción más cara: piso por permutación (percentil 95 del MI nulo permutando el target).

Entropía binaria (usada como referencia de normalización del MI en 6b):

H(p) = − p·log₂ p − (1 − p)·log₂(1 − p)  // bits ∈ [0,1] ; H(0.5)=1

§5Filtro técnico previo

Antes de puntuar, se rechazan duro las reglas que no son evaluables o que delatan un bug — no entran al scoring estadístico.

RechazoCondición
insufficient_signalsn < min_signals (default 30)  ∨  n_evaluable < min_evaluable (default 20)
statistical_bug( p_active ≥ 0.98 ∨ ≤ 0.02 ) ∧ n > 20  // leakage probable
no_variance√( p_active·(1−p_active) ) < 0.03
poor_distribution0 señales en el primer O último 20% del dataset

El std_bernoulli = √(p·(1−p)) del no_variance es la dispersión de la señal (regla casi siempre igual), distinta del SE del edge de §1. min_signals (default 30) y min_evaluable (default 20) son parámetros de entrada; los demás umbrales (0.98/0.02, std 0.03, el 20% temporal) son constantes fijas — guardas contra leakage y degeneración, no ajustables. Un warning informativo adicional (no rechaza) marca concentración temporal fuerte cuando temporal_balance < warn_temporal_below (default 0.30).

Continúa en 6b: IC del Lift (Katz), breakeven económico (Kelly), criterio económico dual y composite score.

Fuentes:
· domain/lift_selector/stats.py — compute_rule_pvalue, benjamini_hochberg, entropy_binary, mi_asymptotic_floor, mi_permutation_floor
· domain/lift_selector/lift_scoring.py — lift, edge, z_score, MI (mutual_info_classif)
· domain/lift_selector/technical_filter.py — rechazos duros, umbrales