Введение в аналитику больших массивов данных

Решение задач Data Mining. R и Hadoop

В лекции рассматриваются ключевые методы интеллектуального анализа данных на языке R. Изложение строится от простого к сложному: сначала разбирается логика построения деревьев решений и случайного леса для задач классификации, затем — принципы регрессионного анализа для прогнозирования. Далее демонстрируется работа алгоритма кластеризации K-means при отсутствии целевых переменных. Завершается материал практическим примером организации распределенных вычислений через парадигму MapReduce. Основной акцент сделан на практическом применении функций и пакетов R.

Основные мысли

В результате изучения лекции слушатель будет способен:
1. Объяснить разницу между обучением с учителем (классификация, регрессия) и без учителя (кластеризация).
2. Подготавливать данные (создание обучающей и тестовой выборок) с помощью логического индексирования.
3. Строить и интерпретировать модели деревьев решений с использованием пакета party.
4. Оценивать качество моделей классификации с помощью таблиц ошибок (матриц неточностей).
5. Формулировать зависимости переменных в виде формул, используя операторы «плюс», «минус» и «тильда с точкой».
6. Применять алгоритм Random Forest (randomForest) для повышения точности предсказаний.
7. Рассчитывать коэффициенты корреляции между переменными.
8. Строить модели линейной регрессии и выполнять прогнозирование новых значений на их основе.
9. Выполнять кластеризацию данных методом K-means и визуализировать её результаты.
10. Понимать базовые принципы распределенной обработки данных в парадигме MapReduce.
Показывать лекцию целиком
Краткое изложение

Презентацию к лекции 16 Вы можете скачать здесь.

Классификация

Рассмотрим примеры алгоритмов классификации на основе Decision Tree (дерева решений, пакет party).

Исходные данные

Познакомимся с данными. Используем стандартный набор данных iris, поставляемый вместе с R. Он содержит информацию о радужной оболочке глаза. В нем записаны четыре измерительные величины (numeric) и одна целевая (номинальная). Имена признаков можно посмотреть функцией names() для data frame, а значения номинального признака — функцией attributes(). В графе Levels показаны возможные классы (виды ирисов).

Подготовка выборок

Реализуем кросс-валидацию (cross-validation). Подготовим две выборки: обучающую и тестовую. Для этого используем функцию sample(), которая создаст вектор из единиц и двоек: единицы встречаются с вероятностью 70%, двойки — 30%. Используем логическое индексирование (фильтрацию по этому вектору). Если на индексе стоит 1 — отправляем элемент в train.data, если 2 — в test.data.

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

Для использования алгоритма Decision Tree подключаем сторонний модуль party. Формула определяет целевой признак и то, от каких признаков он зависит. Целевым является номинальный признак (класс ириса), он зависит от всех других признаков таблицы.

  • Чтобы добавить признак — используем оператор +.
  • Чтобы убрать признак — используем оператор -.

Строим модель, передавая функции ctree() формулу и обучающие данные (train.data).

Применение модели

Чтобы применить модель, используем функцию predict(). Модель уже обучена на train.data. Применим её к обучающим данным и построим матрицу ошибок (confusion matrix). Мы видим три ошибки на предсказании. Особенность Decision Tree в том, что алгоритм может ошибаться даже на обучающей выборке, на которой учился. Теперь применим алгоритм к тестовым данным. Вызовем predict() с параметром new.data и передадим туда test.data. Снова построим таблицу ошибок.

Визуализация

Дерево решений полезно визуализировать, чтобы лучше понять результат. В идеальном случае в каждом «прямоугольнике» (листе дерева) должен содержаться только один класс. Если в листе есть элементы из двух классов, возникают ошибки распознавания. Чтобы получить более компактную визуализацию, можно передать параметру type значение simple.

Random Forest

Следующий алгоритм — Random Forest (случайный лес). Очень распространенный алгоритм. Здесь используется оператор ~ (тильда) с точкой. Это означает, что целевой признак зависит от всех параметров таблицы автоматически. Если нужно удалить признак, используем оператор -. У функции появляются дополнительные параметры, такие как ntree — количество деревьев в лесу. Выполняем predict() и строим таблицу ошибок. Получить статистическую сводку можно функцией print(randomForest.model) или просто ввести имя модели в консоли. Распечатается информация о запуске и значение ошибок в процентах (OOB estimate of error rate). Алгоритм также реализован в пакете party. Отличие в том, что используется параметр control, где количество деревьев передается в специфическом виде (cforest_control). В остальном работа не отличается.

Пакеты для оценки качества

Отдельно стоит выделить пакет ROCR для оценки качества работы алгоритмов классификации (построение ROC-кривых).

Регрессия

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

Подготовка данных

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

Корреляция

Проверим это с помощью стандартной функции cor().

  • Корреляция «год — инфляция» высокая.
  • Корреляция «квартал — инфляция» отсутствует, так как кварталы циклически повторяются в каждом году.

Линейная модель

Строим линейную модель (lm()). Формула указывает, что уровень инфляции зависит от года и квартала. С помощью функции print() можно получить коэффициенты модели. Функция summary() раскрывает статистику подробнее: остатки (residuals), коэффициенты, стандартные отклонения, ошибку. Все отклонения можно посмотреть функцией residuals().

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

Так же, как и с алгоритмами классификации, к линейной модели можно применить функцию predict(). Подготовим данные для новых четырех кварталов (еще одного года) и используем predict() с параметром new.data. Выведем на графике старые данные и новые. Красными точками обозначены предсказанные значения уровня инфляции на будущий период.

Кластеризация

Рассмотрим известный алгоритм кластеризации K-means (метод k-средних), который используется повсеместно.

Подготовка

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

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

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

Визуализация

Визуализируем результат функцией plot(). Выбираем из датасета срез по двум признакам. Закрашиваем точки в зависимости от предсказанного кластера (параметр col присваиваем значению cluster). Далее распечатываем координаты центров кластеров (параметр centers) и наносим их на график. Видно, что один класс отделился хорошо, а два других в этих координатах наложились друг на друга.

Популярные пакеты

Наиболее распространенные пакеты и функции для кластеризации: cluster, fpc, mclust и другие (на слайде функции указаны в скобках).

MapReduce

Приведем пример взаимодействия R с Hadoop. Для работы в парадигме MapReduce понадобятся два пакета:

  • RHadoop (состоит из трех частей: rmr2 — интерфейс MapReduce, rhdfs — взаимодействие с файловой системой HDFS, rhbase — взаимодействие с БД HBase).
  • RHive (если нужно взаимодействовать с Apache Hive).

Пример: подсчет слов

Классический пример — подсчет количества слов (Wordcount). Подключаем пакет rmr2. Реализуем две функции:

  • Map: принимает строки и выдает пары «слово — 1».
  • Reduce: суммирует единицы для каждого слова.

Затем формируем функцию wordcount, которая будет передана Hadoop. В ней указываются параметры входного и выходного файлов, а также наши функции map и reduce. Указываем входной формат (текстовые файлы). Отправляем работу на выполнение, передав конкретные имена файлов.

Краткие итоги

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

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

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

Блок про кластеризацию вводит принципиально иную парадигму — работу без учителя. Здесь смещается фокус с точности на выявление скрытых структур. Пример с K-means показывает ограничения алгоритма при работе с пересекающимися в пространстве признаков классами, а визуализация помогает оценить адекватность разбиения.

Завершающий раздел о MapReduce выводит обсуждение на уровень промышленной эксплуатации. Это закономерный шаг: когда данных становится слишком много для одной машины или когда вычисления нужно ускорить, возникает потребность в распределенных системах. Классический пример WordCount служит простой иллюстрацией того, как логика map и reduce может быть применена для агрегации данных.

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

Классификация (Decision Tree)

Используем данные iris. Создаем выборки для кросс-валидации через sample() (70% в трейн, 30% в тест) и логическое индексирование. В пакете party строим модель ctree() по формуле: класс зависит от всех признаков (+ добавляет признак, - убирает). Применяем predict(), строим матрицу ошибок. Даже на обучающих данных модель может ошибаться. Визуализируем дерево: в идеале в каждом листе один класс; если классы смешаны — это источник ошибок (параметр type="simple" делает картинку компактнее).

Random Forest

Используем формулу Species ~ . (зависимость от всех признаков автоматически). Строим лес с параметром ntree (число деревьев). Делаем прогноз и оцениваем ошибки. Для сводки используем print() по модели, где виден процент ошибок (OOB). Алгоритм есть в двух пакетах: randomForest и partyparty число деревьев задается через control).

Регрессия

Данные: уровень инфляции по годам и кварталам. Проверяем корреляцию функцией cor(). Корреляция с «годом» высокая, с «кварталом» — низкая из-за цикличности. Строим линейную модель lm() (инфляция зависит от года и квартала). Функция summary() дает коэффициенты и остатки. Прогноз на новые кварталы выполняем через predict(new.data). На графике совмещаем реальные и предсказанные значения.

Кластеризация (K-means)

Убираем целевой признак из iris. Задаем kmeans(..., centers = 3). Сравниваем предсказанные кластеры с реальными классами. Ошибки уместны, так как обучение без учителя. Визуализация: строим срез по двум признакам, красим точки в цвет кластера (col = cluster). Добавляем центры (centers). Видно, что один кластер отделился, другие наложились.

MapReduce

Для работы с Hadoop нужны пакеты: RHadoop (интерфейс rmr2, файловая система rhdfs, база rhbase) и RHive. Пример Wordcount: пишем функцию map (выдает пары «слово — 1») и reduce (суммирует единицы). Передаем их в Hadoop с указанием путей к входным и выходным файлам.

Выводы

1. Decision Tree — наглядный метод классификации, визуализируемый в виде дерева решений, но склонный к ошибкам даже на обучающих данных.
2. Random Forest объединяет множество деревьев для повышения точности предсказаний по сравнению с одним деревом.
3. Формулы в R позволяют гибко описывать зависимости, используя операторы +, - и . (точку).
4. Матрица ошибок (таблица сопряженности) является основным инструментом для оценки качества алгоритмов классификации.
5. Корреляционный анализ необходим перед построением регрессионных моделей для выявления значимых переменных.
6. Линейная регрессия (lm) позволяет строить прогнозы с помощью функции predict().
7. K-means — метод кластеризации (обучения без учителя), требующий заранее заданного числа кластеров.
8. Обучение без учителя может давать менее точные результаты на пересекающихся классах из-за отсутствия целевых меток.
9. Визуализация (цветовая маркировка кластеров) необходима для качественной оценки результатов кластеризации.
10. Пакет ROCR используется для оценки качества моделей классификации.
11. Парадигма MapReduce позволяет масштабировать вычисления на кластер (Hadoop) с помощью функций Map и Reduce.
12. Пакеты RHadoop и RHive обеспечивают интерфейс для работы с большими данными в экосистеме Hadoop.

Вопросы для самопроверки

1. Чем принципиально отличается методология построения Decision Tree от Random Forest?
2. Каким образом функция sample() используется для разделения данных на обучающую и тестовую выборки?
3. Что означает оператор ~ с точкой (например, Species ~ .) в формуле построения модели?
4. Для чего нужна матрица ошибок (confusion matrix) и как интерпретировать её недиагональные элементы?
5. В чем специфика визуализации дерева решений и как по ней определить источники ошибок модели?
6. Каково функциональное различие между пакетами party и randomForest при построении случайного леса?
7. Почему переменная «квартал года» может не коррелировать с уровнем инфляции, хотя участвует в регрессионной модели?
8. Какие ключевые параметры и метрики можно извлечь из результата функции summary() для линейной модели?
9. Какова роль функции predict() при работе как с задачами классификации, так и с задачами регрессии?
10. Почему для кластеризации K-means необходимо заранее знать или угадывать число кластеров?
11. В чем преимущество и основной недостаток визуализации результатов кластеризации по двум признакам?
12. Какие компоненты включает пакет RHadoop и какова роль функции Reduce в парадигме MapReduce?
Вернуться к учебному плану