Je construis un site web en python/django et je veux prédire si une soumission d'utilisateur est valide ou s'il s'agit d'un spam.Calcul de la probabilité de spam
Les utilisateurs ont un taux d'acceptation sur leurs soumissions, comme ce site a.
Les utilisateurs peuvent modérer les soumissions d'autres utilisateurs; et ces modérations sont ensuite métamodifiées par un administrateur.
Compte tenu de ceci:
- l'utilisateur enregistré A avec une soumission accepte taux de 60% soumet quelque chose.
- L'utilisateur B modère le message de A comme soumission valide. Cependant, l'utilisateur B a tort 70% du temps.
- L'utilisateur C modère la publication de A comme spam. L'utilisateur C a généralement raison. Si l'utilisateur C dit quelque chose est spam/pas de spam, ce sera correct 80% du temps.
Comment puis-je prédire la probabilité que le message de A soit du spam?
Edit: J'ai fait un script python simulant ce scénario:
#!/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)
L'exécution du script me donne cette sortie:
- utilisateur A a fait 100000 soumissions. 60194 d'entre eux sont «jambon».
- L'utilisateur B a correctement modéré 29864 soumissions.
- L'utilisateur C a correctement modéré 79990 soumissions.
- 'spam' a été identifié comme 'spam' par l'utilisateur B et 'ham' par l'utilisateur C 2346 fois.
- 'ham' a été identifié comme 'spam' par l'utilisateur B et 'ham' par l'utilisateur C 33634 fois.
- Si l'utilisateur B dit que c'est du spam et que l'utilisateur C dit que c'est du jambon, ce sera du spam 6,52% du temps, et du jambon 93,48% du temps.
La probabilité ici est-elle raisonnable? Serait-ce la bonne façon de simuler le scénario?
14,4% que ce n'est pas un spam ;-) – Boldewyn