Crash-Kurs mit Python und Machine Learning: Einstieg in Scikit-Learn
Ein Beispiel für einen ersten Einstieg in Machine Learning ist die Library Scikit-Learn für Python.
Wieso Scikit?
Scikit ist sicherlich nicht die Library mit der größten Auswahl an Machine-Learning-Algorithmen. Aber dafür ist die Dokumentation für Scikit sehr gut, und die Community auf Stackoverflow ebenfalls sehr lebendig, was vor allem Einsteigern hilft.
Ich persönlich habe Scikit im Rahmen meiner Masterarbeit zum ersten Mal genutzt. Ich wollte versuchen, Bot-Tweets über sprachliche Auffälligkeiten herauszufiltern, und habe dafür den Ansatz der Stylometrics verwendet. Das heißt also, dass zum Beispiel die Anzahl an bestimmten Satzzeichen, die Menge an verschiedenen Wörtern und die durchschnittliche Länge von Worten in Bot-Tweets anders ist als bei „normalen“ Tweets.
Für diesen Usecase habe ich verschiedene Algorithmen ausprobiert, darunter den klassische Decision Tree, Regressionsanalysen oder auch Support Vector Machine, das immer wieder als eines der besten Tools benannt wird. Am Ende bin ich jedoch bei einem Random Forrest Classifier gelandet, der eine Art Durchschnitt von Decision Trees ist, die aus Teilgruppen des Datensatzes gebildet werden.
Hier kurz mein Vorgehen Step by Step:
Step 0: Libraries laden
Wir benötigen die Python Libraries Pandas und Scikit-Learn, die am besten über die Command Line mit Pip Install installiert werden. Anschließend werden im Modul selbst folgendermaßen die Libraries geladen:
import pandas as pd import re #importing all machine learning libraries from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn import metrics from sklearn.metrics import confusion_matrix
Step1: Datensatz aufbauen
Da es hier hauptsächlich um Scikit geht, will ich nicht lange darüber sprechen, wie genau ich den Datensatz zusammengestellt habe: Ganz einfach gesagt besteht er zur Hälfte aus Tweets, die ich als von Bots gesendet klassifiziert habe, und zur Hälfte aus Tweets von normalen Usern. Jeder Tweet ist eine Reihe von Zahlen in einem CSV-Dokument.
testdata=pd.read_csv("botRELcounts.csv") (testdata.head())
Step 2: Datensatz aufteilen
Dann definiere ich meine abhängige Variable, speichere sie separat und spalte nochmal den Datensatz in zwei Teile. Einen Teil, mit dem ich den Algorithmus trainiere, und einen anderen Teil, mit dem ich seine Performance teste. Hier gibt es verschiedene Herangehensweisen. Ich benutze hier den klassischen Ansatz des Hold-Outs (X Prozent eines Datensatzes werden zurückgehalten und für das Prüfen genutzt). Es gibt aber auch die Möglichkeit von Cross-Validation. Der Datensatz wird dafür in Y Teile geteilt, jedes Mal bleibt ein anderer Teil als Hold-Out zurück, und mit dem Rest wird der Algorithmus trainiert. Am Ende wird dann über Y Durchläufe das Ergebnis gemittelt.
#loading in the dataset X = testdata #defining the dependent variable as the botornot column in the dataset y=X['botornot'] #removing user_id and bot_or_not column from the dataset with the independent variables del X['botornot'] del X['user_id'] (X.head()) #splitting the dataset X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1) #defining rf as the RandomForestClassifier clf=RandomForestClassifier()
Step 3: Datensatz einlesen, Algorithmus trainieren und Performance prüfen
Das alles ist erstaunlich einfach in Scikit-Learn. Es wird dafür schlichtweg der eine Teil des Datensatzes fürs Aufbauen des Algorithmus eingelesen und mit dem anderen eine Vorhersage getroffen. Anschließend lässt sich über die Metrics sehen, wie genau der Algorithmus ist.
Was Mut macht: Mit dem relativ einfachen Ansatz hatte ich bereits eine Genauigkeit von rund 70 Prozent im Vergleich zu einem rein zufälligen Raten mit einer Genauigkeit von 50 Prozent. Entsprechend sind die Beispiele, die folgen, aus diesem Projekt.
#train the dataset with fitting clf.fit(X_train, y_train) #then run the prediction with the rest of the dataset pred_test = clf.predict(X_test) print ("Mean absolute error:",metrics.mean_absolute_error(y_test,pred_test)) print ("Accuracy:",metrics.accuracy_score(y_test,pred_test)) print (confusion_matrix(y_test, pred_test))
Step 4: Vorhersagen machen
Nun ist das Modell aufgebaut, und entsprechend könnte man sich jetzt an einem neuen Datensatz von Tweets an Vorhersagen versuchen. Dazu muss man schlichtweg die Zeile
pred_test = clf.predict(X_test)
nochmals auf den neuen Datensatz anwenden. Wichtig: Der Datensatz muss genau so viele Variablen/Spalten haben und genau auf die gleiche Art und Weise angeordnet sein.
Viel Spaß beim Ausprobieren! Der ganze Code ist hinterlegt auf Github.