Machine Learning avec PySpark
Andrew Collier
Data Scientist, Fathom Data
C'est un regroupement de modèles.
Sagesse de la foule — l'opinion collective d'un groupe surpasse celle d'un seul expert.
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
Forêt aléatoire — un ensemble d'arbres de décision
Créer de la diversité entre modèles :
Aucun arbre de la forêt ne devrait être identique.

Revenons aux données sur les voitures : fabriquée aux É.-U. (0.0) ou non (1.0).
Créez un classifieur Forêt aléatoire.
from pyspark.ml.classification import RandomForestClassifier
forest = RandomForestClassifier(numTrees=5)
Ajustez-le aux données 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 à faire 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| <- entente parfaite
| 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| <- entente parfaite
+------+------+------+------+------+-----+
Utilisez la méthode .transform() pour produire des prédictions consensuelles.
+-----+----------------------------------------+----------+
|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 caractéristiques : 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 constate :
rpm est la plus importantecyl est la moins importante.Algorithme de rehaussement itératif :
Le modèle s'améliore à chaque itération.
Créez un classifieur à Gradient-Boosted Trees.
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier(maxIter=10)
Ajustez-le aux données d'entraînement.
gbt = gbt.fit(cars_train)
Comparons les trois types de modèles d'arbres sur les données de test.
# AUC pour l'arbre de décision
0.5875
# AUC pour la forêt aléatoire
0.65
# AUC pour l'arbre à Gradient Boosted
0.65
Les deux méthodes d'ensemble font mieux qu'un simple arbre de décision.
Machine Learning avec PySpark