Expert JS React Developers for TUI wanted. Join Ciklum and get a $4000 sign-on bonus!
×Закрыть

DOU Проектор: Homemade Machine Learning — репозиторий для изучения ML на Python с Jupyter-демо

В рубрике DOU Проектор специалисты рассказывают о том, как создавали свой продукт (как стартап, так и ламповый pet-проект).

Здравствуйте, читатели! Меня зовут Алексей, я работаю JavaScript-программистом. Ранее я писал о том, как в свободное от работы время начал изучать Python и поделился ссылкой на созданный мной репозиторий, который может быть полезным начинающим Pythonist-ам. Эта статья является, по сути, продолжением пути в около-Python-овские «дебри» и, надеюсь, станет полезной тем из вас, кто начинает изучать машинное обучение на Python.

Идея проекта

Сфера машинного обучения для меня лично выглядит очень заманчивой, перспективной и даже «магической». Все эти распознанные лица друзей в Facebook, качественные субтитры на YouTube, мультиязычные переводы, копирование стилей художников, поиск картинок перечислением предметов, изображенных на них, самоуправляемые автомобили и многое другое не может оставить равнодушным. Я понимаю, что «магичность» этой сферы для меня обусловлена отсутствием знания.

Развеивание этой излишней «магичности» я начал с потрясающего курса от Andrew Ng. В нем довольно понятно и детально объясняются базовые алгоритмы машинного обучения и делается это с использованием MatLab/Octave. Сначала я попытался систематизировать полученные знания для себя же, создав репозиторий machine-learning-octave, в котором добавил поддержку «многослойности» для нейронной сети (многослойного перцептрона) и отрефакторил код, чтобы сделать его более читаемым. Но код все так же был написан на Octavе, а использование MatLab/Octave в 2018-м — это, наверное, был немного «привет» из 2010-го...

Чтобы вернуть себя к реальности заканчивающегося 2018 года я запустил новый репозиторий Homemade Machine Learning, который содержит примеры популярных алгоритмов и подходов машинного обучения, таких как линейная регрессия, логистическая регрессия, метод K-средних и нейронная сеть (многослойный перцептрон). Каждый алгоритм содержит интерактивные демостранички, запускаемые в Jupyter NBViewer или Binder. Таким образом у каждого желающего есть возможность изменить тренировочные данные, параметры обучения и сразу же увидеть результат обучения, визуализации и прогнозирования модели у себя в браузере без установки Jupyter локально.

Целью данного репозитория является реализация алгоритмов почти с нуля, для того, чтобы иметь более детальное понимание математических моделей, которые стоят за каждым из алгоритмов.

Реализация проекта

За основу я взял свой предыдущий репозиторий, который начал переписывать на Python и расширять новыми демками на основании новых датасетов. Я новичок в Python и машинном обучении, поэтому для меня многие базовые задачи были сложными. Например, где найти подходящие данные (небольшого размера, ведь мне нужна всего лишь демонстрация алгоритма, а не production-ready продукт), как хранить/деплоить Jupyter ноутбуки (NBViwer или MyBinder? Поддержит ли NBViwer мои кастомные плагины в ноутбуке?), какие библиотеки использовать для обработки данных (Pandas? NumPy? Или их комбинацию?), какие библиотеки использовать для построения графиков (ту же Pandas? Или MatPlotLib? А если надо интерактивное 3D? Может PyPlot?) и многое другое...

В итоге основными используемыми библиотеками стали NumPy и Pandas. Эти библиотеки используются для эффективных операций над матрицами, а также для загрузки и парсинга CSV-данных. В демостраничках для построения графиков и визуализации тренировочных данных также используются библиотеки Matplotlib и Plotly. В случае с логистической регрессией для минимизации функции потерь используется библиотека SciPy, но в остальных случаях градиентный спуск реализован на чистом NumPy/Python. Использования библиотек на подобии PyTorch или TensorFlow избегаю из-за обучающей цели репозитория.

Работа над проектом заняла около одного месяца в свободное от работы время (приблизительно 1-2 часа в день). Ниже опишу алгоритмы, которые на данный момент реализованы в репозитории.

Регрессия. Линейная регрессия

В задачах, связанных с регрессией, мы пытаемся предсказать реальное число на основании входящих данных. По сути, мы строим линию/плоскость/n-мерную плоскость вдоль тренировочных данных, чтобы иметь возможность сделать прогноз для входных данных, отсутствующих в тренировочном сете. Это происходит, например, если мы хотим предсказать стоимость 2-комнатной квартиры в центре города N на 7-м этаже.

Классификация. Логистическая регрессия

В задачах, связанных с классификацией, мы разбиваем данные на классы в зависимости от параметров этих данных. Примером задачей классификации может быть распознавание спама. В зависимости от текста письма (входящие данные) мы относим каждое письмо к одному из двух классов: «спам» или «не спам».

Кластеризация. Метод K-средних

В задачах кластеризации мы разбиваем наши данные на кластеры, которые заранее нам неизвестны. Эти алгоритмы могут использоваться для сегментации рынка, анализа социальных сетей и не только.

Нейронные сети. Многослойный перцептрон (MLP)

Нейронные сети, скорее, являются не алгоритмом, а «паттерном» или «фреймворком» для организации разных алгоритмов машинного обучения в одну систему для дальнейшего анализа сложных входных данных.

Поиск аномалий с помощью распределения Гаусса

В задачах, связанных с поиском аномалий, мы пытаемся выделить те экземпляры данных, которые выглядят «подозрительно» в сравнении с большинством других экземпляров. Например, определение нетипичных (подозрительных) транзакций по банковской карте.

Дальнейшие планы

По мере изучения machine learning я планирую расширять репозиторий дополнительными примерами реализаций AI алгоритмов и примерами их использования. В планах также возможна адаптация Jupyter ноутбуков под Colaboratory и покрытие кода тестами.

Я надеюсь, что вы найдете репозиторий полезным либо для экспериментов с демонстрациями каждого алгоритма, либо для изучения математических моделей, стоящих за ними, либо для анализа деталей имплементации каждого из них.

Успешного кодинга!

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

👍НравитсяПонравилось1
В избранноеВ избранном2
Подписаться на автора
LinkedIn

Похожие статьи




Підписуйтесь: Soundcloud | Google Podcast | YouTube


13 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Спасибо,очень интересно.А откуда брали теоретически часть для наполнения гитхаба?

Клас! Дякую що поділились!

а использование MatLab/Octave в 2018-м — это, наверное, был немного «привет» из 2010-го...

Нет. Это привет из США. Много Питона в этой отрасли исключительно по причине дороговизны матлаба для многих. Там же, где есть деньги на матлабовские лицензии им и пользуются.
Питон отличен заюзать уже сделанные либы, но разрабатывать на нем новое — задница. А вот матлаб отличен для разработки собственно новых алгоритмов и подходов, но очень тяжел и дорог для прода.
Но, если ты не работаешь в универе в США и не разрабатываешь новое, а юзаешь те штатовские разработки, то Питон твой выбор.

А сама статья для начинающих очень прилична. И по ссылкам очень красиво ты сделал.
Да, всё это очень простое, но для начинающих сделано прекрасно тобой.

И ты зря взял кусок отсюда en.wikipedia.org/...​wiki/Precision_and_recall и не положил саму ссылку. Для начинающих она очень полезна.

Виктор, спасибо за комментарий и за разъяснение ситуации с МатЛабом!

По поводу «Precision and recall» ссылки, речь идет об иллюстрации в разделе Anomaly Detection? Если да, то она была взята из статьи F1 Score и ссылка на нее находится внизу раздела. Но указанную ссылку на Precision and Recall статью я так же добавил, думаю не помешает.

В той ссылке там просто весь этот зоопарк, получаемый из стандартных 4-х (FP, FN, TP, TN) в одну кучу собрали. Там же в вике есть ссылка, если память не изменяет, на ROC кривые.
Кстати, мог бы один маленький раздельчик у себя этому посвятить (да и самому тебе многое понятнее станет).
В общем продолжай. Мне очень понравилось твое оформление. Добавишь более современных алгоритмов — вообще учебником станет.
Для начала советую добавить GMM EM, SVM. После что из иерархической кластеризации и xxx-tree (их много и разных). После венгерский алгоритм.
Дальше уже по нейронкам массовым типа CNN и подобным.
И вот эта картинка Machine Learning Map хороша (да там не все и советую в ней чуть обобщенне назвать боксы: а внутри боксов уже готовые реализации подходов).

Спасибо за направление! Постараюсь еще добавить новых алгоритмов.

Еще обрати внимание на информационные критерии (BIC, AIC и т.д.).
Агломеративная по сути делится на 2 больших подхода сверху-вниз и снизу вверх. Одни через разделение идут, другие через обобщение. GMM фиттинг (EM), к-средних и подобные — это одна группа по сути.
И кластеризация используется и в обучении с учителем и без учителя. Даже больше в обучении с учителем. Без учителя пока всё сложно и почти ничего не работает еще.
Дальше автоенкодеры — это большей частью обучение без учителя. Советую именно supervised и unsupervised убрать из этой карты. Это немного о другом, а не о собственно алгоритмах, как таковых.

Это очень здорово! Спасибо, автор!

Я у вільний час проглядаю змагання на www.kaggle.com — схоже у світі ML є великий розрив між базовими знаннями (а-ля я можу розпізнати Fashion MNIST) і реальними задачами (наприклад, www.kaggle.com/...​ognition/discussion/73738)

Зато є досить цікавий курс www.coursera.org/...​data-science/home/welcome

Да, kaggle.com — отличный ресурс. А разрыв между базовыми задачами и реальными задачами есть, думаю, во всех сферах, не только в ML :)

Надо понимать, что между kaggle и реальными задачами разрыв тоже не особо маленький :)

Подписаться на комментарии