Вы находитесь на странице: 1из 104

Типы данных  1

Рис. 12.2  Слева: пятна коровы. Справа: пятна зебры

Предположим, что мы обучили нашу систему и реализовали ее, но забыли


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

Рис. 12.3  Слева: Фотография коровы. Справа: Фотография зебры. Если мы


обучали нашу систему на изолированных изображениях, как на рис. 12.2, то систе-
ма может быть введена в заблуждение другими деталями на фотографиях

Люди могут легко узнать животных по их отображениям на этих


фотографиях. Но компьютер может быть введен в заблуждение ногами,
головами, поверхно- стью земли и другими деталями, что уменьшит его
способность дать правильный результат. Разница между подготовленными
данными на рис. 12.2 и неподготов- ленными данными на рис. 12.3 может дать
замечательный результат при наших обучающих данных, но стать совершенно
непригодной в реальном мире. Чтобы избежать этого, все новые данные, такие
как на рис. 12.3, должны быть преобра- зованы и иметь ту же форму, что и
обучающие данные на рис. 12.2.
Забыть преобразовать новые данные в тот же формат данных, который
исполь- зовался при обучении, довольно легко, но обычно это становится
причиной пло- хой работоспособности алгоритмов, а иногда и их полной
бесполезности.
Правило, помогающее не забывать это делать, таково: мы определяем, каким
образом мы будем преобразовывать наши обучающие данные, преобразовываем
их и запоминаем, как мы их преобразовали. Затем, каждый раз, когда мы имеем
дело с дополнительным количеством данных, мы должны сначала преобразовать
эти данные тем же способом, каким мы преобразовали данные перед представле-
нием их алгоритму.
12.3. типы Данных
Прежде чем мы рассмотрим конкретные преобразования данных, давайте рас-
смотрим типы данных, с которыми мы будем работать, и типовые формы пред-
ставления данных, описывающие категории.
Мы увидим, что обычно это касается того, можем ли мы сортировать данный
тип данных. Сортировка настолько полезна, что если отсутствуют естественные
способы сортировки, то следует поискать такой способ.
Вспомним, что каждая выборка (иногда говорят образец) – это список вели-
чин, каждая из которых называется характеристикой, или признаком. Каждая
характеристика в выборке может быть в одном из двух вариантов: числовая или
категориальная.
Числовые данные – это просто числа, либо с плавающей запятой, либо целые.
Их также называют количественными. Числовые или количественные данные
могут быть рассортированы просто на основании их величин.
Категориальные данные – это вообще о чемнибудь, хотя часто это просто стро-
ка символов, описывающая маркировку или категорию, такие как «корова» или
«зебра». Существует два типа категориальных данных: те, которые могут, и те,
ко- торые не могут быть отсортированы естественным образом.
Порядковые данные – это категориальные данные, которые имеют порядок
(отсюда название) и, следовательно, могут быть рассортированы. Цвета радуги
можно представить их порядком, потому что они имеют естественный порядок,
в котором присутствуют в радуге от «красного» к «оранжевому» и далее до «фи-
олетового». Другой пример строк – описание людей разного возраста, например
«младенец», «юноша», «взрослый». Эти строки имеют естественный порядок и
по- тому могут быть рассортированы.
Номинальные данные – это категориальные данные, не имеющие естествен-
ного порядка. Например, список канцелярских принадлежностей, таких как
«скрепка», «степлер», «точилка для карандашей». Они не имеют естественного
встроенного порядка. Не имеет его и список типов одежды, таких как «носки»,
«рубашка», «перчатки» или «шляпакотелок».
Мы можем превратить номинальные данные (то есть не имеющие поряд-
ка) в упорядоченные данные, просто определив свой порядок для этих данных
и придерживаясь его. Мы можем определить порядок, скажем, одежды, начиная
с головы и далее вниз, так что наш прежний пример приобретет порядок
«шляпа котелок», «рубашка», «перчатки» и «носки», представ упорядоченными
данными. Порядок, который мы создаем для номинальных данных, может не
иметь какого нибудь особого рода смысла, он просто должен быть определен и
затем постоянно использоваться именно в таком виде.
Мы часто конвертируем строку данных, как упорядоченных, так и номиналь-
ных, в числа, потому что компьютеру с ними легче работать. Самый простой
путь сделать это – просто идентифицировать все строки в нашей базе данных (и
любые
другие, которые могут появиться в данных) и пометить каждую строку уникаль-
ным числом, начиная с 0. Многие библиотеки предлагают встроенные стандарты
для создания и применения таких преобразований.

12.3.1. Кодирование с использованием индивидуальных


переменных
Иногда в машинном обучении удобнее работать со списком чисел, чем с одним
числом. Например, мы можем создать классификатор, который смотрит на фото-
графии и говорит нам, какой из 10 различных объектов показан на фотографии.
Классификатор может показать на выходе только одну величину, скажем 3 или 7,
говоря нам, к какой категории, как он полагает, вероятно, относится этот объект.
Но мы часто хотим узнать, какую вероятность имеют также и другие категории.
Тогда мы возвращаемся к списку с одной величиной для категории, в котором
размер величины представляет уверенность классификатора, что фотография
принадлежит к этой категории. Первый вход показывает категорию 1, второй –
категорию 2 и т. д. Поэтому, если объект относится к пятой категории, то пятый
вход в списке будет наибольшим, но другие категории могут быть ненамного
меньшей величины, и классификатор покажет, что эти варианты тоже не следует
полностью исключать.
Мы можем сделать некоторые шаги в этом процессе более удобными, если вы-
ход классификатора и маркировка, которую мы присвоили выборке, будут в
фор- ме списка. Преобразование маркировок, подобных 3 или 7, в такого рода
список называется кодированием с использованием индивидуальных
переменных (для каждого состояния). Относится только к одному входу в
списке и является
«индивидуальным параметром», или маркировкой. Иногда такое кодирование
называют унитарным кодированием. Мы говорим, что превращаем число
в фиктивную переменную, относящуюся ко всему списку. Таким образом,
когда мы даем системе при обучении маркировку категории, мы даем системе
список с этой индивидуальной или фиктивной переменной, а не одно число.
Вначале, если мы имеем категориальные данные, мы преобразовываем их
в числовые данные, как показано выше, присваивая каждой отличной величине
уникальный номер, начиная с 0.
Теперь, каждый раз, когда мы видим одну из этих величин, мы помещаем ее
в список с 0. Список имеет размер общего числа возможных величин. Затем мы
помещаем 1 в слот, соответствующий величине, которую мы хотим представить.
Давайте посмотрим на это в действии. На рис. 12.4 (а) показаны 8 цветов ори-
гинальной коробки цветных карандашей выпуска 1903 года [Crayola16]. Давайте
предположим, что эти цвета являются строкой в наших данных. Мы обозначаем
величинами от 0 до 7 каждую из этих 8 строк (обычно мы предлагаем сделать это
за нас стандартной программе), как показано на рис. 12.4 (b). С этого момента
каждый раз, когда мы видим одну из этих строчек, используемую в наших
данных, мы перемещаем ее в список из 8 величин, как показано на рис. 12.4 (с).
Каждая величина равна 0, за исключением 1, расположенной в индексе,
соответствующем
величине этой строки.
Цвета Присвоение номера Кодирование с использованием
в наших каждой величине индивидуальных переменных
данных

красный красный 0 красный [1, 0, 0, 0, 0, 0, 0, 0]


желтый желтый 1 желтый [0, 1, 0, 0, 0, 0, 0, 0]
синий синий 2 синий [0, 0, 1, 0, 0, 0, 0, 0]
зеленый зеленый 3 зеленый [0, 0, 0, 1, 0, 0, 0, 0]
оранжевый оранжевый 4 оранжевый [0, 0, 0, 0, 1, 0, 0, 0]
коричневый коричневый 5 коричневый [0, 0, 0, 0, 0, 1, 0, 0]
фиолетовый фиолетовый 6 фиолетовый [0, 0, 0, 0, 0, 0, 1, 0]
черный черный 7 черный [0, 0, 0, 0, 0, 0, 0, 1]
(а) (b) (c)
Рис. 12.4  Кодирование с использованием индивидуальных переменных для
цветов карандашей в коробке Креолы выпуска 1903 года. Предположим, что
они являются строками в наших входных данных: (а) 8 оригинальных строк; (b)
каждой строке присвоен номер от 0 до 7; (с) каждый раз, когда эта строка
появляется в на- ших данных, мы помещаем ее в список из 8 чисел со всеми
нулями, кроме 1 в по- зиции, соответствующей номеру этой строки

На рис. 12.5 показано кодирование с использованием индивидуальных пере-


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

Оригинальные Обозначения Коды с индивидуальными


данные переменными
[3, 1, "носки"] "шляпакотелок" 0 [3, 1, [0, 0, 0, 1] ]
[2, 7, "перчатки"] "рубашка" 1 [2, 7, [0, 0, 1, 0] ]
[4, 1, "носки"] "перчатки" 2 [4, 1, [0, 0, 0, 1] ]
[1, 3, "шляпакотелок"] "носки" 3 [1, 3, [1, 0, 0, 0] ]
[1, 3, "рубашка"] [1, 3, [0, 1, 0, 0] ]
(a) (c)
(b)
Рис. 12.5  Если выборка имеет множественные характеристики, мы можем пре-
образовать характеристики в индивидуальную форму, оставляя остальные таки-
ми, какие они есть: (а) наши входные данные имеют по три характеристики. Мы
преобразуем строки в индивидуальную переменную; (b) библиотека присваивает
уникальный номер каждой строке, начиная с нуля; (с) кодирование строк с исполь-
зованием индивидуальных переменных

Поскольку представление данных с индивидуальными переменными проще


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

12.4. базовая оЧистка Данных


Давайте посмотрим на ряд простых действий, позволяющих быть уверенным,
что наши данные хорошо очищены (или вычищены), прежде чем мы начнем
осу- ществлять любого рода широкомасштабную модификацию.
Если наши данные представлены в текстовой форме, то мы хотели бы, чтобы
в них не было типографских и орфографических ошибок, вставленных непри-
годных для печати символов и других очевидных погрешностей, которые могут
привести к ошибочной интерпретации. Например, если у нас группа
фотографий животных вместе с текстовым файлом, описывающим их, мы
хотели быть уверен- ными, что каждый «жираф» маркирован как «жираф», а не
как «жирафф» или не в варианте «жирафы – очень высокие». Мы также хотим,
чтобы были исправлены ошибки, связанные с заглавными и строчными буквами,
подобные «Жираф», ког- да предполагается строчная буква. Компьютер будет
присваивать различные чис- ла всем различным строкам, поэтому каждое
обращение к слову жираф требует идентичных строк.

12.4.1. Очистка данных


Мы хотим удалить любые случайные повторения в обучающих данных, потому
что они будут искажать нашу идею о том, с какими данными мы работаем. Если
какаянибудь группа данных случайно включена многократно, наш обучаемый
будет интерпретировать их как множественные различные выборки, которые
просто имеют те же самые величины, и, таким образом, эти выборки будут
иметь большее влияние на процесс, чем следует.
Мы также хотим быть уверенными, что в данных нет такого рода
катастрофиче- ских ошибок, как отсутствие децимальной точки и использование
величины 1000 вместо 1.000 или применение двух знаков «» перед числом вместо
одного. Часто можно обнаружить в созданных вручную базах данных пропуски и
знаки вопро- сов, когда у составителя нет соответствующих величин. Некоторые
базы данных, составленные компьютером, могут включать коды типа «NaN»
(отсутствует число, Not a Number), которым составитель показывает, что он хочет
напечатать число, но получил нечто другое. Мы также хотим быть уверенными,
что данные состав- лены в том формате, который будет надлежащим образом
интерпретирован про- граммой, которой мы их предоставляем. Например,
существуют разные способы набора научной нотации, и программы могут легко
неправильно интерпрети- ровать формы, которые для них необычны. Величина
0.007 обычно печатается в научной нотации как 7е3, но когда мы используем ее
как вход в другую про- грамму, она может быть интерпретирована как (7хе)3, где
е – константа Эйлера (примерно 2.7). В результате компьютер принимает эту
величину как равную 16, а не 0.007. Мы должны выловить такого рода вещи до
того, как накормим ими нашу программу.
Мы также хотим поискать пропавшие данные. Если выборка не имеет данных
для одной или нескольких характеристик, мы можем исправить это
алгоритмиче-
Нормализация и стандартизация  305

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

12.4.2. Очистка данных на практике


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

12.5. нормализация и станДартизация


Нам часто приходится работать с выборками, чьи характеристики представлены
в самых разных числовых интервалах.
Например, предположим, что собраны данные по африканским слонам. Наши
данные описывают каждого слона 4 величинами:
1) возраст в часах (0, 420,000);
2) вес в тоннах (0, 7);
3) длина хвоста в сантиметрах (120, 155);
4) возраст относительно исторического среднего возраста в часах (–
210,000, 210,000).
Это очень разные диапазоны чисел. Грубо говоря, в силу цифровой природы
ал- горитмов, которые мы используем, компьютер будет рассматривать большие
числа как более важные, чем маленькие. Но то, что большие числа являются
маленькими,
не более, чем случайность. Например, если мы выбираем измерение возраста в
де- сятилетиях, а не в часах, диапазон этой характеристики будет 0–5, не 0–420,000.
В приведенном списке некоторые из наших характеристик могут быть приня-
ты за отрицательные величины, и эта аномалия может также повлиять на то, как
компьютер их будет обрабатывать. Мы хотим, чтобы наши данные были, грубо
го- воря, сравнимы и наш выбор единиц измерения и другие произвольные
решения не влияли на обучение системы этими данными.

12.5.1. Нормализация
Обычно первым шагом при преобразовании наших данных является нормали-
зация каждой характеристики. Слово «нормальный» используется в повседнев-
ной жизни в смысле «типичный», но оно также имеет специальный технический
смысл в различных областях.
Мы будем использовать это слово в статистическом смысле, в котором оно
имеет значение масштабирования данных так, что они лежат в некотором кон-
кретном диапазоне. Мы обычно выбираем диапазон или [–1,1], или [0,1], в зави-
симости от данных и того, что они означают (не имеет смысла, например, гово-
рить об отрицательных яблоках или возрасте).
Каждая библиотека машинного обучения предлагает рутинную программу
для этого процесса, но мы не должны забывать вызывать ее. Мы увидим
примеры в главах 15 и 23. Рисунок 12.6 показывает множество данных
размерностью 2D, которые мы используем для демонстрации. Мы выбрали
гитару, потому что ее форма поможет нам видеть, что происходит с точками,
когда мы их двигаем. Мы добавили цвет только как помощь в визуализации,
также помогающий нам ви- деть, как двигаются точки. Цвет не имеет другого
предназначения.
Входные точки

Рис. 12.6  Форма гитары содержит 232 точки. Каждая точка – это выборка,
опи- сываемая двумя ее характеристиками, названными X и Y. Цвета здесь
только для того, чтобы помочь отслеживать точки при переходе от одного
рисунка к другому, и больше ничего не означают
Обычно эти точки являются результатом измерений, скажем, возраста или
веса некоторых людей или темпа и громкости песен. Чтобы сохранить общность
рас- суждений, мы обозначили их как X и Y.
На рис. 12.7 показаны результаты нормализации каждой характеристики на-
ших данных в форме гитары в интервале [–1,1] по каждой оси. То есть если Х
величина в диапазоне от –1 до 1, то и величина Y независимо масштабируется
в пределах от –1 до 1. Форма гитары при этом немного искажена, она растянута
вертикально больше, чем горизонтально.
Нормализованные

Рис. 12.7  Данные на рис. 12.6 после нормализации в диапазоне [–1,1] по каж-
дой оси. Искажение формы вызвано большим растяжением по оси Y, чем по оси Х

12.5.2. Стандартизация
Другой рутинной операцией является стандартизация каждой характеристики.
Это двухступенчатый процесс.
Вопервых, мы добавляем (или вычитаем) фиксированные величины во всех
характеристиках, так чтобы средние значения этих характеристик были рав-
ны нулю (этот шаг также называется нормировкой среднего, или вычитани-
ем среднего). В наших 2Dданных это сдвиг всего набора данных слева направо и
сверху вниз, так что средние значения попадают точно в интервал (0,0).
Затем после нормализации или масштабирования каждой характеристики,
чтобы они располагались между –1 и 1, мы масштабируем ее так, чтобы она име-
ла стандартное отклонение, равное 1 (этот шаг также называется нормировкой
дисперсии). Вспомним, что в главе 2 было сказано, что это означает, что при-
мерно 68 % величины этой характеристики будут лежать в интервале от –1 до 1.
В нашем примере с размерностью 2D величины Х растягиваются или сжимаются
горизонтально, пока примерно 68 % данных не будут в интервале от –1 до 1 по
оси Х и затем величины по оси Y не растянутся или сожмутся вертикально, пока
не примут такие же значения по оси Y. Это неизбежно означает, что некоторые
точки
будут за пределами диапазона [–1,1], так что результат будет отличным от того,
который мы получили при нормализации.
Как и при нормализации, большинство библиотек будет по вызову предлагать
рутинные программы для стандартизации любой или всех характеристик. Рису-
нок 12.12 показывает применение стандартизации к нашим начальным данным
на рис. 12.11.
Среднее и дисперсия скорректированы

Рис. 12.8  Когда мы стандартизируем наши данные, мы двигаем их горизонталь-


но и вертикально так, что среднее значение каждой характеристики становится
равным нулю, а затем мы растягиваем или сжимаем их горизонтально и верти-
кально так, что стандартная девиация этих характеристик (то есть примерно 68 %
данных) лежит в диапазоне от –1 до 1 по каждой оси

12.5.3. Запоминание преобразований


Стандартные программы нормализации и стандартизации управляются пара-
метрами, которые говорят им, как выполнять свою работу. Эти параметры на-
ходятся стандартными библиотеками, которые анализируют данные, прежде
чем применят преобразование. Поскольку преобразование будущих данных с
теми же параметрами очень важно, эти библиотеки всегда будут давать нам
возможность придерживаться тех же параметров, так что позже мы сможем
снова применить те же преобразования.
Другими словами, когда позже мы получим новый пакет данных для оценки
точности нашей системы или получения реальных предсказаний о чемлибо, мы
не анализируем эти данные, чтобы найти новые стандартизирующие или норма-
лизирующие преобразования. Вместо этого мы используем те же
нормализующие или стандартизирующие шаги, которые мы определили ранее
для обучающих данных.
Важность этого шага заключается в том, что получаемые вновь данные
сами по себе почти никогда не будут нормализованы и стандартизованы. То
есть они не будут находиться в диапазоне [–1,1] по обеим осям, их среднее не
будет нахо-
диться в (0,0), и они не будут содержать 68 % своих данных в диапазоне [–1,1) по
обеим осям. Ну и пусть.
Что является важным, так это использование тех же преобразований. Если
вновь поступающие данные недостаточно нормализованы и стандартизованы,
стандартная программа это сделает.

12.5.4. Типы преобразований


Преобразования бывают одномерные (univariate), что означает, что они одно-
временно работают только с одной характеристикой, с каждой независимо от
дру- гих (название произошло от объединения uni, один, и variate, что означает то
же, что variable, переменная или характеристика). Другие преобразования –
много- мерные (multivariate), что означает, что они работают со многими
характерис тиками одновременно (здесь также название происходит от
объединения multi (много) с variate (переменная или характеристика)).
В качестве простого примера рассмотрим нормализующее преобразование,
по- добное рассмотренному выше. Это одномерное преобразование, потому что
оно затрагивает каждую характеристику как отдельное множество данных. То
есть оно масштабирует все величины Х в интервал [0,1] и независимо от них все
величины Y в [0,1]. Эти два множества характеристик никак не взаимодействуют.
Другими словами, то, как ось X получает масштабирование, совершенно не
зависит от всех величин по оси Y, и наоборот.
На рис. 12.9 визуально показано это преобразование применительно к данным
с тремя характеристиками.

0 1 0 1
(a) (b)

Рис. 12.9  Когда мы применяем одномерное преобразование, каждая характе-


ристика преобразуется независимо от других. Здесь мы нормализуем характерис-
тики к диапазону [0,1]: (а) начальные диапазоны трех характеристик; (b) каждый из
трех диапазонов независимо сдвинут и растянут к диапазону [0,1]

В противоположность этому многомерный алгоритм рассматривает многие


ха- рактеристики одновременно и обрабатывает их в группе. Наиболее
экстремальная (и, возможно, наиболее употребляемая) версия этой обработки –
одновременная обработка всех характеристик. Если мы масштабируем наши три
цветные полосы многомерным способом, то мы сдвигаем и растягиваем их, пока
они все вместе не заполнят диапазон [0,1]. Это иллюстрируется на рис. 12.10.
0 1 0 1
(a) (b)

Рис. 12.10  Когда мы применяем многомерное преобразование, мы обрабаты-


ваем все характеристики одновременно. Здесь снова нормализация к диапазону
[0,1]: (а) начальные диапазоны трех характеристик; (b) три полосы двигаются и рас-
тягиваются, как группа, так что их максимальные и минимальные величины займут
диапазон [0,1]

Многие преобразования могут быть осуществлены или одномерным, или мно-


гомерным способом. Мы выбираем тот, который в большей степени подходит
для наших данных.
Например, одномерная версия имеет смысл, когда мы масштабируем наши
выборки Х и Y, потому что они существенно независимые. Но предположим, что
характеристиками были температурные измерения, сделанные в разное время
и в разные дни. Мы, возможно, захотим масштабировать все эти характеристи-
ки так, чтобы они всей группой охватывали диапазон температур, в котором мы
работаем.

12.6. выбор характеристик


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

наименьший вклад в получение правильного ответа. Продолжая наш пример со


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

12.7. понижение размерности


Другим методом уменьшения размера нашего множества данных является объ-
единение характеристик таким образом, чтобы одна характеристика работала за
двоих. Это называется понижение размерности, причем под «размерностью»
понимается количество характеристик.
Интуиция может подсказать нам, что некоторые характеристики в наших дан-
ных избыточны. Мы можем улучшить работу по обучению без потери
информа- ции путем сжатия базы данных, исключив из нее эти повторения.
Как упоминалось раньше, мы можем работать с разновидностью слонов, у
кото- рых длина туловища и размер ушей коррелированы: когда возрастает одно,
возрас- тает и другое. Поэтому если мы знаем один из этих размеров, мы можем
сделать неплохое предположение о величине другого. В результате мы можем
немного сжать нашу базу данных, заменив два поля одним, или одной из этих
величин, или какимлибо объединением их. Это привычно и для психологии
человека, когда индекс массы тела (Body Mass Index, BMI) является одним
числом, объединяю- щим рост и вес [CDC17].
Давайте посмотрим на инструмент, который позволяет нам автоматически вы-
бирать и объединять характеристики, оказывая наименьшее влияние на резуль-
таты.

12.7.1. Анализ главных компонентов (PCA)


Анализ главных компонентов (Principal Component Analysis, PCA) – математи-
ческий способ понижения размерности данных.
Давайте получим визуальное представление о PCA, посмотрев на то, что про-
изойдет с нашими данными на гитаре после применения PСА. Это
представление взято из [Dulchi16].
Рисунок 12.11 с гитарой снова показывает наши начальные данные. Как и рань-
ше, цвет точек дан, только чтобы сделать более понятным перенос их на следую
щий рисунок при преобразовании данных, и никакого другого назначения не
имеет.
Наша цель будет заключаться в том, чтобы превратить двухмерные данные
в одномерные. То есть мы будем замещать каждую пару Х и Y одним новым чис-
лом, так же как BMI является объединением роста и веса человека. При
использо- вании PCA реального набора данных мы можем объединить много
характеристик одновременно.
Входные точки

Рис. 12.11  Начальные данные для нашего обсуждения PCA. Как


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

Мы начнем со стандартизации данных. На рис. 12.12 показана комбинация


нормализации среднего и нормализации дисперсии, как мы видели это ранее.

Среднее и дисперсия скорректированы

Рис. 12.12  Наши входные данные после стандартизации

Мы уже знаем, что собираемся попытаться уменьшить эти данные размерно-


стью 2D до размерности 1D. Чтобы яснее представить себе идею до того, как мы
начнем ее применять, давайте посмотрим на процесс без одного ключевого шага,
а затем вернем этот шаг.
Для начала проведем горизонтальную линию вдоль оси Х. Мы назовем эту ли-
нию проекционной линией. Затем спроецируем, или сдвинем, каждую точку
данных на ближайшее место на этой проекционной линии. Этот процесс назы-
вается проекцией. Поскольку наша линия горизонтальна, нам надо только сдви-
нуть наши точки вверх или вниз, чтобы найти ближайшую точку на проекцион-
ной линии.
Результаты проецирования данных на рис. 12.12 на горизонтальную проекци-
онную линию показаны на рис. 12.13.
Проекция точек к y = 0

Рис. 12.13  Мы проектируем каждую точку данных на гитаре по-


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

Результат после обработки всех точек показан на рис. 12.14.


Это одномерное множество, к которому мы стремились, потому что точки
от- личаются только величиной X (величина Y при этом всегда равна 0,
поэтому она нерелевантная). Но это плохой путь объединения характеристик,
потому что все, что мы сделали в данном случае, – это отбросили величины Y.
Это то же, что вы- числять индекс массы тела, используя вес и игнорируя
рост.
Чтобы улучшить ситуацию, мы подключим шаг, который мы ранее
сознательно пропустили. Вместо использования горизонтальной проекционной
линии мы бу- дем поворачивать линию, пока она не достигнет направления
максимальной дис- персии. Она станет линией после проекции, от которой точки
находятся на макси- мальном удалении.
Любая стандартная библиотечная программа применения PCA находит эту
линию автоматически. На рис. 12.15 показана эта линия для наших данных на
гитаре.
Спроектировано к y = 0

Рис. 12.14  Результат после сдвига всех точек, как показано на


рис. 12.13, на проекционную линию. Каждая точка теперь
описыва- ется только своей Х-координатой, поэтому мы имеем
одномерное множество

Линия максимальной дисперсии

Рис. 12.15  Жирная черная линия – это линия максимальной дисперсии


для наших первоначальных данных. Она будет нашей проекционной
линией

Теперь продолжим, делая то, что мы делали раньше. Мы проектируем


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

Рис. 12.16  Мы проектируем данные на гитаре на проекционную


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

Спроектированные точки показаны на рис. 12.17. Заметим, что все они лежат на
линии максимальной дисперсии, которую мы нашли на рис. 12.15.
Спроектированные точки

Рис. 12.17  Точки набора данных на гитаре,


спроектированного на линию максимальной дисперсии

Эти точки лежат на линии, но они все еще имеют размерность 2D. Чтобы
полно- стью уменьшить их размерность до 1D, мы можем повернуть их до тех
пор, пока они не будут лежать на оси Х, как показано на рис. 12.18. Теперь
координата Y
снова не релевантная, и мы имеем данные размерностью 1D, которые включают
информацию о каждой точке из обеих их начальных величин Х иY.
Повернутые перемещенные точки

Рис. 12.18  Поворот точек из рис. 12.17 в горизонтальное положе-


ние. Каждая точка теперь описывается только величиной Х, поэтому
мы превратили 2D-данные в 1D-данные. Заметим, что мы не просто
убрали одну размерность, потому что обе оригинальные величины Х
и Y осуществляют теперь вклад в одномерные данные

Хотя прямая линия точек на рис. 12.18 выглядит как линия точек на рис. 12.14,
они различны, потому что точки распределены вдоль оси Х иначе. Другими сло-
вами, они имеют отличные значения, потому что они были вычислены проекти-
рованием на наклонную линию, а не на горизонтальную.
Все эти шаги выполняются автоматически в библиотеках машинного
обучения стандартными программами РСА при их вызове.
Достоинство этих новых данных заключается в том, что величина каждой од-
ной точки (ее положение по Х) является комбинацией начальных 2Dданных. Мы
уменьшили размерность нашего набора данных на единицу, но сделали это,
сумев оставить столько информации, сколько возможно. Наши обучающие
алгоритмы должны обрабатывать теперь только данные размерностью 1D,
поэтому они будут обучать быстрее.
Конечно, мы потеряли часть информации, поэтому можем пострадать от
умень- шенной скорости обучения или точности. Прием использования РСА
может быть эффективен при выборе размерностей, которые могут быть
объединены, остава- ясь в пределах выполнения поставленных в проекте задач.
Если мы имеем данные размерности 3D, то можем поместить поверхность
в среднее окружающих выборок и проецировать наши данные на плоскость.
Биб лиотечная программа найдет ориентацию этой плоскости. Это переведет
наши данные из 3D в 2D. При желании мы можем использовать эту описанную
выше технику и представить линию для величин точек, которая переведет их из
3D в 1D.
На практике мы можем использовать эту технику для любого числа размерно-
стей, уменьшив размерность данных в десять и более раз.
Решающими вопросами для такого рода алгоритмов являются вопросы о том,
как много размерностей мы пытаемся сжать, какие следует объединить и как их
объединять. Обычно число размерностей после применения РСА обозначается
буквой k. В нашем примере с гитарой k = 1.
В этом смысле мы можем назвать k параметром алгоритма, хотя мы обычно
называем его гиперпараметром всей системы обучения. Как мы видели, буква k
используется в машинном обучении в большом количестве алгоритмов, что
пред- ставляет неудобство, поэтому важно внимательно отнестись к контексту,
когда мы видим ссылку на k для того и другого случая.
Небольшая компрессия означает, что наше обучение или оценки будут недо-
статочно эффективны, слишком большое сжатие во многих случаях означает
риск удаления важной информации, которую нам следовало бы сохранить.
Выбирая наилучшую величину гиперпараметра k, мы обычно проверяем это на
небольшом количестве различных параметров, чтобы посмотреть, что работает
лучше всего. Мы можем автоматизировать поиск, используя
гиперпараметрический поиск, который мы покажем в главе 15.
Как всегда, где бы ни использовалось РСАпреобразование для сжатия обуча-
ющих данных, оно должно также быть применено тем же порядком для всех по-
следующих данных.

12.7.2. Стандартизация и PCA для изображений


Изображения являются важным и специальным видом данных. Давайте приме-
ним стандартизацию и РСА ко множеству изображений.
Каждая точка цветного изображения имеет 5 величин: X, Y, красный, зеленый
и синий, поэтому мы можем сказать, что эти данные пятимерные, 5D. Для
просто- ты мы будем здесь придерживаться монохроматических изображений.
Каждый пиксель имеет только 3 величины – X, Y и серый, то есть 3D.
В этом контексте мы не будем рассматривать значения X и Y как характеристи-
ки, подобные значениям шкалы серого, поскольку мы не хотим менять размер-
ность изображений. Поэтому мы рассматриваем наши пиксели как
характеристи- ки, которые имеют одну величину (уровень серого), а Х и Y мы
просто используем, чтобы наименовать выборку.
Мы будем рассматривать каждый пиксель как характеристику. Поэтому если
наше отображение имеет 100 пикселей в ширину и 50 пикселей в высоту, каждое
изображение имеет 100 × 50 = 5000 характеристик.
Это очень большая пространственная информация, означающая, что пиксели,
расположенные близко друг от друга в каждом направлении, часто будут иметь
некоторые соотношения. Для простоты мы будем игнорировать эту простран-
ственную информацию. Вместо этого мы будем превращать информацию раз-
мерностью 2D в 1Dсписок. Мы начнем с первого ряда изображения, присоеди-
няем второй ряд, затем третий и т. д., как это сделано на рис. 12.19. После того
как это будет сделано, мы будем иметь список с входом для каждого пикселя
изобра жения.
Ряд 1 Ряд 2 Ряд 3 Ряд 4 Ряд 5

Рис. 12.19  Превращение изображения в список. Вверху: наш вход. Внизу: спи-
сок, сформированный расположением одного ряда после другого, сверху вниз

Как мы видели раньше, когда мы используем инструмент, подобный РСА, мы


хотим, чтобы наши характеристики имели среднее, равное нулю, а стандартное
отклонение равно 1. Поэтому давайте обработаем наши пиксели подобным об-
разом [Turk91]. В верхнем ряду на рис. 12.20 показаны 5 плоских изображений
размером 5×5. В нижнем ряду показаны те же изображения после обработки.
Фак- тически мы рассматриваем одну за другой колонки, обрабатываем пиксели
в этих колонках и затем сохраняем эти новые величины.

Рис. 12.20  Обработка одной характеристики за другой (один пиксель за дру-


гим) наших списков изображения. Верхние пять рядов показывают плоское би-
нарное изображение для букв A, B, G, M и S. Мы проверяем каждую колонку
одну за другой и устанавливаем ее среднее равным нулю, а стандартную
девиацию – равной 1. Результирующие пиксели показаны в пяти рядах внизу.
Они масштаби- рованы так, что самый маленький имеет слабый синий цвет, а
самый большой – темно-синий цвет
Может показаться лишним, что мы обрабатываем каждый пиксель независи-
мо, поскольку эти средние игнорировали всю пространственную информацию
между пикселями (в последующих главах мы увидим другие методы, которые
делают полезной эту информацию). Но сейчас наша ментальная модель состоит
в том, что каждое изображение – это просто список независимых значений ха-
рактеристик, как если бы они были измерениями температуры, скорости ветра,
влажности и т. п.
Теперь давайте используем приведенные выше рассуждения на практике.
Мы начнем с рассмотрения 6 фотографий собак породы хаски, показанных на
рис. 12.21. Они были расположены вручную так, чтобы глаза и носы находились
в каждом изображении примерно в одинаковых положениях. В этом случае каж-
дый пиксель в каждом изображении имеет хороший шанс представлять ту же
часть собаки, как и соответствующий пиксель в другом изображении. Например,
пиксель сразу ниже центра является, вероятно, частью носа, а тот, что около
верх- него угла, является, вероятно, ухом и т. д.
Хаски 0 Хаски 1 Хаски 2 Хаски 3 Хаски 4 Хаски 5

Рис. 12.21  Наше начальное множество собак хаски

База данных из 6 собак – небольшое обучающее количество данных, поэтому


мы увеличим нашу базу данных, случайным образом пробегая по нашим шести
изображения снова и снова. Каждый раз при этом мы делаем копию, затем слу-
чайным образом сдвигаем ее горизонтально и вертикально на 10 % по каждой
оси, поворачиваем ее на 5 градусов по часовой и против часовой стрелки и, воз-
можно, отображаем ее зеркально слева направо. Затем мы добавляем преобразо-
ванное таким образом изображение в наше обучающее множество. На рис. 12.22
показаны результаты первых двух подобных трансформаций наших шести собак.
Мы применили эту технику вариаций, чтобы создать множество из 4000 изобра-
жений собак.
Поскольку мы хотели бы обработать эти изображения с помощью РСА,
нашим первым шагом будет стандартизация. Это означает, что мы будем
анализировать одни и те же пиксели на каждом из наших 4000 изображений и
настраивать груп- пы так, чтобы иметь среднее, равное 0, дисперсию, равную 1,
как мы это видели на рис. 12.20. Мы стандартизируем все 4000 изображений.
Стандартизированные версии наших 6 сгенерированных изображений собак
показаны на рис. 12.23.
В начале нашего рассмотрения РСА мы проецировали 2Dданные на 1Dли
нию. Наши изображения хаски имеют размер 64 на 45, так что каждое имеет
64 × 45 = 2880 характеристик. РСА будет каждый раз проецировать их на такое
большое количество направлений, какое мы посчитаем нужным, каждый раз ге-
нерируя новые спроецированные изображения.
Генерация 0 Генерация 1 Генерация 2 Генерация 3 Генерация 4 Генерация 5

Генерация 6Генерация 7Генерация 8Генерация 9Генерация 10Генерация 11

Рис. 12.22  Каждый ряд показывает множество новых изображений, созданных


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

Стандартизированные
Хаски 0 Хаски 1 Хаски 2 Хаски 3 Хаски 4 Хаски 5

Рис. 12.23  Наши первые шесть хаски после стандартизации

Поскольку в рисунок 12 изображений укладываются, давайте станем просить


РСА произвольно найти 12 изображений, которые, будучи добавленными вме-
сте с различными весами, наилучшим образом будут реконструировать входные
изображения. Каждая из таких проекций, найденная РСА, технически известна
под названием собственный вектор (eigenvector, от немецкого eigen – «такой
же» и vector – «вектор», математического названия такого рода объектов). Когда
мы создаем подобные собственные векторы для специальных объектов, то обыч-
но объединяем префикс с объектом обработки (eigendog, собственный вектор со-
баки). Соответственно, на рис. 12.24 показаны 12 собственных векторов собак.
Рассмотрение собственных векторов говорит нам многое о том, как РСА ана-
лизирует наши изображения. Первый собственный вектор представляет собой
большое черное пятно, где проявляются черты большинства собак. Второй соб-
ственный вектор, кажется, выхватил разницу затенений слева направо. Каждый
из собственных векторов кажется немного более сложным, чем предыдущий, вы-
хватывая отличающиеся детали на изображениях.
Собственные векторы собак
0 1 2 3 4 5

6 7 8 9 10 11

Рис. 12.24  12 векторов собак, созданные РСА

Давайте теперь посмотрим, как хорошо мы можем обнаружить наши


первона- чальные изображения путем объединения собственных векторов с
различными весами. На рис. 12.25 показаны наибольшие веса, которые РСА
нашел для каждого входного изображения. Мы создали реконструированных
собак путем масштаби- рования каждого изображения собственного вектора
собаки в соответствии с его весом и затем сложили результаты.
Реконструкции из 12 собственных векторов собак
Восстановление 0 Восстановление 1 Восстановление 2 Восстановление 3 Восстановление 4 Восстановление 5

Рис. 12.25  Реконструкция наших первоначальных входов из множества 12 соб-


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

Фотографии на рис. 12.25 не очень хороши. Мы просили РСА представить все


4000 изображений при обучаемом множестве только 12 фотографиями. Он
сделал все, что мог, но многие изображения все еще не выглядят как собаки.
Давайте попробуем использовать 100 собственных векторов собак. Первые
12 изображений собак выглядят похожими на изображенных на рис. 12.24, но за-
тем они становятся более сложными и детализированными. Результаты рекон-
струкции нашего первого множества из 6 собак показаны на рис. 12.26.
Это лучше! Они начали смотреться как собаки, хотя у пары из них, похоже, от-
сутствуют уши, которые являются одной из весьма важных деталей головы
собаки.
Давайте увеличим число собственных векторов собаки до 500 и сделаем еще
одну попытку. Рисунок 12.27 показывает результаты.
Реконструкции из 100 собственных векторов собак
Восстановление 0 Восстановление 1 Восстановление 2 Восстановление 3 Восстановление 4 Восстановление 5

Рис. 12.26  Реконструкция наших первоначальных входов из 100 собственных


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

Реконструкции из 500 собственных векторов собак


Восстановление 0 Восстановление 1 Восстановление 2 Восстановление 3 Восстановление 4 Восстановление 5

Рис. 12.27  Реконструкция наших первоначальных входов из 500 собственных


векторов собак. Верхний ряд: реконструированные изображения собак. Нижний
ряд: веса, примененные к собственным векторам собак. Заметим, что четвертое
множество имеет отличный от других вертикальный масштаб
Это выглядит еще лучше! Эти собаки легко узнаваемы, как 6 стандартизиро-
ванных изображений собак на рис. 12.23. На этих изображениях присутствует не-
который уровень шума, но начиная с 500 изображений и соответствующим весом
для каждого из них мы проделали неплохую работу по соответствию изображе-
ний. Если мы посмотрим на любое из 4000 изображений в нашей базе данных,
то увидим, что все они выглядят так же неплохо, как эти. Мы можем продолжать
увеличивать число собственных векторов собак, и результаты будут продолжать
улучшаться, становясь более четкими с меньшим шумом.
Отметим, что в каждой реконструкции собственные векторы изображений,
которые получают наибольшие веса, – это вначале те, которые соответствуют
крупным структурам. Когда мы опускаемся вниз по списку, каждый новый соб-
ственный вектор в общем весит немного меньше, чем раньше, и потому его вклад
в конечный результат становится меньше. Величина РСА у нас сейчас не та, с ко-
торой мы можем сделать изображения точно похожими на начальное
множество, но уже близкими к тем, которые позволяют использовать
собственные векторы, чтобы помочь классификатору осуществить
классификацию. Например, вместо того чтобы вести обучение нашего
классификатора со всеми 2880 пикселями для каждого изображения, мы можем
обучать его только на 100 или 500 весах. Клас- сификатор никогда не увидит
полных изображений. Он даже никогда не увидит собственных векторов
изображений. Он просто получит список весов для каж- дого изображения и эти
данные использует для анализа и классификации но- вых изображений, которые
мы представим ему во время обучения. Когда мы за- хотим классифицировать
новые изображения, мы просто представим ему веса, и компьютер даст нам
категории, основанные на этих величинах. Это может на- много уменьшить
объем вычислений и, соответственно, время, необходимое для вычислений.

12.8. преобразования
Давайте посмотрим более подробно на действия при вычислениях и
применении преобразований. Мы также посмотрим, как иногда мы
отказываемся от этих дей- ствий, чтобы было проще сравнить результаты с
первоначальными данными.
Давайте предположим, что мы работаем в дорожном департаменте города,
че- рез который проходит одна дорожная магистраль. Город находится в
северном районе, поэтому температура здесь часто опускается ниже
температуры замер- зания. Дорожные служащие заметили, что плотность
трафика меняется с изме- нениями температуры, поскольку в холодные дни
больше людей остается дома.
Для того чтобы составить план дорожных работ и строительства других соору-
жений, менеджеры хотели бы знать, можно ли предсказать на основании изме-
рения температуры количество автомобилей, которое пройдет по этой
магистра- ли в утренние часы пик. Поскольку измерения и обработка занимают
некоторое время, мы решаем проводить измерения температуры каждый день в
полночь и затем предсказать, сколько автомобилей будет на дороге с 7 до 8 утра
следую- щим утром.
Мы собираемся начать использовать нашу систему в середине зимы, поскольку
ожидаем, что в этот период температура будет как выше, так и ниже
температуры замерзания, то есть нуля градусов по Цельсию.
Преобразования  325

Таким образом, в течение нескольких месяцев мы измеряли температуру


и считали общее количество автомобилей, проходящих на следующее утро с 7
до 8 часов через специальный маркер на магистрали. Полученные данные
показаны на рис. 12.28.

Число автомобилей на магистрали Исходные данные

Полночная температура в градусах Цельсия

Рис. 12.28  Каждую полночь мы измеряем температуру и затем на


следующий день подчитываем число автомобилей, проследовавших
по магистрали между 7 и 8 часами утра

Мы хотели бы затем предъявить эти данные системе машинного обучения,


что- бы узнать связь между температурой и плотностью движения транспорта
по ма- гистрали. Это регрессионная задача, при которой в выборке присутствует
только одна характеристика, описывающая температуру в градусах, и мы хотим
полу- чить на выходе информацию о реальном числе автомобилей на
магистрали.
Давайте предположим, что регрессионный алгоритм, который мы
используем, работает лучше, когда мы масштабируем входные данные к
интервалу [0,1]. По- этому мы нормализуем данные к интервалу [0,1] по обеим
осям, как на рис. 12.29.
Нормализованные данные
Нормализованные автомобили

Нормализованная температура

Рис. 12.29  Нормализация обоих интервалов к [0,1]


делает нашу шкалу более удобной для обучения
Это похоже на рис. 12 28, но теперь обе наши шкалы (и данные) находятся в
ин- тервале [0,1].
Мы вновь напоминаем о важности запоминания преобразований, для того
чтобы их можно было применить к будущим данным. Давайте посмотрим на
эти действия в виде трех шагов. Для удобства мы будем использовать своего рода
объ- ектноориентированный подход, в котором наши преобразования
выполняются объектами, которые помнят свои параметры.
Первый из наших трех шагов – это создание преобразующего объекта для
каж- дой оси. Это объект, который способен выполнять данное преобразование
(его также называют отображение).
Второй шаг – это предъявление этому объекту наших данных для анализа. Он
находит самые маленькие и самые большие величины и использует их для созда-
ния преобразования, которое сдвигает и масштабирует входные данные в интер-
вал [0,1]. Поскольку мы хотим осуществить масштабирование автомобилей так
же, как и температуры, нам будет необходим преобразующий объект для
каждой оси. Пока в наших данных ничего не поменялось.
На рис. 12.30 показана эта идея.
Измеренные Подсчитанное число
температуры автомобилей

Анализ Анализ

Рис. 12.30  Построение преобразующих объектов. Слева: температурные дан-


ные предъявляются преобразующему объекту. Этот объект анализирует данные,
находя их минимальные и максимальные значения, и сохраняет их. Данные оста-
ются неизменными. Справа: мы создаем также преобразователь для посчитанных
автомобилей

Третий шаг снова представляет наши данные преобразующему объекту, но на


этот раз мы просим его применить преобразование, которое он теперь уже вы-
числил.
Когда это сделано, он возвращает новое множество данных, которое
преобразо- вано к масштабу [0,1]. Рисунок 12.31 демонстрирует эту идею.
Измеренные
температуры Подсчитанное число
автомобилей

Преобразование Преобразование

Преобразованные
температуры Преобразованное
число автомобилей

Рис. 12.31  Каждая характеристика модифицирована посредством преобразо-


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

Теперь мы готовы к обучению. Мы предъявляем преобразованные данные на-


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

Преобразование Преобразование

Обучение

Рис. 12.32  Схематическое изображение обучения


нашими преобразованными характеристиками и задачами

Давайте предположим, что мы обучили нашу систему и она хорошо


предсказы- вает число автомобилей в зависимости от температуры.
На следующий день мы размещаем нашу систему на странице интернета для
дорожных служащих города. В первую ночь служащий измеряет температуру.
Она равна –10 градусов Цельсия. Он открывает нашу программу, находит
входное окно, печатает –10 и нажимает кнопку «Предсказание трафика». Что
происходит? Мы не можем ввести –10 в нашу систему, потому что она ожидает
величины в ин- тервале от 0 до 1. Мы должны какимто образом преобразовать
наши данные.
Единственный, имеющий смысл путь, – применить те же преобразования, ко-
торые мы использовали для температуры, когда обучали нашу систему. Для
при- мера, если температура –10 в нашем оригинальном множестве
превратилась в число 0.29, то при температуре ночью –10 лучше ввести это число
0.29. Если оно
будет другим, наша система будет полагать, что стало теплее или холоднее, чем
на самом деле.
И здесь мы видим сохраненную величину нашего преобразования и его роль
как объекта. Мы просто говорим этому объекту сделать то же самое преобразо-
вание, которое он применил к нашим обучающим данным, и применить к этим
новым данным. Таким образом, если –10 превращалось в 0.29 во время обучения,
новая входная величина –10 снова будет превращена в 0.29 при эксплуатации.
Предположим, что система определяет на выходе, что плотность трафика равна
0.32. Это соответствует некоторой величине количества автомобилей, сформиро-
ванной нашим преобразованием для автомобилей. Но это величина между 0 и 1,
потому что это был наш диапазон данных, при котором наша система обучалась
по числу автомобилей. Как нам пересчитать это преобразование и превратить
в число автомобилей?
В любой библиотеке машинного обучения каждый преобразующий объект
име- ет стандартную программу для инвертирования, обеспечивающую
обратное преобразование. Она осуществляет инвертирование применяемого
нормализу- ющего преобразования. Поскольку объект преобразовал 39
автомобилей в норма- лизованную величину 0.32, инверсное преобразование
вернет нормализованную величину 0.32 обратно в 39 автомобилей. Эта величина
будет напечатана для до- рожного служащего. На рис. 12.33 показан данный шаг.
Измеренная
температура

Преобразование

Предсказание

Инверсное преобразование

Предсказание
числа автомобилей

Рис. 12.33  Когда мы подаем на систему новое значение температуры, мы пре-


образуем его, используя преобразование, которое мы вычислили для наших тем-
пературных данных, превратив их в число между 0 и 1. Полученная величина затем
проходит инверсное преобразование, которое мы вычислили для автомобильных
данных, превращая их снова в число автомобилей
Фрагментарная обработка  329

Снова мы видим, что всегда должны преобразовывать наши входные данные, при-
меняя оригинальное преобразование, которое мы использовали для обучающих данных.
Если неожиданно мы получим выборку, которая будет находиться за предела-
ми оригинального входного диапазона величин, то это приведет к искажению
ре- зультата. Предположим, что ночная температура опустилась до –50 градусов,
что значительно ниже минимальной величины в наших оригинальных данных. В
ре- зультате преобразованная величина окажется вне пределов диапазона [0,1].
То же произойдет и при очень большой положительной ночной температуре,
которая
будет преобразована в величину, большую 1, снова вне пределов [0,1].
Обе ситуации наказуемы. Мы устанавливаем диапазон [0,1], чтобы сделать
обучение как можно эффективнее. Но при этом необходимо держать под
контро- лем числовые величины. Когда система обучена, мы можем подавать на
нее лю- бые величины в качестве входа, и она сделает все возможное, чтобы
вычислить соответствующий выход.

12.9. фрагментарная обработка


В нашем примере с трафиком мы имели только две характеристики (темпера-
тура и плотность движения транспорта). Но мы можем представить себе и более
богатый набор данных, где каждый пример имеет десятки, а то и тысячи характе
ристик.
Как нам проводить предварительную подготовку столь сложных данных?
Какие части данных мы выделим и в какой форме, чтобы создать и применить
наши преобразования?
Существует три метода, в зависимости от того, как мы будем делить наши
дан- ные на фрагменты – по выборкам (образцам), по характеристикам или по
эле- ментам. Эти методы соответственно называются обработка по выборкам,
по характеристикам и по элементам.
Рассмотрим их по очереди.
Во всех наших предыдущих рассмотрениях мы исходили из того, что наши
дан- ные представляют собой сетку размерностью 2D.
Каждый ряд является одиночной выборкой, и каждый элемент в этом ряду яв-
ляется характеристикой. Поэтому если мы посмотрим на колонку данной сетки,
мы увидим все величины, составляющие характеристики. Рисунок 12.34 демон-
стрирует такую расстановку.
Характеристики
Выборки

Рис. 12.34  Наша база данных для предстоящего рассмотрения


является сеткой размерностью 2D. Каждый ряд содержит множество
характеристик, которые создают колонки
12.9.1. Обработка по выборкам
Методика обработки по выборкам является подходящей, когда все наши
характе- ристики являются аспектами одной природы. Примером могут
служить исходные данные, содержащие отрезки звуковых дорожек, скажем,
разговора по сотовому телефону. Характеристики в каждой выборке – это
амплитуда звуковой дорожки в последовательные моменты времени, как на рис.
12.35.
Если мы хотим масштабировать эти данные к диапазону [0,1], то имеет смысл
масштабировать все характеристики в одной выборке, так чтобы самая громкая
часть представлялась 1, а самая тихая часть – 0.
Характеристики
Выборки

Рис. 12.35  Каждая выборка состоит из серии измерений корот-


ких аудиоколебаний. Каждая характеристика дает нам мгновенное
измерение громкости звука в данный момент времени

Мы обрабатываем таким образом каждую выборку раз за разом, независимо от


других выборок. Обработка по выборке показана на рис. 12.36.
Оригинальные данные Накопление
преобразованных данных

Преобразование

Рис. 12.36  Когда мы обрабатываем данные по выборкам, каждая выборка (или


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

Когда мы ведем обработку данных по выборкам, мы представляем каждый ряд


(или выборку) как то, что следует обработать. Мы берем эту выборку как
последо- вательность, преобразуем ее. Мы можем или переписать ее в
оригинальном виде, или сохранить результат обработки в базе данных.
Такая обработка имеет смысл для данных в виде изображений и звуковых до-
рожек, когда мы предполагаем, что все характеристики настолько тесно при-
мыкают друг к другу, что целесообразно использовать одинаковое масштабиро-
вание.
12.9.2. Обработка по характеристикам
Обработка по характеристикам имеет смысл, когда выборки существенно раз
личны.
Предположим, что мы проводим каждый вечер измерения различных погод-
ных условий, записывая температуру, скорость ветра и наличие облачности. Это
дает нам четыре характеристики на выборку, как показано на рис. 12.37.
Температура Дождь Скорость ветра Влажность

3 июня
6 июня
9 июня

Рис. 12.37  Каждый вечер мы измеряем четыре различных аспекта погоды. Ког-
да мы обрабатываем данные по характеристикам, мы анализируем каждую колон-
ку независимо. Здесь мы находим минимум и максимум в каждой колонке (показа-
ны в квадратных скобках) и используем эти значения для преобразования входов
в новое множество величин между 0 и 1

Масштабировать эти данные по выборкам не имеет смысла, поскольку едини-


цы измерений несравнимы. Мы не можем сравнить скорость ветра и влажность
на одинаковых основаниях. Но мы можем проанализировать совместно все ве-
личины влажности, а также все величины скорости ветра, температуры и т. д.
Другими словами, мы модифицируем каждую характеристику по очереди, как
на рис. 12.38.
Когда мы обрабатываем данные по характеристикам, то представляем каждую
колонку (или характеристику) как то, что следует обработать. Мы по очереди вы-
бираем каждую колонку, анализируем и преобразуем ее. Обработку по
характерис тикам иногда называют фибра, или волокно.

12.9.3. Обработка по элементам


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

Обработка

Накопление
преобразованных
данных

Рис. 12.38  Когда мы обрабатываем данные по характеристикам, каждая ха-


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

Тогда необходимо умножить каждый элемент в сетке на 24.5, чтобы преобразо-


вать дюйм в миллиметр. Не важно, проделаем мы это по рядам или по
колонкам, поскольку каждый элемент будет преобразован одинаково.
Мы часто делаем это, когда работаем с изображениями. Данные изображения
нередко поступают с одним пикселем в диапазоне [0,255]. Поэтому мы
применяем обработку масштабирования по элементам и делим каждый пиксель
на всех вхо- дах на 255, что дает нам данные в диапазоне от 0 до 1.

12.10. преобразование с кросс-валиДацией


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

Утечка информации – это серьезная проблема, потому что она может


выступать в различных, довольно завуалированных формах. В качестве примера
давайте по- смотрим, как утечка информации влияет на кроссвалидацию
(перекрестный по- верочный процесс), обсуждавшуюся в главе 8.
Современные библиотеки предоставляют нам удобные стандартные програм-
мы, обеспечивающие быстрые и корректные применения кроссвалидации, так
что мы не должны писать для этого собственные коды.
Но мы хотим подсмотреть, как кажущиеся разумными методы ведут к инфор-
мационной утечке. А затем мы посмотрим, как избежать этого.
Рассмотрение этого в действии просто поможет нам получить представление
о том, как лучше предупредить, обнаружить и исправить информационную
утеч- ку в наших собственных системах и создаваемых нами кодах.
Новый элемент в этих обсуждениях будет состоять в том, как кроссвалидация
начинает каждый свой шаг с частью всех обучающих данных. Поэтому, в отличие
от предыдущих примеров, мы не будем проводить анализ всего набора обучаю
щих данных и затем преобразовывать их. Вместо этого мы проанализируем
толь- ко эту часть набора данных и посмотрим, как изменяются важные для нас
требо- вания.
Вспомним, что в кроссвалидации мы выделяем группу из обучающих данных.
Затем мы создаем нового обучаемого и обучаем его с результирующими данны-
ми. По окончании обучения мы оцениваем обучаемого, используя выделенную
группу как поверочный набор.
Это означает, что каждый раз после цикла мы имеем новый обучающий на-
бор (начальные данные без выборок в избранной группе). Если мы собираемся
применить преобразование к нашим данным, нам необходимо создать его, осно
вываясь на этом специфическом наборе данных. Затем мы применяем это преоб-
разование к текущему набору обучаемых данных и применяем то же самое преоб-
разование к текущему поверочному набору. Главное – помнить, что в связи с тем,
что в кроссвалидации мы создаем новый обучающий набор и поверочный набор
при каждом цикле, нам необходимо каждый раз создавать также и новое преоб-
разование.
Давайте посмотрим, что произойдет, если мы сделаем это некорректно. На
рис. 12.39 слева показан наш начальный набор выборок. Они анализируются,
что- бы создать преобразование (показано красным кружком), которое затем
приме- няется к выборкам (обращая их в красный цвет). Затем мы осуществляем
процесс кроссвалидации. Здесь цикл развертывается, и мы показываем
несколько при- меров обучающих сессий, каждая из которых ассоциировалась с
разными группа- ми. Таким образом, при каждом цикле мы удаляем группу,
обучаем на оставшихся выборках, затем проводим тестирование поверочной
группы и получаем оценку.
Проблема здесь в том, что когда мы анализируем входные данные, чтобы соз-
дать преобразование, мы включили данные в каждой группе при нашем анализе.
Чтобы понять, почему это является проблемой, давайте посмотрим более вни-
мательно на то, что происходит с помощью более простого и более специфиче-
ского сценария. Предположим, что преобразование, которое мы хотим приме-
нить, – масштабирование всех характеристик в обучающем наборе, как группы, в
диапазон [0,1]. Как и раньше, мы собираемся выполнить многовариантное мас-
штабирование характеристик к диапазону [0,1]. Давайте положим, что в самой
первой группе наименьшая и наибольшая величины характеристик равны 0.01
и 0.99. В других слоях наибольшая и наименьшая величины имеют меньший
диа- пазон. Рисунок 12.40 показывает диапазон данных, содержащихся в каждом
из пяти слоев. Мы собираемся анализировать все группы и создать на основании
этого наше преобразование.

Оценка

Обучение
и оценка
Samples

Анализ

Оценка

Обучение
и оценка

Оценка

Обучение
и оценка

Рис. 12.39  Некорректное осуществление кросс-валидации. Мы не вычисляем


преобразование до того, как проводим кросс-валидацию. Красный кружок пред-
ставляет преобразование. Оно применяется к данным посредством красного квад-
ратика, обозначенного буквой Т

Масштабирование
Анализ

Мин Макс

Рис. 12.40  Некорректным преобразованием наших данных


для кросс-валидации является преобразование всего сразу перед циклом

На рис. 12.40 наше набор данных показано слева, разделенное на 5 групп.


Внут ри каждого бокса мы показываем диапазон величин в группе, с 0 слева и 1
спра- ва. Верхняя группа имеет характеристики, изменяющиеся от 0.01 до 0.99.
Другие группы имеют величины, которые лежат внутри этого диапазона. Когда
мы ана- лизируем все группы, диапазон первой доминирует, поэтому мы лишь в
неболь- шой степени распространяем все наборы данных.
Если мы не проводим кроссвалидацию, тогда шаг на рис. 12.40 является право-
мерным, потому что осуществляются анализ и масштабирование всех наших
дан- ных. Чтобы понять проблему, которая возникает, давайте теперь применим
это преобразование для кроссвалидации.
Наши входные данные представляют собой пять преобразованных групп спра-
ва на рис. 12.40. Мы начинаем с извлечения первой группы и, откладывая его
в сторону, обучаем оставшиеся данные и затем проводим проверку. Но здесь мы
допускаем ошибку, потому что преобразование наших обучающих данных находи-
лось под влиянием данных в группе.
Это является нарушением нашего базового принципа, заключающегося в том,
что мы создаем преобразование, используя только величины в обучающих дан-
ных. Когда мы вычисляем наше преобразование, мы используем то, что теперь
стало поверочными данными. Мы говорим, что информация утекает из повероч-
ных данных при этом шаге в параметры преобразования, к которым она не при-
надлежит.
Правильный путь здесь – удалить данные групп из этих выборок, затем соз-
дать преобразователь из оставшихся данных и применить преобразование как
к обучающим данным, так и к данным групп. Рисунок 12.41 показывает это ви
зуально.

Масштаби­рование
Анализ

Мин Макс

Рис. 12.41  Корректным путем преобразования наших данных при кросс-вали-


дации является первоначальное удаление выборок групп и затем вычисление
преобразования из данных, которые остались. Теперь мы можем применить
пре- образование к обоим наборам – как обучающему, так и к данным группы.
Заметим, что здесь данные группы выходят за пределы диапазона [0,1], что не
составляет проблемы, поскольку эти данные реально более экстремальные,
чем обучающий набор

Чтобы исправить наш процесс кроссвалидации, нам необходимо сдвинуть эту


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

Обучение
Выборки и оценка

Анализ
Оценка

Обучение
и оценка

Анализ
Оценка

Обучение
и оценка

Рис. 12.42  Правильный путь преобразования наших данных для кросс-


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

Это, однако, не снимает с нас ответственности, когда мы пишем наш


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

справоЧные материалы
[CDC17] Centers for Disease Control and Prevention. Body MassIndex (BMI). 2017.
https://www.cdc.gov/healthyweight/assessing/bmi/.
[Crayola16] What were the original eight (8) colors in the 1903 box of Crayola
Crayons?. 2016. http://www.crayola.com/faq/your-history/what-were-the-original-eight-8-
colors-in- the-1903-box-of-crayola-crayons/.
[Dulchi16] Dulchi Paul. Principal Component Analysis. CS229 Machine Learning
Course Notes #10. http://ufldl.stanford.edu/wiki/index.php/PCA.
[Krizhevsky09] Krizhevsky Alex. Learning Multiple Layers of Features from Tiny Images.
University of Toronto, 2009. http://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf.
[McCormick14] McCormick Chris. Deep Learning Tutorial – PCA and Whitening.
Blog post, 2014. http://mccormickml.com/2014/06/03/deep-learning-tutorial-pca-and-
white- ning/.
Заимствованные изображения  337

[Turk91] Turk Matthew, Pentland Alex. Eigenfaces for Recognition // Journal of Cognitive
Neuroscience. Vol. 3. № 1. 1991. http://www.face-rec.org/algorithms/pca/jcn.pdf.

заимствованные изображения
Корова (рис. 12.3)
https://pixabay.com/en/cow-field-normande-800306
Зебра (рис. 12.3)
https://pixabay.com/en/zebra-chapman-steppe-zebra-1975794
Хаски (рис. 12.21, 12.23)
https://pixabay.com/en/husky-sled-dogs-adamczak-1105338
https://pixabay.com/en/husky-dog-outdoor-siberian-breed-1328899
https://pixabay.com/en/dog-husky-sled-dog-animal-2016708
https://pixabay.com/en/dog-husky-friend-2332240
https://pixabay.com/en/green-grass-playground-nature-2562252
https://pixabay.com/en/husky-dog-siberian-husky-sled-dog-2671006
Глава 13
Классификаторы

Обзор ряда популярных


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

13.1. поЧему зДесь эта глава


Классификация изображений, звуков и других данных – основное предназначе-
ние машинного обучения. В главе 7 мы рассматривали основные положения
клас- сификации. Но классификация – это нечто большее, чем просто создание и
обуче- ние базовых алгоритмов.
Как мы видели, внимательное отношение к нашим данным является
ключевым шагом к построению и обучению хороших систем машинного
обучения. Рассмот рение существа и структуры данных всегда стоит
потраченного времени и позво- ляет создать систему, которая выполняет
необходимые нам действия.
Например, предположим, что нам дали данные воздушной съемки различных
фермерских хозяйств и просили провести классификацию по полям произрас-
тающих на них зерновых.
Как много полей способен различить наш классификатор? 5? 25? До тех пор,
пока мы не посмотрим на данные, у нас нет возможности ответить на этот во-
прос. Используя мало классов, мы уменьшаем ценность наших ответов, но при-
менением многих классов мы увеличим время получения результата и,
возможно, определим бесполезные различия (скажем, между созревшими и
несозревшими зерновыми на одном поле).
Прежде чем начать разработку, нам необходимо посмотреть на данные и по-
нять, как много классов мы хотим обнаружить и различить.
Хорошим способом исследования данных является применение одного из
мно- гих существующих инструментов со специфическими алгоритмами
классифика- ции. В некоторых случаях эти инструменты могут быть вполне
достаточными, чтобы найти решение нашей проблемы классификации. В других
случаях мы мо- жем использовать их для проведения быстрого эксперимента и
затем применять результаты для построения классификатора глубокого
обучения, с тем чтобы соз- дать более подходящий инструмент решения нашей
проблемы.
Поскольку такие инструменты являются очень полезным первым шагом,
чтобы справиться с новыми данными, мы рассмотрим здесь некоторые
наиболее попу-
Типы классификаторов  339

лярные из них. Эти инструменты обычно не считаются алгоритмами глубокого


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

13.2. типы классификаторов


Прежде чем мы продолжим, мы разобьем весь мир классификаторов на две ос-
новные категории.
В первой классификатор пытается охарактеризовать данные путем подбо-
ра множества параметров к ним, настолько много, чтобы мы могли подогнать
к этим данным прямую линию, установив эти параметры для линии.
Естественно такой метод назвать параметрическим.
Параметрический подход начинает с некоторого рода описания механизма
классификации. Другими словами, он начинается с предположения о форме
гра- ницы, которую он собирается искать. Это может быть предположение
границы в виде прямой линии, или 10мерной гибкой плоскости, или сферы с
какимто вы- ступом. Он будет искать наилучшие значения параметров,
описывающих форму, наилучшим образом согласующуюся с входными
данными.
Можно сказать, что параметры классификатора начинают с гипотезы, что дан-
ные могут быть классифицированы, используя структуру специфического типа,
и работа по обучению заключается в том, чтобы найти параметры для этой
струк- туры. На языке главы 4 можно сказать, что этой гипотезой является
байесовский приор.
Другой тип классификаторов называется непараметрический, который
более сложно представить, но тоже можно описать. Непараметрический
классификатор начинает не с гипотез. Вместо этого он просто собирает данные и
по ходу дела создает алгоритм. Алгоритм, конечно, имеет известную форму, но
его структура и то, какие переменные он использует, зависит от обучающих
данных.
Непараметрический классификатор обычно собирает все данные, сохраняет
их все или большинство из них в том виде, в каком они поступают, и старается
найти такую организацию для них, которая будет улучшать классификацию
вновь по- ступающих данных.
Используя наши идеи из главы 11, мы можем сказать, что параметрический
подход является дедуктивным, поскольку он начинается с гипотезы и ищет дан-
ные, которые удовлетворяют ей. В этом смысле непараметрический подход яв-
ляется индуктивным, поскольку он начинает со сбора данных и затем пытается
сделать вывод из шаблонов, которые он может найти.
340  Классификаторы

Скорость и необходимый объем памяти у этих двух методов дополняют друг


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

13.3. метоД k-ближайших сосеДей (knn)


Мы начнем с непараметрического алгоритма kближайших соседей (kNearest
Neighbors, kNN). Начальная буква k здесь относится не к какомунибудь слову, это
просто число. Мы можем придать ей любое значение от 1 и больше.
Поскольку это число устанавливается до того, как алгоритм начинает работу,
оно обычно рассматривается как гиперпараметр.
В главе 7 мы рассматривали алгоритм, называемый kсрединной кластеризаци-
ей. Несмотря на похожесть наименований, этот алгоритм и алгоритм k-
ближайших соседей – совершенно различные алгоритмы. Основное отличие
заключается в том, что кластеризации обучают с немаркированными данными, в
то время как kNN ра- ботает с маркированными данными. Другими словами, они
попадают в разные ка- тегории обучения с учителем и без учителя соответственно.
kNN – быстрое обучение, потому что все, что он делает, – это сохраняет копии
поступающих выборок в базе данных. Интересующая нас часть наступает, когда
обучение завершается и новые данные поступают для классификации.
Центральная идея того, как kNN классифицирует новые выборки, носит
геомет рический характер и демонстрируется на рис. 13.1.
(a) (b) (c) (d)

Рис. 13.1  Чтобы найти класс новой выборки, мы находим его наиболее попу-
лярных соседей: (а) новая выборка (звездочка), окружена выборками 3 классов;
(b) когда k = 1, первым ближайшим соседом является кружочек, поэтому катего-
рией для выборки звездочка является этот кружочек; (с) когда k = 9, мы находим
три выборки в виде кружочка, 4 в виде квадратика и 2 в виде треугольника, так
что звездочке присваивается категория квадратиков; (d) когда k = 25, мы находим
6 выборок в виде кружочков, 13 квадратиков и 6 треугольников, поэтому звездочке
опять присваивается категория квадратиков

На рис. 13.1 (а) мы имеем точку выборки (звездочка) посреди группы других
выборок, которые представляют три категории выборок (кружочки, квадратики
и треугольники). Чтобы определить категорию для нашей новой выборки, мы
смотрим на ближайшие выборки (соседей) и разрешаем им голосовать. Та
катего- рия, которая находится ближе всего, наиболее популярная, становится
новой вы- борочной категорией. Мы показываем, какие выборки
рассматриваются для раз- личных значений k, обводя их кружком. На рис.13.1 (b)
мы устанавливаем k = 1, что означает, что мы хотим использовать класс
ближайшей выборки. В этом случае это кружочек, следовательно, эта выборка
будет классифицирована как кружочек. На рис. 13.1 (с) мы устанавливаем k = 9.
Здесь мы находим 3 кружочка, 4 квадрати- ка и 2 треугольника. Поскольку
квадратиков больше, чем других классов, черная звездочка классифицируется
как квадратик. На рис. 13.1 (d) мы установили k = 25. Теперь мы имеем 6
кружочков, 13 квадратиков и 6 треугольников, и снова звез- дочка
классифицируется как квадратик.
Суммируя сказанное, kNN принимает для оценки новую выборку и величину
k. Она затем находит более близкие k выборок к этой новой выборке и разрешает
им
«голосовать» относительно приемлемой категории. Та категория, которая име-
ет большинство голосов, становится категорией для новой выборки. Существуют
различные способы прерывания связей и управления исключениями, но это ба-
зовая идея. Заметим, что kближайший сосед не создает очевидных границ между
группами точек. Здесь отсутствуют области или регионы, которым принадлежат
выборки.
Можно сказать, что kNNалгоритм по требованию, или ленивый алгоритм,
потому что он не обрабатывает выборки во время обучающей стадии. Обучаясь,
kNN прячет выборки в своей памяти, и это все, что он делает.
kближайший сосед привлекателен тем, что он прост и обычно обучается очень
быстро.
С другой стороны, kNN требует много памяти, потому что (в своей базовой
фор- ме) он сохраняет все входные выборки. Использование большого объема
памяти
может в некотором смысле само по себе замедлить работу алгоритма. Классифи-
кация новых точек часто медленная (по сравнению с другими алгоритмами,
кото- рые мы будем рассматривать) за счет поиска соседей. Каждый раз, когда
мы хотим осуществить классификацию новой порции данных, мы должны
найти k ближай- ших соседей, а это требует работы. Конечно, существуют
способы ускорить работу, и все же этот метод остается медленным методом. Для
приложений, в которых важна скорость, таких как системы реального времени
или вебстраницы, время, необходимое kNN для ответа, становится
неприемлемым.
Другая проблема этого метода состоит в том, что он зависит от большого
числа соседей в ближайшем окружении (в конце концов, если соседи на
большом уда- лении, то они не предлагают хорошего заместителя для другого
экземпляра, по- хожего на того, которого мы хотим классифицировать). Это
означает, что нам не- обходим большой объем данных. Если у нас много
характеристик (то есть наши данные имеют большую размерность), то мы
сталкиваемся с проклятием большой размерности, которую мы рассматривали в
главе 7. Если размерность простран- ства возрастает и если мы при этом
одновременно и значительно не увеличиваем число обучающих выборок, то
число выборок в любом ближайшем окружении па- дает, создавая трудности
для kNN в получении хороших ближайших точек.
Давайте запустим kNN для тестирования. На рис. 13.2 показана «улыбка» мно-
жества данных 2D, которые поделены на две категории.

Рис. 13.2  «Улыбка» набора данных из 2D-точек.


Здесь две категории: синяя и оранжевая

Использование kNN с различными значениями k дает результат, показанный


на рис. 13.3.
При маленьком числе соседей границы классификации довольно грубые.
Когда мы увеличиваем число соседей, они сглаживаются, потому что мы
получаем луч- шую картину окружения вокруг новой выборки.
Чтобы сделать пример интереснее, давайте добавим немного шума в наши
дан- ные, так чтобы края было трудно обнаружить. Рисунок 13.4 показывает
зашум- ленную версию рис. 13.2.
k=1
k=2 k=3

k=4 k=5 k=6

k = 10 k = 20 k = 50

Рис. 13.3  В прямоугольниках показана классификация всех точек с использова-


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

Рис. 13.4  Зашумленная версия набора данных улыбки. Мы используем те же


числа точек, как на рис. 13.2, но добавили 2D-шум дрожания положения выборок,
после того как они были определены как синие и оранжевые категории
Результаты для различных значений k показаны на рис. 13.5.
k=1 k=2 k=3

k=4 k=5 k=6

k = 10 k = 20 k = 50

Рис. 13.5  Использование kNN для определения категорий точек на плоскости.


Заметим, как значительно алгоритм менее чувствителен для малых значений k. Ког-
да число соседей увеличивается, края значительно более сглажены

Мы можем видеть, что в присутствии шума маленькие значения k ведут к


умень- шению чувствительности алгоритма. В этом примере, чтобы сгладить
границы, мы должны были выбрать k равным 50.
Достоинством kNN является то, что он не представляет в явном виде границы
между классами. Это означает, что он может провести любые границы или рас-
пределения точек. Чтобы увидеть это, давайте добавим глаза к нашей улыбке,
соз- давая три несвязанных набора одного класса. Результирующие данные с
шумом показаны на рис. 13.6.
Рис. 13.6  Добавлены два глаза к нашей улыбке,
а затем добавлен шум дрожания положений выборок

Результирующая решетка для различных значений k показана на рис. 13.7.


k=1 k=2 k=3

k=4 k=5 k=6

k = 10 k = 20 k = 50

Рис. 13.7  kNN не создает границ между кластерами выборок, потому что он
работает, даже когда класс разбит на части. Как ожидалось, алгоритм менее чув-
ствителен при маленьких значениях k. Но заметим, что когда k = 50, глаза исчезают.
Это происходит потому, что вблизи глаз, когда мы тестируем большое количество
соседей, синие точки доминируют над оранжевыми. Если мы дальше увеличиваем
k, глаза могут исчезнуть совсем
В этом примере значение k примерно 20 выглядит наилучшим. Когда k воз-
растает до 50, маленькое число выборок, представляющих глаза, начинает терять
голоса с каждым голосованием, и глаза разрушаются.
Таким образом, маленькое значение k дает нам нечеткие края и маленькую
чувствительность, но большие значения k могут начать разрушать маленькие ха-
рактеристики. Как это часто бывает, нахождение наилучших параметров для
это- го алгоритма при любом имеющемся множестве данных требует
повторяющихся экспериментов. Мы можем использовать кроссвалидацию,
чтобы автоматически определять качество каждого результата, что особенно
полезно, когда присут- ствует большая размерность.

13.4. метоД опорных векторов (sVM)


Наш следующий классификатор использует совершенно другой метод. Как не-
которые классификаторы, которые мы рассматривали ранее, он пытается найти
явные границы между различными множествами выборок. Как и ранее, мы
будем использовать данные размерностью 2D и только 2 категории, но эта
техника мо- жет быть легко применена при значительно большем количестве
характеристик и категорий. Наше обсуждение будет основано на презентации
[VanderPlas16].
Давайте начнем с двух пятен точек, по одному для каждого класса, показанных
на рис. 13.8.

Рис. 13.8. Наше начальный набор данных


в виде двух пятен выборок размерностью 2D

Мы хотели бы найти границу между двумя этими кластерами. Чтобы было


про- ще, мы будем использовать прямую линию. Эти группы можно разделить
боль- шим количеством линий. Три кандидата показаны на рис. 13.9.
Какую из этих линий следует выбрать? Один из вариантов – представить себе,
что произойдет, когда появятся новые данные. Учитывая, как далеко эти класте-
ры отстоят друг от друга, вероятно, что новые точки будут ложиться достаточно
близко к этим пятнам. Но эти новые точки могут расположиться на краях или
не- сколько ближе к одному из этих кластеров.
Это ведет к предпочтению линии, которая отстоит как можно дальше от обо-
их кластеров. Тогда любые новые точки имеют наибольший шанс расположиться
в соответствующем кластере.
Метод опорных векторов (SVM)  347

Рис. 13.9  Три из бесконечного числа линий,


которыми можно разделить наши два кластера выборок. Какая из них наилучшая?

Чтобы увидеть, как далеко каждая линия отстоит от кластеров, мы можем


найти ближайшую выборку к каждой линии и затем провести симметричную
границу этого размера вокруг каждой линии. Рисунок 13.10 показывает эту
идею.

Рис. 13.10  Мы можем оценить качество каждой линии, найдя расстояние от


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

Линия в середине рис. 13.10 лучшая из трех. Она определенно лучше, чем та,
ко- торая находится справа, потому что точка, которая немного выше и левее
красно- го кластера внизу справа и выше этой линии, будет классифицирована
как синяя, даже хотя она ближе к красной группе, чем к синей.
Алгоритм, названный методом (алгоритмом) опорных векторов (Support
Vector Machine, SVM), использует эту идею [Steinwart08]. SVM находит линию,
которая наиболее удалена от точек обоих кластеров (слово machine, машина, яв-
ляется здесь удобным синонимом слова алгоритм (algorithm)). Наилучшая линия
показана на рис. 13.11.
На рис. 13.11 отмечены выборки, названные опорными векторами (под словом
«вектор» здесь подразумевается «выборка»).
Первой задачей алгоритма является нахождение положения выборок, заклю-
ченных в кружочек.
После их нахождения алгоритм затем находит сплошную линию ближе к
сере- дине рисунка. Эта линия наиболее удалена от всех выборок в каждом
множестве.
C=1e+10

Рис. 13.11  SVM-алгоритм находит линию, которая расположена на наибольшем


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

Расстояние от сплошной линии до пунктирных линий, которые проходят


через опорные векторы, называется зазор (margin). Так что, перефразируя,
можно ска- зать, что SVM находит линию с наибольшим запасом.
А что, если данные зашумлены, как на рис. 13.12? В таком случае мы не можем
создать линию, окруженную пустой зоной. Как провести наилучшую линию
среди этих перекрывающихся наборов выборок?

Рис. 13.12  Новый набор данных, где пятна перекрываются.


Как провести наилучшую прямую линию в этом случае?

Алгоритм SVM дает нам контроль над параметром, который условились обо-
значать просто буквой С. Он контролирует то, как строго алгоритм ведет себя по
отношению попадания точек внутрь области между границами. Величину С
мож- но представить как «уровень очистки». Чем больше эта величина, тем
больше тре- бования алгоритма по чистоте зоны вокруг линии. Чем меньше
уровень очистки, тем больше точек может оказаться в зоне вокруг линии.
Алгоритм чувствителен к величине С и данным, которые мы используем. По-
этому нам часто необходимо искать лучшее значение с помощью метода проб
и ошибок и проводить их оценку с помощью кроссвалидации.
Рисунок 13.13 показывает наши перекрывающиеся данные с величиной С, рав-
ной 100,000 (или 1е+05 в научной нотации).
C = 1e+05

Рис. 13.13  Величина С говорит алгоритму SVM, на-


сколько чувствительным ему надо быть к тем точкам,
которые «захватывают» зону вокруг линии, соответ-
ствующей нашим данным. Чем меньше величина С,
тем большему количеству точек это разрешается

Давайте уменьшим величину С до 0.01. На рис. 13.14 показано, что это позволя-
ет намного большему количеству точек попасть в зону вокруг линии.
C = 0.01

Рис. 13.14  Уменьшение величины С до 0.01 позво-


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

Линии на рис. 13.14 и 13.13 различны. Какую предпочесть, зависит от того,


что мы хотим от классификатора. Если мы полагаем, что лучший зазор будет
получен из деталей вблизи зоны, где точки перекрываются, нам нужно большое
значение С, чтобы мы обращали внимание только на точки вблизи этого зазора.
Если мы полагаем, что общие формы двух групп точек – лучший дескриптор
этой границы, мы бы хотели меньшее значение C, чтобы включить больше этих
отдаленных точек.
Алгоритм SVM имеет одну хитрость. Предположим, что мы имеем данные,
по- казанные на рис. 13.15, где пятно выборок одной категории окружено
кольцом выборок другой категории. Здесь отсутствует возможность провести
линию, раз- деляющую эти два набора.

Рис. 13.15  Множество выборок, представляющее


трудность для базового SVM, поскольку здесь нельзя
провести прямую линию, разделяющую выборки

Здесь на выручку приходит неплохая идея. Что, если добавить третье измере-
ние каждой точке, подняв ее на величину, равную расстоянию от центра колец?
Рисунок 13.6 демонстрирует эту идею.

Рис. 13.16  Если мы поднимем каждую точку на рис. 13.15 вверх на величи-
ну, равную расстоянию ее от центра розового пятна, мы получим два отдельных
облака точек. Теперь легко проложить плоскость между ними. Так же, как
линия, плоскость – линейный элемент в пространстве, поэтому она может быть
найдена SVM. Эти два изображения – два вида одних и тех же данных –
показывают точки и плоскость между ними

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

Теперь все точки над плоскостью могут быть помещены в один класс и все
ниж- ние точки – в другой.
Если мы пометим опорные векторы, которые мы нашли из рис. 13.17 в нашей
оригинальной картинке размерностью 2D, то получим рис. 13.18.

Рис. 13.18  Взгляд сверху вниз на рис. 13.17

Если мы включим зазор, созданный плоскостью, то получим рис. 13.19.


Мы нашли для нашего случая хороший путь модификации данных, главным
образом глядя на них, и затем провели эту 3Dмодификацию данных, позволив-
шую разделить их на части. Но мы не можем осуществлять этот процесс каждый
раз вручную. Когда данные имеют большую размерность, мы не можем обеспе-
чить ни достаточную наглядность, ни приемлемую догадку о хорошем преоб-
разовании.
Привлекательность метода, который мы описали здесь, заключается в том, что
мы можем автоматизировать его подходящим путем. SVMалгоритм может эф-
фективно попробовать много различных преобразований и найти разделитель-
ную линию или поверхность для каждого из них, выбрав в итоге ту, которая
будет работать наилучшим образом.
Существующая возможность математического описания этого процесса
делает практически выполнимым такой поиск, значительно ускоряя его.
Рис. 13.19  Пересечение изогнутой формы, постро-
енной нами из наших данных и плоскости, которую
мы поместили в 3D, показано сплошной линией.
Здесь также показаны опорные векторы и зазоры,
которые они создают

Эта техника привлекает модификацию подключением некоторой математи-


ки, называемой ядром, которая формирует сердцевину алгоритма. Математики
иногда отдают должное особенно удачным и замысловатым идеям одобритель-
ным термином «трюк» (как относительно упомянутого в главе 10 «трюка сме-
щения»). В подобном случае включение в SVM этой математики эффективного
выполнения такой процедуры получило название «ядерный трюк» [Bishop06].
Ядерный трюк позволяет алгоритму найти расстояния между преобразуемыми
точками без фактического преобразования их! Этот хитроумный трюк – главный
способ повышения эффективности.
Ядерный трюк используется автоматически в программах многих библиотек,
так что его не надо специально вызывать [Rashka15].

13.5. Деревья решений


Давайте рассмотрим другой непараметрический метод классификации. Как
и kNN, здесь сохраняются обучающие выборки, когда они поступают, но
структура строится вокруг них. Когда наступает время оценки новых выборок,
мы использу- ем эту структуру для получения быстрого ответа.
Мы можем проиллюстрировать данную идею с помощью знакомой
домашней игры, называемой 20 вопросов. В этой игре один из игроков
(выборщик) задумы- вает конкретный целевой объект, который часто человек,
место или вещь. Другой игрок (отгадывающий) задает серию «данет» вопросов.
Структура игры показана на рис. 13.20.
Мы называем структуру, подобную изображенной на рис. 13.20, деревом, по-
тому что оно похоже на перевернутое дерево. Такие деревья имеют несколько ас-
социированных терминов, которые стоит знать.
Мы говорим, что точка разделения в дереве является узлом, а каждая линия,
соединяющая узлы, является связью, или ветвью. Следуя аналогии с деревом,
вершина – это корень, а узлы внизу – листья, или висячие узлы. Узлы между
корнем и листьями называются внутренними узлами, или узлами решения.
Деревья решений  353

Это человек?
Да
Нет

Это человек жив? Это место?


Да Нет Да Нет

Это человек мужчина? Это человек ваш предок? Это на земле? Это сделано из дерева?

Рис. 13.20  Дерево игры «20 вопросов».


Отметим, что после каждого вопроса ответ строго один из двух:
или «да», или «нет»

Если дерево имеет безукоризненную симметричную форму, то говорят о сба-


лансированном, а в противном случае – о несбалансированном дереве. На
практике почти все деревья при разработке несбалансированные, но мы можем
создать алгоритм, который сделает их ближе к сбалансированным, если
примене- ние требует этого.
Мы говорим, что каждый узел имеет глубину, которой является число,
соответ- ствующее наименьшему количеству узлов, которое надо пройти до
корня. Корень имеет глубину 0, узлы непосредственно под ним имеют глубину 1
и т. д.
Рисунок 13.21 показывает дерево с этой маркировкой.

Корень

Узел
Ребро
Глубина дерева

Лист

Рис. 13.21  Некоторая терминология для дерева. Каждый кружок – это узел.
Узел на вершине имеет специальное название – корень. Линии, соединяющие
узлы, на- зываются ребрами, глубина дерева есть число узлов от его корня к
самому удален- ному узлу-потомку. Здесь глубина равна 4

Обычно эта терминология ассоциируется с семейным деревом, хотя абстракт-


ные деревья не требуют соединения двух узлов для создания ребенка.
Каждый узел (за исключением корня) имеет узел выше него. Мы его называем
родителем этого узла. Узлы непосредственно ниже родительского узла являют-
ся его дочерними узлами. Иногда разделяют на непосредственные дочерние
узлы, которые напрямую соединены с родителем, и непрямые дочерние узлы,
которые соединены через последовательность других узлов.
Если мы фокусируем внимание на какомто конкретном узле, то этот узел
и все его дети, взятые вместе, называются ветвью, или поддеревом. Узлы,
которые де- лят непосредственного родителя, называются братьями
(сестрами).
Разумеется, терминология семейного дерева не распространяется дальше это-
го, поэтому редко можно встретить название узла, подобное
«прапраплемянник».
Рисунок 13.22 показывает некоторые из перечисленных идей графически.

Родитель

Дети

Поддерево

Рис. 13.22  Некоторые термины, применяемые к деревьям. Узел является ро-


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

Интересным качеством дерева игры 20 вопросов является то, что ответы двоич-
ные: каждый родительский узел имеет только двух детей. Это особенно простой
род дерева для компьютерного построения и использования. Если некоторые
узлы имеют более двух дочерних узлов, мы говорим, что дерево кустовидное.
Мы всегда можем при желании конвертировать густое дерево в бинарное дерево.
Пример кустовидного дерева, которое пытается догадаться о месяце дня рожде-
ния, приведен на рис. 13.23 (а), и соответствующее бинарное дерево показано на
рис.13.23 (b). Поскольку легко менять одно на другое, мы обычно рисуем дерево
в том виде, в каком оно является наиболее кратким и ясным для конкретного об-
суждения.
Конечно, мы представили все эти возможные деревья и термины, для того
чтобы использовать их. Техника деревьев решений применяет общую идею для
классификации данных. Полное название метода – деревья решений катего-
риальных переменных. Это позволит нам отделить их от тех случаев, когда мы
используем деревья решений для работы с непрерывными переменными, как
в регрессионных проблемах. В этом случае они называются деревья решений
непрерывных переменных.
Здесь мы будем иметь дело с категориальными переменными. В качестве при-
мера такое дерево показано на рис. 13.24.
в январе?

да нет
в в в в
январе? феврале? марте? другом? в
феврале
да да да да ?
да нет

в марте?

да нет

(а) (b)

Рис. 13.23  Можно представить себе дерево, у которого после узла имеется мно-
го дочерних узлов, каждый из которых проводит свой тест. Мы всегда можем пре-
образовать такого рода кустовидное дерево в бинарное дерево, имеющее только
вопросы «да-нет» в каждом узле

Рис. 13.24  Категориальное дерево решений. Из многих выборок вверху, каждая


своей категории, мы проводим тест в каждом узле, пока не создадим листья только
с одной категорией для каждой выборки
Общей идеей является построение дерева во время обучения. Давайте посмот
рим на идеализированную версию построения дерева и оценки процесса.
Корень и все родительские узлы содержат тесты, основанные на характерис
тиках выборок. Листья узлов содержат сами обучающие выборки. Когда появ-
ляется новая выборка, мы начинаем с вершины и спускаемся вниз, следуя вет-
вям, базирующимся на тестовой оценке характеристик этой выборки, как на
рис. 13.23.
Когда мы достигаем листа узла, проводим тест, чтобы посмотреть, имеется ли
в новой обучающей выборке та же категория, как у всех остальных выборок в
этом листе. Если так, то мы добавляем выборку к листу и заканчиваем на этом. В
про- тивном случае мы с помощью некоторого теста, основанного на
характеристиках и позволяющего отделить эту выборку в узле от предыдущих
выборок, разделяем этот тестузел. Этот тест сохраняется узлом, и мы создаем
двух детей, перемещая каждую выборку соответствующего ребенка, как на рис.
13.25.

Больше круглых, чем квадратных?

Да Нет

Рис. 13.25  Разбиение узла. Слева мы видим узел с круглыми и квадратными


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

Когда мы осуществили обучение, оценка новых данных становится более прос


той. Мы просто начинаем от корня и идем вниз по дереву, следуя по ветвям,
осно- ванным на результатах применения характеристик выборок,
протестированных в каждом узле. Когда мы остаемся в какомто листе, то
рапортуем, что эта выборка принадлежит к категории объектов в этом листе.
Это – идеальный процесс. На практике наши тесты могут быть неидеальными,
и наши листья могут содержать смесь объектов с разными категориями, потому
что для эффективности или из соображений недостатка памяти мы можем ре-
шить узлы больше не разбивать. Например, если мы остановились в узле, содер-
жащем 80 % выборок категории А и 20 % выборок категории В, мы можем
рапор- товать, что новая выборка имеет 80 % шансов быть А и 20 % шансов быть
В. Если мы должны рапортовать только об одной категории, то мы можем
рапортовать
о 80 % выборок на этот раз и о 20 % в другой. Мы называем это поглощающим,
или жадным, алгоритмом. Глобальная стратегия, помогающая найти наименее
или наиболее эффективное дерево, отсутствует. Вместо этого мы разбиваем узлы
по ходу дела, просто используя информацию, которую мы имеем на руках в дан-
ный момент.

13.5.1. Построение деревьев


Давайте посмотрим на процесс построения деревьев на паре примеров.
Данные на рис. 13.26 показывают четко разделенные наборы данных, пред-
ставляющих два класса.

Рис. 13.26  Наши 600 начальных точек данных для построения дерева решений.
Эти 2D-точки представляют 2 класса: синий и оранжевый

Каждый шаг при построении дерева вовлекает разделение листа и, таким об-
разом, перемещение его с узла на два листа, что ведет к увеличению дерева на
один внутренний узел и один лист. Поэтому нам часто приходится задумываться
об увеличении размера дерева по количеству числа листьев. Процесс построения
дерева показан на рис. 13.27 для растущего числа листьев.
В этом случае наши ячейки являются прямоугольными (как обычно), и наши
разбиения представляют собой вертикальные или горизонтальные линии, кото-
рые делят прямоугольник на две части. Заметьте, как области постепенно
уточня- ются, все более соответствуя данным. Дереву требуется только 10 листьев.
Конеч- ное дерево и оригинальные данные показаны вместе на рис. 13.28. Дерево
очень хорошо соответствует данным.
Поскольку решающие деревья очень чувствительны к каждой входной
выборке, они имеют сильную тенденцию к избыточному обучению. Фактически
решающие деревья почти всегда переобучаются, поскольку обучающие выборки
влияют на форму дерева. Чтобы посмотреть на это, на рис. 13.29 мы применили
тот же алго- ритм, что и на рис. 13.28, дважды, используя в каждом случае
разные, случайным образом выбранные 70 % входных данных.
2 листа
3 листа 5 листьев

6 листьев 7 листьев 12 листьев

Рис. 13.27  Построение дерева решений для наших данных на рис. 13.26. За-
метьте, как дерево, начинаясь с большой порции данных, движется все к
меньшей и меньшей и более точной области

12 листьев

Рис. 13.28  Наше конечное дерево с 10 листьями. Отметим два


очень тонких прямоугольника. Они охватывают центры трех синих
выборок вверху левой стороны арки, проскальзывая между оран-
жевыми точками. Таким образом, все точки классифицированы
пра- вильно
Рис. 13.29  Решающие деревья очень чувствительны к своим входам. Слева: мы
случайным образом выбрали 70 % оригинальных выборок и создали дерево. Спра-
ва: тот же процесс, но для других, случайно выбранных 70 % оригинальных выборок

Эти два дерева похожи, но определенно не идентичны. Данная проблема зна-


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

Рис. 13.30  Зашумленный набор из 600 выборок


для построения дерева решения

Соответствующее дерево для таких данных начинается с больших областей,


но быстро превращается в сложное множество маленьких боксов, когда, в связи
с наличием шума в данных, алгоритм разбивает узлы подобным образом. Рису-
нок 13.31 показывает результат. В этом случае требуется 100 листьев, чтобы дере-
во корректно классифицировало точки.
2 листа
3 листа 4 листа

10 листьев 20 листьев 100 листьев

Рис. 13.31  Процесс построения дерева решения.


Заметим, что второй ряд использует большое число листьев

На рис. 13.32 показано итоговое дерево решения и оригинальные данные круп-


ным планом.
100 листьев

Рис. 13.32  Наши зашумленные данные в соответствии с деревом


со ста листьями. Заметим, как много маленьких боксов использова-
лось, чтобы «поймать» отдельные выборки, разбросанные здесь и
там

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


в правой нижней части будут оранжевыми, а многие в правой верхней части –
си- ними, это дерево оправдало большинство ожиданий, основанных на таком
наборе данных. Будущие выборки, которые попадут в эти маленькие боксы,
скорее всего, будут классифицированы неправильно.
Давайте повторим наш процесс построения дерева, используя случайным об-
разом выбранные 70 % данных. На рис. 13.33 показаны результаты.
Похожесть присутствует, но эти деревья существенно различные, и здесь
много маленьких бит, которые существуют только для классификации
небольшого коли- чества выборок. Это избыточное обучение в действии.

Рис. 13.33  Два дерева, построенных с различными множествами


из 70 % оригинальных выборок

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

13.5.2. Разделение узлов


Прежде чем мы покинем деревья решений, давайте вернемся к процессу
разделе- ния узлов, поскольку многие библиотеки предлагают нам выбирать
разделяющий алгоритм.
При разделении узлов существует два вопроса. Первый: надо проводить раз-
деление? Второй: как следует проводить разделение? Давайте рассмотрим их по
порядку.
Когда мы спрашиваем, нуждается ли узел в разделении, мы обычно
рассматри- ваем его чистоту. Это число, которое говорит нам о единообразии
выборок в узле. Если все выборки одной категории, то узел полностью чист. Чем
больше выборок имеет другую категорию, тем меньше становится это число.
Чтобы установить необходимость разделения, мы можем проверить чистоту
сравнением с порогом. Если узел слишком грязный, то это значит, что чистота
ниже порога и мы прово- дим разделение.
Теперь давайте посмотрим, как разделять узел.
Если наши выборки имеют много характеристик, мы можем придумать мас-
су различных способов разделительного теста. Мы можем тестировать величину
только одной характеристики и игнорировать остальные. Мы можем
рассмотреть группу характеристик и тестировать их по некоторой совокупной
величине. Мы свободны в выборе совершенно различных тестов, основанных на
различных ха- рактеристиках для каждого узла. Это создает для нас огромное
разнообразие воз- можных тестов.
На рис. 13.34 показан узел, содержащий смесь объектов различных категорий.
Мы хотели бы получить все красные объекты в одном ребенке, а все синие в дру-
гом. Вместо тестирования по цвету мы попытаемся использовать другой тест, ос-
нованный на радиусе каждого кружка. Рисунок показывает результат разделения
по радиусу с использованием трех разных значений.
В этом примере величина радиуса 70 приносит самые чистые результаты со
всеми голубыми объектами в одном ребенке и всеми красными в другом. Таким
образом, 70 – наилучшая величина для применения, если мы выбираем разделе-
ние по величине радиуса. Если мы используем этот тест для данного узла, мы за-
помним как характеристику для разделения (по радиусу), так и величину
радиуса для тестирования (70).
Радиус меньше, чем 100? Радиус меньше, чем 70? Радиус меньше, чем 50?

Да Нет Да Нет Да Нет

(a) (b) (c)

Рис. 13.34  Мы хотели бы разделить узел, находящийся вверху, собирая все


красные объекты в одном ребенке и все синие объекты в другом. Здесь мы
исполь- зуем радиус в качестве характеристики для разделения: (а) при
использовании радиуса 100 все кружочки проходят тест, за исключением
одного большого; (b) при использовании радиуса 70 все красные кружочки
собираются в одном ребенке, а синие – в другом; (с) использование радиуса 50
оставляет несколько синих в од- ном ребенке, а все красные и несколько синих
– в другом. Величина 70 дает наи- более чистый результат

Поскольку мы можем потенциально разделять узел, используя любую харак-


теристику выборок, нам необходимо иметь способ оценки этих тестов, так чтобы
мы могли выбрать тот, который дает лучшие результаты, что здесь означает –
наи- более чистых детей. Давайте посмотрим на два популярных способа
тестировать качество разделения. Каждый из методов привлекает измерение
некоторых ха- рактеристик ячеек детей, чей результат от разделения мы
рассматриваем.
Измерение информационного выигрыша, который сокращенно именуют
IG (Information Gain), вычисляет энтропию родительских ячеек. Вспомним из
гла- вы 6, что энтропия – это мера сложности, или как много бит занимает
передача некоторого объема информации. Когда ячейка чистая, она имеет очень
малень- кую энтропию. Когда ячейка содержит больше выборок разного класса,
чистота уменьшается, а энтропия возрастает.
Значит, если дети узла чище, чем родитель, то они имеют меньшую общую
эн- тропию. После попыток применить разные способы разделения узла мы
выби- раем то разделение, которое дает нам наибольшее уменьшение энтропии
(или увеличение информационного выигрыша).
Другой популярный способ оценки теста разделения называется коэффици-
ент Джини (Gini Impurity). Математика, используемая этой техникой,
разработа-
Наивный Байес  363

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


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

13.5.3. Контроль избыточного обучения


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

13.6. наивный байес


Давайте посмотрим на параметрический классификатор, который часто исполь-
зуется, когда требуется быстрый результат, даже если он не самый точный.
Этот классификатор работает очень быстро, потому что он начинается с пред-
положения о данных. Классификатор основан на принципах правила Байеса,
кото- рые рассматривались в главе 4. Вспомним, что правило Байеса начинается с
прио- ра, или предопределенной идеи о том, каким вероятно будет результат.
Обычно, когда мы используем правило Байеса, мы обновляем приор с помощью
оценки новых свидетельств, создавая постериор, который становится новым
приором.
Но что, если мы создадим приор заранее, а затем будем делать все, чтобы за-
ставить его работать?
Наивный байесовский классификатор осуществляет эту идею. Он назван
«наивным», потому что предположение, сделанное в нашем приоре, не основано
на содержании наших данных. То есть мы даем неинформативную, или «наив
ную», характеристику нашим данным. Мы просто предполагаем, что данные
име- ют определенную структуру.
Если мы правы, прекрасно, мы получаем хорошие результаты. Чем меньше
данные согласуются с предположением, тем хуже будут результаты. Наивный
Бай- ес популярен потому, что предположения часто оказываются корректными,
и это стоит проверить.
Интересным является то, что мы никогда не проверяем, справедливы или нет
наши предположения. Мы просто с уверенностью движемся дальше.
В одной из наиболее распространенных форм наивного Байеса мы
предполага- ем, что все характеристики наших выборок следуют распределению
вероятностей Гаусса. Вспомним из главы 2, что это знаменитая выпуклая кривая:
гладкая, сим- метричной формы с максимумом в центре. Это наш приор. Когда
мы посмотрим на конкретные характеристики всех наших выборок, то убедимся,
что они будут похожи на кривую распределения Гаусса.
Если наши характеристики действительно следуют распределению Гаусса, то
это предположение будет хорошим соответствием. Удивительным в наивном
Байесе является то, что это предположение, кажется, хорошо работает гораздо
чаще, чем можно было бы ожидать.
Посмотрим на это в действии.
Мы начнем с простого, с данных, которые действительно удовлетворяют прио
ру. На рис. 13.35 показано множество данных, созданное на основании двух рас-
пределений Гаусса.

Рис. 13.35  Множество 2D-данных для обучения с наивным Байесом.


Здесь два класса: красный и синий

Когда мы даем эти данные байесовскому классификатору, он предполагает,


что все характеристики набора взяты из распределения Гаусса. То есть он
предполага- ет, что Хкоординаты красных точек следуют распределению Гаусса и
координаты Y красных точек тоже следуют распределению Гаусса. То же самое
он предполагает
относительно Х и Y для характеристик синих точек. Затем классификатор пыта-
ется создать, исходя из данных, четыре соответствующих распределения Гаусса,
образуя два 2Dхолма. Результат показан на рис. 13.36.

Рис. 13.36  Наивный Байес, соответствующий распределению Гаусса по


каждой из характеристик Х и Y для двух классов. Слева: распределение Гаусса
для красного класса. Справа: распределение Гаусса для синего класса

Если мы раскроем эти распределения и посмотрим сверху вниз, как на рис.


13.37, мы можем увидеть, что они очень похожи по форме. В этом нет ничего
удивитель- ного, потому что мы сгенерировали эти данные способом,
соответствующим рас- пределению, которого и ожидал наивный байесовский
классификатор.

Рис. 13.37  Полное обучающий набор, наложенное на гауссово распределение


на рис. 13.36. Наивный байесовский классификатор нашел хорошее соответствие
распределениям, из которых эти точки первоначально были извлечены

Чтобы увидеть, как хорошо классификатор будет работать на практике,


давайте разделим обучающие данные, выберем случайным образом 70 % точек в
обуча- ющем наборе, а оставшиеся используем как тестовый набор. Мы будем
обучать с этим новым обучающим набором и затем нанесем тестовый набор на
распреде- ление Гаусса, что даст нам рис. 13.38.
Рис. 13.38  Тестовые данные после обучения с 70 % наших начальных данных.
Предсказание очень хорошее

На рис. 13.38 мы нанесли все точки, которые были классифицированы как


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

Рис. 13.39  Данные в виде зашумленных полукружий. Красный


и синий классы получены не из распределений Гаусса, поэтому
мы ожидаем, что наивный Байес будет плохо им соответствовать

Когда мы подаем эти выборки на вход классификатора наивный Байес, им


предполагается (как всегда), что все красные величины Х и красные величины Y,
синие величины Х и синие величины Y взяты из распределения Гаусса.
Классифи- катор находит наилучшее распределение Гаусса, какое может,
которое показано на рис. 13.40.
Рис. 13.40  Когда основанный на распределении Гаусса алгоритм наивного
Байеса согласовывает наши полукружия, показанные на рис. 13.39, предполагает-
ся, что точки взяты из распределения Гаусса, потому что так делается всегда. Здесь
показаны наилучшие полученные гауссовы распределения, которые могут соответ-
ствовать распределениям Гаусса

Конечно, полученные изображения – не слишком хорошее соответствие


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

Рис. 13.41  Обучающие данные из рис. 13.39,


наложенные на гауссовы распределения из рис. 13.40

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


наборы, при этом обучающих 70 %, и посмотрим на предсказания. На левом
изображе- нии на рис. 13.42 мы видим все точки, которым присвоен красный
класс. Как мы и ожидали, здесь большинство красных точек, но некоторые
красные точки ис- чезли, а некоторые синие точки прокрались, потому что их
величина из первого гауссова распределения выше, чем второго. На правом
изображении рис. 13.42 мы видим, что большинство синих точек и обозначено
как синий класс, но прокрался и ряд красных точек.
Рис. 13.42  Здесь представлены предсказанные классы для тестовых данных
после обучения с подмножеством зашумленных полукружий. Слева:
большинство красных выборок расположено в красном классе, но некоторые
красные выборки отклонены, а некоторые синие выборки были некорректно
классифицированы как красные. Справа: большинство синих выборок
правильно классифицировано как синие, но не все, а некоторые красные
выборки были неправильно классифициро- ваны как синие

Нам не следует сильно удивляться тому, что здесь присутствует неправильная


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

13.7. обсужДение
Мы посмотрели на четыре популярных алгоритма классификации. Большинство
библиотек по машинному обучению предлагает всех их, наряду и со многими
дру- гими.
Если мы хотим только исследовать наши данные, то имеет смысл попробовать
каждый алгоритм, который кажется подходящим для того, чтобы заглянуть по-
глубже в структуру данных. Давайте коротко посмотрим на «за» и «против» этих
четырех классификаторов.
Метод kNN гибок. Он не предоставляет зазоры в явном виде, поэтому он
может справляться с любыми сложными структурами, сформированными
выборками в обучающих данных. Он быстро обучает, поскольку обычно
сохраняет каждую обучающую выборку. С другой стороны, предсказания
медленны, потому что ал- горитм должен искать ближайшего соседа для каждой
выборки, которую мы хо- тим классифицировать (существует много более
эффективных методов, которые ускоряют этот процесс). Кроме того, алгоритм
поглощает большое количество
Обсуждение  369

памяти, потому что сохраняет каждую обучающую выборку. Если обучающая


вы- борка больше доступного объема памяти, обычно необходимо начинать
исполь- зовать виртуальную память, чтобы сохранить выборки, а это может
существенно замедлить работу алгоритма.
Метод опорных векторов обучает медленнее, чем kNN, но он значительно
быст рее предсказывает. Если он обучен, ему не требуется много памяти,
поскольку он запоминает только зазоры. При этом методе, чтобы найти более
сложные грани- цы классификации, чем прямые линий, создаваемые SVM
(плоскости и поверх- ности более высокой размерности), может быть
использован ядерный трюк.
С другой стороны, время обучения растет вместе с ростом обучающего набора.
Качество результатов очень чувствительно к параметру С, «клиренсу», который
определяет, насколько большому количеству выборок разрешено быть близко
к зазору. Мы можем использовать кроссвалидацию, чтобы попробовать различ-
ные величины C и выбрать наилучшую, но, учитывая медленную работу SVM,
это может потребовать большого времени.
Деревья решений обучаются быстро, и они также быстро дают предсказания.
Они могут создавать причудливые границы, если глубина дерева велика. Они
имеют очень большой недостаток в связи с их аппетитом избыточного обучения
(хотя, как мы упоминали раньше, мы вернемся к этому вопросу, рассматривая
применение группы небольших деревьев, так что еще не все потеряно). Деревья
решений имеют большой спрос на практике, потому что мы можем объяснить
результаты и их смысл. Существуют и другие алгоритмы классификации,
которые принимают решения, основанные на математических или
алгоритмических про- цессах, но они могут трудно восприниматься людьми,
которые хотят просто пони- мать результаты. Деревья решений имеют то
достоинство, что могут быть очень понятными: результат получен в связи с этой
цепочкой решений, которую мы мо- жем очевидным образом объяснить. Иногда
деревья решений используются, даже если результаты хуже, чем у других
классификаторов, потому что эти результаты легче воспринимаются людьми.
Наивный Байес быстро обучается и быстро дает предсказания, а результаты
объясняются довольно легко (хотя они немного более абстрактные, чем резуль-
таты деревьев решений и kNN). Метод не имеет настраиваемых параметров, что
означает, что нам не надо вести расширенный поиск с кроссвалидацией, как с
Спараметрами метода CVM. Если классы, с которыми мы работаем, хорошо раз-
делены, то приор наивного Байеса часто дает хорошие результаты. Алгоритм ра-
ботает особенно хорошо, когда наши данные имеют много характеристик,
потому что в многомерных пространствах выборки отстоят друг от друга на
больших рас- стояниях, создавая своего рода разделения, а это идет на пользу
наивному Байесу [VanderPlas16].
На практике мы часто сначала пробуем наивный Байес, потому что он быстро
обучается, предсказывает и может давать нам понимание структуры данных.
Если качество предсказания плохое, мы можем затем обратиться к другому, бо-
лее дорогому классификатору. Мы увидим в дальнейшем, что глубокие (то есть
многослойные) нейронные сети также могут быть превосходны для проведения
классификации. Тем не менее алгоритмы, которые мы здесь рассмотрели, часто
используются, потому что они просты для понимания, и мы можем обычно по-
нять (хотя иногда с некоторым усилием), почему они дали тот или иной
результат.
370  Классификаторы

справоЧные материалы
[Bishop06] Bishop Christopher M. Pattern Recognition and Machine Learning. Springer,
2006.
[Raschka15] Raschka Sebastian. Python Machine Learning. Packt Publishing, 2015.
[Steinwart08] Steinwart Ingo, Christmann Andreas. Support Vector Machines. Springer,
2008.
[VanderPlas16] VanderPlas Jake. Python Data Science Handbook. O’Reilly, 2016.
Глава 14
Ансамбли

Отдельные обучаемые часто


несовершенны и иногда могут дать нам
неверные результаты.
Объединив их в
ансамбль, можно улучшить
результаты.

14.1. поЧему зДесь эта глава


Каждый может совершить ошибку, и это касается и алгоритмов обучения.
Иногда мы можем быть абсолютно уверены, что наш алгоритм дает хорошие
ответы, но по ряду причин мы можем иметь и много сомнений. В таком случае
мы можем пропустить наши данные через многих обучающихся, каждый из
которых обучен немного иначе, и позволить им голосовать относительно
окончательного ответа. Эта идея не нова. Космический корабль Аполлон в 1960
году имел один компью- тер в командном модуле, который рассчитывал орбиту
луны, и один компьютер в лунном модуле, совершающем посадку. Каждый из
этих компьютеров был по- строен на интегральных схемах, которые были
относительно новыми элементами в тот период. Для защиты от отказов в связи с
этой новой техникой каждый борт был дублирован дважды, имея в целом на
борту 3 копии. Все три копии все время работали синхронно. Эта техника
именовалась «Тройное модульное резервирова- ние». Выход каждого модуля был
решением большинства голосующих [Ceruzzi15].
В машинном обучении группы обучающихся называются ансамблями. Как
и в случае с компьютерами Аполлона, главная идея состоит в том, что если мы
получим много предсказаний, то наиболее популярное из получаемых от неза-
висимых алгоритмов предсказание, вероятно, самое правильное.
Ансамбли иногда могут обеспечивать резкий рост эффективности. В некото-
рых ситуациях мы можем построить ансамбли из большого количества быстрых
обучаемых модулей и получить результаты, которые так же хороши, как и полу-
ченные большим и сложным комплексом, и за меньшее время.

14.2. ансамбли
Принятие решений – трудная работа как для человека, так и для машины. В ряде
человеческих сообществ с несовершенством индивидуального принятия реше-
ний справляются с помощью обобщения мнений многих людей.
Законы принимаются сенатами, политические решения создаются советами,
и даже отдельные лидеры могут избираться путем голосования. Подход во всех
372  Ансамбли

этих случаях заключается в том, что мы можем избежать ошибок, используя


точку зрения многих независимых людей.
Даже если это и не гарантирует хороших решений, это помогает избежать
проб лем, связанных с индивидуальными склонностями одного человека.
Когда мы принимаем решения с помощью обучающих алгоритмов, их
предска- зания основаны на данных, на которых они обучались. Если данные
содержали ка- киелибо отклонения, пропуски, избыточность представления или
другие систем- ные ошибки, мы вкладываем их в обучаемого. Если мы учим
алгоритм с данными, которые указывают на определенное направление,
результат, который мы полу- чим, тоже будет указывать на это направление. Это
может иметь глубокие послед- ствия в реальном мире. Когда мы используем
машинное обучение, для того чтобы оценивать индивидуальные или деловые
кредиты, или определяем возможность поступления в колледж, любая
неправильность или погрешность в наших данных будет причиной такой же
неправильности и смещения в решениях системы. Даже безобидные
предрассудки будут оказывать влияние на результат.
Одним из способов избежать данной проблемы является обучение многих уче-
ников с использованием различных обучающих данных из разных источников.
Конечно, любая систематическая погрешность во всех обучаемых множествах
будет попрежнему оказывать влияние на результат, но если мы стараемся при-
менять разные обучающие данные, которые действительно отражают типы
реше- ний, которые мы ищем, мы можем избежать случайных погрешностей в
ответах. Когда мы обучаем группу обучаемых на этих разных наборах данных,
мы обыч- но просим каждого из них оценить новые данные. Затем мы
разрешаем ученикам
голосовать для определения окончательного результата.
Этот метод является популярным среди ученых, которые изучают сложные
мо- дели естественных явлений, таких как погода, климат, образование
Солнечной си- стемы. Ключевым пунктом при построении и реализации любого
моделирования является знание того, какие предположения заложены в
различные аналитические модели и каким образом эти предположения могут
дать ошибочные результаты.
При объединении многих результатов моделирований, полученных разными
моделями с разными предположениями, мы можем надеяться, что погрешности
будут отвергать одна другую и будет выработан наиболее корректный результат.
Так, например, многие предсказания климата являются результатом независи-
мых предсказаний разных моделей (иногда разного масштаба) и объединения
этих результатов [NRC98]. Предсказания погоды часто осуществляют и много-
кратным запуском одной модели при немного отличающихся условиях и выби-
рают наиболее часто предсказуемый результат. Эта техника называется ансамб-
левым предсказанием [Met17].

14.3. голосование
Когда мы имеем много результатов от многих обучаемых, нам необходимо каким
то образом прийти к единственному конечному результату. Обычным способом
это сделать можно при использовании голосования большинством
[VotingTerms16]. Пусть каждый обучаемый просто даст голос за свое
предсказание, и чье пред- сказание получит наибольшее число голосов, тот станет
победителем (связи меж- ду голосующими часто разрываются либо случайным
выбором одного из связан-
ных входов, либо проведением повторного голосования).
Бутстрап-агрегация  373

Множественное голосование удобно и для понимания, и для применения и


час то дает разумный результат.
Однако множественное голосование несовершенно. Если мы применяем его
в социальном плане, оно может привести к большим проблемам и стать
причиной удивительных и порой неприемлемых результатов.
Но при работе со многими обучаемыми множественное голосование – очень
по- пулярный подход определения результатов, потому что он прост, быстр и
обычно дает хорошие результаты.
В этой главе будет использоваться голосование взвешенным большинством.
В данном варианте множественного голосования каждый голос получает опреде-
ленный вес, который является просто числом. Предположим, что все наши вы-
боры начинаются с числа 0 и некто опустил бюллетень за А с числом +4. Тогда
А имеет счет 4. Мы также можем опустить бюллетень с отрицательным числом,
так что если еще ктото опустит бюллетень за А с числом –1.5, счет А станет тогда
2,5. Тот, кто при сложении всех голосов имеет наибольший (то есть наибольший
положительный) общий счет, является победителем.

14.4. бутстрап-агрегация
Популярным типом ансамбля является ансамбль, который полностью строится
из деревьев решений. Эти деревья обеспечивают хорошую скорость как при
обуче- нии, так и при предсказании, и потому использование значительного
количества деревьев решений не является слишком большой нагрузкой. Деревья
решений популярны и для классификации, и для регрессии. Чтобы сделать
дальнейшее об- суждение более конкретным, мы сфокусируемся на
классификации.
Существует две популярные техники для объединения деревьев решений
в большие группы. Каждая из них создает ансамбль, который может
значительно превзойти качество отдельного дерева решений в его составе.
Основная идея объединения деревьев решений состоит в том, что они обуча-
ются несколько разными обучающими наборами. Это означает, что они будут
по- хожими друг на друга, но не будут являться точными копиями. Когда
поступает новая выборка для предсказания, мы даем эту выборку каждому из
деревьев в ан- самбле. Предсказания всех деревьев собираются, и наиболее
популярное предска- зание является выходом ансамбля.
Первая техника построения ансамбля, которую мы рассмотрим, называет-
ся баггинг (bagging). Это слово является контаминацией двух английских слов
bootstrap (бутстрап) и aggregating (агрегация). (Эта техника имеет также назва-
ние обобщенная кросс-валидация. – Прим. перев.) Как можно догадаться, это
та идея, которую мы рассматривали в главе 2. Там мы видели, как использовать
бутстраппинг для оценки качества статистической величины, вычисленной при
использовании многих подмножеств интересующей нас популяции. Мы создаем
много маленьких наборов, составленных из обучающих наборов, и используем
их для обучения группы деревьев решения.
Начиная с оригинального набора выборок, мы строим много новых наборов,
или бутстрапов, беря только несколько элементов из начального набора и
исполь- зуя выбор с замещением. Это означает, что есть возможность выбрать
одну и ту же выборку более одного раза. На рис. 14.1 показана идея. Вспомним,
что каждая вы- борка приходит с маркировкой категории, и поэтому ею можно
обучать.
374  Ансамбли

Рис. 14.1  Создание бутстрапов из набора выборок. Сверху: набор из 8 выборок.


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

Мы создаем одно решающее дерево для каждого бутстрапа и обучаем это


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

Количество
голосов

Категория

Рис. 14.2  Новая часть данных (вверху) поступает на наш ансамбль. Поскольку
он обучен с применением баггинга, каждое решающее дерево слегка отличается
от другого. Данные поступают на каждое из решающих деревьев (показаны как
треугольники), которые выдают предсказанную категорию (A, B, C или D). Мы за-
пускаем выбор путем голосования большинством с этими категориями (четвертый
ряд), которое показывает, что наиболее популярной категорией является В, поэтому
эта категория побеждает и является выходом ансамбля
Случайные леса  375

Чтобы запустить алгоритм, нам необходимо специфицировать только два па-


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

14.5. слуЧайные леса


Баггинг можно улучшить, создав еще более эффективные ансамбли деревьев.
Трюк заключается в особенностях построения деревьев при обучении.
Как мы видели в главе 13, во время разделения узла на два мы можем выбрать
любую характеристику (или множество характеристик) для проведения теста,
на- правляя элементы то ли одному ребенку, то ли другому. Если мы решили
отделить только одну характеристику, появляется проблема, как выбрать ту
характерис тику, которую мы хотим использовать, и какую величину этой
характеристики тестировать. Мы можем сравнить различный выбор
характеристик и различные точки разделения, используя измерения, которые
мы рассматривали в главе 13, такие как информационная энтропия или
коэффициент Джини.
Давайте посмотрим на этот процесс с такой же точки зрения, что приведет нас
к использованию бутстраппинга и баггинга. Это даст нам еще один уровень ва-
риации от одного дерева к другому, что, в свою очередь, позволит получить рас-
ширенный диапазон мнений при голосовании за лучшую категорию для обозна-
чения новой выборки.
На каждом узле, когда надо найти разделяющий тест, мы обычно рассматри-
вали все характеристики, чтобы решить, какую лучше разделять далее. Но
вместо рассмотрения всех характеристик давайте рассмотрим только некоторое
случай- ное подмножество характеристик, выбирая их без замещения.
Другими словами, мы выбираем некоторые характеристики и находим в этом
листе лучшую из них. Мы даже не рассматриваем разделения, базирующиеся на
характеристиках, которые мы при этом проигнорировали.
Позже, когда мы подходим к разделению другого узла, мы снова выбираем со-
вершенно новое подмножество характеристик и опять определяем наше новое
разделение, используя только их.
Такая техника называется баггингом характеристик. Эта идея демонстриру-
ется на рис. 14.3.
Когда мы строим ансамбль таким образом, то называем результат случайным
лесом. Прилагательное «случайный» относится к нашему случайному выбору
ха- рактеристик из каждого узла, слово «лес» относится к результирующей
группе де- ревьев решений.
Чтобы создать случайный лес, нам необходимо обеспечить одинаковые пара-
метры, которые мы используем для баггинга: размер случайной группы
выборок,
376  Ансамбли

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


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

Поиск Поиск

Новое правило на основе f2 Новое правило на основе f5

Рис. 14.3  Определение характеристики, используемой при разделении узла


с помощью баггинга характеристик. Слева: вверху – набор из 4 выборок, каждая
с 5 характеристиками. В среднем ряду показаны 3 характеристики, выбранные
случайным образом. Мы ищем лучшие три характеристики, чтобы определить,
как разделять этот узел. Лучший выбор – характеристика 2. Справа: тот же
процесс для другого узла. Здесь выбран другой набор из 3 характеристик и
ищутся наилучшие характеристики для разделения

14.6. ранДомизированные Деревья


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

14.7. бустинг
Посмотрим теперь на технику, называемую бустинг (boosting), которая приме-
нима не только к деревьям решений, но к любой такого рода обучающей системе
[Schapire12]. Мы будем обсуждать бустинг в терминах бинарного классификато-
ра, то есть системы, определяющей на выходе принадлежность к одному из двух
классов. Бустинг позволяет нам объединить большое число маленьких, быстрых
и неточных обучающихся в одного большого и точного обучаемого.
Давайте предположим, что наши данные содержат выборки только двух
катего- рий. Полностью случайный бинарный классификатор будет произвольно
присва- ивать одну из этих двух категорий, поэтому если выборки разделены в
обучающем наборе поровну, то мы будем иметь 50:50 шансов, что выборки будут
корректно маркированы. Мы называем это случайной маркировкой, или
говорим, что раз- ница в получении правильного ответа является просто
шансом.
Что, если бинарный классификатор дает только немного лучший ответ, чем
шанс? Возможно, это связано с плохой граничной линией. На рис. 14.4 показаны
наборы данных из двух категорий, бинарный классификатор, который не лучше,
чем шанс, и бинарный классификатор, который совсем немного лучше, чем шанс.

(а) (b) (с)

Рис. 14.4  Плохой бинарный классификатор: (а) наши обучающие данные. Луч-
шим разделением была бы горизонтальная линия, пересекающая середину бокса;
(b) плохой бинарный классификатор. Здесь имеем не более, чем шанс; (с) бинарный
классификатор, который только немного лучше, чем шанс. Это плохой классифика-
тор, но благодаря небольшому наклону граничной линии он немного менее плох,
чем классификатор по пункту «b»

Обучающийся на рис. 14.4 (b) не лучше, чем шанс, с половиной каждого


класса, получающего некорректную классификацию. Это бесполезный
классификатор. Обучающийся на рис.14.4 (с) лишь ненамного менее полезен,
чем классификатор на рис. 14.4 (b), потому что то, что граничная линия слегка
наклонена, означает, что определение категорий будет немного лучше, чем
случайное. Мы называем классификатор на рис. 14.4 (с) слабым обучаемым.
Слабым обучаемым в этой ситуации будет любой классификатор, даже если он
имеет некоторую небольшую верность. Буквально говоря, ему надо быть чуточку
лучше, чем шанс или чем определять категории совершенно случайно.
Слабый обучаемый полезен для нас, даже если он работает хуже, чем шанс.
Это лишь потому, что мы имеем только две категории. Если классификатор
ниже
уровня шанса (то есть он присваивает неправильную категорию более часто, чем
правильную), то мы можем просто отбросить классы на выходе, и тогда он будет
работать не хуже, а лучше, чем шанс. В противоположность слабым обучаемым
сильные обучаемые – это хорошие классификаторы, которые получают правиль-
ную маркировку в большинстве случаев. Чем сильнее обучаемый, тем больше его
процент быть правильным.
Слабых обучаемых сыскать проще.
Возможно, большинством обычно используемых слабых классификаторов яв-
ляются деревья решений глубиной только в один тест. То есть все дерево состоит
из коренного узла и дочерних узлов. Это, до смешного, маленькое дерево
решения часто называют решающий пень. Но поскольку он почти всегда делает
работу лучше, чем случайно обозначенный класс каждой выборки, он является
хорошим примером слабого классификатора. Он небольшой, быстрый и
немного лучше, чем случайный.
Идея бустинга состоит в том, что объединяется много слабых классификаторов
в ансамбль, который действует, как сильный классификатор. Заметим, что наши
слабые условия – это просто минимальный порог. При желании можно объеди-
нять и сильные классификаторы, но слабый классификатор обычно значительно
более быстрый.
Давайте посмотрим, как это работает на примере.
На рис. 14.5 показано обучающий набор, которое состоит из двух классов.

Рис. 14.5  Группа выборок,


которую мы собираемся классифицировать, используя бустинг

Что может быть хорошим классификатором для такого набора данных? Быст
рым и легко воспринимаемым классификатором был бы одиночный
персептрон, который мы обсуждали в главе 10. Это означает проведение прямой
линии через это 2Dнабор данных.
Набор 2Dвыборок называется линейно разделимым, если мы можем провести
прямую линию между ними. Мы можем видеть, что нет прямой линии, которая
разделила бы эти данные, потому что в середине область с кружками по обе сто-
роны окружает область с квадратиками.
Хотя нет одиночной прямой линии, которая хорошо разделила бы эти
данные, это может сделать много прямых линий, поэтому давайте используем
прямые ли- нии, как мы это делали для слабого классификатора. Вспомним, что
эти класси- фикаторы не должны выполнять хорошую работу над всем набором
данных. Они
только выполняют некоторую работу, чтобы повысить шанс. На рис. 14.6
показана такая линия, которую мы назвали А. Все со стороны линии А,
указанной стрелкой, будет классифицировано как квадратики, а все, что с другой
стороны, будет клас- сифицировано как кружочки. Эта линия делает хорошую
работу по разделению группы кружочков вверху слева от остальных данных, но
ошибочно классифици- рует небольшой кластер квадратиков внизу слева.

Рис. 14.6  Расположение одной линии, названной


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

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

Рис. 14.7  К линии на рис. 14.6 добавлены 2 линии.


Теперь каждая область сформирована этими тремя линиями
и содержит выборки только одного класса
Хотя на рис. 14.7 только три линии или разделителя, они создали семь непере-
крывающихся областей. Три из них населены исключительно кружочками, а
дру- гие четыре – исключительно квадратиками.
Каждая из линий A, B и C – слабые обучаемые, и возвращаемые ими ответы
да- леки от правильных. Теперь объединим их, чтобы получить значительно
лучший результат.
Чтобы упростить обсуждение, мы будем именовать трех обучаемых по
ассоции руемым с линиями названиям: A, B и C, а каждую из семи созданных
ими обла- стей – по положительной стороне одной из многих линий. Мы также
упростим диаграмму, сделав ее более симметричной, потому что наше
внимание сейчас фокусируется на том, как объединить области, а не на их
конкретной форме. Ре- зультат приведен на рис. 14.8.

Рис. 14.8  Слева показаны три линии, названные A, B и C. Справа


каждая область маркирована именем обучаемых, которые относят
область к положительной стороне относительно линий

Вместо того чтобы получать отчет о категории от каждого обучаемого


(кружках или квадратиках), мы будем представлять для отчета величину,
ассоциирован- ную с этим обучаемым. Таким образом, выборка на
положительной стороне ли- нии обучаемого сообщает о своей величине. В
противном случае она сообщает о 0. Какую величину нам следует использовать?
Чтобы продемонстрировать, как процесс работает, мы присвоим +1 всем
обучаемым. Позже мы увидим, что эти
величины будут определяться для нас алгоритмом автоматически.
Итак, в соответствии с нашей конвенцией, если выборка находится на
поло- жительной стороне линии (то есть стороне, указанной стрелкой на
рис. 14.8), то обучаемый возвращает величину +1. В противном случае он
возвращает 0.
Давайте возьмем область наверху, обозначенную С на рис. 14.8. Она на
положи- тельной стороне С и получает 1. Но она на отрицательной стороне А и
В, каждая из которых таким образом рапортует о 0, поэтому общий счет 1.
Область внизу, обо- значенная АВ, получает 1 от А и В и 0 от С, давая в целом 2.
Этот подсчет показан наряду со счетами других областей и приведен на рис. 14.9.
Рис. 14.9  Совокупный счет для всех семи областей.
Каждая буква на рис. 14.8 присваивает этой области 1

Чтобы превратить эту информацию в работающий классификатор, нам необ-


ходимо найти правильные веса для каждой области и правильный порог для
при- своенных категорий. Раньше мы присваивали величину 1 каждому
обучаемому, и таким образом они были весами для голосования, но и многие
другие величины могли бы прекрасно работать. На рис. 14.10 мы показываем
области, на которые влияет счет каждого обучаемого. Темная область получает
эту величину обучаемо- го, а светлая область не получает (поэтому величина
обучаемого в светлой области равна нулю). Отсюда мы используем веса (1.0, 1.5, –
2) для А, В и С соответственно.

Рис. 14.10  Мы присвоили числовые значения каждой области, которая класси-


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

Сумма всех счетов показана на рис. 14.11. Мы корректно классифицировали


наши данные.
Рис. 14.11  Сложение счетов из рис. 14.10. Положительные величины имеют
только ячейки синего цвета. Это именно те, которые мы хотели получить на рис.
14.7

Давайте посмотрим на другой пример. На рис. 14.12 показано новый набор


данных.

Рис. 14.12  Набор данных,


которые мы хотим классифицировать, используя бустинг

Для этих данных мы пытаемся использовать четырех обучаемых. На рис. 14.13


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

Рис. 14.13  Четыре линии,


которые позволяют нам классифицировать данные на рис. 14.12
Как и прежде, мы будем вручную присваивать веса этим обучаемым. На этот
раз мы используем –8, 2, 3 и 4 для учеников А, В, С и D соответственно. На
рис. 14.14 показано, какие области будут иметь эти веса добавленными к
общему счету. Светлые области явно получают 0. Мы опять упрощаем
геометрию нашей диа- граммы, чтобы уделить внимание тому, как мы
работаем с областями и объеди- няем их, а не особенностям формы.

Рис. 14.14  Области, соответствующие каждому обучаемому

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

Рис. 14.15  Сумма счетов каждой области из рис. 14.14.


Положительные области показаны синим,
и они корректно классифицируют точки на рис. 14.13

Красота бустинга состоит в том, что он объединяет простые и быстрые, но пло-


хие классификаторы в один большой классификатор. Бустинг даже
рассчитывает, какие простые классификаторы применять и какие веса следует
иметь при голо- совании.
Единственное, что нам необходимо решить, – это сколько классификаторов
мы хотим применить. В бустинге, как и в других алгоритмах ансамблей, главное
– на- чинать примерно с такого количества классификаторов, которое способно
опре- делить категории [Bonab16]. Это означает, что наши примеры начинались с
завы- шенных исходных условий, поскольку мы использовали 3 или 4
классификатора для только 2 категорий. Но, как и во многих других случаях в
машинном обучении, лучшая величина находится путем проб и ошибок и
частого применения кросс валидации для оценки каждой из возможностей.
Бустинг впервые появился как часть алгоритма, называемого адабуст
(Adaboost) [Freund97], [Shapiere13]. Хотя бустинг может работать с любым алго-
ритмом обучения, он стал особенно популярен с деревьями решений.
Фактически он очень хорошо работает, как упоминалось, с решающими
пнями (это деревья, которые имеют только коренной узел и
непосредственных детей). Пни решений – плохие классификаторы, но они
лучше, чем шанс, что нам и нуж- но. Фактически линии, которые мы
использовали в наших примерах, могли быть представлены как решающие
пни, поэтому мы, по сути, уже видели, что они могут быть адаптированы к
различным обучающим наборам.
Каждого слабого обучаемого, создаваемого при алгоритме бустинга, часто на-
зывают гипотезой. Идея заключается в том, что слабый обучаемый представляет
предположение или гипотезу, такую как «все выборки в категории А находятся
на положительной стороне этой линии». Мы иногда говорим, что бустинг
помогает нам превратить слабую гипотезу в сильную.
Стоит отметить, что бустинг не является уверенным способом улучшить все
алгоритмы классификации. Теория бустинга распространяется только на бинар-
ные классификаторы (как в наших примерах) [Fumera08], [Kaki16]. Частично это
то, почему она стала чрезвычайно популярной и успешной при классификации
с деревьями решений.

справоЧные материалы
[Bonab16] R. Bonab, Hamed; Can, Fazli (2016). A Theoretical Framework on the Ideal
Number of Classifiers for Online Ensembles in Data Streams. Conference on
Information and Knowledge Management (CIKM), 2016.
[Ceruzzi15] Ceruzzi Paul. Apollo Guidance Computer and the First Silicon Chips //
Smithsonian National Air and Space Museum, Space History Department, 2015.
https:// airandspace.si.edu/stories/editorial/apollo-guidance-computer-and-first-silicon-
chips.
[Freund97] Freund Y., Schapire R. E. A Decisiontheoretic Generalization of Online
Learning and an Application to Boosting // Journal of Computer and System
Sciences, 55 (1). Р. 119–139. 1997.
[Fumera08] Fumera Giorgio, Fabio Roli, Alessandra Serrau. A Theoretical Analysis of
Bagging as a Linear Combination of Classifiers // IEEE Transactions on Pattern
Analysis and Machine Intelligence. Vol. 30. Number 7. Р. 1293–1299. 2008.
[Kak16] Kak Avinash. Decision Trees: How to Construct Them and How to Use Them
for Classifying New Data. Purdue University, 2016. https://engineering.purdue.edu/kak/
Tutorials/DecisionTreeClassifiers.pdf.
[Met17] United Kingdom Met Office. What is an ensemble forecast? Met Office
Research, Weather science blog, 2017.
https://www.metoffice.gov.uk/research/weather/ensemble- forecasting/what-is-an-
ensemble-forecast.
[NRC98] National Research Council. The Atmospheric Sciences: Entering the Twenty
First Century // The National Academies Press, 1998. https://www.nap.edu/read/6021/
chapter/9 (p. 178).
Глава 15
Библиотека Scikit-learn

Бесплатная библиотека Scikit-


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

15.1. поЧему зДесь эта глава


Машинное обучение – поле практики. Хотя в этой книге основное внимание уде-
ляется концепциям, нет ничего более полезного для практики, чем превращение
идей в понимание.
Внедрение идеи открывает перед нами решения, от которых мы в противном
случае могли бы либо отмахнуться, либо посчитать неважными, а также
помогает обнаружить ошибочные представления или пробелы в наших знаниях.
В такой об- ласти, как машинное обучение, в которой еще так много от искусства,
где многие решения основаны на интуиции и на том, чему мы научились на
прошлых ошиб- ках и успехах, опыт бесценен.
Как мы можем приобрести этот опыт? Проверенный многолетней практикой
способ – с самого начала создавать свои собственные коды и затем использовать
эти коды для создания и применения систем машинного обучения. Написание
собственных кодов – интересное и обучающее занятие, которое обязательно бу-
дет вознаграждено. Но это и огромный труд, большая часть которого связана с
ис- кусством написания хороших программ, и вовсе не обязательно в области
машин- ного обучения.
В качестве альтернативы мы можем использовать стандартные программы из
существующих библиотек. Многие библиотеки являются доступными, бесплат-
ными, для различных языков программирования и систем. Библиотеки часто
созданы экспертами, на протяжении многих лет проверены в различных приме-
нениях тысячами пользователей, настроены и оптимизированы.
Если для вас привлекателен путь написания с самого начала несложных про-
грамм, существует много учебных пособий [MüllerGuido16], [Rashka15], [Vander
Plas16]. В этой книге мы избрали путь использования существующих библиотек.
Нам нужно будет привлечь, кроме того, широкий круг решений, но мы постара-
лись избежать деталей низкоуровневого программирования, которые, даже
буду- чи существенными, могут также отвлекать.
386  Библиотека Scikit-learn

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


библиоте- ку машинного обучения, опирающуюся на популярный язык
программирования Python, называемую scikit-learn (произносится как «сайкит-
лерн»).
Мы применяем scikitlearn, потому что она пользуется широкой популярно-
стью, хорошо поддерживается и хорошо документирована, стабильна, с откры-
тым кодом и быстрая.
Чтобы эта книга была полезна и людям, для которых Python не
привлекателен, мы ограничились использованием scikitlearn наряду с другими
библиотеками, только в этой главе и главах 23 и 24 тома 2, где будем
использовать эту библиотеку при построении систем глубокого обучения. Ничто
другое в данной книге не за- висит от знакомства с этой библиотекой или Python.
Даже если вам неинтересна scikitlearn, мы полагаем, что, по крайней мере,
быстрый просмотр этой главы поможет вам закрепить некоторые идеи, которые
здесь будут обсуждаться.
Мы будем использовать scikitlearn версии 0.19, выпущенной в августе 2017
го да [scikitlearn17e]. Версии, выпущенные после этой даты, вероятно, будут
сов местимы с кодами, которые будут использоваться здесь. Загрузка
библиотеки обычно не вызывает затруднений при установке на большинство
систем. Дета- лизацию установки смотрите в инструкции по загрузке на
домашней странице библиотеки [scikitlearn17f].
Удобный путь использования Python – работа во взаимодействии с интерпре-
татором Python. Свободно распространяемая система Юпитер (Jupyter) обеспе-
чивает простой и гибкий интерфейс для интерпретации Python, который уста-
навливается в любом распространенном браузере [Jupyter17]. Ноутбуки
Юпитера содержат запущенные версии всех программ в этой главе, доступные
на GitHub (https://github.com/blueberrymusik).

15.2. ввеДение
Библиотека Python scikitlearn – свободно распространяемая библиотека общих
алгоритмов машинного обучения.
Чтобы с пользой использовать ее, необходимо знакомство с языком програм-
мирования Python и библиотекой NumPy. NumPy (произносится «нампай») –
библиотека Python, сфокусированная на манипуляциях и вычислениях числовых
данных. Вложенные зависимости показаны на рис. 15.1.

Рис. 15.1  Библиотека scikit-learn использует для численных расчетов


стандартные программы из NumPy, которая, в свою очередь, зависит от Python
В Python присутствует еще несколько научных комплектов программного
обес печения («kits»), каждый из которых называется «scikit – специфическое
название содержания комплекта». Например, scikitimage (scikitизображение) –
популяр- ное программное обеспечение для обработки изображений. Эти
комплекты, сво- бодно распространяемые проекты с открытым кодом,
разработаны и сохранены серьезными разработчиками, которые приложили к
этому усилия, главным об- разом в свободное время, в качестве общественной
услуги. Другая широко ис- пользуемая библиотека называется SciPy
(произносится «сайпай») и содержит обширное программное обеспечение для
научных и инженерных работ.
Глубокое погружение в Python, NumPy или scikitlearn требует не одной неде-
ли труда. Каждый из этих комплектов велик по размеру и содержит много пред-
ложений. С другой стороны, еженедельная работа с каждым из них может быть
хорошим стартом.
Если вы незнакомы с этими комплектами, в разделе «Справочные материалы»
вы найдете источники для ознакомления с ними.
Если вы встретитесь с термином или программой, которые покажутся вам не-
знакомыми, достаточно обратиться к поисковой системе интернета, где собрано
много документации по всем этим вопросам. В этой главе мы фокусируемся на
scikitlearn и полагаем, что вы знакомы с Python и NumPy, по крайней мере на-
столько, чтобы двигаться дальше.
Хотя данная глава сфокусирована на scikitlearn, мы не слишком сильно углуб
ляемся в эту библиотеку. Как любое серьезное программное обеспечение, scikit
learn имеет свои конвенции, умолчания, ограничения, сокращения, лучшие при-
емы, подвохи, легко совершаемые ошибки и т. п. И каждая программа в этих
библиотеках имеет свои конкретные детали, которые важно знать, чтобы полу-
чить наилучшие результаты. Чтобы уделить всем этим аспектам большее вни-
мание, требуется обращение к специальным книгам, и такие книги, конечно же,
существуют [MüllerGuido16].
Наша цель в этой главе – раскрыть смысловое содержание этих библиотек и
их использования.
За деталями программ и техникой их применения следует обратиться к
онлай- новой документации, справочникам или даже некоторым полезным
интернет страницам и блогам.

15.3. конвенции Python


Scikitlearn – большая библиотека. Она предлагает около 400 стандартных
про- грамм, размер которых колеблется от маленьких утилит до больших
алгоритмов машинного обучения, объединенных в единый вызов
библиотеки. Эти програм- мы расширенно документированы на
библиотечном вебсайте [scikitlearn17b]. На момент написания книги
текущий выпуск (версия 0.19) содержит библиотеч- ные программы 35
больших категорий.
Поскольку мы предлагаем лишь их общий обзор, мы составили для
рассмотре- ния наше собственное небольшое множество категорий: Оценшики,
Кластери- зация, Уточнение данных, Ансамбли, Наборы данных и
Утилиты.
Многие элементы scikitlearn организованы как отдельные составляющие, а не-
которые созданы для использования в специфических комбинациях. Позже, при
демонстрации специфических алгоритмов, мы увидим несколько примеров та-
ких комбинаций.
Scikitlearn не ориентирован на нейронные сети, являющиеся отличительной
чертой глубокого обучения. Скорее, они выступают в качестве инструментов для
автономного изучения данных и в качестве утилит для нейронных сетей, помогая
нам исследовать, понимать и изменять наши данные. Многие проекты глубоких
сетей начинаются с исследования данных, выполняемого с помощью библиотеки
scikitlearn.
Эта глава неминуемо содержит листинги кодов, но мы старались делать их не-
большими и непосредственно ориентированными. Полные листинги кодов явля-
ются прекрасными источниками для обучения деталей систем и управления
таки- ми проблемами, как структура данных и вызов нужных операций в
надлежащей последовательности. С другой стороны, читать длинные блоки
кодов – утомитель- ное занятие. Реальные проекты обычно затрачивают большие
усилия и время на небольшие детали, которые являются особыми для
специфических программ и не способствуют пониманию основных принципов.
Поэтому, когда мы будем создавать реальные системы для выполнения ре-
альной работы, мы будем сводить к минимуму эти специфические для проекта
шаги. Обычно мы будем строить наши проекты шаг за шагом. Поэтому будем
демонстрировать и обсуждать каждый шаг, а затем рассматривать его как часть
программы и не повторять этот код каждый раз с ростом программы. В неко-
торых случаях мы будем давать коды вместе в большом листинге в конце, но
обычно мы будем оставлять обобщение за ноутбуками Юпитера, сопровождаю-
щими главу.
Это значит, что многие коды примеров в этой главе являются только фрагмен-
тами, а не полными программами. Общий смысл такого подхода состоит в том,
что всегда можно построить небольшую тестовую программу вокруг фрагмента,
чтобы изучить, что он делает в деталях.
Везде, где мы используем scikitlearn, мы сначала импортируем его, потому что
Python не загружает его автоматически. Когда мы импортируем scikitlearn, он
применяется под сокращенным именем sklearn. Это имя – просто имя высшего
уровня для библиотеки. Сами программы организованы как множество
модулей, которые также требуется импортировать.
Существует два популярных способа импорта модулей. Первый заключается
в импортировании модуля целиком. Затем мы можем назвать в этом модуле
наш код, задавая его как префикс к имени модуля после пробела. Листинг 15.1
демон- стрирует подход, в котором мы создали объект Ridge, поступивший из
модуля scikitlearn под названием linear_model.
Листинг 15.1  Мы можем импортировать модуль linear_model целиком и затем использовать
его как префикс к имени объекта Ridge. Здесь мы создаем объект Ridge
без аргумента и сохраняем его в переменной ridge_estimator
from sklearn import linear_model
ridge_estimator = linear_model.Ridge()
Другой способ – импортировать из модуля только необходимое, а затем
можно использовать объект в коде безотносительно к модулю, как в листинге
15.2.
Листинг 15.2  Мы можем импортировать только объект Ridge из linear_model,
а потому нет необходимости именовать модуль при использовании объекта.
В результате этот код становится идентичным коду из листинга 15.1
from sklearn.linear_model import
Ridge ridge_estimator = Ridge()
Говоря в общем, обычно проще в процессе разработки импортировать целый
модуль, поскольку тогда мы можем использовать другие объекты из этого
модуля без постоянного обращения к поиску и изменениям import.
После того как мы это проделали, мы часто возвращаемся и обращаемся к им-
порту только для того, что мы действительно используем, поскольку это ста-
новится немного яснее. На практике и импорт всего модуля, и импорт только
его конкретной части используются одинаково часто, как и совместно в одном
файле.
Мы будем часто использовать библиотеку NumPy, поэтому часто импортиро-
вать ее. По умолчанию импортируя NumPy, мы используем аббревиатуру np.
Это общепринятая практика, но не правило.
Мы также часто будем использовать модуль math, чтобы воспользоваться пре-
имуществами большого разнообразия предлагаемых им математических про-
грамм. Конвенция не переименовывает эту библиотеку, поэтому мы будем об-
ращаться к ней в наших кодах как math.
Другой общей библиотекой является графическая библиотека matplotlib. Она
также имеет общепринятое имя. Модуль, который мы будем часто использовать,
называется pyplot, традиционно он называется plt, то есть «plot» (график) без o.
Наконец, библиотека Seaborn library предлагает некоторые дополнительные
графические программы, а также модифицирует изображения посредством mat
plotlib, делая их более привлекательными [Waskom17]. Для вызова
используется общепринятый вызов sns. В этой главе наше использование
Seaborn заключается только в ее вызове и команде по умолчанию заменить
эстетики matplotlib на ее собственные.
Мы делаем это, вызывая sns.set(), и обычно помещаем этот вызов в ту же
стро- ку, как объявление import, разделяя точкой с запятой.
Листинг 15.3 показывает типичный вызов import для этой другой библиотеки.
Листинг 15.3  Множество вызовов import будет нашим началом почти во всех проектах
import numpy as
np import math
import matplotlib.pyplot as
plt import seaborn as sns ;
sns.set()
Чтобы найти нужный модуль для импорта каждой программы scikitlearn,
которую мы хотим использовать, мы можем обратиться онлайн к API
Referance библиотеки scikitlearn [scikitlearn17a]. Эта справка также содержит
полную клас- сификацию всего в scikitlearn, хотя и в очень сжатом стиле. API
Referance очень хорош, когда мы используем ее именно как справку, если
хотим вспомнить чтото о том, как вызвать то или как использовать это.
Однако, ввиду краткости, она мало полезна для объяснений. Эту информацию
лучше получить из одной из книг или сайтов, перечисленных в разделе
«Справочные материалы».
Специалисты, управляющие scikitlearn, используют очень высокие стандарты
для включения новых программ, так что добавления в библиотеку редки.
Библио тека корректируется, когда фиксируется необходимость важных
исправлений или требуется совершенствование, и временами ее реорганизуют. В
результате некоторые программы маркируются как «опротестованные», и это
означает, что планируется их удалить, но они остаются на некоторое время, так
что пользова- тели могут сами усовершенствовать их код. Опротестованные
программы часто относят к более общим характеристикам библиотеки или
просто реорганизуют в различные модули.
Многие программы в scikitlearn созданы доступными для нас посредством
объектов в объектноориентированном смысле. Например, если мы хотим про
анализировать некоторые данные особым порядком, то мы обычно создаем
экзем- пляр объекта, предназначенный для такого рода анализов. Затем мы
выполняем задачу посредством вызова методов объекта, инструктируя объект по
выполнению задачи как анализа набора данных, вычисляем статистику данных,
обрабатываем ее какимто способом и предсказываем величины для новых
данных.
Благодаря встроенной в Python программе «сбора мусора» нам не приходится
беспокоиться об утилизации или перемещении наших объектов, когда мы пере-
стаем работать с ними. Python автоматически освободит память, когда это станет
безопасным.
Такой способ использования объектов на практике очень хорош, поскольку он
позволяет основное внимание уделять тому, что мы хотим сделать, и меньше об-
ращать внимания на механизм того, как это делается.
Хороший способ изучить большую библиотеку, подобную scikitlearn, – это
мельком посмотреть каждую программу или объект, когда мы встречаем их
впер- вые часто используемыми в получаемых кодах справки или изучаем чьи-
либо чу- жие программы. Быстрый взгляд на выборы или умолчания может
помочь нам осознать, что эта программа способна выполнить. Позже, при
разработке другого проекта, чтото может пригодиться или чтолибо может
вернуть нас вновь к этой программе либо объекту.
Потом мы можем снова посмотреть документацию и прочитать ее более вни-
мательно. Таким путем мы можем постепенно узнать немного больше о широ-
те и глубине функциональных возможностей программ, когда найдем, что нам
самим надо их использовать. Это значительно проще, чем пытаться вспоминать
все, что знаем о каждом объекте или программе при первом обращении к ним.
Почти все объекты и программы в scikitlearn работают со множеством аргу-
ментов. Многие их них являются необязательными и принимают, если мы на них
не ссылаемся, тщательно отобранные величины по умолчанию. Для простоты
в этой главе мы будем использовать только обязательные аргументы, а все необя-
зательные аргументы оставлять по умолчанию.

15.4. оценщики
Все коды в этом разделе находятся в ноутбуке
Юпитера Scikit-Learn-Notebook-1-Estimators.ipynb
Мы используем оценщика scikitlearn для выполнения обучения с учителем. Мы
создаем объект и затем даем ему наши маркированные обучающие данные для
Оценщики  391

обучения. Мы можем позже дать нашему объекту новую выборку, которую он до


этого не видел, и он будет делать все возможное, чтобы предсказать правильную
маркировку.
Все оценщики имеют базовый набор общих программ и используемые
образцы. Как упоминалось ранее, каждый оценщик – отдельный объект в
объектно ориентированном смысле. Объект знает, как принять данные,
обучаться из них и затем описать данные, которые он не видел прежде, сохраняя
все, что будет необходимо вспомнить, в своих собственных образцах
переменных. Таким об- разом, общий процесс состоит в том, чтобы создать
объект и затем послать ему сообщения (то есть вызвать его встроенные
программы или методы), побуждая его к выполнению действий. Некоторые из
этих действий являются просто моди- фикацией внутреннего состояния
оценивающего объекта, в то время как другие
вычисляют результаты, возвращающиеся к нам.
На рис. 15.2 показано, к чему мы будем стремиться в этом разделе. Мы
начина- ем с группы точек и используем программу scikitlearn, чтобы найти
наилучшую прямую через нее.
Оригинальные данные Данные с наилучшей линией

Рис. 15.2  Соответствующая прямая линия,


созданная оценщиком scikit-learn

15.4.1. Создание объекта


Первым шагом является создание или конкретизация объекта оценки, часто
называемого оценщик. В качестве примера давайте конкретизируем оценщика,
названного Ridge из модуля linear_model. Объект Ridge – универсальный
оценщик для выполнения такого рода задач, и он включает встроенный
регуляризатор. Мы просто называем объект (придавая ему наименование
модуля) совместно с ар- гументом, который мы хотим или нам необходимо
обеспечить. Поскольку мы придерживаемся всех умолчаний, мы не будем
вводить никаких аргументов. Ли- стинг 15.4 демонстрирует код.
Листинг 15.4  Создание оценивающего объекта
from sklearn import linear_model
ridge_estimator = linear_model.Ridge()
После обозначений переменная ridge_estimator обращается к объекту,
который реализует Ridge регрессионный алгоритм. Когда мы используем
простейшую вер- сию оценщика с 2Dданными, как мы это делаем здесь,
находится лучшая прямая линия, проходящая через данные.
Все оценщики имеют две программы, называемые fit() и predict(). Мы
использу- ем их соответственно для обучения нашего оценщика и для оценки
новых данных.

15.4.2. Обучение с fit()


Первая программа, которую мы рассмотрим, называется fit(), и она
обеспечива- ется каждым оценщиком. Она принимает два обязательных
аргумента, содержа- щих выборки, которыми оценщик должен обучаться, и
ассоциирующиеся с ними величины (цели). Выборки обычно
систематизированы как большая NumRuре шетка (называемый массив, даже
если размерность большая), в которой каждый ряд содержит одну выборку.
Давайте посмотрим на пример генерации данных в правильном формате, что-
бы иметь представление о процессе. Мы создадим данные, показанные слева на
рис. 15.2.
В листинге 15.5 мы начинаем с ввода затравочных псевдослучайных величин
числового генератора NumPy и каждый раз получаем такие же величины
обратно. Это позволяет нам перезапускать код и генерировать такие же данные.
Затем мы устанавливаем число точек, которые хотим создать в num_pts. Мы
создаем наши данные, базирующиеся на отрезке синусоиды (кривая,
построенная в библиотеке math), и добавляем небольшой шум к каждой
величине. Затем мы запускаем цикл, прибавляя точки х и y к таблицам x_vals и
y_vals. Таблица x_vals содержит наши выборки, а таблица y_vals содержит
целевые величины для каждой соответствую щей выборки.
Листинг 15.5  Формирование данных для обучения
np.random.seed(42)
num_pts = 100
noise_range =
0.2 x_vals = []
y_vals = []
(x_left, x_right) = (2,
2) for i in
range(num_pts):
x = np.random.uniform(x_left, x_right)
y = np.random.uniform(noise_range, noise_range) + \
(2*math.sin(x))
x_vals.append(x)
y_vals.append(y)
Переменная x_vals содержит список. Однако оценщик Ridge (как и многие
дру- гие) хочет видеть входные данные из решетки 2D, где каждый вход – это
список характеристик в каждом его ряду. Поскольку мы имеем только одну
характерис тику, мы можем, чтобы преобразовать x_vals в столбец,
использовать NumPy про- грамму reshape(). Листинг 15.6 показывает этот шаг.
Листинг 15.6  Переформатирование наших данных x_vals в столбец
x_column = np.reshape(x_vals, [len(x_vals), 1])
Теперь, когда мы имеем наши данные в форме, ожидаемой нашим объектом
Ridge, мы вводим их и просим найти прямую линию через точки. Первый
аргумент дает выборки, а второй аргумент содержит и дает маркировки,
ассоциированные с этими выборками. В этом случае первый аргумент содержит
координаты Х каж- дой точки, а второй – координаты Y. Мы можем, если хотим,
преобразовать также и второй аргумент в столбец, но fit() без вопросов примет
аргумент как 1Dсписок.
Листинг 15.7  Мы обучаем оценщика, вызывая fit() метод
с обучающими данными в качестве аргумента
ridge_estimator.fit(x_column, y_vals)
Программа fit() анализирует входные данные и сохраняет их результаты
внут ри объекта Ridge. Мы можем представить fit() как «анализ этих данных и
сохране- ние результата таким образом, что вы сможете ответить на будущие
вопросы по этим и родственным данным».
Концептуально мы можем сравнить fit() с портным, который начинает с ру-
лона материи, затем после встречи с заказчиком и его обмера кроит, шьет и под-
гоняет (fit) одежду под заказчика. Подобным образом fit() вычисляет данные,
которые подходят для этих конкретных данных, и сохраняет их внутри
оценщика. Если мы вызовем fit() объекта снова с другим набором обучающих
выборок, он начнет все снова и построит новый набор внутренних данных, чтобы
соответство- вать этому новому входу. Все это происходит внутри объекта, так что
программа fit() не возвращает ничего нового (для удобства она возвращает
справку объекту, если он вызовет ее). Поэтому в нашем случае он просто
возвращает тот же ridge_ estimator, который только что использовали, чтобы
вызвать сам fit().
Значит, мы можем создать много оценивающих объектов и иметь их все одно-
временно. Мы можем обучать их и затем сравнивать результаты, или мы можем
сделать несколько экземпляров одного и того же оценщика и тренировать его
различными множествами данных. Ключевым фактором является то, что
каждый объект является независимым от других, содержащих иные параметры,
необхо- димые для ответа на вопросы о данных, которые ему поступили.
Наша программа, таким образом, компилирует все с листинга 15.4 на лис тинг
15.7.

15.4.3. Предсказание с predict()


После того как мы обучили нашего оценщика, мы можем попросить его оценить
новую выборку с predict(). Это потребует, по крайней мере, один аргумент, содер-
жащий новые выборки, для которых мы хотим, чтобы оценщик присвоил значения.
Программа возвращает информацию, описывающую новые данные. Обычно это
таб лица NumPy, которая содержит или одно число, или один класс на каждую
выборку. Давайте возьмем левый и правый края линии, которую наш оценщик
согласо- вал с нашими данными. Мы будем вводить в оценщика положение
левого края данных (которым мы выше присвоили –2) и получим обратно
величину y. Проде- лаем то же самое с правой конечной точкой. Листинг 15.8
показывает эти вызовы.
Листинг 15.8  Получение величин y прямой линии для двух величин х
y_left = ridge_estimator.predict(x_left)
y_right = ridge_estimator.predict(x_right
Давайте совместим все это. Мы импортируем все, что нам необходимо, созда-
дим данные, создадим оценщика, согласуем данные и получим левые и правые
величины Y линии, пересекающей данные. Мы просто объединяем листинги от
15.4 до 15.8. Чтобы сократить листинг, мы поместили вместо шага генерации
дан- ных листинга 15.5 комментарий.
Листинг15.9 показывает код.
Листинг 15.9  Использование объекта Ridge для согласования некоторых 2D-данных
import numpy as
np import math
from sklearn.linear_model import Ridge
# На месте этого комментария создайте данные
# Сохраните данные в виде колонки
# как х столбец и целевые величины как y_vals
# Создайте нашего оценщика
ridge_estimator = Ridge()
# вызовите fit(), получите наилучшую прямую линию, соответствующую нашим данным
ridge_estimator.fit(x_column, y_vals)
# Найдите величины y на левом и правом краях наших данных
y_left = ridge_estimator.predict(x_left)
y_right = ridge_estimator.predict(x_right)
Рисунок 15.3 повторяет рис. 15.2, показывая результаты листинга 15.9, после
того как мы добавили несколько строк кода, чтобы создать график. Мы просто
на- несли все точки данных и затем провели красную линию от точки (x_left,
y_left) до точки (x_right, y_right), где мы установили x_left и y_left, когда
создавали дан- ные.
Оригинальные данные Данные с наилучшей линией

Рис. 15.3  Прямая линия, созданная Ridge для 2D-данных


с использованием кода листинга 15.9

Мы оставили детали графика кодам в ноутбуках. Информацию об использова-


нии matplotlib можно найти онлайн непосредственно в документации
библиотеки или печатных справочных материалах [VanderPlas16].
Кластеризация  395

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

15.4.4. Функции decision_function(), predict_proba()


Мы только что видели, как использовать оценщика для решения задачи
регрессии. Процедура решения задачи классификации с использованием
оценщика клас-
сификации очень похожа.
Для классификатора функция predict() дает нам в качестве результата одну
ка- тегорию. Но иногда мы хотим знать, как «близко» выборки могут быть
классифи- цированы в каждом из других классов. Например, классификатор
может решить, что на данной фотографии с вероятностью 49 % изображен тигр,
но с вероятно- стью 48 % – леопард (с 3%ной вероятностью это могут быть другие
типы кошек). Пусть функция predict() скажет нам, что на фотографии леопард,
но мы могли бы хотеть знать, насколько близко тигр был вторым.
Для этой ситуации, где нас беспокоят вероятности нашего выхода относитель-
но всех возможных классов, многие классификаторы предлагают некоторые до-
полнительные опции.
Функция decision_function() принимает множество выборок на входе и воз-
вращает «доверительную» оценку для каждого класса и каждого входа, в которой
бóльшая величина предполагает большее доверие. Заметим, что существует
веро- ятность, что большую оценку будут иметь многие категории.
В противоположность этому функция predict_proba() возвращает для
каждого класса вероятности. В отличие от decision_function(), все вероятности
для каж- дой выборки в сумме дают 1. Это часто делает выход predict_proba()
проще для понимания при первом рассмотрении, чем выход
decision_function(). Это также означает, что мы можем использовать выход
predict_proba() как функцию вероят- ностного распределения, что иногда
удобно, если делается дополнительный ана- лиз результатов.
Хотя все классификаторы предусматривают fit(), не все они предлагают
также одну или обе эти другие программы. Как всегда, APIдокументация для
каждого классификатора говорит нам, что он поддерживает.

15.5. кластеризация
Все коды в этом разделе находятся в ноутбуке
Юпитера Scikit-Learn-Notebook-2-Clusters.ipynb
Кластеризация является техникой обучения без учителя, в которой даем
алгорит- му пакет выборок и он делает все возможное для создания групп из
одинаковых выборок этого пакета.
Нашими входными данными будет пакет 2Dточек без какойлибо другой ин-
формации.
В библиотеке scikitlearn большой выбор алгоритмов кластеризации. Давайте
используем алгоритм k-means, который очень похож на тот, который
упоминался в обзоре главы 7. Величина k говорит алгоритму, как много
кластеров построить (хотя в программе он назван как аргумент n_clusters для
числа кластеров, а не короче и более эффектно одной буквой k).
Мы начнем с создания объекта KMeans. Чтобы получить к нему доступ, нам
необходимо импортировать его из его модуля sklearn.cluster. Когда мы создаем
объект, то можем сообщить ему, как много кластеров мы хотели бы, чтобы он по-
строил, когда мы представим ему данные. Этот аргумент называется n_clusters,
по умолчанию равен 8, если мы не задаем собственную величину. Листинг 15.10
показывает этот шаг, включая указание для числа кластеров.
Листинг 15.10  Импорт KMeans и создание образца
from sklearn.cluster import KMeans
num_clusters = 5
kMeans = KMeans(n_clusters=num_clusters)
Алгоритмы кластеризации часто используются с данными, которые имеют
много размерностей (или характеристик), возможно, дюжины или сотни. Но мы
при создании нашего объекта кластеризации не должны сообщать, сколько ха-
рактеристик будем использовать, потому что эта информация будет поступать
из самих данных, когда потом мы представим их через вызов fit().
Как обычно, давайте использовать 2 измерения (то есть 2 характеристики на
выборку), что позволит нам изображать наши данные и показывать результаты.
В качестве нашего набора данных мы создадим семь гауссовых распределений
и выберем точки случайным образом из каждого из них. Рисунок 15.4 показывает
результат.
Оригинальные данные Оригинальные данные,
показывающие 7 кластеров

Рис. 15.4  Данные, которые мы будем использовать для кластеризации. Слева:


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

Мы также показываем данные, кодированные цветом, полученные из распре-


деления Гаусса, но это только для человеческих глаз, а компьютер видит лишь
список величин Х и Y.
Вспомним, что мы вводим только черные точки из рис. 15.4, так что алгоритм
ничего не знает об этих точках, кроме их расположения. Как и прежде, мы фор-
мируем наши данные в виде таблицы NumPy, представляющей собой большой
столбец, в котором каждый ряд имеет две размерности или характеристики: ве-
личины точек этого ряда Х и Y. Мы будем называть эти данные XY_points. Чтобы
построить кластеры из этих данных, мы должны просто ввести их в программу
fit() нашего объекта. Листинг 15.11 показывает код.
Листинг 15.11  Мы вводим эти данные в KMeans, и он будет вырабатывать номера кластеров,
которые мы запросили, когда создавали объект
kMeans.fit(XY_points)
Как только fit() возвращает результат, кластеризация выполнена. Чтобы ви
зуализировать то, как он разделил наши начальные данные, запускаем те же
данные снова и просим предсказать кластер для каждой выборки. Мы будем ис-
пользовать predict() метод с теми же данными, которые мы использовали для
со- гласования в листинге 15.12.
Листинг 15.12  Мы можем найти предсказанный кластер для наших оригинальных данных,
введя его в predict()
predictions = kMeans.predict(XY_points)
Переменная predictions – это таблица NumPy, которая сформирована как
стол- бец. То есть он имеет один ряд для каждой точки на входе, и каждый ряд
имеет одну величину: целое число, сообщающее нам, какой кластер программа
опреде- лила как соответствующий точке в нашем входе XY_points. Например,
пятый ряд XY_points содержит Х и Yвеличины точек, и пятый ряд predictions
содержит целое число, говорящее нам, к какому кластеру была приписана эта
точка. Давайте за- пустим данный процесс для пакета разных номеров кластеров.
Процесс (без кодов графики) представлен в листинге 15.13.
Листинг 15.13  Тестирование интервала различных номеров кластеров
for num_clusters in range(2, 10):
kMeans = KMeans(n_clusters=num_clusters)
kMeans.fit(XY_points)
predictions = kMeans.predict(XY_points)
# plot the XY_points and predictions
Результаты приведены на рис. 15.5.
Визуально дела начинаются налаживаться, начиная примерно с пяти
кластеров. Поскольку мы используем перекрывающиеся гауссовы распределения
при созда- нии набора данных, группы не все чисто распределены. Однако
начиная с пяти кластеров можно видеть, что в самой верхней части и крайней
правой части иден- тификация неплохая, с начинающей разделяться на
небольшие области основной массой. Начиная с девяти кластеров эти внешние
группы начинают похоже сами разделяться. Таким образом, гдето между 5 и 8
кластерами – наилучший выбор, который является удовлетворительным
результатом, зная, что мы начинали с 7 пересекающихся распределений Гаусса.
Библиотека Scikitlearn предлагает много программ кластеризации, потому что
проблема решается ими различными способами и они создают различные
кластеры. Алгоритмы кластеризации – хороший способ получить представление
о пространственном распределении наших данных. Недостатком кластеризации
является необходимость выбора количества кластеров. Существуют алгоритмы,
которые пытаются выбрать для нас лучшее количество кластеров [Kassambara17],
но часто мы должны, посмотрев на результаты, сами решить, имеет ли смысл их
использовать.
2 кластера
3 кластера 4 кластера

5 кластеров 6 кластеров 7 кластеров

8 кластеров 9 кластеров 10 кластеров

Рис. 15.5  Алгоритм KMeans кластеризации наших начальных данных из


рис. 15.4 в различные номера кластеров. Каждый кластер показан в другом цвете.
Помним, что наши данные сгенерированы из 7 распределений Гаусса

15.6. преобразователи
Все коды в этом разделе находятся в ноутбуке
Юпитера Scikit-Learn-Notebook-3-Transformation.ipynb
Как мы обсуждали в главе 12, большую часть времени мы тратим на то, чтобы
преобразовать или изменить наши данные, прежде чем мы начнем использовать
их. Мы должны убедиться, что данные, которые мы введем в алгоритмы, соот-
ветствуют их ожиданиям. Например, многие методы работают лучше, если они
получают данные, в которых все характеристики центрированы на 0 и приведены
к масштабу в пределах [–1, 1].
Преобразователи  399

Библиотека Scikitlearn предлагает широкий диапазон объектов, называемых


преобразователями, которые выполняют многие преобразования данных раз-
личного рода. Все программы библиотеки совместимы с массивами NumPy, со-
держащими данные выборок, и возвращают преобразованные массивы.
Обычно мы выбираем преобразования применительно к оценщику, в который
мы в конечном счете вводим данные. Все оценщики, которым требуются данные в
кон- кретной форме, дают эту информацию в своей документации, но это наша
задача – корректно выполнить все преобразования, которые они предлагают или
требуют.
Вспомним из главы 12, что при проведении обучения преобразованными дан-
ными существенно, чтобы данные, используемые в дальнейшем, подверглись
таким же преобразованиям. Чтобы помочь нам в этом, каждый преобразователь
предлагает различные программы для создания объектов преобразования, ана-
лизирующих данные, чтобы найти параметры для выполнения преобразования.
Мы создаем объект так же, как мы создавали объекты ранее, вызовом програм-
мы с любыми аргументами, которые мы хотим ввести.
Чтобы найти параметры для конкретного преобразования, мы вызываем fit()
метод так же, как мы это делали для оценщика. Мы вводим в fit() наши
данные, и объект анализирует их и определяет параметры для преобразования,
выполняе мые данным объектом. Затем мы проводим преобразование данных
методом transform(), который принимает набор данных и возвращает
преобразованную версию. В последующем всякий раз, когда мы используем
данные для обученной модели, будь то оригинальные данные, или тестовые
данные, или даже новые данные, поступившие в процессе реализации, мы
первым делом пропускаем их через метод объекта transform().
Обратите внимание, насколько хорошо инкапсулируется эта необходимость
со- хранения преобразования. Наш объект вначале один раз узнает, что
необходимо делать, когда мы вызываем fit(), и затем такое же преобразование
будет приме- нять к любым данным, которые будут использоваться в
дальнейшем.
Рисунок 15.6 иллюстрирует идею.

Обучающие
данные fit()

transform() Обучаемый
Новые
данные
Преобразователь
масштаба

Рис. 15.6  Использование масштабированного преобразования для модифика-


ции наших данных перед обучением. После создания масштабирующего преоб-
разователя мы вводим в него обучающие данные, вызывая fit(). Преобразова-
тель масштаба анализирует данные и определяет масштаб преобразования. Затем
обучающие данные преобразуется с помощью transform() и обучает ими нашего
оценщика. С этих пор и далее все новые данные, которые мы хотим использовать,
также проходят масштабирование программой объекта transform()