Construire un classificateur de spam: PySpark + MLLib vs SageMaker + XGBoost

Dans cet article, je vais d'abord vous montrer comment créer un classificateur de courrier indésirable à l'aide d'Apache Spark, de son API Python (appelée PySpark) et de divers algorithmes d'apprentissage automatique implémentés dans Spark MLLib.

Ensuite, nous utiliserons le nouveau service Amazon Sagemaker pour former, enregistrer et déployer un modèle XGBoost formé sur le même ensemble de données.

Tout le code est exécuté dans un bloc-notes Jupyter, disponible sur Github :)

PySpark + MLLib

La grande image

Notre ensemble de données brutes est composé de messages d’une ligne stockés dans deux fichiers:

  • le fichier ‘ham’: 4827 messages valides,
  • le fichier "spam": 747 messages.

Afin de classer ces messages, nous devons créer un ensemble de données intermédiaire avec deux classes. Pour ce faire, nous allons utiliser une technique simple mais efficace appelée Feature Hashing:

  • Pour chaque message de l'ensemble de données, nous commençons par déchiqueter ses mots en un nombre fixe de compartiments (par exemple, 1000).
  • Ensuite, nous construisons un vecteur indiquant des occurrences non nulles pour chaque mot: ce sont les fonctionnalités qui seront utilisées pour décider si un message est un spam ou non.
  • Pour un message valide, l’étiquette correspondante sera zéro, c’est-à-dire que le message n’est pas du spam. En conséquence, pour un message spam, l’étiquette en sera une.

Une fois que nous aurons terminé, notre jeu de données intermédiaire sera le suivant:

  • 4827 mots vecteurs étiquetés avec un zéro,
  • 747 mots vecteurs étiquetés avec un.

Nous allons le scinder à 80/20 pour l’entraînement et la validation et utiliser un certain nombre d’algorithmes de classification.

Pour la prédiction, le processus sera similaire: hacher le message, envoyer le vecteur mot au modèle et obtenir le résultat prévu.

Pas si difficile, hein? Mettons-nous au travail!

Construire le jeu de données intermédiaire

Notre première étape consiste à charger les deux fichiers et à diviser les messages en mots.

Ensuite, nous divisons chaque message en 1000 groupes de mots. Comme vous pouvez le constater, chaque message est transformé en un vecteur fragmenté contenant des nombres et des occurrences de compartiments.

L'étape suivante consiste à identifier nos fonctionnalités: 1 pour le spam, 0 pour le non-spam. Le résultat est une collection d'échantillons étiquetés prêts à être utilisés.

Enfin, nous avons fractionné le jeu de données 80/20 pour la formation et le test et mis en cache les deux RDD, car nous les utiliserons à plusieurs reprises.

Nous allons maintenant former un certain nombre de modèles avec cet ensemble de données. Pour mesurer leur précision, voici la fonction de notation que nous allons utiliser: prédisez simplement tous les échantillons dans l’ensemble de tests, comparez l’étiquette prédite avec l’étiquette réelle et calculez la précision.

Classer le jeu de données avec Spark MLLib

Nous allons utiliser les algorithmes de classification suivants:

  • Régression logistique avec l'optimiseur SGD,
  • Régression logistique avec l'optimiseur LBFGS,
  • Machines à vecteurs de support,
  • Arbres de décision,
  • Arbres boostés à gradient,
  • Forêts aléatoires,
  • Naive Bayes.

Régression logistique

Commençons par la régression logistique, la mère de tous les classificateurs.

Machines à vecteurs de support

Qu'en est-il des SVM, un autre algorithme populaire?

Des arbres

Essayons maintenant trois variantes de la classification arborescente. L'API est légèrement différente des précédents.

Naive Bayes

Enfin, essayons le classificateur Naives Bayes.

Il est largement supérieur à tous les autres algues. Essayons de prédire quelques échantillons réels.

Ils ont été prédits correctement. Cela ressemble à un très bon modèle. Maintenant, pourquoi ne pas essayer d’améliorer ces scores? J’ai utilisé des paramètres par défaut pour la plupart des algorithmes, il y a sûrement place à amélioration :) Vous trouverez des liens vers toutes les API dans le bloc-notes, alors n'hésitez pas à modifier!

C'est génial, mais…

Jusqu’à présent, nous n’avons travaillé que localement. Cela soulève quelques questions:

  1. Comment pourrions-nous nous entraîner sur un ensemble de données beaucoup plus vaste?
  2. Comment déploierions-nous notre modèle en production?
  3. comment pourrions-nous savoir si notre modèle évoluerait?

Ces questions - évolutivité et déploiement - constituent souvent le fléau des projets d’apprentissage automatique. Passer de «ça marche sur ma machine» à «ça marche en production à l'échelle 24/7» demande généralement beaucoup de travail.

Il y a de l'espoir. Continuer à lire :)

SageMaker + XGBoost

La résolution de ces problèmes est au cœur d’Amazon SageMaker. Revenons sur notre cas d'utilisation.

Algorithmes intégrés

Comme nous l'avons vu précédemment, il existe de nombreux algorithmes de classification. Choisir la “bonne” solution et sa “meilleure” mise en œuvre (bonne chance pour essayer de définir “bonne” et “meilleure”) n'est pas une tâche facile. Heureusement, SageMaker vous fournit plusieurs algorithmes intégrés. Ils ont été implémentés par Amazon, alors je suppose que vous pouvez vous attendre à ce qu’ils fonctionnent et s’adaptent correctement :)

Vous pouvez également apporter votre propre code, votre propre modèle pré-formé, etc. À discuter dans les prochains articles! Autres exemples SageMaker sur Github: régression, classification multi-classe, classification des images, etc.

Ici, nous allons utiliser XGBoost, une implémentation populaire de Gradient Boosted Trees pour construire un classificateur binaire.

En un mot, le SDK SageMaker nous permettra de:

  • créer une infrastructure gérée pour former XGBoost sur notre ensemble de données,
  • stocker le modèle dans SageMaker,
  • configurer un point de terminaison REST pour servir notre modèle,
  • créer une infrastructure gérée pour déployer le modèle sur le noeud final REST,
  • invoquer le modèle sur quelques échantillons.

Faisons cela!

Configuration du stockage et des données

Tout d’abord: S3 sera utilisé pour stocker l’ensemble de données et tous les artefacts (quelle surprise). Déclarons quelques choses, alors. Astuce: le compartiment S3 doit se trouver dans la même région que SageMaker.

Cette implémentation de XGBoost nécessite que les données soient au format CSV ou libsvm. Essayons ce dernier, copions les fichiers résultants sur S3 et récupérons le rôle SageMaker IAM.

Vous cherchez bien. Maintenant, configurons le travail de formation.

Mise en place du métier de formateur

Amazon SageMaker utilise des conteneurs Docker pour exécuter des tâches de formation. Nous devons choisir le nom du conteneur correspondant à la région dans laquelle nous nous trouvons.

Assez facile. Il est temps de configurer la formation. Nous allons:

  • Construire un classificateur binaire,
  • Récupérez les ensembles de données d'apprentissage et de validation au format libsvm à partir de S3,
  • Former pour 100 itérations une seule instance de m4.4xlarge.

C'est une bouchée, mais ne paniquez pas:

  • Les paramètres communs à tous les algorithmes sont définis dans la documentation de l'API CreateTrainingJob.
  • Les paramètres spécifiques à l’algorithme sont définis sur la page d’algorithme, par exemple. XGBoost.

Formation et sauvegarde du modèle

OK, organisons cette fête. Il est temps de commencer la formation.

6 minutes plus tard, notre modèle est prêt. Bien sûr, cela est un peu long pour un si petit ensemble de données :) Cependant, si nous avions des millions de lignes, nous aurions pu démarrer une tâche de formation sur plusieurs instances avec exactement le même code. Assez cool, hein?

OK, sauvegardons ce modèle dans SageMaker. Assez simple avec l'API CreateModel.

Création du point final

Voici la très bonne partie. Nous allons déployer ce modèle et l’invoquer. Oui, juste comme ça.

Tout d’abord, nous devons créer une configuration de point de terminaison avec l’API CreateEndpointConfig: nous utiliserons un seul m4.xlarge, 100% du trafic étant acheminé vers notre modèle (nous examinerons les tests A / B dans une publication ultérieure). .

Déploiement du modèle

Nous pouvons maintenant déployer notre modèle formé sur ce noeud final avec l'API CreateEndpoint.

Invocation du noeud final

Nous sommes maintenant prêts à appeler le noeud final. Prenons quelques échantillons (au format libsvm) de l’ensemble de données et prédisons-les.

Les deux échantillons sont prédits correctement. Woohoo.

Conclusion

Comme vous pouvez le constater, SageMaker vous aide à gérer vos projets Machine Learning de bout en bout: expérimentation de bloc-notes, formation de modèle, hébergement de modèle, déploiement de modèle.

Si vous souhaitez en savoir plus sur l’utilisation de SageMaker (et si vous ne pouvez pas attendre les inévitables publications à venir!), Voici un aperçu de ce que j’ai enregistré récemment.

C'est tout pour aujourd'hui. Merci beaucoup pour la lecture.

Ce message monstre a été écrit en écoutant à plusieurs reprises (c’était un message long) de ce légendaire spectacle Foreigner de 1981.