Изменения

Перейти к: навигация, поиск

Обучение на больших данных

8902 байта добавлено, 19:30, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{В разработке}} '''Обучение на больших данных''' {{---}} раздел машинного обучения, специализирующийся на построении моделей, обрабатывающих большие объёмы данных, т. н. Также встречаются термины "big data" или "большие данные".
== Понятие больших данных ==
=== Признаки больших данных. Правило VVV ===
Чтобы массив информации обозначить приставкой «big» он должен обладать следующими признаками<ref name="vvv">[https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5#VVV Правило VVV]</ref>:
* Volume (Объем) {{---}} данные измеряются по физической величине и занимаемому пространству на цифровом носителе. К «big» относят массивы свыше 150 Гб в сутки;
* Velocity (Скорость, обновление) {{---}} информация регулярно обновляется и для обработки в реальном времени необходимы интеллектуальные технологии <ref name="inttech">[https://studme.org/200941/informatika/intellektualnye_tehnologii_primenenie интеллектуальные Интеллектуальные технологии] </ref> в рамках больших данных;
* Variety (Разнообразие) {{---}} информация в массивах может иметь неоднородные форматы, быть структурированной частично, полностью и скапливаться бессистемно. Например, социальные сети используют большие данные в виде текстов, видео, аудио, финансовых транзакций, картинок и прочего.
=== Порядок работы с большими данными ===
Чтобы эффективно обрабатывать и анализировать большие данные, существуют такие инструменты как "аналитические модели"<ref name="analiticsmodels">[https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C аналитические Математические моделив форме аналитических моделей]"</ref>. Их решения ищутся в замкнутом виде, в виде функциональных зависимостей. Такие модели способны строить гипотезы на основе больших данных, искать в них зависимости и закономерности {{- --}} всю самую полезную для большинства бизнес-задач информацию. Кроме того, важна хорошая [http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8 [Интерпретируемые модели|интерпретируемость]] построенной модели, так как это позволяет упростить её анализ без повторного её построения, что в условиях больших данных при работе с большими данными крайне важно. Для этого большие данные проходят через несколько этапов:
1. [http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5#.D0.9F.D0.BE.D0.B4.D0.B3.D0.BE.D1.82.D0.BE.D0.B2.D0.BA.D0.B0_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85 [Автоматическое машинное обучение|Чистка данных]] (англ. data cleaning) {{---}} поиск и исправление ошибок в первичном наборе информации, например, ошибки ручного ввода (опечатки), или некорректные значения с измерительных приборов из-за кратковременных сбоев и т.д.;
2. [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8#.D0.92.D1.8B.D0.B1.D0.BE.D1.80_.D0.BF.D1.80.D0.B8.D0.B7.D0.BD.D0.B0.D0.BA.D0.BE.D0.B2 [Уменьшение размерности|Работа с признаками]] (англ. feature engineering) {{---}} генерация переменных для построения аналитических моделей;
3. [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%B8_%D0%B5%D1%91_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80 [Модель алгоритма и её выбор|Построение]] и обучение аналитической модели (англ. model selection) для предсказания целевой (таргетной) переменной. Так проверяются гипотезы о зависимости таргетной переменной от предикторов;.
На практике это помогает решить множество задач. Например, проанализировать, как связаны отказы оборудования с условиями подачи напряжения, или определить вероятность своевременного возврата кредита частным заемщиком.
=== Методы обработки больших данных ===
К основным методам сбора и анализа больших данных относят следующие:
* Глубинный глубинный анализ или "добыча" данных (англ. data mining<ref name="datamining">[https://ru.wikipedia.org/wiki/Data_mining Data Mining]</ref>) – обучение ассоциативным правилам, классификация, кластерный и регрессионный анализ;* краудсорсинг — категоризация и обогащение данных народными силами, т.е. с добровольной помощью сторонних лиц;
* смешение и интеграция разнородных данных, таких как, цифровая обработка сигналов и обработка естественного языка;
* машинное обучение, включая искусственные нейронные сети, сетевой анализ, методы оптимизации и генетические алгоритмы;
* В связи с большим потоком данных, конечный их набор постоянно изменяется, поэтому необходимо анализировать данные особым образом. Так, чтобы своевременно актуализировать информацию о них;
* При возникновении ошибок в модели приходится тратить очень много ресурсов на их поиск и устранение, так как объёмы данных очень велики;
* Возникает проблема разнородности данных. Необходимо уметь обрабатывать данные различных форматов в рамках одной системы. Например, описания книг, фильмов и музыки; Также стоит отметить, что в связи с большой популярностью "больших данных", эта сфера очень быстро развивается, постоянно появляются всё новые технологии и инструменты для работы. Для развивающегося бизнеса внедрение систем по работе с большими данными приводит к дополнительным материальным затратам. А от специалистов в этой сфере требуется быстро овладевать новыми навыками, что также может вызвать затруднения. === Применение машинного обучения к большим данным. Поиск в больших данных ===При работе с большими данными иногда возникает ситуация, когда пользователю нужно найти какие-то конкретные данные. Возникает задача эффективного поиска информации в больших данных. В силу большого объёма всех данных большинство известных методов поиска будут работать неэффективно. Например, '''''поиск перебором'''''<ref ="bruteforcesearch">[https://en.wikipedia.org/wiki/Brute-force_search#:~:text=In%20computer%20science%2C%20brute%2Dforce,candidate%20satisfies%20the%20problem's%20statement. Поиск перебором]</ref> (англ. ''exhaustive search'') {{---}} широко распространенный алгоритм не подходит для больших данных вследствие плохой оптимизации по времени исполнения и используемому месту. Также '''не подходят''' алгоритмы '''''поиска с ориентиром (индексирование)''''' (англ. ''beacon guided searching, BGS'') и [[Метрический классификатор и метод ближайших соседей|'''''метод "ближайших соседей"''''']] (англ. ''nearest neighbour search''). В случае первого на больших данных хранение индексов этих данных становится проблемой, так как данных слишком много, а в случае со вторым алгоритмом будут сильно мешать различные шумы и отклонения, коих в больших данных зачастую очень много. Здесь на помощь приходят [https://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC генетические алгоритмы]. Процедура поиска в больших данных производится довольно часто, следовательно такие алгоритмы довольно быстро приспособятся к поиску наиболее часто используемых данных. Также к плюсам генетических алгоритмов можно отнести возможность кастомизации и устойчивость к шумам, а также хорошую масштабируемость для задач с более высокой размерностью. Всё это как раз то, что нужно в случае больших данных.
Также стоит отметитьКроме того, что при поиске в связи с большой популярностью "больших данныхможет помочь [[Кластеризация|кластеризация]] этих данных. Таким образом они будут разбиты на группы "похожести", эта сфера очень быстро развиваетсякогда данные в каждой группе обладают сходными признаками, постоянно появляются всё новые технологии и инструменты для работы. Для бизнеса это приводит к дополнительным материальным затратам, т. к. крайне важно "идти в ногу со временем". Для специалистов по "большим данным" это так же приводит к дополнительным трудностямкоторым можно существенно снизить круг дальнейшего поиска, т. к. необходимо крайне быстро овладевать этими новыми технологиямичто существенно ускоряет процесс поиска.
С той же целью может применятся и оценка '''''важности признака при перестановке'''''<ref name=== Применение машинного обучения к большим данным ===В условиях больших данных иногда возникает ситуация, когда пользователю нужно найти какие-то конкретные данные. Встаёт задача "pfi">[https://rudocs.wikipediamicrosoft.orgcom/wikiru-ru/dotnet/machine-learning/how-to-guides/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA информационного поискаexplain-machine-learning-model-permutation-feature-importance-ml-net#train-the-model Permutation Feature Importance]</ref> (англ. В силу большого объёма всех данных будет неэффективно перебирать их все ''permutation feature importance, PFI''). Этот приём позволяет выделить наиболее значимые признаки объектов. Заключается он в поисках тоготом, что нужнопосле первоначального обучения некоторой модели происходит случайная перестановка значений признаков у объектов. В данном случае можно применить алгоритмы машинного обученияЗа итерацию берётся некоторый признак, который есть у всех объектов, которые занимаются классификацией данных и их [https://neercпроисходит случайная перестановка значений этого признака между объектами.ifmoПри этом оставшиеся признаки не изменяются.ru/wiki/indexДалее происходит повторный запуск модели и производится расчёт отклонений её результатов от первичных.php?title=%D0%A0%D0%B0%D0%BD%D0%B6%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#Такая процедура выполняется для всех признаков, чтобы можно было выделить наиболее значимые.D0.9C.D0.B5.D1.82.D0.BE.D0.B4.D1.8B_.D1.80.D0.B0.D0.BD.D0.B6.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F ранжированием]Это может существенно помочь в задаче поиска, когда можно снизить количество рассматриваемых признаков, принимая во внимание только наиболее значимые.Поиск в размеченных и отсортированных данных происходит значительно быстрее. А в условиях больших данных это очень важно. Например, любая поисковая система при любом запросе должна давать результат за одно и то же времясуществует некоторый набор данных, однако объём тех данныхсодержащий информацию о продаваемой недвижимости. Каждый объект недвижимости имеет множество признаков: местоположение относительно объектов инфраструктуры, которые ей приходится проанализировать огроменуровень благополучия данного района города, поэтому эффективный поиск в больших данных {{---}} очень важная задачаи многие другие. В этом случае при помощи приёма PFI можно рассчитать, а машинное обучение сильно помогает в её решениикакие из этих признаков имеют большее влияние на цену объекта недвижимости.
== Обработка разнородных данных в рамках одной системы ==
=== "Озеро" данных ===
При работе с большими данными часто возникает ситуация, когда одна и та же модель должна уметь обрабатывать данные различного формата. Это позволяет строить более точные аналитические модели точнее и получать более достоверную информацию о данных в дальнейшем. Также отметим, что в данной ситуации данные берутся из множества '''различных''' источников, которые и определяют формат получаемых данных.
Рассмотрим модель распределенного хранения разнородных данных в концепции '''''«озеро данных»'''''<ref name="datalake">[https://en.wikipedia.org/wiki/Data_lake Озеро данных]</ref>.
::<tex>S=\langle\{DT\}_{i=1}^{n_{st}},\{SS\}_{j=1}^{m_{ss}},\{E\}_{k=1}^{p_e},IS,DS\rangle</tex>:
Данная модель позволяет хранить как сырые разнородные данные, так и структурированные данные в соответствии с предопределенной схемой. Такой результат достигается наличием шаблонов объектов и шаблонов параметров объектов. Также это позволяет снизить временные затраты на доступ к данным.
[[Файл:Schema.PNG|700px|thumb|right|Рисунок 1: Модель === Схема модели хранения разнородных данных]]===
[[Файл:Schema.PNG|700px|thumb|right|Рисунок 1: Модель хранения разнородных данных<ref name=== Схема модели "datalake_pic">[http://www.vstu.ru/upload/iblock/ed2/ed26c52e2ff99fb5b39fbaf37717a96c.pdf Модель хранения разнородных данных ===- схема озера данных]</ref>]]
Рассмотрим схему модели, изображённую на рисунке 1:
* '''Parameter Object template''' {{---}} шаблон параметранекоторого объекта <tex>O</tex>. Каждый объект может иметь множество источников данных <tex>M_{ds}</tex>. Структуру объекта можно представить следующим образом: <tex>O=\langle ds_1, ds_2, хранимого в источнике данных;\dots, ds_m \rangle</tex>.
* '''Data source template''' {{---}} шаблон источника данных. Каждый источник данных может иметь множество параметров с различными типами данных <tex>M_p</tex>. Структуру источника данных можно представить следующим образом: <tex>ds=\langle p_1, p_2, \dots, p_k \rangle</tex>;
* '''Object Parameter template''' {{---}} шаблон некоторого объекта <tex>O</tex>. Каждый объект может иметь множество источников параметра, хранимого в источнике данных <tex>M_{ds}</tex>. Структуру объекта можно представить следующим образом: <tex>O=\langle ds_1, ds_2, \dots, ds_m \rangle</tex>.;
Чтобы реализовать такую модель хранения, необходимо выполнить следующие действия:
::* <tex>gld</tex> {{---}} глобальный идентификатор объекта (уникален);
::* <tex>timestamp</tex> {{---}} его временная метка;
::* <tex>(lat, longlon)</tex> {{---}} координаты его местоположения на временной отметке;
::* <tex>attrD</tex> {{---}} словарь, описывающий функции объекта и его значения.
::2. '''Описание источников данных и настроек сборщиков данных:'''
Данная модель позволяет обрабатывать массивы данных различных по структуре за счёт их преобразования к нужному формату. В дальнейшем аналитическая модель, работающая с этими данными сможет делать более точные прогнозы и гипотезы, так как по каждому объекту будет значительно больше различной информации.
== Работа с комплексом Apache Spark = Применение методов машинного обучения для обучения на больших построения "озера" данных ===
=== Примеры реализации алгоритмов с использованием Spark MLlib ===Рассмотрим удобство использования Apache Spark на примере. Задача нашей модели предугадать захочет ли клиент оформить срочный вклад. Для этого воспользуемся [https://www.kaggle.com/rouseguy/bankbalanced| данными из Machine Learning Repository]. Напишем нашу Представленная выше модель на Pythonхорошо описывает схему хранения разнородных данных путём создания некоторого шаблона, который мог бы описывать все эти данные. Для начала работы с Apache Spark его необходимо установитьПостроение такого шаблона может быть очень трудоёмкой задачей, выполнив <code style="display: inline-block"><font color =так как данных много и их форматов тоже может быть много. Возникает задача '''green'>pip install</font> pyspark</code>Считаем данные из нашего файла и выведем информацию о датасете на экран <code style="display: inline-block"><font color ='greenметапрофилирования'>from</font> pyspark.sql <font color ='green'>import</font> SparkSession spark = SparkSession.builder.appName('ml-bank')данных.getOrCreate() df = sparkЭтот процесс направлен на структуризацию разносортных данных и различных метаданных.read.csv('bank.csv'Без этого большинство действий с данными будут попросту невозможны – будь то построение запросов для СУБД, header = Trueочистка данных, inferSchema = True) dfих классификация и кластеризация.printSchema() </code>Результат: root |-- age: integer (nullable = true) |-- job: string (nullable = true) |-- marital: string (nullable = true) |-- education: string (nullable = true) |-- default: string (nullable = true) |-- balance: integer (nullable = true) |-- housing: string (nullable = true) |-- loan: string (nullable = true) |-- contact: string (nullable = true) |-- day: integer (nullable = true) |-- month: string (nullable = true) |-- duration: integer (nullable = true) |-- campaign: integer (nullable = true) |-- pdays: integer (nullable = true) |-- previous: integer (nullable = true) |-- poutcome: string (nullable = true) |-- deposit: string (nullable = true)Как видно наши данные состоят из множества столбцовКроме того, когда объёмы данных слишком велики, содержащих числа и строки Для большей информации выведем наши данные с помощью таблицы pandas. Для примера выведем 7 первых значений import pandas as pd pd.DataFrame(df.take(7)в БД может быть огромное количество таблиц, columns=dfчьи метаданные могут сильно различаться.columns).transpose()[[Файл:SparkMLFirstTable.png]] Нас будут интересовать только численные данные. Для них построим таблицу с основной информацией (количество/ среднее В таких условиях получение полной информации даже по всей таблице/ среднеквадратичное отклонение / минимальное значение / максимальное значение) numeric_features = [t[0] for t in df.dtypes if t[1] == 'int'] df.select(numeric_features).describe().toPandas().transpose()[[Файл:SparkMLSecondTableодному объекту будет практически невыполнимой задачей.png]]
Оценим корреляцию между оставшимися данными from pandas.plotting import scatter_matrix numeric_data = df.select'''Мета-профайл''' (numeric_features)англ.toPandas() axs = scatter_matrix(numeric_data, figsize=(8, 8)) n = len(numeric_data.columns) for i in range(n): v = axs[i, 0] v.yaxis.label.set_rotation(0) v.yaxis.label.set_ha('right'metadata-profile'') v.set_yticks(()) h = axs[n{{---1}} особая структура данных, i] hпризванная собрать воедино различную информацию о конкретном объекте <tex>O</tex>.xaxisСюда так же входят и различные представления этого объекта.label.set_rotation(90) h.set_xticks(())Например, музыкальную композицию можно идентифицировать по-разному, от названия и автора до жанра и года создания:
[[Файл:SparkMLThirdTable:<tex>MP=(Name, Prop)</tex>* <tex>Name</tex> {{---}} уникальное имя мета-профайла, <tex>Name \in Namespace</tex>, где <tex>Namespace</tex> {{---}} все возможные имена объектов;* <tex>Prop</tex> {{---}} множество атрибутов мета-профайла <tex>\{p_1, \dots, p_n\} | \forall p_i \in Prop: i=\{1, \dots, n\}</tex>. <tex>p_i=(PName_i, PType_i, P_i)</tex>:** <tex>PName_i</tex> {{---}} уникальное имя атрибута, <tex>PName_i \in PNamespace</tex>, где <tex>PNamespace</tex> {{---}} все возможные имена атрибутов.** <tex>PType_i</tex> {{---}} простой тип данных, <tex>PType_i \in Plaintypes</tex>, где <tex>Plaintypes</tex> {{---}} все возможные типы данных. Важно, что типы являются простыми, то есть числами, символами или строками.** <tex>P_i : 0 < P_i < 1</tex> {{---}} вероятность принадлежности атрибута <tex>p_i</tex> некоторому случайно отобранному представлению <tex>O</tex>.png]]
На данных графиках Построение этой структуры можно увидеть зависимость, к примеру, между возрастом и балансом на картепроизвести различными методами машинного обучения. Не будем учитывать эти корреляции при построении наших моделейСюда входят [[Логистическая регрессия|логистическая регрессия]], однако избавимся от дня и месяца рождения[[Байесовская классификация|наивная байесовская классификация]], так как эти параметры не влияют на желание клиента оформить быстрый кредит. df = df[[Глубокое обучение|глубокое обучение]].select('age'Фактически, 'job'здесь стоит задача классификации, 'marital'в которой мы должны понять, 'education', 'default', 'balance', 'housing', 'loan', 'contact', 'duration', 'campaign', 'pdays', 'previous', 'poutcome'какие атрибуты относятся к описываемому объекту, 'deposit') cols = dfа какие нет.columns
Подготовим оставшиеся Предположим, что у нас имеется некоторая выборка данных из одного источника. В данной выборке для каждого объекта имеется лишь одно представление, достаточно полное для однозначной его идентификации. Также имеется выборка данных, относящихся к объектам совсем другого типа, но имеющих похожие атрибуты, её размер должен быть примерно таким же, как и у предыдущей, чтобы убедиться в том, что данные для построения моделейобучения сбалансированы. Это необходимо, чтобы отметать неверные варианты при обучении. Опираясь на эти выборки, происходит обучение на остальных данных (различные источники данных), представленных в виде векторов, содержащих в себе имена различных атрибутов объекта и значения этих атрибутов. На основе вероятностей, имен, типов атрибутов принимается решение, отнести их к объекту или нет. Таким образом, шаблон объекта обрастает новыми атрибутами, по которым его можно идентифицировать.
from pyspark.ml.feature import StringIndexer, VectorAssembler, OneHotEncoder categoricalColumns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'poutcome'] stages = [] for categoricalCol in categoricalColumns: stringIndexer = StringIndexer(inputCol = categoricalCol, outputCol = categoricalCol + 'Index') encoder = OneHotEncoder(inputCols=[stringIndexer.getOutputCol()], outputCols=[categoricalCol + "classVec"]) stages += [stringIndexer, encoder] label_stringIdx = StringIndexer(inputCol = 'deposit', outputCol = 'label') stages += [label_stringIdx] numericCols = ['age', 'balance', 'duration', 'campaign', 'pdays', 'previous'] assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericCols assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features") stages += [assembler] from pyspark.ml import Pipeline pipeline = Pipeline(stages = stages) pipelineModel = pipeline.fit(df) df = pipelineModel.transform(df) selectedCols = ['label', 'features'] + cols df = df.select(selectedCols) df.printSchema()Наконец, поделим нашу выборку Работа с комплексом Apache Spark для обучения на обучающую и тестирующую train, test = df.randomSplit([0.7, 0.3], seed = 2018) print("Training Dataset Count: " + str(train.count())) print("Test Dataset Count: " + str(test.count()))Построим модели и выведем точность(площадь под ROC-кривой) для:Logistic Regression  from pyspark.ml.classification import LogisticRegression lr = LogisticRegression(featuresCol = 'features', labelCol = 'label', maxIter=10) lrModel = lr.fit(train) trainingSummary = lrModel.summary roc = trainingSummary.roc.toPandas() plt.plot(roc['FPR'],roc['TPR']) plt.ylabel('False Positive Rate') plt.xlabel('True Positive Rate') plt.title('ROC-кривая') plt.show() print('Точность: ' + str(trainingSummary.areaUnderROC))  Точность: 0.8865478305561797Binary Classification from pyspark.ml.evaluation import BinaryClassificationEvaluator evaluator = BinaryClassificationEvaluator() print('Точность: ', evaluator.evaluate(predictions))  Точность: 0.8837112925002687Decision Tree from pyspark.ml.classification import DecisionTreeClassifier dt = DecisionTreeClassifier(featuresCol = 'features', labelCol = 'label', maxDepth = 3) dtModel = dt.fit(train) predictions больших данных = dtModel.transform(test) evaluator = BinaryClassificationEvaluator() print("Точность: " + str(evaluator.evaluate(predictions, {evaluator.metricName: "areaUnderROC"})))  Точность: 0.7808118726917547
Random Forest=== Об инструментах Apache Spark ===
from pysparkМногие компании на сегодняшний день уже столкнулись с необходимостью обработки больших массивов данных.mlДля этой цели они начали использовать проекты экосистемы [https://hadoop.apache.org/ Apache Hadoop]. Данная экосистема базируется на [https://ru.wikipedia.classification import RandomForestClassifier rf org/wiki/MapReduce#:~:text= RandomForestClassifier(featuresCol = 'features'MapReduce%20%E2%80%94%20%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C%20%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F,%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85%20%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0%D1%85. MapReduce], парадигме параллельного программирования, labelCol = 'label')разработанного компанией Google.Основные достоинства MapReduce:* масштабируемость;* устойчивость к сбоям; rfModel = rf* простота использования.fitНо при всех достоинствах данного инструмента, наблюдалась низкая производительность на итеративных алгоритмах (trainнапример, алгоритмы машинного обучения) predictions = rfModel.transform(test) evaluator = BinaryClassificationEvaluatorРешение проблемы было найдено в университете Беркли: была разработана модель распределенных вычислений, которая имеет устойчивость к сбоям при пользовании распределенной коллекцией данных (англ. resilient distributed dataset, RDD). print("ТочностьНа основе RDD по сей день развивается система [https: " + str(evaluator//spark.apache.evaluate(predictionsorg/ Apache Spark], {evaluatorкоторая обладает сравнительно высокой эффективностью при работе итеративных алгоритмов за счет кэширования результатов в памяти.metricNameНа основе концепции распределенных коллекций разрабатываются распределенные системы: "areaUnderROC"* [https://spark.apache.org/docs/1.0.0/sql-programming-guide.html Shark] {{---}})))хранилище данных;* [https://spark.apache.org/docs/latest/graphx-programming-guide.html GraphX] {{---}} система обработки графовых данных; Точность* [https: 0//spark.apache.org/docs/latest/streaming-programming-guide.8777131493473223Gradienthtml Spark Streaming] {{---Boosted Tree }} система обработки потоковых данных; from pyspark* [https://spark.apache.org/docs/latest/ml-guide.classification import GBTClassifier gbt = GBTClassifier(maxIter=10) gbtModel = gbthtml Spark MLlib] {{---}} библиотека алгоритмов машинного обучения.fit(train) predictions = gbtModelВсе из перечисленных систем совместимы со стеком технологий Hadoop.transform(test) evaluator = BinaryClassificationEvaluator() print("Точность: " + str(evaluatorMLlib {{---}} основная библиотека Spark.evaluate(predictionsОна предоставляет множество служебных программ, {evaluator.metricNameполезных для задач машинного обучения: "areaUnderROC"})))* классификация;* регрессия;* кластеризация;* моделирование;* сингулярное разложение и анализ по методу главных компонент; Точность: 0* проверка гипотез и статистической выборки.8935091626908479
=== Примеры реализации алгоритмов с использованием Spark MLlib ===
Рассмотрим удобство использования Apache Spark на примере. Задача нашей модели {{---}} предугадать : захочет ли клиент оформить срочный вклад. Для этого воспользуемся [https://www.kaggle.com/rouseguy/bankbalanced| данными из Machine Learning Repository].
Напишем нашу модель на Python. Для начала работы с Apache Spark его необходимо установить, выполнив
<font color = "orange">'''pip ''' '''install '''</font> pysparkСчитаем данные из нашего файла и выведем информацию о датасете на экран: <font color = "orange">'''from '''</font> pyspark.sql <font color = "orange">'''import '''</font> SparkSession spark = SparkSession.builder.appName(<font color = "green">'ml-bank'</font>).getOrCreate() df = spark.read.csv(<font color = "green">'bank.csv'</font>, header = <font color = "blue">True</font>, inferSchema = <font color = "blue">True</font>)
df.printSchema()
Результат:
|-- poutcome: string (nullable = true)
|-- deposit: string (nullable = true)
Как видно наши данные состоят из множества столбцов, содержащих числа и строки Для большей информации выведем наши данные с помощью таблицы pandas. Для примера выведем 7 первых значений: <font color = "orange">'''import '''</font> pandas <font color = "orange">'''as '''</font> pd pd.DataFrame(df.take(<font color = "blue">7</font>), columns=df.columns).transpose()
[[Файл:SparkMLFirstTable.png]]
Нас будут интересовать только численные данные. Для них построим таблицу с основной информацией (количество/ среднее по всей таблице/ среднеквадратичное отклонение / минимальное значение / максимальное значение): numeric_features = [t[<font color = "blue">0</font>] <font color = "orange">'''for '''</font> t <font color = "orange">'''in '''</font> df.dtypes <font color = "orange">'''if '''</font> t[<font color = "blue">1</font>] == <font color = "green">'int'</font>]
df.select(numeric_features).describe().toPandas().transpose()
[[Файл:SparkMLSecondTable.png]]
Оценим корреляцию между оставшимися данными: <font color = "orange">'''from '''</font> pandas.plotting <font color = "orange">'''import '''</font> scatter_matrix
numeric_data = df.select(numeric_features).toPandas()
axs = scatter_matrix(numeric_data, figsize=(<font color = "blue">8</font>, <font color = "blue">8</font>))
n = len(numeric_data.columns)
<font color = "orange">'''for '''</font> i <font color = "orange">'''in '''</font> range(n): v = axs[i, <font color = "blue">0</font>] v.yaxis.label.set_rotation(<font color = "blue">0</font>) v.yaxis.label.set_ha(<font color = "green">'right'</font>)
v.set_yticks(())
h = axs[n-<font color = "blue">1</font>, i] h.xaxis.label.set_rotation(<font color = "blue">90</font>)
h.set_xticks(())
На данных графиках можно увидеть зависимость, к примеру, между возрастом и балансом на карте. Не будем учитывать эти корреляции при построении наших моделей, однако избавимся от дня и месяца рождения, так как эти параметры не влияют на желание клиента оформить быстрый кредит.
df = df.select(<font color = "green">'age'</font>, <font color = "green">'job'</font>, <font color = "green">'marital'</font>, <font color = "green">'education'</font>, <font color = "green">'default'</font>, <font color = "green">'balance'</font>, <font color = "green">'housing'</font>, <font color = "green">'loan'</font>, <font color = "green">'contact'</font>, <font color = "green">'duration'</font>, <font color = "green">'campaign'</font>, <font color = "green">'pdays'</font>, <font color = "green">'previous'</font>, <font color = "green">'poutcome'</font>, <font color = "green">'deposit'</font>)
cols = df.columns
Подготовим оставшиеся данные для построения моделей.  <font color = "orange">'''from '''</font> pyspark.ml.feature <font color = "orange">'''import '''</font> StringIndexer, VectorAssembler, OneHotEncoder
categoricalColumns = [<font color = "green">'job'</font>, <font color = "green">'marital'</font>, <font color = "green">'education'</font>, <font color = "green">'default'</font>, <font color = "green">'housing'</font>, <font color = "green">'loan'</font>, <font color = "green">'contact'</font>, <font color = "green">'poutcome'</font>]
stages = []
<font color = "orange">'''for '''</font> categoricalCol <font color = "orange">'''in '''</font> categoricalColumns: stringIndexer = StringIndexer(inputCol = categoricalCol, outputCol = categoricalCol + <font color = "green">'Index'</font>) encoder = OneHotEncoder(inputCols=[stringIndexer.getOutputCol()], outputCols=[categoricalCol + <font color = "green">"classVec"</font>])
stages += [stringIndexer, encoder]
label_stringIdx = StringIndexer(inputCol = <font color = "green">'deposit'</font>, outputCol = <font color = "green">'label'</font>)
stages += [label_stringIdx]
numericCols = [<font color = "green">'age'</font>, <font color = "green">'balance'</font>, <font color = "green">'duration'</font>, <font color = "green">'campaign'</font>, <font color = "green">'pdays'</font>, <font color = "green">'previous'</font>] assemblerInputs = [c + <font color = "green">"classVec" </font> <font color = "orange">'''for '''</font> c <font color = "orange">'''in '''</font> categoricalColumns] + numericCols assembler = VectorAssembler(inputCols=assemblerInputs, outputCol=<font color = "green">"features"</font>)
stages += [assembler]
<font color = "orange">'''from '''</font> pyspark.ml <font color = "orange">'''import '''</font> Pipeline
pipeline = Pipeline(stages = stages)
pipelineModel = pipeline.fit(df)
df = pipelineModel.transform(df)
selectedCols = [<font color = "green">'label'</font>, <font color = "green">'features'</font>] + cols
df = df.select(selectedCols)
df.printSchema()
Наконец, поделим нашу выборку на обучающую и тестирующую
train, test = df.randomSplit([<font color = "blue">0.7</font>, <font color = "blue">0.3</font>], seed = 2018) print(<font color = "Training Dataset Count: blue" + str(train.count())) print("Test Dataset Count: " + str(test.count())>2018</font>)Построим модели и выведем точность(площадь под ROC-кривой) для: 
Logistic Regression
<font color = "orange">'''from '''</font> pyspark.ml.classification <font color = "orange">'''import '''</font> LogisticRegression lr = LogisticRegression(featuresCol = <font color = "green">'features'</font>, labelCol = <font color = "green">'label'</font>, maxIter=<font color = "blue">10</font>)
lrModel = lr.fit(train)
trainingSummary = lrModel.summary
roc = trainingSummary.roc.toPandas() plt.plot(roc['FPR'],roc['TPR']) plt.ylabel('False Positive Rate') plt.xlabel('True Positive Rate') plt.title('ROC-кривая') plt.show() print('<font color = "green">"Точность: ' "</font> + str(trainingSummary.areaUnderROC))
Точность: 0.8865478305561797
Binary Classification
<font color = "orange">'''from '''</font> pyspark.ml.evaluation <font color = "orange">'''import '''</font> BinaryClassificationEvaluator
evaluator = BinaryClassificationEvaluator()
print('<font color = "green">"Точность: '"</font>, evaluator.evaluate(predictions))
Точность: 0.8837112925002687
Decision Tree
<font color = "orange">'''from '''</font> pyspark.ml.classification <font color = "orange">'''import '''</font> DecisionTreeClassifier dt = DecisionTreeClassifier(featuresCol = <font color = "green">'features'</font>, labelCol = <font color = "green">'label'</font>, maxDepth = <font color = "blue">3</font>)
dtModel = dt.fit(train)
predictions = dtModel.transform(test)
evaluator = BinaryClassificationEvaluator()
print(<font color = "green">"Точность: " </font> + str(evaluator.evaluate(predictions, {evaluator.metricName: <font color = "green">"areaUnderROC"</font>})))
Точность: 0.7808118726917547
Random Forest
<font color = "orange">'''from '''</font> pyspark.ml.classification <font color = "orange">'''import '''</font> RandomForestClassifier rf = RandomForestClassifier(featuresCol = <font color = "green">'features'</font>, labelCol = "green">'label'</font>)
rfModel = rf.fit(train)
predictions = rfModel.transform(test)
evaluator = BinaryClassificationEvaluator()
print(<font color = "green">"Точность: " </font> + str(evaluator.evaluate(predictions, {evaluator.metricName: <font color = "green">"areaUnderROC"</font>})))
Точность: 0.8777131493473223
Gradient-Boosted Tree
<font color = "orange">'''from '''</font> pyspark.ml.classification <font color = "orange">'''import '''</font> GBTClassifier gbt = GBTClassifier(maxIter=<font color = "blue">10</font>)
gbtModel = gbt.fit(train)
predictions = gbtModel.transform(test)
evaluator = BinaryClassificationEvaluator()
print(<font color = "green">"Точность: " </font> + str(evaluator.evaluate(predictions, {evaluator.metricName: <font color = "green">"areaUnderROC"</font>})))
Точность: 0.8935091626908479
== Практическое применение Big Data ==
На сегодняшний день работа с большими данными популярна во многих рабочих сферах. Как правило, алгоритмы бизнес-приложения обрабатывают огромные потоки данных из различных источников, после чего создается предсказание следующего предполагаемого события. Программисты бизнес-приложений получают в два раза больше программистов других приложений. А программист бизнес-приложений, умеющий работать с большими данными по методологии SCRUM, получает ещё больше.
Можно выделить несколько областей, где использование больших данных набирает популярность:
* Бизнес и Маркетинг. С помощью анализа последних произведенных транзакций алгоритмы с достаточно высокой точностью могут предсказать повышение спроса на определенный товар;
== См. также ==
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%89%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D1%8F Машинное обучение[Общие понятия]]* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8 Регрессионный анализ[Вариации регрессии]]* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8 [Обучение в реальном времени]]* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F [Кластеризация]]* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5#.D0.9A.D0.BE.D0.BD.D1.81.D1.82.D1.80.D1.83.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.B8.D0.B7.D0.BD.D0.B0.D0.BA.D0.BE.D0.B2 [Автоматическое машинное обучение]]
== Примечания ==
== Источники информации ==
* [https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5 Wikipedia {{---}} Большие данные]
* [https://habr.com/ru/company/habr_career/blog/456746/ Блог компании Хабр Карьера {{---}} Большие данные — большая ответственность, большой стресс и большие деньги]
* [https://habr.com/ru/company/productstar/blog/503580/ Блог компании ProductStar {{---}} Что такое «Big Data»?]
* [https://databricks.com/spark/about О системе Apache Spark]
* [https://docs.microsoft.com/ru-ru/azure/hdinsight/spark/apache-spark-creating-ml-pipelines Документация от Microsoft {{---}} Создание конвейера машинного обучения Apache Spark]
* [https://www.researchgate.net/publication/322994594_A_survey_of_different_search_techniques_for_big_data A survey of different search techniques for big data] {{---}} 4th International Conference on Innovations in Information, Embedded and Communication Systems, 2017;* [http://www.vstu.ru/upload/iblock/ed2/ed26c52e2ff99fb5b39fbaf37717a96c.pdf Методы обработки разнородных данных в проактивных системах управления транспортной инфраструктурой] {{---}} Чан Ван Фу, Волгоградский государственный технический университет, 2019г;* [https://www.researchgate.net/profile/Michael_Gubanov/publication/346275767_WebLens_Towards_Interactive_Large-scale_Structured_Data_Profiling/links/5fc0055c299bf104cf7fd4a1/WebLens-Towards-Interactive-Large-scale-Structured-Data-Profiling.pdf Towards Interactive Large-scale Structured Data Profiling] {{---}} Rituparna Khan, Michael Gubanov {{---}} Department of Computer Science, Florida State University, 2020г.
[[Категория: Машинное обучение]]
[[Категория: Большие данные]]
1632
правки

Навигация