Стварэнне класіфікатара спаму: PySpark + MLLib vs SageMaker + XGBoost

У гэтым артыкуле я спачатку пакажу вам, як стварыць класіфікатар спаму з дапамогай Apache Spark, яго Python API (ён жа PySpark) і мноства алгарытмаў машыннага навучання, рэалізаваных у Spark MLLib.

Затым мы будзем выкарыстоўваць новую паслугу Amazon Sagemaker для навучання, захавання і разгортвання мадэлі XGBoost, навучанай на тым жа наборы дадзеных.

Увесь код працуе ў нататніку Юпітэр, даступным на Github :)

PySpark + MLLib

Вялікая карціна

Наш неапрацаваны набор дадзеных складаецца з 1-радкавых паведамленняў, якія захоўваюцца ў двух файлах:

  • файл "вяндлінай": 4827 сапраўдных паведамленняў,
  • файл "спаму": 747 паведамленняў.

Для таго, каб класіфікаваць гэтыя паведамленні, нам трэба пабудаваць прамежкавы набор дадзеных з двух класаў. З гэтай мэтай мы будзем выкарыстоўваць просты, але эфектыўны метад, які называецца Feature Hashing:

  • Для кожнага паведамлення ў наборы дадзеных мы спачатку размяркоўваем яго словы ў фіксаваную колькасць вёдраў (скажам, 1000).
  • Затым мы будуем вектар, які паказвае ненулявыя з'явы для кожнага слова: гэта функцыі, якія будуць выкарыстоўвацца для вызначэння, ці з'яўляецца гэта паведамленне спамам ці не.
  • Для сапраўднага паведамлення адпаведная пазнака будзе роўная нулю, гэта значыць паведамленне не з'яўляецца спамам. Адпаведна, для спам-паведамлення ярлык будзе адзін.

Пасля таго, як мы скончым, наш прамежкавы набор дадзеных будзе:

  • 4827 вектары слова, пазначаныя нулем,
  • 747 вектары слова, пазначаныя адным.

Мы падзялім яго на 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, каб стварыць бінарны класіфікатар.

У двух словах, SageMaker SDK дазволіць нам:

  • стварыць кіраваную інфраструктуру для навучання XGBoost на нашым наборы дадзеных,
  • захоўвайце мадэль у SageMaker,
  • наладзіць канчатковую кропку REST для абслугоўвання нашай мадэлі,
  • стварыць кіраваную інфраструктуру для разгортвання мадэлі ў канчатковую кропку REST,
  • выклікаць мадэль на пару узораў.

Давайце зробім гэта!

Налада захоўвання і дадзеных

Перш за ўсё: S3 будзе выкарыстоўвацца для захоўвання набору дадзеных і ўсіх артэфактаў (што нечакана). Давайце абвясцім некалькі рэчаў. Падказка: вядро S3 павінна знаходзіцца ў тым жа рэгіёне, што і SageMaker.

Гэтая рэалізацыя XGBoost патрабуе, каб дадзеныя былі альбо ў фармаце CSV, альбо ў libsvm. Давайце паспрабуем апошняе, скапіруйце атрыманыя файлы ў S3 і захапіце ролю IAM SageMaker.

Добра выглядаеш. Зараз наладзім навучальную працу.

Налада вучэбнай работы

Amazon SageMaker выкарыстоўвае кантэйнеры Docker для выканання вучэбных задач. Трэба выбраць імя кантэйнера, якое адпавядае рэгіёну, у якім мы працуем.

Даволі проста. Час наладзіць навучанне. Мы збіраемся:

  • Стварыце двайковы класіфікатар,
  • Дастаньце наборы дадзеных аб навучанні і праверцы ў фармаце libsvm з S3,
  • Трэніруйцеся на 100 ітэрацый для аднаго асобніка m4.4xlarge.

Гэта даволі глыбока, але не панікуйце:

  • Параметры, агульныя для ўсіх алгарытмаў, вызначаюцца ў дакументацыі па API CreateTrainingJob.
  • Параметры, характэрныя алгарытму, вызначаюцца на старонцы алгарытму, напрыклад. XGBoost.

Навучанне і захаванне мадэлі

Добра, давайце вядзем гэтую вечарыну Час пачаць навучанне.

Праз 6 хвілін наша мадэль гатовая. Зразумела, гэта такі невялікі набор дадзеных :) Аднак, калі б у нас былі мільёны радкоў, мы маглі б пачаць вучэбную працу па некалькіх экзэмплярах з сапраўды адным кодам. Даволі крута, так?

Добра, захавайце гэтую мадэль у SageMaker. Даволі проста з API CreateModel.

Стварэнне канчатковай кропкі

Тут ідзе сапраўды добрая частка. Мы будзем разгортваць гэтую мадэль і выклікаць яе. Так, проста так.

Спачатку нам трэба стварыць канфігурацыю канчатковай кропкі з API CreateEndpointConfig: мы будзем выкарыстоўваць адзіны m4.xlarge для высновы, прычым 100% трафіку будзе пераходзіць у нашу мадэль (мы разгледзім тэставанне A / B у будучым пасце) .

Разгортванне мадэлі

Цяпер мы можам разгарнуць нашу падрыхтаваную мадэль на гэтай канчатковай кропцы з дапамогай API CreateEndpoint.

Выкліканне канчатковай кропкі

Мы гатовы выклікаць канчатковую кропку. Давайце захапім некалькі ўзораў (у фармаце libsvm) з набору дадзеных і прагназуем іх.

Абодва ўзору прагназуюцца правільна. Woohoo.

Выснова

Як бачыце, SageMaker дапамагае вам запускаць праекты машыннага навучання да канца: эксперыментаванне з ноўтбукам, навучанне мадэлям, хостынг мадэляў, разгортванне мадэлі.

Калі вам цікава пра іншыя спосабы выкарыстання SageMaker (і калі вы не можаце чакаць непазбежных будучых паведамленняў!), Вось агляд, які я запісаў нядаўна.

Гэта сёння. Дзякуй вялікі за чытанне.

Гэты пост монстра быў напісаны падчас праслухоўвання зноў і зноў (гэта быў доўгі пост) гэтага легендарнага шоу замежнікаў з 1981 года.