company_banner

Как полюбить машинное обучение и перестать страдать

  • Tutorial
Наше будущее все больше становится связано с развитием искусственного интеллекта. Кто-то считает, что это конец эры человечества, а кто-то садится, проходит курсы и пилит код, чтобы разобраться с машинным обучением. Я отношусь ко второй категории. В свое время, когда я задумывалась об освоении этой науки и начала проходить первые курсы, хотелось опустить руки. Сложности материалов и страданиям, казалось, нет предела. Сейчас, с высоты своего опыта, я понимаю, что всего этого можно было бы избежать. Поэтому под катом хочу поделиться основами ML для новичков «без боли».




Библиотеке numpy чужды любые человеческие чувства


Я взяла курс Машинного обучения по своей воле. На первом занятии нам сказали, что годового курса матана, а также базового понимания Python будет достаточно для нормального освоения курса. Звучит прекрасно! До тех пор, пока не приходит осознание того, что программа у разных вузов – разная. Во фразу «годовой курс матана» нечаянно попали линейная алгебра, дискретная математика, асимптотический анализ, и так далее.

О том, что такое «базовое понимание Python», я также сильно заблуждалась. «Это же один из самых простых языков!» – утверждали все вокруг. Читать хороший код можно как художественную литературу. И я верила своим знакомым, потому что, ничего не написав на Python до этого, я сама часто предпочитала читать на нем реализацию разных алгоритмов. Ведь он так лаконичен и отлично передает суть.

Проблема лишь в том, что читать код и писать самому – это разные задачи. Сразу начать писать хороший код на Python – это большая проблема (простите за капитанство).

После долгих страданий и попыток освоить первый в моей жизни динамический интерпретируемый язык, у меня наступил момент счастья и гордости. Как вы уже догадались, момент был недолгим. Почти сразу ко мне пришло осознание, что этого недостаточно. Научившись хоть как-то писать на питоне, необходимо переучиваться, чтобы грамотно использовать библиотеки машинного обучения. Я слышала, что у многих это не вызывает особых трудностей. Кто-то может даже не заметить этой стадии. Но мне было очень тяжело сперва в быстром темпе освоить стандартные коллекции и полюбить их всей душой, а затем узнать, что у библиотек ML свое мнение на этот счет. Им совершенно неинтересно, как удобны и просты в использовании милые питонячьи списки и словари. Библиотеке numpy чужды любые человеческие чувства.

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

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

С чего начать


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

Сделайте себе аккаунт на Azure ML Studio.Там есть бесплатная квота, без привязки банковской карты, для нескольких попыток. Все алгоритмы и необходимые процедуры реализованы за нас, а что еще более круто – все будет быстро работать даже на слабом ноутбуке. Все вычисления происходят в облаке.

Можно залить свои данные, но для начала нам отлично подойдут и предложенные семплы. Я выбрала датасет про задержки авиаперелетов. Имея обученную модель, можно будет говорить друзьям например о том, что их рейс могут задержать… (Хотя, если я хочу остаться вживых, нужно будет придумать другой способ применения )

Для того, чтобы просмотреть доступные датасеты, нажмите на Datasets → Samples:



Выбранный мною датасет называется Flight Delays Data.

Создадим свой эксперимент. Для этого нажмем Experiment → New (внизу страницы) → Blank Experiment. К слову, в экспериментах также есть вкладка Samples, там можно изучить уже готовые модели. Но нам сейчас интереснее сделать все самим.





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

Если вы чувствуете себя уверенно, вы можете создавать собственные блоки, для этого нужно написать программный код на языке Python или R. Если за вашей спиной уже есть армия обученных моделек, то вам наверняка привычен и удобен Jupyter Notebook, и вы можете работать с Azure ML через него.

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

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



Предсказываем задержку рейсов


Классический сценарий применения алгоритма машинного обучения выглядит так:
  1. Находим хорошие данные и делаем их еще лучше. Чистим от мусора, добавляем полезную информацию.

    Напомню, мы выбрали датасет про полеты.



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



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



    Видим прекрасную таблицу.



    Мы можем нажать на любую колонку и посмотреть для нее статистику.



    Изучая данные, я нашла колонки DepDelay и DepDel15. Они содержат пропуски, и поэтому я решила удалить данные столбцы.

    Я планирую предсказывать бинарный признак – правда ли, что самолет опоздает более чем на 15 минут. За него отвечает колонка ArrDel15. Кроме нее, есть также колонка ArrDelay, которая хранит время опоздания в минутах. К сожалению, мы вынуждены удалить и ее, иначе эксперимент получится не совсем честным )

    Чтобы удалить колонки, выберем блок Select Columns in Dataset, соединим его с прошлым блоком, а затем в меню справа нажмем на кнопку Launch column selector.



    В появившемся окне выберем нужные колонки.






  2. Делим данные на 2 части – train и test. Наша задача – на время забыть про часть test.
    Подробнее про то, что такое train/test set тут. Нам поможет блок Split Data.



    Обязательно заполните обведенные поля справа. Первое – в какой пропорции разбить – обычно ставят около 0.7-0.8. Второе – рандомно ли наше разбиение. Галочка там уже стоит: убедитесь, что вы случайно ее не сняли. Также будет неплохо задать Random seed, почитать про него можно тут.

  3. Отдаем часть train какому-нибудь алгоритму машинного обучения.
    Самое сложное сделают за нас. Выбор алгоритма – тонкий момент. Я по светлой памяти взяла Random Forest (аккуратно – здесь его назвали Decision Forest). Нам подойдет любой алгоритм two-class classification.



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

    Нам также потребуется блок Train Model. Соединить блоки будет нужно так, как представлено на скрине ниже:



    У блока Train Model нам также будет необходимо нажать на Launch Column Selector и выбрать столбец, который мы хотим предсказывать – в нашем случае ArrDel15.

  4. Полученную модель проверяем с помощью части test

    С этим нам поможет справиться блок Score Model. Не забудьте подсоединить к нему также вторую часть данных после разбиения.

    Последний блок на сегодня – Evaluate Model – представит нам результат в удобной форме. Итоговый граф выглядит так:



    Пора с гордостью жать кнопку «Run» и идти пить чай. Даже для облака обучение – не самый быстрый процесс.

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

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




    А вот такой результат я получила после удаления столбца ArrDelay. Похуже, зато похож на правду.




  5. Вас устроило качество? Поздравляю! Теперь вы можете брать новые объекты из реального мира, и компьютер предскажет для них все необходимое. Я получила точность предсказания 80%, и это не волшебство, но отличный старт.

  6. Если качество вас не устраивает – возвращаемся к началу задачи и ищем, что можно улучшить.

Конечно, я максимально упростила процесс. Искусство подготовки данных, их разделения на части, выбора алгоритма и измерений качества оттачивается годами. Тем не менее, факт «собрать модель с нуля буквально за 10 минут» придает мне второе дыхание и оживляет огромный интерес к этой теме. А что, если я возьму не Random Forest, а SVM? Кстати, а вы знаете, чем отличаются эти алгоритмы? Оба имеют внутри себя огромную мат.базу и довольно сложную реализацию, однако общую идею сможет понять каждый. Было бы желание ;-) Кстати, можете начать с изучения этой шпаргалки.

Надеюсь, что моя статья поможет вам избежать страданий и влюбиться в ML, так же как и я. Делитесь своим мнением и опытом в комментариях, будет интересно пообщаться!

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

Comments 14

    +2

    По теме есть неплохие уроки от Microsoft на edX. К ним прилагаются и коды из видео. ML идет в связке с Python или R на выбор.
    Собственно, есть программа Академия от Microsoft, посвященная Data Science, в том числе и машинное обучение на базе Azure ML.

    –3

    Гайд на тему: "Как нажать на кнопки, чтобы что нибудь произошло".
    Сомневаюсь, что этой статье место на хабре, или даже на Гиктаймс

      +5
      Наконец-то запилили тулзу, решающую 90% задач машинного обучения 90% компаний методом перетаскивания мышкой. Возможно, когда каждая домохозяйка сможет в machine learning, хайп вокруг него поубавится.
        +1
        Drag and drop это конечно весело и просто, но сути не раскрывает вообще.
        Вот вы упомянули изучение NumPy. А где его использование? Зачем, спрашивается, сразу нырять в Big Data с сотнями тысяч наблюдений, если можно простенькую модельку написать на питоне и показать здесь? Было бы более информативно, на мой взгляд.
        Согласен с Daniyar94.
          +3
          Я рассказала о своем опыте и о том, что он был болезненным. А затем показала, что можно было начать проще.
          Если бы я вплела сюда numpy, то я бы предложила читателю повторить мой путь. Я не хочу, чтобы люди повторяли мои страдания. :-)
          Зачем нырять? Чтобы целиком ощутить свою причастность к процессу.
          Нужно ли в итоге учить математику и программирование? Конечно, да. Но даже и в самом начале уже можно делать крутые вещи, постепенно изучая необходимое.
          +2
          У меня опыт машинного обучения не слишком большой — начал изучать его в августе-сентябре 2016 и недавно нашёл работу (до этого программирование практически не знал). Я могу ошибаться, но считаю, что начинать знакомство с машинным обучением с готовых инструментов — не самая хорошая идея. Многие алгоритмы регрессии и классификации радикально отличаются друг от друга и стоит понимать их особенности.

          Кроме того, данные обычно нужно обрабатывать.

          Ну и к тому же, если нужно что-то кроме простой классификации/регрессии и нужно построить рекомендательные системы, обработку естественного языка или что-то ещё или использовать нейронные сети, то явно придётся программировать.
            +1
            Спасибо за подробное объяснение :)
            Да, конечно, я с вами целиком согласна, что необходимо разбираться в области, иначе далеко не уехать.
            Но для большинства ML оказывается настолько сложен, что пока человек разберется с матчастью, уже успевает пройти весь запал. Мне кажется, что простые готовые инструменты помогают постоянно держать мотивацию на нужном уровне.
            Можно изучить новый алгоритм и сразу попробовать его в бою, настроив какие-то параметры. Можно один из блоков заменить на собственный код, а остальные оставить как есть — и тоже сразу посмотреть, остается ли модель рабочей. Стала ли она лучше.

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

              Кстати говоря, если есть желание попробовать машинное обучение на практике с использованием программирования, то Kernels на Kaggle — хорошая идея. Ничего не надо устанавливать и большое количество рабочих примеров, которые можно поизменять.
            +3
            У меня статья вызвала только один вопрос: что символизирует мужик с болгаркой на КДПВ? (кстати нарушающий ТБ)
              0
              Это стоматолог, символизирующий Боль
              +2
              Меня несколько удивляет, почему компания Microsoft, практически, умалчивает о существовании такого мощного и доступного инструмента. Нет никакой «просветительской» работы или пиара типа «Машинное обучение в каждый дом». В рекламе Azure упоминаются, наверное, все службы, кроме ML. Ну, или мне так «повезло»…

              Статья полезная и своевременная. Конечно, она не является учебником, но, хотя бы, позволяет донести читателям информацию, что есть такой вот сервис, который предлагает такие-то инструменты. И, на мой взгляд главное, что им могут успешно воспользоваться не программисты. Но на данном ресурсе, наверное, не совсем та целевая аудитория. Подобный материал, скорее, пошел бы «на ура» среди тех, кому уже не хватает возможностей того же Excel и кто не планирует становиться программистом: экономисты, финансисты, ученые и т.п. Во всяком случае, ничего сложнее, чем скрипты на R или Python. В случае с Azure ML, это лишь манипуляции с данными и вывод диаграмм, все сложности типа нейросетей и алгоритмы моделирования заложены в самой системе в тех самых боксах, которые можно просто перетащить мышкой. Кстати, если пользователь не уверен, какую именно модель ему лучше использовать в том или ином случае, то всегда можно «нарисовать» несколько (параллельно) и просто сравнить результаты их работы. Потом выбрать лучшую. В модуле Evaluate два входа, на которые можно пустить данные от двух разных моделей — получим сравнительный анализ. Но это уже детали.

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