[БЕЗ_ЗВУКА] В этом видео мы рассмотрим различные подходы к построению рекомендательных систем. На самом деле, таких подходов довольно много, все они перед вами, и каждый из них мы с вами рассмотрим. Давайте начнем с самого первого. Самый первый подход называется коллаборативная фильтрация. Конечно же, с ней вы уже знакомы, поэтому я всего лишь коротко напомню идею. В рамках этого подхода мы строим рекомендации для каждого пользователя на основании предпочтений похожих пользователей. То есть из множества U мы выбираем тех пользователей, которые похожи на нашего пользователя Ui, далее смотрим, как они оценили объекты, которые наш пользователь еще не видел, и на основе этих оценок строим оценки для тех самых объектов. Далее, рекомендации мы строим на основе полученных оценок. Все очень логично. И следующий подход к построению рекомендаций, который мы с вами рассмотрим, называется content-based. В рамках этого подхода мы опять работаем с множеством пользователей и множеством объектов, однако сам подход к построению рекомендаций очень сильно отличается. В рамках этого подхода нам нужно представить каждый объект из множества I в виде вектора признаков. И сразу же возникает вопрос, откуда, вообще говоря, эти признаки возьмутся? Все очень просто: эти признаки зависят от той предметной области, в которой мы работаем. Скажем, если мы с вами работаем с рекомендательной системой для кино, то нам нужны признаки, которые позволяют описать каждый фильм. Скажем, про каждый фильм мы, скорее всего, знаем жанр, знаем режиссера, знаем год издания, знаем актеров, которые в нем играли. Соответственно, вот именно эти факторы и могут быть признаками. Если же мы говорим о рекомендательной системе, связанной с некоторыми продуктами, например, с одеждой, то здесь ситуация совершенно другая. Мы можем описывать бренд, цвета, размеры, категорию — совсем другие признаки, релевантные нашей предметной области. Предположим, с признаками все понятно, с объектами мы разобрались. Теперь нам нужно научиться описывать пользователя, ведь на самом деле про пользователя мы тоже знаем довольно много информации. Как минимум, мы понимаем, как наши пользователи взаимодействовали с рекомендательной системой. Соответственно, для каждого пользователя мы можем рассчитать признаки, связанные с его поведением, например, любимая категория продуктов, любимые фильмы, любимые жанры, любимые режиссеры. Все эти признаки также помогут нам в построении рекомендательной системы. На самом деле, мы можем поступить еще интереснее и для каждой пары пользователь-объект рассчитать признаки, описывающие их взаимодействие, например, рассмотрим рекомендательную систему продуктов. В этом случае мы можем рассчитать следующие признаки: просматривал ли ранее пользователь этот продукт, как часто пользователь покупал такие продукты, дата последней покупки пользователем этого продукта и частота покупок продуктов из этой же категории, то есть довольно много всего. Соответственно, мы с вами научились считать три группы признаков: признаки, описывающие товар, признаки, описывающие пользователя, и парные признаки. Теперь мы можем собрать обучающую выборку, описывающую каждую пару пользователь-объект. Единственный вопрос, который остался, это что же будет выступать в роли целевой функции. Что мы будем прогнозировать? Здесь все просто: давайте будем прогнозировать те самые оценки, которые пользователи дают объектам. Таким образом, получив обучающую выборку, мы получили возможность построить модель, модель классификации или регрессии, которая будет приближать оценки пользователей. Соответственно, предположение, которое здесь делается по тем признакам, которые мы выделили ранее, по описаниям объектов, по описаниям пользователей и по парным признакам, мы сможем восстановить предпочтения пользователей — довольно разумное предположение. Далее, применяя полученную модель к неизвестным парам пользователь-объект, мы будем приближать те оценки, которые бы пользователь поставил этому объекту. И, соответственно, на основе таких восстановленных оценок мы будем строить рекомендации. Довольно интересный подход. Теперь давайте рассмотрим следующий подход — это рекомендации на основе демографии. Они строятся тоже довольно интересным образом. Первое, что нам нужно сделать, это собрать все данные, которые нам доступны о пользователе. Как минимум, нам доступны данные о том, как пользователь использует нашу рекомендательную систему, но в целом нам могут быть доступны и внешние, дополнительные данные. Например, нам могут быть известны социально-демографические характеристики пользователя: его пол, его возраст, род деятельности, образование. На основе собранных данных нам нужно произвести сегментацию пользователей, то есть поделить пользователей на группы, на группы похожих пользователей, а далее для полученных групп посчитать их предпочтения, то есть посмотреть, какие объекты предпочитают пользователи из одной группы. Как же строить рекомендации? Очень просто! Когда к нам приходит новый пользователь, мы просто смотрим, в какую из этих групп он попадает, на какую группу людей он наиболее похож, и дальше мы имеем возможность строить для него рекомендации, исходя из того, какие предпочтения имеет группа. Ну и аналогичным образом мы можем делать рекомендации для членов группы, исходя из того, что нравится другим членам этой же группы. Все довольно просто. Соответственно, такие рекомендации носят название demographic-based, основанные на демографии либо каких-то других признаках, описывающих пользователей. И следующий подход, который мы рассматриваем, называется utility-based. Он несколько похож на content-based подход с той точки зрения, что нам снова нужно представить каждый объект с помощью вектора признаков, но дальше начинаются расхождения. Для каждого пользователя мы должны разработать его собственную utility function, или функцию полезности, которая будет оценивать полезность данного объекта для данного пользователя. И, естественно, самая большая проблема этого подхода, самый главный вопрос, на который нужно ответить, это как такую user-based utility function построить, то есть как построить вот эту функцию для каждого пользователя. Давайте разбираться на примере. Предположим, что мы разрабатываем рекомендательную систему фильмов. Как в этом случае может выглядеть функция полезности? Мы можем предположить, что каждый пользователь сообщает нам о том, какие интересы у него есть, то есть какие жанры ему нравятся. С одной стороны, он может сделать это явно, выбрав те жанры, которые он предпочитает, с другой стороны, мы можем понять это, оценив те фильмы, которые он просмотрел и которым он поставил высокие оценки. Как в таком случае определить utility function? Про каждый новый объект, про каждый фильм мы знаем, какой у него жанр. Давайте построим функцию, которая на основании жанра фильма будет оценивать его полезность для данного пользователя. Допустим, если фильм имеет жанр science fiction и пользователь любит этот жанр, то полезность этого фильма, значение utility function на нем будет высокое. Если же пользователь предпочитает другие жанры, например, художественные фильмы или историческое кино, то тогда, конечно, полезность этого фильма будет меньше. Соответственно, такую utility function нужно рассчитать для каждого пользователя и далее на ее основе строить рекомендации, выбирать только те объекты, которые получают большое значение по этой функции. И последний подход к построению рекомендаций, который мы с вами рассматриваем, называется knowledge-based, или рекомендации, основанные на базе знаний. В рамках этого подхода мы снова представляем объект в виде векторов признаков, а дальше на основе знания о том, как эти объекты соотносятся с интересами пользователя, мы строим базу знаний, которая с помощью правил эти соотношения описывает. Далее, на основе предпочтений пользователей опять оценивается полезность объектов по этим правилам, и на основании этой полезности строятся рекомендации. Проблема этого подхода опять же состоит в том, что нам нужно эту базу знаний каким-то образом построить, и это часто бывает неочевидно. Итак, мы с вами рассмотрели пять подходов к построению рекомендаций: это рекомендации на основе коллаборативной фильтрации, content-based рекомендации, рекомендации на основе демографии, а также рекомендации на основе функции полезности и на основе базы знаний. На самом деле, выделяют два основных подхода: это коллаборативная фильтрация и content-based рекомендации. Все остальные подходы так или иначе похожи на какой-то из первых двух и часто рассматриваются как их подмножество. Например, рекомендации на основе демографии очень похожи на коллаборативную фильтрацию, там используются схожие идеи, поэтому их не всегда выделяют в отдельный класс, а рекомендации на основе функций полезности и базы знаний часто рассматривают как подмножество content-based рекомендаций. Давайте сосредоточимся на двух этих типах рекомендаций и постараемся их сравнить. Сначала посмотрим на коллаборативную фильтрацию. Такой подход позволяет нам учитывать кросс-жанровые интересы пользователя, то есть строить рекомендации из разных групп, например, рассматривать фильмы разных жанров, продукты разных категорий, ну и вообще рекомендовать ему товары, непохожие друг на друга. С другой стороны, такой тип рекомендаций позволяет нам использовать так называемый неявный feedback, то есть мы можем учитывать неявную информацию, которую пользователь оставляет о продуктах. Это необязательно должна быть явная оценка, мы можем также использовать такие сигналы, как просмотр страниц или время просмотра страницы некоторого объекта. Еще один плюс этих рекомендаций заключается в том, что их качество улучшается со временем. Чем больше статистики про каждого пользователя и про каждый объект мы накопили, тем больше информации мы знаем, и тем более качественные рекомендации мы получаем. Теперь давайте посмотрим, какие же у этого метода есть проблемы. Ну, во-первых, в рамках этого метода очень сильно актуальна проблема холодного старта, причем она актуальна как для пользователей, так и для объектов. Поясню, что это такое. Когда мы видим нового пользователя, он еще не успел сильно повзаимодействовать с нашей системой и не успел оценить много объектов. Соответственно, у нас с вами недостаточно информации для того, чтобы сделать для него хорошие рекомендации, чтобы понять, на кого он похож и какие объекты ему нужно рекомендовать. С другой стороны, когда у нас появился новый объект, не очень много пользователей успели его оценить, и нам снова сложно его кому-то рекомендовать. Также в рамках этого подхода актуальна проблема gray sheep, или серой овцы. Эта проблема заключается в том, что если у нас есть пользователи, которые непохожи на других, например, пользователь, у которого просто нет близких пользователей в нашей базе данных, то мы ничего не сможем ему порекомендовать, потому что он ни на кого не похож, мы не сможем распространить на него поведение других пользователей. Ну и также всегда актуальна проблема популярных объектов. Если у нас есть объект, который все посмотрели, который всем понравился, то, конечно же, мы будем постоянно рекомендовать его для всех. Это довольно очевидная рекомендация, пользы от которой не очень много. Теперь давайте поговорим про content-based рекомендации. В рамках content-based подхода мы имеем почти те же самые преимущества. Мы снова можем использовать неявный feedback пользователя, и качество нашей системы будет только расти со временем. Однако нам уже не так просто строить кросс-жанровые рекомендации. С другой стороны, у нас гораздо меньше проблем. Как минимум, мы избавляемся от проблемы холодного старта для новых объектов, ведь как только объект появляется в нашей системе, мы сразу же понимаем, какие у него есть признаки, а, значит, наравне со всеми остальными объектами можем рекомендовать его пользователям. С другой стороны, проблема «серой овцы» также решается, потому что мы гораздо меньше полагаемся на то, насколько наш пользователь похож на всех остальных, ну и проблема популярных товаров тоже актуальна в сильно меньшей степени. Возникает вопрос: что, если нам хочется, с одной стороны, использовать все преимущества коллаборативного подхода, а, с другой стороны, пользоваться тем, что content-based подход имеет гораздо меньше проблем? Пусть у нас доступно довольно много информации о пользователях, довольно много информации о признаках объекта, но, с другой стороны, у нас очень много оценок. То есть кажется, что нам хочется применять и один подход, и второй, и еще каким-то образом использовать все их преимущества. Давайте так и сделаем. В следующем видео вы узнаете, каким образом можно объединять различные подходы в рамках одной рекомендательной системы.