Решаем «Первый открытый контест» от Mail.ru по Data Science с помощью Azure ML (введение в Azure ML)

    Сейчас проходит соревнование ML Boot Camp, в котором надо спрогнозировать время, за которое будут перемножены 2 матрицы размерами mxk и kxn на данной вычислительной системе, если известно, сколько решалась эта задача на других вычислительных системах с другими размерами матриц (точные правила). Давайте попробуем решить эту задачу регресии не с помощью стандартных инструментов и библиотек (R, Python и panda), а используя облачный продукт от Microsoft: Azure ML. Для наших целей подойдет бесплатный доступ, для которого достаточно даже trial Azure аккаунта. Все, кто хочет получить краткое руководство по настройке и использованию Azure ML в общем и ML Studio в частности на примере решения реальной живой задач, приглашаются под кат.

    Создание источников данных


    Откроем ML Studio:



    Мы с вами создадим один новый эксперимент (в терминах Azure ML представляет собой законченное решение задачи — от чтения входных данных до получения ответа, затем его можно преобразовать в Web Service) и два новых источника данных (dataset) для представления входных данных (один для набора признаков, другой для значений). Скачайте с сайта ML Boot Camp csv файлы с обучающей выборкой (x_train.csv и y_train.csv). Чтобы добавить источник данных, надо выбрать пункт «Dataset» в меню слева и нажать «New» в левом нижнем углу, появится такое окно:



    Укажем путь к файлу x_train.csv, дадим этому источнику данных имя x_train. Так же создадим источник данных y_train. Теперь оба этих источника данных показываются на вкладке «Datasets»:



    Создание эксперимента, выбор характеристик


    Пришло время создать эксперимент, для этого в меню слева выбираем пункт «Experiments», нажимаем «New» внизу слева и выбираем «Blank Experiment». В строке вверху можно дать ему подходящее имя, в итоге получим следующий простор для наших Data Science операций:



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



    Теперь нам нужно объединить столбцы этих двух источников данных, потому что все методы Azure ML работают с одной таблицей (data frame), в которой надо указать столбец, являющийся значением обучения. Для этого воспользуемся модулем «Add Columns». Подсказка: поиск по модулям поможет найти модуль по ключевым словам или убедиться, что такого модуля еще не существует. Перетащим операцию «Add Columns» в рабочую область и соединим две его верхних точки для ввода данных с нашими источниками данных x_train и y_train соответственно. У этой операции нет параметров, поэтому дополнительно ничего настраивать не надо. Получим:



    Чтобы посмотреть, как теперь выглядят наши данные. Запустим эксперимент на выполнение, нажав кнопку «Run» в нижней строке. После того, как эксперимент успешно выполнится, можно нажать на вывод операции «Add Columns» и выбрать действие «Visualize»:




    Окно свойств позволяет увидеть столбцы, первые строки, для каждого признака: среднее, медиану, гистограмму и т.д. Мы видим, что в нашей таблице 952 колонки (признака), и из них надо выбрать значимые, те, которые нам помогут в решении нашей задачи. Выбор признаков является одной из самых сложных и недетерминированных операций в Data Science, поэтому сейчас для простоты выберем несколько признаков, которые на первый взгляд являются значимыми. Модуль, который поможет нам это сделать, называется «Select Columns in Dataset». Добавим его в рабочую область, соединим с операцией «Add Columns». Теперь в параметрах «Select Columns in Dataset» укажем, какие признаки мы хотим оставить. Для этого выделим модуль «Select Columns in Dataset», в свойствах на правой панели нажмем «Launch column selector»:



    Теперь добавим имена столбцов, которые мы хотим оставить (это совсем не оптимальный выбор столбцов), не забываем добавить столбец «time»:



    Запустим эксперимент еще раз, убедимся, что в получившейся таблице остались Только те столбцы, которые выбрали. Теперь последний шаг по подготовке данных: разделим данные на обучающую и тестовую выборки в пропорции 70:30. Для этого найдем и поместим в рабочую область модуль «Split Data», в его настройках установим «Fraction of rows in the first output dataset» равному 0.7. Получим:



    Использование алгоритмов


    Теперь мы готовы наконец-то использовать какой-нибудь метод регрессии. Методы перечислены в меню слева: «Machine Learning», «Initialize Model», «Regression»:



    Для начала попробуем метод леса деревьев принятия решений: «Decision Forest Regression». Добавим его в рабочую область, а также модуль «Train model». У этого модуля два входа: один соединяется с алгоритмом (в нашем случае с «Decision Forest Regression»), другой — с данными обучающей выборки (левый выход модуля «Split Data»). Эксперимент теперь выглядит так:



    Красный кружок в модуле «Train model» говорит нам, что у него есть обязательные параметры, которые мы не донастроили: ему надо указать, какой признак мы пытаемся предсказать (в нашем случае это time). Кликнем «Launch column selector», добавим единственный столбец time. Обратим внимание, что у самого метода есть настройки по умолчанию, которые позволяют ему запускаться без ручной донастройки. Конечно же, для получения хороших результатов надо пробовать различные комбинации параметров, которые будут специфичны для каждого метода. Теперь эксперимент можно запустить, лес деревьев будет построен, их даже можно посмотреть, вызвав уже знакомое окно «Visualize». После обучения модели, ее хорошо бы проверить на тестовой (валидационной) выборке, которая представляет собой 30% от исходных данных. Для этого используем модуль «Score Model», соединив его первый вход с выходом модуля «Train model» (обученной моделью), а второй — со вторым выходом модуля «Split Data». Теперь последовательность операций выглядит так:



    Можно опять запустить эксперимент и посмотреть вывод «Score model»:



    Добавились 2 новых столбца: «Scored Label Mean» (среднее предсказанного значения) и «Scored Label Standard Deviation» (стандартное отклонение предсказанного значения от фактического). Также можно построить точечную диаграмму (scatter plot, диаграмму рассеяния) для предсказанного и фактического значений (видна на рисунке). Теперь узнаем его точность с помощью модуля «Evaluate Model», который соединим с модулем «Score Model».



    Вывод модуля «Evaluate Model» содержит информацию о точности метода на наших проверочных данных, среди которых абсолютная и относительная погрешности:



    Конечно, метод не идеален, но мы совсем не занимались его настройкой.

    Добавление нового метода и сравнение методов


    Попробуем еще один метод на основе деревьев принятия решений: «Boosted Decision Tree Regression». Точно так же, как и для первого метода, добавим модули «Train Model» и «Score Model», запустим эксперимент, посмотрим вывод модуля «Score Model» для нового метода. Заметим, что добавился всего один столбец, представляющий предсказанное значение: «Scored Labels», для него также можно построить точечную диаграмму:



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



    Посмотрим на вывод модуля «Evaluate Model»:



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

    Решаем задачу с настоящими данным


    У нас есть обученные методы, мы знаем их точность — пришло время проверить их в бою. Скачем файл x_test.csv, в котором находятся данные, для которых мы должны предсказать время перемножения матриц. Чтобы использовать обученный метод, нам нужно:
    1. Добавить новый источник данных с именем x_test и данными из файла x_test.csv.
    2. Перетащить новый источник данных x_test в рабочую область эксперимента.
    3. Теперь нам нужно оставит только те столбцы, которые принимали участие в обучении, скопируем модуль «Select Columns in Dataset», и удалим из списка столбцов столбец «time» (так как его нет в наших тестовых данных).
    4. Теперь мы можем запустить наш обученный метод на подготовленных данных, для этого добавим операцию «Score Model», первый его вход соединим с выводом модуля «Train Model» метода «Boosted Decision Tree Regression», второй вход — с выводом только что добавленного «Select Columns in Dataset».
    5. Теперь осталось только привести полученные данные к формату, который можно загрузить как решение на сайт ML Boot Camp. Для этого добавим еще один модуль «Select Columns in Dataset», в котором выберем всего один столбец — наши предсказанные значения «Scored Labels», а к его выводу добавим модуль «Convert to CSV».

    В итоге получим следующий эксперимент:



    Скачать полученный csv файл можно, нажав на вывод модуля «Convert to CSV» и выбрав пункт «Download». Теперь удалим первую строку (с названием) из полученного csv, загрузим ее на сайт ML Boot Camp. Работает! Но точность оставляет желать лучшего.

    Дальнейшая оптимизация


    Рассмотрим несколько модулей, которые помогут улучшить точность регрессии.
    1. Пробовать разные методы, которые можно найти в меню слева.
    2. Выбрать признаки поможет модуль «Filter Based Feature Selection», который пытается выбрать признаки, обладающие наибольшей предсказательной способностью (несколькими различными методами, которые задаются в его свойствах). Этот модуль добавляется вместо модуля «Select Columns in Dataset».
    3. Оценить, какие признаки более полезны в уже обученной модели поможет модуль «Permutation Feature Importance», принимающий в качестве входных параметров обученную модель и набор тестовых данных.
    4. Подобрать параметры метода поможет модуль «Tune Model Hyperparameters», который проведет заданное количество запусков метода с Различным наборов параметров и покажет точность каждого запуска.
    5. В качестве тяжелой артиллерии можно использовать любые R и Python скрипты с помощью модулей «Execute R Script» и «Execute Python Script» соответственно.


    Заключение


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

    Эксперимент выложен в галерею и открыт для всех желающих по адресу: gallery.cortanaintelligence.com/Experiment/ML-Boot-Camp-from-Mail-ru-1

    Принимайте участие в контесте! Все, кто сможет получить ошибку MAPE меньше 0,1, напишите, автору будет приятно.
    Share post

    Comments 13

      0
      Но точность оставляет желать лучшего.
      А цифра какая получилась? Если не секрет, конечно :)
        0
        Нет, совсем не секрет! На тестовой выборке, предоставляемой в контесте, МАРЕ получается около 0,2 — до топ 100 не дотягивает. Но с признаками можно поиграться, их тут много — широкий простор для деятельности.
          0
          Я пилю своё решение по выходным, пока простой алгоритм анализа данных + простой алгоритм рассчёта коэффициента времени, результат = 0,2302776. Есть ещё несколько идей по улучшению алгоритмов «угадывания», но не уверен на сколько они улучшат результат. Пока удивляюсь как человек в топе 0,0485175 сделал :)
        0

        С минимальным опытом в ML за полдня набрал 0.112. Правда на этом и застрял. По ощущениям 0.1 не так уж и круто, вот 0.05 и меньше — впечатляет.


        P.S. Странно, что на хабре про конкурс ничего не было. Или я пропустил?

          0
          Я имел в виду 0,1 именно в Azure ML, мне кажется в основном используют более стандартные вещи (я вот пользуюсь Python + Panda).

          Да, я тоже не видел на хабре ссылок.
            0
            Я застрял на 0.66 по public score (хотя CV по тренировочным данным дает ~0.9).
            Пытаюсь построить более сложные модели, но пока не особенно успешно получается, думаю, лучше внимательнее данные изучить и их преобразовать.

            Да, ссылка была: habrahabr.ru/company/mailru/blog/302674

              +1
              Ой, ошибся на порядок.
              Не 0.66 и 0.9, а 0.066 и 0.09 по CV.

              Думаю, неплохой результат без опыта в ML и на первом контесте)
              0
              Было, выше поделились ссылочкой. И будет ещё :)
              0
              Всегда в постах об аналитических пакетах какая-то магия) Удивился как можно сделать join (add columns) без указания ключа — полез в справку. Оказывается две выборки должны быть равны по мощности для этой операции, но это только половина проблеиы, какие строки окажутся вместе не указано. Предполагаю, что строки будут браться в порядке сортировки исходных данных, но если это правильный способ их склеить, то не ясно зачем было их резать на x и y. Возможно тут есть простор для тюнинга алгоритма :)
              Еще непонятно, почему вы обучаете только на 70% обучающих данных, ведь можно обучать на 100%, а проверять на x_test.
                0
                Проблема проверки на x_test в том, что ответов нет — надо будет загружать их на сайт, а максимум это можно сделать 5 раз в день.
                  0

                  Я тюнинговал алгоритм на 70% выборки, а в конце обучал на 100% с выбранными параметрами.

                    0
                    Да, хороший подход, спасибо.
                0
                я как то пытался построить сеть для функции sin() и получил не очень хорошую точность.
                такое чувство, что Azure ML имеет какие то ограничения, которые не позволяют получить очень точный результат (или я просто чего то не понимаю?)
                http://gallery.cortanaintelligence.com/Experiment/sanity-sin-360-1

                Only users with full accounts can post comments. Log in, please.