Машинное обучение на R: экспертные техники для прогностического анализа

imageПривет, Хаброжители! Язык R предлагает мощный набор методов машинного обучения, позволяющих быстро проводить нетривиальный анализ ваших данных. Книга является руководством, которое поможет применять методы машинного обучения в решении ежедневных задач. Бретт Ланц научит всему необходимому для анализа данных, формирования прогнозов и визуализации данных. Здесь вы найдете информацию о новых улучшенных библиотеках, советы об этических аспектах машинного обучения и проблемах предвзятости, а также познакомитесь с глубоким обучением.

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

Для кого предназначена книга


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

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

Глава 2 «Управление данными и их интерпретация» даст вам возможность полностью погрузиться в работу с данными в среде R. Здесь речь пойдет об основных структурах данных и процедурах, используемых для загрузки, исследования и интерпретации данных.

Глава 3 «Ленивое обучение: классификация с использованием метода ближайших соседей» научит вас понимать и применять простой, но мощный алгоритм машинного обучения для решения вашей первой практической задачи: выявления особо опасных видов рака.

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

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

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

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

Глава 8 «Обнаружение закономерностей: анализ потребительской корзины с помощью ассоциативных правил» объясняет алгоритм, используемый в рекомендательных системах, применяемых во многих компаниях розничной торговли. Если вы когда-нибудь задумывались о том, почему системы розничных продаж знают ваши покупательские привычки лучше, чем вы сами, то эта глава раскроет их секреты.

Глава 9 «Поиск групп данных: кластеризация методом k-средних» посвящена процедуре поиска кластеров связанных элементов. Мы воспользуемся этим алгоритмом для идентификации профилей в онлайн-сообществе.

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

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

Глава 12 «Специальные разделы машинного обучения» исследует границы машинного обучения: от обработки больших данных до ускорения работы R. Прочитав ее, вы откроете для себя новые горизонты и узнаете, что еще можно делать с помощью R.

Пример: моделирование прочности бетона с помощью нейронной сети


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

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

Шаг 1. Сбор данных


Для этого анализа мы будем использовать данные о прочности бетона на сжатие, переданные Ай-Ченг Йе (I-Cheng Yeh) в репозиторий данных для машинного обучения UCI Machine Learning Repository (http://archive.ics.uci.edu/ml). Поскольку Ай-Ченг Йе успешно использовал нейронные сети для моделирования этих данных, мы попытаемся воспроизвести его работу, применив простую модель нейронной сети в среде R.

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

Для того чтобы выполнить этот пример, загрузите файл concrete.csv и сохраните его в рабочем каталоге R.


Шаг 2. Исследование и подготовка данных


Как обычно, начнем анализ с загрузки данных в R-объект с помощью функции read.csv () и убедимся, что результат соответствует ожидаемой структуре:

> concrete <- read.csv("concrete.csv")
> str(concrete)
'data.frame':        1030 obs. of 9 variables:
$ cement       : num 141 169 250 266 155 ...
$ slag            : num 212 42.2 0 114 183.4 ...
$ ash             : num 0 124.3 95.7 0 0 ...
$ water          : num 204 158 187 228 193 ...
$ superplastic : num 0 10.8 5.5 0 9.1 0 0 6.4 0 9 ...
$ coarseagg    : num 972 1081 957 932 1047 ...
$ fineagg        : num 748 796 861 670 697 ...
$ age             : int 28 14 28 28 28 90 7 56 28 28 ...
$ strength      : num 29.9 23.5 29.2 45.9 18.3 ...


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

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

В главе 3 мы создали собственную функцию normalize ():

> normalize <- function(x) {
       return((x - min(x)) / (max(x) — min(x)))
}


После того как будет выполнен этот код, можно применить функцию normalize () ко всем столбцам выбранного фрейма данных с помощью функции lapply ():

> concrete_norm <- as.data.frame(lapply(concrete, normalize))

Чтобы убедиться, что нормализация сработала, можно проверить, равны ли минимальное и максимальное значения признака strength 0 и 1 соответственно:

> summary(concrete_norm$strength)
       Min.     1st Qu.         Median     Mean      3rd Qu.      Max.
   0.0000     0.2664         0.4001  0.4172      0.5457   1.0000


Для сравнения: исходные минимальное и максимальное значения этого признака были равны 2.33 и 82.60 соответственно:

> summary(concrete$strength)
     Min.       1st Qu.     Median       Mean      3rd Qu.       Max.
    2.33         23.71       34.44      35.82        46.14      82.60


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


Следуя сценарию, описанному Йе в исходной статье, разделим данные на тренировочный набор, включающий в себя 75% всех примеров, и тестовый набор, состоящий из 25%. Используемый CSV-файл отсортирован в случайном порядке, поэтому нам остается лишь разделить его на две части:

> concrete_train <- concrete_norm[1:773, ]
> concrete_test <- concrete_norm[774:1030, ]

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

Шаг 3. Обучение модели на данных


Чтобы смоделировать взаимосвязь между ингредиентами, используемыми в производстве бетона, и прочностью готового продукта, построим многослойную нейронную сеть прямого распространения. Пакет neuralnet, разработанный Стефаном Фритчем (Stefan Fritsch) и Фрауке Гюнтер (Frauke Guenther), обеспечивает стандартную и простую в использовании реализацию таких сетей. В этот пакет также входит функция для построения топологии сети. Реализация neuralnet — хороший способ получить дополнительную информацию о нейронных сетях, хотя это не означает, что ее нельзя использовать и для выполнения реальной работы — как вы скоро убедитесь, это довольно мощный инструмент.

В R есть еще несколько пакетов, обычно используемых для обучения моделей нейронных сетей, каждый из которых имеет свои достоинства и недостатки. Поскольку nnet поставляется в составе стандартного комплекта R, он является, пожалуй, наиболее часто упоминаемой реализацией нейронных сетей. В пакете использован немного более сложный алгоритм, чем стандартный метод обратного распространения ошибки. Еще один вариант — пакет RSNNS, содержащий полный набор функций для нейронной сети, но его недостатком является то, что этот пакет труднее освоить.


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

Синтаксис нейронной сети


Использование функции neuralnet () из пакета neuralnet

Построение модели:

m <- neuralnet(target ~ predictors, data = mydata,
                       hidden = 1, act.fct = "logistic")


• target — модель, которая будет построена в результате обучения на фрейме данных mydata;

• predictors — R-формула, определяющая признаки из фрейма данных mydata, которые будут использоваться при прогнозировании;

• data — фрейм данных, которому принадлежат target и predictors;

• hidden — количество нейронов в скрытом слое (по умолчанию 1). Примечание: для описания нескольких скрытых слоев используется вектор целых чисел, например c (2, 2);

• act.fct — функция активации: «logistic» или «tanh». Примечание: также может быть использована любая другая дифференцируемая функция.

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

Прогнозирование:

p < — compute(m, test)

• m — модель, обученная с помощью функции neuralnet ();

• test — фрейм данных, содержащий тестовые данные с теми же признаками, что и у тренировочных данных, использованных для построения классификатора.

Функция возвращает список, состоящий из двух компонентов: $neurons, где хранятся нейроны для каждого слоя сети, и $net.result, где хранятся значения, спрогнозированные с помощью данной модели.

Примеры:

concrete_model <- neuralnet(strength ~ cement + slag + ash,
      data = concrete, hidden = c(5, 5), act.fct = "tanh")
model_results <- compute(concrete_model, concrete_data)
strength_predictions <- model_results$net.result


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

> concrete_model <- neuralnet(strength ~ cement + slag
         + ash + water + superplastic + coarseagg + fineagg + age,
         data = concrete_train)


Затем, как показано на рис. 7.11, можно визуализировать топологию сети, используя функцию plot () и передав ей полученный в результате объект модели:

> plot(concrete_model)

image


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

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


В нижней части рисунка отображаются количество шагов обучения и величина ошибки — суммарная среднеквадратичная ошибка (Sum of Squared Errors, SSE), которая, как и следовало ожидать, является суммой квадратов разностей между прогнозируемыми и фактическими значениями. Чем меньше SSE, тем точнее модель соответствует тренировочным данным, что свидетельствует об эффективности этих данных, но мало говорит о том, как модель будет работать с неизвестными данными.

Шаг 4. Оценка эффективности модели


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

> model_results <- compute(concrete_model, concrete_test[1:8])

Функция compute () работает немного иначе, чем использованные нами до сих пор функции predict (). Она возвращает список, состоящий из двух компонентов: $neurons, где хранятся нейроны для каждого слоя сети, и $net.result, где хранятся спрогнозированные значения. Именно $net.result нам и нужен:

> predicted_strength <- model_results$net.result

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

Напомню, что для получения корреляции между двумя числовыми векторами используется функция cor ():

> cor(predicted_strength, concrete_test$strength)
                    [,1]
[1,] 0.8064655576


Не пугайтесь, если ваш результат отличается от нашего. Поскольку нейронная сеть начинает работу со случайных весов, приведенные в книге прогнозы могут быть разными для разных моделей. Если вы хотите точно сопоставить результаты, попробуйте выполнить команду set.seed (12345), перед тем как начать построение нейронной сети.


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

Шаг 5. Повышение эффективности модели


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

> concrete_model2 <- neuralnet(strength ~ cement + slag +
                                               ash + water + superplastic +
                                               coarseagg + fineagg + age,
                                               data = concrete_train, hidden = 5)


Снова построив диаграмму сети (рис. 7.12), мы увидим резкое увеличение количества связей. Как это повлияло на эффективность?

> plot(concrete_model2)

Обратите внимание, что полученная ошибка (снова измеренная как SSE) уменьшилась с 5,08 в предыдущей модели до 1,63. Кроме того, количество этапов обучения возросло с 4882 до 86 849 — что неудивительно, учитывая, насколько усложнилась модель. Чем сложнее сеть, тем больше требуется итераций, чтобы найти оптимальные веса.

Применив те же шаги для сравнения прогнозируемых значений с истинными, мы получим корреляцию около 0,92, что намного лучше по сравнению с предыдущим результатом 0,80 для сети с одним скрытым узлом:

> model_results2 <- compute(concrete_model2, concrete_test[1:8])
> predicted_strength2 <- model_results2$net.result
> cor(predicted_strength2, concrete_test$strength)
                  [,1]
[1,] 0.9244533426


image


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

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

В последнее время очень популярной стала функция активации, называемая ректификационной функцией, или ректификатором, — благодаря ее успешному применению в сложных задачах, таких как распознавание изображений. Узел нейронной сети, в котором в качестве функции активации используется ректификатор, называется линейным выпрямителем (Rectified Linear Unit, ReLU). Как показано на рис. 7.13, функция активации типа «ректификатор» описана так, что возвращает x, если x больше или равен 0, и 0 — в противном случае. Важность этой функции в том, что она, с одной стороны, нелинейная, а с другой — имеет простые математические свойства, которые делают ее недорогой в вычислительном отношении и высокоэффективной для градиентного спуска. К сожалению, при x = 0 производная ректификатора не определена, поэтому ректификатор нельзя использовать в сочетании с функцией neuralnet ().

Вместо этого можно использовать сглаженную аппроксимацию ReLU, которая называется softplus или SmoothReLU, — функцию активации, определенную как log (1 + ex). Как показано на рис. 7.13, функция softplus близка к нулю для значений x меньше 0 и приблизительно равна x для x больше 0.

image


Чтобы определить функцию softplus () в R, воспользуемся следующим кодом:

> softplus <- function(x) { log(1 + exp(x)) }

Такую функцию активации можно предоставить на вход neuralnet () с помощью параметра act.fct. Кроме того, добавим второй скрытый слой, состоящий из пяти узлов, присвоив параметру hidden значение целочисленного вектора c (5, 5). В результате получим двухслойную сеть, каждый из слоев которой имеет пять узлов, и все они используют функцию активации softplus:

> set.seed(12345)
> concrete_model3 <- neuralnet(strength ~ cement + slag +
                                               ash + water + superplastic +
                                               coarseagg + fineagg + age,
                                               data = concrete_train,
                                               hidden = c(5, 5),
                                               act.fct = softplus)


Как и прежде, сеть можно визуализировать (рис. 7.14):

> plot(concrete_model3)

image


Корреляцию между прогнозируемой и фактической прочностью бетона можно рассчитать следующим образом:

> model_results3 <- compute(concrete_model3, concrete_test[1:8])
> predicted_strength3 <- model_results3$net.result
> cor(predicted_strength3, concrete_test$strength)
                  [,1]
[1,] 0.9348395359


Корреляция между прогнозируемой и фактической прочностью составила 0,935, что является лучшим из полученных до сих пор показателей. Интересно, что в оригинальной публикации Йе сообщил о корреляции 0,885. Это означает, что, приложив относительно небольшие усилия, мы смогли получить сопоставимый результат и даже превзойти результаты работы эксперта в данной области. Правда, результаты Йе были опубликованы в 1998 году, что дало нам фору более чем 20 лет дополнительных исследований в области нейронных сетей!

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

> strengths <- data.frame(
      actual = concrete$strength[774:1030],
      pred = predicted_strength3
   )
> head(strengths, n = 3)
      actual        pred
774 30.14 0.2860639091
775 44.40 0.4777304648
776 24.50 0.2840964250

Исследуя корреляцию, мы видим, что выбор нормализованных или ненормализованных данных не влияет на вычисленную статистику эффективности — точно так же, как и раньше, корреляция составляет 0,935:

> cor(strengths$pred, strengths$actual)
[1] 0.9348395359

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

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

> unnormalize <- function(x) {
     return((x * (max(concrete$strength)) -
           min(concrete$strength)) + min(concrete$strength))
   }


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

> strengths$pred_new <- unnormalize(strengths$pred)
> strengths$error <- strengths$pred_new — strengths$actual
> head(strengths, n = 3)
           actual                pred             pred_new                    error
774          30.14         0.2860639091               23.62887889      -6.511121108
775          44.40         0.4777304648               39.46053639      -4.939463608
776          24.50         0.2840964250               23.46636470      -1.033635298

> cor(strengths$pred_new, strengths$actual)
[1] 0.9348395359


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

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

Подобно тому как это часто бывает в жизни, в ML можно обменять время на деньги. Использование платных ресурсов облачных вычислений, таких как Amazon Web Services (AWS) и Microsoft Azure, позволяет строить более сложные модели или быстрее тестировать многие модели. Подробнее об этом читайте в главе 12.


Метод опорных векторов


Метод опорных векторов (Support Vector Machine, SVM) можно представить как поверхность, которая образует границу между точками данных, нанесенными на график в многомерном пространстве, описывающем примеры и значения их признаков. Цель SVM состоит в том, чтобы построить плоскую границу — гиперплоскость, которая бы делила пространство таким образом, чтобы по обеим ее сторонам образовались однородные группы. Таким образом, в обучении SVM сочетаются аспекты как обучения методом ближайших соседей на основе экземпляров, описанного в главе 3, так и моделирования методом линейной регрессии, рассмотренного в главе 6. Это чрезвычайно мощное сочетание, позволяющее SVM моделировать очень сложные взаимосвязи.

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

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

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

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

Об авторе


Бретт Ланц (Brett Lantz, @DataSpelunking) более десяти лет использует инновационные методы обработки данных для изучения поведения человека. Будучи по образованию социологом, Бретт впервые увлекся машинным обучением во время исследования большой базы профилей подростков в социальных сетях. Бретт — преподаватель DataCamp и часто выступает с докладами на конференциях и семинарах по машинному обучению по всему миру. Он известный энтузиаст в сфере практического применения науки о данных в области спорта, беспилотных транспортных средств, изучения иностранных языков и моды, а также во многих других отраслях. Бретт надеется в один прекрасный день написать обо всем этом на сайте dataspelunking.com, посвященном обмену знаниями о поиске закономерностей в данных.

О научном редакторе


Рагхав Бали (Raghav Bali) — старший научный сотрудник одной из крупнейших в мире организаций здравоохранения. Занимается исследованиями и разработкой корпоративных решений, основанных на машинном обучении, глубоком обучении и обработке естественного языка для использования в области здравоохранения и страхования. На своей предыдущей должности в Intel он участвовал в реализации проактивных инициатив в области информационных технологий, основанных на больших данных, с использованием обработки естественного языка, глубокого обучения и традиционных статистических методов. В American Express работал в области цифрового взаимодействия и удержания клиентов.

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

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

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — Машинное обучение

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

© Habrahabr.ru