Содержание


Использование языка Python, пакета SciKit и средств классификации текста для профилирования поведения клиентов

Comments

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

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

Анализ текста и другие методы обработки естественного языка (NLP) могут быть весьма полезны для извлечения смысла из этих неструктурированных текстовых атрибутов, которые, в свою очередь, имеют определенную ценность с точки зрения таких задач, как профилирование поведения.

В статье описывается пример создания модели профиля поведения с использованием методов классификации текста. SciKit — мощный Python-пакет машинного обучения, позволяющий создавать и оценивать модели – используется в данной статье для применения этой модели к имитируемым клиентам и их историям покупки товаров. В данном конкретном сценарии мы сконструируем модель, которая присваивает каждому клиенту один из нескольких профилей любителя музыки (рейвер, гот, металлист и т. д.). Это присвоение базируется на конкретных товарах, приобретаемых каждым клиентом, и на соответствующих текстовых описаниях этих товаров.

Сценарий профиля поведения любителя музыки

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

Описание: Компания Rivet Head неизменно предлагает обувь модных фасонов для таких субкультур, как индастриал, готика и дарквейв. Эти мужские ботинки типа с застежками на ремнях не является исключением из этого правила. Отличительные особенности: верх изготовлен из синтетической искусственной кожи, передняя шнуровка, перекрещивающиеся ремни с пряжками, подметка на винтах, мысок военного типа, застежка-молния с внутренней стороны для упрощения одевания и снимания. Резиновая подметка. Ремни имеют длину 13,5 дюймов и охватывают примерно 16 дюймов по окружности ноги в районе подъема (измерения соответствуют размеру обуви 9,5). Стиль: Мужские ботинки Buckle Boot.

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

Как показано ниже, куратор использует примеры товаров для построения профиля поведения, модели поведения, профиля клиента и, наконец, профиля поведения клиента.

Рисунок 1. Высокоуровневый подход для создания профиля поведения клиента
Image shows workflow of the sample scenario
Image shows workflow of the sample scenario

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

  • Панки
  • Готы
  • Любители хип-хопа
  • Металлисты
  • Рейверы

Предоставим примеры товаров (таких как описания альбомов и групп), идентифицированных как относящиеся к определенной категории — например, для панков это альбом Never Mind the Bollocks группы Sex Pistols. Другими элементами могут быть товары, связанные с прическами или с обувью, например, аксессуары для прически "ирокез" или ботинки фирмы Doc Marten.

Библиотеки, программы и данные

Все данные и программы (исходный код), используемые в этой статье, можно загрузить со страницы проекта bpro на сайте JazzHub. После загрузки и распаковки tar-файла убедитесь в наличии Python, SciKit Learn (пакет для машинного обучения и анализа текста) и всех зависимостей (numpy, scipy и т.д.). Если вы работаете в среде Mac, то наилучшим выбором, скорее всего, является пакет SciPy Superpack.

После распаковки tar-файла вы увидите два YAML-файла, содержащих данные профиля. Описания товаров генерируются искусственно с использованием опорных данных или тел документов. В ходе этого процесса соблюдаются частоты употребления соответствующих слов в описаниях реальных товаров. Текст в листинге 1 представляет собой искусственное описание товара.

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

Листинг 1. Искусственное описание товара
customer single clothes for his size them 1978 course group 
rhymes have master record-breaking group few starts heard 
blue ending company that the band the music packaged 
master kilmister not trousers got cult albums heart 
commentary cut 20.85 tour...

В описываемом исследовании используются два файла.

  • customers.yaml— состоит из списка клиентов. Для каждого клиента приводится список описаний товара, а также целевая метка, она же корректный профиль поведения. Корректный профиля поведения — это профиль, о корректности которого вы знаете. Например, в реальном сценарии вы инспектируете данные профиля для клиента-гота, чтобы убедиться в том, что его текущие покупки указывают на принадлежность клиента к этой субкультуре.
  • behavioral_profiles.yaml— cостоит из списка профилей (панки, готы и т.д.) с эталонным набором описаний товаров, определяющих этот профиль.

Вы можете сгенерировать собственные имитируемые файлы с помощью следующей команды: python bpro.py -g.

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

Создание модели профиля поведения

Для начала постройте простое, основанное на количестве терминов представление текстового корпуса. Для этого воспользуйтесь утилитой CountVectorizer из SciKit. Объект корпуса представляет собой простой список строк, содержащих описания товаров.

Листинг 2. Построение простого списка терминов
    vectorizer = CountVectorizer(gmin_df=1)
    corpus=[]
    for bp in behavioral_profiles:
        for pd in bp.product_descriptions:
            corpus.append(pd.description)

В состав пакета SciKit входят и другие, более совершенные, векторизаторы, такие как TFIDFVectorizer, который хранит термины документа с весами TF/IDF (Term Frequency/Inverse Document Frequency). TF/IDF-представление полезно для присвоения уникальным терминам, таким как Ozzy, raver, and Bauhaus, более высоких весовых коэффициентов, чем у часто встречающихся терминов, таких как and, the, for.

После этого присвойте описаниям товаров токены в виде отдельных слов и постройте словарь терминов. Каждому термину, найденному анализатором в ходе этого процесса, присваивается уникальный целочисленный индекс, который соответствует столбцу в результирующей матрице:
fit_corpus = vectorizer.fit_transform(corpus)

Примечание. Кроме того, эта конфигурация токенизатора (tokenizer) отбрасывает слова, состоящие из одного символа.

Можно вывести на печать некоторые результаты "токенизации". Для этого воспользуйтесь командой print vectorizer.get_feature_names()[200:210]. Результаты выполнения этой команды показаны ниже.

Листинг 3. Выходная информация команды print
[u'better', u'between', u'beyond', u'biafra', u'big', 
u'bigger', u'bill',   u'billboard', u'bites', u'biting']

Обратите внимание, что текущий векторизатор не имеет слов, являющихся результатом выделения грамматической основы (steming). Выделение грамматической основы — это процесс получения общей базовой или исходной формы для флективных или производных слов. Например, big— это основа слова bigger в предыдущем списке. Пакет SciKit не поддерживает процессов более глубокой токенизации, таких как выделение основы, лемматизация и разделение сложных слов, однако вы сможете воспользоваться специальными токенизаторами, например, из состава библиотеки NLTK (Natural Language Toolkit). На сайте scikit-learn.org приведен отличный пример специального токенизатора.

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

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

Листинг 4. Создание векторов характеристик и векторов целевых меток
   data_target_tuples=[ ]
    for bp in behavioral_profiles:
        for pd in bp.product_descriptions:
            data_target_tuples.append((bp.type, pd.description))

    shuffle(data_target_tuples)

Затем осуществляется сборка этих векторов, как показано в листинге 5.

Листинг 5. Сборка векторов
    X_data=[ ]
    y_target=[ ]
    for t in data_target_tuples:
        v = vectorizer.transform([t[1]]).toarray()[0]
        X_data.append(v)
        y_target.append(t[0])

    X_data=np.asarray(X_data)
    y_target=np.asarray(y_target)

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

Оценка модели профиля поведения

Начните с использования модели SVM (Linear Support Vector Machine) – это хорошая модель, отлично подходящая для задач с разреженными векторами, таких как наша. Используйте следующий код: linear_svm_classifier = SVC(kernel="linear", C=0.025).

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

Листинг 6. Использование карты классификаторов
classifier_map = dict()
classifier_map["Nearest Neighbors"]=KNeighborsClassifier(3)
classifier_map["Linear SVM"]=SVC(kernel="linear", C=0.025)
classifier_map["RBF SVM"]= SVC(gamma=2, C=1)
classifier_map["Decision Tree"]=DecisionTreeClassifier(max
    _depth=5)
classifier_map["Random Forest"]=RandomForestClassifier
    (max_depth=5, n_estimators=10, max_features=1)
classifier_map["AdaBoost"]=AdaBoostClassifier()
classifier_map["Naive Bayes"]=GaussianNB()
classifier_map["LDA"]=LDA()
classifier_map["QDA"]=QDA()

Поскольку вы имеете дело с проблемой классификации с несколькими классами — то есть необходимо осуществлять выбор из более чем двух возможных категорий — вам также необходимо задать соответствующую стратегию. Обычный подход состоит в выполнении классификации по принципу один ко многим. Например, описания товара из готического класса используются для определения одного класса, а другой класс состоит из примеров описаний всех других классов —metal, rave и т.д. И, наконец, в рамках процесса валидации вам необходимо позаботиться о том, чтобы для обучения модели использовались не те же самые данные, на которых она тестируется. Обычная методика состоит в использовании т. н. перекрестной валидации (cross-fold validation). Мы используем пять подвыборок (fold), другими словами, совершаем пять прогонов с использованием данных, разделенных на пять частей. В каждом прогоне четыре части данных используются для обучения, а одна оставшаяся часть - для тестирования.

Листинг 7. Перекрестная валидация
scores = cross_validation.cross_val_score(OneVsRestClassifier
    (linear_svm_classifier), X_data, y_target, cv=2)
print("Accuracy using %s: %0.2f (+/- %0.2f) and %d folds" 
    % ("Linear SVM", scores.mean(), scores.std() * 2, 5))

Мы получаем безукоризненную точность, но следует отметить, что это признак того, что имитируемые данные в определенном смысле "слишком совершенны". Разумеется, в реальном сценарии будет иметь место определенный шум, поскольку идеальные границы между группами существуют далеко не всегда. Например, существует проблемный для нас жанр т. н. готического панка (goth punk), и такую группу, как Crimson Scarlet, можно было бы использовать в качестве обучающего примера и для класса goth, и для класса punk. Вы можете поэкспериментировать с опорными данными в загруженном пакете bpro , чтобы лучше понять шум этого типа.

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

Листинг 8. Обучение модели профиля поведения
    behavioral_profiler = SVC(kernel="linear", C=0.025)
    behavioral_profiler.fit(X_data, y_target)

Экспериментирование с моделью поведения

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

Листинг 9. Экспериментирование с моделью
print behavioral_profiler.predict(vectorizer.transform(['Some black 
Bauhaus shoes to go with your Joy Division hand bag']).toarray()[0])

Обратите внимание, что в действительности модель возвращает ['goth']. Если вы удалите слово Bauhaus и снова запустите эту модель, то увидите, что теперь она возвращает ['punk'].

Применение модели поведения к клиентам

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

Листинг 10. Применение обученной модели к нашим клиентам и к описаниям купленных ими товаров
predicted_profiles=[ ]
ground_truth=[ ]
for c in customers:
    customer_prod_descs = ' '.join(p.description for p in 
c.product_descriptions)
    predicted =   behavioral_profiler.predict(vectorizer
.transform([customer_product_descriptions]).toarray()[0])
    predicted_profiles.append(predicted[0])
    ground_truth.append(c.type)
    print "Customer %d, known to be %s, was predicted to 
be %s" % (c.id,c.type,predicted[0])

И, наконец, вычислите точность, чтобы увидеть, с какой вероятностью вам удается правильно профилировать покупателей.

Листинг 11. Вычисление точности
    a=[x1==y1 for x1, y1 in zip(predicted_profiles,ground_truth)]
    accuracy=float(sum(a))/len(a)
    print "Percent Profiled Correctly %.2f" % accuracy

С предоставленными данными для профиля по умолчанию результат должен составить 95%. В случае реальных данных это была бы вполне достаточная степень точности.

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

Теперь, когда модель построена и протестирована, можно применить ее к миллионам профилей клиентов. Вы можете воспользоваться средой MapReduce и направить обученные профилировщики поведения на рабочие узлы (worker node). После этого каждый рабочий узел получит пакет профилей клиентов с их историей покупок и применит модель. Сохраните результаты. Теперь в результате применения модели вашим клиентам присвоены профили поведения. Присвоенные профили можно использовать различными способами. Например, вы можете обращаться к клиентам с целевыми промоакциями или использовать профили в качестве исходных данных для системы рекомендаций товаров.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=984031
ArticleTitle=Использование языка Python, пакета SciKit и средств классификации текста для профилирования поведения клиентов
publish-date=09232014