Fake News mit Scikit-Learn erkennen
Dieses scikit-learn-Tutorial zeigt dir Schritt für Schritt, wie du mit Bayes-Modellen einen Fake-News-Klassifizierer baust.
· 15 Min. lesen
Entdecke KI
Ähnlich
Tutorial
Python-Anweisungen IF, ELIF und ELSE
In diesem Tutorial lernst du ausschließlich Python if else-Anweisungen kennen.
Tutorial
Python-Arrays
Python-Arrays mit Code-Beispielen. Lerne noch heute, wie du mit Python NumPy Arrays erstellen und ausdrucken kannst!
Tutorial
if…elif…else in Python Tutorial
Lerne, wie du in Python if…elif…else-Anweisungen erstellst.

Das Erkennen sogenannter „Fake News“ ist alles andere als trivial. Zuerst gilt es zu definieren, was Fake News überhaupt sind – ein Begriff, der längst politisch aufgeladen ist. Selbst wenn eine Definition steht, musst du echte und falsche Nachrichten sammeln und korrekt labeln (idealerweise zu ähnlichen Themen, um klare Unterschiede sichtbar zu machen). Anschließend brauchst du sinnvolle Features, um echte von falschen Meldungen zu trennen.
Für einen tieferen Einblick empfehle ich den Beitrag von Miguel Martinez-Alvarez: „How can Machine Learning and AI Help Solve the Fake News Problem“.
Etwa zur selben Zeit bin ich auf einen Open-Data-Science-Post gestoßen, der zeigt, wie man einen erfolgreichen Fake-News-Detector mit Bayes-Modellen baut. Die Autorin bzw. der Autor hat sogar ein Repository mit gelabelten Beispielen für Fake und Real bereitgestellt. Ich war neugierig, ob ich die Ergebnisse leicht reproduzieren und anschließend verstehen kann, was das Modell tatsächlich gelernt hat.
In diesem Tutorial gehst du einige meiner ersten Schritte durch und schaust, ob du einen funktionierenden Fake-News-Detector aufbauen kannst.
Tipp: Wenn du mehr über die Grundlagen der Natural Language Processing (NLP) lernen möchtest, schau dir den Kurs Natural Language Processing Fundamentals in Python an.
Datenexploration
Zu Beginn solltest du immer einen kurzen Blick auf die Daten werfen und ein Gefühl für den Inhalt bekommen. Nutze dafür einen Pandas DataFrame, prüfe die Form, wirf einen Blick auf den Kopf der Tabelle und wende nötige Transformationen an.
Trainingsdaten extrahieren
Jetzt, wo der DataFrame näher an dem ist, was du brauchst, trennst du die Labels ab und legst Trainings- und Testdaten an.
Für dieses Notebook habe ich mich auf längere Artikeltexte konzentriert. Da ich Bag-of-Words und Term Frequency–Inverse Document Frequency (TF-IDF) für die Feature-Extraktion nutzen wollte, war das eine gute Wahl. Längere Texte erhöhen die Chance, unterscheidende Wörter und Features für echte und falsche Meldungen zu finden.
Vektorisierer-Klassifizierer bauen
Jetzt, wo Trainings- und Testdaten bereitstehen, baust du deine Klassifizierer. Um zu prüfen, ob Wörter und Tokens in den Artikeln einen starken Einfluss darauf haben, ob News als Fake oder Real eingestuft werden, startest du mit
CountVectorizerundTfidfVectorizer.Im Beispiel ist für den TF-IDF-Vektorisierer
tfidf_vectorizermit dem Argumentmax_dfein Schwellwert von.7gesetzt. Dadurch werden Wörter entfernt, die in mehr als 70% der Artikel vorkommen. Außerdem entfernt der eingebaute Parameterstop_wordsenglische Stoppwörter, bevor Vektoren erzeugt werden.Es gibt viele weitere Parameter. Details findest du in der scikit-learn-Dokumentation zu
TfidfVectorizerundCountVectorizer.Jetzt, da du Vektoren hast, kannst du dir die Vektor-Features ansehen, die in
count_vectorizerundtfidf_vectorizergespeichert sind.Fallen Probleme auf? (Ja!)
Im Datensatz finden sich offensichtlich Kommentare, Maßeinheiten oder andere unsinnige Tokens sowie mehrsprachige Artikel. Normalerweise würdest du mehr Zeit ins Preprocessing und in die Rauschunterdrückung investieren. Da dieses Tutorial aber nur ein kleines Proof of Concept zeigt, schauen wir, ob das Modell das Rauschen überwindet und trotz dieser Probleme korrekt klassifiziert.
Intermezzo: Count- versus TF-IDF-Features
Ich wollte wissen, ob Count- und TF-IDF-Vektorisierer unterschiedliche Tokens extrahiert haben. Um die Features zu vergleichen, kannst du die Vektordaten wieder in einen DataFrame zurückschreiben und in Python bequem vergleichen.
Wie die folgenden Zellen zeigen, extrahieren beide Vektorisierer dieselben Tokens, allerdings mit unterschiedlichen Gewichten. Vermutlich ließe sich das Ergebnis durch Anpassung von
max_dfundmin_dfbeim TF-IDF-Vektorisierer verändern.5 rows × 56922 columns
5 rows × 56922 columns
Modelle vergleichen
Jetzt ist es Zeit, deine Modelle zu trainieren und zu testen.
Wir starten mit einem NLP-Klassiker:
MultinomialNB. Damit kannst du TF-IDF gegen Bag-of-Words vergleichen. Meine Intuition: Bag-of-Words (alsoCountVectorizer) performt mit diesem Modell besser. (Warum die Multinomialverteilung besonders gut mit Ganzzahlen funktioniert, erklärt diese knackige Referenz aus einem UPenn-Statistikkurs.)Ich finde Confusion-Matrizen für den Vergleich besonders anschaulich. Mithilfe der scikit-learn-Dokumentation habe ich schnell lesbare Confusion-Matrizen gebaut. Eine Confusion-Matrix zeigt die korrekt erkannten Labels auf der Hauptdiagonalen (von oben links nach unten rechts). Die anderen Zellen zeigen Fehlklassifikationen, oft als False Positives oder False Negatives bezeichnet. Je nach Problem kann eines davon kritischer sein. Beim Fake-News-Problem wäre es etwa wichtig, echte Artikel nicht als Fake zu labeln. Dann sollten wir die Metriken gegebenenfalls entsprechend gewichten.
Neben Confusion-Matrizen bietet scikit-learn viele weitere Möglichkeiten, Modelle zu visualisieren und zu vergleichen. Beliebt ist z. B. die ROC-Kurve. Viele weitere Evaluationsmethoden findest du im Metrics-Modul.
Und tatsächlich: Ganz ohne Parameter-Tuning schlägt dein Count-vektorisierter Trainingssatz
count_traindie TF-IDF-Vektoren sichtbar!Lineare Modelle testen
Es gibt viele gute Beiträge dazu, warum lineare Modelle mit TF-IDF-Vektorisierern gut funktionieren (sieh dir etwa word2vec für Klassifikation, die SVM-Referenz in der scikit-learn-Textanalyse und vieles mehr an).
Also SVM verwenden, richtig?
Kürzlich habe ich mir Victor Lavrenkos Lecture zur Textklassifikation angesehen. Darin vergleicht er Passive-Aggressive-Klassifizierer mit linearen SVMs für Textklassifikation. Wir testen diesen Ansatz (er ist teilweise deutlich schneller, hat aber Nachteile beim dauerhaften Lernen) auf unserem Fake-News-Datensatz.
Wow!
Beeindruckend. Die Confusion-Matrix sieht anders aus, und das Modell erkennt Fake News etwas besser. Wir können testen, ob sich durch Tuning des
alpha-Werts beiMultinomialNBähnliche Ergebnisse erzielen lassen. Für eine gründlichere Suche kannst du auch Grid Search zum Parametertuning einsetzen.Noch nicht ganz … An diesem Punkt wäre es spannend, über alle Klassifizierer hinweg Parameter zu tunen oder weitere Bayes-Klassifizierer in scikit-learn auszuprobieren. Du könntest auch eine Support Vector Machine (SVM) testen, um zu sehen, ob sie den Passive-Aggressive-Klassifizierer übertrifft.
Mich interessiert allerdings mehr, was das Passive-Aggressive-Modell tatsächlich gelernt hat. Also ab zur Introspektion.
Modelle inspizieren
Also ist das Fake-News-Problem gelöst, ja? Wir haben auf meinem Datensatz 93% Genauigkeit erreicht – Feierabend.
Natürlich nicht. Ich bin bei diesen Ergebnissen sehr vorsichtig, angesichts des vielen Rauschens in den Features. Es gibt auf StackOverflow eine großartige Erklärung samt Funktion, um die Vektoren zu finden, die Labels am stärksten beeinflussen. Sie funktioniert nur für binäre Klassifikation (zwei Klassen) – was hier gut passt, da wir FAKE oder REAL haben.
Mit deinem am besten performenden Klassifizierer und dem TF-IDF-Vektordatensatz (
tfidf_vectorizer) sowie dem Passive-Aggressive-Klassifizierer (linear_clf) inspizierst du die Top-30-Vektoren für Fake und Real:Das geht auch recht simpel mit wenigen Zeilen Python, indem du die Koeffizienten mit den Feature-Namen „zippst“ und dir Anfang und Ende der Liste ansiehst.
Offenbar deuten bestimmte Wörter in den Top-Fake-Features auf politische Intention und Quelle hin (etwa corporate oder establishment).
Außerdem tauchen in echten Nachrichten Formen von „to say“ häufiger auf – vermutlich, weil in Zeitungen und seriösen Medien Quellen direkt zitiert werden („German Chancellor Angela Merkel said …“).
Um die vollständige Liste aus deinem aktuellen Klassifizierer zu exportieren und jeden Token anzusehen (oder Tokens zwischen Klassifizierern zu vergleichen), kannst du sie so sichern:
Intermezzo: HashingVectorizer
Ein weiterer Vektorisierer für Textklassifikation ist der
HashingVectorizer.HashingVectorizerbenötigen weniger Speicher und sind schneller (sie sind spärlich besetzt und verwenden Hashes statt Tokens), sind aber schwerer zu inspizieren. Mehr zu Vor- und Nachteilen findest du in der scikit-learn-Dokumentation zuHashingVectorizer.Probier ihn aus und vergleiche die Ergebnisse mit den anderen Vektorisierern. Er schneidet recht ordentlich ab – besser als der TF-IDF-Vektorisierer mit
MultinomialNB(was aus ähnlichen Gründen zu erwarten ist, warumCountVectorizeroft besser ist), aber schlechter als TF-IDF in Kombination mit dem linearen Passive-Aggressive-Algorithmus.Fazit
War dein Fake-News-Klassifizierer ein voller Erfolg? Eher nicht.
Hattest du die Gelegenheit, einen neuen Datensatz auszuprobieren, ein paar NLP-Modelle zu testen und zu inspizieren, wie gut sie funktionieren? Ja.
Wie erwartet, ist es zu simpel, Fake News nur mit Bag-of-Words- oder TF-IDF-Vektoren zu definieren – besonders bei einem mehrsprachigen Datensatz voller Rauschen. Hättest du nicht hineingeschaut, was dein Modell gelernt hat, könntest du denken, es hätte etwas Sinnvolles erfasst. Merke dir also: Modelle immer so gut wie möglich inspizieren.
Mich würde interessieren, ob du weitere Muster im Datensatz findest, die ich übersehen habe. Ich plane einen Folgebeitrag dazu, wie sich verschiedene Klassifizierer in Bezug auf wichtige Features unterscheiden – auf meinem Blog. Wenn du etwas Spannendes findest, teile es gern in den Kommentaren oder melde dich auf Twitter (ich bin @kjam).
Ich hoffe, du hattest Spaß beim Entdecken eines neuen NLP-Datensatzes!
Schau dir auch DataCamps Python Machine Learning: Scikit-Learn Tutorial an.