
Hola habrozhiteli! Los métodos bayesianos asustan las fórmulas de muchos especialistas de TI, pero ahora no puede prescindir del análisis de estadísticas y probabilidades. Cameron Davidson-Pylon habla sobre el método bayesiano desde el punto de vista de un programador práctico que trabaja con el lenguaje multifuncional PyMC y las bibliotecas NumPy, SciPy y Matplotlib. Al revelar el papel de las conclusiones bayesianas en las pruebas A / B, identificar el fraude y otras tareas urgentes, no solo comprenderá fácilmente este tema no trivial, sino que también comenzará a aplicar los conocimientos adquiridos para lograr sus objetivos.
Extracto: 4.3.3. Ejemplo: ordenar comentarios en Reddit
Quizás no esté de acuerdo en que la ley de los grandes números sea aplicada por todos, aunque solo implícitamente, en la toma de decisiones subconscientes. Considere el ejemplo de calificaciones de productos en línea. ¿A menudo confía en una calificación promedio de cinco puntos basada en una revisión? Dos opiniones? Tres opiniones? Inconscientemente comprende que con un número tan pequeño de revisiones, la calificación promedio no refleja bien qué tan bueno o malo es el producto.
Como resultado de esto, hay omisiones al clasificar bienes y, en general, al compararlos. Para muchos compradores, está claro que ordenar los resultados de una búsqueda interactiva por calificación no es muy objetivo, no importa si estamos hablando de libros, videos o comentarios en Internet. A menudo, las películas o comentarios en primer lugar obtienen altas calificaciones solo debido a un pequeño número de fanáticos entusiastas, y las películas o comentarios realmente buenos se ocultan en las páginas posteriores con calificaciones supuestamente imperfectas de aproximadamente 4.8. ¿Qué hacer al respecto?
Considere el sitio popular Reddit (deliberadamente no proporciono enlaces a él, porque Reddit es conocido por atraer usuarios, y me temo que nunca volverá a mi libro). En este sitio hay muchos enlaces a diferentes historias e imágenes, y los comentarios sobre estos enlaces también son muy populares. Los usuarios del sitio (que generalmente se llama la palabra redditor1) pueden votar a favor o en contra de cada comentario (los llamados votos positivos y negativos). Reddit ordena los comentarios por defecto en orden descendente. ¿Cómo determinar qué comentarios son los mejores? Por lo general, se centran en los siguientes indicadores.
1.
Popularidad . Un comentario se considera bueno si se emiten muchos votos. Los problemas al usar este modelo comienzan en el caso de un comentario con cientos de votos a favor y miles de en contra. Aunque es muy popular, este comentario parece demasiado ambiguo para ser considerado "el mejor".
2.
La diferencia . Puede aprovechar la diferencia entre el número de votos a favor y en contra. Esto resuelve el problema que surge cuando se utiliza la métrica de "popularidad", pero no tiene en cuenta la naturaleza temporal de los comentarios. Los comentarios pueden enviarse muchas horas después de la publicación del enlace original. Al mismo tiempo, surge un sesgo debido a que los mejores comentarios no reciben la calificación más alta, sino la más antigua, que logró acumular más votos a favor que los más nuevos.
3.
Corrección por tiempo . Considere un método en el que la diferencia entre los pros y los contras se divide por la edad del comentario y se obtiene una frecuencia, por ejemplo, la diferencia en por segundo o por minuto. Un contraejemplo viene inmediatamente a la mente: cuando se usa la opción "por segundo", un comentario dejado hace un segundo con un voto de "sí" será mejor que dejado hace 100 segundos con 99 votos de "sí". Este problema se puede evitar si considera solo los comentarios que se dejaron al menos t segundos atrás. Pero, ¿cómo elegir un buen valor de t? ¿Significa esto que todos los comentarios publicados más tarde que t segundos son malos? El caso finalizará con una comparación de valores inestables con estable (comentarios nuevos y antiguos).
4.
Valor . La clasificación de los comentarios sobre la relación entre el número de votos a favor y el número total de votos a favor y en contra. Este enfoque elimina el problema de la naturaleza temporal de los comentarios, por lo que los comentarios publicados recientemente con buenas calificaciones recibirán una calificación alta con la misma probabilidad que los que se dejaron hace mucho tiempo, siempre que tengan una proporción relativamente alta de votos con respecto al número total de votos. El problema con este método es que un comentario con un voto a favor (ratio = 1.0) será mejor que un comentario con 999 votos a favor y uno en contra (ratio = 0.999), aunque es obvio que el segundo Es probable que estos comentarios sean los mejores.
Escribí
"más bien" por una razón. Puede resultar que el primer comentario con un solo voto por el sí es realmente mejor que el segundo, con 999 votos por el sí. Es difícil estar de acuerdo con esta afirmación, porque no sabemos cuáles serían los posibles 999 próximos votos para el primer comentario. Digamos que podría obtener como resultado otros 999 votos a favor y ni un solo voto en contra y ser mejor que el segundo, aunque tal escenario no es muy probable.
De hecho, necesitamos evaluar la proporción real de votos a favor. Observo que esto no es lo mismo que la correlación de votos observada a favor; la proporción real de votos está oculta, solo observamos el número de votos a favor en comparación con los votos en contra (la proporción real de votos puede considerarse como la probabilidad de que el comentario vote a favor, pero no en contra). Gracias a la ley de los grandes números, es seguro decir que en un comentario con 999 votos a favor y uno en contra, es probable que la proporción real de votos sea cercana a 1. Por otro lado, estamos mucho menos seguros de cómo resulta La proporción real de votos para el comentario con un voto a favor. Esto parece ser un problema bayesiano.
Una forma de determinar la distribución a priori de los votos afirmativos es estudiar la historia de la distribución de los votos afirmativos. Esto se puede hacer raspando los comentarios de Reddit y luego definiendo la distribución. Sin embargo, este método tiene varios inconvenientes.
1.
Datos asimétricos . El número de votos en la gran mayoría de los comentarios es muy pequeño, como resultado de lo cual las proporciones de muchos comentarios serán casi extremas (vea el gráfico "triangular" en el ejemplo con el conjunto de datos de Kaggle en la Fig. 4.4) y la distribución será muy "sesgada". Puede intentar considerar solo los comentarios cuyo número de votos exceda un cierto valor umbral. Pero aquí surgen dificultades. Uno tiene que buscar un equilibrio entre el número de comentarios disponibles, por un lado, y un valor umbral más alto con la precisión correspondiente de la relación, por el otro.
2.
Datos sesgados (que contienen errores sistemáticos) . Reddit consta de muchos sub-foros (subreddits). Dos ejemplos: r / aww con imágenes de animales graciosos y r / política. Es más que probable que el comportamiento de los usuarios al comentar estos dos subforos de Reddit difiera radicalmente: en el primero de ellos, es más probable que los visitantes sean tocados y se comporten de manera amigable, lo que conducirá a un mayor número de votos a favor, en comparación con el segundo, donde las opiniones en los comentarios es probable que diverjan.
A la luz de lo anterior, me parece que tiene sentido utilizar una distribución uniforme a priori.
Ahora podemos calcular la distribución posterior de la proporción real de votos a favor. El script comments_for_top_reddit_pic.py se usa para eliminar los comentarios de la imagen actual de Reddit más popular. En el siguiente código, eliminamos los comentarios de Reddit relacionados con la imagen [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]
Con N votos y una proporción real dada de votos "para" p, el número de votos "para" se asemeja a una variable aleatoria binomial con los parámetros py N (el hecho es que la proporción real de votos "para" es equivalente a la probabilidad de emitir un voto para "en comparación con el voto" en contra ”con N posibles votos / juicios). Creamos una función para la derivación bayesiana de p con respecto al conjunto de votos "a favor" / "en contra" de un comentario 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")[:]
Las siguientes son las distribuciones 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 se puede ver en la fig. 4.5, algunas distribuciones están fuertemente "exprimidas", mientras que otras tienen "colas" relativamente largas, expresando que no sabemos exactamente para qué es la proporción real de votos.
4.3.4 Clasificación
Hasta ahora, hemos ignorado el objetivo principal de nuestro ejemplo: ordenar los comentarios de mejor a peor. Por supuesto, es imposible ordenar las distribuciones; ordenar necesita valores escalares. Hay muchas formas de extraer la esencia de la distribución en forma de escalar; Por ejemplo, la esencia de una distribución puede expresarse en términos de su expectativa matemática o valor promedio. Sin embargo, el valor promedio para esto no es adecuado, ya que este indicador no tiene en cuenta la incertidumbre de las distribuciones.
Recomendaría usar el 95% de valor menos plausible, que se define como el valor con solo un 5% de probabilidad de que el valor real del parámetro esté por debajo de él (cf. el límite inferior del intervalo de confianza bayesiano). A continuación, graficamos las distribuciones posteriores con el valor 95% menos probable 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]
Lo mejor, de acuerdo con nuestro procedimiento, serán aquellos comentarios para los cuales la mayor probabilidad de recibir un alto porcentaje de votos sí. Visualmente, estos son comentarios con el valor más plausible del 95% más cercano a la unidad. En la fig. 4.6 El valor menos plausible del 95% se representa usando líneas verticales.
¿Por qué la clasificación basada en esta métrica es una buena idea? Ordenar según el valor menos plausible del 95% significa máxima precaución al declarar que los comentarios son los mejores. Es decir, incluso en el peor de los casos, si sobreestimamos fuertemente la proporción de votos a favor, se garantiza que los mejores comentarios estarán en la cima. Con este pedido, se proporcionan las siguientes propiedades muy naturales.
1. De los dos comentarios con la misma proporción observada de votos "a favor", el comentario con el mayor número de votos será reconocido como el mejor (ya que la confianza es mayor en la proporción más alta para él).
2. De los dos comentarios con el mismo número de votos, el mejor se considera el comentario con un mayor número de votos a favor.
»Se puede encontrar más información sobre el libro en
el sitio web del editor»
Contenidos»
ExtractoCupón de 25% de descuento para vendedores ambulantes -
JavaScriptTras el pago de la versión en papel del libro, se envía un libro electrónico por correo electrónico.