4 Python библиотеки для интерпретируемого машинного обучения


Оглавление (нажмите, чтобы открыть):

Самая документированная и лёгкая для изучения библиотека машинного обучения Python?

Хочу заняться машинным обучением в Python, я знаю что есть много библиотек для этого, но я не хочу часами лазать по англоязычным форумам и мучиться, уж извиняйте, с какой библиотечкой будет проще? Что почитать из литературы на русском?

Интересует работа с изображениями и предикативными системами, а так-же с простыми обучающимися моделями.

  • Вопрос задан 10 мая
  • 1049 просмотров

конкретно нейросети: keras

книги, ну можно с этой начать

на курсере можно посмотреть курсы от яндекса, если видео больше заходит.

Герман, scikit-learn — это много всяких методов машинного обучения помимо глубокого (т.е. нейронных сетей) — random forest, SVM, LDA и т.д.
Tensorflow — это исключительно нейронные сети, но функционал там в этой части гораздо, гораздо шире, чем в sklearn.
Keras — это сейчас часть tensorflow.

Tensorflow — это весьма крутая штука, и при этом хорошо документированная.

Автостопом по машинному обучению на Python

Машинное обучение на подъеме, этот термин медленно забрался на территорию так называемых модных слов (buzzword). Это в значительной степени связано с тем, что многие до конца не осознают, что же на самом деле означает этот термин. Благодаря анализу Google Trends (статистике по поисковым запросам), мы можем изучить график и понять, как рос интерес к термину «машинное обучение» в течение последних 5 лет:

Но эта статья не о популярности машинного обучения . Здесь кратко описаны восемь главных алгоритмов машинного обучения и их использование на практике. Обратите внимание, что все модели реализованы на Python и у вас должно быть хотя бы минимальное знание этого языка программирования. Подробное объяснение каждого раздела содержится в прикрепленных англоязычных видео. Сразу оговоримся, что полным новичкам этот текст покажется сложным, он скорее подходит для продолжающих и продвинутых разработчиков, но главы материала можно использовать как план для построения обучения: что стоит знать, в чем стоит разобраться в первую очередь.

Классификация

Не стесняйтесь пропускать алгоритм, если чего-то не понимаете. Используйте это руководство так, как пожелаете. Вот список:

  1. Линейная регрессия.
  2. Логистическая регрессия.
  3. Деревья решений.
  4. Метод опорных векторов.
  5. Метод k-ближайших соседей.
  6. Алгоритм случайный лес.
  7. Метод k-средних.
  8. Метод главных компонент.

Наводим порядок

Вы явно расстроитесь, если при попытке запустить чужой код вдруг окажется, что для корректной работы у вас нет трех необходимых пакетов, да еще и код был запущен в старой версии языка. Поэтому, чтобы сохранить драгоценное время, сразу используйте Python 3.6.2 и импортируйте нужные библиотеки из вставки кода ниже. Данные брались из датасетов Diabetes и Iris из UCI Machine Learning Repository . В конце концов, если вы хотите все это пропустить и сразу посмотреть код, то вот вам ссылка на GitHub-репозиторий .

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

Возможно, это самый популярный алгоритм машинного обучения на данный момент и в то же время самый недооцененный. Многие специалисты по анализу данных забывают, что из двух алгоритмов с одинаковой производительностью лучше выбирать тот, что проще. Линейная регрессия — это алгоритм контролируемого машинного обучения, который прогнозирует результат, основанный на непрерывных функциях. Линейная регрессия универсальна в том смысле, что она имеет возможность запускаться с одной входной переменной (простая линейная регрессия) или с зависимостью от нескольких переменных (множественная регрессия). Суть этого алгоритма заключается в назначении оптимальных весов для переменных, чтобы создать линию (ax + b), которая будет использоваться для прогнозирования вывода. Посмотрите видео с более наглядным объяснением.

Теперь, когда вы поняли суть линейной регрессии, давайте пойдем дальше и реализуем ее на Python.

Начало работы

Визуализация

Реализация

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

Логистическая регрессия – алгоритм контролируемой классификации. Она позволяет предсказывать значения непрерывной зависимой переменной на интервале от 0 до 1. Когда начинаешь изучать логистическую регрессию, складывается впечатление, что это своего рода узкоспециализированная вещь, и поэтому не уделяешь ей должного внимания. И лишь позже понимаешь, что очень ошибался. Некоторые из основных аспектов логистической регрессии лежат в основе других важных алгоритмов машинного обучения, например, для повышения точности прогноза нейросетевой модели . Имейте это в виду и смотрите видео ниже.

Теперь попробуем реализовать этот алгоритм на Python.

Начало работы

Визуализация

Реализация

Деревья решений

Метод деревьев решений (decision trees) – это один из наиболее популярных методов решения задач классификации и прогнозирования. Опыт показывает, что чаще всего данный алгоритм используется именно для классификации. На входе модель принимает набор атрибутов, характеризующих некую сущность, а затем спускается по дереву, тестируя их в зависимости от того, какие значения может принимать целевая функция. Таким образом, классификация каждого нового случая происходит при движении вниз до листа, который и укажет нам значение целевой функции в каждом конкретном случае. Деревья принятия решений становятся все более популярными и могут служить очень сильным инструментом для аналитики данных, особенно в сочетании с простыми методами композиции, такими как случайный лес, бустинг и бэггинг. И снова просмотрите видео ниже, чтобы более подробно изучить базовую функциональность деревьев решений.

А теперь по традиции перейдем к практике и реализуем данный алгоритм на Python.

Начало работы

Реализация

Визуализация

Метод опорных векторов

Метод опорных векторов , также известный как SVM, является широко известным алгоритмом классификации, который создает разделительную линию между разными категориями данных. Как этот вектор вычисляется, можно объяснить простым языком — это всего лишь оптимизация линии таким образом, что ближайшие точки в каждой из групп будут наиболее удалены друг от друга.

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

И по традиции реализация на Python.

Начало работы

Реализация

Визуализация

Метод k-ближайших соседей

K-Nearest Neighbors , или KNN, представляет собой контролируемый алгоритм обучения, который используется преимущественно для решения задач классификации. Данный алгоритм наблюдает за разными центрами (центроидами) и сравнивает расстояние между ними, используя для этого различные функции (обычно евклидово расстояние). Затем определяется, к какому классу принадлежит большинство ближайших объектов обучающей выборки – к этому классу относится и неизвестный объект. Посмотрите видео для того, чтобы увидеть что происходит за кулисами данного алгоритма.

Теперь, когда вы поняли общую концепцию метода k-ближайших соседей, давайте напишем реализацию на Python.

Начало работы

Визуализация

Реализация

Случайный лес

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

Теперь мы знаем, что такое случайный лес, пришло время реализации кода на Python.

Начало работы

Реализация

Метод k-средних

Метод k-средних — это популярный алгоритм неконтролируемой классификации обучения, обычно используемый для решения проблемы кластеризации. K обозначает количество введенных пользователем кластеров. Алгоритм начинается со случайно выбранных точек, а затем оптимизирует кластеры при помощи функций (евклидово расстояние и т. д), чтобы найти наилучшую группировку точек данных. В итоге специалистам по большим данным необходимо выбрать правильное значение K. Вы уже знаете, что для полноты картины нужно посмотреть видео.

Теперь, когда вы знаете чуть больше о кластеризации k-средних, давайте реализуем алгоритм на Python.

Начало работы

Реализация

Визуализация

Метод главных компонент

PCA (Principal Component Analysis) — алгоритм сокращения размерности, который может быть очень полезен для аналитиков. Главное — это то, что данный алгоритм может значительно уменьшить размерность данных при работе с сотнями или даже тысячами различных функций. Данный алгоритм не контролируется, но пользователь должен анализировать результаты и следить за тем, чтобы сохранялось 95% или около этой цифры первоначального набора данных. Не забудьте про видео, ведь оно расскажет намного больше об этом интересном алгоритме.

Реализация на Python.

Начало работы

Реализация

Подводим итоги

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

12 лучших Python-библиотек для Data Science

В последние годы Python стал востребованным в области Data Science. Это стало возможным благодаря появлению библиотек, способных обрабатывать и визуализировать большие данные на уровне MATLAB, Mathematica и R. Далее поговорим о 15 лучших.

NumPy

Python SciPy Stack — набор библиотек, специально предназначенных для научных вычислений. Каждый, кто собрался использовать Python в науке, должен познакомиться с этим стеком.
Самый фундаментальный пакет — NumPy. Он позволяет выполнять основные операции над n-массивами и матрицами: сложение вычитание, деление, умножение, транспонирование, вычисление определителя и т. д. Благодаря механизму векторизации, NumPy повышает производительность и, соответственно, ускоряет выполнение операций.

SciPy

SciPy — библиотека в составе Python SciPy Stack, не запутайтесь. Она содержит модули для линейной алгебры, оптимизации, интеграции и статистики. SciPy работает совместно с NumPy, что позволяет ей значительно расширить функциональность. Два аргумента, почему эта библиотека действительно хороша:

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

Pandas

Pandas — это пакет, предназначенный для простой и интуитивно понятной работы с «помеченными» и «реляционными» данными. Тоже работает в связке с NumPy, и помимо математических вычислений обеспечивает их агрегацию и визуализацию.

Matplotlib

Переходим к визуализации, и на очереди ещё одна библиотека из пакета SciPy Stack. Именно возможности Matplotlib позволяют рассматривать Python, как полноправного конкурента MATLAB или Mathematica. С её помощью вы создадите:

  • Линейные графики;
  • Графики рассеяния;
  • Гистограммы;
  • Круговые диаграммы;
  • Стволовые участки;
  • Контурные участки;
  • Участки колчана;
  • Спектрограммы.

Библиотека низкоуровневая, что означает большой объём кода для расширенной визуализации. Но производительность и работа с привычным языком позволяют закрыть глаза на этот недостаток.
Matplotlib является основным инструментом для визуализации данных на языке Python, поддерживается различными платформами и IDE (iPython, Jupyter и пр.)

Seaborn

Seaborn базируется на Matplotlib, но оптимизирован для визуализации статистических моделей: тепловые карты, распределения, результаты математических операций. Несмотря на указанные возможности, большинство разработчиков использует библиотеку для отображения простых временных распределений.

Bokeh

В отличие от Seaborn, Bokeh не зависит от Matplotlib. Основная область его применения — веб, где визуализация данных происходит согласно стилю d3. js (Data-Driven Documents). Визуально графики, построенные при помощи Bokeh, выглядят привлекательнее, чем в предыдущих двух случаях.

Plotly

Plotly — онлайн инструмент .для визуализации данных с поддержкой Python, R, MATLAB, Perl, Julia, Arduino и REST. Библиотека содержит шаблоны и заготовки для повышения производительности. Есть один минус — исполнение кода происходит на серверной стороне, после чего изображение готово к публикации в интернете. Впрочем, есть способ это обойти.

SciKit-Learn

Возвращаемся к пакету библиотек SciPy Stack, чтобы представить SciKit — инструмент для обработки изображений и имитации искусственного интеллекта. Он основывается на библиотеке SciPy и отвечает за реализацию алгоритмов машинного обучения. SciKit, как и его математическая основа, демонстрирует высокую производительность, и имеет качественную документацию.

Theano

Theano — одна из самых мощных библиотек в нашем списке. Вот несколько причин:

  • тесная интеграция с NumPy;
  • использование CPU и GPU для повышения производительности;
  • встроенные механизмы оптимизации кода;
  • расширения для юнит-тестирования и самопроверки.

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

TensorFlow

Библиотека от Google была разработана специально для обучения нейронных сетей. Вы можете прямо сейчас оценить эффективность TensorFlow на примере голосового помощника или в игре «Quick, Draw». Библиотека использует многоуровневую систему узлов для обработки большого количества данных, что расширяет сферу её использования далеко за научную область.

Keras

Keras использует возможности TensorFlow и Theano в качестве компонентов. Минималистичный подход в дизайне и невероятная расширяемость позволяет быстро начать работу с библиотекой, и не менять её для серьёзного моделирования. Keras также используется в построении и обучении нейронных сетей, а также при решении задачи распознавания устной речи.

NLTK расшифровывается как Natural Language Toolkit, что недвусмысленно говорит о назначении библиотеки. Её Преимущественно использует для анализа текстовых документов:

  • тегирования;
  • токенизации;
  • идентификации имен;
  • построения связей между предложениями и частями текста;
  • семантические рассуждения.

Это лишь малая часть Python-библиотек, используемых в Data Science. Некоторые из них приносят общую практическую пользу, другие предлагают оптимизацию под конкретные задачи. Попробуйте их все и выберите для себя лучшие. Только начинаете свой путь в Python? Тогда записывайтесь на наш онлайн-интенсив по основам языка Питон.

Не забудьте поделиться результатами в комментариях.

В последние годы Python стал востребованным в области Data Science. Это стало возможным благодаря появлению библиотек, способных обрабатывать и визуализировать большие данные на уровне MATLAB, Mathematica и R. Далее поговорим о 15 лучших.

NumPy

Python SciPy Stack — набор библиотек, специально предназначенных для научных вычислений. Каждый, кто собрался использовать Python в науке, должен познакомиться с этим стеком.
Самый фундаментальный пакет — NumPy. Он позволяет выполнять основные операции над n-массивами и матрицами: сложение вычитание, деление, умножение, транспонирование, вычисление определителя и т. д. Благодаря механизму векторизации, NumPy повышает производительность и, соответственно, ускоряет выполнение операций.

SciPy

SciPy — библиотека в составе Python SciPy Stack, не запутайтесь. Она содержит модули для линейной алгебры, оптимизации, интеграции и статистики. SciPy работает совместно с NumPy, что позволяет ей значительно расширить функциональность. Два аргумента, почему эта библиотека действительно хороша:

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

Pandas

Pandas — это пакет, предназначенный для простой и интуитивно понятной работы с «помеченными» и «реляционными» данными. Тоже работает в связке с NumPy, и помимо математических вычислений обеспечивает их агрегацию и визуализацию.

Matplotlib

Переходим к визуализации, и на очереди ещё одна библиотека из пакета SciPy Stack. Именно возможности Matplotlib позволяют рассматривать Python, как полноправного конкурента MATLAB или Mathematica. С её помощью вы создадите:

  • Линейные графики;
  • Графики рассеяния;
  • Гистограммы;
  • Круговые диаграммы;
  • Стволовые участки;
  • Контурные участки;
  • Участки колчана;
  • Спектрограммы.

Библиотека низкоуровневая, что означает большой объём кода для расширенной визуализации. Но производительность и работа с привычным языком позволяют закрыть глаза на этот недостаток.
Matplotlib является основным инструментом для визуализации данных на языке Python, поддерживается различными платформами и IDE (iPython, Jupyter и пр.)

Seaborn

Seaborn базируется на Matplotlib, но оптимизирован для визуализации статистических моделей: тепловые карты, распределения, результаты математических операций. Несмотря на указанные возможности, большинство разработчиков использует библиотеку для отображения простых временных распределений.

Bokeh

В отличие от Seaborn, Bokeh не зависит от Matplotlib. Основная область его применения — веб, где визуализация данных происходит согласно стилю d3. js (Data-Driven Documents). Визуально графики, построенные при помощи Bokeh, выглядят привлекательнее, чем в предыдущих двух случаях.

Plotly

Plotly — онлайн инструмент .для визуализации данных с поддержкой Python, R, MATLAB, Perl, Julia, Arduino и REST. Библиотека содержит шаблоны и заготовки для повышения производительности. Есть один минус — исполнение кода происходит на серверной стороне, после чего изображение готово к публикации в интернете. Впрочем, есть способ это обойти.

SciKit-Learn

Возвращаемся к пакету библиотек SciPy Stack, чтобы представить SciKit — инструмент для обработки изображений и имитации искусственного интеллекта. Он основывается на библиотеке SciPy и отвечает за реализацию алгоритмов машинного обучения. SciKit, как и его математическая основа, демонстрирует высокую производительность, и имеет качественную документацию.

Theano

Theano — одна из самых мощных библиотек в нашем списке. Вот несколько причин:

  • тесная интеграция с NumPy;
  • использование CPU и GPU для повышения производительности;
  • встроенные механизмы оптимизации кода;
  • расширения для юнит-тестирования и самопроверки.

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

TensorFlow

Библиотека от Google была разработана специально для обучения нейронных сетей. Вы можете прямо сейчас оценить эффективность TensorFlow на примере голосового помощника или в игре «Quick, Draw». Библиотека использует многоуровневую систему узлов для обработки большого количества данных, что расширяет сферу её использования далеко за научную область.

Keras

Keras использует возможности TensorFlow и Theano в качестве компонентов. Минималистичный подход в дизайне и невероятная расширяемость позволяет быстро начать работу с библиотекой, и не менять её для серьёзного моделирования. Keras также используется в построении и обучении нейронных сетей, а также при решении задачи распознавания устной речи.

NLTK расшифровывается как Natural Language Toolkit, что недвусмысленно говорит о назначении библиотеки. Её Преимущественно использует для анализа текстовых документов:

  • тегирования;
  • токенизации;
  • идентификации имен;
  • построения связей между предложениями и частями текста;
  • семантические рассуждения.

Это лишь малая часть Python-библиотек, используемых в Data Science. Некоторые из них приносят общую практическую пользу, другие предлагают оптимизацию под конкретные задачи. Попробуйте их все и выберите для себя лучшие. Только начинаете свой путь в Python? Тогда записывайтесь на наш онлайн-интенсив по основам языка Питон.

Не забудьте поделиться результатами в комментариях.

ТОП 13 Python библиотек для работы с данными 2020

Поскольку Python в последние годы приобрел большую популярность в отрасли Data Science, я хотел бы изложить некоторые из его наиболее полезных библиотек для работы с данными.

Все библиотеки с открытым исходным кодом и поэтому мы сравним их по таким показателям как количество коммитов, вкладов и запросов на Github, а также Google Trends. Эти данные можно будет использовать как метрики популярности библиотек.

Основные библиотеки

1. NumPy (коммиты: 16348, контрибьюторы: 540)

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

Математические алгоритмы, реализованные на Python, часто работают гораздо медленнее тех же алгоритмов, реализованных на компилируемых языках (например, Фортран, Си, Java). Библиотека NumPy предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB.

2. SciPy (коммиты: 17509, контрибьюторы: 510)

SciPy – это открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке. Библиотека разрабатывается для той же аудитории, что MATLAB и Scilab. Для визуализации при использовании SciPy часто применяют библиотеку Matplotlib, являющуюся аналогом средств вывода графики MATLAB. В настоящее время SciPy распространяется под лицензией BSD и его разработчики спонсируются Enthought.

  • поиск минимумов и максимумов функций;
  • вычисление интегралов функций;
  • поддержка специальных функций;
  • обработка сигналов;
  • обработка изображений;
  • работа с генетическими алгоритмами;
  • решение обыкновенных дифференциальных уравнений;
  • и др.

3. Pandas (коммиты: 15418, контрибьюторы: 848)

Pandas – это библиотека Python,которая является мощным инструментом для анализа данных. Пакет дает возможность строить сводные таблицы, выполнять группировки, предоставляет удобный доступ к табличным данным, а при наличии пакета matplotlib дает возможность рисовать графики на полученных наборах данных. Далее будут показаны основы работы с пакетом, такие как загрузка данных, обращение к полям, фильтрация и построение сводных.

Основные возможности библиотеки:

  • Объект DataFrame для манипулирования индексированными массивами двумерных данных
  • Инструменты для обмена данными между структурами в памяти и файлами различных форматов
  • Встроенные средства совмещения данных и способы обработки отсутствующей информации
  • Переформатирование наборов данных, в том числе создание сводных таблиц
  • Срез данных по значениям индекса, расширенные возможности индексирования, выборка из больших наборов данных
  • Вставка и удаление столбцов данных
  • Возможности группировки позволяют выполнять трёхэтапные операции типа «разделение, изменение, объединение» (англ. split-apply-combine).
  • Слияние и объединение наборов данных
  • Иерархическое индексирование позволяет работать с данными высокой размерности в структурах меньшей размерности
  • Работа с временными рядами: формирование временных периодов и изменение интервалов и т. д.

Статистика Google Trends

История запросов на GitHub

Визуализация

4. Matplotlib (коммиты: 22235, контрибьюторы: 616)

Matplotlib — это библиотека Python для построения качественных двумерных графиков. Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython предоставляет возможности, подобные MATLAB. В настоящее время пакет работает с несколькими графическими библиотеками, включая wxWindows и PyGTK.

Пакет поддерживает многие виды графиков и диаграмм:

  • Графики (line plot)
  • Диаграммы разброса (scatter plot)
  • Столбчатые диаграммы (bar chart) и гистограммы (histogram)
  • Круговые диаграммы (pie chart)
  • Ствол-лист диаграммы (stem plot)
  • Контурные графики (contour plot)
  • Поля градиентов (quiver)
  • Спектральные диаграммы (spectrogram)

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

Несложные трёхмерные графики можно строить с помощью набора инструментов (toolkit) mplot3d. Есть и другие наборы инструментов: для картографии, для работы с Excel, утилиты для GTK и другие.

5. Bokeh (коммиты: 16121, контрибьюторы: 243)

Bokeh — это мощная библиотека с открытым исходным кодом, которая позволяет визуализировать данные для веб-приложений, не написав ни строчки на javascript. Изучение библиотек для визуализации вроде d3.js может оказаться полезным, но гораздо легче написать несколько строк кода на Python, чтобы решить задачу.

Мастер Йода рекомендует:  Визуализация — всё по этой теме для программистов

С Bokeh мы можем создавать поразительно детальные интерактивные визуализации или же более простые вещи, вроде столбчатых диаграмм.

6. Plotly (коммиты: 2593, контрибьюторы: 38)

Plotly – это библиотека, с помощью, которой достаточно легко строить интерактивные графики в Jupyter Notebook’e. В Python есть много библиотек для визуализации, среди них и те, которые позволяют строить интерактивные графики, например, bokeh, pygal и plotly, о котором собственно идет речь.

Plotly позицинируется как online-платформа, где можно создавать и публиковать свои графики. Однако, эту библиотеку можно использовать и просто в Jupyter Notebook’e. К тому же у библиотеки есть offline-mode, который позволяет использовать ее без регистрации и публикации данных и графиков на сервер plotly.

7. SciKit-Learn (коммиты: 22096, контрибьюторы: 898)

Scikit-learn это библиотека для машинного обучения на языке программирования Python с открытым исходным кодом. С помощью нее можно реализовать различныеалгоритмы классификации, регрессии и кластеризации, в том числе алгоритмы SVM,случайного леса, k-ближайших соседей и DBSCAN, которые построены на взаимодействии библиотек NumPyи SciPy с Python.

Достоинствами данной библиотеки являются:

  • Простые и эффективные инструменты для data mining и data analysis;
  • Удобный доступ к необходимым компонентам;
  • Построен на NumPy, SciPy и Matplotlib;
  • Открытый исходный код, лицензия BSD.

Статистика Google Trends

История запросов на GitHub

Machine Learning

8. Theano (коммиты: 26580, контрибьюторы: 313)

Theano — это расширение языка Python, позволяющее эффективно вычислять математические выражения, содержащие многомерные массивы. Библиотека предоставляет базовый набор инструментов для конфигурации нейросетей и их обучения. Наибольшее признание Theano получила в задачах машинного обучения при решении задач оптимизации. Библиотека позволяет использовать возможности GPU без изменения кода программы, что делает ее незаменимой при выполнении ресурсоемких задач.

  • тесная интеграция с NumPy;
  • прозрачное использование GPU;
  • эффективное дифференцирование переменных;
  • быстрая и стабильная оптимизация;
  • динамическая генерация кода на C;
  • расширенные возможности юнит-тестирования и самопроверок;

9. TensorFlow (коммиты: 19862, контрибьюторы: 956)

Проект TensorFlow масштабнее, чем вам может показаться. Тот факт, что это библиотека для глубинного обучения, и его связь с Гуглом помогли проекту TensorFlow привлечь много внимания. Но если забыть про ажиотаж, некоторые его уникальные детали заслуживают более глубокого изучения:

  • Основная библиотека подходит для широкого семейства техник машинного обучения, а не только для глубинного обучения.
  • Линейная алгебра и другие внутренности хорошо видны снаружи.
  • В дополнение к основной функциональности машинного обучения, TensorFlow также включает собственную систему логирования, собственный интерактивный визуализатор логов и даже мощную архитектуру по доставке данных.
  • Модель исполнения TensorFlow отличается от scikit-learn языка Python и от большинства инструментов в R.

10. Keras (коммиты: 3745, контрибьюторы: 493)

Keras – это библиотека, позволяющая на более высоком уровне работать с нейросетями. Она упрощает множество задач, используется в быстрых экспериментах и сильно уменьшает количество однообразного кода. В качестве бекендной библиотеки для вычислений keras может использовать theano и tenzorfow.

Изначально Keras вырос как удобная надстройка над Theano. Отсюда и его греческое имя — κέρας, что значит “рог” по-гречески, что, в свою очередь, является отсылкой к Одиссее Гомера. Хотя, с тех пор утекло много воды, и Keras стал сначала поддерживать Tensorflow, а потом и вовсе стал его частью. Впрочем, наш рассказ будет посвящен не сложной судьбе этого фреймворка, а его возможностям. Если вам интересно, добро пожаловать под кат.

Топ 30 библиотек для машинного обучения

Машинное обучение в современном мире играет огромную роль в бизнесе, IT и программировании. В обзоре будут представлены топ 30 часто используемых библиотек для машинного обучения для 6-ти популярных языков программирования. Не секрет, что наибольшее количество пакетов было создано для язков Python, JavaScript, R, с них и начнем наш обзор.

Машинное обучение в JavaScript

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

Вот пять трендовых платформ машинного обучения с открытым исходным кодом в JavaScript.

TensorFlow.js

TensorFlow.js — это библиотека с открытым исходным кодом, позволяющая полностью запускать программы машинного обучения в браузере. Это наследник Deeplearn.js, который больше не поддерживается.
TensorFlow.js улучшает функциональные возможности Deeplearn.js и дает вам возможность максимально использовать браузер для deep learning.

С помощью библиотеки вы можете использовать универсальные и интуитивно понятные API-интерфейсы для определения, обучения и развертывания моделей с нуля прямо в браузере. Кроме того, он автоматически предлагает поддержку WebGL и Node.js.
Если у вас есть уже существующие обученные модели, которые вы хотите импортировать в браузер, TensorFlow.js позволит вам это сделать. Вы также можете переучить существующие модели, не выходя из браузера.

Machine learning tools

Библиотека инструментов машинного обучения представляет собой сборник ресурсоемких инструментов с открытым исходным кодом для поддержки широко распространенных функций машинного обучения в браузере. Эти инструменты обеспечивают поддержку нескольких алгоритмов машинного обучения, включая обучение без учителя, обработку данных, искусственные нейронные сети (ANN), математику и регрессию.

Если вы начинаете изучать Python и ищете что-то похожее на Scikit-learn для машинного обучения в браузере JavaScript, этот набор инструментов может помочь вам.

Keras.js

Keras.js — еще одна популярная платформа с открытым исходным кодом, которая позволяет запускать модели машинного обучения в браузере. Она предлагает поддержку режима GPU с использованием WebGL. Если у вас есть модели в Node.js, вы будете запускать их только в режиме процессора. Keras.js также предлагает поддержку моделей, обученных с использованием любой серверной среды, такой как Microsoft Cognitive Toolkit (CNTK).

Некоторые из моделей Keras, которые могут быть развернуты в браузере на стороне клиента, включают Inception v3 (обучение по ImageNet), 50-слойную сеть (обучение по ImageNet) и обучение по MNIST.

Brain.js

Концепции машинного обучения очень сложны, что может отбить у людей желание начать их использовать. Технические особенности и жаргоны в этой области могут привести в замешательство новичков. Вот здесь Brain.js становится важным. Это среда с открытым исходным кодом, основанная на JavaScript, которая упрощает процесс определения, обучения и запуска нейронных сетей.

Если вы являетесь разработчиком JavaScript и совершенно не знакомы с машинным обучением, Brain.js может уменьшить вашу кривую обучения. Его можно использовать с Node.js или в браузере на стороне клиента для обучения моделям машинного обучения. Некоторые из сетей, которые поддерживает Brain.js, включают сети Ellman и сети Gated Recurrent Units.

STDLib

STDLib — это библиотека с открытым исходным кодом для поддержки приложений JavaScript и Node.js. Если вы ищете библиотеку, которая подчеркивает поддержку в браузере для научных и числовых веб-приложений машинного обучения, STDLib может удовлетворить ваши потребности.

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

Машинное обучение в Python

NumPy

NumPy — это очень популярная библиотека на python для обработки больших многомерных массивов и матриц с помощью большого набора математических функций высокого уровня. Это очень полезно для фундаментальных научных вычислений в машинном обучении. Это особенно полезно для линейной алгебры, преобразования Фурье и случайных чисел. Высококачественные библиотеки, такие как TensorFlow, используют NumPy для манипулирования Tensors.

SciPy

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

Skikit-learn

Skikit-learn — одна из самых популярных библиотек ML для классических алгоритмов ML. Она построена поверх двух основных библиотек Python, а именно, NumPy и SciPy. Scikit-learn поддерживает большинство алгоритмов обучения. Scikit-learn также можно использовать для анализа данных, что делает его отличным инструментом для начинающих.

Pandas

Pandas — это популярная Python библиотека для анализа данных. Она не имеет прямого отношения к машинному обучению. Как мы знаем, набор данных должен быть подготовлен до обучения. В этом случае Pandas очень пригодится, поскольку он был разработан специально для извлечения и подготовки данных. Библиотека предоставляет высокоуровневые структуры данных и разнообразные инструменты для анализа данных, а также множество встроенных методов поиска, объединения и фильтрации данных.

Keras

Keras — очень популярная библиотека машинного обучения для Python. Это высокоуровневый API нейронных сетей, способный работать поверх TensorFlow, CNTK или Theano. Он может работать как на процессоре, так и на GPU. Keras — это действительно для начинающих data scientist, которые хотят строить и проектировать нейронную сеть. Одним из лучших преимуществ Keras является то, что он позволяет легко и быстро создавать прототипы.

Машинное обучение в R

Dplyr

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

Ggplot2

Ggplot2 — одна из лучших библиотек для визуализации данных в R. Библиотека ggplot2 реализует «грамматику графики» (Wilkinson, 2005). Этот подход дает нам последовательный способ создания визуализаций путем выражения взаимосвязей между атрибутами данных и их графическим представлением. Ggplot2 имеет широкий спектр функций.

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

Caret

Caret отвечает за классификацию и регрессию. Одним из основных инструментов в пакете является функция train, к которой можно привыкнуть, оценив, используя повторную выборку, влияние параметров настройки модели на производительность. У Caret есть несколько функций, которые пытаются упростить процесс построения и оценки модели, а также выбор функций и другие методы. Один этот пакет — это все, что вам нужно знать для решения практически любой проблемы с машинным обучением. Он обеспечивает единый интерфейс для нескольких алгоритмов машинного обучения и стандартизирует различные другие задачи, такие как разделение данных, предварительная обработка, выбор характеристик, оценка важности переменных и т.д.

Esquisse

Не нравится ggplot2? возникли проблемы с использованием ggplot2 и его функций, тогда этот пакет для вас. Этот пакет принес наиболее важную особенность Tableau в R. Просто перетащите и сделайте визуализацию за считанные минуты. На самом деле это улучшение ggplot2. Этот плагин позволяет вам интерактивно исследовать ваши данные, визуализируя их с помощью пакета ggplot2. Это позволяет рисовать гистограммы, кривые, точечные диаграммы, гистограммы, а затем экспортировать график или получить код, генерирующий график.

Машинное обучение в PHP

RubixML

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

PHP-OPENCV

OpenCV — это библиотека функций, в основном предназначенная для компьютерного зрения в реальном времени.
PHP-OPENCV — это модуль, обертка для OpenCV.

PHP-ML

PHP-ML — библиотека машинного обучения для PHP. По умолчанию PHP-ML поддерживает алгоритмы, такие как классификация и регрессия. Он также имеет несколько наборов данных, доступных для изучения, таких как набор данных Iris, Wine и Glass.

Google Cloud Machine Learning

Google ML — это управляемый сервис, который позволяет разработчикам создавать и внедрять модели ML в бизнес-процессы. Он предлагает конвейер, нацеленный на решение проблемы машинного обучения от начала до конца. То есть он предоставляет услуги, которые помогают от самых основных задач, таких как сбор и очистка данных, до более сложных задач, таких как обучение и развертывание в большом масштабе.

Кроме того, его гибкость позволяет пользователям использовать услуги совместно или индивидуально. Другими словами, вы можете взять предварительно обученную модель и использовать службы Cloud ML для ее развертывания в облаке. Поддерживаются разные языки, в том числе PHP.

Tesseract for PHP

Tesseract — это механизм оптического распознавания символов для различных операционных систем. Это бесплатное программное обеспечение, выпущенное по лицензии Apache License версии 2.0. Спонсором разработки является Google с 2006 года. В 2006 году Tesseract считался одним из самых точных доступных на сегодняшний день механизмов распознавания текста с открытым исходным кодом. в PHP доступа обертка под эту библиотеку.

Машинное обучение в Java

Неудивительно, что Weka — выбор номер один для Java библиотеки машинного обучения. Weka 3 — полностью рабочая среда на основе Java, лучше всего используемая для алгоритмов машинного обучения. Weka в основном используется для интеллектуального анализа данных, анализа данных и прогнозного моделирования. Онf полностью бесплатная, портативная и простая в использовании благодаря графическому интерфейсу.

«Сила Weka заключается в классификации, поэтому приложения, которым требуется автоматическая классификация данных, могут извлечь из этого пользу, но также поддерживается кластеризация, извлечение правил ассоциации, прогнозирование временных рядов, выбор функций и обнаружение аномалий», — сказал профессор Эйбе Франк, сотрудник Профессор компьютерных наук в университете Вайкато в Новой Зеландии.

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

Massive Online Analysis (MOA)

MOA — это программное обеспечение с открытым исходным кодом, специально предназначенное для машинного обучения и интеллектуального анализа потоков данных в режиме реального времени. Разработанный на Java, она также может быть легко использована с Weka при масштабировании до более сложных задач. Коллекция алгоритмов машинного обучения и инструментов MOA полезна для регрессии, классификации, обнаружения выбросов, кластеризации, рекомендательных систем. MOA может быть полезен для больших развивающихся наборов данных и потоков данных, а также для данных, создаваемых устройствами Интернета вещей (IoT).

MOA специально разработан для машинного обучения на потоках данных в режиме реального времени. Она нацелена на экономию времени и памяти. MOA предоставляет эталонную среду для проведения экспериментов в области интеллектуального анализа данных, предоставляя несколько полезных функций, включая легко расширяемую структуру для новых алгоритмов, потоков и методов оценки; сохраняемые настройки для потоков данных (реальных и синтетических) для повторяющихся экспериментов и набор существующих алгоритмов для сравнения.

Deeplearning4j

Сообщество JAXenter отметило, что Deeplearning4j один из самых инновационных продуктов экосистемы Java. Deeplearning4j — это коммерческая библиотека с открытым исходным кодом, распространяемая с открытым исходным кодом на Java и Scala. Цель продукта заключается в объединении нейронных сетей и глубокого обучения для бизнес задач.

Deeplearning4j предназначен для самостоятельной работы программистов на Java, Scala и Clojure, работающих над Hadoop, массивной распределенной системой хранения данных с огромной вычислительной мощностью и способностью обрабатывать практически неограниченные параллельные задачи или задания. Глубокие нейронные сети и глубокое обучение способствуют распознаванию образов и целенаправленному машинному обучению. Все это означает, что Deeplearning4j очень полезен для определения шаблонов и настроений в речи, звуке и тексте. Кроме того, его можно использовать для обнаружения аномалий в данных временных рядов, таких как финансовые транзакции.

MALLET

Разработанный в основном Эндрю МакКаллумом и студентами из UMASS и UPenn, MALLET — это инструментальное средство машинного обучения с открытым исходным кодом для изучения языка в тексте. Этот пакет на основе Java поддерживает статистическую обработку естественного языка, кластеризацию, классификацию документов, извлечение информации, тематическое моделирование и другие приложения машинного обучения к тексту.

MALLET включает в себя сложные инструменты для классификации документов, такие как эффективные процедуры для преобразования текста. Он поддерживает широкий спектр алгоритмов (включая простые алгоритмы Байеса, деревья решений и энтропию) и код для оценки производительности классификатора. Также MALLET включает в себя инструменты для маркировки последовательности и моделирования тем.

Среда для разработки KDD-приложений, поддерживаемая Index Structures (сокращенно ELKI), представляет собой программное обеспечение для анализа данных с открытым исходным кодом для Java. ELKI фокусируется на исследованиях алгоритмов, подчеркивая неконтролируемые методы в кластерном анализе, индексах базы данных и обнаружении выбросов. ELKI позволяет независимо оценивать алгоритмы интеллектуального анализа данных и задачи управления данными, разделяя их. Эта функция является уникальной среди других сред интеллектуального анализа данных, таких как Weta или Rapidminer. ELKI также допускает произвольные типы данных, форматы файлов или меры расстояния или подобия.

Разработанный для исследователей и студентов, ELKI предоставляет большой набор настраиваемых параметров алгоритма. Это позволяет честно и легко оценить и сравнить алгоритмы. ELKI особенно полезен для data science; он использовался для выявления вокализации кашалота, полетов в космос, перераспределения акул и прогнозирования трафика. Довольно полезно для аспирантов, которые хотят разобраться в своих наборах данных!

Машинное обучение в C#

ML.NET

ML.NET — это кроссплатформенная среда машинного обучения с открытым исходным кодом, которая делает машинное обучение доступным для разработчиков .NET.

ML.NET позволяет .NET разработчикам разрабатывать свои собственные модели и внедрять индивидуальное машинное обучение в свои приложения, используя .NET, даже без предварительного опыта разработки или настройки моделей машинного обучения.

Наряду с этими возможностями ML в нем также представлен первый проект API-интерфейсов .NET для моделей обучения, использующих модели для предсказаний, а также основные компоненты этой среды, такие как алгоритмы обучения, преобразования и данные ML структур.

TensorFlowSharp

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

Вы можете создавать прототипы, используя TensorFlow или Keras в Python, затем сохранять свои графики или обученные модели, а затем загружать результат в .NET с помощью TensorFlowSharp и передавать свои собственные данные для обучения или запуска.


Accord.NET

Accord.NET — это фреймворк для научных вычислений в .NET. Фреймворк содержит набор библиотек, доступных в исходном коде, а также через исполняемые установщики и пакеты NuGet. Основные области применения включают численную линейную алгебру, числовую оптимизацию, статистику, машинное обучение, искусственные нейронные сети, обработку сигналов и изображений и вспомогательные библиотеки (такие как построение графиков и визуализация). Первоначально проект был создан для расширения возможностей AForge.NET Framework, но с тех пор он включает в себя AForge.NET. Новые версии объединили обе платформы под именем Accord.NET.

Microsoft Azure ML Studio

Этот сервис использует облачные хранилища для машинного обучения. Microsoft предоставляет как платную, так и бесплатную версии, возможность пользоваться готовыми алгоритмами (своими и созданными сторонними компаниями). Тестировать платформу можно через анонимный профиль, а модели превращать в API и предоставлять другим сервисам. В бесплатной версии пользователям доступно 10 Гб, чтобы сохранять дани.Завдякы этом фреймворка создан, например, приложение How-Old (определяет пол и возраст по фотографии).

Amazon Machine Learning

Один из фреймворков компании, который работает с облачными данными с Amazon S3, Redshift и RDS. Он создает модели бинарной и мультикласовои классификации, а также выполняет регрессию. Но сервис сделан именно под Amazon, значит — модели не экспортируются и не импортируются.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Пример решения задачи по машинному обучению на Python

Сейчас многие интересуются машинным обучением и анализом данных. После чтения книг и работы с обучающими курсами по машинному обучению на python может возникнуть ощущение, что полноценная картина не складывается. В таком состоянии браться за реальную задачу совсем не хочется, но выбрать задачу по душе и довести её до конца — лучший способ набраться уверенности в собственных силах. Представляем детальный разбор реальной задачи из сферы Data science.

В общем случае процесс решения задач возникающих в машинном обучении состоит из следующих этапов:

  1. Очистка и форматирование данных
  2. Предварительный анализ данных
  3. Выбор наиболее полезных признаков и создание новых более репрезентативных
  4. Сравнение качества работы нескольких моделей
  5. Оптимизация гиперпараметров в лучшей модели
  6. Проверка модели на тестовой выборке
  7. Интерпретация результатов
  8. Итоговое представление результатов работы

По пути увидите, как каждый новый этап выходит из предыдущего.

Постановка задачи

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

Наша цель — предсказать рейтинг энергопотребления (Energy Star Score) здания и понять, какие признаки оказывают на него сильнейшее влияние.

Данные уже содержат в себе Energy Star Score, так что задача относится к классу задач машинного обучения с учителем, и представляет собой построение регрессии:

  • Обучение с учителем: у нас есть как все необходимые признаки, на основе которых выполняется предсказание, так и сам целевой признак.
  • Регрессия: будем считать, что рейтинг энергопоребления — это непрерывная величина.

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

Чистка данных

Вопреки тому, какое впечатление может сложиться после посещения различных курсов и чтения статей по машинному обучению, данные не всегда представляют собой идеально организованный набор наблюдений без каких-либо пропусков или аномалий (например, можно взглянуть на известные наборы данных mtcars и iris). Обычно данные содержат в себе кучу мусора, который необходимо почистить, да и вообще сами данные порой лучше воспринимать критически, для того чтобы затем привести их в приемлемый формат. Чистка данных — это необходимый этап решения почти любой реальной задачи.

Для начала можно используя Pandas загрузить данные в DataFrame:

Так выглядят реальные данные

Это только фрагмент данных, весь набор содержит 60 признаков. Уже заметна пара проблем: во-первых, мы уже знаем, что хотим предсказать ENERGY STAR Score, но хорошо бы понять, что из себя представляют остальные признаки. Это не всегда проблема, иногда удается построить качественную модель, не имея почти никакого представления о том, что признаки из себя представляют. Но для нас важна интерпретируемость, поэтому важно понимать, что несут в себе основные признаки.

Я начал с того, что вдумчиво прочитал название файла и решил почитать немного про «Local Law 84». Это привело меня сюда, после чего стало ясно, что это закон, действующий на территории Нью-Йорка, требующий владельцев всех зданий определенных габаритов предоставлять отчеты о потреблении электроэнергии. Поискав ещё немного, я даже нашел описание всех признаков.

Название файла, возможно, очевидное место для начала анализа, но торопиться при анализе не стоит, чтобы не упустить ничего важного.

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

Пожалуй, с первой проблемой мы справились. Есть ещё одна: пропущенные данные, вставленные в набор, выглядят как строка с записью “Not Available”. Это означает, что Python, даже если эта колонка содержит в себе преимущественно числовые признаки, будет интерпретировать её как тип данных object, потому что Pandas интерпретируют любой признак содержащий строковые значения как строку. Посмотреть на то, какой тип данных имеет тот или иной признак, можно, используя метод dataframe.info():

Очевидно, многие признаки, являющиеся изначально числовыми (например, площади), интерпретированы как object. Анализировать их крайне сложно, так что сначала конвертируем их в числа, а именно в тип float.

Заменим значение “Not Available” в данных на «не число» ( np.nan — «not a number»), которое Python все же интерпретирует как число. Это позволит изменить тип соответствующих числовых признаков на float:

Как только числовые признаки стали числами, за них уже можно браться всерьез.

Мастер Йода рекомендует:  Категориальное упорядочение результатов запроса

Пропущенные данные и выбросы

В добавок к некорректному определению типов данных, другая частая проблема — это пропуски в данных. У наличия пропусков могут быть разные причины, но пропуски нужно либо заполнить, либо исключить из набора полностью. Для начала попробуем оценить масштаб проблемы (код можно посмотреть в тетрадке).

(Для того чтобы построить эту таблицу, я воспользовался кодом со Stack Overflow Forum).

При удалении данных следует быть осторожным, тем не менее, признак нам вряд ли вообще пригодится, если пропусков в нем слишком много. В данном случае я решил удалить признаки, в которых пропусков больше 50%.

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

  • Ниже первой квартили, минус 3 ∗ межквартильных расстояния
  • Выше третьей квартили, плюс 3 ∗ межквартильных расстояния

(Код содержится в упомянутой тетрадке). На этом этапе в наборе остается более 11,000 записей (строений) и 49 признаков.

Предварительный анализ данных

Теперь когда утомительный, но совершенно необходимый — этап чистки данных закончен, можно углубляться в анализ. Предварительный анализ данных (Exploratory Data Analysis — EDA) — это процесс который можно продолжать до бесконечности, на этом этапе мы строим графики, ищем закономерности, аномалии или связи между признаками.

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

Графики от одной переменной

Напомню, что цель — это предсказание значения целевого признака, рейтинга энергопотребления (переименуем его в score в нашем наборе), так что целесообразно для начала понять, какое эта величина имеет распределение. Посмотрим на него, построив гистограмму с matplotlib.

Пока выглядит довольно подозрительно. Интересующий нас рейтинг представляет собой перцентиль, так что ожидаемо было бы увидеть равномерное распределение, где каждому значению соответствует примерно одинаковое количество зданий. Хотя в нашем случае на лицо диспропорция, больше всего зданий имеют максимальное значение рейтинга — 100, либо минимальное — 1 (высокий рейтинг это хороший показатель).

Обратимся к описанию признака и вспомним, что он основывается на “предоставляемых отчетах об энергопотреблении”. Это, возможно, кое-что объясняет. Просить владельцев зданий отчитаться об эффективности использования электроэнергии, это почти то же самое, что просить поставить студента оценку самому себе на экзамене. В результате мы получаем не самую объективную оценку эффективности использования электроэнергии в зданиях.

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

В поисках отношений

Значительную часть работы на этапе EDA занимает поиск взаимосвязей между различными признаками. Очевидно что признаки и значения признаков, оказывающие основное влияние на целевой, интересуют нас сильнее, чем прочие, по ним лучше всего и предсказывать значение целевого. Одним из способов оценить влияние значений категориальных признаков (число значений такого признака подразумевается конечным) на целевой — density plot, например, используя модуль seaborn.

Density plot можно представить себе как сглаженную гистограмму, потому что она показывает распределение одного значения категориально признака. Раскрасим распределения разными цветами и посмотрим на распределения. Код ниже строит density plot рейтинга энергопотребления. Разными цветами показаны рейтинги различных типов зданий (рассмотрены типы с как минимум сотней записей в нашем наборе):

Видно, что тип здания оказывает существенное влияние на рейтинг энергопотребления. Здания, используемые как офисы, чаще имеют хороший рейтинг, а отели наоборот. Получается, такой признак, как тип здания, для нас важен. Так как это признак категориальный, нам ещё предстоит выполнить с ним так называемый «one-hot encode».

То же самое посмотрим для различных районов:

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

Чтобы численно оценить степень влияния признаков можно использовать коэффициент корреляции Пирсона. Это мера степени и положительности линейных связей между двумя переменными. Значение в +1 означает идеальную пропорциональность между значениями признаков и, соответственно, в -1 аналогично, но с отрицательным коэффициентом. Несколько значений коэффициента корреляции показаны ниже:

Значения коэффициента корреляции Пирсона (Источник)

Несмотря на то что это не дает нам никакого понятия о непропорциональных взаимосвязях, это уже хорошее начало. В Pandas рассчитать величину корреляции довольно легко:

Самые высокие отрицательные и положительные корреляции с целевым признаком:

Можно видеть что есть несколько признаков имеющих высокие отрицательные значения коэффициента Пирсона, с самой большой корреляцией для разных категорий EUI (они между собой слегка отличаются по способу расчета). EUI — Energy Use Intensity — это количество использованной энергии, разделенное на площадь помещений в квадратных футах. Значит, чем этот признак ниже, тем лучше. Соответственно: с ростом EUI, рейтинг энергопотребления становится ниже.

Графики от двух переменных

Чтобы посмотреть на связь между двумя непрерывными переменными, можно использовать scatterplots (точечные графики). Дополнительную информацию, такую как значения категориальных признаков, можно показывать различными цветами. Например, график снизу показывает разброс рейтинга энергопотребления в зависимости от величины Site EUI, а разными цветами показаны типы зданий:

Этот график наглядно демонстрирует, что такое коэффициент корреляции со значением -0.7. Site EUI уменьшается, и рейтинг энергопотребления уверенно возрастает, независимо от типа здания.

Ну и наконец, построим Pairs Plot. Это мощный исследовательский инструмент, он позволяет взглянуть на взаимосвязи сразу между несколькими признаками одновременно, а так же на их распределение. В примере при построении использовался модуль seaborn и функция PairGrid. Построен Pairs Plot со scatterplots выше главной диагонали, гистограммами на главной диагонали и 2D kernel density plots, с указанием корреляции, ниже главной диагонали.

Чтобы посмотреть на интересующие нас отношения между величинами, ищем пересечения строк и колонок. Например, чтобы взглянуть на корреляцию между Weather Norm EUI со score, смотрим на строку Weather Norm EUI и колонку score. Видно, что коэффициент Пирсона равен -0.67. Помимо того, что график красиво выглядит, он ещё может помочь понять, какие признаки стоит включить в нашу модель.

Выбор и создание новых признаков

Выбор и создание новых признаков зачастую оказывается одним из самых «благодарных» занятий по соотношению усилия/вклад в результат. Для начала, пожалуй, поясню что это такое:

  • Создание новых признаков (Feature engineering): процесс при котором берутся данные как они есть и затем на основе имеющихся данных конструируются новые признаки. Это может означать изменение непосредственно самих значений, например логарифмирование, взятие корня, или onehotencoding категориальных признаков для того чтобы модель могла их эти признаки обработать. Иногда это создание совершенно новых признаков, которые раньше явным образом в данных не содержались, но, в общем, это всегда добавление в набор новых признаков, полученных из первоначальных данных.
  • Выбор признаков (Feature selection): процесс выбора наиболее релевантных признаков. При этом из набора удаляются признаки для того чтобы модель уделила больше внимания и ресурсов первостепенным признакам, а также это помогает получить более легкоинтерпретируемые результаты. В общем, это чистка набора при которой остаются только наиболее важные для нашей задачи данные.

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

На данном этапе я выполнил следующую последовательность действий:

  • One-hot кодирование категориальные признаков (район и тип здания);
  • Логарифмирование числовых данных.

One-hot кодирование необходимо выполнить для того, чтобы модель могла учесть категориальные признаки. Модель не сможет понять, что имеется ввиду, когда указано, что здание используется как “офис”. Нужно создать новый соответствующий признак и присвоить ему значение 1, если данная запись содержит сведения об офисе и 0 в противном случае.

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

Приведенный ниже код этим и занимается: логарифмирует числовые признаки, а так выделяет два упомянутых категориальных признака и применяет к ним one-hot кодирование. Затем объединяет полученные при этом наборы. Звучит довольно утомительно, но Pandas позволяет это проделать относительно легко.

В итоге в нашем наборе теперь всё ещё 11,000 записей (зданий) и 110 колонок (признаков). Не все эти признаки одинаково важны для нашей задачи, так что перейдем к следующему шагу.

Выбор признаков

Многие из 110 признаков для нашей модели избыточны, т.к. некоторые из них сильно коррелируют. Например, зависимость Site EUI от Weather Normalized Site EUI, которая имеют коэффициент корреляции 0.997.

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

Есть много способов поиска коллинеарных признаков, например, один из широко используемых — расчет коэффициента увеличения дисперсии. Сам я решил использовать так называемый thebcorrelation коэффициент. Один из двух признаков будет автоматически удален если коэффициент корреляции для этой пары выше 0.6. Посмотреть как именно это было реализовано можно в той же тетрадке (и на форуме Stack Overflow)

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

Оцениваем результат работы алгоритма

Уже выполнена чистка данных, предварительный анализ, оставлены только полезные признаки. Последний шаг перед началом обучения модели — определение критерия, по которому можно понять, есть ли хоть какой-то толк от нашего алгоритма. Например, можно сравнить результат работы модели с попыткой просто угадать целевой признак, ничем особым не руководствуясь. Если наш алгоритм работает хуже, чем неосмысленный перебор возможных значений целевого признака, тогда стоит попробовать другой подход, возможно, даже не связанный с машинным обучением.

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

В качестве метрики я решил использовать среднее абсолютное отклонение (mean absolute error (MAE)), название дает исчерпывающее представление о том, что это за величина. Метрика довольно легко рассчитывается, и она наглядна. Мне нравится совет Andrew Ng, который рекомендует выбрать какую-то одну и на протяжении выполнения всех оценок пользоваться ей.

До расчета упомянутого критерия, нужно разделить выборку на обучающую и проверочную (тестовую):

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

Используем 70% записей для обучения и на 30% проверим работу:

Теперь все готово для расчета:

При такой грубой оценке в наш интервал не попало всего 25 точек возможных значений целевого признака. Значения самого признака изменяются в диапазоне от 1 до 100, так что ошибка составила 25%, что, вообще говоря, не самый выдающийся показатель.

Заключение

В этой статье рассмотрены первые три характерных этапа решения задачи в машинном обучении:

  1. Очистка и форматирование данных;
  2. Предварительный анализ данных;
  3. Выбор наиболее полезных признаков, а так же создание новых и более репрезентативных.

Наконец, мы также определили порог, по которому будем оценивать применимость наших моделей.

Python-библиотеки интерпретации моделей ML

Все эти библиотеки устанавливаются через pip и сопровождаются подробной документацией. Акцент в них делается на визуализацию.

Yellowbrick

Yellowbrick — это расширение scikit-learn , которое позволяет использовать полезные и красивые визуализации для моделей машинного обучения. Объекты визуализатора и интерфейс ядра — это функции оценки scikit-learn . Если ранее вы работали с данной библиотекой, то рабочий процесс будет вам знаком. Визуализации отображают выбор модели, важность признаков и анализ производительности. Далее небольшие примеры.

Рассмотрим некоторые возможности на примере датасета распознания вин в scikit-learn . В него входит 13 признаков и 3 целевых класса, которые могут быть загружены напрямую из scikit-learn . В коде ниже датасет импортируется и преобразуется в таблицу данных. Данные могут использоваться в классификаторе без предварительной обработки:

Через scikit-learn можно запустить проверку данных и обучение:

Посмотрим на корреляции между признаками:

Теперь подключим RandomForestClassifier и представим анализ данных в другом визуализаторе:

ELI5 — еще одна визуальная библиотека, удобная для устранения ошибок в моделях и для объяснения прогнозов. Она совместима с самыми популярными Python-библиотеками ML: scikit-learn , XGBoost и Keras . При помощи ELI5 посмотрим на важность признаков нашей модели:

По умолчанию метод show_weights использует gain , чтобы рассчитать вес, но можно вычислить другие характеристики, добавив аргумент importance_type . Для определения оснований прогноза можно использовать use_prediction .

LIME (локально интерпретируемое объяснение, не зависящее от устройства модели) — пакет, используемый для интерпретации прогнозов тех или иных алгоритмов машинного обучения. Lime поддерживает объяснения для индивидуальных прогнозов широкого круга классификаторов. Встроена поддержка scikit-learn .

Будем работать с нашей моделью. Сначала создадим интерпретатор. Он видит набор данных как массив. Имена признаков используются в модели, а имена классов в целевой переменной.

Создадим лямбда-функцию, использующую модель для прогнозирования на основе имеющихся данных:

Также используем интерпретатор для расшифровки прогноза. Результат приведён ниже. При помощи Lime можно создать визуализацию, отображающую влияние конкретных признаков на прогноз:

MLxtend

Библиотека MLxtend содержит ряд вспомогательных функций для машинного обучения. Например, для StackingClassifier и VotingClassifier , эволюции модели, извлечения признаков, для разработки и для визуализации данных. С помощью MLxtend и сравним границы решения VotingClassifier и входящих в его состав классификаторов:

Необходимые пакеты представлены ниже:

Данная визуализация обрабатывает одновременно только два признака, поэтому создадим массив, который будет содержать признаки proline и color_intensity . Они имеют наибольший вес среди всех остальных, как было выяснено в процессе работы с ELI5.

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

Библиотеки Python для машинного обучения

На сегодняшний день Python является одним из самых популярных языков программирования, который заменил многие другие языки в огромном количестве прикладных сфер. Одной из причин большой популярности Python (но далеко не единственной) является огромное количество всевозможных готовых библиотек. В области машинного обучения и электросетей около половины всех решения выполнено на Python. К другим достоинствам языка Python стоит отнести его простоту, небольшую сложность для старта, мультиплатформенность, а также существенно более простым синтаксисом (в сравнении с C, C++, Java ).

TensorFlow

Начать стоит с самой известной и самой популярной библиотеки для машинного обучения — TensorFlow. Наверняка вы слышали о ней, если хоть как-то затрагивали тему нейросетей и machine learning. Tensor Flow – это библиотека с открытым кодом, разработанная людьми из Google и Brain Team. Google сам использует эту библиотеку, в частности, для распознавания образов в Google Photo, а также в Google Voice Search.

TensowFlow позволяет писать собственный алгоритмы, которые работают с тензорами и тензорными операциями. Так как практически любой алгоритм машинного обучения можно выразить графами, то TensorFlow со своими широкими возможностями оперирования с тензорами оказывается как нельзя кстати.

К достоинствам TensorFlow стоит отнести высокую степень параллелизации, а также возможность работы как на центральном, так и на графическом процессоре. Сам TensorFlow написан на C и C++, однако, он отлично интегрируется с Python. Python код будет компилироваться и исполняться на распределенном движке, написанном на «быстрых» С и С++. TensorFlow, как основа для построения Machine-Learning алгоритмов, оптимизирован и быстр.

Keras

Keras — еще одна известная библиотека Python, работающая поверх TensorFlow. Keras – хороший выбор для тех, кто только начал изучать машинное обучение. Он позволяет работать с нейросетями на достаточно высоком уровне, однако, за это приходится платить некоторой нерасторопностью и медленностью библиотеки. Keras содержит в себе большое количество встроенных библиотек для визуализации и обработки данных.

Помимо TensorFlow, Keras в качестве бэкенда может использовать и Theano; однако, при выборе TensorFlow вам лучше придерживаться архитектуры TensorFlow.

NumPy

NumPy – вторая по популярности библиотека для машинного обучеения. Так, TensorFlow сам использует NumPy для решения ряда своих задач. Основная особенность NumPy — это работа с матрицами и массивами. NumPy необходим для представления звуковых и графических данных в виде N- метрных массивов чисел. NumPy – очень важная библиотека для тех, кто хочет посвятить себя машинному обучению.

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

Знакомство с Python, машинным обучением и библиотекой NLTK

Разработка приложений для категоризации лент RSS при помощи Python, NLTK и машинного обучения

Знакомимся с Python

Эта статья предназначена для разработчиков ПО — особенно имеющих опыт работы с языками Ruby или Java, — которые впервые сталкиваются с машинным обучением.

Задача: Использование машинного обучения для категоризации лент RSS

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

Представительница заказчика предложила использовать машинное обучение, возможно на базе Apache Mahout и Hadoop, так как недавно читала об этих технологиях. Однако разработчики как из ее, так и из нашей команды имели больше опыта работы с Ruby, а не с Java™. В этой статье я рассказываю обо всех технических изысканиях, процессе обучения и, наконец, об итоговой реализации решения.

Что такое машинное обучение?

Мой первый вопрос в данном проекте звучал так: «Что такое машинное обучение на самом деле?». Я слышал этот термин и знал, что суперкомпьютер IBM® Watson недавно победил реальных людей в игру Jeopardy. Как покупатель интернет-магазинов и участник социальных сетей я также понимал, что Amazon.com и Facebook прекрасно справляются с задачей подбора рекомендаций (продуктов или людей) на основании данных о своих покупателях. Если говорить кратко, машинное обучение лежит на пересечении ИТ, математики и естественного языка. В основном этот процесс связан с тремя перечисленными ниже аспектами, но решение для нашего клиента было основано на первых двух:

  • Классификация. Отнесение элементов к предварительно объявленным категориям исходя из тренировочных данных для аналогичных элементов.
  • Рекомендация. Выбор рекомендованных элементов исходя из наблюдений за выбором аналогичных элементов
  • Кластеризация. Выявление подгрупп в массиве данных

Неудачная попытка — Mahout и Ruby

Разобравшись в том, что представляет собой машинное обучение, мы перешли к следующему шагу — поиску способов реализации. По предположению клиента, хорошей отправной точкой мог бы стать Mahout. Я загрузил код с сервера Apache и начал изучать процесс машинного обучения в Mahout и в Hadoop. К сожалению, я обнаружил, что Mahout сложен в изучении даже для опытного разработчика на Java и не имеет работающих примеров кода. Не меньше огорчило ограниченное количество инфраструктур и gem-пакетов для машинного обучения на Ruby.

Находка — Python и NLTK

Я продолжил искать решение; в результатах поиска постоянно обнаруживались упоминания Python. Как приверженец Ruby, я знал, что Python является динамическим языком программирования и использует такую же объектно-ориентированную текстовую модель интерпретации, хотя никогда не изучал этот язык. Несмотря на эти сходства, я много лет уклонялся от изучения Python, считая его лишним знанием. Таким образом, Python был моим «слепым пятном», и я подозреваю, что такая же картина наблюдается у многих коллег-программистов на Ruby.

Поиск книг по машинному обучению и детальное изучение их содержания показали, что значительная часть подобных систем реализуется на Python в сочетании с библиотекой для работ с естественными языками Natural Language Toolkit (NLTK). Дальнейшие поиски позволили выяснить, что Python используется гораздо чаще, чем я думал, например, в движке Google App, на YouTube, а также на веб-сайтах, использующих Django. Оказывается, он изначально установлен на рабочих станциях Mac OS X, с которыми я ежедневно работаю! Более того, Python обладает интересными стандартными библиотеками (например, NumPy и SciPy) для математических расчетов, научных изысканий и инженерных решений. Кто же мог знать?

Обнаружив элегантные примеры кода, я решил использовать решение на Python. Например, приведенный ниже однострочный код делает все необходимое для получения RSS-новости по протоколу HTTP и печати ее содержимого:

Продвигаемся к цели вместе с Python

При изучении нового языка программирования самой простой частью является обучение самому языку. Более сложный процесс — изучение экосистемы. Нужно разобраться, как его устанавливать, как добавлять библиотеки, писать код, структурировать файлы, запускать, отлаживать и подготавливать тесты. В этой части мы приводим краткое введение в данные разделы; не забудьте просмотреть ссылки из раздела Ресурсы— там может быть много полезной информации.

Python Package Index ( pip ) — стандартный менеджер пакетов в Python. Это именно та программа, которую вы будете использовать для добавления библиотек в вашу систему. Он аналогичен gem для библиотек Ruby. Чтобы добавить библиотеку NLTK в вашу систему, вам нужно выполнить следующую команду:

Чтобы отобразить перечень библиотек Python, установленных в вашей системе, используйте команду:

Запуск программ

Запуск программ на Python происходит так же просто. Если у вас есть программа locomotive_main.py , принимающая три аргумента, вы можете скомпилировать и запустить выполнение кода при помощи следующей команды на python :

Мастер Йода рекомендует:  14 новых front-end фреймворков, о которых вам стоит знать

Синтаксис if __name__ == «__main__» , приведенный в листинге 1, используется в языке Python для того, чтобы определить, запущен ли файл отдельно из командной строки или же вызван другим фрагментом кода. Чтобы сделать программу выполняемой, добавьте в нее проверку на «__main__» .

Листинг 1. Проверка статуса Main

virtualenv

Многие программисты на Ruby знакомы с проблемой общих системных библиотек, также называемых gem. Применение общесистемных наборов библиотек, как правило, нежелательно, поскольку один из ваших проектов может полагаться на версию 1.0.0 имеющейся библиотеки, а другой — на версию 1.2.7. Разработчики на Java сталкиваются с подобной проблемой в случае общесистемной переменной CLASSPATH. Подобно инструменту rvm в Ruby, в Python используется инструмент virtualenv (см. ссылку в разделе Ресурсы), создающий отдельные среды исполнения программ, включая специальные инструкции Python и наборы библиотек. Команды в листинге 2 показывают, как создать виртуальную среду исполнения с именем p1_env для вашего проекта p1 , в состав которого будут входить библиотеки feedparser , numpy , scipy и nltk .

Листинг 2. Создание виртуальной среды исполнения с помощью virualenv

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

/.bash_profile запись наподобие следующей:

Базовая структура кода

Освоив простые программы уровня «Hello World», разработчику на Python необходимо научиться правильно структурировать код с учетом каталогов и имен файлов. Как и в Java или Ruby, в Python есть для этого свои правила. Если говорить коротко, Python использует для группировки связанного кода концепцию пакетов и использует однозначно определенные пространства имен. В целях демонстрации в данной статье код размещается в корневом каталоге проекта, например,

/p1. В нем имеется подкаталог locomotive, содержащий одноименный Python- пакет. Эта структура каталогов показана в листинге 3.

Листинг 3. Пример структуры каталогов

Обратите внимание на файлы со странным названием __init__.py . В этих файлах содержатся инструкции Python для подгрузки необходимых библиотек к вашей среде, а также к вашим специальным приложениям, которые находятся в том же каталоге. В листинге 4 приведено содержимое файла locomotive/__init__.py.

Листинг 4. locomotive/__init__.py

При структуре пакета locomotive , показанной в листинге 4, основные программы из корневого каталога вашего проекта могут импортировать и использовать его. Например, файл locomotive_main.py содержит следующие команды импорта:

Тестирование

Стандартная Python-библиотека unittest предоставляет удобные ресурсы для тестирования. Разработчики на Java, знакомые с JUnit, а также специалисты по Ruby, работающие с инфраструктурой Test::Unit, легко поймут код Python unittest из листинга 5.

Листинг 5. Python unittest

Содержимое листинга 5 также демонстрирует отличительную черту Python: для успешной компиляции код должен иметь единообразно установленные отступы. Метод tearDown(self) может показаться странным — зачем в коде теста запрограммирован успешный результат прохождения? На самом деле в этом нет ничего страшного. Таким образом в Python можно запрограммировать пустой метод.

Инструменты

Что мне действительно было необходимо — так это интегрированная среда разработки (IDE) с подсветкой синтаксиса, завершением кода и возможностью исполнения с контрольными точками, чтобы освоиться в Python. Как пользователь Eclipse IDE для Java, я первым делом обратил внимание на pyeclipse . Этот модуль работает достаточно неплохо, но иногда — очень медленно. В конце концов я выбрал IDE PyCharm, которая удовлетворила все мои требования.

Итак, вооружившись базовыми знаниями о Python и его экосистеме, я, наконец, был готов к реализации машинного обучения.

Реализация категорий на Python и NLTK

Для построения решения мне нужно было обрабатывать имитационные ленты новостей RSS, анализировать их текст при помощи NaiveBayesClassifier , а затем классифицировать их по категориям посредством алгоритму kNN. Каждое из этих действий описано в данной статье.

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

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

Первый способ получения образцов данных лент новостей, который я использовал, состоял в том, чтобы сохранить содержимое списка лент RSS в текстовом файле. В Python есть очень неплохая библиотека для обработки лент RSS под названием feedparser , которая позволяет скрыть различия между различными форматами RSS и Atom. Еще одна полезная библиотека для сериализации простых текстовых объектов шутливо названа pickle («маринад»). Обе библиотеки используются в коде из листинга 6, который сохраняет каждую ленту RSS в «замаринованном» виде для дальнейшего использования. Как вы можете видеть, программный код на Python является лаконичным и мощным.

Листинг 6. Класс CaptureFeeds

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

Например, среди образцов лент, которые я использовал, был канал спортивных новостей ESPN. Одно из сообщений повествовало о том, что Тим Тэбоу (Tebow) из футбольной команды Denver Broncos был куплен New York Jets, а в то же время Broncos подписали контракт с Пейтоном Мэннингом (Manning), который стал их новым полузащитником (quarterback). Другое сообщение касалось компании Boeing и ее нового реактивного авиалайнера (англ. jet). Возникает вопрос: к какой категории следует отнести первую историю? Прекрасно подходят слова tebow , broncos , manning , jets , quarterback , trade и nfl . Но для указания категории обучающих данных нужно выбрать всего одно слово. То же самое можно сказать и про вторую историю — что выбрать, boeing или jet ? Вся сложность работы состояла именно в этих деталях. Тщательное ручное категорирование большого количества обучающих данных просто необходимо, если вы хотите, чтобы ваш алгоритм выдавал точные результаты. И время, которое придется потратить на это, нельзя недооценивать.

Скоро стало очевидно, что мне нужны еще данные для работы, причем они уже должны быть разбиты по категориям — и достаточно точно. Где искать такие данные? И тут на сцену выходит Python NLTK. Помимо того, что это великолепная библиотека для обработки текстов на естественных языках, к ней прилагаются готовые загружаемые наборы исходных данных, т.н. «корпуса», а также программные интерфейсы для удобного доступа к этим данным. Чтобы установить корпус Reuters, вам нужно выполнить приведенные ниже команды, и в ваш каталог

/nltk_data/corpora/reuters/ будет загружено более 10 000 новостных сообщений. Как и элементы ленты RSS, каждая новостная статья Reuters содержит заголовок и основную часть, поэтому категорированные данные NLTK идеально подходят для имитации лент новостей RSS.

Особый интерес представляет файл

/nltk_data/corpora/reuters/cats.txt. В нем содержится перечень имен файлов с заметками, а также категории, назначенные каждому из файлов. Следующие записи обозначают, что файл 14828 в подкаталоге test отнесен к теме grain .

Естественный язык — это сложно

Сырьем для нашего алгоритма категорирования RSS-материалов, разумеется, являются простые тексты на английском языке. Термин «сырье» здесь весьма уместен.

Английский, как и любой другой естественный язык (язык повседневного общения) отличается чрезвычайной неоднородностью и непоследовательностью с точки зрения компьютерной обработки. Первым делом возникает вопрос с регистром. Можно ли считать слово Bronco равным bronco? Ответ будет: «возможно». Также важны пунктуация и пробелы. Можно ли сравнивать bronco. с bronco или bronco,? Вроде бы да. Далее, существуют формы множественного числа и схожие слова. Можно ли считать run, running и ran эквивалентными формами? Зависит от ситуации. Эти три слова являются однокоренными. А что если слова из естественного языка также сопровождаются тегами HTML? В этом случае вам придется работать с такими элементами, как bronco . Наконец, существует проблема часто используемых, но фактически ничего не значащих слов, таких как артикли, союзы и предлоги. Эти так называемые вспомогательные слова усложняют обработку. Таким образом, естественный язык весьма беспорядочен и требует очистки перед началом работы.

К счастью, Python и NLTK позволяют вам легко избавиться от этого мусора. Метод normalized_words из класса RssItem в листинге 7, позволяет исключить все эти препятствия. В частности, обратите внимание, как NLTK очищает сырой текст статьи от встроенных тегов HTML при помощи всего одной строчки кода! Кроме того, с помощью регулярного выражения выполняется удаление пунктуации, после чего текст делится на слова и переводится в нижний регистр.

Листинг 7. Класс RssItem

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

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

Классификация по простому байесовскому алгоритму

Алгоритм Naive Bayes (простой байесовский алгоритм) широко известен и встроен в NLTK в виде класса nltk.NaiveBayesClassifier . Байесовский алгоритм позволяет классифицировать элементы по факту наличия или отсутствия определенных элементов в их составе. В случае с лентами RSS в качестве элементов используются определенные (очищенные) слова естественного языка. Алгоритм является «простым» в том смысле, что не подразумевает взаимосвязей между элементами (в нашем случае словами).

Однако в английском языке имеется более 250 000 слов. Безусловно, я не хотел бы создавать объект с 250 000 логических значений для каждой ленты RSS, чтобы реализовать алгоритм. Итак, какие слова использовать? Если говорить кратко, это должны быть наиболее часто встречающиеся слова из тестовых данных, которые не являются вспомогательными. В NLTK имеется очень удобный класс nltk.probability.FreqDist , который позволяет выявить эти популярные слова. А приведенный в листинге 8, метод collect_all_words возвращает массив, содержащий все слова из всех тренировочных заметок.

Далее этот массив обрабатывается методом identify_top_words , который возвращает наиболее часто встречающиеся слова. Удобная функция класса nltk.FreqDist фактически создает хэш, но его ключи оказываются отсортированными согласно соответствующим значениям (количеству вхождений). Таким образом, можно легко выделить 1000 самых часто встречающихся слов, указав диапазон индексов [:1000] в соответствии с синтаксисом Python.

Листинг 8. Использование класса nltk.FreqDist

Для имитации лент RSS на базе данных NLTK из статей Reuters мне нужно было выделить категории для каждой из них. Я сделал это, читая файл

/nltk_data/corpora/reuters/cats.txt, о котором я уже говорил ранее. Чтение файла на Python происходит просто:

Следующий шаг — получение характеристик каждого сообщения из ленты RSS. Это действие выполняет метод features из класса RssItem, продемонстрированный ниже. При работе данного метода массив всех слов ( all_words ) статьи сначала сокращается до меньшего по размерам набора уникальных слов ( set ) за счет устранения дубликатов слов. Далее выполняется проход по списку наиболее распространенных слов top_words и проверка их наличия или отсутствия в статье. В результате мы получаем хэш из 1000 логических значений, ключами которого являются сами слова с префиксом w_ . Соответствующий код на Python весьма краток.

Далее я собираю тренировочный набор сообщений RSS и их индивидуальных характеристик и передаю их на обработку алгоритму. Код из листинга 9 демонстрирует выполнение этой задачи. Обратите внимание, что обучение классификатора занимает ровно одну строчку кода.

Листинг 9. Обучение nltk.NaiveBayes >

Итак, классификатор NaiveBayesClassifier , находящийся в памяти работающей программы Python, обучен. Теперь я могу просто пройти по списку лент RSS, которые нужно классифицировать, и определить с помощью классификатора категорию для каждого из элементов. Очень просто.

Менее простая классификация

Как уже говорилось ранее, наш алгоритм не подразумевает наличия взаимосвязей между индивидуальными параметрами. Таким образом, фразы типа «machine learning» и «learning machine» либо «New York Jet» и «jet to New York» являются эквивалентами (предлог «to» исключается как вспомогательное слово). В естественном же языке между этими словами имеются очевидные связи. Как сделать алгоритм менее «простым» и научить его распознавать эти взаимосвязи между словами?

Один из методов — включить в набор параметров распространенные словосочетания из двух (биграммы) и трех слов (триграммы). И мы уже не удивляемся тому, что в NLTK имеется поддержка этих возможностей в виде функций nltk.bigrams(. ) и nltk.trigrams(. ) . Точно также как библиотека выбирала из всего набора данных N самых часто встречающихся слов, она может идентифицировать самые популярные двух- и трехсловные словосочетания и использовать их в качестве параметров.

Ваши результаты могут быть другими

Очистка данных и применение алгоритма — это своего рода искусство. Стоит ли нормализовать набор слов еще сильнее, например, выделяя корни? Или нужно включить в набор более чем 1000 самых частых слов? Или меньше? Или, может быть, нужно использовать более объемный набор данных для обучения? Или определить больше слов как вспомогательные? Все эти вопросы вы можете задать самим себе. Экспериментируйте с ними, пробуйте, проходите через ошибки, и вы сможете создать лучший алгоритм для ваших данных. Я решил для себя, что 85% — это хороший уровень успешной категоризации.

Рекомендации к алгоритму k-Nearest Neighbors

Клиент хотел отображать элементы ленты RSS в выбранной категории или в связанных категориях. Теперь, когда данные были категоризованы при помощи простого байесовского алгоритма, первая часть требований заказчика была выполнена. Более сложной оказалась задача определения «связанных категорий». В этом случае нужно использовать системы рекомендаций на основе алгоритмов машинного обучения. Система рекомендаций основывается на схожести одних элементов с другими. Хорошими примерами таких функций являются рекомендации продуктов на Amazon.com и рекомендации друзей в Facebook.

Наиболее популярным алгоритмом для построения рекомендаций является алгоритм k-Nearest Neighbors (kNN, k ближайших соседей). Идея состоит в том, чтобы создать перечень меток (категорий) и сопоставить каждой метке набор данных. Далее алгоритм сравнивает наборы данных, выявляя совпадающие элементы. Набор данных представлен набором численных значений, обычно приведенных к нормализованному виду — от 0 до 1. Затем можно выделять похожие метки на основании наборов данных. В отличие от простого алгоритма Байеса, который дает один результат, kNN может выдать целый перечень рекомендаций со степенями совпадения (определяется значением k).

Алгоритмы рекомендации показались мне более простыми для понимания и реализации, чем алгоритмы классификации, хотя сам код оказался более длинным и слишком сложным с математической точки зрения, чтобы приводить его здесь. Примеры кода для kNN можно найти в великолепной новой книге издательства Manning «Machine Learning in Action (см. ссылку в разделе Ресурсы). В нашем случае с обработкой лент RSS значения меток совпадали с категориями, а наборы данных представляли собой массивы значений для 1000 самых популярных слов. Еще раз повторюсь, что создание такого массива — это частично наука, частично математика и частично искусство. Для каждого слова в массиве значение может представлять собой булеву величину (0 или 1), частоту встречаемости слова в процентах, экспоненциальное выражение от частоты или другую величину.

Заключение

Знакомство с Python, NLTK и машинным обучением оказалось интересным и приятным. Python — это мощный и лаконичный язык программирования, который теперь стал одной из основных частей моего инструментария разработчика. Он прекрасно подходит для реализации машинного обучения, обработки естественного языка и математических и научных приложений. Кроме того, хотя я не упомянул этого в данной статье, он показался мне полезным для создания диаграмм и графиков. И если у вас Python также находился «в слепой зоне», я советую вам познакомиться с ним.

Ресурсы для скачивания

Похожие темы

  • Оригинал статьи: Explore Python, machine learning, and the NLTK library.
  • Узнайте больше о машинном обучении из Википедии.
  • Посетите официальный веб-сайт Python.
  • Прочтите книгу Питера Хэррингтона Machine Learning in Action (Manning, 2012).
  • Ознакомьтесь с книгой Стивена Берда, Эдвана Кляйна и Эдварда Лопера Natural Language Processing with Python (O’Reilly, 2009).
  • Изучите цикл статей Implement Bayesian inference using PHP (Пол Мигер, developerWorks, март – май 2009 г.). В этой серии из трех частей обсуждаются интересные приложения, призванные помочь вам реализовать всю мощь и потенциал байесовского метода к статистическим оценкам.
  • Ознакомьтесь с сайтом NLTK и узнайте о создании программ на Python для работы с текстами на естественных языках.
  • Загрузите pip и узнайте больше об этом инструменте для установки пакетов Python и управления ими.
  • Узнайте больше об инструменте virtualenv , который позволяет создавать изолированные среды исполнения Python.
  • Познакомьтесь со стандартной библиотекой Python unittest — версией JUnit для языка Python.
  • Узнайте о модуле pyeclipse для Eclipse.
  • Ознакомьтесь с интегрированной средой разработки PyCharm, содержащей полный набор инструментов, необходимых для работы с языком Python и совместимости со средой Django.
  • Следите за developerWorks в Твиттере.

Комментарии

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

Создание машинно-обучаемого классификатора с помощью Scikit-learn в Python

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

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

Данный мануал поможет реализовать простой алгоритм машинного обучения в Python с помощью инструмента Scikit-learn. Для этого мы будем использовать базу данных о раке молочной железы и классификатор Naive Bayes (NB), который предсказывает, является ли опухоль злокачественной или доброкачественной.

Требования

Для работы вам понадобится локальная среда разработки Python 3 и предварительно установленное приложение Jupyter Notebook. Это приложение очень полезно при запуске экспериментов по машинному обучению: оно позволяет запускать короткие блоки кода и быстро просматривать результаты, легко тестировать и отлаживать код.

Настроить такую среду вам помогут следующие мануалы:

1: Импорт Scikit-learn

Для начала нужно установить модуль Scikit-learn. Это одна из лучших и наиболее документированных библиотек Python для машинного обучения.

Чтобы начать работу над проектом, разверните среду разработки Python 3. Убедитесь, что вы находитесь в каталоге, в котором хранится эта среда, и выполните следующую команду:

После этого проверьте, не был ли модуль Sckikit-learn установлен ранее.

python -c «import sklearn»

Если модуль sklearn установлен, команда выполнится без ошибок. Если модуль не установлен, вы увидите ошибку:

Traceback (most recent call last): File » «, line 1, in ImportError: No module named ‘sklearn’

Чтобы загрузить библиотеку, используйте pip:

pip install scikit-learn[alldeps]

После завершения установки запустите Jupyter Notebook:

В Jupyter создайте документ ML Tutorial. В первую ячейку документа импортируйте модуль sklearn.

Теперь можно начать работу с набором данных для модели машинного обучения.

2: Импорт наборов данных

В этом руководстве используется база данных диагностики рака молочной железы в Висконсине. Набор данных включает в себя различную информацию о раке молочной железы, а также классификационные метки (злокачественные или доброкачественные опухоли). Набор данных состоит из 569 экземпляров и 30 атрибутов (радиус опухоли, текстура, гладкость, площадь и т. д.).

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

Scikit-learn поставляется с несколькими наборами данных, включая этот. Импортируйте и загрузите набор данных. Для этого добавьте в документ:

.
from sklearn.datasets import load_breast_cancer
# Load dataset
data = load_breast_cancer()

Переменная data содержит словарь, важными ключами которого являются названия классификационных меток (target_names), метки (target), названия атрибутов (feature_names) и атрибуты (data).

Читайте также:

Атрибуты являются важной частью любого классификатора. Они фиксируют важные характеристики данных. Учитывая то, какую метку должен предсказать алгоритм (злокачественность/доброкачественность опухоли), в нем возможны такие атрибуты, как размер, радиус и структура опухоли.

Создайте новые переменные для каждого важного набора данных и присвойте значения:

.
# Organize our data
label_names = data[‘target_names’]
labels = data[‘target’]
feature_names = data[‘feature_names’]
features = data[‘data’]

Теперь в алгоритме есть списки для каждого набора информации. Чтобы лучше понять набор данных, выведите метки классов, метку первого экземпляра данных, имена и значения атрибутов для первого экземпляра данных:

.
# Look at our data
print(label_names)
print(labels[0])
print(feature_names[0])
print(features[0])

Запустите код, чтобы увидеть результат.

Как видно в выводе, имена классов — malignant и benign, которые затем отображаются как двоичные значения 0 и 1, где 0 представляет собой злокачественные, а 1 – доброкачественные опухоли. Согласно выводу, первый экземпляр данных представляет собой злокачественную опухоль, средний радиус которой равен 1.79900000e+01.

Загрузив данные, можно начать работу над классификатором.

3: Систематизация данных в наборы

Чтобы оценить, насколько хорошо работает классификатор, всегда нужно тестировать модель на разных данных. Поэтому прежде чем начать строить модель, разделите свои данные на две части: тренировочный набор и тестовый набор.

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

Модуль sklearn предоставляет функцию train_test_split(), которая автоматически разделит данные на два набора.

.
from sklearn.model_selection import train_test_split
# Split our data
train, test, train_labels, test_labels = train_test_split(features,
labels,
test_size=0.33,
random_state=42)

Функция случайным образом разбивает данные с помощью параметра test_size. Теперь у вас есть тестовый набор (test), который представляет 33% от исходного набора данных. Оставшиеся данные (train) составляют тренировочный набор. Также теперь есть соответствующие метки как для переменных train_labels и test_labels

4: Сборка и оценка модели

Существует много моделей для машинного обучения, и каждая модель имеет свои преимущества и недостатки. В этом мануале мы рассмотрим простой алгоритм, который обычно хорошо выполняется в задачах бинарной классификации, а именно в Naive Bayes (NB).

Импортируйте модуль GaussianNB. Инициализируйте модель с помощью функции GaussianNB(), а затем потренируйте модель, применив ее к данным с помощью gnb.fit():

.
from sklearn.naive_bayes import GaussianNB
# Initialize our classifier
gnb = GaussianNB()
# Train our classifier
model = gnb.fit(train, train_labels)

После этого можно применить подготовленную модель, чтобы сделать прогнозы на тестовом наборе данных, который используется с помощью функции predict(). Функция predict() возвращает массив предполагаемых результатов для каждого экземпляра данных в тестовом наборе. Затем можно вывести все прогнозы.

Используйте функцию predict() в наборе test и отобразите результат:

.
# Make predictions
preds = gnb.predict(test)
print(preds)

В выводе Jupyter Notebook вы увидите, что функция predict() возвращает массив из 0 и 1, которые представляют предсказанные программой результаты.

5: Оценка точности модели

С помощью массива меток класса можно оценить точность прогнозируемых значений модели, сравнив два массива (test_labels и preds). Чтобы определить точность классификатора машинного обучения, можно использовать функцию accuracy_score().

.
from sklearn.metrics import accuracy_score
# Evaluate accuracy
print(accuracy_score(test_labels, preds))

Судя по результатам, данный классификатор NB имеет точность 94,15%. Это означает, что 94,15% ситуаций он оценивает правильно и может предсказать результат.

Вы создали свой первый классификатор машинного обучения. Теперь нужно реорганизовать код, переместив все выражения import в начало документа. В результате код должен выглядеть так:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
# Load dataset
data = load_breast_cancer()
# Organize our data
label_names = data[‘target_names’]
labels = data[‘target’]
feature_names = data[‘feature_names’]
features = data[‘data’]
# Look at our data
print(label_names)
print(‘ > print(feature_names)
print(features[0])
# Split our data
train, test, train_labels, test_labels = train_test_split(features,
labels,
test_size=0.33,
random_state=42)
# Initialize our classifier
gnb = GaussianNB()
# Train our classifier
model = gnb.fit(train, train_labels)
# Make predictions
preds = gnb.predict(test)
print(preds)
# Evaluate accuracy
print(accuracy_score(test_labels, preds))

Теперь вы можете продолжить работу с этим кодом и усложнить свой классификатор. Вы можете экспериментировать с различными подмножествами функций или попробовать другие алгоритмы. Больше идей машинного обучения можно найти на сайте Scikit-learn.

Добавить комментарий