В данной статье речь пойдёт о машинном обучении в целом и взаимодействии с датасетами. Если вы начинающий, не знаете с чего начать изучение и вам интересно узнать, что такое «датасет», а также зачем вообще нужен Machine Learning и почему в последнее время он набирает все большую популярность, прошу под кат. Мы будем использовать Python 3, так это как достаточно простой инструмент для изучения машинного обучения.

Для кого эта статья?


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

image

В цифрах


С каждым годом растёт потребность в изучении больших данных как для компаний, так и для активных энтузиастов. В таких крупных компаниях, как Яндекс или Google, всё чаще используются такие инструменты для изучения данных, как язык программирования R, или библиотеки для Python (в этой статье я привожу примеры, написанные под Python 3). Согласно Закону Мура (а на картинке — и он сам), количество транзисторов на интегральной схеме удваивается каждые 24 месяца. Это значит, что с каждым годом производительность наших компьютеров растёт, а значит и ранее недоступные границы познания снова «смещаются вправо» — открывается простор для изучения больших данных, с чем и связано в первую очередь создание «науки о больших данных», изучение которого в основном стало возможным благодаря применению ранее описанных алгоритмов машинного обучения, проверить которые стало возможным лишь спустя полвека. Кто знает, может быть уже через несколько лет мы сможем в абсолютной точности описывать различные формы движения жидкости, например.

Анализ данных — это просто?


Да. А так же интересно. Наряду с особенной важностью для всего человечества изучать большие данные стоит относительная простота в самостоятельном их изучении и применении полученного «ответа» (от энтузиаста к энтузиастам). Для решения задачи классификации сегодня имеется огромное количество ресурсов; опуская большинство из них, можно воспользоваться средствами библиотеки Scikit-learn (SKlearn). Создаём свою первую обучаемую машину:

clf = RandomForestClassifier()
clf.fit(X, y)

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

— Если все так просто, почему до сих пор не каждый предсказывает, например, цены на валюту?

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

Ближе к делу


— Получается, зарабатывать на этом деле я не сразу смогу?

Да, до решения задач за призы в $100 000 нам ещё далеко, но ведь все начинали с чего-то простого.

Итак, сегодня нам потребуются:

  • Python 3 (с установленной pip3)
  • Jupyter
  • SKlearn, NumPy и matplotlib

Если чего-то нет: ставим всё за 5 минут
Для начала, скачиваем и устанавливаем Python 3 (при установке не забудьте поставить pip и добавить в PATH, если скачали установщик Windows). Затем, для удобства был взят и использован пакет Anaconda, включающий в себя более 150 библиотек для Python (ссылка на скачивание). Он удобен для использования Jupyter, библиотек numpy, scikit-learn, matplotlib, а так же упрощает установку всех. После установки, запускаем Jupyter Notebook через панель управления Anaconda, или через командную строку(терминал): «jupyter notebook».

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

Как обычно, импортируем необходимые для работы библиотеки:

import numpy as np
from pandas import read_csv as read

— Ладно, с Numpy всё понятно. Но зачем нам Pandas, да и еще read_csv?

Иногда бывает удобно «визуализировать» имеющиеся данные, тогда с ними становится проще работать. Тем более, большинство датасетов с популярного сервиса Kaggle собрано пользователями в формате CSV.

А вот так выглядит визуализированный pandas'ом датасет
image
Здесь колонка Activity показывает, идёт реакция или нет (1 при положительном, 0 при отрицательном ответе). А остальные колонки — множества признаков и соответствующие им значения (различные процентные содержания веществ в реакции, их агрегатные состояния и пр.)

— Помнится, ты использовал слово «датасет». Так что же это такое?

Датасет — выборка данных, обычно в формате «множество из множеств признаков» > «некоторые значения» (которыми могут быть, например, цены на жильё, или порядковый номер множества некоторых классов), где X — множество признаков, а y — те самые некоторые значения. Определять, например, правильные индексы для множества классов — задача классификации, а искать целевые значения (такие как цена, или расстояния до объектов) — задача ранжирования. Подробнее о видах машинного обучения можно прочесть в статьях и публикациях, ссылки на которые, как и обещал, будут в конце статьи.

Знакомимся с данными


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

path = "%путь к файлу%/wine.csv"
data = read(path, delimiter=",")
data.head()

Работая в Jupyter notebook, получаем такой ответ:

image

Это значит, что теперь нам доступны данные для анализа. В первом столбце значения Grade показывают, к какому сорту относится вино, а остальные столбцы — признаки, по которым их можно различать. Попробуйте ввести вместо data.head() просто data — теперь для просмотра вам доступна не только «верхняя часть» датасета.

Простая реализация задачи на классификацию


Переходим к основной части статьи — решаем задачу классификации. Всё по порядку:

  • создаём обучающую выборку
  • пробуем обучить машину на случайно подобранных параметрах и классах им соответствующих
  • подсчитываем качество реализованной машины

Посмотрим на реализацию (каждая выдержка из кода — отдельный Cell в notebook):

X = data.values[::, 1:14]
y = data.values[::, 0:1]

from sklearn.cross_validation import train_test_split as train
X_train, X_test, y_train, y_test = train(X, y, test_size=0.6)

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)

Создаем массивы, где X — признаки (с 1 по 13 колонки), y — классы (0ая колонка). Затем, чтобы собрать тестовую и обучающую выборку из исходных данных, воспользуемся удобной функцией кросс-валидации train_test_split, реализованной в scikit-learn. С готовыми выборками работаем дальше — импортируем RandomForestClassifier из ensemble в sklearn. Этот класс содержит в себе все необходимые для обучения и тестирования машины методы и функции. Присваиваем переменной clf (classifier) класс RandomForestClassifier, затем вызовом функции fit() обучаем машину из класса clf, где X_train — признаки категорий y_train. Теперь можно использовать встроенную в класс метрику score, чтобы определить точность предсказанных для X_test категорий по истинным значениям этих категорий y_test. При использовании данной метрики выводится значение точности от 0 до 1, где 1 <=> 100% Готово!

Про RandomForestClassifier и метод кросс-валидации train_test_split
При инициализации clf для RandomForestClassifier мы выставляли значения n_estimators=100, n_jobs = -1, где первый отвечает за количество деревьев в лесу, а второй — за количество участвующих в работе ядер процессора (при -1 задействованы все ядра, по умолчанию стоит 1). Так как мы работаем с данным датасетом и нам негде взять тестирующую выборку, используем train_test_split для «умного» разбиения данных на обучающую выборку и тестирующую. Подробнее про них можно узнать, выделив интересующий Вас класс или метод и нажав Shift+Tab в среде Jupyter.

— Неплохая точность. Всегда ли так получается?

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

— Слишком легко. Больше мяса!

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

Да, с уменьшением количества признаков, падает и точность распознавания. И график получился не особенно-то красивым, но это и не решающее в простом анализе: вполне наглядно видно, как машина выделила обучающую выборку (точки) и сравнила её с предсказанными (заливка) значениями.

Реализация здесь
from sklearn.preprocessing import scale
X_train_draw = scale(X_train[::, 0:2])
X_test_draw = scale(X_test[::, 0:2])

clf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
clf.fit(X_train_draw, y_train)

x_min, x_max = X_train_draw[:, 0].min() - 1, X_train_draw[:, 0].max() + 1
y_min, y_max = X_train_draw[:, 1].min() - 1, X_train_draw[:, 1].max() + 1

h = 0.02

xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
            np.arange(y_min, y_max, h))

pred = clf.predict(np.c_[xx.ravel(), yy.ravel()])
pred = pred.reshape(xx.shape)

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

plt.figure()
plt.pcolormesh(xx, yy, pred, cmap=cmap_light)
plt.scatter(X_train_draw[:, 0], X_train_draw[:, 1], 
            c=y_train, cmap=cmap_bold)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())

plt.title("Score: %.0f percents" % (clf.score(X_test_draw, y_test) * 100))
plt.show()


Предлагаю читателю самостоятельно узнать почему и как он работает.

Последнее слово


Надеюсь, данная статья помогла хоть чуть-чуть освоиться Вам в разработке простого машинного обучения на Python. Этих знаний будет достаточно, чтобы продолжить интенсивный курс по дальнейшему изучению BigData+Machine Learning. Главное, переходить от простого к углубленному постепенно. А вот полезные ресурсы и статьи, как и обещал:

Материалы, вдохновившие автора на создание данной статьи


Исторические очерки:


Подробнее про машинное обучение:


Изучаем python, или до работы с данными:


Однако для наилучшего освоения библиотеки sklearn пригодится знание английского: в этом источнике собраны все необходимые знания (так как это API reference).

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

Где брать данные, или «хранилище датасетов» — здесь собрано огромное количество данных от самых разных источников. Очень полезно тренироваться на реальных данных.

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

Комментарии (19)


  1. SpyceR
    11.01.2017 13:58

    Отличная статья! Когда я начинал работать с ML, то мне как раз таких и не хватало: меньше теории, больше кода (при том, что его и так очень мало).


  1. Westernstorm
    11.01.2017 14:00
    -3

    Сейчас много пишут про машинное обучение, но какой толк от текущих возможностей? Как то что есть можно применить на практике?

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


    1. Femistoklov
      11.01.2017 15:58
      +1

      Маркетологи, менеджеры, гуманитарии… Чтобы был толк, надо просто убедить их всех, что вы умеете определять:

      • какие овощи будут больше покупать в следующем месяце — хрен или редьку
      • хочет ли Петров купить обручальное кольцо, памперсы, а может ему вообще надо билет в другую страну
      • какова вероятность, что Иванов запьёт с получки и не отдаст кредит банку
      • насколько опасно нынче инвестировать в РогаAndКопыта
      • прибыльно ли заключить сделку с ООО «Вектор»
      • будет ли рубль падать перед Новым годом
      • диван изображён на картинке или леопард
      • рак у пациента или он беременный

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


      1. Westernstorm
        11.01.2017 17:45

        Убедить то можно, но я еще не встречал работающей модели.

        Я бы с удовольствием почитал какие данные нужно обработать что бы скажем узнать какие овощи будут больше покупать.


        1. QtRoS
          12.01.2017 21:54

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


    1. lingvo
      11.01.2017 23:49

      Я думаю с появлением "умных домов" у машинного обучения появится множество интересных применений.
      Вот у меня, например, сейчас пишутся логи всего, что я делаю со своим домом: включаю и отключаю свет, двигаю шторы, открываю и закрываю жалюзи, регулирую температуру отопления и т.д. Помимо этого в доме у меня есть куча датчиков освещения, температуры, движения, влажности, CO и т.д.
      Я специально сохраняю эту информацию на сервере в архиве с временными штампами, хотя не знаю как использовать. Пока. За несколько лет накопятся мегабайты логов.
      Что с этим можно было бы сделать с помощью МО?
      Я думаю пара бы интересных вещей получилась бы. Например можно было бы заменить четкую логику различных типовых алгоритмов на нечеткую, основанную на МО.
      Например, проанализировав логи можно было бы выяснить мой любимый профиль отопления, или при каких условиях я включаю свет в коридоре. И по результатам этого компьютер мог бы "предсказывать" мои желания и в конце концов обучался бы на моих привычках. А привычки изменились — компьютер подстроился.


    1. djinninia
      18.01.2017 10:07

      Ещё пример задачи машинного обучения.
      Определить насколько имеющиеся статьи (например на Википедии) близки друг к другу по теме. Это помогает рекомендовать пользователю статьи на основе уже прочитанных.


  1. Shedar
    11.01.2017 15:16

    Из англоязычных вводных могу посоветовать еще цикл статей (в текущий момент 6 статей) Machine Learning is Fun! Легко и интересно читается, практически на пальцах объясняются типичные подходы к различным задачам, часть с кодом, часть без.


  1. gadzhi15
    11.01.2017 15:38

    На курсере есть еще одна замечательная специализация по машинному обучению и анализу данных от Яндекса и МФТИ. Мне он показался более простым для людей, которые только только постигают эту область. Ссылка на специализацию


  1. Merlen_Gross
    11.01.2017 15:53

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


  1. AFakeman
    11.01.2017 15:58

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


    1. falklol
      11.01.2017 16:02

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


    1. Vinchi
      11.01.2017 16:07

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


  1. kudablin_a
    11.01.2017 15:58

    Огромное спасибо, статья как раз для таких как я.
    Но заранее извиняюсь, что-то не совсем уловил: вот мы получили результат обучения датасета признаков вина. И даже нарисовали результаты на двумерном графике взяв только два признака, правильно?
    Если да — а какие выводы можно сделать из полученных результатов и как применить эти выводы на практике? Например, с целью заработать деньги на полученных знаниях.


    1. Vinchi
      11.01.2017 16:09

      Включите фантазию. Например, пусть у вас есть какие-то параметры пользователя, который зашел в магазин вина. Можно обучить рекомендательную систему, чтобы она показывала ему то вино, которое он скорее всего купит. А ну и конечно не забывайте что в нашей стране онлайн продажа алкоголя запрещена.


      1. kudablin_a
        11.01.2017 16:58

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


  1. Kanumowa
    11.01.2017 16:20

    Я бы начал с лекций яндекса, чтобы войти в тему:
    Яндекс ШАД
    И если вы не испугались после просмотра видео
    Еще пару ссылок:
    udacity Deep Learning by Google
    CS224n: Natural Language Processing with Deep Learning
    CS231n: Convolutional Neural Networks for Visual Recognition


    1. streetturtle
      11.01.2017 18:45

      Так же у IBM достаточно инересные курсы по Big Data и Machine Learning / Deep Learning на Big Data University. Можно проходить либо отдельные курсы, либо модули (learning path)-несколько курсов на одну тему. Кстати при прохождении дают значки, который можно прикрутить в linkedIn.
      А еще незаменимая вещь — Data Scientist Workbench.


  1. Babel
    11.01.2017 18:45

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