Wednesday, January 7, 2015

Core of Personalization at Polyvore: Style Profile

Over the past year, our engineering team has undertaken the task of creating a more personalized experience for our users. We already have an amazing community of designers, artists, and fashion enthusiasts who come to Polyvore to get inspired around shopping. However, we felt that with a little bit of machine learning we could help users discover and shop for even more products that they may not have found on their own.
In this blog post we’ll walk through some of the ways we are using machine learning to understand our users individual style, which we call a Style Profile, to recommend more personalized products and outfits.

What is a Style Profile?

When we first started building each user’s Style Profile, we quickly realized how tricky quantifying fashion can be. It’s intangible, means different things for different people and even when most people might own the same black shirt, they might wear it in completely different ways. Luckily, Polyvore is uniquely positioned to understand personal style through our users rich interactions on Polyvore, including:

  • Global factors: occasions, trends, seasonality and other contextual information
  • Catalog data: rich and high-quality metadata of products from our retail partners
  • Product data: product likes and dislikes, collections of products, products viewed and search queries
  • Shopper behavioral data: impressions, likes, outbound clicks while they are interacting with products, sets and other curated content
  • Community data: Our global community has generated billions of data points that helps us understand the relationship between retail products. Every time a user creates a set, they are implying that those products go together and share the same style. 

From a technology standpoint, a user’s Style Profile can be represented with a vector in a high-dimensional space and the component for each dimension, indicating the strength of their preference in a particular aspect or a combination of multiple aspects in fashion. The following is a simplified representation of two users’ style profile on combinations of color, category, material and brand:

Figure 1: Style profiles

  • Style Space Definition: a high dimensional space where any point represents the style of a user or product that is subject to constraints that points with similar style should be closer to each other than those with different tastes.
  • Style Vector Definition: the coordinates in the Style Space denote the taste vector for that particular user or product.

How do you generate a Style Profile? In order to generate a Style Profile for a user, we use a special balance of different factors:
  • Products: We look at all the products the user engages with. Every product has multiple data points such as category, brand, retailer, color, material and style.
  • Categories: We look at each category and store the frequency of each attribute value. Users have different preferences for different categories, for example, a user might love bright colored tops but only like dark black shoes. Color also has a limited number of values so we calculate the spread of frequencies to determine how strong the preference is for certain colors.
  • Dislikes: If a user consistently dislikes certain categories or products with certain attributes, we’ll be less likely to recommend these products. On the other hand, a user might have both positive and negative signals for the same attributes. In this case, we discount the positive signals for that attribute. An interesting challenge we’re still tackling is understanding exactly what those negative signals. Since style is so intangible, it’s hard to say whether the user disliked the material, color, brand or the price.

Figure 2: Generating style profile

How Does Polyvore Use The Style Profile To Generate Personalized Recommendations?

Now that we’ve built a Style Profile for each user, we use it to generate three separate recommendation streams which we call attribute-affinity streams, collaborative filtering streams and co-occurrence streams. For this blog post, we’ll share a bit about attribute-affinity streams.

Attribute-affinity streams generates recommendations based on user’s preferences on certain attributes of products, such as brand, color and material. We calculate this similarity score between the user’s Style Profile and each candidate product we recommend.The score is a weighted sum of matching attributes. The weight of each attribute is determined by its value in the Style Profile. If the score is above a certain threshold, we will recommend the item. If a candidate product has attributes not in their Style Profile we try to guess the user’s preference for it. For example, we see that a user has not liked or disliked any pink T-shirts, but they have liked multiple black T-shirts; so pink T-shirts are given a low score. If the user has likes a lot of colors equally, then pink will receive an average color score. 

If the product category is missing from the Style Profile, we try to use the parent category profile. For example, before recommending a pair of brown boots, even if the user has never liked boots, we tap into her overall preference for shoes until we get more signal. 

With the combination of these three recommendation streams, we are able to create Style Profiles for every user, making it easier for them to discover and shop for the things they love.

Stay tuned for the next post, when we will talk more about how we measure users’ engagement of these personalized streams and what insights we’ve discovered.