Предиктивный анализ: создание простой модели классификации на Java с использованием Weka

Введение в основы интеллектуального анализа и классификации данных

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

Джеймс Ховард, старший партнер, Kore Federal Inc.

James HowardДжеймс Ховард (James Howard) — эксперт по статистическому анализу, предоставляет услуги углубленного экономического, политического и информационного анализа федеральным органам власти, государственным учреждениям и частным клиентам. В настоящее время он является старшим партнером в компании Kore Federal и владельцем компании J.P. Howard & Co, предоставляющей услуги независимого консалтинга. Прежде Джеймс Ховард работал внутренним консультантом по статистическим вычислениям в Совете управляющих Федеральной резервной системы.



13.02.2014

Введение

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

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

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

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

Методы классификации нацелены на решение подобных задач прогнозирования классов. Возможно, наиболее известной является логит-модель, которую преподают во множестве программ обучения статистике в последипломном образовании. В примере, приведенном в данной статье, будет использоваться классификатор RandomTree, входящий в состав Weka. RandomTree — это классификатор на базе деревьев, который рассматривает в каждой ветви случайный набор признаков. Он имеет мало настраиваемых параметров и потому прост в использовании и очень быстр. Классификатор RandomTree будет продемонстрирован с набором данных «ирисы Фишера» (Fisher's iris). Фишер использовал выборку из 150 измерений лепестков и чашелистиков для классификации выборки на три биологических вида. Этот классический набор данных, часто применяемый при изучении алгоритмов машинного обучения, используется здесь в качестве примера.


Использование Weka

Weka — это написанная на языке Java программа с открытым исходным кодом для машинного обучения, разработанная в Университете Уайкато (University of Waikato). Поскольку Weka создана исследователями, она практична и проста в использовании. Запустив Weka, пользователь видит небольшое окно с четырьмя кнопками под заголовком Applications (Приложения). В этой статье все действия выполняются в приложении Explorer.

Рисунок 1. Стартовое окно Weka
Window showing the Classify tab in Weka Explorer

После выбора приложения Explorer открывается интерфейс Weka Explorer с шестью вкладками в верхней части окна для различных процессов моделирования данных. Помимо графического интерфейса, программа Weka имеет несложный интерфейс командной строки, а также может вызываться из командной строки R при помощи подключаемого пакета. Начнем с левой вкладки Preprocess (Предварительная обработка), чтобы приступить к процессу моделирования.

Рисунок 2. Открытие файла данных в Weka
Image shows window showing the Preprocess tab in Weka Explorer

Набор данных iris включает пять переменных. Две описывают наблюдаемый лепесток ириса — его длину и ширину. Еще две переменные описывают наблюдаемый чашелистик ириса — также длину и ширину. Последняя переменная в этом наборе данных является одним из трех идентификаторов вида — setosa (ирис щетинистый), versicolor (ирис разноцветный) или virginica (ирис виргинский). Набор содержит 50 наблюдений для каждого вида. В целом наблюдения для вида setosa отличаются от наблюдений для видов versicolor и virginica, которые меньше отличаются друг от друга. Тем не менее многие алгоритмы машинного обучения и классификаторы способны различать все три вида с высокой точностью. Набор данных iris можно получить из множества источников, включая Википедию; его также можно загрузить по ссылке в конце данной статьи.

Weka может считывать файлы разных типов, в том числе CSV, а также открывать базы данных. Weka является Java-приложением, поэтому может открыть любую базу данных, для которой есть Java-драйвер. Weka также включает простой формат файлов ARFF, который организован как CSV-файл с заголовком, описывающим переменные (см. Ресурсы). Набор данных iris доступен в виде ARFF-файла. Для считывания файла запустите Weka, выберите Explorer, а затем Open file (Открыть файл). Этот файл станет текущим набором данных в Weka. В любой момент времени в памяти может находиться только один набор данных.

В случае набора данных iris классификацией данных являются виды. Weka автоматически назначает последний столбец ARFF-файла переменной класса, а в нашем наборе данных идентификаторы видов уже хранятся в последнем столбце. Поэтому никаких предварительных модификаций данных не требуется. Для обучения исходной модели выберите Classify (Классификация) в верхней части экрана. Типом модели по умолчанию является ZeroR — классификатор, который предсказывает только базовый случай и поэтому не очень полезен. Чтобы изменить модель для обучения, нажмите кнопку Choose (Выбрать) в верхней левой части экрана, и вы увидите иерархический список типов классификаторов. В группе trees (деревья) выберите тип RandomTree для обучения простой древовидной модели. Нажмите кнопку Start для запуска процесса моделирования.

Рисунок 3. Запуск процесса моделирования
Image shows window showing the Classify tab in the Weka Explorer with the trees option expanded

Через несколько секунд Weka создаст классификатор. Этот классификатор появится в списке результатов Results List под именем trees.RandomTree, перед которым будет указано время начала процесса моделирования. Weka хранит в памяти множество моделей, обеспечивая возможность быстрого сравнения. Weka также отображает в поле Classifier output (Результаты классификатора) некоторые показатели эффективности модели, включая площадь под ROC-кривой (кривой ошибок) и матрицу несоответствий для классификатора. В нашем примере для тестирования используется 10-кратная кросс-проверка. Каждый классификатор имеет свои собственные параметры настройки, которые можно менять, но для целей данной статьи эта модель достаточно хороша и позволяеи корректно классифицировать 93% экземпляров. Сохраните модель, щелкнув правой кнопкой мыши по результатам классификатора и выбрав пункт Save model(Сохранить модель). По умолчанию модели сохраняются с расширением.model Весь процесс можно проходить пошагово для исследования или экспериментирования; его также можно автоматизировать в среде R с помощью пакета RWeka.

Рисунок 4. Сохранение модели
Image shows window showing the Classify tab of the Weka Explorer with the Classifier dialog box open)

Работа с классификатором

Сохраненную модель можно загружать в Weka и применять к новым данным. Однако более интересным вариантом является загрузка модели в Weka через Java-программу и использование этой программы для управления выполнением модели независимо от интерфейса Weka. Это дает Weka особое преимущество, поскольку Java обычно изначально поддерживается в средах баз данных и OLTP, таких как Oracle. Кроме того, Weka поставляется в виде JAR-файла с дистрибутивом (weka.jar), который предоставляет доступ ко всем внутренним классам и методам Weka.

Этот процесс начинается с создания объекта классификатора Weka и загрузки в него модели. Объект классификатора представляет собой абстрактный интерфейс Java, в который можно загружать модели Weka любых типов. Таким образом, один и тот же код может выполнять логистическую регрессию, метод опорных векторов, RandomForest или любой другой классификатор, поддерживаемый Weka. Модели также можно заменять в ходе исполнения по мере того, как они будут перестраиваться и совершенствоваться с использованием новых данных. После загрузки модели в объект classifier она становится полностью работоспособной и готовой к выполнению задач классификации.

Описанный процесс показан в конструкторе для классаIris. Этот класс включает переменную экземпляра типаClassifier, названную classModel, для хранения объектаclassifier. Кроме того, класс включает переменную экземпляра типаstring, названнуюclassModelFile, которая содержит полный путь к файлу сохраненной модели. Модель хранится как сериализованный Java-объект. Файл сохраненной модели можно развернуть как JAR-файл. Этот файл открывается с использованием методаgetResourceAsStream(), а считывается с использованием статической функции WekaSerializationHelper.read(). Эти действия возвращают файл модели как Java-объект, который можно преобразовать в объектClassifier и хранить вclassModel. На данном этапе для классификатора не требуется никакой дополнительной инициализации.


Использование классификатора

После загрузки классификатора процесс его использования может отходить от общего подхода к программированию на Java. Weka создана как высокопроизводительная система классификации и в некоторых конструктивных аспектах отклоняется от традиционных объектно-ориентированных систем. В Weka имеется своя собственная реализация векторов (FastVector) и наборов измерений для классификации (Instance). Эти объекты несовместимы со сходными объектами в библиотеке Java Class Library, что усложняет их использование. В предлагаемом примере метод classifySpecies() классаIris принимает в качестве единственного аргумента объект Dictionary (из библиотеки Java Class Library) с ключами и значениями типаString. Такая структура позволяет вызывающим программам использовать стандартные структуры Java-объектов в процессе классификации и изолировать специфичные для Weka детали реализации в классе Iris.

МетодclassifySpecies() должен преобразовать получаемый из вызывающей программы объект Dictionary в объект, который Weka может понять и обработать. Weka работает с объектами, называемыми Instance, которые входят в пакет weka.core. Объект Instance включает набор значений, с которым классификатор может работать. Кроме того, классификатор можно обучить на совокупности объектовInstance, если обучение происходит через Java, а не через графический пользовательский интерфейс. Однако зависимости между метаданными признаков, такими как имена, и значениями не хранятся в объекте Instance. Подробности признаков, включая тип, хранятся в отдельном объектеInstances, который может содержать множество объектовInstance. Объект Instance должен содержаться в объекте Instances чтобы классификатор мог с ним работать. ОбъектInstances также доступен в weka.core.

Важное предупреждение относительно работы с файлами моделей и классификаторами типа Classifier, или любыми его подклассами, заключается в следующем: модели могут хранить внутри структуру данных, используемую для обучения модели, однако API для извлечения этой информации не существует. Поэтому класс, работающий с объектом Classifier, не может делать это «наивным» образом. Он должен быть запрограммирован с учетом определенных допущений относительно данных и структуры данных, к которым объектClassifier будет применяться. Это предупреждение лежит в основе проектирования методаclassifySpecies() в классе Iris. Возможны несколько подходов к проектированию. Например, класс может инициализировать структуру данных как часть конструктора классаIris. В данном примере это происходит во время классификации. Это разумно в том случае, если реализация не требует высокоскоростного реагирования и будет вызываться лишь несколько раз.

МетодclassifySpecies() начинается с создания списка возможных результатов классификации. В случае набора данных iris это список из трех видов, включенных в исходный набор данных — setosa, versicolor и virginica. Каждый из них добавляется в объект FastVector с использованием метода FastVector addElement(). Затем, как только возможные результаты будут сохранены в объектеFastVector, этот список преобразуется в номинальную переменную путем создания нового объектаAttribute с именем species и вектором FastVector возможных значений в качестве двух аргументов для конструктораAttribute. FastVector должен содержать список возможных результатов в том же порядке, в каком они были представлены в обучающем наборе. Из ARFF-файла, хранящего первоначальные измерения iris, следует, что эти результаты таковы:

@attribute Species {'setosa','versicolor','virginica'}

Соответственно в Java возможные значения видов загружаются в том же порядке:

dataClasses.addElement("setosa"); 
dataClasses.addElement("versicolor"); 
dataClasses.addElement("virginica");

После подготовки классов видов методclassifySpecies() совершает цикл над объектомDictionary, выполняя с каждой итерацией две задачи:

  1. Он собирает совокупность ключей, которые агрегированы во второй объектFastVector, используя методFastVector addElement(). Этот объект FastVector содержит все названия признаков, которые будут предоставлены объектуClassifier.
  2. Он получает значение, связанное с каждым ключом. Значениями являются числа с плавающей запятой, хранимые как строки, поэтому их необходимо преобразовать в числа с плавающей запятой, в данном случае двойной точности. Все значения в том виде, как они возвращается из объектаDictionary, сохраняются в числовом массиве.

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

Следующим шагом является создание окончательного объекта, с которым будет работать классификатор. Это процесс из двух этапов, охватывающий классInstances и класс Instance, как описано выше. Процесс начинается с создания объектаInstances. Первым аргументом в конструкторе является имя соотношения. Для экземпляра данных, который будет классифицироваться, оно несущественно; в этом примере используется имя classify. Вторым аргументом конструктора является FastVector, содержащий список атрибутов. Наконец, последним аргументом является емкость набора данных, в данном примере 0. После создания объекта Instances методsetClass() добавляет объектspecies как новый атрибут, который будет содержать класс экземпляров.

В заключение эти данные необходимо добавить в объектInstances. В этом примере будет классифицироваться только один экземпляр за раз, поэтому в объект Instances с помощью методаadd() добавляется одиночный экземпляр, хранимый в массиве значений с двойной точностью. В нашем примере добавляется безымянный объектInstance, создается в момент добавления. Первым аргументом в конструктореInstance является вес экземпляра. Вес может понадобиться, если для обучения будет использоваться взвешенный набор данных. Для задач классификации вес не имеет значения. Поэтому вес задан равным 1. Вторым и последним аргументом конструктора является массив значений двойной точности, содержащий значения измерений. Класс экземпляра должен быть задан как missing с использованием метода setClassMissing() для объектаInstance.

После того как классификатор и экземпляр готовы, процесс классификации реализуется двумя возможными методами классификации объекта Classifier. Один из них,classifyInstance(), возвращает значение двойной точности, представляющее в цифровом виде класс объекта («истина» или «ложь»). Вторым методом являетсяdistributionForInstance(), который возвращает массив значений двойной точности, представляющий вероятность того, что экземпляр входит в каждый из классов мультиклассового классификатора. Поскольку наш классификатор мультиклассовый, в примере используется метод distributionForInstance(), который вызывается для экземпляра в объектеInstances с индексом 0. Распределение сохраняется в новом массиве значений двойной точности. Классификация выполняется путем поиска наибольшего значения распределения и выбора соответствующего вида, возвращаемого как объектString.


Особенности реализации

Представленная здесь реализация классификатора предназначена для демонстрации. Она работает с Java-объектом стандартного типа (Dictionary) и возвращает классификацию в упрощенной форме — в виде объектаString. Предлагаются два драйвера. Класс IrisDriver предоставляет интерфейс командной строки для классификатора с набором признаков, указанных в командной строке в виде имени, за которым следуют знак равенства и значение. Кроме того, предлагается регрессионный тест JUnit, который просматривает шесть комбинаций измерений iris для их корректной классификации. Использовались примеры, для которых известно, что данный классификатор дает верный прогноз. Однако оба драйвера предоставляют возможность исследовать, как соответствующие процессы могут работать в реальном времени. Соответствующие измерения iris были созданы случайным образом на базе исходных обучающих измерений.

Однако объектIris совсем не обязательно должен использовать объект Dictionary. Составной частью метода классификации является процесс преобразования, поэтому объект, содержащий элемент для классификации, может иметь любую структуру, удобную для реализации или для программиста, при условии что из формы хранения можно воссоздать внутреннюю структуру объекта для классификации. Если важна скорость, то вызывающая программа может работать с объектом Classifier напрямую и напрямую передавать ему значения. Однако это ухудшит архитектуру вызывающей программы из-за уменьшения степени абстракции, что затруднит использование разных моделей Weka или вообще иных механизмов классификации. Поиск оптимального баланса между абстракцией и скоростью во многих задачах является сложной проблемой. Описанное применение не является исключением, и данная абстракция была выбрана для целей демонстрации.


Заключение

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


Загрузка

ОписаниеИмяРазмер
RandomTreeIrises.zip16 КБ

Ресурсы

Научиться

  • Оригинал статьи: Create a simple predictive analytics classification model in Java with Weka.
  • Узнайте больше о Weka, программном обеспечении для интеллектуального анализа данных на языке Java.
  • Ознакомьтесь с ресурсами о простом файловом формате ARFF.
  • Интеллектуальный анализ данных активно обсуждается в технологической отрасли, поскольку компании генерируют миллионы элементов данных о своих пользователях и ищут возможность извлечения прибыли из этой информации. Ознакомьтесь с циклом статей Интеллектуальный анализ данных с помощью программного пакета Weka.
  • В соответствии с требованими проекта Weka все публикации об этом программном продукте должны ссылаться на документ The Weka Data Mining Software: An Update, авторами которого являются Марк Холл (Mark Hall), Эйб Франк (Eibe Frank), Джеффри Холмс (Geoffrey Holmes), Бернард Пфарингер (Bernhard Pfahringer), Петер Рейтеман (Peter Reutemann) и Ян Виттен (Ian H. Witten).
  • Узнайте больше о формате ARFF, чтобы научиться загружать собственные данные в Weka.
  • Ознакомьтесь с дополнительной информацией о больших данных в специальном разделе developerWorks. В этом разделе вы найдете техническую документацию, статьи с инструкциями, обучающие материалы, файлы для загрузки, информацию о продуктах и многое другое.
  • Изучите ресурсы, которые помогут вам приступить к использованию InfoSphere BigInsights— платформы IBM, дополняющей проект с открытым исходным кодом Hadoop такими возможностями, как Big SQL, анализ текста и BigSheets.
  • Ознакомьтесь с руководствами для самостоятельного изучения (в формате PDF), из которых вы узнаете, как управлять средой больших данных, импортировать данные для анализа, анализировать данные с использованием BigSheets, разработать свое первое приложение для больших данных, формировать запросы Big SQL для анализа больших данных и создать экстрактор для извлечения содержимого текстовых документов с использованием InfoSphere BigInsights.
  • Изучите ресурсы, которые помогут вам приступить к использованию InfoSphere Streams, высокопроизводительной вычислительной платформы IBM, позволяющей пользовательским приложениям быстро получать, анализировать и сопоставлять информацию, поступающую из тысяч источников в реальном времени.
  • Следите за техническими мероприятиями и web-трансляциями developerWorks.
  • Следите за developerWorks в Твиттере.

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java
ArticleID=962567
ArticleTitle=Предиктивный анализ: создание простой модели классификации на Java с использованием Weka
publish-date=02132014