Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow ИНТЕЛЛЕКТУАЛЬНЫЕ СИСТЕМЫ
Посмотреть оригинал

Чистые данные и выбор признаков

Предобработка данных

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

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

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

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

Итак, мы получаем процесс преобразования сырых данных в чистые, изображенный на рис. 4.2.

Схема обработки сырых данных

Рис. 4.2. Схема обработки сырых данных

Таким образом, можно сформулировать определение чистых данных. Чистые данные (clean dataУ — это данные, приведенные к единому формату, которые могут быть легко подвержены анализу, а также любому преобразованию типа объединения нескольких наборов данных этого формата, выделения подмножеств и т.п.

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

Какие же существуют инструменты для очищения данных? В качестве целевого языка программирования будем использовать язык Scala. Будучи наследником языка Java, он становится в промышленном программировании все более популярным языком — лаконичный синтаксис функционального языка программирования позволяет писать понятный и красивый код, а богатое наследство Java в виде многочисленных библиотек обработки данных и машинного обучения позволяет использовать все предыдущие наработки.

Возьмем в качестве примера задачу реализации наивного фильтра статей по машинному обучению. В качестве признаков выберем ключевые слова, соответствующие тематике. Попробуем составить словарь терминов, которые встречаются на странице https://en.wikipedia.org/wiki/Machine_learning, — слова из него мы и будем использовать в качестве признаков.

Представленный ниже фрагмент кода скачивает нужную нам страницу и использует библиотеку NekoIITML[1] [2] для синтаксического анализа (парсинга) возможно невалидного html, после чего фильтрует все текстовые ноды html и извлекает из них текст, разбивая его по пробелам и приводя в нижний регистр:

val url = new InputSource ("https://en.wikipedia.org/

wiki/Machine_learning")

val parser = new DOMParser ()

parser.parse (url)

val document =parser.getDocument () val allNodes = getAHNodes (ArrayBuffer (document)) val removeNonLiteralSymbolsPattern =" [Aa-z'] ".r

val terms = allNodes

filter (node = > node.isInstanceOf [Textlmpl]) //

выделение только текстовых узлов

map (node =>node.getTextContent) //извлечение

текста

flatMap (line => line. trim. split (" ") ) //получение списка всех слов

map (term = > term.toLowerCase ()) //приведение к нижнему регистру

map (term => removeNonLiteralSymbolsPattern. replaceAllln (term, "")) //оставляем только буквы filter (term =>term.nonEmpty) //оставляем только непустые слова

При наличии функции get AllNodes, которая извлекает все теш из верстки, можно получить все слова в тексте статьи. Вот такой результат получился на момент написания этих строк:

List (machine, learning, wikipedia, the, free, encyclopedia, ...)

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

После получения списка всех слов можно перейти к этапу унификации — приведению слов к нормальной форме. Для этого воспользуемся библиотекой Apache Morphology (для русского языка используется Russian Morphology[3]), которая позволяет получать нормальную форму слова:

val morphology = new EnglishLuceneMorphology О val simpleDictionary = (terms.map (term =>morphology. getNormalForms (term).get (0)).groupBy (term =>term) map {

case (term, termRepeats) => term -> termRepeats.length } filter {

case (term, termRepeats) => termRepeats >5 )).keys.toList

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

List (inductive, database, clustering, learning,

machine, ...)

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

  • [1] См.: Wickham Н. Tidy Data // Journal of Statistical Software. 2014. № 59.
  • [2] Сайт: www.nekolitml.sourceforgc.net
  • [3] URL: https://codc.google.eom/p/russianmorphology
 
Посмотреть оригинал
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Предыдущая   СОДЕРЖАНИЕ   Следующая >
 

Популярные страницы