Skip to content

Commit 86645d0

Browse files
committed
add treegamregressor
1 parent f29235d commit 86645d0

File tree

12 files changed

+1356
-514
lines changed

12 files changed

+1356
-514
lines changed

docs/algebraic/gam.html

Lines changed: 0 additions & 311 deletions
This file was deleted.

docs/algebraic/index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@
2929
<section>
3030
<h2 class="section-title" id="header-submodules">Sub-modules</h2>
3131
<dl>
32-
<dt><code class="name"><a title="imodels.algebraic.gam" href="gam.html">imodels.algebraic.gam</a></code></dt>
33-
<dd>
34-
<div class="desc"></div>
35-
</dd>
3632
<dt><code class="name"><a title="imodels.algebraic.slim" href="slim.html">imodels.algebraic.slim</a></code></dt>
3733
<dd>
3834
<div class="desc"><p>Wrapper for sparse, integer linear models …</p></div>
3935
</dd>
36+
<dt><code class="name"><a title="imodels.algebraic.tree_gam" href="tree_gam.html">imodels.algebraic.tree_gam</a></code></dt>
37+
<dd>
38+
<div class="desc"></div>
39+
</dd>
4040
</dl>
4141
</section>
4242
<section>
@@ -65,8 +65,8 @@ <h1>Index 🔍</h1>
6565
</li>
6666
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
6767
<ul>
68-
<li><code><a title="imodels.algebraic.gam" href="gam.html">imodels.algebraic.gam</a></code></li>
6968
<li><code><a title="imodels.algebraic.slim" href="slim.html">imodels.algebraic.slim</a></code></li>
69+
<li><code><a title="imodels.algebraic.tree_gam" href="tree_gam.html">imodels.algebraic.tree_gam</a></code></li>
7070
</ul>
7171
</li>
7272
</ul>

docs/algebraic/tree_gam.html

Lines changed: 872 additions & 0 deletions
Large diffs are not rendered by default.

docs/index.html

Lines changed: 67 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ <h3 id="supported-models">Supported models</h3>
158158
</tr>
159159
<tr>
160160
<td style="text-align: left;">Tree GAM</td>
161-
<td><a href="https://csinva.io/imodels/algebraic/gam.html">🗂️</a>, <a href="https://github.com/interpretml/interpret">🔗</a>, <a href="https://dl.acm.org/doi/abs/10.1145/2339530.2339556">📄</a></td>
161+
<td><a href="https://csinva.io/imodels/algebraic/tree_gam.html">🗂️</a>, <a href="https://github.com/interpretml/interpret">🔗</a>, <a href="https://dl.acm.org/doi/abs/10.1145/2339530.2339556">📄</a></td>
162162
<td>Generalized additive model fit with short boosted trees</td>
163163
</tr>
164164
<tr>
@@ -363,6 +363,12 @@ <h2 id="support-for-different-tasks">Support for different tasks</h2>
363363
<td>Requires extra dependencies for speed</td>
364364
</tr>
365365
<tr>
366+
<td style="text-align: left;">Tree GAM</td>
367+
<td style="text-align: center;"><a href="https://csinva.io/imodels/algebraic/tree_gam.html">TreeGAMClassifier</a></td>
368+
<td style="text-align: center;"><a href="https://csinva.io/imodels/algebraic/tree_gam.html">TreeGAMRegressor</a></td>
369+
<td></td>
370+
</tr>
371+
<tr>
366372
<td style="text-align: left;">Greedy tree sums (FIGS)</td>
367373
<td style="text-align: center;"><a href="https://csinva.io/imodels/tree/figs.html#imodels.tree.figs.FIGSClassifier">FIGSClassifier</a></td>
368374
<td style="text-align: center;"><a href="https://csinva.io/imodels/tree/figs.html#imodels.tree.figs.FIGSRegressor">FIGSRegressor</a></td>
@@ -444,6 +450,9 @@ <h3 id="hierarchical-shrinkage-post-hoc-regularization-for-tree-based-methods">H
444450
<p align="center">
445451
<i><b>HS Example.</b> HS applies post-hoc regularization to any decision tree by shrinking each node towards its parent.</i>
446452
</p>
453+
<h3 id="mdi-a-flexible-random-forest-based-feature-importance-framework">MDI+: A Flexible Random Forest-Based Feature Importance Framework</h3>
454+
<p><a href="https://arxiv.org/pdf/2307.01932.pdf">📄 Paper</a>, <a href="https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C23&amp;q=MDI%2B%3A+A+Flexible+Random+Forest-Based+Feature+Importance+Framework&amp;btnG=#d=gs_cit&amp;t=1690399844081&amp;u=%2Fscholar%3Fq%3Dinfo%3Axc0LcHXE_lUJ%3Ascholar.google.com%2F%26output%3Dcite%26scirp%3D0%26hl%3Den">📌 Citation</a></p>
455+
<p>MDI+ is a novel feature importance framework, which generalizes the popular mean decrease in impurity (MDI) importance score for random forests. At its core, MDI+ expands upon a recently discovered connection between linear regression and decision trees. In doing so, MDI+ enables practitioners to (1) tailor the feature importance computation to the data/problem structure and (2) incorporate additional features or knowledge to mitigate known biases of decision trees. In both real data case studies and extensive real-data-inspired simulations, MDI+ outperforms commonly used feature importance measures (e.g., MDI, permutation-based scores, and TreeSHAP) by substantional margins.</p>
447456
<h2 id="references">References</h2>
448457
<details>
449458
<summary>Readings</summary>
@@ -511,7 +520,7 @@ <h2 id="references">References</h2>
511520
# Github repo available [here](https://github.com/csinva/imodels)
512521

513522
from .algebraic.slim import SLIMRegressor, SLIMClassifier
514-
from .algebraic.gam import TreeGAMClassifier
523+
from .algebraic.tree_gam import TreeGAMClassifier, TreeGAMRegressor
515524
from .discretization.discretizer import RFDiscretizer, BasicDiscretizer
516525
from .discretization.mdlp import MDLPDiscretizer, BRLDiscretizer
517526
from .experimental.bartpy import BART
@@ -529,27 +538,64 @@ <h2 id="references">References</h2>
529538
from .rule_set.skope_rules import SkopeRulesClassifier
530539
from .rule_set.slipper import SlipperClassifier
531540
from .tree.c45_tree.c45_tree import C45TreeClassifier
532-
from .tree.cart_ccp import DecisionTreeCCPClassifier, DecisionTreeCCPRegressor, HSDecisionTreeCCPClassifierCV, \
533-
HSDecisionTreeCCPRegressorCV
541+
from .tree.cart_ccp import (
542+
DecisionTreeCCPClassifier,
543+
DecisionTreeCCPRegressor,
544+
HSDecisionTreeCCPClassifierCV,
545+
HSDecisionTreeCCPRegressorCV,
546+
)
547+
534548
# from .tree.iterative_random_forest.iterative_random_forest import IRFClassifier
535549
# from .tree.optimal_classification_tree import OptimalTreeModel
536550
from .tree.cart_wrapper import GreedyTreeClassifier, GreedyTreeRegressor
537551
from .tree.figs import FIGSRegressor, FIGSClassifier, FIGSRegressorCV, FIGSClassifierCV
538552
from .tree.gosdt.pygosdt import OptimalTreeClassifier
539-
from .tree.gosdt.pygosdt_shrinkage import HSOptimalTreeClassifier, HSOptimalTreeClassifierCV
540-
from .tree.hierarchical_shrinkage import HSTreeRegressor, HSTreeClassifier, HSTreeRegressorCV, HSTreeClassifierCV
553+
from .tree.gosdt.pygosdt_shrinkage import (
554+
HSOptimalTreeClassifier,
555+
HSOptimalTreeClassifierCV,
556+
)
557+
from .tree.hierarchical_shrinkage import (
558+
HSTreeRegressor,
559+
HSTreeClassifier,
560+
HSTreeRegressorCV,
561+
HSTreeClassifierCV,
562+
)
541563
from .tree.tao import TaoTreeClassifier, TaoTreeRegressor
542564
from .util.data_util import get_clean_dataset
543565
from .util.distillation import DistilledRegressor
544566
from .util.explain_errors import explain_classification_errors
545567

546-
CLASSIFIERS = [BayesianRuleListClassifier, GreedyRuleListClassifier, SkopeRulesClassifier,
547-
BoostedRulesClassifier, SLIMClassifier, SlipperClassifier, BayesianRuleSetClassifier,
548-
C45TreeClassifier, OptimalTreeClassifier, OptimalRuleListClassifier, OneRClassifier,
549-
SlipperClassifier, RuleFitClassifier, TaoTreeClassifier,
550-
FIGSClassifier, HSTreeClassifier, HSTreeClassifierCV] # , IRFClassifier
551-
REGRESSORS = [RuleFitRegressor, SLIMRegressor, GreedyTreeClassifier, FIGSRegressor,
552-
TaoTreeRegressor, HSTreeRegressor, HSTreeRegressorCV, BART]
568+
CLASSIFIERS = [
569+
BayesianRuleListClassifier,
570+
GreedyRuleListClassifier,
571+
SkopeRulesClassifier,
572+
BoostedRulesClassifier,
573+
SLIMClassifier,
574+
SlipperClassifier,
575+
BayesianRuleSetClassifier,
576+
C45TreeClassifier,
577+
OptimalTreeClassifier,
578+
OptimalRuleListClassifier,
579+
OneRClassifier,
580+
SlipperClassifier,
581+
RuleFitClassifier,
582+
TaoTreeClassifier,
583+
TreeGAMClassifier,
584+
FIGSClassifier,
585+
HSTreeClassifier,
586+
HSTreeClassifierCV,
587+
] # , IRFClassifier
588+
REGRESSORS = [
589+
RuleFitRegressor,
590+
SLIMRegressor,
591+
GreedyTreeClassifier,
592+
FIGSRegressor,
593+
TaoTreeRegressor,
594+
TreeGAMRegressor,
595+
HSTreeRegressor,
596+
HSTreeRegressorCV,
597+
BART,
598+
]
553599
ESTIMATORS = CLASSIFIERS + REGRESSORS
554600
DISCRETIZERS = [RFDiscretizer, BasicDiscretizer, MDLPDiscretizer, BRLDiscretizer]</code></pre>
555601
</details>
@@ -609,7 +655,14 @@ <h1>Index 🔍</h1>
609655
<li><a href="#support-for-different-tasks">Support for different tasks</a><ul>
610656
<li><a href="#extras">Extras</a></li>
611657
</ul>
612-
</li><li><a href="#references">References</a></li>
658+
</li>
659+
<li><a href="#our-favorite-models">Our favorite models</a><ul>
660+
<li><a href="#figs-fast-interpretable-greedy-tree-sums">FIGS: Fast interpretable greedy-tree sums</a></li>
661+
<li><a href="#hierarchical-shrinkage-post-hoc-regularization-for-tree-based-methods">Hierarchical shrinkage: post-hoc regularization for tree-based methods</a></li>
662+
<li><a href="#mdi-a-flexible-random-forest-based-feature-importance-framework">MDI+: A Flexible Random Forest-Based Feature Importance Framework</a></li>
663+
</ul>
664+
</li>
665+
<li><a href="#references">References</a></li>
613666
</ul>
614667
</div>
615668
<ul id="index">

docs/tree/figs.html

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,10 @@
401401
# require the tree to have more than 1 node, otherwise just leave importance_data_tree as zeros
402402
if 1 &lt; next(node_counter):
403403
tree_samples = _importances(tree_)
404-
importance_data_tree /= tree_samples
404+
if tree_samples != 0:
405+
importance_data_tree /= tree_samples
406+
else:
407+
importance_data_tree = 0
405408

406409
importance_data.append(importance_data_tree)
407410

@@ -1015,7 +1018,10 @@ <h2 id="params">Params</h2>
10151018
# require the tree to have more than 1 node, otherwise just leave importance_data_tree as zeros
10161019
if 1 &lt; next(node_counter):
10171020
tree_samples = _importances(tree_)
1018-
importance_data_tree /= tree_samples
1021+
if tree_samples != 0:
1022+
importance_data_tree /= tree_samples
1023+
else:
1024+
importance_data_tree = 0
10191025

10201026
importance_data.append(importance_data_tree)
10211027

@@ -1410,7 +1416,10 @@ <h3>Methods</h3>
14101416
# require the tree to have more than 1 node, otherwise just leave importance_data_tree as zeros
14111417
if 1 &lt; next(node_counter):
14121418
tree_samples = _importances(tree_)
1413-
importance_data_tree /= tree_samples
1419+
if tree_samples != 0:
1420+
importance_data_tree /= tree_samples
1421+
else:
1422+
importance_data_tree = 0
14141423

14151424
importance_data.append(importance_data_tree)
14161425

0 commit comments

Comments
 (0)