Vytvoření klasifikátoru spamu: PySpark + MLLib vs. SageMaker + XGBoost

V tomto článku vám nejprve ukážu, jak vytvořit spamový klasifikátor pomocí Apache Spark, jeho Python API (aka PySpark) a různých algoritmů Machine Learning implementovaných ve Spark MLLib.

Poté použijeme novou službu Amazon Sagemaker ke školení, uložení a nasazení modelu XGBoost vyškoleného na stejnou datovou sadu.

Celý kód běží v notebooku Jupyter, který je k dispozici na Github :)

PySpark + MLLib

Velký obraz

Naše surová datová sada se skládá z 1řádkových zpráv uložených ve dvou souborech:

  • soubor „ham“: 4827 platných zpráv,
  • soubor „spam“: 747 zpráv.

Abychom tyto zprávy mohli klasifikovat, musíme sestavit přechodnou datovou sadu se dvěma třídami. Za tímto účelem budeme používat jednoduchou, ale účinnou techniku ​​nazvanou Feature Hashing:

  • Pro každou zprávu v datové sadě nejprve zašifrujeme její slova do pevného počtu kbelíků (řekněme 1000).
  • Pak vytvoříme vektor označující nenulové výskyty pro každé slovo: to jsou funkce, které budou použity k rozhodnutí, zda je zpráva spam nebo ne.
  • U platné zprávy bude odpovídající štítek nulový, tj. Zpráva není spam. U spamové zprávy bude tedy štítek jedna.

Po dokončení bude sada našich mezilehlých dat:

  • 4827 slovních vektorů označených nulou,
  • 747 slovních vektorů označených jedním.

Rozdělíme ji 80/20 pro výcvik a validaci a proběhneme prostřednictvím řady klasifikačních algoritmů.

Pro predikci bude tento proces podobný: hash message, pošlete vektorový vektor do modelu a získejte předpovězený výsledek.

Není to tak těžké, hej? Dejme se do práce!

Vytváření mezilehlých datových sad

Naším prvním krokem je načíst oba soubory a rozdělit zprávy do slov.

Potom každou zprávu hashujeme do 1 000 slovních kbelíků. Jak vidíte, každá zpráva se promění v řídký vektor, který obsahuje čísla a výskyty segmentů.

Dalším krokem je označení našich funkcí: 1 pro spam, 0 pro non-spam. Výsledkem je shromážděné značené vzorky, které jsou připraveny k použití.

Nakonec jsme rozdělili datovou sadu 80/20 pro výcvik a testování a mezipaměť obou RDD, protože je budeme opakovaně používat.

Nyní budeme s touto sadou dat trénovat řadu modelů. Abychom změřili jejich přesnost, budeme používat funkci bodování: jednoduše předpovídáme všechny vzorky v testovací sadě, porovnáme předpokládaný štítek se skutečným štítkem a vypočítáme přesnost.

Klasifikace datové sady pomocí Spark MLLib

Budeme používat následující klasifikační algoritmy:

  • Logistická regrese s optimalizátorem SGD,
  • Logistická regrese s optimalizátorem LBFGS,
  • Podpora vektorové stroje,
  • Rozhodovací stromy,
  • Stoupající stromy,
  • Náhodné lesy,
  • Naive Bayes.

Logistická regrese

Začněme Logistickou regresí, matkou všech klasifikátorů.

Podpora vektorové stroje

A co SVM, další populární algoritmus?

Stromy

Nyní vyzkoušejte tři varianty třídění podle stromů. API se mírně liší od předchozích algos.

Naive Bayes

V neposlední řadě vyzkoušejte klasifikátor Naives Bayes.

Je nesmírně lepší než všechny ostatní alga. Zkusme předpovědět několik vzorků ze skutečného života.

Byly předpovídány správně. Vypadá to jako docela dobrý model. Proč se tedy nesnažíte vylepšit tato skóre? Pro většinu algoritmů jsem použil výchozí parametry, určitě existuje prostor pro vylepšení :) V notebooku najdete odkazy na všechna API v notebooku, takže se můžete vyladit!

To je skvělé, ale…

Zatím jsme pracovali pouze lokálně. To vyvolává několik otázek:

  1. jak bychom trénovali na mnohem větším souboru dat?
  2. jak bychom nasadili náš model do výroby?
  3. jak bychom mohli vědět, zda by se náš model přizpůsobil?

Tyto otázky - škálovatelnost a nasazení - jsou často blankem projektů strojového učení. Přechod z „pracuje na mém stroji“ na „pracuje ve výrobě v měřítku 24/7“ obvykle vyžaduje hodně práce.

Je naděje. Číst dál :)

SageMaker + XGBoost

Řešení těchto bodů bolesti je jádrem Amazon SageMaker. Vraťme se zpět k našemu případu použití.

Vestavěné algoritmy

Jak jsme viděli dříve, existuje spousta klasifikačních algoritmů. Sbírání „správné“ a její „nejlepší“ implementace (hodně štěstí při pokusu definovat „správné“ a „nejlepší“) není snadný úkol. Naštěstí vám SageMaker nabízí několik vestavěných algoritmů. Byly implementovány Amazonem, takže si myslím, že můžete očekávat, že budou správně fungovat a upravovat měřítko :)

Můžete si také přinést vlastní kód, svůj vlastní předškolený model atd. Budou diskutovány v budoucích článcích! Další příklady SageMaker na Githubu: regrese, klasifikace více tříd, klasifikace obrázků atd.

Zde budeme používat XGBoost, populární implementaci Gradient Boosted Trees k vytvoření binárního klasifikátoru.

Stručně řečeno, SageMaker SDK nám umožní:

  • vytvořit spravovanou infrastrukturu, která bude trénovat XGBoost na našem datovém souboru,
  • uložte model do SageMaker,
  • nakonfigurujte koncový bod REST, aby sloužil našemu modelu,
  • vytvořit spravovanou infrastrukturu pro nasazení modelu do koncového bodu REST,
  • vyvolat model na několika vzorcích.

Pojďme to udělat!

Nastavení úložiště a dat

Nejdříve první: S3 se použije k uložení datové sady a všech artefaktů (jaké překvapení). Pojďme tedy prohlásit pár věcí. Tip: Kbelík S3 musí být ve stejné oblasti jako SageMaker.

Tato implementace XGBoost vyžaduje, aby data byla ve formátu CSV nebo libsvm. Zkusme to druhé, zkopírujte výsledné soubory do S3 a uchopte roli SageMaker IAM.

Vypadáš dobře. Nyní vytvoříme školicí práci.

Nastavení výcvikové práce

Amazon SageMaker používá kontejnery Docker ke spuštění školicích úloh. Musíme vybrat název kontejneru odpovídající oblasti, ve které se právě pohybujeme.

Snadno. Čas na konfiguraci školení. Budeme:

  • Postavte binární klasifikátor,
  • Načíst tréninkové a ověřovací datové sady ve formátu libsvm ze S3,
  • Trénujte na 100 iterací jednu instanci m4.4xlarge.

To je docela svižné, ale nepropadejte panice:

  • Parametry společné pro všechny algoritmy jsou definovány v dokumentaci API CreateTrainingJob.
  • Parametry specifické pro algoritmus jsou definovány na stránce algoritmu, např. XGBoost.

Trénink a uložení modelu

Dobře, pojďme na tuhle párty. Je čas začít trénovat.

O 6 minut později je náš model připraven. Pro tak malou datovou sadu je to samozřejmě trochu dlouhé :) Pokud bychom však měli miliony řádků, mohli bychom zahájit tréninkovou práci na více instancích se stejným kódem. Docela v pohodě, co?

OK, uložme tento model do programu SageMaker. S API CreateModel je to docela jednoduché.

Vytvoření koncového bodu

Zde přichází opravdu dobrá část. Chystáme se tento model nasadit a vyvolat. Ano, právě tak.

Nejprve musíme vytvořit konfiguraci koncového bodu pomocí rozhraní CreateEndpointConfig API: k inferenci použijeme jediný m4.xlarge, se 100% provozu jde do našeho modelu (v příštím příspěvku se podíváme na testování A / B) .

Nasazení modelu

Nyní můžeme na tento koncový bod nasadit náš trénovaný model pomocí rozhraní CreateEndpoint API.

Vyvolání koncového bodu

Nyní jsme připraveni vyvolat koncový bod. Pojďme sehnat pár vzorků (ve formátu libsvm) ze sady dat a předpovědět je.

Oba vzorky jsou předpovídány správně. Woohoo.

Závěr

Jak vidíte, SageMaker vám pomůže řídit vaše projekty strojového učení od začátku do konce: experimentování s notebookem, školení modelů, hosting modelů, nasazení modelů.

Pokud jste zvědaví na jiné způsoby, jak můžete používat SageMaker (a pokud nemůžete čekat na nevyhnutelné budoucí příspěvky!), Zde je přehled, který jsem nedávno zaznamenal.

To je pro dnešek. Děkuji vám za přečtení.

Tento příspěvek monster byl psán při opakovaném poslechu (byl to dlouhý příspěvek) této legendární Cizinec show z roku 1981.