◇ OpenCyber Academy
Pesquisa doutoral · Capítulo 4 · Português

Capítulo 4 — Replicação da linha de base e piloto

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 4 — Replicação da linha de base e piloto

Mapa da aula

Aula 04 publicada. Mapa, exemplo, EX022.

flowchart TD
  N0["4.1 Por que replicar primeiro"]
  N1["Laboratório 1 — sobreposição da linha de base"]
  N2["4.2 Lendo a sobreposição"]
  N3["Laboratório 2 — piloto de calibração"]
  N4["4.3 Lendo o piloto"]
  N5["4.4 Decisão de viabilidade"]
  N6["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
  N6 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX022"]

Desenho lógico

flowchart LR
  N0["4.1 Por que replicar primeiro"]
  N1["Laboratório 1 — sobreposição da linha de base"]
  N2["4.2 Lendo a sobreposição"]
  N3["Laboratório 2 — piloto de calibração"]
  N4["4.3 Lendo o piloto"]
  N5["4.4 Decisão de viabilidade"]
  N6["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX022"]
[4.1 Por que replicar primeiro]
    |
    v
[Laboratório 1 — sobreposição da linha de base]
    |
    v
[4.2 Lendo a sobreposição]
    |
    v
[Laboratório 2 — piloto de calibração]
    |
    v
[4.3 Lendo o piloto]
    |
    v
[4.4 Decisão de viabilidade]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX022]

Objetivos de aprendizagem

Você vai (1) replicar uma linha de base simples, no estilo das publicadas, antes de construir sobre ela; (2) calcular um escore de Brier e faixas de calibração; (3) calcular a sobreposição de conjuntos entre feeds de indicadores; (4) decidir, a partir de um piloto, se o estudo principal é viável.

4.1 Por que replicar primeiro

Construir sobre uma linha de base não replicada acumula erros. Um piloto que reproduz uma medição conhecida e simples — como a sobreposição entre dois feeds de indicadores, grandeza muito discutida na literatura sobre compartilhamento — verifica se o seu pipeline, o parsing e as definições se comportam bem antes do estudo caro. O piloto de Tomas usa duas verificações desse tipo: a sobreposição de Jaccard entre dois pequenos feeds sintéticos de indicadores e um escore de Brier sobre doze julgamentos do piloto. As duas grandezas podem ser calculadas à mão, de modo que uma divergência entre o script e o cálculo manual aponta para um defeito no parsing ou nas definições, e não para uma propriedade do corpus.

Laboratório 1 — sobreposição da linha de base

"""Lab 1 (ch 04): replicate a baseline - Jaccard overlap of synthetic indicator sets from two feeds."""
feed_a = {"203.0.113.7", "203.0.113.9", "198.51.100.44", "bad.example", "c2.example"}
feed_b = {"203.0.113.9", "198.51.100.44", "c2.example", "drop.example"}
inter, union = feed_a & feed_b, feed_a | feed_b
print(f"|A|={len(feed_a)} |B|={len(feed_b)} |A&B|={len(inter)} |A|B|={len(union)}")
print(f"Jaccard={len(inter)/len(union):.3f}")
print("only in A:", sorted(feed_a - feed_b))
print("only in B:", sorted(feed_b - feed_a))

Execute com python3 lab_overlap.py. Saída verificada:

|A|=5 |B|=4 |A&B|=3 |A|B|=6
Jaccard=0.500
only in A: ['203.0.113.7', 'bad.example']
only in B: ['drop.example']

4.2 Lendo a sobreposição

Três dos seis indicadores distintos são compartilhados, um Jaccard de 0,500. A sobreposição nada diz sobre qualidade: dois feeds podem concordar em indicadores obsoletos. A Pirâmide da Dor de Bianco lembra aos analistas que hashes e endereços IP são baratos de trocar para o adversário, de modo que uma sobreposição alta em indicadores da base da pirâmide é uma notícia modesta. Para Tomas, o laboratório de sobreposição é uma verificação do pipeline, não um resultado: o 0,500 coincide com o que ele calcula à mão a partir dos seis indicadores, então o código de parsing e de normalização se comporta como pretendido antes que o trabalho de calibração dependa dele.

Laboratório 2 — piloto de calibração

"""Lab 2 (ch 04): Brier score and calibration bins for synthetic analyst probability judgments."""
judgments = [  # (stated probability that the claim is true, outcome 1=true 0=false)
    (0.9, 1), (0.9, 1), (0.9, 0), (0.7, 1), (0.7, 0), (0.7, 1),
    (0.3, 0), (0.3, 1), (0.3, 0), (0.1, 0), (0.1, 0), (0.1, 0),
]
brier = sum((p - o) ** 2 for p, o in judgments) / len(judgments)
print(f"n={len(judgments)} Brier={brier:.3f}")
for p in sorted({p for p, _ in judgments}, reverse=True):
    outs = [o for q, o in judgments if q == p]
    print(f"stated {p:.1f}  observed {sum(outs)/len(outs):.2f}  (k={len(outs)})")

Execute com python3 lab_calibration.py. Saída verificada:

n=12 Brier=0.183
stated 0.9  observed 0.67  (k=3)
stated 0.7  observed 0.67  (k=3)
stated 0.3  observed 0.33  (k=3)
stated 0.1  observed 0.00  (k=3)

4.3 Lendo o piloto

Doze julgamentos do piloto dão um escore de Brier de 0,183 (0 é perfeito; 0,25 é o que se obtém dizendo sempre 0,5 com desfechos equilibrados). A faixa de 0,9 se confirma apenas duas vezes em três, o que sugere excesso de confiança no topo; a faixa de 0,1 se comporta bem. Com três itens por faixa, nada disso é um achado — é um teste de que o código funciona e uma pista sobre onde o tamanho da amostra precisa ser maior. Tomas conferiu à mão os quatro primeiros termos do Brier contra o script, e eles coincidiram. Registrou no caderno de laboratório a pista da faixa de 0,9 como exploratória e pediu que a amostra principal desse peso maior aos julgamentos de alta confiança, transformando uma curiosidade de três itens em uma decisão de desenho registrada antes de os dados principais serem codificados.

4.4 Decisão de viabilidade

O piloto passa se o parsing funcionar, se os codificadores conseguirem resolver os desfechos de pelo menos a fração do piso e se o código de pontuação reproduzir os cálculos manuais. Falha se os desfechos forem em sua maioria irresolúveis ou se a codificação levar muito mais tempo do que o orçado. No piloto de Tomas, o terceiro teste passou, porque os quatro termos do Brier calculados à mão coincidiram com o script. O teste de tempo é o que os candidatos costumam pular: se codificar um julgamento leva três vezes o orçado, 300 julgamentos resolúveis viram outro projeto, e o lugar para descobrir isso é o piloto, não o nono mês.

Exemplo resolvido

Tomas calcula à mão o escore de Brier dos quatro primeiros itens do piloto e confere com o script. Registra no caderno de laboratório a pista da faixa de 0,9 como exploratória, não como resultado, e pede que a amostra principal dê peso maior aos julgamentos de alta confiança, para que essa faixa seja estimada com precisão adequada.

Caso sintético. Os dois feeds e os doze julgamentos do piloto são inventados.

Erros e limites

Nunca publique números de piloto como achados. Os valores de indicadores aqui usam endereços de documentação e nomes .example e não são ameaças reais.

Exercícios

Síntese

Replique o que é simples, confira o código contra o cálculo manual, trate os números do piloto como pistas e decida a viabilidade por regras fixadas de antemão.

Continue estudando — capítulo 04 de 08

← Capítulo 03 (rascunho) · Índice de capítulos do curso · Capítulo 05 (rascunho) →