Maschinelles Lernen mit Python
Thomas Proisl
2015-09-16
Professur fr Korpuslinguistik
berblick
Ziele dieses Tutorials
Mini-Einfhrung in maschinelles Lernen
Problemstellungen
Lernverfahren
Vorgehensweisen
Machine learning demystified
Funktionsweise eines einfachen Klassifikationsverfahrens
Merkmalsextraktion
Bag-of-words model
DARIAH NLP-Pipeline
Maschinelles Lernen mit scikit-learn
Klassifikation
Clustering
Folien und Quellcode und Beispieldaten online verfgbar:
[Link]
Lernen_mit_Python.zip
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
Maschinelles Lernen was ist das?
Maschinelles Lernen (ML)
Maschinelle Lernverfahren knnen berall eingesetzt werden, wo Wissen
aus Daten gewonnen werden kann:
Spielen (Backgammon, Dame)
Erkennen gesprochener Sprache (Diktiersoftware, Komponenten in
sprachgesteuerter Software)
Astronomische Strukturen klassifizieren
Kreditkartenbetrug erkennen
Zielgruppenspezifische Werbung anzeigen
Trends an den Finanzmrkten vorhersagen
Krankheiten diagnostizieren
Auto fahren (Google Self-Driving Car)
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
ML fr textuelle Daten
Maschinelle Lernverfahren operieren auf Merkmalen von Texten1 um
Aussagen ber die Eigenschaften von unbekannten Texten machen zu
knnen.
Dafr werden Texte in der Regel als Vektoren quantifizierbarer Merkmale
betrachtet (! Merkmalsextraktion).
Grobe bersicht ber typische Problemstellungen:
berwachtes Lernen (supervised learning)
Klassifikation
Regression
Unberwachtes Lernen (unsupervised learning)
Clustering
Dimensionsreduktion
1
Text: Alle textuellen Daten, vom ganzen Roman bis hin zu einzelnen Abstzen oder Stzen
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
berwachtes Lernen
Wir haben annotierte Trainingsdaten und wollen weitere Daten automatisch
annotieren.
Klassifikation: Es handelt sich um kategorische Annotation, d.h. jeder
Trainingstext ist einer Kategorie oder Klasse zugeordnet. Beispiele:
Sprache, Autor, Genre
Regression: Es handelt sich um numerische Annotation, d.h. jedem
Trainingstext ist eine Zahl zugeordnet. Beispiele: Bewertungen,
Noten, Polaritt
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
Unberwachtes Lernen
Wir haben unannotierte Daten und wollen Strukturen darin finden.
Clustering: Entdecken von Gruppen hnlicher Texte, bspw. Texte des
gleichen Autors, inhaltlich hnliche Texte
Dimensionsreduktion: Hochdimensionale Reprsentation der Texte in einen
niederdimensionalen Raum projizieren, bspw. fr Visualisierung,
topic modelling
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
Vorgehensweise bei berwachtem Lernen
1. Daten sammeln und annotieren
2. Daten in ein Trainingsset und ein Testset aufteilen
3. Quantifizierbare Merkmale aus Daten extrahieren
4. Abhngig von Art der Annotation, Anzahl der Merkmale und Menge der
Trainingsdaten ein Lernverfahren auswhlen
5. Lernverfahren auf Trainingsdaten trainieren (lernen); Ergebnis: Modell
6. Modell auf Testset anwenden und prognostizierte Annotation mit
tatschlicher Annotation vergleichen (evaluieren)
7. Modell auf unbekannte Daten anwenden
Anstelle von Trainings- und Testset kann auch Kreuzvalidierung verwendet
werden.
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
Vorgehensweise bei Clustering
1. Daten sammeln
2. Quantifizierbare Merkmale aus Daten extrahieren
3. Abhngig von Eigenschaften des gewnschten Clusterings, Anzahl der
Merkmale und Menge der Trainingsdaten ein Clusteringverfahren
auswhlen
4. Daten clustern; Ergebnis: Clustering und Modell
5. Optional: Modell auf unbekannte Daten anwenden
Evaluation: Clustern von annotierten Daten
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
10
Welche Art von Lernverfahren eignet sich fr welches der
folgende Szenarien?
Wir haben eine Menge von Filmrezensionen, die eine Gesamtbewertung
des Films mit einer Schulnote zwischen 1 und 6 enthalten. Wir mchten
eine Sammlung alter Filmrezensionen automatisch mit einer solchen
Gesamtbewertung versehen.
Wir mchten automatisch erkennen, ob es sich bei einer E-Mail um Spam
handelt.
Bei einer Mitarbeiterumfrage wird in einem Freitextfeld nach dem
Kantinenessen gefragt. Wir mchten automatisch die Zufriedenheit der
Mitarbeiter erkennen.
Wir mchten den wahren Autor eines unter Pseudonym geschriebenen
Romans herausfinden.
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
11
Scikit-learn cheat-sheet
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
12
Naive Bayes: Ein sehr einfacher Klassifikator
Bedingte Wahrscheinlichkeiten und der Satz von Bayes (1)
Spam
Wir haben 75 Emails
30 von 75 Mails sind Spam als markiert
50 von 75 Mails enthalten das Wort
Viagra
20 Mails, die das Wort Viagra
enthalten, sind als Spam markiert
Viagra
Frage: Wie hoch ist die
Wahrscheinlichkeit, dass eine neue
Mail, die das Wort Viagra enthlt,
eine Spammail ist?
P ( A| B ) =
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
P (A \ B )
P (B |A)P (A)
=
P (B )
P (B )
14
Bedingte Wahrscheinlichkeiten und der Satz von Bayes (2)
Antwort:
P (Viagra|Spam) P (Spam)
P (Viagra)
20 30
30
75
=
50
75
20
=
50
= 0.4
Wir schtzen die Wahrscheinlichkeiten aus den Daten (relative
Hufigkeiten).
Simples Beispiel, fr das wir den Satz von Bayes eigentlich noch nicht
gebraucht htten.
P (Spam|Viagra) =
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
15
Bedingte Wahrscheinlichkeiten und der Satz von Bayes (3)
Je mehr Wrter wir betrachten (= Merkmale), desto komplexere bedingte
Wahrscheinlichkeiten mssen wir abschtzen:
P (Spam|Viagra) =
P (Spam|Viagra, Sex) =
P (Spam|Viagra, Sex, Penis) =
P (Viagra|Spam)P (Spam)
P (Viagra)
P (Sex|Spam, Viagra)P (Viagra|Spam)P (Spam)
P (Sex|Viagra)P (Viagra)
P (Penis|Spam, Viagra, Sex)P (Sex|Spam, Viagra)P (Viagra|Spam)P (Spam)
P (Penis|Viagra, Sex)P (Sex|Viagra)P (Viagra)
Jedes zustzliche Wort steigert die Komplexitt der Berechnung.
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
16
Naive-Bayes-Annahme
Vereinfachende Annahme (Naive-Bayes-Annahme): Vorkommen von
Wrtern sind vollkommen unabhngig voneinander.
Berechnung wird einfacher:
P (Viagra|Spam)P (Sex|Spam)P (Penis|Spam)
P (Spam|Viagra, Sex, Penis) =
P (Viagra)P (Sex)P (Penis)
Zum Abschtzen der Wahrscheinlichkeiten mssen wir nur
Worthufigkeiten in Klassen bestimmen.
Annahme ist zwar offensichtlich falsch, darauf aufbauende Klassifikation
funktioniert aber berraschend gut.
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
17
Naive-Bayes-Klassifikator
Grundlegende Idee: Wir ordnen einen Text der wahrscheinlichsten
Kategorie zu:
P (Spam|Viagra, Sex, Penis) =
P (Viagra|Spam)P (Sex|Spam)P (Penis|Spam)
P (Viagra)P (Sex)P (Penis)
P (Ham|Viagra, Sex, Penis) =
P (Viagra|Ham)P (Sex|Ham)P (Penis|Ham)
P (Viagra)P (Sex)P (Penis)
Nenner ist fr alle Kategorien gleich und kann weggelassen werden.
Naive-Bayes-Klassifikator verwendet die Wrter eines Textes.
Fr jede mgliche Kategorie: Multiplikation der relativen Hufigkeiten
dieser Wrter in den Trainingsdaten
Zuordnung der Kategorie mit dem hchsten Wert
Lernen ist die Abschtzung der bedingten Wahrscheinlichkeiten aus den
Trainingsdaten
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
18
Merkmalsextraktion
Das Bag-of-words-Modell (1)
Maschinelle Lernverfahren operieren in der Regel auf Vektoren von
numerischen Merkmalen.
Wir mssen unsere Texte also durch quantifizierbare Merkmale
reprsentieren.
Einfachste Methode ist das Bag-of-words-Modell:
Annahme: Ein Text ist eine ungeordnete Menge von Wrtern, d.h. genaue
Position oder Reihenfolge der Wrter kann vernachlssigt werden.
Ausschlaggebend ist nur die Hufigkeit der Wrter.
Text wird auf seine Frequenzliste reduziert.
Beispiel 1
Der Satz Rose is a rose is a rose is a rose wird, unter Vernachlssigung
der Gro-/Kleinschreibung, so dargestellt:
{"a": 3, "is": 3, "rose": 4}
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
20
Das Bag-of-words-Modell (2)
Die Stze Der Hund beit den Mann und Der Mann beit den Hund
sind fr das Bag-of-words-Modell identisch.
Einfache Erweiterung, die ein klein wenig Syntax in das Modell bringt:
Verwendung von N-Grammen.
Beispiel 3
Durch Hinzunahme von Bigrammen knnen die beiden Stze unterschieden
werden:
{"beit": 1,
"der hund":
{"beit": 1,
"der mann":
2015-09-16
Thomas Proisl
"den": 1, "der":
1, "hund beit":
"den": 1, "der":
1, "mann beit":
|
Professur fr Korpuslinguistik
1,
1,
1,
1,
"hund": 1, "mann": 1,
"beit den": 1, "den mann": 1}
"hund": 1, "mann": 1,
"beit den": 1, "den hund": 1}
Maschinelles Lernen mit Python
21
Wie kann der Output der DARIAH NLP-Pipeline integriert
werden?
Annotationsebenen:
Segmentierung:
Abstze
Stze
Tokens
Linguistische Annotation:
Lemmata
Part-of-Speech-Tags und vereinfachte POS-Tags
Morphologie: Kasus, Numerus, Genus, Person, . . .
Dependenzstruktur
Named Entities
Konstituentenstruktur
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
22
Ein paar Ideen
Lemmata anstatt oder zustzlich zu Tokens
Filtern nach POS-Tag (bspw. nur Inhaltswrter)
Hufigkeiten von POS-Tags
Hufigkeiten von Named Entities
Hufigkeiten von bestimmten morphologischen Informationen, bspw. fr
Verben Person und Numerus, Tempus
Kombination von Lemma und vereinfachtem POS-Tag: der_ART,
hund_NN, beien_V, der_ART, mann_NN
Kombination von bestimmten Lemmata mit bestimmten morphologischen
Informationen, bspw. Numerus fr alle Substantive: mann_sg
ber Dependenzrelation verbundene Tokens an Stelle von Bigrammen:
hund der, beit hund, beit mann, mann den
Optional mit Label: NK(hund, der), SB(beit, hund), OA(beit, mann),
OA(mann, den)
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
23
Weitere einfach zu extrahierende Merkmale
Hufigkeiten von bestimmten Interpunktionszeichen (!?)
Hufigkeit von wrtlicher Rede
Durchschnittliche Satz- und Absatzlnge
Type-Token-Verhltnis
Verhltnis von Interpunktionszeichen zu Wrtern
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
24
Maschinelles Lernen mit scikit-learn
Installation
Installationsanweisungen unter
[Link] bspw.:
pip install -U numpy scipy scikit-learn
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
26
Datenorganisation
Fr unsere Beispiele: Alle Texte einer Klasse in einem Unterverzeichnis;
Verzeichnisname = Klassenname; Dateiname egal
Daten/
|-- Klasse_1
| |-- [Link]
| |-- [Link]
| -- [Link]
|-- Klasse_2
| |-- [Link]
| |-- [Link]
| -- [Link]
|-- Klasse_3
| |-- [Link]
| |-- [Link]
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
27
Unser Spielzeugdatenset
Je acht Romane von sechs verschiedenen Autoren
Plaintext (8x6)
Ausgabe der DARIAH NLP-Pipeline (8x6_output)
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
28
Laden der Daten
Datenset laden, dabei Kodierung richtig angeben:
from [Link] import load_files
corpus = load_files("data/8x6", encoding="utf-8")
corpus ist ein Bunch, eine Menge von Datenfeldern:
filenames: Liste der Dateinamen (reproduzierbar gemischt)
data: Liste von Strings mit den Dateiinhalten
target_names: Liste der Namen aller Klassen
target: Liste der den Dateien zugeordneten Klassen
Liste der Felder:
print([Link]())
Kann als Dictionary oder als Objekt angesprochen werden:
print(corpus["target_names"])
print([Link])
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
29
Aufteilung in Trainings- und Testset
Reproduzierbare Aufteilung in ein Trainings- und Testset
n_iter: Anzahl der verschiedenen Aufteilungen; wir wollen nur eine
test_size: Welcher Anteil der Daten soll zum Testen verwendet werden (50%)
random_state: Wenn nicht None ist die Aufteilung reproduzierbar
from sklearn.cross_validation import StratifiedShuffleSplit
sss = StratifiedShuffleSplit([Link], n_iter=1, test_size=0.5, random_state=0)
sss ist ein Iterator, uns interessiert nur die erste mgliche Aufteilung:
train_index, test_index = list(sss)[0]
data und target aufteilen ([Link] ist ein numpy Array):
data_train = [[Link][_] for _ in train_index]
data_test = [[Link][_] for _ in test_index]
target_train = [Link][train_index]
target_test = [Link][test_index]
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
30
Merkmalsextraktion
Tokenisierung und Bag-of-words-Modell
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
data_train_counts = count_vect.fit_transform(data_train)
Relative statt absolute Hufigkeiten (term-frequencies)
norm="l1": Termfrequenzen summieren sich zu 1
norm="l2": Dokumentvektor hat die euklidische Lnge 1 (Standardwert)
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer(norm="l2", use_idf=False)
data_train_tfidf = tfidf_transformer.fit_transform(data_train_counts)
Testdaten transformieren (transform() statt fit_transform()!)
data_test_counts = count_vect.transform(data_test)
data_test_tfidf = tfidf_transformer.transform(data_test_counts)
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
31
Tf-Idf
Abkrzung fr term frequency-inverse document frequency
tf : Hufigkeit eines Wortes in einem Text
df : In wie vielen Texten kommt ein Wort vor
idf = Anzahldf Texte
Intuition: Ein Wort ist wichtig fr einen Text, wenn es in diesem Text oft
vorkommt (hohe tf ), und unwichtig, wenn es selten vorkommt (niedrige tf .
Ein Wort ist wichtig (spezifisch), wenn es in wenigen Texten vorkommt
(hohe idf ), und unwichtig wenn es in vielen verschiedenen oder allen
Texten vorkommt (niedrige idf ).
Multiplikation von tf und idf
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
32
Klassifikator trainieren und evaluieren
Naive-Bayes-Klassifikator trainieren:
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
[Link](data_train_tfidf, target_train)
Testdaten klassifizieren:
predicted = [Link](data_test_tfidf)
Ergebnis evaluieren:
from sklearn import metrics
print(metrics.accuracy_score(target_test, predicted))
print(metrics.classification_report(target_test, predicted,
target_names=corpus.target_names))
print(metrics.confusion_matrix(target_test, predicted))
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
33
Schnittstellen sind immer gleich
fit(): Modell wird angepasst
transform(): Modell wird auf Daten angewandt
fit_transform(): Kombination von fit() und transform()
predict(): Anstelle von transform() bei Lernern
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
34
Pipelines
Pipelines
Mit Pipelines knnen mehrere Verarbeitungsschritte einfach kombiniert
werden.
Pipeline konfigurieren:
text_clf = Pipeline([(vect, CountVectorizer()),
(tfidf, TfidfTransformer(norm="l2", use_idf=False)),
(clf, MultinomialNB()),
])
Pipeline trainieren:
text_clf.fit(data_train, target_train)
Testdaten klassifizieren:
predicted = text_clf.predict(data_test)
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
36
Komponenten hinzufgen und austauschen
Einzelne Komponenten knnen dank einheitlicher Schnittstellen leicht
hinzugefgt oder ausgetauscht werden.
Naive Bayes kommt nicht gut mit extrem vielen Merkmalen zurecht,
Beschrnkung auf 200 beste Merkmale:
text_clf = Pipeline([(vect, CountVectorizer()),
(tfidf, TfidfTransformer(norm="l2", use_idf=False)),
(kbest, SelectKBest(chi2, k=200)),
(clf, MultinomialNB()),
])
SVMs kommen gut mit sehr vielen Merkmalen zurecht: Verwenden von
Uni- und Bigrammen, lineare Support Vector Machine:
from [Link] import LinearSVC
text_clf = Pipeline([(vect, CountVectorizer(ngram_range=(1, 2))),
(tfidf, TfidfTransformer(norm="l2", use_idf=False)),
(clf, LinearSVC()),
])
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
37
Verwendung der DARIAH NLP-Pipeline
Das Ausgabeformat muss geparst werden:
class DARIAHAnnotationExtractor(BaseEstimator, TransformerMixin):
"""Convert tab-separated values with header line to dict of columns"""
def fit(self, x, y=None):
return self
2015-09-16
def transform(self, texts):
features = [Link](list)
for text in texts:
# parse tsv format (list of rows)
table = [[c for c in [Link]("\t")] for r in [Link]()]
# extract header line
header = table[0]
# convert to list of columns
columns = list(zip(*table[1:]))
# store in dict
for name, column in zip(header, columns):
features[name].append(column)
return features
|
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
38
Kombination von Merkmalen
Verwendung von beliebigen Tupeln von Merkmalen (auch 1-Tupel):
class FeatureCombiner(BaseEstimator, TransformerMixin):
"""Convert to dictionary of feature tuples"""
def __init__(self, keys=[]):
[Link] = keys
def fit(self, x, y=None):
return self
def transform(self, data_dict):
# extract desired columns (features)
columns = [data_dict[k] for k in [Link]]
# combine features into tuples
return [[Link](zip(*text)) for text in zip(*columns)]
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
39
Beispielpipelines
Bag-of-words-Modell mit Tokens:
text_clf = Pipeline([(extractor, DARIAHAnnotationExtractor()),
(combiner, FeatureCombiner(["Token"])),
(vect, DictVectorizer()),
(tfidf, TfidfTransformer()),
(clf, LinearSVC()),
])
Hier mit (Lemma, CPOS)-Tupeln (Kombination von Lemma und CPOS in
ein einziges Merkmal):
text_clf = Pipeline([(extractor, DARIAHAnnotationExtractor()),
(combiner, FeatureCombiner(["Lemma", "CPOS"])),
(vect, DictVectorizer()),
(tfidf, TfidfTransformer()),
(clf, LinearSVC()),
])
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
40
FeatureUnion (1)
FeatureUnion kombiniert mehrere unabhngige Transformer in einen
Transformer werden unabhngig voneinander ausgefhrt, Ausgabe wird
konkateniert
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
41
FeatureUnion (2)
text_clf = Pipeline([(extractor, DARIAHAnnotationExtractor()),
(union, FeatureUnion(
transformer_list=[
# Bag-of-words-Modell
(bow, Pipeline([
(combiner, FeatureCombiner(["Lemma", "CPOS"])),
(vect, DictVectorizer()),
(tfidf, TfidfTransformer()),
])),
# POS-Tags
(bopos, Pipeline([
(combiner, FeatureCombiner(["POS"])),
(vect, DictVectorizer()),
(tfidf, TfidfTransformer(use_idf=False)),
])),
])),
(normalizer, Normalizer()),
(clf, LinearSVC()),
])
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
42
Verwendung von Dependenzrelationen (1)
Wir wollen Tripel bestehend aus Dependenzrelation, Governor und
Dependent
Eigene Transformer-Klasse erstellen:
class DependencyTupleCombiner(BaseEstimator, TransformerMixin):
"""Convert to dictionary of (relation, governor, dependent) tuples"""
def __init__(self, lemma=True):
[Link] = lemma
def fit(self, x, y=None):
return self
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
43
Verwendung von Dependenzrelationen (2)
Fortsetzung:
def transform(self, data_dict):
features = []
# use tokens or lemmata
lemma_or_token = "Lemma" if [Link] else "Token"
# extract necessary columns
columns = [data_dict[k] for k in ["TokenId", lemma_or_token,
"DependencyHead", "DependencyRelation"]]
for text in zip(*columns):
# convert to rows
rows = list(zip(*text))
# do some arithmetic and extract token/lemma for DependencyHead
dependency_tuples = [(r[3], rows[i + (int(r[2]) - int(r[0]))][1], r[1])
for i, r in enumerate(rows) if r[2] != "_"]
[Link]([Link](dependency_tuples))
return features
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
44
Clustering
k-Means (1)
Daten mssen nur geladen werden, Aufteilung in Trainings- und Testset
nicht zwingend ntig:
corpus = load_files("data/8x6_output", encoding="utf-8")
Anstelle eines Klassifikators kann ein Clusterverfahren in die Pipeline
eingebunden werden, bspw. k-Means.
k-Means teilt die Daten in k Gruppen auf, d.h. Anzahl der Cluster muss
vorher bekannt sein (oder durch Probieren gefunden werden).
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
46
k-Means (2)
text_clst = Pipeline([(extractor, DARIAHAnnotationExtractor()),
(union, FeatureUnion(
transformer_list=[
# Bag-of-words-Modell
(bow, Pipeline([
(combiner, FeatureCombiner(["Lemma", "CPOS"])),
(vect, DictVectorizer()),
(tfidf, TfidfTransformer()),
])),
# POS-Tags
(bopos, Pipeline([
(combiner, FeatureCombiner(["POS"])),
(vect, DictVectorizer()),
(tfidf, TfidfTransformer(use_idf=False)),
])),
])),
(normalizer, Normalizer()),
(clst, KMeans(n_clusters=6))
])
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
47
Hierarchisches Clustering
Anfangs ist jeder Text in einem eigenen Cluster.
Schrittweise werden die hnlichsten Cluster verschmolzen.
Verschiedene hnlichkeitsmae mglich.
Implementierung in scikit-learn verlangt vorgegebene Anzahl Cluster
([Link] kann auch explorativ verwendet werden).
AgglomerativeClustering()
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
48
Delta-Mae
Auswahl der n hufigsten Wrter, Skalierung ($z$-Werte), optional
Normalisierung, Abstandsma
Burrowss Delta: Keine Normalisierung, Manhattan-Distanz
Burrowss Delta mit Vektornormalisierung: L1-Normalisierung,
Manhattan-Distanz
Cosine Delta: Keine Normalisierung, Cosinus-Distanz
AgglomerativeClustering(n_clusters=6, affinity="cosine", linkage="complete")
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
49
Visualisierung mit matplotlib (1)
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
50
Visualisierung mit matplotlib (2)
Zweidimensionale Reprsentation der Daten durch Multidimensional
Scaling (MDS); MDS versucht euklidische Abstnde beizubehalten:
from sklearn import manifold
twodim = [Link]().fit_transform(data)
Daten plotten; Farben markieren Cluster, Beschriftungen tatschliche
Klassen:
import [Link] as plt
fig, ax = [Link]()
[Link](twodim[:, 0], twodim[:, 1], c=clusters)
for i, target in enumerate([Link]):
[Link](corpus.target_names[target].split(",")[0],
(twodim[:, 0][i], twodim[:, 1][i]), fontsize="small")
[Link]("[Link]")
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
51
Weitere Features von scikit-learn
Features
Merkmalsextraktion: CountVectorizer kann weitreichend konfiguriert
werden
Merkmalsauswahl: Varianz, rekursive Merkmalseliminierung,
Merkmalsauswahl mit Hilfe linearer Modelle (bspw. lineare SVM)
Dimensionsreduktion: Hauptkomponentenanalyse (PCA), Manifold
Learning
Weitere berwachte Lernverfahren: Generalisierte lineare Modelle,
Diskriminanzanalyse, SVMs mit verschiedenen Kerneln, Nearest
Neighbors, Entscheidungsbume, . . .
Ensemble-Methoden um mehrere berwachte Modelle zu kombinieren,
bspw. Random Forests
Kreuzvalidierung
Parameter Tuning: Systematisches Durchprobieren von
Parameterkombinationen mit GridSearchCV
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
53
Andere interessante Module
gensim fr Topic Modelling: Latent Semantic Indexing, Latent Dirichlet
Allocation, Hierarchical Dirichlet Processes, Deep Learning (word2vec,
paragraph2vec)
matplotlib fr die Visualisierung
PyStruct fr strukturiertes Lernen
seqlearn fr Sequenzklassifikation
2015-09-16
Thomas Proisl
Professur fr Korpuslinguistik
Maschinelles Lernen mit Python
54