Maschinelles Lernen mit PySpark
Andrew Collier
Data Scientist, Fathom Data
Das ist eine Sammlung von Modellen.
Weisheit der Vielen — die kollektive Meinung einer Gruppe ist besser als die eines einzelnen Experten.
Vielfalt und Unabhängigkeit sind wichtig, weil die besten kollektiven Entscheidungen aus Meinungsverschiedenheit und Wettbewerb entstehen, nicht aus Konsens oder Kompromiss.
― James Surowiecki, The Wisdom of Crowds
Random Forest — ein Ensemble aus Entscheidungsbäumen
So entsteht Modellvielfalt:
Kein Baum im Wald sollte identisch sein.

Zurück zu den Autodaten: in den USA gefertigt (0.0) oder nicht (1.0).
Erstelle einen Random-Forest-Klassifikator.
from pyspark.ml.classification import RandomForestClassifier
forest = RandomForestClassifier(numTrees=5)
Fit auf die Trainingsdaten.
forest = forest.fit(cars_train)
Wie greifst du auf die Bäume im Forest zu?
forest.trees
[DecisionTreeClassificationModel (uid=dtc_aa66702a4ce9) of depth 5 with 17 nodes,
DecisionTreeClassificationModel (uid=dtc_99f7efedafe9) of depth 5 with 31 nodes,
DecisionTreeClassificationModel (uid=dtc_9306e4a5fa1d) of depth 5 with 21 nodes,
DecisionTreeClassificationModel (uid=dtc_d643bd48a8dd) of depth 5 with 23 nodes,
DecisionTreeClassificationModel (uid=dtc_a2d5abd67969) of depth 5 with 27 nodes]
Jeder davon kann eigene Vorhersagen machen.
Welche Vorhersagen erzeugt jeder Baum?
+------+------+------+------+------+-----+
|tree 0|tree 1|tree 2|tree 3|tree 4|label|
+------+------+------+------+------+-----+
| 0.0| 0.0| 0.0| 0.0| 0.0| 0.0| <- vollständige Übereinstimmung
| 1.0| 1.0| 0.0| 1.0| 0.0| 0.0|
| 0.0| 0.0| 0.0| 1.0| 1.0| 1.0|
| 0.0| 0.0| 0.0| 1.0| 0.0| 0.0|
| 0.0| 1.0| 1.0| 1.0| 0.0| 1.0|
| 1.0| 1.0| 0.0| 1.0| 1.0| 1.0|
| 1.0| 1.0| 1.0| 1.0| 1.0| 1.0| <- vollständige Übereinstimmung
+------+------+------+------+------+-----+
Verwende die Methode .transform(), um Konsensvorhersagen zu erzeugen.
+-----+----------------------------------------+----------+
|label|probability |prediction|
+-----+----------------------------------------+----------+
|0.0 |[0.8,0.2] |0.0 |
|0.0 |[0.4,0.6] |1.0 |
|1.0 |[0.5333333333333333,0.4666666666666666] |0.0 |
|0.0 |[0.7177777777777778,0.28222222222222226]|0.0 |
|1.0 |[0.39396825396825397,0.606031746031746] |1.0 |
|1.0 |[0.17660818713450294,0.823391812865497] |1.0 |
|1.0 |[0.053968253968253964,0.946031746031746]|1.0 |
+-----+----------------------------------------+----------+
Das Modell nutzt diese Features: cyl, size, mass, length, rpm und consumption.
Welche davon sind am wichtigsten bzw. unwichtigsten?
forest.featureImportances
SparseVector(6, {0: 0.0205, 1: 0.2701, 2: 0.108, 3: 0.1895, 4: 0.2939, 5: 0.1181})
Sieht so aus:
rpm ist am wichtigstencyl ist am unwichtigsten.Iterativer Boosting-Algorithmus:
Das Modell wird mit jeder Iteration besser.
Erstelle einen Gradient-Boosted-Tree-Klassifikator.
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier(maxIter=10)
Fit auf die Trainingsdaten.
gbt = gbt.fit(cars_train)
Vergleichen wir die drei Baumtypen auf Testdaten.
# AUC für Decision Tree
0.5875
# AUC für Random Forest
0.65
# AUC für Gradient-Boosted Tree
0.65
Beide Ensemble-Methoden schneiden besser ab als ein einzelner Entscheidungsbaum.
Maschinelles Lernen mit PySpark