Apprentissage automatique avec PySpark
Andrew Collier
Data Scientist, Fathom Data
C'est un ensemble de modèles.
La sagesse de la foule — l'avis collectif d'un groupe surpasse souvent celui d'un expert seul.
La diversité et l'indépendance sont essentielles, car les meilleures décisions collectives naissent du désaccord et de la confrontation, pas du consensus ni du compromis.
― James Surowiecki, The Wisdom of Crowds
Random Forest — un ensemble d'arbres de décision
Créer de la diversité entre modèles :
Aucun arbre de la forêt ne doit être identique.

Revenons aux voitures : fabriquée aux USA (0.0) ou non (1.0).
Créez un classifieur Random Forest.
from pyspark.ml.classification import RandomForestClassifier
forest = RandomForestClassifier(numTrees=5)
Ajustez-le sur l'ensemble d'entraînement.
forest = forest.fit(cars_train)
Comment accéder aux arbres de la forêt ?
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]
Chacun peut servir à produire des prédictions individuelles.
Quelles prédictions chaque arbre génère-t-il ?
+------+------+------+------+------+-----+
|tree 0|tree 1|tree 2|tree 3|tree 4|label|
+------+------+------+------+------+-----+
| 0.0| 0.0| 0.0| 0.0| 0.0| 0.0| <- accord parfait
| 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| <- accord parfait
+------+------+------+------+------+-----+
Utilisez la méthode .transform() pour générer des prédictions par consensus.
+-----+----------------------------------------+----------+
|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 |
+-----+----------------------------------------+----------+
Le modèle utilise ces variables : cyl, size, mass, length, rpm et consumption.
Laquelle est la plus ou la moins importante ?
forest.featureImportances
SparseVector(6, {0: 0.0205, 1: 0.2701, 2: 0.108, 3: 0.1895, 4: 0.2939, 5: 0.1181})
On dirait :
rpm est la plus importantecyl est la moins importante.Algorithme de boosting itératif :
Le modèle s'améliore à chaque itération.
Créez un classifieur Gradient-Boosted Tree.
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier(maxIter=10)
Ajustez-le sur l'ensemble d'entraînement.
gbt = gbt.fit(cars_train)
Comparons les trois types de modèles d'arbres sur les données de test.
# AUC for Decision Tree
0.5875
# AUC for Random Forest
0.65
# AUC for Gradient-Boosted Tree
0.65
Les deux méthodes d'ensemble font mieux qu'un simple arbre de décision.
Apprentissage automatique avec PySpark