Construir un classificador de correu brossa: PySpark + MLLib vs SageMaker + XGBoost

En aquest article, us mostraré primer com crear un classificador de correu brossa mitjançant Apache Spark, la seva API de Python (també coneguda com PySpark) i una gran varietat d'algorismes d'aprenentatge automàtic implementats a Spark MLLib.

A continuació, farem servir el nou servei d’Amazon Sagemaker per entrenar, guardar i desplegar un model XGBoost format al mateix conjunt de dades.

Tot el codi funciona en un quadern Jupyter, disponible a Github :)

PySpark + MLLib

La gran imatge

El nostre conjunt de dades brutes es compon de missatges d’una línia que s’emmagatzemen en dos fitxers:

  • el fitxer "ham": 4827 missatges vàlids,
  • el fitxer "spam": 747 missatges.

Per classificar aquests missatges, hem de crear un conjunt de dades intermèdies amb dues classes. Per a aquest propòsit, farem servir una tècnica senzilla però eficient, anomenada Feature Hashing:

  • Per a cada missatge del conjunt de dades, primer hem escrit les seves paraules en un nombre fix de cubetes (per exemple, 1000).
  • Aleshores, construïm un vector que indica que no hi ha cap aparició per a cada paraula: aquestes són les funcions que s’utilitzaran per decidir si un missatge és spam o no.
  • Per a un missatge vàlid, l’etiqueta corresponent serà zero, és a dir, el missatge no és correu brossa. Per tant, per a un missatge de correu brossa, l’etiqueta serà una.

Un cop acabat, el nostre conjunt de dades intermèdies serà:

  • 4827 vectors de paraules etiquetades amb un zero,
  • 747 vectors de paraules etiquetats amb un.

La dividirem per a la formació per a la formació i la validació de 80/20 i s'executaran mitjançant diversos algoritmes de classificació.

Per a la predicció, el procés serà similar: hash el missatge, envia el vector de paraules al model i obté el resultat previst.

No és tan difícil, oi? Comencem a treballar

Construcció del conjunt de dades intermèdies

El nostre primer pas és carregar tots dos fitxers i dividir els missatges en paraules.

Aleshores, anem creant cada missatge en 1.000 cubs de paraula. Com podeu veure, cada missatge es converteix en un vector escàs amb números de cubs i ocurrències.

El següent pas és etiquetar les nostres funcions: 1 per a correu brossa, 0 per a correu brossa. El resultat és una col·lecció de mostres etiquetades que estan a punt per al seu ús.

Finalment, dividim el conjunt de dades 80/20 per a formació i prova i emmagatzemem en memòria cau tots els RDD ja que els utilitzarem repetidament.

Ara entrenarem diversos models amb aquest conjunt de dades. Per mesurar la seva precisió, aquí teniu la funció de puntuació que farem servir: només prediu totes les mostres del conjunt de proves, compare l’etiqueta prevista amb l’etiqueta real i calcula la precisió.

Classificació del conjunt de dades amb Spark MLLib

Utilitzarem els algoritmes de classificació següents:

  • Regressió logística amb l’optimitzador SGD,
  • Regressió logística amb l’optimitzador LBFGS,
  • Suport a màquines vectorials,
  • Arbres de decisió,
  • Arbres potenciats en gradient,
  • Boscos aleatoris,
  • Bayes naïf.

Regressió logística

Comencem amb la regressió logística, la mare de tots els classificadors.

Suport a màquines vectorials

Què passa amb els SVM, un altre algorisme més popular?

Arbres

Provem ara tres variants de classificació basada en arbres. L'API és lleugerament diferent de les algues anteriors.

Bayes naïf

Per últim, però no menys important, provem el classificador Naives Bayes.

És molt superior a la resta d’algues. Intentem predir un parell de mostres de la vida real.

Es preveien correctament. Això sembla un model força bo. Ara, per què no intenteu millorar aquestes puntuacions? He utilitzat paràmetres predeterminats per a la majoria dels algorismes, segurament hi ha marge de millora. Trobareu enllaços a totes les API al bloc de notes, així que no dubteu a retocar-lo.

Això és fantàstic, però ...

Fins ara, només hem treballat localment. Això planteja algunes qüestions:

  1. com ens formaríem en un conjunt de dades molt més gran?
  2. com desplegaríem el nostre model a la producció?
  3. com podríem saber si el nostre model escalaria?

Aquestes preguntes (escalabilitat i desplegament) són sovint el que és el pol de projectes d'aprenentatge automàtic. Passar de "funciona a la meva màquina" a "funciona en producció a escala 24/7" generalment requereix molta feina.

Hi ha esperança. Segueix llegint :)

SageMaker + XGBoost

La solució d'aquests punts de dolor és el nucli d'Amazon SageMaker. Revisem el nostre cas d’ús.

Algorismes integrats

Com hem vist anteriorment, hi ha molts algoritmes de classificació. Escollir el "correcte" i la seva "millor" implementació (bona sort intentant definir "correcte" i "millor") no és una tasca fàcil. Afortunadament, SageMaker us ofereix diversos algorismes integrats. Han estat implementats per Amazon, així que suposo que podeu esperar que realitzin i facin escala correctament :)

També podeu portar el vostre propi codi, el vostre propi model de formació prèvia, etc. A tractar en futurs articles! Més exemples de SageMaker sobre Github: regressió, classificació de diverses classes, classificació d’imatges, etc.

Aquí, farem servir XGBoost, una implementació popular de Gradient Boosted Arbes per crear un classificador binari.

En poques paraules, el SDK de SageMaker ens permetrà:

  • crear una infraestructura gestionada per formar XGBoost al nostre conjunt de dades,
  • emmagatzemi el model a SageMaker,
  • configureu un punt final REST per servir al nostre model,
  • crear una infraestructura gestionada per desplegar el model al punt final REST,
  • invocar el model en un parell de mostres.

Anem a fer-ho!

Configuració d'emmagatzematge i dades

Primers aspectes: S3 s’utilitzarà per emmagatzemar el conjunt de dades i tots els artefactes (quina sorpresa). Anem a declarar algunes coses. Suggeriment: la cubeta S3 ha de trobar-se a la mateixa regió que SageMaker.

Aquesta implementació de XGBoost requereix que les dades siguin en format CSV o libsvm. Provem aquest últim, copiem els fitxers resultants a S3 i prenem el paper IAM de SageMaker.

Veures be. Ara posem en marxa la tasca de formació.

Configuració de la tasca de formació

Amazon SageMaker utilitza contenidors Docker per dur a terme tasques de formació. Hem de triar el nom del contenidor corresponent a la regió on estiguem

Prou fàcil. Temps per configurar l'entrenament. Anaven a:

  • Creeu un classificador binari,
  • Obteniu els conjunts de dades de formació i validació en format libsvm de S3,
  • Entrena per a 100 iteracions una sola instància m4.4xlarge.

És bastant boig, però no entusiasmeu:

  • Els paràmetres comuns a tots els algoritmes es defineixen a la documentació de l'API CreateTrainingJob.
  • Els paràmetres específics de l'algoritme es defineixen a la pàgina de l'algorisme, per exemple, XGBoost.

Formació i estalvi del model

D'acord, anem a la festa. És hora de començar la formació.

6 minuts després, el nostre model està a punt. Per descomptat, això és una mica llarg per a un conjunt de dades tan petit :) Tanmateix, si tinguéssim milions de línies, podríem haver iniciat un treball de formació en diverses instàncies amb el mateix codi. Bastant xulo, eh?

D'acord, guardem aquest model a SageMaker. Molt senzill amb l'API CreateModel.

Creació de l'endpoint

Aquí arriba la part realment bona. Desplegarem aquest model i l’invocarem. Sí, així.

Primer, hem de crear una configuració d’endpoint amb l’API CreateEndpointConfig: utilitzarem una sola m4.xlarge per inferir, amb el 100% del trànsit dirigit al nostre model (anem a provar A / B en una publicació futura) .

Desplegament del model

Ara podem implementar el nostre model format en aquest punt de vista amb l’API CreateEndpoint.

Invocant l’endpoint

Ja estem preparats per invocar l’endpoint. Agafem un parell de mostres (en format libsvm) del conjunt de dades i les prediuem.

Ambdues mostres es preveuen correctament. Woohoo

Conclusió

Com podeu veure, SageMaker us ajuda a executar els vostres projectes de Machine Learning final a final: experimentació de quaderns, formació de models, hosting de models, desplegament de models.

Si teniu curiositat sobre altres maneres d’utilitzar SageMaker (i si no podeu esperar les inevitables publicacions futures!), Aquí teniu una visió general que he enregistrat recentment.

Ho és per avui. Moltes gràcies per llegir.

Aquest missatge monstre es va escriure mentre s’escoltava una i altra vegada (ERA una llarga publicació) a aquest llegendari programa d’Estrangers des de 1981.