私はpython/djangoでウェブサイトを構築していて、ユーザーの送信が有効かどうか、またはスパムかどうかを予測したいと思います。
このウェブサイトのように、ユーザーは提出物の合格率を持っています。
ユーザーは他のユーザーの送信をモデレートできます。これらのモデレートは、後で管理者によってメタモデレートされます。
これを考えると:
- 提出受理率60%の登録ユーザーAが何かを提出します。
- ユーザーBは、Aの投稿を有効な送信としてモデレートします。ただし、ユーザーBは70%の確率で間違っています。
- ユーザーCはAの投稿をスパムとしてモデレートします。ユーザーCは通常正しいです。ユーザーCが何かがスパムである/スパムがないと言った場合、これは80%の確率で正しいでしょう。
Aの投稿がスパムになる可能性をどのように予測できますか?
編集:私はこのシナリオをシミュレートするPythonスクリプトを作成しました:
#!/usr/bin/env python
import random
def submit(p):
"""Return 'ham' with (p*100)% probability"""
return 'ham' if random.random() < p else 'spam'
def moderate(p, ham_or_spam):
"""Moderate ham as ham and spam as spam with (p*100)% probability"""
if ham_or_spam == 'spam':
return 'spam' if random.random() < p else 'ham'
if ham_or_spam == 'ham':
return 'ham' if random.random() < p else 'spam'
NUMBER_OF_SUBMISSIONS = 100000
USER_A_HAM_RATIO = 0.6 # Will submit 60% ham
USER_B_PRECISION = 0.3 # Will moderate a submission correctly 30% of the time
USER_C_PRECISION = 0.8 # Will moderate a submission correctly 80% of the time
user_a_submissions = [submit(USER_A_HAM_RATIO) \
for i in xrange(NUMBER_OF_SUBMISSIONS)]
print "User A has made %d submissions. %d of them are 'ham'." \
% ( len(user_a_submissions), user_a_submissions.count('ham'))
user_b_moderations = [ moderate( USER_B_PRECISION, ham_or_spam) \
for ham_or_spam in user_a_submissions]
user_b_moderations_which_are_correct = \
[i for i, j in zip(user_a_submissions, user_b_moderations) if i == j]
print "User B has correctly moderated %d submissions." % \
len(user_b_moderations_which_are_correct)
user_c_moderations = [ moderate( USER_C_PRECISION, ham_or_spam) \
for ham_or_spam in user_a_submissions]
user_c_moderations_which_are_correct = \
[i for i, j in zip(user_a_submissions, user_c_moderations) if i == j]
print "User C has correctly moderated %d submissions." % \
len(user_c_moderations_which_are_correct)
i = 0
j = 0
k = 0
for a, b, c in zip(user_a_submissions, user_b_moderations, user_c_moderations):
if b == 'spam' and c == 'ham':
i += 1
if a == 'spam':
j += 1
elif a == "ham":
k += 1
print "'spam' was identified as 'spam' by user B and 'ham' by user C %d times." % j
print "'ham' was identified as 'spam' by user B and 'ham' by user C %d times." % k
print "If user B says it's spam and user C says it's ham, it will be spam \
%.2f percent of the time, and ham %.2f percent of the time." % \
( float(j)/i*100, float(k)/i*100)
スクリプトを実行すると、次の出力が得られます。
- ユーザーAは100000件の提出を行いました。それらの60194は「ハム」です。
- ユーザーBは29864件の送信を正しくモデレートしました。
- ユーザーCは79990の送信を正しくモデレートしました。
- 「spam」は、ユーザーBによって「spam」として識別され、ユーザーCによって「ham」として2346回識別されました。
- 「ham」は、ユーザーBによって「spam」として識別され、ユーザーCによって「ham」として33634回識別されました。
- ユーザーBがスパムだと言い、ユーザーCがハムだと言った場合、6.52%の確率でスパムになり、93.48%の確率でハムになります。
ここでの確率は妥当ですか?これはシナリオをシミュレートする正しい方法でしょうか?