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

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

Алгоритмы и эвристики


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

Таким образом, машинное обучение является наиболее распространенным и мощным (но, тем не менее, не единственным) методом анализа данных. К сожалению, алгоритмов машинного обучения, хорошо обрабатывающих данные более или менее произвольной природы люди пока не изобрели и поэтому специалисту приходится самостоятельно заниматься предобработкой данных для приведения их в пригодный для применения алгоритма вид. В большинстве случаев такая предобработка называется фичеселектом (англ. feature selection) или препроцессингом. Дело в том, что большинство алгоритмов машинного обучения принимают на вход наборы чисел фиксированной длины (для математиков — точки в $\mathbb{R}^n$). Однако сейчас также широко используются разнообразные алгоритмы на основе нейронных сетей, которые умеют принимать на вход не только наборы чисел, но и объекты, имеющие некоторые дополнительные, главным образом геометрические, свойства, такие как изображения (алгоритм учитывает не только значения пикселей, но и их взаимное расположение), аудио, видео и тексты. Тем не менее, некоторая предобработка как правило происходит и в этих случаях, так что можно считать, что для них фичеселект заменяется подбором удачного препроцессинга.

Алгоритмом машинного обучения с учителем (в узком смысле этого слова) можно назвать алгоритм (для математиков — отображение), который берет на вход набор точек в $\mathbb{R}^n$ (еще называются примерами или samples) $(x_0, x_1, ... x_{n - 1})$ и меток (значений, которые мы пытаемся предсказать) $(y_0, y_1, ... y_{n - 1})$, а на выходе дает алгоритм (=функцию) $F$, уже сопоставляющий конкретное значение $y$ любому входу $x$, принадлежащему пространству примеров. Например, в случае упомянутой выше нейросети, распознающей цифры, с помощью специальной процедуры на основе обучающей выборки устанавливаются значения, соответствующие связям между нейронами, и с их помощью на этапе применения вычисляется то или иное предсказание для каждого нового примера. Кстати, совокупность примеров и меток называется обучающей выборкой.

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

Общая схема решения задачи анализа данных при использовании метода машинного обучения выглядит таким образом:

image

Цепочку «препроцессинг — модель машинного обучения — постпроцессинг» удобно выделять в единую сущность. Часто такая цепочка остается неизменной и лишь регулярно дообучается на новопоступивших данных. В некоторых случаях, особенно на ранних этапах развития проекта, ее содержимое заменяется более или менее сложной эвристикой, не зависящей напрямую от данных. Бывают и более хитрые случаи. Заведем для такой цепочки (и возможных ее вариантов) отдельный термин и будем называть мета-моделью (meta-model). В случае эвристики она редуцируется до следующей схемы:

image

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

Задачи машинного обучения с учителем


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

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

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

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

Выбор метрики и валидационная процедура


Метрика качества предсказания (нечеткого) алгоритма — это способ оценить качество его работы, сравнить результат его применения с действительным ответом. Более математично — это функция, берущая на вход список предсказаний $(p_0, p_1, ..., p_{m - 1})$ и список случившихся ответов $(a_0, a_1, ..., a_{m - 1})$, а возвращающая число соответствующее качеству предсказания. Например в случае задачи классификации самым простым и популярным вариантом является количество несовпадений $(\sum_{i=0}^{m - 1} a_i \neq p_i)$, а в случае задачи регрессии — среднеквадратичное отклонение $MSE = \frac1n \sum_{i=0}^{m - 1}((a_i - p_i)^2)$. Однако в ряде случаев из практических соображений необходимо использовать менее стандартные метрики качества.

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

Типичный цикл развития проекта


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

  1. Изучение постановки задачи, возможных источников данных.
  2. Переформулировка на математическом языке, выбор метрик качества предсказания.
  3. Написание пайплайна для обучения и (хотя бы тестового) использования в реальном окружении.
  4. Написание решающей задачу эвристики или несложного алгоритма машинного обучения.
  5. По необходимости улучшение качества работы алгоритма, возможно уточнение метрик, привлечение дополнительных данных.

Заключение


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

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

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


  1. roryorangepants
    08.04.2018 20:18

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



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


    Фантастика. И откуда же вы это взяли?


    1. AGrin Автор
      08.04.2018 20:29

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


      1. roryorangepants
        08.04.2018 21:15

        Простите, но логистическая регрессия — это вполне конкретный алгоритм для решения задачи классификации.
        И более того:

        Или дают классы и просят предсказать классы, ..., или дают классы и просят предсказать вероятности

        И то, и другое является определением задачи классификации.

        Зачем городить велосипеды и придумывать своё собственное разделение задач ML на типы, когда есть общепринятое? Категориальная целевая переменная — классификация, непрерывная — регрессия.


        1. AGrin Автор
          08.04.2018 21:31

          Ну казалось бы постановки задач «дали классы, хотят классы» и «дали классы, хотят вероятности» различаются, не правда ли? А по первой ссылке как раз таки указан не «конкретный алгоритм», а _постановка_задачи_ (… is a regression model where the dependent variable (DV) is categorical).

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


          1. lair
            08.04.2018 23:49

            Ну казалось бы постановки задач «дали классы, хотят классы» и «дали классы, хотят вероятности» различаются, не правда ли?

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


            А вот ваш пример ("задача предсказания вероятности перехода пользователя по рекомендательной ссылке или рекламному объявлению") — это просто регрессия.


            1. AGrin Автор
              09.04.2018 01:49

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

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

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

              Кстати, вот например в википедии — и в русскоязычной, и в англоязычной логистическая регрессия находится в секции, относящейся к регрессии. Еще один аргумент для выделения задач с такой постановкой в отдельный класс для снятия неопределенности.


              1. Artgor
                09.04.2018 06:45

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


              1. retran
                09.04.2018 09:31

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

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


                Это каноничная логистическая регрессия. Прямо по определению — en.wikipedia.org/wiki/Logistic_regression

                задача, в которой по набору значений некоторой действительнозначной функции надо аппроксимировать эту функцию


                А это не регрессия, это аппроксимация.


                1. AGrin Автор
                  09.04.2018 10:34

                  Это каноничная логистическая регрессия. Прямо по определению — en.wikipedia.org/wiki/Logistic_regression

                  Так и я в основном тексте говорю, что это «логистическая регрессия». А мой комментатор утверждает, что это не «логистическая регрессия» а «просто регрессия», а «логистическая регрессия» как постановка задачи — это «классификация». И кто прав?

                  А это не регрессия, это аппроксимация.

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


                  1. roryorangepants
                    09.04.2018 10:42

                    А мой комментатор утверждает, что это не «логистическая регрессия» а «просто регрессия», а «логистическая регрессия» как постановка задачи — это «классификация».

                    Наверное, вас вводит в заблуждение многозначный термин «регрессия». Давайте, я попробую разложить по полочкам:
                    1) Когда мы говорим «регрессия» про методологию, мы имеем в виду регрессионный анализ и его приложения.
                    2) Когда мы говорим про типы задач в ML, мы говорим «регрессия» про обучение с учителем на непрерывный таргет, а «классификация» — на категориальный.
                    3) Логистическая регрессия — это конкретный алгоритм, где мы строим регрессию (в первом значении), поверх которой используем логит, чтобы предсказывать целевую переменную в диапазоне от 0 до 1, таким образом получая бинарную классификацию.
                    4) Почти любой алгоритм классификации может работать как в вероятностном режиме (так называемый «soft classification»), так и в режиме выдачи меток классов («hard classification»). Очевидно, что первый режим всегда включает в себя второй, как вам уже указывал выше другой комментатор. Второй не всегда включает в себя первый, но такие классификаторы сейчас редко используются (например, SVM), и чтобы добиться от них вероятности, приходится немного модифицировать алгоритм.

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


                    1. AGrin Автор
                      09.04.2018 17:52
                      -3

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

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


                  1. retran
                    09.04.2018 11:33

                    Так и я в основном тексте говорю, что это «логистическая регрессия». А мой комментатор утверждает, что это не «логистическая регрессия» а «просто регрессия», а «логистическая регрессия» как постановка задачи — это «классификация». И кто прав?


                    Ну я бы не смешивал понятия «логистическая регрессия» и «классификатор». Несмотря на то, логистическую регрессию МОЖНО использовать для построения классификатора, это все же совсем разные вещи.

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


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


                    1. AGrin Автор
                      09.04.2018 18:05

                      Ну я бы не смешивал понятия «логистическая регрессия» и «классификатор». Несмотря на то, логистическую регрессию МОЖНО использовать для построения классификатора, это все же совсем разные вещи.

                      Я бы тоже не смешивал. И не смешиваю, а коллеги не соглашаются.

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

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


                      1. retran
                        10.04.2018 00:16

                        Я бы тоже не смешивал. И не смешиваю, а коллеги не соглашаются.


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

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


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

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


                        А меня вот учили, что аппроксимация — это научный метод для построения мат. моделей. И целый раздел мат. анализа. Про полиномы Лагранжа и Ньютона и вот это все.


              1. roryorangepants
                09.04.2018 10:04
                +1

                Мне кажется вполне разумным разделить их на два разных класса в классификации «по формулировке». Все-таки и суть и форма ощутимо различаются.

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


              1. lair
                09.04.2018 11:26
                +1

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


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


                Или вот возьму я задачу предсказания вероятностей отнесения к классу и решу ее… с помощью дерева — но называть ее все еще надо, по-вашему, логистической регрессией.


                Стало ли меньше путаницы? Нет.


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

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


                1. retran
                  09.04.2018 11:43

                  А если так:
                  1. Задача классификации состоит в построении классификатора.
                  2. Классификатор может быть пострен на базе логистической регрессии.
                  3. Логистическая регрессия — это статистическая модель, которая может быть построена разными методами — регрессионным анализом, машинным обучением, etc.

                  Я вот в твоих определениях не понимаю, почему внезапно ты задачу решаешь моделью, а не методом.


                  1. lair
                    09.04.2018 11:46

                    Я вот в твоих определениях не понимаю, почему внезапно ты задачу решаешь моделью, а не методом.

                    Потому что это принятые формулировки — говорить "решаю методом… использующим модель вида" слишком длинно.


                    Ну и собственно я определений-то особо не давал, я в основном определения из поста пинаю.


                    1. retran
                      09.04.2018 11:49

                      Ок, насчет определений из поста согласен.


  1. AGrin Автор
    09.04.2018 01:43

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

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

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


  1. XunziCalledMeLier
    09.04.2018 10:35
    +1

    Из меня математик, конечно, как из коня балерина, поэтому поправьте, если ошибаюсь:
    1) Противоположность детерминированному — стохастичное (случайное, вероятностное). Нечеткость явно не подразумевает не детерминированность. Насколько я понимаю, случайность в машинном обучении не в том, что при предсказании на обученной модели участвует ГПСЧ, а в том, что на выходе зачастую байесовская вероятность (на нечетких множествах, например, функция принадлежности не обязательно рассматривается как вероятностная).
    2) ЕМНИП, feature selection — часть feature engineering, как и construcion, extraction, learning. Суть feature selection в том, чтобы попытаться отбросить признаки, которые имеют либо «ложную корреляцию», либо пренебрежительно малое влияние на целевую переменную. Bag of words, например, относится к feature construction.
    И, уже ради общего интереса, можно ссылку на классификацию задач машинного обучения? Мне немного не понятны имеющиеся классификаторы. Куда отнести, например, object detection, image segmentation, machine translation и т.п. (где задача не полностью сводится к классификации)? И как туда входят такие штуки, как transfer learning, active learning и т.п.?


    1. roryorangepants
      09.04.2018 10:47

      И, уже ради общего интереса, можно ссылку на классификацию задач машинного обучения? Мне немного не понятны имеющиеся классификаторы. Куда отнести, например, object detection, image segmentation, machine translation и т.п. (где задача не полностью сводится к классификации)? И как туда входят такие штуки, как transfer learning, active learning и т.п.?

      Object detection — это классификация (какой объект найден?) плюс регрессия (координаты Х и Y объекта, например).
      Image segmentation — это классификация (каждому пикселю присваивается метка класса).
      С Machine translation всё сложнее. Я бы выделил тут отдельный класс задач «sequence-to-sequence learning».
      Transfer learning — это не вид задач ML, а способ обучения нейросети.
      Active learning — это semi-supervised learning, про который в статье также не упомянули.

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


    1. AGrin Автор
      09.04.2018 11:03

      Я бы хотел сказать, что в настоящее время в ML происходит некоторая неразбериха в терминологии, если не сказать сильнее. В статье (и в будущих) мне бы хотелось ввести некоторую бОльшую упорядоченность в хаос терминов. Теперь по пунктам.

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

      2) Я употребляю термин «feature selection» в смысле «feature engineering» — в целом процесс выбора «хорошей» функции, задающей отображение из пространства объектов (instances) в пространство примеров (фичевекторов, samples). На практике существует большая неопределенность в терминах — и в этом конкретном тоже. Говорят «тут надо немного поселектить фичи» — именно в смысле подбора новых значений, при добавлении которых метрика качества на валидационной выборке растет.

      Ссылку на более или менее общепринятые классификации поищу, но по факту сейчас с этим трудно. Грубо говоря перечисленные понятия (object detection, image segmentation, machine translation) относятся скорее к тематике, а не к форме постановки задачи. И уже в свою очередь сводятся к хорошо исследованным заготовкам прикладным исследователем.