Моделирование степени привлекательности

Hot or Not – это сайт, на который пользователи могут загружать собственные фотографии. Первоначально идея состояла в том, чтобы одни пользователи могли оценивать внешность других. Собранные результаты обрабатывались, и каждому человеку выставлялась оценка от 1 до 10. С тех пор Hot or Not превратился в сайт знакомств и теперь предоставляет API, позволяющий получать демографическую информацию

о пользователях вместе с рейтингом их «привлекательности». Это интересный тестовый пример для модели деревьев решений, поскольку мы имеем набор входных переменных, единственную выходную переменную и потенциально любопытный процесс рассуждения. Да и сам по себе сайт представляет хороший пример коллективного разума. Как обычно, для доступа к API нужен ключ разработчика. Вы можете зарегистрироваться и получить ключ на странице http://dev.hotornot. com/signup.

API сайта Hot or Not работает практически так же, как и другие рассмотренные выше API. В URL передаются параметры, и разбирается возвращенный XML-документ. Для начала создайте файл hotornot.py и включите в него предложения импорта и определение вашего ключа:

import urllib2

import xml.dom.minidom

api_key="479NUNJHETN" Далее нужно получить случайный список людей, составляющих набор данных. К счастью, в API сайта Hot or Not предусмотрен вызов, возвращающий список людей, отвечающих заданным критериям. В нашем примере единственным критерием будет наличие профиля meet me (встретиться со мной), так как только из него можно получить такую информацию, как местонахождение и интересы. Добавьте в файл hotornot.py следующую функцию:

def getrandomratings(c):

#       Создаем URL для вызова функции getRandomProfile url="http://services.hotornot.com/rest/?app_key=%s" % api_key url+="&method=Rate.getRandomProfile&retrieve_num=%d" % c url+="&get_rate_info=true&meet_users_only=true"

f1=urllib2.urlopen(url).read( )

doc=xml.dom.minidom.parseString(f1)

emids=doc.getElementsByTagName(’emid’) ratings=doc.getElementsByTagName(‘rating’)

#       Объединяем идентификаторы и рейтинги в один список result=[]

for e,r in zip(emids,ratings): if r.firstChild!=None:

result.append((e.firstChild.data,r.firstChild.data)) return result

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

stateregions={‘New England’:[‘ct’,’mn’,’ma’,’nh’,’ri’,’vt’], ‘Mid Atlantic’:[‘de’,’md’,’nj’,’ny’,’pa’], ‘South’:[‘al’,’ak’,’fl’,’ga’,’ky’,’la’,’ms’,’mo’,

‘nc’,’sc’,’tn’,’va’,’wv’], ‘Midwest’:[‘il’,’in’,’ia’,’ks’,’mi’,’ne’,’nd’,’oh’,’sd’,’wi’], ‘West’:[‘ak’,’ca’,’co’,’hi’,’id’,’mt’,’nv’,’or’,’ut’,’wa’,’wy’]

API предоставляет метод загрузки демографических данных об одном человеке, поэтому функция getpeopledata просто обходит в цикле результаты первого поиска и запрашивает у API детали. Добавьте ее в файл hotornot.py:

def getpeopledata(ratings): result=[]

for emid,rating in ratings:

#       URL метода MeetMe.getProfile

url="http://services.hotornot.com/rest/?app_key=%s" % api_key url+="&method=MeetMe.getProfile&emid=%s&get_keywords=true" % emid

#       Получить всю информацию об этом человеке try:

rating=int(float(rating)+0.5)

doc2=xml.dom.minidom.parseString(urllib2.urlopen(url).read( )) gender=doc2.getElementsByTagName(‘gender’)[0].firstChild.data age=doc2.getElementsByTagName(‘age’)[0].firstChild.data loc=doc2.getElementsByTagName(‘location’)[0].firstChild.data[0:2]

# Преобразуем штат в регион for r,s in stateregions.items( ): if loc in s: region=r

if region!=None:

result.append((gender,int(age),region,rating)) except: pass return result

Теперь можно импортировать этот модуль в интерактивном сеансе и сгенерировать набор данных: >>> import hotornot >>> l1=hotornot.getrandomratings(500) >>> len(l1) 442

>>> pdata=hotornot.getpeopledata(l1) >>> pdata[0]

(u’female’, 28, ‘West’, 9) Список содержит информацию о каждом пользователе, причем в последнем поле представлен рейтинг. Эту структуру данных можно передать функции buildtree для построения дерева:

>>> hottree=treepredict.buildtree(pdata,scoref=treepredict.variance)

>>> treepredict.prune(hottree,0.5)

>>> treepredict.drawtree(hottree,’hottree.jpg’)

Рис. 7.7. Моделирование привлекательности с помощью деревьев решений Построенное дерево изображено на рис. 7.7.

Корневой узел, по которому проводится начальное разбиение, соответствует полу. Остаток дерева довольно сложен, и читать его трудно. Но его, безусловно, можно использовать для прогнозов о людях, которые дереву не предъявлялись. Кроме того, поскольку алгоритм поддерживает восполнение отсутствующих данных, можно группировать людей по крупным переменным. Так, можно сравнить привлекательность живущих в южных и в среднеатлантических штатах: >>> south=treepredict2.mdclassify((None,None,’South’),hottree) >>> midat=treepredict2.mdclassify((None,None,’Mid Atlantic’),hottree) >>> south[10]/sum(south.values( )) 0.055820815183261735 >>> midat[10]/sum(midat.values( )) 0.048972797320600864

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

Вы можете следить за любыми ответами на эту запись через 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