Mapa da aula
Aula 07 publicada. Mapa, exemplo, EX019.
flowchart TD
N0["7.1 Taxas e intervalos de Wilson"]
N1["7.2 Taxas de base e precisão"]
N2["7.3 Classificando defesas"]
N3["7.3b Comunicando incerteza a quem não é estatístico"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX019"]
Desenho lógico
flowchart LR
N0["7.1 Taxas e intervalos de Wilson"]
N1["7.2 Taxas de base e precisão"]
N2["7.3 Classificando defesas"]
N3["7.3b Comunicando incerteza a quem não é estatístico"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX019"]
[7.1 Taxas e intervalos de Wilson]
|
v
[7.2 Taxas de base e precisão]
|
v
[7.3 Classificando defesas]
|
v
[7.3b Comunicando incerteza a quem não é estatístico]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX019]
Objetivos de aprendizagem
Você vai (1) relatar uma taxa com um intervalo, não como uma porcentagem solta; (2) aplicar a regra de Bayes à precisão de alarmes; (3) recusar uma classificação que a amostra não sustenta.
7.1 Taxas e intervalos de Wilson
Três sucessos em vinte tentativas são 15%. Um intervalo de Wilson de 95% para isso vai de cerca de 5% a 36%. Você pode dizer que a taxa provavelmente não é zero e provavelmente fica abaixo de 40%; não pode dizer que ela é melhor que uma defesa que marcou 20/100 (20%). Um n maior estreita o intervalo: 300/2.000 continua sendo 15%, mas fica entre cerca de 13,5% e 16,6%. Albrecht e Jensen alertam contra pontuações únicas vazias; um intervalo é a honestidade mais barata.
"""Lab S: reporting attack-success rates honestly: Wilson intervals,
seed variation and a paired bootstrap. Synthetic trial outcomes only."""
import math, random
def wilson(k, n, z=1.96):
p = k/n; d = 1 + z*z/n
c = (p + z*z/(2*n))/d; h = z*math.sqrt(p*(1-p)/n + z*z/(4*n*n))/d
return c - h, c + h
for k, n in ((3, 20), (30, 200), (300, 2000)):
lo, hi = wilson(k, n); print(f"successes={k}/{n} rate={k/n:.3f} wilson95=[{lo:.3f}, {hi:.3f}]")
# five seeds of a synthetic defence evaluation: per-seed attack success rate
rates = []
for seed in range(5):
r = random.Random(seed); rates.append(sum(r.random() < 0.12 for _ in range(200))/200)
m = sum(rates)/5; sd = math.sqrt(sum((x-m)**2 for x in rates)/4)
print("per-seed rates:", " ".join(f"{x:.3f}" for x in rates), f"mean={m:.3f} sd={sd:.3f}")
# paired bootstrap: baseline vs defence on the same 300 synthetic prompts
r = random.Random(42)
base = [r.random() < 0.30 for _ in range(300)]
defn = [b and r.random() < 0.6 for b in base] # defence blocks ~40% of successes
diffs = []
for _ in range(2000):
idx = [r.randrange(300) for _ in range(300)]
diffs.append(sum(base[i] for i in idx)/300 - sum(defn[i] for i in idx)/300)
diffs.sort()
print(f"baseline_asr={sum(base)/300:.3f} defended_asr={sum(defn)/300:.3f} "
f"reduction_ci95=[{diffs[50]:.3f}, {diffs[1949]:.3f}]")
Saída esperada:
successes=3/20 rate=0.150 wilson95=[0.052, 0.360]
successes=30/200 rate=0.150 wilson95=[0.107, 0.206]
successes=300/2000 rate=0.150 wilson95=[0.135, 0.166]
per-seed rates: 0.110 0.130 0.135 0.105 0.145 mean=0.125 sd=0.017
baseline_asr=0.350 defended_asr=0.190 reduction_ci95=[0.120, 0.203]
Os mesmos quinze por cento significam coisas muito diferentes com n igual a vinte e com n igual a dois mil. Um intervalo torna isso visível sem uma aula de estatística. Sam relata o intervalo ao lado de cada taxa de sucesso de ataque, para que nenhuma defesa seja coroada com base numa amostra minúscula. A variação de sementes e o bootstrap pareado do laboratório oferecem mais duas verificações: estabilidade entre sementes e uma diferença que pode incluir zero.
7.2 Taxas de base e precisão
Um detector com 95% de taxa de verdadeiros positivos e 5% de taxa de falsos positivos parece excelente até que a taxa de base da classe ruim seja 0,1%. Então quase todo alerta é um falso positivo (precisão ≈ 1,9%). Regra de Bayes: precisão = TPR·π / (TPR·π + FPR·(1−π)). O PulseMap precisa mostrar a precisão na taxa de base do cliente, não só a TPR.
"""Lab B: base rates and alarm precision (Bayes' rule).
A detector for malicious prompts with given true- and false-positive rates
is applied to traffic with different shares of malicious prompts."""
for tpr, fpr in ((0.95, 0.05), (0.95, 0.01), (0.80, 0.001)):
for prev in (0.10, 0.01, 0.001):
tp = tpr * prev; fp = fpr * (1 - prev)
prec = tp / (tp + fp)
per_10k = round(10000 * (tp + fp))
print(f"tpr={tpr:.2f} fpr={fpr:.3f} prevalence={prev:.3f} precision={prec:.3f} alerts_per_10k={per_10k}")
Saída esperada:
tpr=0.95 fpr=0.050 prevalence=0.100 precision=0.679 alerts_per_10k=1400
tpr=0.95 fpr=0.050 prevalence=0.010 precision=0.161 alerts_per_10k=590
tpr=0.95 fpr=0.050 prevalence=0.001 precision=0.019 alerts_per_10k=509
tpr=0.95 fpr=0.010 prevalence=0.100 precision=0.913 alerts_per_10k=1040
tpr=0.95 fpr=0.010 prevalence=0.010 precision=0.490 alerts_per_10k=194
tpr=0.95 fpr=0.010 prevalence=0.001 precision=0.087 alerts_per_10k=109
tpr=0.80 fpr=0.001 prevalence=0.100 precision=0.989 alerts_per_10k=809
tpr=0.80 fpr=0.001 prevalence=0.010 precision=0.890 alerts_per_10k=90
tpr=0.80 fpr=0.001 prevalence=0.001 precision=0.445 alerts_per_10k=18
A precisão despenca quando a classe ruim é rara, que é exatamente o cenário do PulseMap. Um painel que mostra só a taxa de verdadeiros positivos parecerá excelente enquanto inunda os analistas de alarmes falsos. Calcular a precisão na prevalência medida do cliente, como faz a tabela do laboratório, é o que Sam coloca no relatório. Se a prevalência é desconhecida, ele mostra uma pequena tabela com uma faixa de valores em vez de escolher um número lisonjeiro.
7.3 Classificando defesas
Duas defesas com intervalos sobrepostos não são classificadas. Prefira um desenho pareado, com os mesmos prompts, e um bootstrap da diferença, como mostra o laboratório. Se o intervalo da diferença incluir zero, relate "nenhuma diferença significativa nesta amostra", não um vencedor.
Caso sintético — Riverstone Transit. Um fornecedor afirmou que "nosso filtro é 99% eficaz". Sam pediu a taxa de base e o tamanho da amostra; nenhum dos dois estava no folheto. O piloto usou 200 prompts sintéticos com 1% de ataques e mediu precisão ≈ 16%.
7.4 Erros e limites
A independência das tentativas falha quando os prompts compartilham um modelo de texto. Os intervalos pressupõem um processo fixo; trocar o modelo no meio do teste os invalida. Nunca invente um valor-p para uma tabela que você não testou. Modelos de texto compartilhados tornam as tentativas dependentes, então intervalos que pressupõem independência ficam estreitos demais. Trocar o modelo no meio do teste mistura dois processos e invalida a amostra. Sam nunca anexa uma alegação de significância a uma tabela que não foi testada para isso, e reinicia a amostra quando a defesa sob teste muda.
7.3b Comunicando incerteza a quem não é estatístico
Uma taxa de detecção de 7 em 10 e uma de 700 em 1.000 imprimem a mesma porcentagem, mas merecem confianças muito diferentes. Quando Sam relata a cobertura do PulseMap ao gestor de segurança da Riverstone Transit, ele informa a contagem, o intervalo e uma frase simples: "vimos sete de dez eventos de teste; a taxa real poderia plausivelmente estar em qualquer ponto entre cerca de 40% e 90%". Os gestores então pedem mais tentativas, em vez de tratar uma amostra pequena como um fato, e a classificação das defesas espera até que os intervalos deixem de se sobrepor.
Exercícios
- EX019 — Intervalo. Diga o que você pode afirmar a partir de 8/40 sucessos com 95%. Rubrica: 3 = Wilson ≈ 10,5%–34,5% (ou Clopper–Pearson), não é possível classificar contra 25%; 2 = só o intervalo; 1 = estimativa pontual; 0 = errado.
- EX020 — Precisão. Detector com TPR 0,9, FPR 0,02, π = 0,005. Qual a precisão? Rubrica: 3 ≈ 0,184 com o raciocínio; 2 = um deslize; 1 = fórmula; 0 = nada.
- EX021 — Recusa de classificação. Dois filtros marcam 12/100 e 18/100. Escreva a frase que recusa uma classificação. Rubrica: 3 = cita incerteza sobreposta / necessidade de desenho pareado; 2 = cautela vaga; 1 = escolhe um vencedor; 0 = nada.
Síntese
A estatística é a linguagem para não exagerar nas alegações. Taxas com intervalos e precisão na taxa de base real mantêm o PulseMap honesto.
Continue estudando — capítulo 07 de 50
← Capítulo 06 (rascunho) · Índice de capítulos do curso · Capítulo 08 (rascunho) →