{"id":2107,"date":"2014-03-03T13:49:07","date_gmt":"2014-03-03T13:49:07","guid":{"rendered":"http:\/\/www.garysieling.com\/blog\/?p=2107"},"modified":"2020-03-31T00:46:31","modified_gmt":"2020-03-31T00:46:31","slug":"convert-scikit-learn-decision-trees-json","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/","title":{"rendered":"Convert scikit-learn decision trees to JSON"},"content":{"rendered":"<p>SKLearn has a function to convert decision trees to &#8220;graphviz&#8221; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON.<\/p>\n<p>The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces don&#8217;t support the interfaces the JSON library needs to run. Additionally, even if it did, the JSON library in python dies on very small floating point numbers, which is why it&#8217;s not used at all in my version.<\/p>\n<pre lang=\"python\">\n\ndef treeToJson(decision_tree, feature_names=None):\n  from warnings import warn\n\n  js = \"\"\n\n  def node_to_str(tree, node_id, criterion):\n    if not isinstance(criterion, sklearn.tree.tree.six.string_types):\n      criterion = \"impurity\"\n\n    value = tree.value[node_id]\n    if tree.n_outputs == 1:\n      value = value[0, :]\n\n    jsonValue = ', '.join([str(x) for x in value])\n\n    if tree.children_left[node_id] == sklearn.tree._tree.TREE_LEAF:\n      return '\"id\": \"%s\", \"criterion\": \"%s\", \"impurity\": \"%s\", \"samples\": \"%s\", \"value\": [%s]' \\\n             % (node_id, \n                criterion,\n                tree.impurity[node_id],\n                tree.n_node_samples[node_id],\n                jsonValue)\n    else:\n      if feature_names is not None:\n        feature = feature_names[tree.feature[node_id]]\n      else:\n        feature = tree.feature[node_id]\n\n      if \"=\" in feature:\n        ruleType = \"=\"\n        ruleValue = \"false\"\n      else:\n        ruleType = \"<=\"\n        ruleValue = \"%.4f\" % tree.threshold[node_id]\n\n      return '\"id\": \"%s\", \"rule\": \"%s %s %s\", \"%s\": \"%s\", \"samples\": \"%s\"' \\\n             % (node_id, \n                feature,\n                ruleType,\n                ruleValue,\n                criterion,\n                tree.impurity[node_id],\n                tree.n_node_samples[node_id])\n\n  def recurse(tree, node_id, criterion, parent=None, depth=0):\n    tabs = \"  \" * depth\n    js = \"\"\n\n    left_child = tree.children_left[node_id]\n    right_child = tree.children_right[node_id]\n\n    js = js + \"\\n\" + \\\n         tabs + \"{\\n\" + \\\n         tabs + \"  \" + node_to_str(tree, node_id, criterion)\n\n    if left_child != sklearn.tree._tree.TREE_LEAF:\n      js = js + \",\\n\" + \\\n           tabs + '  \"left\": ' + \\\n           recurse(tree, \\\n                   left_child, \\\n                   criterion=criterion, \\\n                   parent=node_id, \\\n                   depth=depth + 1) + \",\\n\" + \\\n           tabs + '  \"right\": ' + \\\n           recurse(tree, \\\n                   right_child, \\\n                   criterion=criterion, \\\n                   parent=node_id,\n                   depth=depth + 1)\n\n    js = js + tabs + \"\\n\" + \\\n         tabs + \"}\"\n\n    return js\n\n  if isinstance(decision_tree, sklearn.tree.tree.Tree):\n    js = js + recurse(decision_tree, 0, criterion=\"impurity\")\n  else:\n    js = js + recurse(decision_tree.tree_, 0, criterion=decision_tree.criterion)\n\n  return js\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>SKLearn has a function to convert decision trees to &#8220;graphviz&#8221; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Convert scikit-learn decision trees to JSON&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[4,5,6],"tags":[164,302,322,447,508],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"SKLearn has a function to convert decision trees to &quot;graphviz&quot; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"gary\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gary Sieling - Software Engineer\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Convert scikit-learn decision trees to JSON - Gary Sieling\" \/>\n\t\t<meta property=\"og:description\" content=\"SKLearn has a function to convert decision trees to &quot;graphviz&quot; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2014-03-03T13:49:07+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-31T00:46:31+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Convert scikit-learn decision trees to JSON - Gary Sieling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"SKLearn has a function to convert decision trees to &quot;graphviz&quot; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#blogposting\",\"name\":\"Convert scikit-learn decision trees to JSON - Gary Sieling\",\"headline\":\"Convert scikit-learn decision trees to JSON\",\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"},\"datePublished\":\"2014-03-03T13:49:07+00:00\",\"dateModified\":\"2020-03-31T00:46:31+00:00\",\"inLanguage\":\"en-US\",\"commentCount\":3,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#webpage\"},\"articleSection\":\"Code Examples, Data Mining, Data Science, decision trees, javascript, json, python, sklearn\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"position\":2,\"name\":\"Code Examples\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#listItem\",\"name\":\"Convert scikit-learn decision trees to JSON\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#listItem\",\"position\":3,\"name\":\"Convert scikit-learn decision trees to JSON\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/\",\"name\":\"gary\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"gary\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#webpage\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/\",\"name\":\"Convert scikit-learn decision trees to JSON - Gary Sieling\",\"description\":\"SKLearn has a function to convert decision trees to \\\"graphviz\\\" (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/convert-scikit-learn-decision-trees-json\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"datePublished\":\"2014-03-03T13:49:07+00:00\",\"dateModified\":\"2020-03-31T00:46:31+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Convert scikit-learn decision trees to JSON - Gary Sieling","description":"SKLearn has a function to convert decision trees to \"graphviz\" (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces","canonical_url":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#blogposting","name":"Convert scikit-learn decision trees to JSON - Gary Sieling","headline":"Convert scikit-learn decision trees to JSON","author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"},"datePublished":"2014-03-03T13:49:07+00:00","dateModified":"2020-03-31T00:46:31+00:00","inLanguage":"en-US","commentCount":3,"mainEntityOfPage":{"@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#webpage"},"isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#webpage"},"articleSection":"Code Examples, Data Mining, Data Science, decision trees, javascript, json, python, sklearn"},{"@type":"BreadcrumbList","@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.garysieling.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","position":2,"name":"Code Examples","item":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#listItem","name":"Convert scikit-learn decision trees to JSON"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#listItem","position":3,"name":"Convert scikit-learn decision trees to JSON","previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}}]},{"@type":"Organization","@id":"https:\/\/www.garysieling.com\/blog\/#organization","name":"Gary Sieling","description":"Software Engineer","url":"https:\/\/www.garysieling.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author","url":"https:\/\/www.garysieling.com\/blog\/author\/gary\/","name":"gary","image":{"@type":"ImageObject","@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g","width":96,"height":96,"caption":"gary"}},{"@type":"WebPage","@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#webpage","url":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/","name":"Convert scikit-learn decision trees to JSON - Gary Sieling","description":"SKLearn has a function to convert decision trees to \"graphviz\" (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/#breadcrumblist"},"author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"creator":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"datePublished":"2014-03-03T13:49:07+00:00","dateModified":"2020-03-31T00:46:31+00:00"},{"@type":"WebSite","@id":"https:\/\/www.garysieling.com\/blog\/#website","url":"https:\/\/www.garysieling.com\/blog\/","name":"Gary Sieling","description":"Software Engineer","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gary Sieling - Software Engineer","og:type":"article","og:title":"Convert scikit-learn decision trees to JSON - Gary Sieling","og:description":"SKLearn has a function to convert decision trees to &quot;graphviz&quot; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces","og:url":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/","article:published_time":"2014-03-03T13:49:07+00:00","article:modified_time":"2020-03-31T00:46:31+00:00","twitter:card":"summary_large_image","twitter:title":"Convert scikit-learn decision trees to JSON - Gary Sieling","twitter:description":"SKLearn has a function to convert decision trees to &quot;graphviz&quot; (for rendering) but I find JSON more helpful, as you can read it more easily, as well as use it in web apps. The function below will give you JSON. The reason this is necessary (vs the JSON.dumps) library is that the Decision Tree interfaces"},"aioseo_meta_data":{"post_id":"2107","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-02-04 16:24:29","updated":"2026-07-06 01:08:45","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/\" title=\"Code Examples\">Code Examples<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tConvert scikit-learn decision trees to JSON\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.garysieling.com\/blog"},{"label":"Code Examples","link":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/"},{"label":"Convert scikit-learn decision trees to JSON","link":"https:\/\/www.garysieling.com\/blog\/convert-scikit-learn-decision-trees-json\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2107"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=2107"}],"version-history":[{"count":1,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2107\/revisions"}],"predecessor-version":[{"id":6498,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2107\/revisions\/6498"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=2107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=2107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=2107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}