wir sollen für die Uni den Wert von Precision und Recall ermitteln und mit vorgegebenen Doctests testen.
Mein Problem ist, dass der erste Test in der for-Schleife das zweite if-Statement ignoriert und der Wert für Precision deshalb 1 ist. Beim zweiten Test kommt aber das richtige Ergebnis raus.
Der Fehler liegt ja vermutlich in dem zweiten if-statement, aber ich finde ihn einfach nicht.
Vielen Dank im Voraus

Code: Alles auswählen
import random
hams = "reminder deadline meet thanks thanks for tip deadline approaching".split(" ")
spams = "hot stock tip meet hot single".split(" ")
list1 = [('ham', 'ham')] * 58 + [('spam', 'ham')] * 21 + [('ham', 'spam')] * 9 + [('spam', 'spam')] * 12
random.shuffle(list1)
def precision(k, classes):
""" Calculate the precision of class `k` for the classifications in `classes`.
Each element in classes is a tuple. The first element in the tuple specifies
the classification of the classifier. The second element specifies the real
class. [2 points]
>>> round(precision('spam', list1), 4)
0.3636
>>> round(precision('ham', list1), 4)
0.8657
>>> round(precision('spam', []), 4)
0.0
"""
tp = 0
fp = 0
p = ""
if (k == "spam "):
p = "ham"
elif (k == "ham"):
p = "spam"
for i in range(len(classes)):
if classes[i] == (k, k):
tp += 1
if classes[i] == (k, p):
fp += 1
if classes == []:
return 0.0
return tp / (tp + fp)