Finds a depth k tree by looking ahead l steps.
hybrid_policy_tree( X, Gamma, depth = 3, search.depth = 2, split.step = 1, min.node.size = 1, verbose = TRUE )
| X | The covariates used. Dimension \(N*p\) where \(p\) is the number of features. |
|---|---|
| Gamma | The rewards for each action. Dimension \(N*d\) where \(d\) is the number of actions. |
| depth | The depth of the fitted tree. Default is 3. |
| search.depth | Depth to look ahead when splitting. Default is 2. |
| split.step | An optional approximation parameter, the number of possible splits to consider when performing tree search. split.step = 1 (default) considers every possible split, split.step = 10 considers splitting at every 10'th sample and may yield a substantial speedup for dense features. Manually rounding or re-encoding continuous covariates with very high cardinality in a problem specific manner allows for finer-grained control of the accuracy/runtime tradeoff and may in some cases be the preferred approach. |
| min.node.size | An integer indicating the smallest terminal node size permitted. Default is 1. |
| verbose | Give verbose output. Default is TRUE. |
A policy_tree object.
Builds deeper trees by iteratively using exact tree search to look ahead l splits. For example,
with depth = 3 and search.depth = 2, the root split is determined by a depth 2 exact tree,
and two new depth 2 trees are fit in the two immediate children using exact tree search,
leading to a total depth of 3 (the resulting tree may be shallower than the
specified depth depending on whether leaf nodes were pruned or not).
This algorithm scales with some coefficient multiple of the runtime of a search.depth policy_tree,
which means that for this approach to be feasible it needs an (n, p, d) configuration in which
a search.depth policy_tree runs in reasonable time.
The algorithm: desired depth is given by depth. Each node is split using exact tree search
with depth = search.depth. When we reach a node where the current level + search.depth is equal to depth,
we stop and attach the search.depth subtree to this node.
We also stop if the best search.depth split yielded a leaf node.
# \donttest{ # Fit a depth three tree on doubly robust treatment effect estimates from a causal forest. n <- 1500 p <- 5 X <- round(matrix(rnorm(n * p), n, p), 2) W <- rbinom(n, 1, 1 / (1 + exp(X[, 3]))) tau <- 1 / (1 + exp((X[, 1] + X[, 2]) / 2)) - 0.5 Y <- X[, 3] + W * tau + rnorm(n) c.forest <- grf::causal_forest(X, Y, W) dr.scores <- double_robust_scores(c.forest) tree <- hybrid_policy_tree(X, dr.scores, depth = 3) # Predict treatment assignment. predicted <- predict(tree, X) # }