# loss

Class: CompactRegressionTree

Regression error

## Syntax

```L = loss(tree,X,Y)[L,se] = loss(tree,X,Y)[L,se,NLeaf] = loss(tree,X,Y)[L,se,NLeaf,bestlevel] = loss(tree,X,Y)L = loss(tree,X,Y,Name,Value)```

## Description

`L = loss(tree,X,Y)` returns the mean squared error between the predictions of `tree` to the data in `X`, compared to the true responses `Y`.

```[L,se] = loss(tree,X,Y)``` returns the standard error of the loss.

```[L,se,NLeaf] = loss(tree,X,Y)``` returns the number of leaves (terminal nodes) in the tree.

```[L,se,NLeaf,bestlevel] = loss(tree,X,Y)``` returns the optimal pruning level for `tree`.

`L = loss(tree,X,Y,Name,Value)` computes the error in prediction with additional options specified by one or more `Name,Value` pair arguments.

## Input Arguments

 `tree` Regression tree created with `fitrtree`, or the `compact` method. `X` A matrix of predictor values. Each column of `X` represents one variable, and each row represents one observation. `Y` A numeric column vector with the same number of rows as `X`. Each entry in `Y` is the response to the data in the corresponding row of `X`.

### Name-Value Pair Arguments

Specify optional comma-separated pairs of `Name,Value` arguments. `Name` is the argument name and `Value` is the corresponding value. `Name` must appear inside single quotes (`' '`). You can specify several name and value pair arguments in any order as `Name1,Value1,...,NameN,ValueN`.

 `'LossFun'` Function handle for loss, or the string `'mse'` representing mean-squared error. If you pass a function handle `fun`, `loss` calls `fun` as: `fun(Y,Yfit,W)` `Y` is the vector of true responses.`Yfit` is the vector of predicted responses.`W` is the observation weights. If you pass `W`, the elements are normalized to sum to `1`. All the vectors have the same number of rows as `Y`. Default: `'mse'` `'Subtrees'` A vector of nonnegative integers in ascending order or `'all'`. If you specify a vector, then all elements must be at least `0` and at most `max(tree.PruneList)`. `0` indicates the full, unpruned tree and `max(tree.PruneList)` indicates the a completely pruned tree (i.e., just the root node). If you specify `'all'`, then `CompactRegressionTree.loss` operates on all subtrees (i.e., the entire pruning sequence). This specification is equivalent to using `0:max(tree.PruneList)`. `CompactRegressionTree.loss` prunes `tree` to each level indicated in `Subtrees`, and then estimates the corresponding output arguments. The size of `Subtrees` determines the size of some output arguments. To invoke `Subtrees`, the properties `PruneList` and `PruneAlpha` of `tree` must be nonempty. In other words, grow `tree` by setting `'Prune','on'`, or by pruning `tree` using `prune`. Default: `0` `'TreeSize'` A string, either: `'se'` — `loss` returns `bestlevel` that corresponds to the smallest tree whose mean squared error (MSE) is within one standard error of the minimum MSE.`'min'` — `loss` returns `bestlevel` that corresponds to the minimal MSE tree. `'Weights'` Numeric vector of observation weights with the same number of elements as `Y`. Default: `ones(size(Y))`

## Output Arguments

 `L` Classification error, a vector the length of `Subtrees`. The error for each tree is the mean squared error, weighted with `Weights`. If you include `LossFun`, `L` reflects the loss calculated with `LossFun`. `se` Standard error of loss, a vector the length of `Subtrees`. `NLeaf` Number of leaves (terminal nodes) in the pruned subtrees, a vector the length of `Subtrees`. `bestlevel` A scalar whose value depends on `TreeSize`: `TreeSize` = `'se'` — `loss` returns the highest pruning level with loss within one standard deviation of the minimum (`L`+`se`, where `L` and `se` relate to the smallest value in `Subtrees`).`TreeSize` = `'min'` — `loss` returns the element of `Subtrees` with smallest loss, usually the smallest element of `Subtrees`.

## Definitions

### Mean Squared Error

The mean squared error m of the predictions f(Xn) with weight vector w is

$m=\frac{\sum {w}_{n}{\left(f\left({X}_{n}\right)-{Y}_{n}\right)}^{2}}{\sum {w}_{n}}.$

## Examples

collapse all

### Compute the In-Sample MSE

Load the `carsmall` data set. Consider `Displacement`, `Horsepower`, and `Weight` as predictors of the response `MPG`.

```load carsmall X = [Displacement Horsepower Weight]; ```

Grow a regression tree using all observations.

```tree = fitrtree(X,MPG); ```

Estimate the in-sample MSE.

```L = loss(tree,X,MPG) ```
```L = 4.8952 ```

### Find the Pruning Level Yielding the Optimal In-sample Loss

Load the `carsmall` data set. Consider `Displacement`, `Horsepower`, and `Weight` as predictors of the response `MPG`.

```load carsmall X = [Displacement Horsepower Weight]; ```

Grow a regression tree using all observations.

```Mdl = fitrtree(X,MPG); ```

View the regression tree.

```view(Mdl,'Mode','graph'); ```

Find the best pruning level that yields the optimal in-sample loss.

```[L,se,NLeaf,bestLevel] = loss(Mdl,X,MPG,'Subtrees','all'); bestLevel ```
```bestLevel = 1 ```

The best pruning level is level 1.

Prune the tree to level 1.

```pruneMdl = prune(Mdl,'Level',bestLevel); view(pruneMdl,'Mode','graph'); ```

### Examine the MSE for Each Subtree

Unpruned decision trees tend to overfit. One way to balance model complexity and out-of-sample performance is to prune a tree (or restrict its growth) so that in-sample and out-of-sample performance are satisfactory.

Load the `carsmall` data set. Consider `Displacement`, `Horsepower`, and `Weight` as predictors of the response `MPG`.

```load carsmall X = [Displacement Horsepower Weight]; Y = MPG; ```

Partition the data into training (50%) and validation (50%) sets.

```n = size(X,1); rng(1) % For reproducibility idxTrn = false(n,1); idxTrn(randsample(n,round(0.5*n))) = true; % Training set logical indices idxVal = idxTrn == false; % Validation set logical indices ```

Grow a regression tree using the training set.

```Mdl = fitrtree(X(idxTrn,:),Y(idxTrn)); ```

View the regression tree.

```view(Mdl,'Mode','graph'); ```

The regression tree has seven pruning levels. Level 0 is the full, unpruned tree (as displayed). Level 7 is just the root node (i.e., no splits).

Examine the training sample MSE for each subtree (or pruning level) excluding the highest level.

```m = max(Mdl.PruneList) - 1; trnLoss = resubLoss(Mdl,'SubTrees',0:m) ```
```trnLoss = 5.9789 6.2768 6.8316 7.5209 8.3951 10.7452 14.8445 ```
• The MSE for the full, unpruned tree is about 6 units.

• The MSE for the tree pruned to level 1 is about 6.3 units.

• The MSE for the tree pruned to level 6 (i.e., a stump) is about 14.8 units.

Examine the validation sample MSE at each level excluding the highest level.

```valLoss = loss(Mdl,X(idxVal,:),Y(idxVal),'SubTrees',0:m) ```
```valLoss = 32.1205 31.5035 32.0541 30.8183 26.3535 30.0137 38.4695 ```
• The MSE for the full, unpruned tree (level 0) is about 32.1 units.

• The MSE for the tree pruned to level 4 is about 26.4 units.

• The MSE for the tree pruned to level 5 is about 30.0 units.

• The MSE for the tree pruned to level 6 (i.e., a stump) is about 38.5 units.

To balance model complexity and out-of-sample performance, consider pruning `Mdl` to level 4.

```pruneMdl = prune(Mdl,'Level',4); view(pruneMdl,'Mode','graph') ```