{"id":1068,"date":"2020-12-18T16:16:37","date_gmt":"2020-12-18T16:16:37","guid":{"rendered":"https:\/\/nilg.ai\/?p=1068"},"modified":"2022-10-06T15:00:21","modified_gmt":"2022-10-06T15:00:21","slug":"difficult-targets-to-optimize-the-roc-auc","status":"publish","type":"post","link":"https:\/\/nilg.ai\/en_us\/202012\/difficult-targets-to-optimize-the-roc-auc\/","title":{"rendered":"Difficult Targets to Optimize: the ROC AUC"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">In many binary classification problems, especially in domains with highly unbalanced problems (such as the medical domain and rare event detection), we need to make sure our model does not become too biased for the more predominant class.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Thus, you may have heard that accuracy is not a good metric to validate classifiers in unbalanced settings. Instead, people tend to use other performance metrics that are robust to imbalance, such as the ROC AUC and the F1-score. So, why don\u2019t we train models that optimize these metrics directly? Well, in some cases it is not possible\/efficient since they are not differentiable. This is a series of blog posts in which we\u2019ll explain how to optimize your model for such metrics (or soft versions of them), starting with the ROC AUC.\u00a0<\/span><\/p>\n<h2>What is the ROC AUC?<\/h2>\n<p><span style=\"font-weight: 400;\">A ROC curve is a plot that illustrates the diagnostic ability of a binary classifier for varying discriminative thresholds in its probabilistic output.\u00a0 It can be built by thresholding the model\u2019s predicted probabilities at several values between 0 to 1 and calculating the <\/span><b>True Positive Rate <\/b><span style=\"font-weight: 400;\">(Proportion of positive samples correctly predicted as positive) and the <\/span><b>False Positive Rate <\/b><span style=\"font-weight: 400;\">(proportion of negative samples incorrectly predicted as positive). The ROC curve is the plot of all these determined points, as shown below.<\/span><\/p>\n<p><a href=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC.svg\"><img decoding=\"async\" class=\"aligncenter wp-image-1072 attachment-svg\" src=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC.svg\" alt=\"\" width=\"748\" height=\"485\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">In ML, we typically want to achieve the curve with the highest possible area. Why? Maybe you didn\u2019t know this, but the area under the ROC curve equals the probability of the classifier ranking a <\/span><b>randomly chosen positive instance <\/b><span style=\"font-weight: 400;\">ahead of a<\/span><b> randomly chosen negative one<\/b><span style=\"font-weight: 400;\"> (the proof of such a theorem is available <\/span><a href=\"http:\/\/madrury.github.io\/jekyll\/update\/statistics\/2017\/06\/21\/auc-proof.html\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">). Namely, what\u2019s the probability of assigning a higher priority to a sick patient than to a healthy patient.<\/span><\/p>\n<h1><a href=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC-Probabilistic-interpretation.svg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1076 attachment-svg\" src=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC-Probabilistic-interpretation.svg\" alt=\"\" \/><\/a><\/h1>\n<p><span style=\"font-weight: 400;\">So, we can think of the ROC AUC as the <strong>accuracy of a ranking model when exposed to a pair of samples with opposite classes<\/strong> (e.g, one sick and one healthy). Being the cross-entropy loss the <\/span><i><span style=\"font-weight: 400;\">de facto<\/span><\/i><span style=\"font-weight: 400;\"> soft approach for learning binary classifiers when we have accuracy in mind, the cross-entropy of a pairwise ranking model (e.g., a siamese neural network) would be a soft way of learning that tends to maximize the ROC AUC.<\/span><\/p>\n<h2>How to optimize the ROC AUC?<\/h2>\n<p><span style=\"font-weight: 400;\">Let\u2019s say we have a model (e.g., a deep neural network) such as the following one that, given the input features, predicts a continuous score.<\/span><\/p>\n<p><a href=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC-Single-Stream.svg\"><img decoding=\"async\" class=\"aligncenter wp-image-1075 attachment-svg\" src=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC-Single-Stream.svg\" alt=\"\" width=\"165\" height=\"760\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">As we discussed before, maximizing the ROC AUC is equivalent to maximizing the accuracy of the score difference sign for a positive-negative pair:<\/span><\/p>\n<p><a href=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC-Siamese-1.svg\"><img decoding=\"async\" class=\"aligncenter wp-image-1077 attachment-svg\" src=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/ROC-AUC-Siamese-1.svg\" alt=\"\" width=\"382\" height=\"588\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Thus, we can simply use a <\/span><a href=\"https:\/\/link.springer.com\/chapter\/10.1007\/978-3-030-36711-4_27\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Siamese architecture<\/span><\/a><span style=\"font-weight: 400;\">, where each stream will contain our target model, trained on positive-negative pairs. In our architecture, the scores will be subtracted and passed through a sigmoid activation in order to approximate the probability of the positive sample having a higher score than the negative sample.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For generating our training batches, each pair will have a sample from each class, one on the negative stream and one on the positive stream, meaning that the <\/span><b>ground truth<\/b><span style=\"font-weight: 400;\"> will always be<\/span><b> 1<\/b><span style=\"font-weight: 400;\">, as the probability from the positive stream should always be higher than the probability from the negative stream. The model is trained by minimizing the cross-entropy loss of this pairwise target. <\/span><span style=\"font-weight: 400;\">We won\u2019t converge to a naive solution here given that the weights on each stream of a siamese network are shared.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This means the model is penalized whenever the negative side has a greater score than the positive side. As such, we are optimizing the model so that it always gives a higher<\/span><b> score <\/b><span style=\"font-weight: 400;\">to the <\/span><b>positive class<\/b><span style=\"font-weight: 400;\"> (input_pos) when <\/span><b>compared to a negative class<\/b><span style=\"font-weight: 400;\"> (input_neg) &#8211; which is essentially the definition of optimizing ROC AUC!\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So, how do we turn this network into an actionable model, which returns the binary classes? We need to reduce our network to a single stream, with the pre-trained weights, and determine a threshold value for the predicted score above which the model classifies the class as positive.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Validation<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">This architecture was tested on the <\/span><a href=\"https:\/\/keras.io\/api\/datasets\/cifar10\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">CIFAR10 dataset in Keras<\/span><\/a><span style=\"font-weight: 400;\">, by creating an artificially unbalanced problem. The positive class was considered to be \u201cairplanes\u201d, and the negative class was all the other classes in the dataset. The positive class was then subsampled to 5% so we created an artificially unbalanced problem.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Afterward, we used a feedforward network with internal dropout layers and compared the performance of the simple cross-entropy-based strategy to train classifiers with the siamese-based models that we discussed in this post. The experiment was repeated 5 times with different random seeds to get a mean value more independent of the image selection process.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The mean ROC AUC value for the Siamese Network was (86 \u00b1 1.3)%, while for the one-stream network the value was reduced to (72.2 \u00b1\u00a0 7.2)%, showing that optimizing the model with the siamese architecture was beneficial for the ROC AUC.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Conclusion<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">This blogpost explained how to optimize your model for a different metric, based on the probabilistic interpretation of ROC AUC.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">At NILG.AI, we have worked on a lot of medical and marketing applications, where targets tend to be extremely unbalanced. We have used this strategy in several projects, achieving on each case higher performance with this learning strategy than with traditional learning approaches. If you are facing a similar problem, let\u2019s discuss how we can collaborate with these types of learning approaches!<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In many binary classification problems, especially in domains with highly unbalanced problems (such as the medical domain and rare event detection), we need to make sure our model does not become too biased for the more predominant class.\u00a0 Thus, you may have heard that accuracy is not a good metric to validate classifiers in unbalanced [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":1070,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[81,45],"class_list":["post-1068","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technical","tag-deep-learning","tag-machine-learning"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Difficult Targets to Optimize: the ROC AUC - NILG.AI<\/title>\n<meta name=\"description\" content=\"Learn how to make your ML model optimize the ROC AUC instead of the classical cross-entropy loss. A practical tutorial for imbalance data.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nilg.ai\/en_us\/202012\/difficult-targets-to-optimize-the-roc-auc\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Difficult Targets to Optimize: the ROC AUC - NILG.AI\" \/>\n<meta property=\"og:description\" content=\"Learn how to make your ML model optimize the ROC AUC instead of the classical cross-entropy loss. A practical tutorial for imbalance data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nilg.ai\/en_us\/202012\/difficult-targets-to-optimize-the-roc-auc\/\" \/>\n<meta property=\"og:site_name\" content=\"NILG.AI\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-18T16:16:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-06T15:00:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/pexels-christina-morillo-1181343-e1653993600474.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1367\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Paulo Maia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nilg_ai\" \/>\n<meta name=\"twitter:site\" content=\"@nilg_ai\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paulo Maia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/\"},\"author\":{\"name\":\"Paulo Maia\",\"@id\":\"https:\/\/nilg.ai\/#\/schema\/person\/a860b9395bd25c5090160a3ac30e980d\"},\"headline\":\"Difficult Targets to Optimize: the ROC AUC\",\"datePublished\":\"2020-12-18T16:16:37+00:00\",\"dateModified\":\"2022-10-06T15:00:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/\"},\"wordCount\":902,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/nilg.ai\/#organization\"},\"keywords\":[\"Deep Learning\",\"Machine Learning\"],\"articleSection\":[\"Technical\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/\",\"url\":\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/\",\"name\":\"Difficult Targets to Optimize: the ROC AUC - NILG.AI\",\"isPartOf\":{\"@id\":\"https:\/\/nilg.ai\/#website\"},\"datePublished\":\"2020-12-18T16:16:37+00:00\",\"dateModified\":\"2022-10-06T15:00:21+00:00\",\"description\":\"Learn how to make your ML model optimize the ROC AUC instead of the classical cross-entropy loss. A practical tutorial for imbalance data.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nilg.ai\/#website\",\"url\":\"https:\/\/nilg.ai\/\",\"name\":\"NILG.AI\",\"description\":\"Create ever-improving businesses with AI\",\"publisher\":{\"@id\":\"https:\/\/nilg.ai\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nilg.ai\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nilg.ai\/#organization\",\"name\":\"NILG.AI\",\"url\":\"https:\/\/nilg.ai\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nilg.ai\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nilg.ai\/wp-content\/uploads\/2022\/03\/logo.svg\",\"contentUrl\":\"https:\/\/nilg.ai\/wp-content\/uploads\/2022\/03\/logo.svg\",\"caption\":\"NILG.AI\"},\"image\":{\"@id\":\"https:\/\/nilg.ai\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/nilg_ai\",\"https:\/\/youtube.com\/@nilg_ai\",\"https:\/\/www.linkedin.com\/company\/nilg-ai\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nilg.ai\/#\/schema\/person\/a860b9395bd25c5090160a3ac30e980d\",\"name\":\"Paulo Maia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nilg.ai\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9e3e7cb701fd6dcee37f7a4e9f73ef5a27f5741062c4cb179724a1052ea23086?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9e3e7cb701fd6dcee37f7a4e9f73ef5a27f5741062c4cb179724a1052ea23086?s=96&d=mm&r=g\",\"caption\":\"Paulo Maia\"},\"url\":\"https:\/\/nilg.ai\/en_us\/author\/paulo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Difficult Targets to Optimize: the ROC AUC - NILG.AI","description":"Learn how to make your ML model optimize the ROC AUC instead of the classical cross-entropy loss. A practical tutorial for imbalance data.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nilg.ai\/en_us\/202012\/difficult-targets-to-optimize-the-roc-auc\/","og_locale":"en_US","og_type":"article","og_title":"Difficult Targets to Optimize: the ROC AUC - NILG.AI","og_description":"Learn how to make your ML model optimize the ROC AUC instead of the classical cross-entropy loss. A practical tutorial for imbalance data.","og_url":"https:\/\/nilg.ai\/en_us\/202012\/difficult-targets-to-optimize-the-roc-auc\/","og_site_name":"NILG.AI","article_published_time":"2020-12-18T16:16:37+00:00","article_modified_time":"2022-10-06T15:00:21+00:00","og_image":[{"width":2048,"height":1367,"url":"https:\/\/nilg.ai\/wp-content\/uploads\/2020\/12\/pexels-christina-morillo-1181343-e1653993600474.jpg","type":"image\/jpeg"}],"author":"Paulo Maia","twitter_card":"summary_large_image","twitter_creator":"@nilg_ai","twitter_site":"@nilg_ai","twitter_misc":{"Written by":"Paulo Maia","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/#article","isPartOf":{"@id":"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/"},"author":{"name":"Paulo Maia","@id":"https:\/\/nilg.ai\/#\/schema\/person\/a860b9395bd25c5090160a3ac30e980d"},"headline":"Difficult Targets to Optimize: the ROC AUC","datePublished":"2020-12-18T16:16:37+00:00","dateModified":"2022-10-06T15:00:21+00:00","mainEntityOfPage":{"@id":"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/"},"wordCount":902,"commentCount":0,"publisher":{"@id":"https:\/\/nilg.ai\/#organization"},"keywords":["Deep Learning","Machine Learning"],"articleSection":["Technical"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/","url":"https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/","name":"Difficult Targets to Optimize: the ROC AUC - NILG.AI","isPartOf":{"@id":"https:\/\/nilg.ai\/#website"},"datePublished":"2020-12-18T16:16:37+00:00","dateModified":"2022-10-06T15:00:21+00:00","description":"Learn how to make your ML model optimize the ROC AUC instead of the classical cross-entropy loss. A practical tutorial for imbalance data.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nilg.ai\/202012\/difficult-targets-to-optimize-the-roc-auc\/"]}]},{"@type":"WebSite","@id":"https:\/\/nilg.ai\/#website","url":"https:\/\/nilg.ai\/","name":"NILG.AI","description":"Create ever-improving businesses with AI","publisher":{"@id":"https:\/\/nilg.ai\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nilg.ai\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nilg.ai\/#organization","name":"NILG.AI","url":"https:\/\/nilg.ai\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nilg.ai\/#\/schema\/logo\/image\/","url":"https:\/\/nilg.ai\/wp-content\/uploads\/2022\/03\/logo.svg","contentUrl":"https:\/\/nilg.ai\/wp-content\/uploads\/2022\/03\/logo.svg","caption":"NILG.AI"},"image":{"@id":"https:\/\/nilg.ai\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/nilg_ai","https:\/\/youtube.com\/@nilg_ai","https:\/\/www.linkedin.com\/company\/nilg-ai\/"]},{"@type":"Person","@id":"https:\/\/nilg.ai\/#\/schema\/person\/a860b9395bd25c5090160a3ac30e980d","name":"Paulo Maia","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nilg.ai\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9e3e7cb701fd6dcee37f7a4e9f73ef5a27f5741062c4cb179724a1052ea23086?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9e3e7cb701fd6dcee37f7a4e9f73ef5a27f5741062c4cb179724a1052ea23086?s=96&d=mm&r=g","caption":"Paulo Maia"},"url":"https:\/\/nilg.ai\/en_us\/author\/paulo\/"}]}},"_links":{"self":[{"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/posts\/1068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/comments?post=1068"}],"version-history":[{"count":5,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/posts\/1068\/revisions"}],"predecessor-version":[{"id":1079,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/posts\/1068\/revisions\/1079"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/media\/1070"}],"wp:attachment":[{"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/media?parent=1068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/categories?post=1068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nilg.ai\/en_us\/wp-json\/wp\/v2\/tags?post=1068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}