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
- EX022 — Leitura do Jaccard. Cite o valor de Jaccard e liste os indicadores que estão apenas no feed A. Rubrica: 3 = 0,500; 203.0.113.7 e bad.example; 2 = apenas o valor; 1 = errado; 0 = nenhum.
- EX023 — Sentido da sobreposição. Por que uma sobreposição alta entre dois feeds baseados em hashes não prova que algum deles tenha valor? Rubrica: 3 = ambos podem ser obsoletos/da base da pirâmide; sobreposição ≠ qualidade ou relevância; 2 = parcial; 1 = prova valor; 0 = nenhum.
- EX024 — Citação do Brier. Que escore de Brier o piloto relata, e qual é o valor de referência de dizer sempre 0,5? Rubrica: 3 = 0,183 e 0,25; 2 = um; 1 = errado; 0 = nenhum.
- EX025 — Faixa do topo. O que a faixa de 0,9 sugere, e por que não é um achado? Rubrica: 3 = possível excesso de confiança (0,67 observado); k=3 pequeno demais, apenas piloto; 2 = uma metade; 1 = excesso de confiança comprovado; 0 = nenhum.
- EX026 — Conferência manual. Calcule (p−o)² para o primeiro item do piloto (0,9; 1). Rubrica: 3 = 0,01; 2 = método certo, deslize aritmético; 1 = método errado; 0 = nenhum.
- EX027 — Mudança na amostragem. Que mudança na amostragem o piloto motiva? Rubrica: 3 = sobreamostrar os julgamentos de alta confiança para ganhar precisão; 2 = amostra maior em geral; 1 = vago; 0 = nenhum.
- EX028 — O piloto falha. Cite duas observações que fariam Tomas parar depois do piloto. Rubrica: 3 = duas entre: desfechos em sua maioria irresolúveis / tempo de codificação muito acima do orçado / script divergente do cálculo manual; 2 = uma; 1 = Brier baixo; 0 = nenhuma.
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) →