{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/interpretable-predictions-of-tree-based","title":"Interpretable Predictions of Tree-based Ensembles via Actionable Feature Tweaking","arxiv_id":"1706.06691","date":"2017-06-20","proceeding":null,"authors":["Gabriele Tolomei","Fabrizio Silvestri","Andrew Haines","Mounia Lalmas"],"abstract":"Machine-learned models are often described as \"black boxes\". In many\nreal-world applications however, models may have to sacrifice predictive power\nin favour of human-interpretability. When this is the case, feature engineering\nbecomes a crucial task, which requires significant and time-consuming human\neffort. Whilst some features are inherently static, representing properties\nthat cannot be influenced (e.g., the age of an individual), others capture\ncharacteristics that could be adjusted (e.g., the daily amount of carbohydrates\ntaken). Nonetheless, once a model is learned from the data, each prediction it\nmakes on new instances is irreversible - assuming every instance to be a static\npoint located in the chosen feature space. There are many circumstances however\nwhere it is important to understand (i) why a model outputs a certain\nprediction on a given instance, (ii) which adjustable features of that instance\nshould be modified, and finally (iii) how to alter such a prediction when the\nmutated instance is input back to the model. In this paper, we present a\ntechnique that exploits the internals of a tree-based ensemble classifier to\noffer recommendations for transforming true negative instances into positively\npredicted ones. We demonstrate the validity of our approach using an online\nadvertising application. First, we design a Random Forest classifier that\neffectively separates between two types of ads: low (negative) and high\n(positive) quality ads (instances). Then, we introduce an algorithm that\nprovides recommendations that aim to transform a low quality ad (negative\ninstance) into a high quality one (positive instance). Finally, we evaluate our\napproach on a subset of the active inventory of a large ad network, Yahoo\nGemini.","url_abs":"http://arxiv.org/abs/1706.06691v1","url_pdf":"http://arxiv.org/pdf/1706.06691v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"interpretable-predictions-of-tree-based","repo_url":"https://github.com/gtolomei/ml-feature-tweaking","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"none","reach":null},{"paper_slug":"interpretable-predictions-of-tree-based","repo_url":"https://github.com/katokohaku/featureTweakR","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"none","reach":{"status":"unanswered"}},{"paper_slug":"interpretable-predictions-of-tree-based","repo_url":"https://github.com/upura/featureTweakPy","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"none","reach":null}],"tasks":[{"task_slug":"feature-engineering","task_name":"Feature Engineering"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=1706.06691","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"1706.06691"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/upura/featureTweakPy","reach":null},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/katokohaku/featureTweakR","reach":{"status":"unanswered"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/gtolomei/ml-feature-tweaking","reach":null}],"summary":{"ran_honours":2,"ran_fixture":1,"ran_draft_wrong":3,"unverified":1},"by_repo_kind":{"listed":{"samples":7,"ran":6,"repositories":2}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":7,"samples":[{"code_sha256_prefix":"d45b9059da8f8d9a","entry":"check_valid_epsilon","repo":"gtolomei/ml-feature-tweaking","repo_kind":"listed","path":"tweak_features.py","file_url":"https://github.com/gtolomei/ml-feature-tweaking/blob/HEAD/tweak_features.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d45b9059da8f8d9a"}},{"code_sha256_prefix":"8ee536c56ba37ecb","entry":"esatisfactory_instance","repo":"upura/featureTweakPy","repo_kind":"listed","path":"featureTweakPy.py","file_url":"https://github.com/upura/featureTweakPy/blob/HEAD/featureTweakPy.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8ee536c56ba37ecb"}},{"code_sha256_prefix":"aa169ea59c054158","entry":"feature_tweaking","repo":"upura/featureTweakPy","repo_kind":"listed","path":"featureTweakPy.py","file_url":"https://github.com/upura/featureTweakPy/blob/HEAD/featureTweakPy.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"aa169ea59c054158"}},{"code_sha256_prefix":"717f20e52d2d6ad6","entry":"get_options","repo":"gtolomei/ml-feature-tweaking","repo_kind":"listed","path":"tweak_features.py","file_url":"https://github.com/gtolomei/ml-feature-tweaking/blob/HEAD/tweak_features.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"717f20e52d2d6ad6"}},{"code_sha256_prefix":"134d4e6a1f529a24","entry":"loading_dataset","repo":"gtolomei/ml-feature-tweaking","repo_kind":"listed","path":"tweak_features.py","file_url":"https://github.com/gtolomei/ml-feature-tweaking/blob/HEAD/tweak_features.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"134d4e6a1f529a24"}},{"code_sha256_prefix":"54555321776a8db6","entry":"search_path","repo":"upura/featureTweakPy","repo_kind":"listed","path":"featureTweakPy.py","file_url":"https://github.com/upura/featureTweakPy/blob/HEAD/featureTweakPy.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"54555321776a8db6"}},{"code_sha256_prefix":"e1d79d812289cb72","entry":"enumerate_paths","repo":"gtolomei/ml-feature-tweaking","repo_kind":"listed","path":"dump_paths.py","file_url":"https://github.com/gtolomei/ml-feature-tweaking/blob/HEAD/dump_paths.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"e1d79d812289cb72"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}