Практические вопросы машинного обучения. Часть 1

Гиперпараметры и перекрёстная проверка

Здравствуйте и вновь добро пожаловать на занятия по теме «Обработка данных: машинное обучение с учителем на языке Python».

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

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

Всёэто – гиперпараметры. Они могут быть дискретными или непрерывными. Иногда,чтобы понять правильное направление, можно использовать знание алгоритма. Так,мы знаем, что в методе k-ближайшихсоседей если k = 1, то мы просто ориентируемся на ближайшуюучебную точку, что приводит к очень мелкозернистой границе классификации припринятии решения. Как вы понимаете, это может привести к серьёзнойпереобученности модели. При увеличении kгрань будет более гладкой, но если k чересчурвелико, то это, вероятно, приведёт к плохой приспособленности модели, к тому жепотребует гораздо больше времени для создания прогноза.

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

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

Одиниз популярнейших методов для подбора гиперпараметров называется K-блочной перекрёстной проверкой. Суть его проста. Мыпросто разбиваем наши учебные данные на Kчастей и делаем цикл, повторяющийся K раз. При этомкаждый раз берётся одна из частей и используется в качестве проверочногонабора, тогда как остальные части данных используются в качестве учебного. Так,при первом проходе цикла мы проверяем результат на первой части, а обучаемся наоставшихся, на втором проходе – проверяем результат на второй части, а наостальных обучаемся. Как правило, K выбираетсяравным 5, 8 или 10.

Надеюсь,идея ясна. Вот псевдокод, который это делает:

scores = []

sz = N / K

for i in xrange(K):

    Xvalid,Yvalid = X[ i*sz: (i+1)*sz ], Y[ i*sz: (i+1)*sz ]

    Xtrain, Ytrain= concat(X[0 : i*sz], X[(i+1)*sz:N]), concat(Y[0 : i*sz], Y[(i+1)*sz:N])

   model.fit(Xtrain, Ytrain)

   scores.append(model.score(Xvalid, Yvalid))

return scores

Мыинициируем оценки для пустого списка, находим размер каждый части путём деленияN на K и выполняемцикл for Kраз, получая проверочные блоки X и Y, а также учебные Xи Y, которые состоят из всего, что не входит впроверочные X и Y. Таким образом,этот алгоритм возвращает K разных оценок,и можно использовать просто их среднее значение, чтобы оценить, насколько хорошимявляется данное конкретное значение гиперпараметра.

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

Обратите внимание, что библиотека Sci-Kit Learn включает в себя реализацию K-блочной перекрёстной проверки, которую следует использовать при написании реального кода. Тем не менее я рекомендую попробовать самостоятельно написать код для этого метода, поскольку это не сложно, но является хорошей практикой.

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

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

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

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

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

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

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

Ещё один способ извлечения признаков – использовать методику уменьшения размерностей вроде метода главных компонент. Это «автоматический» метод, не требующий знаний в предметной области, но в результате ведущий к нескольким желательным свойствам. Во-первых, все исходящие данные после использования метода главных компонент не коррелируются, что означает отсутствие избыточности. Во-вторых, исходящие данные при этом упорядочены по количеству содержащейся в них информации, измеряемой дисперсией, так что можно выбрать подмножество признаков, сохраняющих 95 или 99% исходной дисперсии и отбросить все остальные. В данном случае это и будет вашим отбором признаков. Чтобы узнать больше о методе главных компонент, можете изучить мой курс «Глубокое обучение без учителя на языке Python». Одним из недостатков данного метода является то, что метод главных компонент проводит только линейное преобразование.

Сравнение с глубоким обучением

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

Первое. Кроме всего прочего, на протяжении всего этого курса мы фиксировали время обучения и прогнозирования. Мы видели, что в определённых случаях обучение происходило очень быстро, а прогнозирование – очень медленно, как в случае k-ближайших соседей. Мы также видели, что обучение может быть медленным, зато прогнозирование происходить значительно быстрее, как в случае деревьев решений. И видели, что всё может происходить быстро в обоих случаях, как это было у перцептрона.

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

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

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

Ещёодин дискуссионный аспект – интерпретируемость. Вообще говоря, людям частонравятся объяснимые модели. Линейные методы и деревья решений легко объяснимы:первые – потому что оценивают входные данные по величине и знаку, а вторые –потому что разделяют данные по одному признаку за раз. Если вы создаёте модельдля кого-либо, кто не требует выдавливания ещё хотя бы полпроцента точности, тонеплохо бы использовать простую модель, позволяющую интерпретироватьрезультаты. Признаки, выделяемые нейронными сетями, трудно интерпретировать.Что значит иметь нелинейную функцию ряда входных переменных? В нашем физическоммире такие понятия вообще могут оказаться бессмысленными. Так что этонедостаток с точки зрения возможности интерпретировать.

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

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

Мультиклассовая классификация

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

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

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

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

Ещёодна возможность – создать много классификаторов, каждый из которых сравнивает толькоодин класс с другим в одно и то же время. Если у нас есть K классов,сколько нам понадобится классификаторов? Проделав математические расчёты, можноубедиться, что нам потребуется K(K-1)/2 классификаторов! Это сложность O(K2), что оченьмного. Так что это не решает проблему, если у нас, скажем, миллион исходящихклассов. Кроме того, как и в предыдущем решении, этот метод также страдает отвозможности в итоге получить ничью, поскольку исходящий прогноз – это класс снаибольшим количеством «голосов».

Вданном курсе мы больше не будем углубляться в эту тему, поскольку мы ужезнакомы с классификаторами, способными к мультиклассовой классификации, ипросто будем использовать их. Кроме того, мы будем обсуждать библиотеку Sci-Kit Learn, в которой реализована возможность мультиклассовойклассификации, и нет нужды вдаваться в детали, поскольку в настоящей жизни лучшевоспользоваться подобной библиотекой. Но в качестве упражнения подумайте о том,какие из рассмотренных нами моделей естественным образом способны кмультиклассовой классификации. Посмотрим, сможете ли вы их идентифицировать.

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

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

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

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

Ещё один способ извлечения признаков – использовать методику уменьшения размерностей вроде метода главных компонент. Это «автоматический» метод, не требующий знаний в предметной области, но в результате ведущий к нескольким желательным свойствам. Во-первых, все исходящие данные после использования метода главных компонент не коррелируются, что означает отсутствие избыточности. Во-вторых, исходящие данные при этом упорядочены по количеству содержащейся в них информации, измеряемой дисперсией, так что можно выбрать подмножество признаков, сохраняющих 95 или 99% исходной дисперсии и отбросить все остальные. В данном случае это и будет вашим отбором признаков. Чтобы узнать больше о методе главных компонент, можете изучить мой курс «Глубокое обучение без учителя на языке Python». Одним из недостатков данного метода является то, что метод главных компонент проводит только линейное преобразование.

Сравнение с глубоким обучением

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

Первое. Кроме всего прочего, на протяжении всего этого курса мы фиксировали время обучения и прогнозирования. Мы видели, что в определённых случаях обучение происходило очень быстро, а прогнозирование – очень медленно, как в случае k-ближайших соседей. Мы также видели, что обучение может быть медленным, зато прогнозирование происходить значительно быстрее, как в случае деревьев решений. И видели, что всё может происходить быстро в обоих случаях, как это было у перцептрона.

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

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

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

Ещёодин дискуссионный аспект – интерпретируемость. Вообще говоря, людям частонравятся объяснимые модели. Линейные методы и деревья решений легко объяснимы:первые – потому что оценивают входные данные по величине и знаку, а вторые –потому что разделяют данные по одному признаку за раз. Если вы создаёте модельдля кого-либо, кто не требует выдавливания ещё хотя бы полпроцента точности, тонеплохо бы использовать простую модель, позволяющую интерпретироватьрезультаты. Признаки, выделяемые нейронными сетями, трудно интерпретировать.Что значит иметь нелинейную функцию ряда входных переменных? В нашем физическоммире такие понятия вообще могут оказаться бессмысленными. Так что этонедостаток с точки зрения возможности интерпретировать.

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

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

Мультиклассовая классификация

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

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

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

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

Ещёодна возможность – создать много классификаторов, каждый из которых сравнивает толькоодин класс с другим в одно и то же время. Если у нас есть K классов,сколько нам понадобится классификаторов? Проделав математические расчёты, можноубедиться, что нам потребуется K(K-1)/2 классификаторов! Это сложность O(K2), что оченьмного. Так что это не решает проблему, если у нас, скажем, миллион исходящихклассов. Кроме того, как и в предыдущем решении, этот метод также страдает отвозможности в итоге получить ничью, поскольку исходящий прогноз – это класс снаибольшим количеством «голосов».

Вданном курсе мы больше не будем углубляться в эту тему, поскольку мы ужезнакомы с классификаторами, способными к мультиклассовой классификации, ипросто будем использовать их. Кроме того, мы будем обсуждать библиотеку Sci-Kit Learn, в которой реализована возможность мультиклассовойклассификации, и нет нужды вдаваться в детали, поскольку в настоящей жизни лучшевоспользоваться подобной библиотекой. Но в качестве упражнения подумайте о том,какие из рассмотренных нами моделей естественным образом способны кмультиклассовой классификации. Посмотрим, сможете ли вы их идентифицировать.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: