Изграждане на спам класификатор: PySpark + MLLib срещу SageMaker + XGBoost

В тази статия първо ще ви покажа как да изградите спам класификатор с помощта на Apache Spark, неговия Python API (известен още като PySpark) и различни алгоритми за машинно обучение, реализирани в Spark MLLib.

След това ще използваме новата услуга на Amazon Sagemaker за обучение, запаметяване и внедряване на XGBoost модел, обучен на същия набор данни.

„Трябва да те наруша“

Целият код работи в тетрадка на Юпитер, достъпна на Github :)

PySpark + MLLib

Голямата картина

Нашият суров набор от данни се състои от едноредови съобщения, съхранявани в два файла:

  • файлът "ham": 4827 валидни съобщения,
  • файлът „спам“: 747 съобщения.

За да класифицираме тези съобщения, трябва да изградим междинен набор от данни с два класа. За тази цел ще използваме проста, но ефективна техника, наречена Хаширане на функции:

  • За всяко съобщение в набора от данни първо хешираме думите му във фиксиран брой кофи (да речем, 1000).
  • След това изграждаме вектор, показващ ненулеви събития за всяка дума: това са функциите, които ще се използват за решаване дали съобщението е спам или не.
  • За валидно съобщение, съответният етикет ще бъде нула, т.е. съобщението не е спам. Съответно, за спам съобщение етикетът ще бъде такъв.

След като приключим, нашият междинен набор от данни ще бъде:

  • 4827 думи вектори, обозначени с нула,
  • 747 word вектори, обозначени с един.

Ще го разделим 80/20 за обучение и валидиране и ще изпълним редица алгоритми за класификация.

За прогнозирането процесът ще бъде подобен: хеширайте съобщението, изпратете вектора на думата към модела и получете прогнозирания резултат.

Не е ли трудно, а? Да се ​​захващаме за работа!

Изграждане на междинния набор от данни

Първата ни стъпка е да заредим двата файла и да разделим съобщенията на думи.

След това хешираме всяко съобщение в 1000 думи. Както можете да видите, всяко съобщение се превръща в оскъден вектор, съдържащ номера и събития в кофата.

Следващата стъпка е да маркираме нашите функции: 1 за спам, 0 за не-спам. Резултатът е събрана от етикетирани проби, които са готови за употреба.

Накрая разделихме набора от данни 80/20 за обучение и тест и кешираме двете RDD, тъй като ще ги използваме многократно.

Сега ще обучим редица модели с този набор от данни. За да измерим тяхната точност, ето функцията за оценяване, която ще използваме: просто предвидете всички проби в тестовия набор, сравнете прогнозирания етикет с реалния етикет и изчислете точността.

Класифициране на набора от данни с Spark MLLib

Ще използваме следните алгоритми за класификация:

  • Логистична регресия с оптимизатора на SGD,
  • Логистична регресия с оптимизатора на LBFGS,
  • Поддържащи векторни машини,
  • Дървета на решения,
  • Градиент подсилени дървета,
  • Случайни гори,
  • Наивен Байес.

Логистична регресия

Да започнем с логистичната регресия, майката на всички класификатори.

Поддръжка на векторни машини

Какво ще кажете за SVM, друг популярен алгоритъм?

Дървета

Сега да опитаме три варианта на класификация въз основа на дърветата. API е малко по-различен от предишните algos.

Наивен Байес

Не на последно място, нека опитаме класификатора Naives Bayes.

Той значително превъзхожда всички останали алги. Нека се опитаме да предскажем няколко образци от реалния живот.

Те бяха прогнозирани правилно. Това изглежда като доста добър модел. Сега защо не се опитвайте да подобрите тези резултати? Използвах параметри по подразбиране за повечето алгоритми, със сигурност има място за подобрение :) Ще намерите линкове към всички API в бележника, така че не се колебайте!

Това е страхотно, но ...

Досега работихме само на местно ниво. Това повдига някои въпроси:

  1. как бихме тренирали на много по-голям набор от данни?
  2. как бихме разположили модела си в производството?
  3. как бихме могли да разберем дали моделът ни ще се мащабира?

Тези въпроси - мащабируемост и внедряване - често са в основата на проектите за машинно обучение. Преминаването от „работи на моята машина“ до „работи в производство в мащаб 24/7“ обикновено изисква много работа.

Има надежда. Прочетете на :)

SageMaker + XGBoost

Решаването на тези точки на болка е в основата на Amazon SageMaker. Нека да разгледаме нашия случай на използване.

Вградени алгоритми

Както видяхме по-рано, има много алгоритми за класификация. Избирането на „правилния“ и неговото „най-добро“ изпълнение (късмет при опит да се дефинират „правилен“ и „най-добър“) не е лесна задача. За щастие, SageMaker ви предоставя няколко вградени алгоритми. Те са внедрени от Amazon, така че предполагам, че можете да очаквате от тях да изпълняват и мащабират правилно :)

Можете също така да донесете свой собствен код, собствен предварително подготвен модел и т.н. За да бъде обсъден в бъдещи статии! Още примери от SageMaker на Github: регресия, класификация в много класове, класификация на изображения и т.н.

Тук ще използваме XGBoost, популярна реализация на Gradient Boosted Trees, за да изградим двоичен класификатор.

С две думи, SDK SageMaker ще ни позволи:

  • създайте управлявана инфраструктура за обучение на XGBoost в нашия набор от данни,
  • съхранявайте модела в SageMaker,
  • конфигурира REST крайна точка за обслужване на нашия модел,
  • създаване на управлявана инфраструктура за разгръщане на модела до крайната точка REST,
  • извикайте модела на няколко проби.

Да го направим!

Настройка на съхранение и данни

Първи неща първо: S3 ще се използва за съхраняване на набора от данни и всички артефакти (каква изненада). Нека тогава декларираме няколко неща. Съвет: кофата S3 трябва да е в същия регион като SageMaker.

Това внедряване на XGBoost изисква данните да бъдат във формат CSV или libsvm. Нека опитаме последното, копирайте получените файлове в S3 и вземете ролята на SageMaker IAM.

Изглежда добре. Сега да настроим тренировъчната работа.

Създаване на тренировъчна работа

Amazon SageMaker използва контейнери Docker за изпълнение на учебни задачи. Трябва да изберем името на контейнера, съответстващо на региона, в който се изпълняваме.

Достатъчно лесно. Време е да конфигурирате тренировките. Ние ще:

  • Създайте двоичен класификатор,
  • Извадете наборите от данни за обучение и валидиране във формат libsvm от S3,
  • Тренирайте за 100 повторения на един екземпляр m4.4xlarge.

Това е доста за уста, но не изпадайте в паника:

  • Параметри, общи за всички алгоритми, са дефинирани в документацията на API API CreateTrainingJob.
  • Специфичните за алгоритъма параметри са дефинирани на страницата с алгоритъма, напр. XGBoost.

Обучение и запазване на модела

Добре, нека да продължим тази партия Време е да започнете да тренирате.

6 минути по-късно, нашият модел е готов. Разбира се, това е малко дълго за такъв малък набор от данни :) Въпреки това, ако имахме милиони редове, бихме могли да започнем тренировъчна работа на няколко случая с точно същия код. Доста готин, а?

Добре, нека да запазим този модел в SageMaker. Доста направо с API на CreateModel.

Създаване на крайната точка

Тук идва наистина добрата част. Ще разгърнем този модел и ще го използваме. Да, просто така.

Първо, трябва да създадем конфигурация на крайната точка с API на CreateEndpointConfig: ще използваме един m4.xlarge за извод, като 100% от трафика отива към нашия модел (ще разгледаме A / B тестване в бъдеща публикация) ,

Разгръщане на модела

Сега можем да разгърнем нашия обучен модел на тази крайна точка с API на CreateEndpoint.

Извличане на крайната точка

Вече сме готови да използваме крайната точка. Нека вземем няколко проби (във формат libsvm) от набора от данни и да ги прогнозираме.

И двете проби са прогнозирани правилно. Ура.

заключение

Както можете да видите, SageMaker ви помага да стартирате вашите проекти за машинно обучение от край до край: експерименти с тетрадки, обучение на модели, хостинг на модели, внедряване на модели.

Ако се интересувате от други начини да използвате SageMaker (и ако не можете да чакате неизбежните бъдещи публикации!), Ето преглед, който записах наскоро.

Това е за днес. Благодаря ви много за четенето.

Този чудовищен пост е написан, докато слушате отново и отново (това беше дълъг пост) на това легендарно шоу на чужденец от 1981 г.