Краткий пример использования MLlib API

Я хочу поделиться (очень) небольшой разработкой PoC (доказательство концепции) об использовании MLlib на Spark + Scala. В этом случае мы хотим использовать MLlib для выполнения некоторых алгоритмов машинного обучения над некоторыми данными. Мы будем использовать (очень) небольшой набор данных, например, набор данных Леонардо на kaggle.com. Имея данные и цель (используя MLlib на Spark + Scala), давайте создадим этот PoC.

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

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

Давайте немного теоретизируем, чтобы мы могли придать этим утверждениям прилив. Нам нужен короткий, практичный способ дать проверяемые результаты на примере чего-либо (PoC). И интерес вызывает очень востребованные направления TIC, а именно Big Data (в лице дата-инженеров) и Data Science (в лице Data Scientist).

Имея этот кадр и применив первые два шага CRIPS-DM[3] к выбранному набору данных, мы выдвинули гипотезу , а именно: популярность песни в некоторой степени является следствием других особенностей этой песни. Прогнозирование целевой переменной на основе других функций, когда у вас есть (предыдущие) данные, указывающие на эту целевую переменную, называется обучение с учителем.

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

В линейной регрессии мы вычисляем зависимую переменную (целевое значение/результат) путем: добавления результатов умножения определенного (вычисленного) коэффициента на независимую переменную (признаки/переменные), связанную с этим коэффициентом (B1*X1+B2*X2+… ), плюс точка перехвата, плюс случайная ошибка. Все это числовые значения.

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

Алгоритм линейной регрессии в MLlib получает в качестве параметра данные libsvm. Итак, первый шаг — преобразовать CSV-файл в libsvm. Этот шаг называется подготовкой данных по методологии CRIPS-DM.

Мы собираемся удалить столбцы строки (тип данных для нескольких букв), а также столбец id, и при этом мы столкнемся с проблемой, что: точки внутри имени столбца требуют специальной обработки в Spark[ 4]. Итак, сначала мы удаляем точки, затем удаляем столбцы и, наконец, используем функцию MLlib assembler.transform для преобразования данных в формат libsvm.

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

Мы храним модель из функции model_data в val и используем ее для создания столбца прогнозирования на наших тестовых данных. Наша первая модель имеет среднеквадратичное отклонение 4 (баллы популярности) и делает следующие прогнозы на тестовых данных:

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

Чтобы улучшить этот результат, мы можем: стандартизировать (среднее значение 0 и стандартное отклонение 1) наши данные, мы можем преобразовать категориальные значения в факторы (рок = 1, поп = 2,…), мы должны использовать больший набор данных, мы можем отказаться составители, мы можем создать конкретные исследования по дискриминантной переменной (например, модель популярности по музыкальному жанру), количеству других.

Но для оценки важно принять во внимание кое-что: эксперимент должен быть воспроизводимым.

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

Что мы можем сделать, так это: уменьшить (среднее) RMSD модели (моделей). Единственное, что лучше всего сделать (для уменьшения RMSD модели), — это удалить контуры набора данных (в данном случае).

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

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

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

Конечно, мы примем уровень погрешности, чтобы избежать переобучения, но не допустим и недообучения. Трудно добраться до хорошей средней точки. Мы могли бы продолжить поиски идеальной середины, но в этой истории мы этого делать не будем, так как целью было «использование MLlib на Spark + Scala», и она была достигнута.

Спасибо, что прочитали эту историю :).

Вы можете найти (очень) небольшую презентацию этой истории на Prezi: https://prezi.com/tozutehrcojn/?utm_campaign=share&utm_medium=copy

Использованная литература:

[1] ThisisEngineering RAEng, женщина-авиакосмический инженер пишет уравнения (2020 г.), URL: https://unsplash.com/photos/GzDrm7SYQ0g

[2] Кеннет Дженсенс, Диаграмма процесса, показывающая взаимосвязь между различными фазами CRISP-DM (2012 г.), URL: https://es.wikipedia.org/wiki/Cross_Industry_Standard_Process_for_Data_Mining#/media/Archivo:CRISP-DM_Process_Diagram.png

[3] Исраэль Родригес, лидер методологии CRISP-DM в области интеллектуального анализа данных и больших данных (2020 г.), URL: https://towardsdatascience.com/crisp-dm-methodology-leader-in-data-mining-and- большие данные-467efd3d3781

[4] Джаядеван М. на issue.apache.org, При попытке выбрать из фрейма данных, который содержит столбцы с расширением . в нем выдается исключение (2016), URL: https://issues.apache.org/jira/browse/SPARK-13197

[5] Гуфосова, Схема k-кратной перекрестной проверки. (2019), URL: https://es.wikipedia.org/wiki/Cross_Industry_Standard_Process_for_Data_Mining#/media/Archivo:CRISP-DM_Process_Diagram.png