{"id":18864328,"url":"https://github.com/devtronic/tree-classifier","last_synced_at":"2025-09-19T22:53:26.960Z","repository":{"id":56967118,"uuid":"76061479","full_name":"devtronic/tree-classifier","owner":"devtronic","description":"A class for decision trees","archived":false,"fork":false,"pushed_at":"2016-12-09T22:25:46.000Z","size":9,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-24T09:07:02.783Z","etag":null,"topics":["decision-tree","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devtronic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-09T18:46:57.000Z","updated_at":"2021-04-21T18:14:45.000Z","dependencies_parsed_at":"2022-08-21T09:50:42.985Z","dependency_job_id":null,"html_url":"https://github.com/devtronic/tree-classifier","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/devtronic/tree-classifier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devtronic%2Ftree-classifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devtronic%2Ftree-classifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devtronic%2Ftree-classifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devtronic%2Ftree-classifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devtronic","download_url":"https://codeload.github.com/devtronic/tree-classifier/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devtronic%2Ftree-classifier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275255800,"owners_count":25432564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-15T02:00:09.272Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["decision-tree","php"],"created_at":"2024-11-08T04:40:53.362Z","updated_at":"2025-09-19T22:53:26.927Z","avatar_url":"https://github.com/devtronic.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub tag](https://img.shields.io/packagist/v/devtronic/tree-classifier.svg)](https://github.com/Devtronic/tree-classifier)\n[![Packagist](https://img.shields.io/packagist/l/devtronic/tree-classifier.svg)](https://github.com/Devtronic/tree-classifier/blob/master/LICENSE)\n[![Travis](https://img.shields.io/travis/Devtronic/tree-classifier.svg)](https://travis-ci.org/Devtronic/tree-classifier/)\n[![Packagist](https://img.shields.io/packagist/dt/devtronic/tree-classifier.svg)](https://github.com/Devtronic/tree-classifier)\n\n\n# Tree Classifier\nA PHP Library for decision trees\n\n### What is a decision tree?\nThis (really basic): ![TreeClassifier](http://www.developer-heaven.de/wp-content/uploads/2016/12/TreeClassifier.png)\n\n### Code Example\nIn this example we classify 10 Persons. We want to find all males under 50 years old who can cook and don't playing football\n```php\n\u003c?php\n\nuse Devtronic\\TreeClassifier\\DecisionNode;\nuse Devtronic\\TreeClassifier\\RootNode;\nuse Devtronic\\TreeClassifier\\TerminalNode;\n\nrequire_once 'vendor/autoload.php';\n\n$subjects = [\n    0 =\u003e ['gender' =\u003e 'male',   'age' =\u003e 41, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'nope'],\n    1 =\u003e ['gender' =\u003e 'female', 'age' =\u003e 91, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'nope'],\n    2 =\u003e ['gender' =\u003e 'male',   'age' =\u003e 17, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'yes'],\n    3 =\u003e ['gender' =\u003e 'female', 'age' =\u003e 39, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'yes'],\n    4 =\u003e ['gender' =\u003e 'male',   'age' =\u003e 90, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'yes'],\n    5 =\u003e ['gender' =\u003e 'male',   'age' =\u003e 51, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'yes'],\n    6 =\u003e ['gender' =\u003e 'male',   'age' =\u003e 86, 'playsFootball' =\u003e 'yes',  'canCook' =\u003e 'nope'],\n    7 =\u003e ['gender' =\u003e 'male',   'age' =\u003e 99, 'playsFootball' =\u003e 'yes',  'canCook' =\u003e 'yes'],\n    8 =\u003e ['gender' =\u003e 'female', 'age' =\u003e 39, 'playsFootball' =\u003e 'nope', 'canCook' =\u003e 'yes'],\n    9 =\u003e ['gender' =\u003e 'female', 'age' =\u003e 37, 'playsFootball' =\u003e 'yes',  'canCook' =\u003e 'yes'],\n];\n\n// Find all\n// - males\n// - under 50\n// - can cook\n// - does not play football\n\n// Create from bottom up\n\n// We want all subjects who don't play football\n$footballDecisions = [\n    'play' =\u003e new TerminalNode(),\n    'does not play' =\u003e new TerminalNode(), // This is our last node\n];\n\n// Create the decider for football\n$footballDecider = new DecisionNode(function ($subject) {\n    // This is our decider function, $subject is the current object\n    // in the queue of the current node.\n    // Return the key of our $footballDecision-Array\n    return ($subject['playsFootball'] == 'yes' ? 'play' : 'does not play');\n}, $footballDecisions);\n\n// Great, next we need the cook-decisions.\n$cookDecisions = [\n    'can cook' =\u003e $footballDecider, // redirect all subjects who can cook to the $footballDecider\n    'can not cook' =\u003e new TerminalNode(),\n];\n\n// Now the cookDecider\n$cookDecider = new DecisionNode(function ($subject) {\n    return ($subject['canCook'] == 'yes' ? 'can cook' : 'can not cook');\n}, $cookDecisions);\n\n// The same as previous for the next 2 decisions\n\n$ageDecisions = [\n    '\u003c 50' =\u003e $cookDecider,\n    '\u003e= 50' =\u003e new TerminalNode(),\n];\n$ageDecider = new DecisionNode(function ($subject) {\n    return ($subject['age'] \u003e= 50 ? '\u003e= 50' : '\u003c 50');\n}, $ageDecisions);\n\n$genderDecisions = [\n    'male' =\u003e $ageDecider,\n    'female' =\u003e new TerminalNode(),\n];\n$genderDecider = new DecisionNode(function ($subject) {\n    return $subject['gender'];\n}, $genderDecisions);\n\n// And now we need to create a RootNode\n$rootNode = new RootNode($subjects);\n\n// Add the first (last created) node to our RootNode:\n$rootNode-\u003eaddSubNode($genderDecider);\n\n// And classify\n$rootNode-\u003eclassify();\n\n// In $footballDecisions['does not play'] are our subjects there we looked for:\nprint_r($footballDecisions['does not play']);\n\n// Outputs\n// Array\n// (\n//     [0] =\u003e Array\n//         (\n//             [gender] =\u003e male\n//             [age] =\u003e 17\n//             [playsFootball] =\u003e nope\n//             [canCook] =\u003e yes\n//         )\n//   )\n\n\n// Explanation:\n//                 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] = Keys from $subjects-Array\n//                 \\_________ RootNode _________/\n//                                |\n//                 /------ Gender Decider ------\\\n//                 |                            |\n//               Female                        Male\n//            [1, 3, 8, 9]             [0, 2, 4, 5, 6, 7]\n//                 |                            |\n//           Terminal Node                      |\n//                                  /-----  Age Decider -----\\\n//                                  |                        |\n//                               \u003e= 50                      \u003c 50\n//                            [4, 5, 6, 7]                 [0, 2]\n//                                  |                        |\n//                            Terminal Node                  |\n//                                                /---- Cook Decider ----\\\n//                                                |                      |\n//                                           Can not cook            Can cook\n//                                               [0]                    [2]\n//                                                |                      |\n//                                           Terminal Node               |\n//                                                           /---- Football Decider ----\\\n//                                                           |                          |\n//                                                         play                   does not play\n//                                                          [ ]                        [2]\n//                                                           |                          |\n//                                                     Terminal Node              Terminal Node\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevtronic%2Ftree-classifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevtronic%2Ftree-classifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevtronic%2Ftree-classifier/lists"}