Búðu til ruslflokkun ruslpósts: PySpark + MLLib vs SageMaker + XGBoost

Í þessari grein mun ég fyrst sýna þér hvernig á að smíða ruslflokkun með ruslpósti með Apache Spark, Python API þess (aka PySpark) og margs konar Machine Learning reiknirit útfærð í Spark MLLib.

Síðan munum við nota nýju Amazon Sagemaker þjónustuna til að þjálfa, vista og dreifa XGBoost líkani sem er þjálfað í sama gagnasettinu.

„Ég verð að brjóta þig“

Allur kóði keyrir í Jupyter minnisbók, fáanlegur á Github :)

PySpark + MLLib

Stóra myndin

Hráa gagnasettið okkar samanstendur af 1 lína skilaboðum sem geymd eru í tveimur skrám:

  • skráin „skinka“: 4827 gild skilaboð,
  • „spam“ skráin: 747 skilaboð.

Til að flokka þessi skilaboð verðum við að byggja milligagnasett með tveimur flokkum. Í þessu skyni ætlum við að nota einfalda en skilvirka tækni sem kallast Feature Hashing:

  • Fyrir hver skilaboð í gagnasettinu helltum við orðunum fyrst inn í fastan fjölda fötu (segjum 1000).
  • Síðan byggjum við upp vektor sem gefur til kynna atvik sem ekki eru núll fyrir hvert orð: þetta eru eiginleikarnir sem verða notaðir til að ákveða hvort skilaboð séu ruslpóstur eða ekki.
  • Fyrir gild skilaboð verður samsvarandi merkimiði núll, þ.e.a.s. skeytið er ekki ruslpóstur. Til samræmis við ruslpóst verður merkimiðinn einn.

Þegar þessu er lokið verður gagnagagnasettið okkar:

  • 4827 orðalektar merktir með núlli,
  • 747 orðalektar merktir með einum.

Við munum skipta því 80/20 fyrir þjálfun og löggildingu og keyra í gegnum fjölda flokkunaralgríms.

Fyrir spá, ferlið verður svipað: kjötkássa skilaboðin, sendu orðaferilinn í líkanið og fáðu spáðri niðurstöðu.

Er það ekki erfitt? Við skulum vinna!

Byggja upp gagnagagnasettið

Fyrsta skrefið okkar er að hlaða báðar skrárnar og deila skilaboðunum í orð.

Síðan erum við að töfra öll skilaboð upp í 1.000 orð fötu. Eins og þú sérð, er hver skilaboð breytt í strjálan vektor sem heldur fötunúmerum og viðburðum.

Næsta skref er að merkja eiginleika okkar: 1 fyrir ruslpóst, 0 fyrir ruslpóst. Niðurstaðan er safnað af merktum sýnum sem eru tilbúin til notkunar.

Að lokum skiptum við gögnum 80/20 fyrir þjálfun og próf og skyndum skyndiminni á báða bóga þar sem við munum nota þau hvað eftir annað.

Nú ætlum við að þjálfa fjölda gerða með þessu gagnasett. Til að mæla nákvæmni þeirra, hér er stigagjöfin sem við ætlum að nota: einfaldlega spá fyrir um öll sýnishorn í prufusettinu, bera saman spáð merkimiða við raunverulegan merkimiða og reikna nákvæmni.

Flokkun gagnasafnsins með Spark MLLib

Við ætlum að nota eftirfarandi flokkunaralgrím:

  • Logistic afturför með SGD fínstillingu,
  • Logistic afturför með LBFGS fínstillingu,
  • Stuðningur vektor vélar,
  • Ákvörðunartré,
  • Stigandi tré aukin,
  • Handahófi skógar,
  • Naive Bayes.

Logistic afturför

Við skulum byrja á Logistic Regression, móður allra flokkanna.

Stuðningur vektor vélar

Hvað með SVM, annan vinsælan reiknirit?

Tré

Nú skulum reyna þrjú afbrigði af flokkun sem byggist á tré. API er aðeins frábrugðið fyrri alger.

Naive Bayes

Síðast en ekki síst, við skulum prófa Naives Bayes flokkinn.

Það er gríðarlega yfirburði allra annarra alger. Við skulum reyna að spá fyrir um nokkur raunveruleg sýnishorn.

Þeim var spáð rétt. Þetta lítur út eins og nokkuð góð fyrirmynd. Af hverju reynirðu ekki að bæta þessi stig? Ég hef notað sjálfgefna breytur fyrir flestar reiknirit, vissulega er pláss fyrir endurbætur :) Þú finnur tengla á öll API í fartölvunni, svo ekki hika við að fínstilla!

Þetta er frábært, en…

Enn sem komið er höfum við aðeins unnið á staðnum. Þetta vekur nokkrar spurningar:

  1. hvernig myndum við þjálfa í miklu stærra gagnasafni?
  2. hvernig myndum við nota líkan okkar til framleiðslu?
  3. hvernig gátum við vitað hvort líkan okkar myndi stækka?

Þessar spurningar - sveigjanleiki og dreifing - eru oft skothríðin í Machine Learning verkefnum. Að fara frá „það virkar á vélinni minni“ yfir í „það virkar í framleiðslu á mælikvarða 24/7“ krefst venjulega mikillar vinnu.

Það er von. Lestu áfram :)

SageMaker + XGBoost

Að leysa þessa sársaukapunkta er kjarninn í Amazon SageMaker. Við skulum skoða notkunarmál okkar.

Innbyggðar reiknirit

Eins og við sáum áður eru fullt af flokkunaralgrími. Að velja „rétta“ og „bestu“ útfærsluna (gangi þér vel að reyna að skilgreina „rétt“ og „besta“) er ekki auðvelt verkefni. Sem betur fer veitir SageMaker þér nokkra innbyggða reiknirit. Þeir hafa verið útfærðir af Amazon, svo ég giska á að þú getir búist við því að þeir framkvæma og kvarða rétt :)

Þú getur líka komið með eigin kóða, þitt eigið fyrirfram þjálfaða líkan osfrv. Til að ræða í greinum í framtíðinni! Fleiri SageMaker dæmi um Github: aðhvarf, flokkun í mörgum flokkum, myndaflokkun osfrv.

Hérna ætlum við að nota XGBoost, vinsæla útfærslu Gradient Boosted Trees til að byggja upp tvöfaldan flokkun.

Í hnotskurn mun SageMaker SDK láta okkur:

  • búa til stjórna innviði til að þjálfa XGBoost í gagnasettinu okkar,
  • geymdu líkanið í SageMaker,
  • stilla REST endapunkt til að þjóna fyrirmynd okkar,
  • búa til stjórna innviði til að dreifa líkaninu að REST endapunktinum,
  • ákalla líkanið á nokkrum sýnum.

Gerum þetta!

Setur upp geymslu og gögn

Fyrstu hlutirnir fyrst: S3 verður notaður til að geyma gagnapakkann og alla gripi (það kemur á óvart). Við skulum lýsa yfir nokkrum hlutum. Ábending: S3 fötu verður að vera á sama svæði og SageMaker.

Þessi framkvæmd XGBoost krefst þess að gögn séu annað hvort á CSV eða libsvm sniði. Við skulum prófa það síðarnefnda, afrita skrárnar sem myndast í S3 og grípa SageMaker IAM hlutverkið.

Lítur vel út. Nú skulum við setja upp þjálfunarstarfið.

Setja upp þjálfunarstarfið

Amazon SageMaker notar Docker gáma til að sinna þjálfunarstörfum. Við verðum að velja gámanafnið sem samsvarar svæðinu sem við erum að keyra á.

Nógu auðvelt. Tími til að stilla þjálfun. Við ætlum að:

  • Búðu til tvöfaldan flokkun,
  • Sæktu þjálfunar- og löggildingargagnasætin á libsvm sniði frá S3,
  • Lestu í 100 endurtekningar á einu m4.4xlarge dæmi.

Þetta er alveg munnfyllt en ekki örvænta:

  • Færibreytur, sem eru sameiginlegar öllum reikniritum, eru skilgreindar í skjalinu CreateTrainingJob API.
  • Reiknirit sem eru sértækir eru skilgreindir á algrímssíðunni, t.d. XGBoost.

Þjálfun og vistun líkansins

Allt í lagi, við skulum koma þessum aðila í gang. Tími til að hefja þjálfun.

6 mínútum síðar er líkanið okkar tilbúið. Auðvitað er þetta svolítið langt fyrir svona lítið gagnasett :) Ef við hefðum haft milljón línur hefðum við getað byrjað í þjálfunarstörfum í mörgum tilvikum með nákvæmlega sama kóða. Frekar flott, ha?

Allt í lagi, við skulum vista þessa gerð í SageMaker. Frekar einfalt með CreateModel API.

Að búa til endapunktinn

Hér kemur mjög góður hluti. Við ætlum að dreifa þessu líkani og kalla fram það. Já, bara svona.

Í fyrsta lagi verðum við að búa til endapunktsstillingu með CreateEndpointConfig API: við notum stakan m4.xlarge fyrir ályktun, þar sem 100% af umferðinni fer að líkaninu okkar (við munum skoða A / B prófanir í framtíðinni) .

Dreifing líkansins

Nú getum við sent þjálfaða líkanið okkar á þennan endapunkt með CreateEndpoint API.

Ákalla endapunktinn

Við erum núna tilbúin að kalla fram endapunktinn. Við skulum grípa nokkur sýni (á libsvm sniði) úr gagnasettinu og spá í þau.

Báðum sýnunum er spáð á réttan hátt. Woohoo.

Niðurstaða

Eins og þú sérð, hjálpar SageMaker þér að keyra Machine Learning verkefnin þín allt til enda: tilraunir með fartölvu, líkananám, módelhýsing, líkannotkun.

Ef þú ert forvitinn um aðrar leiðir sem þú getur notað SageMaker (og ef þú getur ekki beðið eftir óumflýjanlegum framtíðarfærslum!), Hér er yfirlit sem ég tók upp nýlega.

Það er það í dag. Takk kærlega fyrir lesturinn.

Þessi skrímslapóstur var skrifaður meðan ég hlustaði aftur og aftur (það var löng færsla) á þessa sögufrægu Foreigner sýningu frá 1981.