Optimaler Schwellenwert für Spamassassin

An meine E-Mail-Adresse bekomme ich pro Tag 10 bis 15 Spam-Nachrichten. Das ist manchmal mehr als sinnvolle Nachrichten. Für den Serverseitigen Spam-Filter Spam Assassin muss ich einen Schwellenwert angeben. Den habe ich aus meinen E-Mails statistisch hergeleitet.

Auf dem Webserver läuft Spam Assassin, das schreibt in die Header eine Bewertung rein. Das sieht dann so aus:

X-Spam-Flag: YES
X-Spam-Level: ****
X-Spam-Status: Yes, score=4.8 required=4.0 tests=BAYES_05,DMARC_PASS,
    FACEBOOK_IMG_NOT_RCVD_FB,HEADER_FROM_DIFFERENT_DOMAINS,
    HTML_IMAGE_RATIO_02,HTML_MESSAGE,MIME_HTML_ONLY,SPF_HELO_PASS,SPF_PASS
    shortcircuit=no autolearn=no autolearn_force=no version=4.0.0
X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-14) on
    server07.spamfilter.manitu.net
X-Spam-Report: 
    * -0.0 SPF_PASS SPF: sender matches SPF record
    * -0.0 SPF_HELO_PASS SPF: HELO matches SPF record
    *  1.0 BAYES_05 BODY: Bayes spam probability is 1 to 5%
    *      [score: 0.0328]
    *  0.5 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail
    *      domains are different
    *  0.0 HTML_MESSAGE BODY: HTML included in message
    *  0.3 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area
    *  1.0 MIME_HTML_ONLY BODY: Message only has text/html MIME parts
    *  2.0 FACEBOOK_IMG_NOT_RCVD_FB Facebook hosted image but message not from
    *      Facebook
    * -0.0 DMARC_PASS DMARC pass policy

Man kann hier sehen, wie die Bewertung von 4.8 zustande gekommen ist. Je höher der Wert, desto eher ist es Spam. Mein E-Mail-Hoster empfiehlt den Schwellenwert bei 5.0 zu setzen und alles darüber in den Spam-Ordner zu verschieben. Da kam aber noch viel Spam an.

Ich habe mal so lange Spam aufgehoben, bis ich 124 Nachrichten zusammen hatte. Dann habe ich das analysiert. Ich habe aus tausenden guten Nachrichten und diesen 124 Spam-Nachrichten einmal die kumulative Verteilung abgeleitet. Man sieht, welcher Teil der Nachrichten jenen Score oder kleiner haben:

Wenn man bei 5 schaut, sieht man dass ungefähr 98 % der guten Nachrichten eine Bewertung von 5.0 oder kleiner haben. Beim Spam hat aber 22 % eine Bewertung 5.0 oder kleiner. Somit kommt bei einer Einstellung von 5.0 noch 22 % der Spam-Nachrichten in meinen Posteingang. Dafür geht fast keine gute Nachricht versehentlich in den Spam-Ordner.

Mithilfe der ROC Kurve, hier durch sklearn.metrics.roc_curve implementiert, habe ich die Wahr-Positiv- und Falsch-Positiv-Rate bestimmt. Man kann hier sehen, dass bei einem Wert von 5.0 die Wahrscheinlichkeit eine gute Nachricht (Ham) als Spam zu klassifizieren bei nur 5 % liegt. Allerdings ist die Detektionswahrscheinlichkeit für Spam nur so um 70 %, was echt mau ist.

Ich habe den Filter nun auf 4.0 gestellt. Dadurch habe ich grob 90 % Erkennung von Spam, habe aber nur um 10 % Wahrscheinlichkeit, dass eine E-Mail doch in den Spam-Filter rutscht.

Man kann sich noch die Güte der Klassifikation mit der ROC-Kurve anschauen. Da sind die beiden Raten gegenübergestellt:

Wir sehen, dass es Einstellungen in der unteren rechten Ecke gibt, bei dem die Spam-Erkennung bei 90 % ist, die Fehlerrate für gute Nachrichten aber nur 10 % ist. Das ist ein ganz guter Kompromiss. Man kann hier aber auch ablesen, welche anderen Kompromisse es so gibt.

So kann man anhand der eigenen E-Mails abschätzen welchen Schwellenwert man da gut nutzen kann.