
Oi, habrozhiteli! Os métodos bayesianos assustam as fórmulas de muitos especialistas em TI, mas agora você não pode ficar sem a análise de estatísticas e probabilidades. Cameron Davidson-Pylon fala sobre o método bayesiano do ponto de vista de um programador prático que trabalha com a linguagem multifuncional PyMC e as bibliotecas NumPy, SciPy e Matplotlib. Revelando o papel das conclusões bayesianas nos testes A / B, identificando fraudes e outras tarefas urgentes, você não apenas entenderá facilmente esse tópico não trivial, mas também começará a aplicar o conhecimento adquirido para atingir seus objetivos.
Trecho: 4.3.3. Exemplo: classificando comentários no Reddit
Talvez você não concorde que a lei dos grandes números seja aplicada por todos, embora apenas implicitamente, na tomada de decisão subconsciente. Considere o exemplo de classificações de produtos online. Você costuma confiar em uma classificação média de cinco pontos com base em uma revisão? Duas críticas? Três críticas? Você subconscientemente entende que, com um número tão pequeno de críticas, a classificação média não reflete bem o quão bom ou ruim o produto é.
Como resultado disso, há omissões na classificação de mercadorias e geralmente na comparação. Para muitos compradores, é claro que classificar os resultados de uma pesquisa interativa por classificação não é muito objetivo, não importa se estamos falando de livros, vídeos ou comentários na Internet. Freqüentemente, filmes ou comentários em primeiro lugar obtêm notas altas apenas devido a um pequeno número de fãs entusiasmados, e bons filmes ou comentários são ocultados em páginas subsequentes com classificações supostamente imperfeitas de cerca de 4,8. O que fazer sobre isso?
Considere o site popular Reddit (eu deliberadamente não forneço links para ele, porque o Reddit é famoso por atrair usuários e tenho medo de que você nunca volte ao meu livro). Neste site, existem muitos links para diferentes histórias e imagens, e os comentários sobre esses links também são muito populares. Os usuários do site (que geralmente é chamado de redditor1) podem votar a favor ou contra cada comentário (os chamados upvotes e downvotes). O Reddit classifica os comentários por padrão em ordem decrescente. Como determinar quais comentários são os melhores? Eles geralmente se concentram nos seguintes indicadores.
1.
Popularidade . Um comentário é considerado bom se houver muitos votos. Os problemas ao usar esse modelo começam no caso de um comentário com centenas de votos a favor e milhares de contra. Embora muito popular, esse comentário parece ambíguo demais para ser considerado "melhor".
2.
a diferença Você pode tirar proveito da diferença entre o número de votos a favor e contra. Isso resolve o problema que surge ao usar a métrica "popularidade", mas não leva em conta a natureza temporária dos comentários. Os comentários podem ser enviados muitas horas após a publicação do link original. Ao mesmo tempo, surge um viés, devido ao qual a classificação mais alta não é recebida pelos melhores comentários, mas pelos mais antigos, que conseguiram acumular mais votos a favor do que os mais recentes.
3.
Correção pelo tempo . Considere um método no qual a diferença entre os prós e os contras seja dividida pela idade do comentário e uma frequência seja obtida, por exemplo, a diferença em por segundo ou por minuto. Um contra-exemplo imediatamente vem à mente: ao usar a opção "por segundo", um comentário deixado um segundo atrás com um voto "sim" será melhor do que o deixado 100 segundos atrás com 99 votos "sim". Esse problema pode ser evitado se você considerar apenas os comentários deixados pelo menos t segundos atrás. Mas como escolher um bom valor de t? Isso significa que todos os comentários postados depois de t segundos atrás são ruins? O caso terminará com uma comparação de valores instáveis com estável (comentários novos e antigos).
4.
Valor . A classificação dos comentários sobre a proporção do número de votos a favor e o número total de votos a favor e contra. Essa abordagem elimina o problema da natureza temporal dos comentários, para que os comentários postados recentemente com boas notas recebam uma classificação alta com a mesma probabilidade dos que foram deixados há muito tempo, desde que tenham uma proporção relativamente alta de votos em relação ao número total de votos. O problema com este método é que um comentário com um voto a favor (relação = 1,0) será melhor que um comentário com 999 votos a favor e um contra (relação = 0,999), embora seja óbvio que o segundo desses comentários provavelmente será o melhor.
Eu escrevi
"sim" por uma razão. Pode acontecer que o primeiro comentário com um único voto sim seja realmente melhor que o segundo, com 999 votos sim. É difícil concordar com essa afirmação, porque não sabemos quais 999 possíveis votos seguintes para o primeiro comentário. Digamos, ele poderia obter como resultado outros 999 votos a favor e não um único voto contra e ser melhor que o segundo, embora esse cenário não seja muito provável.
De fato, precisamos avaliar a proporção real de votos a favor. Observo que isso não é o mesmo que a correlação observada de votos a favor; se a proporção real de votos estiver oculta, observamos apenas o número de votos a favor em comparação com os votos contra (a proporção real de votos pode ser considerada como a probabilidade de votação do comentário, mas não contra). Graças à lei dos grandes números, é seguro dizer que em um comentário com 999 votos a favor e um contra, é provável que a proporção real de votos seja próxima de 1. Por outro lado, temos muito menos certeza de como será o resultado. A proporção real de votos para o comentário com um voto a favor. Este parece ser um problema bayesiano.
Uma maneira de determinar a distribuição a priori dos votos afirmativos é estudar o histórico da distribuição dos votos afirmativos. Isso pode ser feito raspando os comentários do Reddit e depois definindo a distribuição. No entanto, este método tem várias desvantagens.
1.
Dados assimétricos . O número de votos na grande maioria dos comentários é muito pequeno, como resultado das proporções de muitos comentários próximas ao extremo (veja o gráfico “triangular” no exemplo com o conjunto de dados Kaggle na Figura 4.4) e a distribuição será fortemente “distorcida”. Você pode tentar considerar apenas comentários cujo número de votos exceda um determinado valor limite. Mas aqui surgem dificuldades. É preciso procurar um equilíbrio entre o número de comentários disponíveis, por um lado, e um valor limite mais alto com a precisão correspondente da proporção, por outro.
2.
Dados tendenciosos (contendo erro sistemático) . O Reddit consiste em muitos subfóruns (subreddits). Dois exemplos: r / aww com fotos de animais engraçados er / política. É mais do que provável que o comportamento dos usuários ao comentar esses dois sub-fóruns do Reddit será radicalmente diferente: no primeiro deles, os visitantes provavelmente serão tocados e amigáveis, o que levará a um número maior de votos a favor, em comparação com o segundo, onde as opiniões nos comentários provavelmente divergirão.
À luz do exposto, parece-me que faz sentido usar uma distribuição uniforme a priori.
Agora podemos calcular a distribuição posterior da proporção real de votos a favor. O script comments_for_top_reddit_pic.py é usado para descartar comentários da imagem mais popular do Reddit atual. No código a seguir, copiamos os comentários do Reddit relacionados à imagem [3]:
http://i.imgur.com/OYsHKlH.jpg.from IPython.core.display import Image # %run # i- . %run top_pic_comments.py 2
[Output]: Title of submission: Frozen mining truck http://i.imgur.com/OYsHKlH.jpg
""" Contents: Votes: NumPy "" "" """ n_comments = len(contents) comments = np.random.randint(n_comments, size=4) print " ( %d) \n -----------"%n_comments for i in comments: print '"' + contents[i] + '"' print " ""/"": ",votes[i,:] print
[Output]: ( 77) ----------- "Do these trucks remind anyone else of Sly Cooper?" ""/"": [2 0] "Dammit Elsa I told you not to drink and drive." ""/"": [7 0] "I've seen this picture before in a Duratray (the dump box supplier) brochure..." ""/"": [2 0] "Actually it does not look frozen just covered in a layer of wind packed snow." ""/"": [120 18]
Com N votos e uma determinada taxa real de votos "para" p, o número de votos "para" se assemelha a uma variável aleatória binomial com os parâmetros pe N (o fato é que a taxa real de votos "para" é equivalente à probabilidade de votar em "em comparação com a votação" contra ”com N votos possíveis / julgamentos). Criamos uma função para a derivação bayesiana de p com relação ao conjunto de votos “a favor / contra” de um comentário em particular.
import pymc as pm def posterior_upvote_ratio(upvotes, downvotes, samples=20000): """ "" "", , , . , . """ N = upvotes + downvotes upvote_ratio = pm.Uniform("upvote_ratio", 0, 1) observations = pm.Binomial("obs", N, upvote_ratio, value=upvotes, observed=True) # ; MAP, # . map_ = pm.MAP([upvote_ratio, observations]).fit() mcmc = pm.MCMC([upvote_ratio, observations]) mcmc.sample(samples, samples/4) return mcmc.trace("upvote_ratio")[:]
A seguir estão as distribuições posteriores resultantes.
figsize(11., 8) posteriors = [] colors = ["#348ABD", "#A60628", "#7A68A6", "#467821", "#CF4457"] for i in range(len(comments)): j = comments[i] label = u'(%d :%d )\n%s...'%(votes[j, 0], votes[j,1], contents[j][:50]) posteriors.append(posterior_upvote_ratio(votes[j, 0], votes[j,1])) plt.hist(posteriors[i], bins=18, normed=True, alpha=.9, histtype="step", color=colors[i%5], lw=3, label=label) plt.hist(posteriors[i], bins=18, normed=True, alpha=.2, histtype="stepfilled", color=colors[i], lw=3) plt.legend(loc="upper left") plt.xlim(0, 1) plt.ylabel(u"") plt.xlabel(u" ''") plt.title(u" '' \ ");
[Output]: [****************100%******************] 20000 of 20000 complete
Como pode ser visto na fig. 4.5, algumas distribuições são fortemente “apertadas”, enquanto outras têm “caudas” relativamente longas, expressando que não sabemos exatamente para que serve a proporção real de votos.
4.3.4 Classificação
Até agora, ignoramos o objetivo principal do nosso exemplo: classificar comentários do melhor para o pior. Obviamente, é impossível classificar as distribuições; A classificação precisa de valores escalares. Existem muitas maneiras de extrair a essência da distribuição na forma de um escalar; por exemplo, a essência de uma distribuição pode ser expressa em termos de sua expectativa matemática ou valor médio. No entanto, o valor médio para isso não é adequado, pois esse indicador não leva em consideração a incerteza das distribuições.
Eu recomendaria usar um valor 95% menos plausível, que é definido como um valor com apenas 5% de probabilidade de que o valor real do parâmetro esteja abaixo dele (cf. o limite inferior do intervalo de confiança bayesiano). A seguir, plotamos as distribuições posteriores com o valor menos provável de 95% indicado (Fig. 4.6).
N = posteriors[0].shape[0] lower_limits = [] for i in range(len(comments)): j = comments[i] label = '(%d :%d )\n%s…'%(votes[j, 0], votes[j,1], contents[j][:50]) plt.hist(posteriors[i], bins=20, normed=True, alpha=.9, histtype="step", color=colors[i], lw=3, label=label) plt.hist(posteriors[i], bins=20, normed=True, alpha=.2, histtype="stepfilled", color=colors[i], lw=3) v = np.sort(posteriors[i])[int(0.05*N)] plt.vlines(v, 0, 10 , color=colors[i], linestyles="—", linewidths=3) lower_limits.append(v) plt.legend(loc="upper left") plt.ylabel(u"") plt.xlabel(u" ''") plt.title(u" '' \ "); order = np.argsort(-np.array(lower_limits)) print order, lower_limits
[Output]: [3 1 2 0] [0.36980613417267094, 0.68407203257290061, 0.37551825562169117, 0.8177566237850703]
Os melhores, de acordo com nosso procedimento, serão aqueles comentários cuja maior probabilidade de receber uma alta porcentagem de votos no sim. Visualmente, esses são comentários com o valor mais próximo da unidade 95% menos plausível. Na fig. 4.6 O valor menos plausível de 95% é representado usando linhas verticais.
Por que a classificação com base nessa métrica é uma boa idéia? Classificar de acordo com o valor menos plausível de 95% significa máxima cautela ao declarar que os comentários são os melhores. Ou seja, mesmo no pior cenário, se superestimarmos fortemente a proporção de votos a favor, é garantido que os melhores comentários estarão no topo. Com esse pedido, são fornecidas as seguintes propriedades muito naturais.
1. Dos dois comentários com a mesma proporção observada de votos “para”, o comentário com maior número de votos será reconhecido como o melhor (já que a confiança é maior na proporção mais alta para ele).
2. Dos dois comentários com o mesmo número de votos, o melhor é considerado o comentário com maior número de votos a favor.
»Mais informações sobre o livro podem ser encontradas no
site do editor»
Conteúdo»
TrechoCupom de 25% para vendedores ambulantes -
JavaScriptApós o pagamento da versão impressa do livro, um livro eletrônico é enviado por e-mail.