Opbygning af spam-klassificering: PySpark + MLLib vs SageMaker + XGBoost

I denne artikel vil jeg først vise dig, hvordan du bygger en spam-klassifikator ved hjælp af Apache Spark, dens Python API (alias PySpark) og en række Machine Learning-algoritmer implementeret i Spark MLLib.

Derefter vil vi bruge den nye Amazon Sagemaker-tjeneste til at træne, gemme og distribuere en XGBoost-model, der er trænet i det samme datasæt.

“Jeg må bryde dig”

Alle koder kører i en Jupyter notebook, tilgængelig på Github :)

PySpark + MLLib

Det store billede

Vores rå datasæt er sammensat af 1-linjemeddelelser gemt i to filer:

  • filen 'skinke': 4827 gyldige meddelelser,
  • filen ‘spam’: 747 meddelelser.

For at klassificere disse meddelelser er vi nødt til at opbygge et mellemliggende datasæt med to klasser. Til dette formål bruger vi en enkel, men effektiv teknik kaldet Feature Hashing:

  • For hver meddelelse i datasættet hash vi først sine ord i et fast antal spande (siger 1000).
  • Derefter bygger vi en vektor, der angiver ikke-nulforekomster for hvert ord: dette er de funktioner, der vil blive brugt til at beslutte, om en meddelelse er spam eller ej.
  • For en gyldig meddelelse vil den tilsvarende etiket være nul, dvs. meddelelsen er ikke spam. Derfor er etiketten en spam-besked.

Når vi er færdige, vil vores mellemliggende datasæt være:

  • 4827 ordvektorer mærket med et nul,
  • 747 ordvektorer mærket med en.

Vi deler den 80/20 til træning og validering og løber ind gennem et antal klassificeringsalgoritmer.

Til forudsigelse vil processen være den samme: hash meddelelsen, send ordvektoren til modellen og få det forudsagte resultat.

Ikke så svært, hej? Lad os komme på arbejde!

Opbygning af det mellemliggende datasæt

Vores første skridt er at indlæse begge filer og dele meddelelserne i ord.

Derefter hashserer vi hver meddelelse i 1.000 ordspande. Som du kan se, omdannes hver meddelelse til en sparsom vektor, der indeholder spandnumre og forekomster.

Det næste trin er at mærke vores funktioner: 1 for spam, 0 for ikke-spam. Resultatet er en samling af mærkede prøver, der er klar til brug.

Endelig delte vi datasættet 80/20 til træning og test og cache begge RDD'er, da vi vil bruge dem gentagne gange.

Nu skal vi træne en række modeller med dette datasæt. For at måle deres nøjagtighed er her den scoringsfunktion, vi vil bruge: simpelthen forudsige alle prøver i testsættet, sammenlign den forudsagte etiket med den rigtige etiket og beregne nøjagtighed.

Klassificering af datasættet med Spark MLLib

Vi vil bruge følgende klassificeringsalgoritmer:

  • Logistisk regression med SGD optimizer,
  • Logistisk regression med LBFGS optimizer,
  • Support vektormaskiner,
  • Beslutningstræer,
  • Gradient Boosted Træer,
  • Tilfældige skove,
  • Naive Bayes.

Logistisk regression

Lad os starte med Logistic Regression, mor til alle klassifikatorer.

Support vektormaskiner

Hvad med SVM'er, en anden populær algoritme?

Træer

Lad os nu prøve tre varianter af træbaseret klassificering. API'et adskiller sig lidt fra tidligere alger.

Naive Bayes

Sidst men ikke mindst, lad os prøve Naives Bayes klassificeringsenheden.

Det er langt bedre end alle andre alger. Lad os prøve at forudsige et par eksempler fra det virkelige liv.

De blev forudsagt korrekt. Dette ligner en temmelig god model. Hvorfor ikke prøve at forbedre disse scoringer? Jeg har brugt standardparametre til de fleste af algoritmerne, helt sikkert er der plads til forbedringer :) Du finder links til alle API'er i den bærbare computer, så du er velkommen til at justere væk!

Dette er fantastisk, men ...

Indtil videre har vi kun arbejdet lokalt. Dette rejser nogle spørgsmål:

  1. hvordan skulle vi træne på et meget større datasæt?
  2. hvordan vil vi implementere vores model til produktion?
  3. hvordan kunne vi vide, om vores model ville skalere?

Disse spørgsmål - skalerbarhed og implementering - er ofte bane for Machine Learning-projekter. At gå fra “det fungerer på min maskine” til “det fungerer i produktion i skala 24/7” kræver normalt meget arbejde.

Der er håb. Læs videre :)

SageMaker + XGBoost

Løsning af disse smertepunkter er kernen i Amazon SageMaker. Lad os revidere vores brugssag.

Indbyggede algoritmer

Som vi så tidligere, er der masser af klassificeringsalgoritmer. At vælge den "rigtige" og dens "bedste" implementering (held og lykke med at prøve at definere "rigtigt" og "bedst") er ikke en let opgave. Heldigvis giver SageMaker dig flere indbyggede algoritmer. De er implementeret af Amazon, så jeg gætte på, at du kan forvente, at de udfører og skalerer korrekt :)

Du kan også medbringe din egen kode, din egen foruddannede model osv. Til diskussion i fremtidige artikler! Flere SageMaker-eksempler på Github: regression, klasseklassificering, billedklassificering osv.

Her skal vi bruge XGBoost, en populær implementering af Gradient Boosted Trees til at oprette en binær klassificering.

Kort sagt, SageMaker SDK lader os:

  • oprette administreret infrastruktur til at træne XGBoost i vores datasæt,
  • gem modellen i SageMaker,
  • konfigurere et REST-endpoint til at tjene vores model,
  • oprette administreret infrastruktur til at implementere modellen til REST-endepunktet,
  • påkalde modellen på et par prøver.

Lad os gøre det!

Opsætning af lagring og data

Første ting først: S3 vil blive brugt til at gemme datasættet og alle artefakter (hvad en overraskelse). Lad os erklære et par ting, så. Tip: S3-skovlen skal være i samme region som SageMaker.

Denne implementering af XGBoost kræver, at data er enten i CSV- eller libsvm-format. Lad os prøve sidstnævnte, kopiere de resulterende filer til S3 og få fat i SageMaker IAM-rollen.

Ser godt ud. Lad os nu konfigurere træningsjobbet.

Opsætning af træningsjobbet

Amazon SageMaker bruger Docker-containere til at køre træningsjob. Vi er nødt til at vælge beholdernavnet, der svarer til den region, vi kører i.

Let nok. Tid til at konfigurere træning. Vi skal til:

  • Byg en binær klassificering,
  • Hent trænings- og valideringsdatasæt i libsvm-format fra S3,
  • Træ i 100 iterationer en enkelt forekomst af m4.4xlarge.

Det er en ganske mundfuld, men ikke få panik:

  • Parametre, der er fælles for alle algoritmer, er defineret i CreateTrainingJob API-dokumentation.
  • Algoritme-specifikke parametre er defineret på algoritmesiden, f.eks. XGBoost.

Træning og redning af modellen

OK, lad os få denne fest igang. Tid til at begynde at træne.

6 minutter senere er vores model klar. Naturligvis er dette lidt længe for et så lille datasæt :) Men hvis vi havde millioner af linjer, kunne vi have startet et træningsopgave i flere tilfælde med nøjagtig den samme kode. Temmelig sej, ikke?

OK, lad os gemme denne model i SageMaker. Temmelig ligetil med CreateModel API.

Oprettelse af slutpunktet

Her kommer den virkelig gode del. Vi vil implementere denne model og påkalde den. Ja, bare sådan.

Først skal vi oprette en endepunktkonfiguration med CreateEndpointConfig API: vi bruger en enkelt m4.xlarge til inferens, hvor 100% af trafikken går til vores model (vi ser på A / B-test i et fremtidig indlæg) .

Implementering af modellen

Nu kan vi implementere vores træne model på dette slutpunkt med CreateEndpoint API.

Påberåbe sig endepunktet

Vi er nu klar til at påkalde slutpunktet. Lad os tage et par eksempler (i libsvm-format) fra datasættet og forudsige dem.

Begge prøver er forudsagt korrekt. Woohoo.

Konklusion

Som du kan se, hjælper SageMaker dig med at køre dine Machine Learning-projekter ende til ende: notebook-eksperimentering, modeluddannelse, modelhosting, modelinstallation.

Hvis du er nysgerrig efter andre måder, du kan bruge SageMaker (og hvis du ikke kan vente til de uundgåelige fremtidige indlæg!), Er her en oversigt, jeg registrerede for nylig.

Det er det i dag. Mange tak for læsningen.

Dette monsterindlæg blev skrevet under lytning igen og igen (det var et langt indlæg) til dette legendariske Foreigner-show fra 1981.