
Hai, habrozhiteli! Metode Bayesian menakuti rumus banyak spesialis TI, tetapi sekarang Anda tidak dapat melakukannya tanpa analisis statistik dan probabilitas. Cameron Davidson-Pylon berbicara tentang metode Bayesian dari sudut pandang seorang programmer praktis yang bekerja dengan bahasa PyMC multifungsi dan perpustakaan NumPy, SciPy, dan Matplotlib. Mengungkap peran kesimpulan Bayesian dalam pengujian A / B, mengidentifikasi penipuan dan tugas mendesak lainnya, Anda tidak hanya akan dengan mudah memahami topik non-sepele ini, tetapi juga mulai menerapkan pengetahuan yang diperoleh untuk mencapai tujuan Anda.
Kutipan: 4.3.3. Contoh: mengurutkan komentar di Reddit
Mungkin Anda tidak setuju bahwa hukum angka besar diterapkan oleh semua, meskipun hanya secara implisit, dalam pengambilan keputusan bawah sadar. Perhatikan contoh peringkat produk online. Apakah Anda sering mempercayai peringkat rata-rata lima poin berdasarkan satu ulasan? Dua ulasan? Tiga ulasan? Anda secara tidak sadar memahami bahwa dengan sejumlah kecil ulasan, peringkat rata-rata tidak mencerminkan dengan baik seberapa baik atau buruk produk tersebut.
Akibatnya, ada kelalaian saat menyortir barang dan umumnya ketika membandingkannya. Bagi banyak pembeli, jelas bahwa menyortir hasil pencarian interaktif berdasarkan peringkat tidak terlalu objektif, tidak masalah jika kita berbicara tentang buku, video, atau komentar di Internet. Seringkali, film atau komentar di tempat pertama mendapat nilai tinggi hanya karena sejumlah kecil penggemar yang antusias, dan film atau komentar yang sangat bagus disembunyikan di halaman berikutnya dengan peringkat yang dianggap tidak sempurna sekitar 4,8. Apa yang harus dilakukan?
Pertimbangkan situs Reddit yang populer (saya sengaja tidak memberikan tautan ke sana, karena Reddit terkenal karena menarik pengguna, dan saya khawatir Anda tidak akan pernah kembali ke buku saya). Di situs ini ada banyak tautan ke berbagai cerita dan gambar, dan komentar pada tautan ini juga sangat populer. Pengguna situs (yang biasanya disebut kata redditor1) dapat memilih atau menentang setiap komentar (yang disebut upvotes dan downvotes). Reddit mengurutkan komentar secara default dalam urutan menurun. Bagaimana menentukan komentar mana yang terbaik? Mereka biasanya fokus pada beberapa indikator berikut.
1.
Popularitas . Komentar dianggap baik jika banyak suara diberikan. Masalah ketika menggunakan model ini dimulai dalam kasus komentar dengan ratusan suara dan ribuan menentang. Meskipun sangat populer, komentar ini tampaknya terlalu ambigu untuk dianggap "terbaik."
2.
Perbedaannya . Anda dapat memanfaatkan perbedaan antara jumlah suara yang mendukung dan yang menentang. Ini menyelesaikan masalah yang muncul saat menggunakan metrik "popularitas", tetapi tidak memperhitungkan sifat sementara dari komentar tersebut. Komentar dapat dikirim berjam-jam setelah publikasi tautan asli. Pada saat yang sama, bias muncul, karena peringkat tertinggi tidak diterima sama sekali oleh komentar terbaik, tetapi yang tertua, yang berhasil mengumpulkan lebih banyak suara daripada yang baru.
3.
Koreksi untuk waktu . Pertimbangkan metode di mana perbedaan antara pro dan kontra dibagi dengan usia komentar dan frekuensi diperoleh, misalnya, perbedaan dalam per detik atau per menit. Contoh tandingan segera terlintas di benak: ketika menggunakan opsi "per detik", komentar yang tersisa satu detik yang lalu dengan satu suara "ya" akan lebih baik daripada yang tersisa 100 detik yang lalu dengan 99 suara "ya". Masalah ini dapat dihindari jika Anda menganggap hanya komentar yang tersisa setidaknya t detik yang lalu. Tetapi bagaimana cara memilih nilai t yang baik? Apakah ini berarti bahwa semua komentar yang dikirim lebih dari t detik yang lalu buruk? Kasing akan diakhiri dengan perbandingan nilai tidak stabil dengan stabil (komentar baru dan lama).
4.
Nilai . Peringkat komentar pada rasio jumlah suara yang mendukung dengan jumlah total suara yang mendukung dan menentang. Pendekatan ini menghilangkan masalah sifat temporal dari komentar, sehingga komentar yang baru-baru ini diposkan dengan nilai bagus akan menerima peringkat tinggi dengan probabilitas yang sama dengan yang telah lama berlalu, asalkan mereka memiliki rasio suara yang relatif tinggi terhadap jumlah total suara. Masalah dengan metode ini adalah bahwa komentar dengan satu suara mendukung (rasio = 1.0) akan lebih baik daripada komentar dengan mendukung 999 suara dan satu menentang (rasio = 0.999), meskipun jelas bahwa yang kedua dari komentar-komentar ini cenderung menjadi yang terbaik.
Saya menulis
"bukan" karena suatu alasan. Mungkin ternyata komentar pertama dengan satu suara ya benar-benar lebih baik daripada yang kedua, dengan 999 suara ya. Sulit untuk menyetujui pernyataan ini, karena kita tidak tahu 999 suara apa yang potensial untuk komentar pertama. Katakanlah, ia bisa mendapatkan sebagai hasil dari 999 suara yang mendukung dan tidak satu suara menentang dan lebih baik dari yang kedua, meskipun skenario seperti itu sangat tidak mungkin.
Bahkan, kita perlu mengevaluasi rasio suara yang sebenarnya mendukung. Saya perhatikan bahwa ini sama sekali tidak sama dengan korelasi suara yang diamati dalam mendukung; rasio suara yang sebenarnya disembunyikan, kami hanya mengamati jumlah suara yang mendukung dibandingkan dengan suara yang menentang (rasio suara yang sebenarnya dapat dianggap sebagai probabilitas bahwa komentar akan memilih, tetapi tidak menentang). Berkat hukum angka besar, aman untuk mengatakan bahwa dalam komentar dengan 999 suara mendukung dan satu menentang, rasio suara yang sebenarnya cenderung mendekati 1. Di sisi lain, kita jauh lebih tidak yakin tentang bagaimana hasilnya. Rasio suara yang sebenarnya untuk komentar dengan satu suara mendukung. Ini tampaknya menjadi masalah Bayesian.
Salah satu cara untuk menentukan distribusi a priori dari suara afirmatif adalah dengan mempelajari sejarah distribusi suara afirmatif. Ini dapat dilakukan dengan mengikis komentar Reddit dan kemudian mendefinisikan distribusi. Namun, metode ini memiliki beberapa kelemahan.
1.
Data asimetris . Jumlah suara di sebagian besar komentar sangat kecil, akibatnya rasio banyak komentar akan mendekati ekstrim (lihat grafik "segitiga" dalam contoh dengan dataset Kaggle pada Gambar 4.4) dan distribusinya akan sangat "condong". Anda dapat mencoba mempertimbangkan hanya komentar yang jumlah suaranya melebihi nilai ambang tertentu. Tetapi di sini kesulitan muncul. Kita harus mencari keseimbangan antara jumlah komentar yang tersedia, di satu sisi, dan nilai ambang batas yang lebih tinggi dengan akurasi rasio yang sesuai, di sisi lain.
2.
Data bias (mengandung kesalahan sistematis) . Reddit terdiri dari banyak sub-forum (subreddits). Dua contoh: r / aww dengan gambar binatang lucu dan r / politik. Sangat mungkin bahwa perilaku pengguna ketika mengomentari dua subforum Reddit ini akan sangat berbeda: di yang pertama, pengunjung kemungkinan besar akan disentuh dan bersahabat, yang akan mengarah pada jumlah suara yang lebih banyak yang mendukung, dibandingkan yang kedua, di mana pendapat di komentar cenderung menyimpang.
Mengingat hal tersebut di atas, bagi saya tampaknya masuk akal untuk menggunakan distribusi a priori yang seragam.
Sekarang kita dapat menghitung distribusi posterior rasio aktual suara yang mendukung. Script comments_for_top_reddit_pic.py digunakan untuk memo komentar dari gambar Reddit paling populer saat ini. Dalam kode berikut, kami menulis komentar Reddit terkait dengan gambar [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]
Dengan suara N dan rasio aktual suara "untuk" p, jumlah suara "untuk" menyerupai variabel acak binomial dengan parameter p dan N (faktanya adalah bahwa rasio suara yang sebenarnya "untuk" setara dengan probabilitas untuk memberikan suara "dibandingkan dengan suara" menentang ”dengan N kemungkinan suara / uji coba). Kami membuat fungsi untuk derivasi Bayesian p sehubungan dengan set suara "untuk" / "terhadap" komentar tertentu.
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")[:]
Berikut ini adalah distribusi posterior yang dihasilkan.
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
Seperti yang bisa dilihat dari gambar. 4.5, beberapa distribusi sangat "diperas", sementara yang lain memiliki "ekor" yang relatif panjang, menyatakan bahwa kita tidak tahu persis untuk apa rasio suara yang sebenarnya.
4.3.4. Menyortir
Sejauh ini, kami telah mengabaikan tujuan utama dari contoh kami: mengurutkan komentar dari yang terbaik hingga yang terburuk. Tentu saja, tidak mungkin menyortir distribusi; sort membutuhkan nilai skalar. Ada banyak cara untuk mengekstrak esensi dari distribusi dalam bentuk skalar; misalnya, esensi dari suatu distribusi dapat dinyatakan dalam hal ekspektasi matematisnya, atau nilai rata-rata. Namun, nilai rata-rata untuk ini tidak cocok, karena indikator ini tidak memperhitungkan ketidakpastian distribusi.
Saya akan merekomendasikan menggunakan nilai masuk akal 95%, yang didefinisikan sebagai nilai dengan probabilitas hanya 5% bahwa nilai aktual dari parameter di bawahnya (lih. Batas bawah interval kepercayaan Bayesian). Selanjutnya, kami memplot distribusi posterior dengan nilai yang kemungkinan paling kecil ditunjukkan 95% (Gbr. 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]
Yang terbaik, menurut prosedur kami, adalah komentar-komentar di mana probabilitas tertinggi untuk menerima persentase suara ya yang tinggi. Secara visual, ini adalah komentar dengan nilai 95% paling masuk akal dari unit. Dalam gbr. 4.6 Nilai 95% yang paling masuk akal digambarkan menggunakan garis vertikal.
Mengapa menyortir berdasarkan metrik ini merupakan ide yang bagus? Menyortir menurut nilai paling masuk akal 95% berarti kehati-hatian maksimum dalam menyatakan komentar sebagai yang terbaik. Artinya, bahkan dalam skenario terburuk, jika kami sangat melebih-lebihkan rasio suara yang mendukung, dijamin bahwa komentar terbaik akan berada di atas. Dengan pemesanan ini, sifat sangat alami berikut disediakan.
1. Dari dua komentar dengan rasio suara yang diamati yang sama "untuk", komentar dengan jumlah suara yang lebih tinggi akan diakui sebagai yang terbaik (karena kepercayaan lebih tinggi dalam rasio yang lebih tinggi untuknya).
2. Dari dua komentar dengan jumlah suara yang sama, yang terbaik dianggap sebagai komentar dengan jumlah suara yang lebih besar.
»Informasi lebih lanjut tentang buku ini dapat ditemukan di
situs web penerbit»
Isi»
KutipanKupon diskon 25% untuk penjaja -
JavaScriptSetelah pembayaran versi kertas buku, sebuah buku elektronik dikirim melalui email.