Corrigindo um preconceito conhecido em dados recolhidos
-
23-08-2019 - |
Pergunta
Ok, isso aqui é um problema análogo ao meu problema (Eu vou elaborar sobre o problema real abaixo, mas acho que esta analogia será mais fácil de entender).
Eu tenho uma estranha moeda de duas faces que só vem à tona cabeças (aleatoriamente) 1 em cada 1.001 lançamentos (o restante sendo caudas). Em outras palavras, para cada 1.000 caudas eu vejo, haverá 1 heads.
Eu tenho uma doença peculiar onde eu só percebe 1 em cada 1.000 caudas eu vejo, mas eu aviso a cada cabeças, e assim parece-me que a taxa de perceber um cara ou coroa é de 0,5. Claro, eu estou ciente desta doença e seus efeitos para que eu possa compensar isso.
Alguém agora me dá uma nova moeda, e notei que a taxa de cabeças percebendo agora é de 0,6. Dado que a minha doença não mudou (eu ainda só percebe 1 em cada 1.000 caudas), como faço para calcular a taxa real de cabeças de caudas que esta nova moeda produz?
Ok, então qual é o problema real? Bem, eu tenho um monte de dados que consistem em entrada e saídas que são 1s e 0s. Eu quero ensinar um algoritmo de aprendizado de máquina supervisionado para prever o resultado esperado (um float entre 0 e 1) dada uma entrada. O problema é que os 1s são muito raros, e isso estraga a matemática interna porque se torna muito suscetível a erros de arredondamento -. Mesmo com alta precisão matemática ponto flutuante
Então, eu normalizar os dados, omitindo aleatoriamente a maioria das amostras de treinamento 0 de modo que parece que há uma proporção mais ou menos igual de 1s e 0s. Claro, isso significa que agora a saída do algoritmo de aprendizagem máquina é não mais prevendo uma probabilidade, ie. em vez de prever 0,001 como deveria, seria agora prevêem 0,5.
Eu preciso de uma maneira de converter a saída do algoritmo volta a aprendizagem de máquina a uma probabilidade dentro do conjunto de treinamento originais.
Nota do Autor (2015/10/07): Eu descobri mais tarde que esta técnica é comumente conhecido como "downsampling"
Solução
Você está calculando o seguinte
calculatedRatio = heads / (heads + tails / 1000)
E você precisa
realRatio = heads / (heads + tails)
Resolver duas equações para caudas produz as seguintes equações.
tails = 1000 / calculatedRatio - 1000
tails = 1 / realRatio - 1
combinação de ambos os rendimentos o seguinte.
1000 / calculateRatio - 1000 = 1 / realRatio - 1
E, finalmente resolvendo para realRatio.
realRatio = 1 / (1000 / calculatedRatio - 999)
Parece ser correta. calculatedRatio 0,5 rendimentos realRatio 1/1001, 0,6 rendimentos 3/2003.