Малко предистория: аз съм гимназист и през лятото на 2018 г. бях на стаж в H2O.ai. Без опит в машинното обучение освен курса „Въведение в машинното обучение“ на Андрю Нг в Coursera и няколко от неговите курсове за задълбочено обучение, първоначално се оказах леко поразен от разнообразието от нови алгоритми, които H2O може да предложи както в своя отворен код, така и в корпоративен софтуер. Но чрез проучване на различни ресурси до края на лятото успях да използвам AI без драйвери и H2O-3 алгоритми в TGS Salt Identification Challenge на Kaggle. В тази публикация в блога ще разкажа моя опит и научени неща от времето ми в H2O.ai, както и ресурси за изучаване на H2O и наука за данни за тези, които са нови в това.

Първи стъпки

H2O-3

За да започна с H2O, първо изтеглих пакета H2O-3 заедно с клиента на Python. Въпреки че инструкциите за инсталиране са ясни, когато инсталирате и използвате клиента на Python, уверете се, че:

  1. Инсталацията на H2O Python и версиите на изтегления пакет съвпадат.
  2. H2O работи с Java 8

Ако не желаете да използвате Python, H2O-3 има GUI API, H2O Flow, който може да бъде достъпен от браузър; Python клиентът беше лесен за използване и гъвкав, с интуитивни команди и други предимства на Python като numpy, pandas и opencv.

След като H2O-3 заработи, следващата задача беше да се запознаем с неговата функционалност. Полезните ресурси за това включват:

  • Документацията: Определено си струва да прочетете страниците, налични в страничната лента (пропуснете или прегледайте набързо по ваша преценка). Документацията дава цялостен поглед върху това какво можете да правите с H2O-3, както и подробности и обяснения относно внедряването. Примерен код може да бъде намерен на някои страници както в R, така и в Python. Ако примерният код не е наличен на някои страници — например на страницата за задълбочено обучение — той вероятно е наличен в хранилището на GitHub (най-вероятно в папката с уроци; можете да търсите в хранилището, ако не можете да го намерите лесно)
  • H2O-3 GitHub: Прегледайте уроците за проекта, който имате предвид. Прегледайте още, за да видите други функции и алгоритми, които можете да включите. Намерих примерния код в уроците за много полезен при научаването как да използвате всяка функция. Изходният код беше интересен за четене. Прочетете го, ако искате да разберете как се изпълнява всичко; въпреки че за да разберете как да използвате всичко, би било по-лесно да преминете през документацията, тъй като изходният код е доста дълъг за четене и тълкуване.
  • Coursera: H2O има курс на Coursera, където можете да получите достъп до материала безплатно, но трябва да плащате за задания. Въпреки че не опитах това, ако предпочитате по-структуриран подход, опитайте.

Когато се запознах по-добре с H2O-3, преминах през журналите, отпечатани в прозореца на терминала, където екземплярът на h2o беше стартиран чрез Java, докато изпълнявах различни алгоритми. Това също беше доста полезно за разбирането на това, което прави, за наблюдение на напредъка и за намиране на потенциални подобрения в данните или хиперпараметрите на модела.

Започвайки с H2O Driverless AI

Започнах с Driverless AI (DAI) по същия начин като H2O-3. Изтеглих и инсталирах DAI според инструкциите за инсталиране. Беше доста лесно, но си струва да се отбележи, че ако нямате достатъчно RAM на вашата машина (инструкциите изискват минимум 10 gb за изпълнение на DAI), опитайте все пак да стартирате DAI, може пак да работи. Разпределих 4 gb на Mac с 8 gb RAM и той все още можеше да работи.

За да се запознаете с DAI, първо преминете през всички страници в страничната лента документация. Интерпретацията и трансформациите на модела са уникални за DAI. За да разбера интерпретацията на модела, се опитах да разбера LIME, като разгледах неговото хранилище GitHub и тази статия. „Оригиналната статия“ също си заслужава да бъде прочетена.

DAI е много интуитивен за използване. Беше доста лесно да се разбере как да се използва. В края на краищата той е създаден за не-данни учени!

Ансамбиране

H2O-3 AutoML (както и някои присъщи модели на ансамбъл) и DAI модели на ансамбъл за подобряване на производителността. Ансамбълните модели също се използват често на Kaggle. „Тази статия“ обяснява концептуално ансамбирането, а „тази публикация в блога“ показва как да го приложите. Свързани: mlwave.com е чудесен ресурс за изучаване на концепции за машинно обучение, употреби и работни потоци от най-добрите Kagglers и специалисти по данни. Силно препоръчвам да го прочетете; статиите са много интересни и могат да бъдат полезни за вашия проект за наука за данни.

Малък проект

Започнах да експериментирам с DAI и H2O-3 със случай на използване за дневна търговия, като изтеглих „данни“ за капитала на Tata Steel за 24 месеца от (Индийската) национална фондова борса. Възнамерявах да използвам маркерите от предишния ден и началната цена за текущия ден, за да предвидя цената на затваряне за текущия ден.

Първо обработих този набор от данни, като преместих елементи в колоните с маркери един ден, така че цената на затваряне за текущия ден да беше в същия ред като маркерите от предишния ден - това не беше правилният начин за създаване на времеви серии; Функцията за времеви серии на DAI обработи данните автоматично и по подходящ начин. След това стартирах DAI на този набор от данни. Тъй като алгоритмите на H2O-3 работеха много по-бързо, успях също така да обуча множество H2O-3 модели на този набор от данни, докато DAI работи. Резултатите от RMSE за обучение бяха около 10 с алгоритмите H2O-3 и 9,1 с DAI, а резултатите от тестовете бяха около 213 на малки набори от тестови данни, което направи модела безполезен за всяко приложение за дневна търговия.

В търсене на идеи за подобряване на производителността на модела, намерих това видео от Мариос Михайлидис за това как да използвам DAI на Kaggle. Той използва DAI и други алгоритми, както е показано по-долу, за да подрежда модели и да се възползва максимално от инженеринга на функциите на DAI:

В опит да проследя това, първо подадох данни, получени от DAI с допълнителните функции (но със стойности на базовата истина, т.е. колоната за цена на затваряне от оригиналния набор от данни) на различни модели H2O-3, които показаха повече разнообразие, и след това подадох техните прогнози към DAI (крайния модел). Това беше по-обещаващо във фазата на влака с RMSE от около 3,5, но се представи по-зле на тестовия набор от данни с резултат от около 288. Това беше неправилно подреждане. Прегледайте гореспоменатата публикация в блога, за да видите как да го направите правилно.

По-късно изпробвах функцията за времеви серии на DAI върху нередактирания набор от данни и нейната производителност се подобри драстично до ~0,05 RMSE за обучение и ~6 тестова RMSE. Въпреки това, дори и с тази подобрена производителност, значителното намаляване на производителността на модела в тестовия набор предполага, че той не разполага с достатъчно данни, за да създаде точен модел.

Kaggle

След като изпробвах и се запознах с H2O-3 и DAI, тъй като не можах да намеря достатъчно данни за Tata Steel, за да направя по-добър модел, погледнах към Kaggle, платформа за състезания по наука за данни. Състезанието TGS Salt Identification изглеждаше интересно и със значителен набор от данни. Това състезание включваше идентифициране дали подземна цел е сол или не, дадени сеизмични данни (под формата на изображения) и дълбочините на всяко изображение - с други думи, местоположението и границите на солта върху сеизмично изображение.

Горещо ви препоръчвам да погледнете Kaggle, дори ако не възнамерявате да участвате в състезания, тъй като има страхотни ресурси за хора, които са нови в науката за данни, включително „набори от данни“, „дискусии“ („раздел“ за начинаещи), компютърни ресурси и код („ядра“).

Полезни Python модули

Python има различни модули, които правят манипулирането на данни много по-лесно. Разгледайте numpy и pandas за изчисления и манипулиране на данни, csv за четене и запис на csv и opencv при работа с изображения.

Генериране на набор от данни

Тъй като H2O не приема данни за изображения, генерирах набор от данни със следния формат на колона, където всеки ред съответства на пиксел на изображение, използвайки този скрипт:

ID (низ)

дълбочина (реална)

стойност на пикселите в сивата скала (реална)

солена истина (bool / enum)

Подаването на тези данни към DAI беше доста лесно; Току-що го качих чрез бутона за качване на файл. С H2O-3 обаче трябваше да бъде компресиран, в противен случай Python щеше да изведе [Errno 22] Невалиден аргумент. Забележка: Python 3 изглежда се бори с файлове над 2–4 gb; H2O.ai ще поправи тази грешка, като надстрои своите библиотеки за импортиране.

Скриптът на Python създаде набор от 3600 пиксела на изображения, набор за валидиране от 400 пиксела на изображения и тестов набор от 18 000 пиксела на изображения; тези тестови прогнози след това ще бъдат изпратени на Kaggle.

DAI и H2O-3 алгоритми

За да се предотврати запомнянето на данните от алгоритмите, колоната с id беше премахната преди обучението. Тъй като наборите от данни за обучение и тест бяха доста големи (~41 милиона реда и ~183 милиона реда съответно), без GPU, DAI отне много време за обучение. През това време опитах H2O-3 DeepLearningEstimator. И за двете използвах показателя AUC като резултат и активирах модели на Tensorflow и поддръжка на RuleFit (в менюто за експертни настройки) за окончателните конвейери на DAI. DAI постигна ~0,75 train AUC, а H2O-3 Deep Learning ~0,72.

Предсказаните стойности на пикселите бяха преобразувани в RLE кодирания, съпоставени към идентификатори, както се изисква от голмайстора на състезанието, използвайки този скрипт. Кредит на rakhlin за функцията numpy array към rle, намерена тук. Резултатите „Intersection over Union (IoU)“ на моделите Deep Learning и DAI върху тестовия набор от данни, както са отбелязани от Kaggle, бяха както следва:

Модел: H2O-3 Deep Learning, IoU: 0,263

Модел: DAI, IoU: 0,176

Липса на функции

Потенциално най-голямата пречка за точността на модела беше липсата на функции. Наборите от данни имаха само две функции за всеки пиксел (тъй като id беше премахнат). Това беше поправено чрез добавяне на повече функции, включително позиция на пиксела, стойности на сивата скала на съседни пиксели и максимална, минимална и средна стойност на сивата скала на картината.

Това обаче разкри още повече хардуерни ограничения, тъй като файловете за влак, валидация и тест (особено тестовият файл) набъбнаха от 4 колони на 13. DAI отне много време, за да работи, лаптопът ми изчерпа RAM и Python не поддържат качване на големи файлове, всички забавят напредъка.

Ресурси

Форумите на Kaggle бяха невероятно полезни за възможни начини за подобряване на моделите, било то чрез разбиране и разширяване на данните, изследване на по-подходящи модели или прецизиране на модели. Освен това, когато възникнеше проблем, търсенето в Google обикновено ме водеше до изследователски статии, които имаха някои отговори (или бяха поне интересни по друг начин), дискусии на Stackoverflow или Kaggle.

Също така получих много идеи и предложения от Меган в H2O за това как да подобря производителността на модела, включително допълнителни функции и автоматично кодиране (вижте по-долу). H2O също може да бъде чудесен ресурс за вас, за да научите науката за данните и да подобрите своите модели.

Идеи за напред

Инженерингът на функции обикновено е ключова част от състезанията на Kaggle (както научих от форумите на Kaggle), така че включването на повече функции вероятно би могло да подобри производителността на модела. Такива характеристики могат да включват разстояние в пиксели до пясъчни клъстери, общи форми на пясъчни клъстери или може би повече солени истини на съседите. Опитайте и намерете още функции.

Автоенкодери или GLRM също могат да се използват за обезшумяване на входното изображение и/или прогнозите. След като разгледах първоначалните (2 функции) DAI прогнози за влакове, забелязах много шум, особено на изображения, които трябва да са празни. Kaggle е внедрил показателя IoU, така че ако се предвиди някаква сол върху изображения, които трябва да са празни, това изображение получава резултат 0. Изпълнението на тестови прогнози чрез H2OAutoEncoderEstimator, обучен на прогнозите за влака и набора от влакове, трябва да намали шума и да премахне бездомните пиксели на иначе празни изображения.

Празните изображения също могат да бъдат уловени чрез пускане на входното изображение през друг модел, който първо проверява дали е празен. Ако се предвиди празно, вместо да се рискуват няколко пиксела, ще има 0 истински пиксела, предвидени на това изображение.

Други модели, които са по-подходящи за изображения, също могат да осигурят по-добро решение. UNets изглежда доста успешен в конкуренцията, както е видно във форумите. Други конволюционни мрежи също трябва да предоставят тласък както в производителността, така и в скоростта спрямо обикновения модел на дълбока невронна мрежа. Както беше предложено от Sri, GAN подходът също може да работи, тъй като моделът трябва да генерира изображение на маска.

По отношение на скоростта, Cython изглежда обещаващ път за ускоряване на обработката на набор от данни. По-голямата ефективност и по-малкото хардуерни ограничения също биха направили групирането (подреждане/смесване) по-жизнеспособен път за подобряване на производителността на модела.

Ако имате време, желание и компютърни ресурси, вземете щафетата и опитайте състезанието!

Разни обучения

Трикове на командния ред

Познаването на командния ред, макар и да не е задължително за работа с H2O, прави повечето задачи по-лесни. За мен беше достатъчно да знам как да навигирам във файлове, да стартирам Java, да използвам Python и pip, да се свързвам с отдалечени машини и да изпълнявам задачи на тях.

Отдалечени машини

Ако използвате DAI или H2O на отдалечена машина (или нещо друго по този въпрос), тези команди може да са полезни:

wget : изтегляне на машината

ssh : свържете се с командния ред на машината

Byobu може да се използва за запазване на отдалечени сесии (можете да накарате DAI или H2O-3 да работят на отдалечената машина, дори когато връзката е прекъсната) и е много лесна за използване.

Машина за машинно обучение

Както отбелязах по-рано, срещнах множество хардуерни ограничения както по отношение на жизнеспособността, така и по отношение на скоростта. Настройването на машина за машинно обучение би направило всичко по-лесно и по-бързо. „Тази статия“ може да бъде полезна, ако искате да създадете такава. Бележка за GPU: GPU експоненциално ускорява производителността на H2O, но паралелизирането на GPU на H2O е изградено с помощта на CUDA (както и много други скриптове, използвани в ML), така че когато решавате за GPU, вземете такъв с CUDA.

Напред

След като се запознаете с H2O, добра следваща стъпка може да бъде да проучите и разберете повече алгоритми, така че да можете да приложите подходящите алгоритми за случаи на употреба. Това също би могло да подобри резултатите от моделите за групиране. Освен това изучаването на повече научни данни позволява по-добро разбиране и манипулиране на набори от данни, което също би подобрило производителността на модела. И накрая, просто четене на статии, дискусии на Kaggle и поддържане на H2O документацията биха били интересни и забавни начини да научите повече и да генерирате нови идеи.