{"id":110,"date":"2020-08-20T17:20:04","date_gmt":"2020-08-20T17:20:04","guid":{"rendered":"https:\/\/machine-learning.webcloning.com\/2020\/08\/20\/amazon-personalize-can-now-create-up-to-50-better-recommendations-for-fast-changing-catalogs-of-new-products-and-fresh-content\/"},"modified":"2020-08-20T17:20:04","modified_gmt":"2020-08-20T17:20:04","slug":"amazon-personalize-can-now-create-up-to-50-better-recommendations-for-fast-changing-catalogs-of-new-products-and-fresh-content","status":"publish","type":"post","link":"https:\/\/salarydistribution.com\/machine-learning\/2020\/08\/20\/amazon-personalize-can-now-create-up-to-50-better-recommendations-for-fast-changing-catalogs-of-new-products-and-fresh-content\/","title":{"rendered":"Amazon Personalize can now create up to 50% better recommendations for fast changing catalogs of new products and fresh content"},"content":{"rendered":"<div id=\"\">\n<p><a href=\"https:\/\/aws.amazon.com\/personalize\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon Personalize<\/a> now makes it easier to create personalized recommendations for fast-changing catalogs of books, movies, music, news articles, and more, improving recommendations by up to 50% (measured by click-through rate) with just a few clicks in the AWS console. Without needing to change any application code, Amazon Personalize enables customers to include completely new products and fresh content in their usual recommendations, so that the best new products and content is discovered, clicked, purchased, or consumed by end-users an order of magnitude more quickly than other recommendation systems.<\/p>\n<p>Many catalogs are fast moving with new products and fresh content being continuously added, and it is crucial for businesses to help their users discover and engage with these products or content. For example, users on a news website expect to see latest personalized news, users consuming media via video-on-demand services expect to be recommended the latest series and episodes they might like. Meeting these expectations by showcasing new products and content to users helps keep the user experience fresh, and aids in sales either through direct conversion, or through subscriber conversion and retention. However, there are usually way too many new products in fast moving catalogs to make it feasible to showcase each of them to every user. It makes much more sense to personalize the user experience by matching these new products with users, based on their interests and preferences. Personalization of new products is inherently hard due to absence of data about past views, clicks, purchases, and subscriptions for these products. In such a scenario, most recommender systems only make recommendations for products they have sufficient past data about, and ignore the products that are new to the catalog.<\/p>\n<p>With today\u2019s launch, Amazon Personalize can help customers create personalized recommendations for new products and fresh content for their users, in matter of a few clicks. Amazon Personalize does this by recommending new products to users who have positively engaged (clicked, purchased, etc.) with similar products in the past. If users positively engage with the recommended new products, Personalize further recommends them to more users with similar interests. At Amazon, this capability has been in use since many years for creating product recommendations, and has resulted in 21% higher conversions compared to recommendations that do not include new products. This capability is now available in Amazon Personalize at no additional cost as part of its existing deep learning based algorithms that have been perfected over years of development and use at Amazon. It\u2019s a win-win situation for customers, as they can benefit from this new capability at no extra cost, without losing out on the highly relevant recommendations that they already create through Amazon Personalize.<\/p>\n<p>Amazon Personalize makes it easy for customers to develop applications with a wide array of personalization use cases, including real time product recommendations and customized direct marketing. Amazon Personalize brings the same machine learning technology used by Amazon.com to everyone for use in their applications \u2013 with no machine learning experience required. Amazon Personalize customers pay for what they use, with no minimum fees or upfront commitment. You can start using Amazon Personalize with a simple three step process, which only takes a few clicks in the AWS console, or a set of simple API calls. First, point Amazon Personalize to user data, catalog data, and activity stream of views, clicks, purchases, etc. in Amazon S3 or upload using a simple API call. Second, with a single click in the console or an API call, train a custom private recommendation model for your data (<code>CreateSolution<\/code>). Third, retrieve personalized recommendations for any user by creating a campaign, and using the GetRecommendations API.<\/p>\n<p>The rest of this post walks you through this process in greater detail and discusses the recommended best practices.<\/p>\n<h2>Adding your data to Personalize<\/h2>\n<p>For this post, we create a dataset group with an interaction dataset and item dataset (item metadata). For instructions on creating a dataset group, see <a href=\"https:\/\/docs.aws.amazon.com\/personalize\/latest\/dg\/getting-started-console.html\" target=\"_blank\" rel=\"noopener noreferrer\">Getting Started (Console)<\/a>.<\/p>\n<h3>Creating an interaction dataset<\/h3>\n<p>To create an interaction dataset, use the following schema and import the file <a href=\"https:\/\/concierge-public-resources.s3-us-west-2.amazonaws.com\/bandits-demo-interactions.csv\" target=\"_blank\" rel=\"noopener noreferrer\">bandits-demo-interactions.csv<\/a>, which is a synthetic movie rating dataset:<\/p>\n<div class=\"hide-language\">\n<pre><code class=\"lang-json\">{\r\n    \"type\": \"record\",\r\n    \"name\": \"Interactions\",\r\n    \"namespace\": \"com.amazonaws.personalize.schema\",\r\n    \"fields\": [\r\n        {\r\n            \"name\": \"USER_ID\",\r\n            \"type\": \"string\"\r\n        },\r\n        {\r\n            \"name\": \"ITEM_ID\",\r\n            \"type\": \"string\"\r\n        },\r\n        {\r\n            \"name\": \"EVENT_TYPE\",\r\n            \"type\": \"string\"\r\n        },\r\n        {\r\n            \"name\": \"EVENT_VALUE\",\r\n            \"type\": [\"null\",\"float\"]\r\n        },\r\n        {\r\n            \"name\": \"TIMESTAMP\",\r\n            \"type\": \"long\"\r\n        },\r\n        {\r\n            \"name\": \"IMPRESSION\",\r\n            \"type\": \"string\"\r\n        }\r\n    ],\r\n    \"version\": \"1.0\"\r\n}\r\n<\/code><\/pre>\n<\/div>\n<p>You can now optionally add impression information to Amazon Personalize. Impressions are the list of items that were visible to the user when they interacted with a particular item. The following screenshot shows some interactions with impression data.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-14878\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/personalized-exploration-1-1.jpg\" alt=\"\" width=\"456\" height=\"65\"><\/p>\n<p>The impression is represented as an ordered list of item IDs that are pipe separated. The first row of the data in the preceding screenshot shows that when <code>user_id 1<\/code> rated <code>item_id 1270<\/code>, they had items <code>1270, 1...9<\/code> in that order visible in the UX. The contrast between which items were recommended to the user and which they interacted with helps us generate better recommendations.<\/p>\n<p>Amazon Personalize has two modes to input impression information:<\/p>\n<ul>\n<li>\n<strong>Explicit impressions<\/strong> \u2013 Impressions that you manually record and send to Personalize. The preceding example pertains to explicit impressions.<\/li>\n<li>\n<strong>Implicit impressions<\/strong> \u2013 The list of items recommended for recommendations users receive from Amazon Personalize<\/li>\n<\/ul>\n<p>Amazon Personalize now returns a <code>RecommendationID<\/code> for each set of recommendations from the service. If you do not change the order or content of the recommendations when generating you user experience you can reference the impression through the <code>RecommendationID<\/code> without needing to send a list of ItemIDs (explicit impressions). If you provide both explicit and implicit impressions for an interaction, the explicit impression takes precedence. You can also send both implicit and explicit recommendations via the <code>putEvents<\/code> API. Please see our documentation for more details.<\/p>\n<h3>Creating an item dataset<\/h3>\n<p>You follow similar steps to create an item dataset and import your data using <a href=\"https:\/\/concierge-public-resources.s3-us-west-2.amazonaws.com\/bandits-demo-items.csv\" target=\"_blank\" rel=\"noopener noreferrer\">bandits-demo-items.csv<\/a>, which has metadata for each movies. We use an optional reserved keyword <code>CREATION_TIMESTAMP<\/code> for the item dataset, which helps Amazon Personalize compute the age of the item and adjust recommendations accordingly. When using your own data to model provide the timestamp when the item was first available to your user in this field. We infer the age of an item from the reference point of the latest interaction timestamp in your dataset.<\/p>\n<p>If you don\u2019t provide the <code>CREATION_TIMESTAMP<\/code>, the model infers this information from the interaction dataset and uses the timestamp of the item\u2019s earliest interaction as its corresponding release date. If an item doesn\u2019t have an interaction, its release date is set as the timestamp of the latest interaction in the training set and it is considered a new item with age 0.<\/p>\n<p>Our dataset for this post has 1,931 movies, of which 191 have a creation timestamp marked as the latest timestamp in the interaction dataset. These newest 191 items are considered cold items and have a label number higher than 1800 in the dataset. The schema of the item dataset is as follows:<\/p>\n<div class=\"hide-language\">\n<pre><code class=\"lang-json\">{\r\n    \"type\": \"record\",\r\n    \"name\": \"Items\",\r\n    \"namespace\": \"com.amazonaws.personalize.schema\",\r\n    \"fields\": [\r\n        {\r\n            \"name\": \"ITEM_ID\",\r\n            \"type\": \"string\"\r\n        },\r\n        {\r\n            \"name\": \"GENRES\",\r\n            \"type\": [\"null\",\"string\"],\r\n            \"categorical\": true\r\n        },\r\n        {\r\n            \"name\": \"TITLE\",\r\n            \"type\": \"string\"\r\n        },\r\n        {\r\n            \"name\": \"CREATION_TIMESTAMP\",\r\n            \"type\": \"long\"\r\n        }\r\n    ],\r\n    \"version\": \"1.0\"\r\n}\r\n<\/code><\/pre>\n<\/div>\n<h2>Training a model<\/h2>\n<p>After the dataset import jobs are complete, you\u2019re ready to train your model.<\/p>\n<ol>\n<li>On the <strong>Solutions<\/strong> tab, choose <strong>Create solution<\/strong>.<\/li>\n<li>Choose the new <code>aws-user-personalization<\/code> recipe.<\/li>\n<\/ol>\n<p>This new recipe effectively combines deep learning models (RNNs) with bandits to provide you more accurate user modeling (high relevance) and effective exploration.<\/p>\n<ol start=\"3\">\n<li>Leave the <strong>Solution configuration<\/strong> section at its default values, and choose<\/li>\n<\/ol>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-14879\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/personalized-exploration-2-1.jpg\" alt=\"\" width=\"800\" height=\"644\"><\/p>\n<ol start=\"4\">\n<li>On the <strong>Create solution version<\/strong> page, choose <strong>Finish<\/strong> to start training.<\/li>\n<\/ol>\n<p>When the training is complete, you can navigate to the <strong>Solution Version Overview<\/strong> page to see the offline metrics. In certain situations, you might see a slight drop on accuracy metrics (such as <code>mrr<\/code> or <code>precision@k<\/code>) and on <code>coverage<\/code> compared to models trained on the HRNN-Metadata recipe. This is because recommendation made by the new <code>aws-user-personalization<\/code> recipe isn\u2019t solely based on exploitation, and it may sacrifice short-term interest for the long-term reward. The offline metrics are computed using the default values of parameters (<code>explorationWeight<\/code>, <code>explorationItemAgeCutoff<\/code>), which impacts item exploration. You can find more details on these in the following section.<\/p>\n<p>After several rounds of retraining, you should see the accuracy metrics and item coverage increase, and the new <code>aws-user-personalization<\/code> recipe should outperform the exploitation-based HRNN-Metadata recipe.<\/p>\n<h2>Creating a campaign<\/h2>\n<p>In Amazon Personalize, you use a campaign to make recommendations for your users. In this step, you create two campaigns using the solution you created in the previous step and demonstrate the impact of different amounts of exploration.<\/p>\n<p>To create a new campaign, complete the following steps:<\/p>\n<ol>\n<li>On the <strong>Campaigns<\/strong> tab, choose <strong>Create Campaign<\/strong>.<\/li>\n<li>For <strong>Campaign name<\/strong>, enter a name.<\/li>\n<li>For <strong>Solution<\/strong>, choose <strong>user-personalization-solution<\/strong>.<\/li>\n<li>For <strong>Solution version ID<\/strong>, choose the solution version that uses the <code>aws-user-personalization<\/code> recipe.<\/li>\n<\/ol>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-14880\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/personalized-exploration-3-1.jpg\" alt=\"\" width=\"633\" height=\"434\"><\/p>\n<p>You now have the option of setting additional configuration for the campaign, which allows you to adjust the exploration Amazon Personalize does for the item recommendations and therefore adjust the results. These settings are only available if you\u2019re creating a campaign whose solution version uses the <code>user-personalization recipe<\/code>. The configuration options are as follows:<\/p>\n<ul>\n<li>\n<strong><u>explorationWeight<\/u><\/strong> \u2013 Higher values for <code>explorationWeight<\/code> signify higher exploration; new items with low impressions are more likely to be recommended. A value of 0 signifies that there is no exploration and results are ranked according to relevance. You can set this parameter in a range of [0,1] and its default value is 0.3.<\/li>\n<li>\n<strong><u>explorationItemAgeCutoff<\/u><\/strong> \u2013 This is the maximum duration in days relative to the latest interaction(event) timestamp in the training data. For example, if you set <code>explorationItemAgeCutoff<\/code> to 7, the items with an age over or equal to 7 days aren\u2019t considered cold items and there is no exploration on these items. You may still see some items older than or equal to 7 days in the recommendation list because they\u2019re relevant to the user\u2019s interests and are of good quality even without the help of the exploration. The default value for this parameter is 30, and you can set it to any value over 0.<\/li>\n<\/ul>\n<p>To demonstrate the effect of exploration, we create two campaigns.<\/p>\n<ol start=\"5\">\n<li>For the first campaign, set <strong>Exploration weight<\/strong> to <strong>0<\/strong>.<\/li>\n<li>Leave <strong>Exploration item age cut off<\/strong> at its default of <strong>30.0<\/strong>.<\/li>\n<li>Choose <strong>Create campaign<\/strong>.<\/li>\n<\/ol>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-14881\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/personalized-exploration-4-1.jpg\" alt=\"\" width=\"800\" height=\"409\"><\/p>\n<p>Repeat the preceding steps to create a second campaign, but give it a different name and change the exploration weight to 1.<\/p>\n<h2>Getting recommendations<\/h2>\n<p>After you create or update your campaign, you can get recommended items for a user, similar items for an item, or a reranked list of input items for a user.<\/p>\n<ol>\n<li>On the <strong>Campaigns<\/strong> detail page, enter the user ID for your user personalization campaign.<\/li>\n<\/ol>\n<p>The following screenshot shows the campaign detail page with results from a <code>GetRecommendations<\/code> call that include the recommended items and the recommendation ID, which you can use as an implicit impression. The service interprets the recommendation ID in training.<\/p>\n<ol start=\"2\">\n<li>Enter a user ID that has interactions in the interactions dataset. For this post, we get recommendations for user ID 1.<\/li>\n<li>On the campaign detail page of the campaign that has an exploration weight of 0, choose the <strong>Detail<\/strong>\n<\/li>\n<li>For <strong>User ID<\/strong>, enter <code>1<\/code>.<\/li>\n<li>Choose <strong>Get recommendations<\/strong>.<\/li>\n<\/ol>\n<p>The following image is for campaigns with an exploration weight of 0; we can see that the recommendation items are old items, and users have already seen or rated those movies.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-14895\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/personalized-exploration-7.jpg\" alt=\"\" width=\"879\" height=\"797\"><\/p>\n<p>The next image shows recommendation results for the same user but for a campaign where we set the exploration weight to 1. This results in a higher proportion of movies that were recently added and that few users have rated being recommended. Furthermore, the trade-off between the relevance (exploitation) and exploration is adjusted automatically depending on the coldness of the new items and as new feedback from users is leveraged.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-14896\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/personalized-exploration-8.jpg\" alt=\"\" width=\"852\" height=\"789\"><\/p>\n<h2>Retraining and updating campaigns<\/h2>\n<p>New interactions against explored items hold important feedback on the quality of the item, which you can use to update exploration on the items. <u>We recommend updating the model hourly<\/u> to adjust the future item exploration.<\/p>\n<p>To update a model(<code>solutionVersion<\/code>), you can call the <code>createSolutionVersion<\/code> API with <code>trainingMode<\/code> set to <code>UPDATE<\/code>. This updates the model with the latest item information and adjusts the exploration according to implicit feedback from the users. This is not equivalent to training a model, which you can do by setting <code>trainingMode<\/code> to <code>FULL<\/code>. You should perform full training less frequently, typically one time every 1\u20135 days. When the new updated <code>solutionVersion<\/code> is created, you can update the campaign to get recommendations using it.<\/p>\n<p>The following code walks you through these steps:<\/p>\n<pre><code class=\"lang-python\">#Updating the solutionVersion (model) and Campaign\r\n\r\nimport time\r\n\r\ndef wait_for_solution_version(solution_version_arn):\r\n    status = None\r\n    max_time = time.time() + 60*60 # 1 hour\r\n    while time.time() &lt; max_time:\r\n        describe_solution_version_response = personalize.describe_solution_version(\r\n            solutionVersionArn = solution_version_arn\r\n        )\r\n        status = describe_solution_version_response[\"solutionVersion\"][\"status\"]\r\n        print(\"SolutionVersion: {}\".format(status))\r\n\r\n        if status == \"ACTIVE\" or status == \"CREATE FAILED\":\r\n            break\r\n        time.sleep(60) \r\n        \r\ndef update_campaign(solution_arn, campaign_arn):\r\n    create_solution_version_response = personalize.create_solution_version(\r\n        solutionArn = solution_arn, \r\n        trainingMode='UPDATE')\r\n    new_solution_version_arn = create_solution_version_response['solutionVersionArn']\r\n    print(\"Creating solution version: {}\".format(new_solution_version_arn))\r\n    wait_for_solution_version(new_solution_version_arn)\r\n    personalize.update_campaign(campaignArn=campaign_arn, solutionVersionArn=new_solution_version_arn)\r\n    print(\"Updating campaign...\")\r\n\r\n# Update the campaign every hour\r\nwhile True:\r\n    dt = time.time() + 60*60\r\n    try:\r\n        solution_arn = &lt;your solution arn&gt;\r\n        campaign_arn = &lt;your campaign arn&gt;\r\n        update_campaign(solution_arn, campaign_arn)\r\n    except Exception as e:\r\n        print(\"Not able to update the campaign: {}\".format(str(e)))\r\n    while time.time() &lt; dt:\r\n        time.sleep(1)<\/code><\/pre>\n<h3>Best practices<\/h3>\n<p>That wraps our post. As you use the new <code>\u2018aws-user-personalization\u2019<\/code> recipe please keep the following best practices in mind.<\/p>\n<ol>\n<li>Don\u2019t forget to do retraining. Retraining, with \u2018UPDATE\u2019 mode is essential to learn about \u201ccold\u201d items. During inference the model will recommend \u201ccold\u201d items to the user and collect user feedback, and retraining will let the model discover the \u201ccold\u201d item properties via collected feedback. Without retraining, the model will never learn more about the \u201ccold\u201d items besides their item metadata, and it will be not be useful to do continued exploration on \u201ccold\u201d items.<\/li>\n<li>Provide good item metadata. Even with the exploration, the item metadata is still crucial for recommending relevant cold items. The model learns item properties from two resources: interactions and item metadata, and since the \u201ccold\u201d items don\u2019t have any interactions, the model can only learn from the item metadata before exploration.<\/li>\n<li>Provide accurate item release date via \u2018CREATION_TIMESTAMP\u2019 in the item dataset. This information is used to model the time effect on the item, so that we do not explore on old items.<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>The new aws-user-personalization recipe from Amazon Personalize effectively mitigates the item cold start problem by also recommending new items with few interactions and learning their properties through user feedback during retraining. For more information about optimizing your user experience with Amazon Personalize, see <a href=\"https:\/\/docs.aws.amazon.com\/personalize\/latest\/dg\/what-is-personalize.html\" target=\"_blank\" rel=\"noopener noreferrer\">What Is Amazon Personalize?<\/a><\/p>\n<hr>\n<h3>About the Authors<\/h3>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-14887\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/hao-ding-10-0.jpg\" alt=\"\" width=\"100\" height=\"139\">Hao Ding is an Applied Scientist at AWS AI Labs and is working on developing next generation recommender system for Amazon Personalize. His research interests include Recommender System, Deep Learning, and Graph Mining<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-14888\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/08\/17\/yen-su-100.jpg\" alt=\"\" width=\"100\" height=\"130\">Yen Su is a software development engineer in Amazon Personalize team. After work, she enjoys hiking and exploring new restaurants.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-11016\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/02\/07\/vaibhav-sethi-100.jpg\" alt=\"\" width=\"100\" height=\"143\">Vaibhav Sethi is the lead Product Manager for Amazon Personalize. He focuses on delivering products that make it easier to build machine learning solutions. In his spare time, he enjoys hiking and reading.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/aws.amazon.com\/blogs\/machine-learning\/amazon-personalize-can-now-create-up-to-50-better-recommendations-for-fast-changing-catalogs-of-new-products-and-fresh-content\/<\/p>\n","protected":false},"author":0,"featured_media":111,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/110"}],"collection":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/comments?post=110"}],"version-history":[{"count":0,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media\/111"}],"wp:attachment":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media?parent=110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/categories?post=110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/tags?post=110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}