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

Здравствуйте, читатели! Меня зовут Алексей, я работаю 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 и покрытие кода тестами.

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

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

LinkedIn

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

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

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

а использование 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 и реальными задачами разрыв тоже не особо маленький :)

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