# Machine learning

The Cox model and its parametric cousins assume a particular shape for how covariates act on the hazard (usually linear and proportional). When you have many covariates, non-linear effects, or interactions you did not anticipate, tree-based machine-learning models can predict better without those assumptions. Greenwood ships three, all fully non-parametric and all producing per-subject survival and cumulative-hazard *functions* rather than a single risk score: a [SurvivalTree](../reference/SurvivalTree.md#greenwood.SurvivalTree), the bagged [RandomSurvivalForest](../reference/RandomSurvivalForest.md#greenwood.RandomSurvivalForest) (and its extremely-randomized [ExtraSurvivalTrees](../reference/ExtraSurvivalTrees.md#greenwood.ExtraSurvivalTrees) variant), and [GradientBoostingSurvivalAnalysis](../reference/GradientBoostingSurvivalAnalysis.md#greenwood.GradientBoostingSurvivalAnalysis). This page introduces each, then shows how to score, interpret, and visualize them.

We'll work with `lung`-dataset outcomes, keeping the rows with complete covariates so the examples are easy to follow.


``` python
import greenwood as gw

# Load the lung dataset and keep rows with complete covariates
lung = gw.load_dataset("lung", backend="polars").drop_nulls(
    subset=["ph.ecog", "ph.karno", "wt.loss"]
)

y = gw.Surv.right(lung["time"], event=(lung["status"] == 2))
covariates = ["age", "sex", "ph.ecog", "ph.karno", "wt.loss"]
y
```


    Surv(type=right, n=213, events=151)


# Survival trees

A [SurvivalTree](../reference/SurvivalTree.md#greenwood.SurvivalTree) recursively splits subjects into groups whose survival curves differ as much as possible, measured by the log-rank statistic at each candidate split. Each leaf stores a Kaplan-Meier survival curve and a Nelson-Aalen cumulative hazard estimated from the subjects that land in it. A single tree is easy to reason about but high-variance; it is most useful as the interpretable building block of an ensemble.


``` python
# Grow a shallow, interpretable survival tree
tree = gw.SurvivalTree(max_depth=3, random_state=0).fit(y, lung[covariates])
tree
```


    SurvivalTree (log-rank splits, 15 nodes, 8 leaves)
    n = 213, events = 151, features = 5


Calling `predict` with the default `type="risk"` returns Ishwaran's *ensemble mortality* (the sum of the predicted cumulative hazard over the training event times). Larger values mean higher risk.


``` python
# Risk score for the first eight subjects (higher = higher risk)
tree.predict(lung[covariates])[:8]
```


    array([ 95.15345288,  95.15345288,  95.15345288,  95.15345288,
            95.15345288, 168.54325397, 168.54325397,  95.15345288])


# Random survival forests

A [RandomSurvivalForest](../reference/RandomSurvivalForest.md#greenwood.RandomSurvivalForest) averages many decorrelated survival trees, each grown on a bootstrap sample of the data and considering a random subset of covariates at every split. Averaging drives down the variance of the single tree and yields a well-calibrated, flexible model. Passing `oob_score=True` computes an out-of-bag concordance estimate (an honest, held-out measure of discrimination) using only the trees for which each subject was not in the bootstrap sample.


``` python
# Fit a forest and report the out-of-bag concordance
rsf = gw.RandomSurvivalForest(
    n_estimators=200, oob_score=True, random_state=0
).fit(y, lung[covariates])
rsf
```


    RandomSurvivalForest (200 log-rank trees, max_features='sqrt')
    n = 213, events = 151, features = 5
    out-of-bag concordance = 0.6061


## Predictions

Like the tree, the forest predicts a scalar risk score by default. It also predicts full survival or cumulative-hazard curves: pass `type="survival"` (or `"cumulative_hazard"`) and optional `times`, and you get one column per subject.


``` python
# Predicted survival probabilities at one and two years for three subjects
rsf.predict(lung[covariates][:3], type="survival", times=[365, 730])
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-348f997a .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-348f997a .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-348f997a .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-348f997a .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-348f997a .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-348f997a .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-348f997a .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-348f997a .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-348f997a .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-348f997a .gt_left { text-align: left; }
#gd-tbl-348f997a .gt_center { text-align: center; }
#gd-tbl-348f997a .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-348f997a .gt_font_normal { font-weight: normal; }
#gd-tbl-348f997a .gt_font_bold { font-weight: bold; }
#gd-tbl-348f997a .gt_font_italic { font-style: italic; }
#gd-tbl-348f997a .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-348f997a .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-348f997a .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-348f997a .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-348f997a .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-348f997a .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-348f997a tr.gd-tbl-divider td,
#gd-tbl-348f997a tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-348f997a .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-348f997a .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-348f997a .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-348f997a .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-348f997a .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-348f997a .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-348f997a .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-348f997a .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-348f997a .gt_table,
html.quarto-dark #gd-tbl-348f997a .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-348f997a .gt_heading,
html.quarto-dark #gd-tbl-348f997a .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-348f997a .gt_title,
html.quarto-dark #gd-tbl-348f997a .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-348f997a .gt_subtitle,
html.quarto-dark #gd-tbl-348f997a .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-348f997a .gt_col_headings,
html.quarto-dark #gd-tbl-348f997a .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-348f997a .gt_col_heading,
html.quarto-dark #gd-tbl-348f997a .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-348f997a .gt_table_body,
html.quarto-dark #gd-tbl-348f997a .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-348f997a .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-348f997a .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-rownum,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-missing,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-dtype,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-348f997a .gt_bottom_border,
html.quarto-dark #gd-tbl-348f997a .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-348f997a .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-348f997a .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="5" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows2Columns4
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="time" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

time

<em>f64</em>

</div></th>
<th id="subject_1" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_1

<em>f64</em>

</div></th>
<th id="subject_2" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_2

<em>f64</em>

</div></th>
<th id="subject_3" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_3

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 64px">365</td>
<td class="gt_row gt_right" style="max-width: 138px">0.570687942169</td>
<td class="gt_row gt_right" style="max-width: 131px">0.664342402851</td>
<td class="gt_row gt_right" style="max-width: 131px">0.433306613867</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 64px">730</td>
<td class="gt_row gt_right" style="max-width: 138px">0.0856037841238</td>
<td class="gt_row gt_right" style="max-width: 131px">0.366642713531</td>
<td class="gt_row gt_right" style="max-width: 131px">0.106499220759</td>
</tr>
</tbody>
</table>


## Variable importance

[variable_importance()](../reference/GradientBoostingSurvivalAnalysis.md#greenwood.GradientBoostingSurvivalAnalysis.variable_importance) measures how much each covariate contributes by permuting its values in the out-of-bag samples and recording the drop in concordance. Larger values indicate more important covariates. The same table is what [tidy()](../reference/tidy.md#greenwood.tidy) returns for a fitted forest.


``` python
# Permutation variable importance (out-of-bag)
rsf.variable_importance()
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-80e246cf .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-80e246cf .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-80e246cf .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-80e246cf .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-80e246cf .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-80e246cf .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-80e246cf .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-80e246cf .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-80e246cf .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-80e246cf .gt_left { text-align: left; }
#gd-tbl-80e246cf .gt_center { text-align: center; }
#gd-tbl-80e246cf .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-80e246cf .gt_font_normal { font-weight: normal; }
#gd-tbl-80e246cf .gt_font_bold { font-weight: bold; }
#gd-tbl-80e246cf .gt_font_italic { font-style: italic; }
#gd-tbl-80e246cf .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-80e246cf .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-80e246cf .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-80e246cf .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-80e246cf .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-80e246cf .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-80e246cf tr.gd-tbl-divider td,
#gd-tbl-80e246cf tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-80e246cf .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-80e246cf .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-80e246cf .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-80e246cf .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-80e246cf .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-80e246cf .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-80e246cf .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-80e246cf .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-80e246cf .gt_table,
html.quarto-dark #gd-tbl-80e246cf .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-80e246cf .gt_heading,
html.quarto-dark #gd-tbl-80e246cf .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-80e246cf .gt_title,
html.quarto-dark #gd-tbl-80e246cf .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-80e246cf .gt_subtitle,
html.quarto-dark #gd-tbl-80e246cf .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-80e246cf .gt_col_headings,
html.quarto-dark #gd-tbl-80e246cf .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-80e246cf .gt_col_heading,
html.quarto-dark #gd-tbl-80e246cf .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-80e246cf .gt_table_body,
html.quarto-dark #gd-tbl-80e246cf .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-80e246cf .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-80e246cf .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-rownum,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-missing,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-dtype,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-80e246cf .gt_bottom_border,
html.quarto-dark #gd-tbl-80e246cf .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-80e246cf .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-80e246cf .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="3" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows5Columns2
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="term" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

term

<em>str</em>

</div></th>
<th id="importance" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

importance

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_left" style="max-width: 200px">ph.ecog</td>
<td class="gt_row gt_right" style="max-width: 264px">0.0552117647059</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_left" style="max-width: 200px">sex</td>
<td class="gt_row gt_right" style="max-width: 264px">0.0398823529412</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_left" style="max-width: 200px">age</td>
<td class="gt_row gt_right" style="max-width: 264px">0.00589411764706</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_left" style="max-width: 200px">ph.karno</td>
<td class="gt_row gt_right" style="max-width: 264px">-0.00187058823529</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_left" style="max-width: 200px">wt.loss</td>
<td class="gt_row gt_right" style="max-width: 264px">-0.00203529411765</td>
</tr>
</tbody>
</table>


# Extra survival trees

[ExtraSurvivalTrees](../reference/ExtraSurvivalTrees.md#greenwood.ExtraSurvivalTrees) is an extremely-randomized variant: in addition to sampling covariates, it draws the split *threshold* at random for each candidate rather than optimizing it. The extra randomness further decorrelates the trees, often lowering variance and speeding up fitting. Following the extra-trees convention, it grows each tree on the whole sample by default; set `bootstrap=True` when you want out-of-bag scoring or variable importance.


``` python
# Extremely-randomized survival trees with out-of-bag scoring enabled
ext = gw.ExtraSurvivalTrees(
    n_estimators=200, bootstrap=True, oob_score=True, random_state=0
).fit(y, lung[covariates])
ext
```


    ExtraSurvivalTrees (200 log-rank trees, max_features='sqrt')
    n = 213, events = 151, features = 5
    out-of-bag concordance = 0.6155


> **Tip: Accelerating the split search on large data**
>
> The best-split search is the dominant cost when fitting forests on large datasets. If you install the `fast` extra (`pip install greenwood[fast]`), you can pass `engine="numba"` to [RandomSurvivalForest](../reference/RandomSurvivalForest.md#greenwood.RandomSurvivalForest) or [ExtraSurvivalTrees](../reference/ExtraSurvivalTrees.md#greenwood.ExtraSurvivalTrees) for a compiled split kernel that avoids materializing the large risk-set matrices. The default `engine="numpy"` is deterministic and needs no extra dependency; the Numba path produces a statistically equivalent fit that may differ slightly in tie-breaking.


# Gradient-boosted survival

[GradientBoostingSurvivalAnalysis](../reference/GradientBoostingSurvivalAnalysis.md#greenwood.GradientBoostingSurvivalAnalysis) takes a different route. Instead of averaging independent trees, it builds an additive model by fitting each new (shallow) regression tree to the negative gradient of the Cox partial-likelihood loss (the martingale residuals under the current model) and adding a shrunken version of it. The result is a non-linear generalization of the Cox model that often predicts very well on structured tabular data.


``` python
# Fit a gradient-boosted survival model
gbm = gw.GradientBoostingSurvivalAnalysis(
    n_estimators=300, learning_rate=0.05, max_depth=2, random_state=0
).fit(y, lung[covariates])
gbm
```


    GradientBoostingSurvivalAnalysis (300 trees, learning_rate=0.05, max_depth=2)
    n = 213, events = 151, features = 5


The additive score `F(x)` is the boosted analogue of the Cox linear predictor. `predict(type="lp")` returns it, `type="risk"` returns `exp(F(x))`, and `type="survival"` combines it with a Breslow baseline hazard to produce survival curves.


``` python
# Survival curves at one and two years for three subjects
gbm.predict(lung[covariates][:3], type="survival", times=[365, 730])
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-6323caec .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-6323caec .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-6323caec .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-6323caec .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-6323caec .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-6323caec .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-6323caec .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-6323caec .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-6323caec .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-6323caec .gt_left { text-align: left; }
#gd-tbl-6323caec .gt_center { text-align: center; }
#gd-tbl-6323caec .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-6323caec .gt_font_normal { font-weight: normal; }
#gd-tbl-6323caec .gt_font_bold { font-weight: bold; }
#gd-tbl-6323caec .gt_font_italic { font-style: italic; }
#gd-tbl-6323caec .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-6323caec .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-6323caec .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-6323caec .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-6323caec .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-6323caec .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-6323caec tr.gd-tbl-divider td,
#gd-tbl-6323caec tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-6323caec .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-6323caec .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-6323caec .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-6323caec .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-6323caec .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-6323caec .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-6323caec .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-6323caec .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-6323caec .gt_table,
html.quarto-dark #gd-tbl-6323caec .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-6323caec .gt_heading,
html.quarto-dark #gd-tbl-6323caec .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-6323caec .gt_title,
html.quarto-dark #gd-tbl-6323caec .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-6323caec .gt_subtitle,
html.quarto-dark #gd-tbl-6323caec .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-6323caec .gt_col_headings,
html.quarto-dark #gd-tbl-6323caec .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-6323caec .gt_col_heading,
html.quarto-dark #gd-tbl-6323caec .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-6323caec .gt_table_body,
html.quarto-dark #gd-tbl-6323caec .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-6323caec .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-6323caec .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-rownum,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-missing,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-dtype,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-6323caec .gt_bottom_border,
html.quarto-dark #gd-tbl-6323caec .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-6323caec .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-6323caec .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="5" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows2Columns4
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="time" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

time

<em>f64</em>

</div></th>
<th id="subject_1" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_1

<em>f64</em>

</div></th>
<th id="subject_2" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_2

<em>f64</em>

</div></th>
<th id="subject_3" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

subject_3

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 62px">365</td>
<td class="gt_row gt_right" style="max-width: 136px">0.384085259396</td>
<td class="gt_row gt_right" style="max-width: 129px">0.633711204665</td>
<td class="gt_row gt_right" style="max-width: 136px">0.331726873354</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_right" style="max-width: 62px">730</td>
<td class="gt_row gt_right" style="max-width: 136px">0.0432828906933</td>
<td class="gt_row gt_right" style="max-width: 129px">0.22382813027</td>
<td class="gt_row gt_right" style="max-width: 136px">0.0267584698433</td>
</tr>
</tbody>
</table>


Boosting reports impurity-based variable importance (the total reduction in squared error credited to each covariate, normalized to sum to one):


``` python
# Impurity-based variable importance
gbm.variable_importance()
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-f1d9adde .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-f1d9adde .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-f1d9adde .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-f1d9adde .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-f1d9adde .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-f1d9adde .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-f1d9adde .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-f1d9adde .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-f1d9adde .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-f1d9adde .gt_left { text-align: left; }
#gd-tbl-f1d9adde .gt_center { text-align: center; }
#gd-tbl-f1d9adde .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-f1d9adde .gt_font_normal { font-weight: normal; }
#gd-tbl-f1d9adde .gt_font_bold { font-weight: bold; }
#gd-tbl-f1d9adde .gt_font_italic { font-style: italic; }
#gd-tbl-f1d9adde .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-f1d9adde .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-f1d9adde .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-f1d9adde .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-f1d9adde .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-f1d9adde .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-f1d9adde tr.gd-tbl-divider td,
#gd-tbl-f1d9adde tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-f1d9adde .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-f1d9adde .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-f1d9adde .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-f1d9adde .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-f1d9adde .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-f1d9adde .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-f1d9adde .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-f1d9adde .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-f1d9adde .gt_table,
html.quarto-dark #gd-tbl-f1d9adde .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_heading,
html.quarto-dark #gd-tbl-f1d9adde .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_title,
html.quarto-dark #gd-tbl-f1d9adde .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_subtitle,
html.quarto-dark #gd-tbl-f1d9adde .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_col_headings,
html.quarto-dark #gd-tbl-f1d9adde .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_col_heading,
html.quarto-dark #gd-tbl-f1d9adde .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_table_body,
html.quarto-dark #gd-tbl-f1d9adde .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-f1d9adde .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-rownum,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-missing,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-dtype,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-f1d9adde .gt_bottom_border,
html.quarto-dark #gd-tbl-f1d9adde .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-f1d9adde .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-f1d9adde .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="3" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows5Columns2
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="term" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

term

<em>str</em>

</div></th>
<th id="importance" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

importance

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_left" style="max-width: 207px">wt.loss</td>
<td class="gt_row gt_right" style="max-width: 257px">0.409465130649</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_left" style="max-width: 207px">ph.ecog</td>
<td class="gt_row gt_right" style="max-width: 257px">0.212804757602</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_left" style="max-width: 207px">age</td>
<td class="gt_row gt_right" style="max-width: 257px">0.205707927573</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_left" style="max-width: 207px">sex</td>
<td class="gt_row gt_right" style="max-width: 257px">0.11564191931</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_left" style="max-width: 207px">ph.karno</td>
<td class="gt_row gt_right" style="max-width: 257px">0.0563802648662</td>
</tr>
</tbody>
</table>


# IPC-weighted ridge regression

Not every alternative to Cox needs a tree. `IPCRidge` fits a penalized linear model on log survival times, but instead of the Cox partial likelihood it uses inverse-probability-of-censoring (IPC) weights to correct for censoring. Only uncensored subjects contribute to the fit, and each is weighted by 1 / G(t-) from the Kaplan-Meier censoring estimate so that subjects whose events occur when censoring is heavy receive greater influence. The result is a simple linear model that does not assume proportional hazards.


``` python
ridge = gw.IPCRidge(alpha=1.0).fit(y, lung[covariates])
ridge
```


    IPCRidge (IPC-weighted ridge, alpha=1.0)

                     coef
    (Intercept)     5.315
    age          -0.01992
    sex            0.6572
    ph.ecog       -0.5318
    ph.karno      0.01457
    wt.loss      0.001947

    n = 213, events = 151 (used for fitting)


The `alpha` parameter controls the ridge penalty. Setting `alpha=0` gives unpenalized IPC-weighted OLS. Larger values shrink the coefficients toward zero, which helps when covariates are correlated or numerous.

Predictions are on the log-time scale by default (`type="lp"`). Pass `type="response"` to get predicted survival times on the original scale.


``` python
ridge.predict(lung[covariates][:5], type="response")
```


    array([386.72519998, 491.17815835, 280.69111386, 509.60077987,
           109.31469154])


The coefficient table is available via [tidy()](../reference/tidy.md#greenwood.tidy), and model-level summaries via [glance()](../reference/glance.md#greenwood.glance).


``` python
gw.tidy(ridge)
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-7b852501 .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-7b852501 .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-7b852501 .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-7b852501 .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-7b852501 .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-7b852501 .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-7b852501 .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-7b852501 .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-7b852501 .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-7b852501 .gt_left { text-align: left; }
#gd-tbl-7b852501 .gt_center { text-align: center; }
#gd-tbl-7b852501 .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-7b852501 .gt_font_normal { font-weight: normal; }
#gd-tbl-7b852501 .gt_font_bold { font-weight: bold; }
#gd-tbl-7b852501 .gt_font_italic { font-style: italic; }
#gd-tbl-7b852501 .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-7b852501 .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-7b852501 .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-7b852501 .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-7b852501 .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-7b852501 .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-7b852501 tr.gd-tbl-divider td,
#gd-tbl-7b852501 tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-7b852501 .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-7b852501 .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-7b852501 .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-7b852501 .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-7b852501 .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-7b852501 .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-7b852501 .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-7b852501 .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-7b852501 .gt_table,
html.quarto-dark #gd-tbl-7b852501 .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-7b852501 .gt_heading,
html.quarto-dark #gd-tbl-7b852501 .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-7b852501 .gt_title,
html.quarto-dark #gd-tbl-7b852501 .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-7b852501 .gt_subtitle,
html.quarto-dark #gd-tbl-7b852501 .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-7b852501 .gt_col_headings,
html.quarto-dark #gd-tbl-7b852501 .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-7b852501 .gt_col_heading,
html.quarto-dark #gd-tbl-7b852501 .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-7b852501 .gt_table_body,
html.quarto-dark #gd-tbl-7b852501 .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-7b852501 .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-7b852501 .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-rownum,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-missing,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-dtype,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-7b852501 .gt_bottom_border,
html.quarto-dark #gd-tbl-7b852501 .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-7b852501 .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-7b852501 .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="3" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows6Columns2
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="term" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

term

<em>str</em>

</div></th>
<th id="estimate" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

estimate

<em>f64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_left" style="max-width: 214px">(Intercept)</td>
<td class="gt_row gt_right" style="max-width: 250px">5.31469425325</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_left" style="max-width: 214px">age</td>
<td class="gt_row gt_right" style="max-width: 250px">-0.0199243788921</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_left" style="max-width: 214px">sex</td>
<td class="gt_row gt_right" style="max-width: 250px">0.657164509677</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_left" style="max-width: 214px">ph.ecog</td>
<td class="gt_row gt_right" style="max-width: 250px">-0.531839726515</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_left" style="max-width: 214px">ph.karno</td>
<td class="gt_row gt_right" style="max-width: 250px">0.0145723160522</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_left" style="max-width: 214px">wt.loss</td>
<td class="gt_row gt_right" style="max-width: 250px">0.00194699468604</td>
</tr>
</tbody>
</table>


``` python
gw.glance(ridge)
```


<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@400;600&display=swap');
#gd-tbl-de5c98d9 .gt_table {
  display: table;
  border-collapse: collapse;
  table-layout: fixed;
  line-height: normal;
  margin-left: auto;
  margin-right: auto;
  color: #333333;
  font-size: 14px;
  font-weight: normal;
  font-style: normal;
  background-color: #FFFFFF;
  width: auto;
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #A8A8A8;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #A8A8A8;
}
#gd-tbl-de5c98d9 .gt_heading {
  background-color: #FFFFFF;
  text-align: left;
  border-bottom-color: #FFFFFF;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-de5c98d9 .gt_title {
  color: #333333;
  font-size: 125%;
  font-weight: initial;
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  border-bottom-color: #FFFFFF;
  border-bottom-width: 0;
}
#gd-tbl-de5c98d9 .gt_subtitle {
  color: #333333;
  font-size: 85%;
  font-weight: initial;
  padding-top: 3px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  border-top-color: #FFFFFF;
  border-top-width: 0;
}
#gd-tbl-de5c98d9 .gt_bottom_border {
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
}
#gd-tbl-de5c98d9 .gt_col_headings {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
  border-bottom-style: solid;
  border-bottom-width: 2px;
  border-bottom-color: #D3D3D3;
  border-left-style: none;
  border-right-style: none;
}
#gd-tbl-de5c98d9 .gt_col_heading {
  color: #333333;
  background-color: #FFFFFF;
  font-size: 100%;
  font-weight: normal;
  text-transform: inherit;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #F2F2F2;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #F2F2F2;
  vertical-align: bottom;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 5px;
  padding-right: 5px;
  overflow-x: hidden;
}
#gd-tbl-de5c98d9 .gt_table_body {
  border-top-style: solid;
  border-top-width: 2px;
  border-top-color: #D3D3D3;
}
#gd-tbl-de5c98d9 .gt_row {
  padding-top: 4px;
  padding-bottom: 4px;
  padding-left: 5px;
  padding-right: 5px;
  margin: 10px;
  border-top-style: solid;
  border-top-width: 1px;
  border-top-color: #E9E9E9;
  border-left-style: solid;
  border-left-width: 1px;
  border-left-color: #E9E9E9;
  border-right-style: solid;
  border-right-width: 1px;
  border-right-color: #E9E9E9;
  vertical-align: middle;
  overflow-x: hidden;
}
#gd-tbl-de5c98d9 .gt_left { text-align: left; }
#gd-tbl-de5c98d9 .gt_center { text-align: center; }
#gd-tbl-de5c98d9 .gt_right { text-align: right; font-variant-numeric: tabular-nums; }
#gd-tbl-de5c98d9 .gt_font_normal { font-weight: normal; }
#gd-tbl-de5c98d9 .gt_font_bold { font-weight: bold; }
#gd-tbl-de5c98d9 .gt_font_italic { font-style: italic; }
#gd-tbl-de5c98d9 .gt_striped { background-color: rgba(128,128,128,0.05); }
#gd-tbl-de5c98d9 .gt_from_md > :first-child { margin-top: 0; }
#gd-tbl-de5c98d9 .gt_from_md > :last-child { margin-bottom: 0; }
/* Data cell font */
#gd-tbl-de5c98d9 .gt_table_body .gt_row {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  height: 14px;
}
/* Column label font */
#gd-tbl-de5c98d9 .gt_col_heading {
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 12px;
  color: #333333;
}
/* Row number styling */
#gd-tbl-de5c98d9 .gd-tbl-rownum {
  color: gray;
  font-family: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 10px;
  border-right: 2px solid rgba(102, 153, 204, 0.5) !important;
  text-align: right;
  padding-right: 6px;
  white-space: nowrap;
}
/* Head/tail divider */
#gd-tbl-de5c98d9 tr.gd-tbl-divider td,
#gd-tbl-de5c98d9 tr.gd-tbl-divider th {
  border-bottom: 2px solid rgba(102, 153, 204, 0.5);
}
/* Missing values */
#gd-tbl-de5c98d9 .gd-tbl-missing {
  color: #B22222 !important;
  background-color: rgba(255, 193, 193, 0.35);
}
/* Column label sub-elements */
#gd-tbl-de5c98d9 .gd-tbl-colname {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-bottom: 0;
  margin-bottom: 0;
}
#gd-tbl-de5c98d9 .gd-tbl-dtype {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  padding-top: 0;
  margin-top: 0;
  color: #666666;
}
/* Header badge styling */
#gd-tbl-de5c98d9 .gd-tbl-badge {
  display: inline-block;
  padding: 2px 10px;
  font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  font-size: 10px;
  font-weight: bold;
  text-transform: uppercase;
  position: inherit;
}
#gd-tbl-de5c98d9 .gd-tbl-badge-rows-label {
  background-color: #eecbff;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: 5px;
}
#gd-tbl-de5c98d9 .gd-tbl-badge-rows-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #eecbff;
  margin-left: -4px;
  margin-right: 3px;
}
#gd-tbl-de5c98d9 .gd-tbl-badge-cols-label {
  background-color: #BDE7B4;
  color: #333333;
  border: 1px solid #BDE7B4;
}
#gd-tbl-de5c98d9 .gd-tbl-badge-cols-value {
  background-color: transparent;
  color: #333333;
  border: 1px solid #BDE7B4;
  margin-left: -4px;
}
/* Dark mode */
body.quarto-dark #gd-tbl-de5c98d9 .gt_table,
html.quarto-dark #gd-tbl-de5c98d9 .gt_table,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_table {
  background-color: #1a1a2e;
  color: #e0e0e0;
  border-top-color: #555;
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_heading,
html.quarto-dark #gd-tbl-de5c98d9 .gt_heading,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_heading {
  background-color: #1a1a2e;
  border-bottom-color: #1a1a2e;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_title,
html.quarto-dark #gd-tbl-de5c98d9 .gt_title,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_title {
  color: #e0e0e0;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_subtitle,
html.quarto-dark #gd-tbl-de5c98d9 .gt_subtitle,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_subtitle {
  color: #b0b0b0;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_col_headings,
html.quarto-dark #gd-tbl-de5c98d9 .gt_col_headings,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_col_headings {
  border-top-color: #444;
  border-bottom-color: #444;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_col_heading,
html.quarto-dark #gd-tbl-de5c98d9 .gt_col_heading,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_col_heading {
  color: #b0b0b0;
  background-color: #1a1a2e;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_table_body,
html.quarto-dark #gd-tbl-de5c98d9 .gt_table_body,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_table_body {
  border-top-color: #444;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_table_body .gt_row,
html.quarto-dark #gd-tbl-de5c98d9 .gt_table_body .gt_row,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_table_body .gt_row {
  color: #d0d0d0;
  border-top-color: #4b4b4b;
  border-bottom-color: #4b4b4b;
  border-left-color: #333;
  border-right-color: #333;
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-rownum,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-rownum,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-rownum {
  color: #888;
  border-right-color: rgba(102, 153, 204, 0.4) !important;
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-missing,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-missing,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-missing {
  color: #ff6b6b !important;
  background-color: rgba(60, 17, 24, 0.2);
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-dtype,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-dtype,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-dtype {
  color: #888;
}
body.quarto-dark #gd-tbl-de5c98d9 .gt_bottom_border,
html.quarto-dark #gd-tbl-de5c98d9 .gt_bottom_border,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gt_bottom_border {
  border-bottom-color: #555;
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-rows-label,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-rows-label,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-badge-rows-label {
  background-color: #3d2a4d;
  border-color: #3d2a4d;
  color: #e0c0ff;
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-rows-value,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-rows-value,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-badge-rows-value {
  border-color: #3d2a4d;
  color: #d0b0e0;
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-cols-label,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-cols-label,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-badge-cols-label {
  background-color: #2a4d2a;
  border-color: #2a4d2a;
  color: #b0e0b0;
}
body.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-cols-value,
html.quarto-dark #gd-tbl-de5c98d9 .gd-tbl-badge-cols-value,
:root[data-bs-theme="dark"] #gd-tbl-de5c98d9 .gd-tbl-badge-cols-value {
  border-color: #2a4d2a;
  color: #a0d0a0;
}
</style>

<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="5" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #0075FF; color: #FFFFFF; border: 1px solid #0075FF; margin-right: 8px;">Polars</span>Rows1Columns4
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="n" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

n

<em>i64</em>

</div></th>
<th id="nevent" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

nevent

<em>i64</em>

</div></th>
<th id="alpha" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

alpha

<em>f64</em>

</div></th>
<th id="n_features" class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"><div>

n_features

<em>i64</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_right" style="max-width: 100px">213</td>
<td class="gt_row gt_right" style="max-width: 113px">151</td>
<td class="gt_row gt_right" style="max-width: 105px">1</td>
<td class="gt_row gt_right" style="max-width: 144px">5</td>
</tr>
</tbody>
</table>


Because the linear predictor is on the log-time scale (higher means longer survival), negate it to get a risk score compatible with [concordance_index()](../reference/concordance_index.md#greenwood.concordance_index).


``` python
risk = -ridge.predict(lung[covariates], type="lp")
gw.concordance_index(y, risk)
```


    0.6435882352941177


# Visualizing per-subject curves

Because these models predict an individual survival curve for every subject, [plot_predicted_survival()](../reference/plot_predicted_survival.md#greenwood.plot_predicted_survival) draws one step curve per row of new data. It works with any of the machine-learning models (and with [CoxPH](../reference/CoxPH.md#greenwood.CoxPH)), so you can compare how predicted survival varies across individuals.


``` python
# Compare predicted survival for four patients from the forest
gw.plot_predicted_survival(rsf, lung[covariates][:4])
```


<style>
  #altair-viz-e1f13420c3064d018d890ce473a50d00.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-e1f13420c3064d018d890ce473a50d00.vega-embed details,
  #altair-viz-e1f13420c3064d018d890ce473a50d00.vega-embed details summary {
    position: relative;
  }
</style>


Pass `type="cumulative_hazard"` for the cumulative-hazard scale, or `labels=` to name the curves.


# Comparing models

All of these models expose a risk score, so you can judge and compare them with the same censoring-aware metrics as any other model. Here we compare the three ensembles by concordance on the training data (for an honest estimate, evaluate on held-out data or use the forest's out-of-bag score).


``` python
# In-sample concordance for the three ensemble models
scores = {
    "random forest": gw.concordance_index(y, rsf.predict(lung[covariates])),
    "extra trees": gw.concordance_index(y, ext.predict(lung[covariates])),
    "gradient boosting": gw.concordance_index(y, gbm.predict(lung[covariates])),
}
scores
```


    {'random forest': 0.8101176470588235,
     'extra trees': 0.726764705882353,
     'gradient boosting': 0.7446764705882353}


See [Prediction performance](prediction-performance.md) for concordance on held-out data, the Brier score, and time-dependent AUC (the right way to compare these models).
