Более сложные способы классификации: ядерные методы и машины опорных векторов

В предыдущих статьях мы рассмотрели несколько классификаторов: деревья решений, байесовские классификаторы и нейронные сети. Сейчас мы ознакомимся с линейными классификаторами и ядерными методами, и это послужит прелюдией к одному из самых продвинутых методов классификации, который все еще является предметов активных исследований, – машинам опорных векторов (Support Vector Machines – SVM).

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

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

Набор данных для подбора пар

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

•          Возраст.

•          Курит или нет?

•          Хочет ли иметь детей?

•          Перечень интересов.

•          Местонахождение.

Кроме того, на сайте собирается информация о том, составили ли два человека хорошую пару, контактировали ли они между собой и решили ли встретиться «в реале». На основе этих данных создается набор для алгоритма подбора пар. Я подготовил два файла для загрузки: http://kiwitobes.com/matchmaker/agesonly.csv http://kiwitobes.com/matchmaker/matchmaker.csv Файл matchmaker.csv выглядит следующим образом:

39,yes,no,skiing:knitting:dancing,220 W 42nd St New York NY,43,no,yes,soccer:reading:scrabble,824 3rd Ave New York NY,0 23,no,no,football:fashion,102 1st Ave New York NY,30,no,no,snowboarding:knitting:computers:shopping:tv:travel, 151 W 34th St New York NY,1 50,no,no,fashion:opera:tv:travel,686 Avenue of the Americas New York NY,49,yes,yes,soccer:fashion:photography:computers: camping:movies:tv,824 3rd Ave New York NY,0

В каждой строке содержится информация об одном мужчине и одной женщине, а 1 или 0 в последнем столбце обозначает, считается ли эта пара хорошей. (Автор осознает, что здесь принято много упрощающих предположений; жизнь всегда оказывается сложнее компьютерных моделей.) Для сайта с большим количеством профилей эту информацию можно использовать для построения прогностического алгоритма, который поможет человеку подыскать себе подходящую пару. Кроме того, можно будет найти, какого сорта люди на сайте не представлены; это полезно для выработки стратегии целенаправленного привлечения новой аудитории. В файле agesonly.csv содержится информация о подборе пар только на основе возраста. Мы воспользуемся им для иллюстрации работы классификаторов, поскольку две переменные визуализировать гораздо проще.

Прежде всего нам понадобится функция для загрузки этого набора данных. Достаточно было бы поместить все поля в список, но для проведения последующих экспериментов мы заведем необязательный параметр, который позволит загружать только некоторые поля. Создайте новый файл advancedclassify.py и включите в него класс matchrow и функцию loadmatch: class matchrow: def __init__(self,row,allnum=False): if allnum:

self.data=[float(row[i]) for i in range(len(row)-1)] else:

self.data=row[0:len(row)-1] self.match=int(row[len(row)-1])

def loadmatch(f,allnum=False): rows=[]

for line in file(f):

rows.append(matchrow(line.split(‘,’),allnum)) return rows

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

>>> import advancedclassify

>>> agesonly=advancedclassify.loadmatch(‘agesonly.csv’,allnum=True) >>> matchmaker=advancedclassify.loadmatch(‘matchmaker.csv’)

Затруднения при анализе данных

У этого набора есть две интересные особенности: нелинейность и взаимозависимость переменных. Если по ходу чтения вы установили библиотеку matplotlib {http://matplotlib.sourceforge.net), то получите возможность визуализировать некоторые переменные с помощью класса advancedclassify и сгенерировать пару списков. {Этот шаг необязателен для понимания остального материала данной статьи.) Введите в интерактивном сеансе такой код:

from pylab import * def plotagematches(rows):

xdm,ydm=[r.data[0] for r in     rows  if r.match==1],\

[r.data[1] for r in            rows  if r.match==1]

xdn,ydn=[r.data[0] for r in     rows  if r.match==0],\

[r.data[1] for r in            rows  if r.match==0]

plot(xdm,ydm,’go’) plot(xdn,ydn,’ro’)

show( )

а затем выполните следующие команды: >>> reload(advancedclassify)

<module ‘advancedclassify’ from ‘advancedclassify.py’> >>> advancedclassify.plotagematches(agesonly)

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

Рис. 9.1. Точечная диаграмма возраст-возраст

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

Классификатор на основе дерева решений

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

было бы гораздо удобнее взять разность двух возрастов. Обучение дерева решений непосредственно на исходных данных дало бы результат, изображенный на рис. 9.2.

Рис. 9.2. Дерево решений, соответствующее криволинейной границе

Очевидно, что для интерпретации это не годится. Для автоматической классификации, возможно, и подошло бы, но она получилась бы слишком беспорядочной и жесткой. А если бы мы ввели в рассмотрение и другие переменные, помимо возраста, то результат оказался бы еще хуже. Чтобы понять, что же делает это дерево, обратимся к точечной диаграмме и границе решения, созданной этим деревом (рис. 9.3).

Рис. 9.3. Граница, созданная деревом решений

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100