Mapa da aula
Aula 06 publicada. Mapa, exemplo, EX026.
flowchart TD
N0["6.1 Os mesmos dados, dois tratamentos"]
N1["6.2 Lendo o resultado"]
N2["6.3 Tomando a decisão"]
N3["6.4 Ameaças à validade"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX026"]
Desenho lógico
flowchart LR
N0["6.1 Os mesmos dados, dois tratamentos"]
N1["6.2 Lendo o resultado"]
N2["6.3 Tomando a decisão"]
N3["6.4 Ameaças à validade"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX026"]
[6.1 Os mesmos dados, dois tratamentos]
|
v
[6.2 Lendo o resultado]
|
v
[6.3 Tomando a decisão]
|
v
[6.4 Ameaças à validade]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX026]
Objetivos de aprendizagem
Você vai (1) planejar uma comparação controlada de dois conjuntos de regras de alerta sobre o mesmo replay rotulado; (2) estimar a revocação e a taxa de alertas falsos de cada um; (3) calcular um intervalo de confiança de bootstrap para a diferença; e (4) decidir se as evidências justificam uma mudança em produção.
6.1 Os mesmos dados, dois tratamentos
Comparar o conjunto de regras A (atual) com o conjunto de regras B (proposto) em semanas diferentes de dados confunde as regras com as semanas. Uma avaliação controlada reproduz as mesmas janelas rotuladas nos dois. Os rótulos vêm de um plano de testes: 40 janelas contêm comportamento de ataque injetado no replay, e 160 são operação normal.
"""Lab 06: controlled evaluation of two alerting rule sets on the same synthetic replay, with bootstrap CI."""
import random
rnd = random.Random(6)
# 200 labelled replay windows: (is_attack, alert_by_A, alert_by_B)
data = []
for i in range(200):
att = i < 40
a = rnd.random() < (0.70 if att else 0.08)
b = rnd.random() < (0.85 if att else 0.05)
data.append((att, a, b))
def recall(rows, k): at = [r for r in rows if r[0]]; return sum(r[k] for r in at) / len(at)
def far(rows, k): be = [r for r in rows if not r[0]]; return sum(r[k] for r in be) / len(be)
print(f"A recall={recall(data,1):.3f} false-alert rate={far(data,1):.3f}")
print(f"B recall={recall(data,2):.3f} false-alert rate={far(data,2):.3f}")
diffs = []
for _ in range(2000):
s = [rnd.choice(data) for _ in data]
if any(r[0] for r in s): diffs.append(recall(s, 2) - recall(s, 1))
diffs.sort()
print(f"recall difference B-A 95% bootstrap CI: [{diffs[50]:.3f}, {diffs[1949]:.3f}]")
Execute com python3 lab_ab.py. Saída verificada:
A recall=0.650 false-alert rate=0.069
B recall=0.850 false-alert rate=0.037
recall difference B-A 95% bootstrap CI: [0.000, 0.388]
O plano de testes deve ser escrito antes de o replay ser construído, nomeando os comportamentos de ataque, quantas janelas cada um recebe e quem as rotula. Idealmente, a pessoa que injeta os ataques não projetou nenhum dos conjuntos de regras. O Laboratório 6 faz esse papel com resultados aleatórios de semente fixa, então seus números mostram o método, e não o desempenho real das regras da BWRP.
6.2 Lendo o resultado
A revocação de B é 0,85 contra 0,65 de A, e sua taxa de alertas falsos é menor (3,7 % vs 6,9 %). O intervalo de bootstrap para a diferença de revocação vai de 0,000 a 0,388: a extremidade inferior toca o zero. Com apenas 40 janelas de ataque, não podemos descartar que B não seja melhor do que A em revocação, mesmo que a estimativa pontual o favoreça fortemente. Cada janela reamostrada carrega os resultados dos dois conjuntos de regras, então o bootstrap acima já preserva o pareamento; um teste exato sobre as janelas em que A e B discordam seria a verificação cruzada natural.
Relate as contagens ao lado das taxas, para que o leitor possa julgar as evidências: 34 de 40 contra 26 de 40 janelas de ataque, e 6 contra 11 de 160 janelas normais. Com tão poucas janelas de ataque, um punhado de resultados diferentes mudaria o quadro. Esse é o principal motivo pelo qual Daniel pede um replay maior e construído de forma independente antes da próxima revisão.
6.3 Tomando a decisão
Os líderes raramente precisam de certeza estatística para agir; precisam conhecer o risco de cada escolha. B é mais barato em alertas falsos e provavelmente melhor em revocação. A desvantagem de trocar — se B, na verdade, não fosse melhor — é pequena. Daniel recomenda a troca, ampliando o conjunto de janelas de ataque para 120 antes da próxima revisão.
A decisão fica mais fácil porque B também produz menos alertas falsos, que os operadores notam em todo turno. Daniel registra a recomendação com a sua incerteza, define a data da próxima revisão e nomeia o colega que vai construir as 120 janelas de ataque. Se o replay maior não mostrar vantagem em revocação, a decisão é revista, e não defendida.
6.4 Ameaças à validade
Os ataques injetados refletem a imaginação de quem escreveu os testes; adversários reais podem ser diferentes. O replay omite a reação dos operadores. O conjunto de regras B foi projetado depois de ver alguns desses tipos de ataque, o que o favorece.
Cada ameaça tem um remédio parcial. Peça a um colega que não projetou B que escreva novas janelas de ataque. Registre que o replay mede alertas, e não se os operadores agem com base neles. Registre quais tipos de ataque informaram o projeto de B e relate os resultados de B nesses tipos separadamente dos demais, para que o leitor veja se a sua vantagem se mantém em comportamentos não vistos.
Exemplo resolvido (BWRP sintética)
Nota de avaliação de Daniel: "Replay R-6 (200 janelas, 40 de ataque, semente 6). B: revocação 34/40, alertas falsos 6/160. A: revocação 26/40, alertas falsos 11/160. IC de bootstrap de 95 % para a diferença de revocação [0,000, 0,388]. Recomendação: adotar B; ampliar para 120 janelas de ataque construídas por um colega que não projetou B."
Caso sintético — Bayside Water Reclamation Plant. Os rótulos do replay e os resultados dos alertas são gerados pelo script com semente fixa.
Erros e limites
Intervalos de bootstrap com poucos positivos são instáveis. Os resultados de alerta do laboratório são sorteios aleatórios que fazem as vezes do comportamento real das regras.
Exercícios
- EX026 — As contagens por trás das taxas. Converta a taxa de alertas falsos de A, 0,069, numa contagem das 160 janelas normais.
Mostrar critérios de avaliação
Rubrica: 3 = 11 de 160; 2 = ≈11; 1 = 0,069 × 200; 0 = nenhum. - EX027 — Interpretar um IC que toca o zero. O que um limite inferior de 0,000 diz a quem decide?
Mostrar critérios de avaliação
Rubrica: 3 = os dados são compatíveis com nenhuma melhora de revocação; incerteza vinda de 40 positivos; 2 = parcial; 1 = "B é melhor"; 0 = nenhum. - EX028 — Por que reproduzir as mesmas janelas? Explique o benefício de um desenho pareado aqui.
Mostrar critérios de avaliação
Rubrica: 3 = remove a variação de semana para semana; as diferenças se devem às regras; 2 = parcial; 1 = vago; 0 = nenhum. - EX029 — Autoria independente dos ataques. Por que um colega deve construir as novas janelas de ataque?
Mostrar critérios de avaliação
Rubrica: 3 = evita o viés de projeto a favor de B; 2 = parcial; 1 = carga de trabalho; 0 = nenhum. - EX030 — Desvantagem assimétrica. Argumente por que trocar para B é razoável apesar do intervalo.
Mostrar critérios de avaliação
Rubrica: 3 = menos alertas falsos e revocação provavelmente melhor; custo pequeno se forem iguais; reversível; 2 = parcial; 1 = "estatisticamente provado"; 0 = nenhum.
Síntese
Uma avaliação controlada pareia os tratamentos sobre dados rotulados idênticos, relata contagens e intervalos e permite que os líderes ajam de forma proporcional com evidências incertas, mas úteis.