From 902ce81b35e8e5fc6ca11f7cd1a36dc8f09beb3b Mon Sep 17 00:00:00 2001 From: mhjensen Date: Wed, 10 Nov 2021 16:24:45 +0100 Subject: [PATCH] update week 45 --- doc/pub/week45/html/._week45-bs000.html | 443 ++-- doc/pub/week45/html/._week45-bs001.html | 425 ++-- doc/pub/week45/html/._week45-bs002.html | 432 ++-- doc/pub/week45/html/._week45-bs003.html | 422 ++-- doc/pub/week45/html/._week45-bs004.html | 415 ++-- doc/pub/week45/html/._week45-bs005.html | 415 ++-- doc/pub/week45/html/._week45-bs006.html | 424 ++-- doc/pub/week45/html/._week45-bs007.html | 423 ++-- doc/pub/week45/html/._week45-bs008.html | 421 ++-- doc/pub/week45/html/._week45-bs009.html | 439 ++-- doc/pub/week45/html/._week45-bs010.html | 428 ++-- doc/pub/week45/html/._week45-bs011.html | 422 ++-- doc/pub/week45/html/._week45-bs012.html | 438 ++-- doc/pub/week45/html/._week45-bs013.html | 425 ++-- doc/pub/week45/html/._week45-bs014.html | 432 ++-- doc/pub/week45/html/._week45-bs015.html | 419 ++-- doc/pub/week45/html/._week45-bs016.html | 420 ++-- doc/pub/week45/html/._week45-bs017.html | 426 ++-- doc/pub/week45/html/._week45-bs018.html | 436 ++-- doc/pub/week45/html/._week45-bs019.html | 439 ++-- doc/pub/week45/html/._week45-bs020.html | 439 ++-- doc/pub/week45/html/._week45-bs021.html | 442 ++-- doc/pub/week45/html/._week45-bs022.html | 443 ++-- doc/pub/week45/html/._week45-bs023.html | 422 ++-- doc/pub/week45/html/._week45-bs024.html | 429 ++-- doc/pub/week45/html/._week45-bs025.html | 428 ++-- doc/pub/week45/html/._week45-bs026.html | 425 ++-- doc/pub/week45/html/._week45-bs027.html | 439 ++-- doc/pub/week45/html/._week45-bs028.html | 446 ++-- doc/pub/week45/html/._week45-bs029.html | 437 ++-- doc/pub/week45/html/._week45-bs030.html | 439 ++-- doc/pub/week45/html/._week45-bs031.html | 439 ++-- doc/pub/week45/html/._week45-bs032.html | 439 ++-- doc/pub/week45/html/._week45-bs033.html | 462 ++-- doc/pub/week45/html/._week45-bs034.html | 462 ++-- doc/pub/week45/html/._week45-bs035.html | 414 ++-- doc/pub/week45/html/._week45-bs036.html | 418 ++-- doc/pub/week45/html/._week45-bs037.html | 425 ++-- doc/pub/week45/html/._week45-bs038.html | 421 ++-- doc/pub/week45/html/._week45-bs039.html | 426 ++-- doc/pub/week45/html/._week45-bs040.html | 422 ++-- doc/pub/week45/html/._week45-bs041.html | 439 ++-- doc/pub/week45/html/._week45-bs042.html | 439 ++-- doc/pub/week45/html/._week45-bs043.html | 508 ++-- doc/pub/week45/html/._week45-bs044.html | 508 ++-- doc/pub/week45/html/._week45-bs045.html | 443 ++-- doc/pub/week45/html/._week45-bs046.html | 431 ++-- doc/pub/week45/html/._week45-bs047.html | 430 ++-- doc/pub/week45/html/._week45-bs048.html | 439 ++-- doc/pub/week45/html/._week45-bs049.html | 439 ++-- doc/pub/week45/html/._week45-bs050.html | 442 ++-- doc/pub/week45/html/._week45-bs051.html | 508 ++-- doc/pub/week45/html/._week45-bs052.html | 440 ++-- doc/pub/week45/html/._week45-bs053.html | 424 ++-- doc/pub/week45/html/._week45-bs054.html | 446 ++-- doc/pub/week45/html/._week45-bs055.html | 462 ++-- doc/pub/week45/html/._week45-bs056.html | 422 ++-- doc/pub/week45/html/._week45-bs057.html | 440 ++-- doc/pub/week45/html/._week45-bs058.html | 423 ++-- doc/pub/week45/html/._week45-bs059.html | 445 ++-- doc/pub/week45/html/._week45-bs060.html | 431 ++-- doc/pub/week45/html/._week45-bs061.html | 427 ++-- doc/pub/week45/html/._week45-bs062.html | 433 ++-- doc/pub/week45/html/._week45-bs063.html | 425 ++-- doc/pub/week45/html/._week45-bs064.html | 427 ++-- doc/pub/week45/html/._week45-bs065.html | 442 ++-- doc/pub/week45/html/._week45-bs066.html | 422 ++-- doc/pub/week45/html/._week45-bs067.html | 432 ++-- doc/pub/week45/html/._week45-bs068.html | 421 ++-- doc/pub/week45/html/._week45-bs069.html | 429 ++-- doc/pub/week45/html/._week45-bs070.html | 439 ++-- doc/pub/week45/html/._week45-bs071.html | 439 ++-- doc/pub/week45/html/._week45-bs072.html | 425 ++-- doc/pub/week45/html/._week45-bs073.html | 439 ++-- doc/pub/week45/html/._week45-bs074.html | 441 ++-- doc/pub/week45/html/week45-bs.html | 443 ++-- doc/pub/week45/html/week45-reveal.html | 2156 ++++++----------- doc/pub/week45/html/week45-solarized.html | 2185 +++++++---------- doc/pub/week45/html/week45.html | 2263 +++++++----------- doc/pub/week45/ipynb/ipynb-week45-src.tar.gz | Bin 294340 -> 293595 bytes doc/pub/week45/ipynb/week45.ipynb | 1365 +++-------- doc/src/week45/week45.do.txt | 4 +- 82 files changed, 16496 insertions(+), 24581 deletions(-) diff --git a/doc/pub/week45/html/._week45-bs000.html b/doc/pub/week45/html/._week45-bs000.html index 9b208d6d2..e6071ed7c 100644 --- a/doc/pub/week45/html/._week45-bs000.html +++ b/doc/pub/week45/html/._week45-bs000.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
+

 

 

 

+ -
-
-

Week 45: Decisions Trees, Random Forests, Bagging and Boosting

-
+ + +
+

Week 45: Decisions Trees, Random Forests, Bagging and Boosting

+ +

+

Morten Hjorth-Jensen [1, 2]
- -
-[1] Department of Physics, University of Oslo -
-
-[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University -
-
-
-

Nov 9, 2021

-
-
+

+ + +

[1] Department of Physics, University of Oslo
+
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
+
+

+

Nov 10, 2021

+
+

Read »

@@ -421,18 +349,25 @@ MathJax.Hub.Config({
  • »
  • +
    + + +
    © 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
    + + + diff --git a/doc/pub/week45/html/._week45-bs001.html b/doc/pub/week45/html/._week45-bs001.html index e5aba384d..e19211e5c 100644 --- a/doc/pub/week45/html/._week45-bs001.html +++ b/doc/pub/week45/html/._week45-bs001.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Overview of week 45

    + +

    Overview of week 45

    • Thursday: Basics of Decision Trees, Bagging and Voting
    • Friday: More on Bagging, Voting, Random Forests and start Boosting
    + +

    - +

    +

    1. Decision Trees: Geron's chapter 6 covers decision trees while ensemble models, voting and bagging are discussed in chapter 7. See also lecture from STK-IN4300, lecture 7. Chapter 9.2 of Hastie et al contains also a good discussion.
    @@ -401,6 +334,7 @@ MathJax.Hub.Config({
    +

      @@ -421,18 +355,25 @@ MathJax.Hub.Config({
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs002.html b/doc/pub/week45/html/._week45-bs002.html index 595542bd8..7440b4378 100644 --- a/doc/pub/week45/html/._week45-bs002.html +++ b/doc/pub/week45/html/._week45-bs002.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Decision trees, overarching aims

    -

    We start here with the most basic algorithm, the so-called decision +

    Decision trees, overarching aims

    + +

    +We start here with the most basic algorithm, the so-called decision tree. With this basic algorithm we can in turn build more complex networks, spanning from homogeneous and heterogenous forests (bagging, random forests and more) to one of the most popular supervised algorithms nowadays, the extreme gradient boosting, or just XGBoost. But let us start with the simplest possible ingredient. -

    -

    Decision trees are supervised learning algorithms used for both, +

    +Decision trees are supervised learning algorithms used for both, classification and regression tasks. -

    -

    The main idea of decision trees +

    +The main idea of decision trees is to find those descriptive features which contain the most information regarding the target feature and then split the dataset along the values of these features such that the target feature values for the resulting underlying datasets are as pure as possible. -

    -

    The descriptive features which reproduce best the target/output features are normally said +

    +The descriptive features which reproduce best the target/output features are normally said to be the most informative ones. The process of finding the most informative feature is done until we accomplish a stopping criteria -where we then finally end up in so called leaf nodes. -

    +where we then finally end up in so called leaf nodes. +

      @@ -422,18 +351,25 @@ where we then finally end up in so called leaf nodes.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs003.html b/doc/pub/week45/html/._week45-bs003.html index 584d18486..fa056f37d 100644 --- a/doc/pub/week45/html/._week45-bs003.html +++ b/doc/pub/week45/html/._week45-bs003.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Basics of a tree

    -

    A decision tree is typically divided into a root node, the interior nodes, +

    Basics of a tree

    + +

    +A decision tree is typically divided into a root node, the interior nodes, and the final leaf nodes or just leaves. These entities are then connected by so-called branches. -

    -

    The leaf nodes +

    +The leaf nodes contain the predictions we will make for new query instances presented to our trained model. This is possible since the model has learned the underlying structure of the training data and hence can, given some assumptions, make predictions about the target feature value (class) of unseen query instances. -

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs004.html b/doc/pub/week45/html/._week45-bs004.html index 5681fbc5a..ceb0130f2 100644 --- a/doc/pub/week45/html/._week45-bs004.html +++ b/doc/pub/week45/html/._week45-bs004.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    A Sketch of a Tree, Regression problem

    +

    A Sketch of a Tree, Regression problem

    + +

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs005.html b/doc/pub/week45/html/._week45-bs005.html index 7214fe91d..2431d9d19 100644 --- a/doc/pub/week45/html/._week45-bs005.html +++ b/doc/pub/week45/html/._week45-bs005.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    A Sketch of a Tree, Classification problem

    +

    A Sketch of a Tree, Classification problem

    + +

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs006.html b/doc/pub/week45/html/._week45-bs006.html index 6f7eb59ec..a7547ffa9 100644 --- a/doc/pub/week45/html/._week45-bs006.html +++ b/doc/pub/week45/html/._week45-bs006.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    -

    -
    -

    -
    -

    +

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    -

    This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using Scikit-Learn's decision tree classifier. Here we have used the so-called gini index (see below) to split the various branches.

    +

    +



    +

    +This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using Scikit-Learn's decision tree classifier. Here we have used the so-called gini index (see below) to split the various branches. + +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs007.html b/doc/pub/week45/html/._week45-bs007.html index c839830c0..6744841af 100644 --- a/doc/pub/week45/html/._week45-bs007.html +++ b/doc/pub/week45/html/._week45-bs007.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    General Features

    -

    The overarching approach to decision trees is a top-down approach.

    +

    General Features

    + +

    +The overarching approach to decision trees is a top-down approach.

    -

    This process is then repeated for the subtree rooted at the new -node. -

    +This process is then repeated for the subtree rooted at the new +node. + +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs008.html b/doc/pub/week45/html/._week45-bs008.html index 0ce7375a4..986561c8b 100644 --- a/doc/pub/week45/html/._week45-bs008.html +++ b/doc/pub/week45/html/._week45-bs008.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    How do we set it up?

    -

    In simplified terms, the process of training a decision tree and +

    How do we set it up?

    + +

    +In simplified terms, the process of training a decision tree and predicting the target features of query instances is as follows: -

    1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature
    2. @@ -386,8 +314,10 @@ predicting the target features of query instances is as follows:
    3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the predictions we want to make for new query instances
    4. Show query instances to the tree and run down the tree until we arrive at leaf nodes
    -

    Then we are essentially done!

    +Then we are essentially done! + +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs009.html b/doc/pub/week45/html/._week45-bs009.html index 15b25bcbd..68df708ab 100644 --- a/doc/pub/week45/html/._week45-bs009.html +++ b/doc/pub/week45/html/._week45-bs009.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Decision trees and Regression

    + +

    Decision trees and Regression

    +

    -

    -
    -
    -
    -
    -
    import numpy as np
    +
    import numpy as np
     import matplotlib.pyplot as plt
     from sklearn.preprocessing import PolynomialFeatures
     from sklearn.linear_model import LinearRegression
    @@ -470,22 +394,8 @@ plt.ylabel(&quo
     plt.title("Decision Tree Regression")
     plt.legend()
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs010.html b/doc/pub/week45/html/._week45-bs010.html index 95bf38cd4..85096c864 100644 --- a/doc/pub/week45/html/._week45-bs010.html +++ b/doc/pub/week45/html/._week45-bs010.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Building a tree, regression

    -

    There are mainly two steps

    +

    Building a tree, regression

    + +

    +There are mainly two steps +

    1. We split the predictor space (the set of possible values \( x_1,x_2,\dots, x_p \)) into \( J \) distinct and non-non-overlapping regions, \( R_1,R_2,\dots,R_J \).
    2. For every observation that falls into the region \( R_j \) , we make the same prediction, which is simply the mean of the response values for the training observations in \( R_j \).
    -

    How do we construct the regions \( R_1,\dots,R_J \)? In theory, the + +How do we construct the regions \( R_1,\dots,R_J \)? In theory, the regions could have any shape. However, we choose to divide the predictor space into high-dimensional rectangles, or boxes, for simplicity and for ease of interpretation of the resulting predictive model. The goal is to find boxes \( R_1,\dots,R_J \) that minimize the MSE, given by -

    $$ \sum_{j=1}^J\sum_{i\in R_j}(y_i-\overline{y}_{R_j})^2, $$ -

    where \( \overline{y}_{R_j} \) is the mean response for the training observations -within box \( j \). -

    +

    +where \( \overline{y}_{R_j} \) is the mean response for the training observations +within box \( j \). +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs011.html b/doc/pub/week45/html/._week45-bs011.html index 1ced5775f..26eb58c8f 100644 --- a/doc/pub/week45/html/._week45-bs011.html +++ b/doc/pub/week45/html/._week45-bs011.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    A top-down approach, recursive binary splitting

    -

    Unfortunately, it is computationally infeasible to consider every +

    A top-down approach, recursive binary splitting

    + +

    +Unfortunately, it is computationally infeasible to consider every possible partition of the feature space into \( J \) boxes. The common strategy is to take a top-down approach -

    -

    The approach is top-down because it begins at the top of the tree (all +

    +The approach is top-down because it begins at the top of the tree (all observations belong to a single region) and then successively splits the predictor space; each split is indicated via two new branches further down on the tree. It is greedy because at each step of the tree-building process, the best split is made at that particular step, rather than looking ahead and picking a split that will lead to a better tree in some future step. -

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs012.html b/doc/pub/week45/html/._week45-bs012.html index ddef5e95a..a7a741c07 100644 --- a/doc/pub/week45/html/._week45-bs012.html +++ b/doc/pub/week45/html/._week45-bs012.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Making a tree

    -

    In order to implement the recursive binary splitting we start by selecting +

    Making a tree

    + +

    +In order to implement the recursive binary splitting we start by selecting the predictor \( x_j \) and a cutpoint \( s \) that splits the predictor space into two regions \( R_1 \) and \( R_2 \) -

    $$ \left\{X\vert x_j < s\right\}, $$ -

    and

    +and $$ \left\{X\vert x_j \geq s\right\}, $$ -

    so that we obtain the lowest MSE, that is

    +so that we obtain the lowest MSE, that is $$ \sum_{i:x_i\in R_j}(y_i-\overline{y}_{R_1})^2+\sum_{i:x_i\in R_2}(y_i-\overline{y}_{R_2})^2, $$ -

    which we want to minimize by considering all predictors +

    +which we want to minimize by considering all predictors \( x_1,x_2,\dots,x_p \). We consider also all possible values of \( s \) for each predictor. These values could be determined by randomly assigned numbers or by starting at the midpoint and then proceed till we find an optimal value. -

    -

    For any \( j \) and \( s \), we define the pair of half-planes where +

    +For any \( j \) and \( s \), we define the pair of half-planes where \( \overline{y}_{R_1} \) is the mean response for the training observations in \( R_1(j,s) \), and \( \overline{y}_{R_2} \) is the mean response for the training observations in \( R_2(j,s) \). -

    -

    Finding the values of \( j \) and \( s \) that minimize the above equation can be +

    +Finding the values of \( j \) and \( s \) that minimize the above equation can be done quite quickly, especially when the number of features \( p \) is not too large. -

    -

    Next, we repeat the process, looking +

    +Next, we repeat the process, looking for the best predictor and best cutpoint in order to split the data further so as to minimize the MSE within each of the resulting regions. However, this time, instead of splitting the entire predictor @@ -420,8 +349,8 @@ have three regions. Again, we look to split one of these three regions further, so as to minimize the MSE. The process continues until a stopping criterion is reached; for instance, we may continue until no region contains more than five observations. -

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs013.html b/doc/pub/week45/html/._week45-bs013.html index 98b40a18f..af308f80c 100644 --- a/doc/pub/week45/html/._week45-bs013.html +++ b/doc/pub/week45/html/._week45-bs013.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Pruning the tree

    -

    The above procedure is rather straightforward, but leads often to +

    Pruning the tree

    + +

    +The above procedure is rather straightforward, but leads often to overfitting and unnecessarily large and complicated trees. The basic idea is to grow a large tree \( T_0 \) and then prune it back in order to obtain a subtree. A smaller tree with fewer splits (fewer regions) can lead to smaller variance and better interpretation at the cost of a little more bias. -

    -

    The so-called Cost complexity pruning algorithm gives us a +

    +The so-called Cost complexity pruning algorithm gives us a way to do just this. Rather than considering every possible subtree, we consider a sequence of trees indexed by a nonnegative tuning parameter \( \alpha \). -

    -

    Read more at the following Scikit-Learn link on pruning.

    +

    +Read more at the following Scikit-Learn link on pruning. +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs014.html b/doc/pub/week45/html/._week45-bs014.html index 242744e67..563bef4fc 100644 --- a/doc/pub/week45/html/._week45-bs014.html +++ b/doc/pub/week45/html/._week45-bs014.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Cost complexity pruning

    -

    For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that

    +

    Cost complexity pruning

    + +

    +For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that $$ \sum_{m=1}^{\overline{T}}\sum_{i:x_i\in R_m}(y_i-\overline{y}_{R_m})^2+\alpha\overline{T}, $$ -

    is as small as possible. Here \( \overline{T} \) is +is as small as possible. Here \( \overline{T} \) is the number of terminal nodes of the tree \( T \) , \( R_m \) is the rectangle (i.e. the subset of predictor space) corresponding to the \( m \)-th terminal node. -

    -

    The tuning parameter \( \alpha \) controls a trade-off between the subtree’s +

    +The tuning parameter \( \alpha \) controls a trade-off between the subtree’s complexity and its fit to the training data. When \( \alpha = 0 \), then the subtree \( T \) will simply equal \( T_0 \), because then the above equation just measures the training error. However, as \( \alpha \) increases, there is a price to pay for having a tree with many terminal nodes. The above equation will -tend to be minimized for a smaller subtree. -

    +tend to be minimized for a smaller subtree. -

    It turns out that as we increase \( \alpha \) from zero +

    +It turns out that as we increase \( \alpha \) from zero branches get pruned from the tree in a nested and predictable fashion, so obtaining the whole sequence of subtrees as a function of \( \alpha \) is easy. We can select a value of \( \alpha \) using a validation set or using cross-validation. We then return to the full data set and obtain the -subtree corresponding to \( \alpha \). -

    +subtree corresponding to \( \alpha \). +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs015.html b/doc/pub/week45/html/._week45-bs015.html index e455050b4..414b7d479 100644 --- a/doc/pub/week45/html/._week45-bs015.html +++ b/doc/pub/week45/html/._week45-bs015.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Schematic Regression Procedure

    +

    Schematic Regression Procedure

    + +

    - +

    1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.
    2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of \( \alpha \).
    3. Use for example \( K \)-fold cross-validation to choose \( \alpha \). Divide the training observations into \( K \) folds. For each \( k=1,2,\dots,K \) we:
    4. +
      • repeat steps 1 and 2 on all but the \( k \)-th fold of the training data.
      • Then we valuate the mean squared prediction error on the data in the left-out \( k \)-th fold, as a function of \( \alpha \).
      • Finally we average the results for each value of \( \alpha \), and pick \( \alpha \) to minimize the average error.
      +
    5. Return the subtree from Step 2 that corresponds to the chosen value of \( \alpha \).
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs016.html b/doc/pub/week45/html/._week45-bs016.html index e5042d19e..70141b360 100644 --- a/doc/pub/week45/html/._week45-bs016.html +++ b/doc/pub/week45/html/._week45-bs016.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    A Classification Tree

    -

    A classification tree is very similar to a regression tree, except +

    A Classification Tree

    + +

    +A classification tree is very similar to a regression tree, except that it is used to predict a qualitative response rather than a quantitative one. Recall that for a regression tree, the predicted response for an observation is given by the mean response of the @@ -387,9 +316,9 @@ in the region to which it belongs. In interpreting the results of a classification tree, we are often interested not only in the class prediction corresponding to a particular terminal node region, but also in the class proportions among the training observations that -fall into that region. -

    +fall into that region. +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs017.html b/doc/pub/week45/html/._week45-bs017.html index 9514c9eef..436f8c0f9 100644 --- a/doc/pub/week45/html/._week45-bs017.html +++ b/doc/pub/week45/html/._week45-bs017.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Growing a classification tree

    -

    The task of growing a +

    Growing a classification tree

    + +

    +The task of growing a classification tree is quite similar to the task of growing a regression tree. Just as in the regression setting, we use recursive binary splitting to grow a classification tree. However, in the @@ -386,15 +315,15 @@ error rate. Since we plan to assign an observation in a given region to the most commonly occurring error rate class of training observations in that region, the classification error rate is simply the fraction of the training observations in that region that do not -belong to the most common class. -

    +belong to the most common class. -

    When building a classification tree, either the Gini index or the +

    +When building a classification tree, either the Gini index or the entropy are typically used to evaluate the quality of a particular split, since these two approaches are more sensitive to node purity -than is the classification error rate. -

    +than is the classification error rate. +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs018.html b/doc/pub/week45/html/._week45-bs018.html index 0b98928c8..dfb4b24d2 100644 --- a/doc/pub/week45/html/._week45-bs018.html +++ b/doc/pub/week45/html/._week45-bs018.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Classification tree, how to split nodes

    -

    If our targets are the outcome of a classification process that takes +

    Classification tree, how to split nodes

    + +

    +If our targets are the outcome of a classification process that takes for example \( k=1,2,\dots,K \) values, the only thing we need to think of is to set up the splitting criteria for each node. -

    -

    We define a PDF \( p_{mk} \) that represents the number of observations of +

    +We define a PDF \( p_{mk} \) that represents the number of observations of a class \( k \) in a region \( R_m \) with \( N_m \) observations. We represent this likelihood function in terms of the proportion \( I(y_i=k) \) of observations of this class in the region \( R_m \) as -

    $$ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i=k). +p_{mk} = \frac{1}{N_m}\sum_{i\in R_m}I(y_i=k). $$ -

    We let \( p_{mk} \) represent the majority class of observations in region +

    +We let \( p_{mk} \) represent the majority class of observations in region \( m \). The three most common ways of splitting a node are given by -

    + $$ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i\ne k) = 1-p_{mk}. +\frac{1}{N_m}\sum_{i\in R_m}I(y_i\ne k) = 1-p_{mk}. $$ + + $$ g = \sum_{k=1}^K p_{mk}(1-p_{mk}). $$ + + $$ s = -\sum_{k=1}^K p_{mk}\log{p_{mk}}. $$ - +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs019.html b/doc/pub/week45/html/._week45-bs019.html index 7dec16fcd..6bbd8b0e5 100644 --- a/doc/pub/week45/html/._week45-bs019.html +++ b/doc/pub/week45/html/._week45-bs019.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Visualizing the Tree, Classification

    + +

    Visualizing the Tree, Classification

    +

    -

    -
    -
    -
    -
    -
    import os
    +
    import os
     from sklearn.datasets import load_breast_cancer
     from sklearn.tree import DecisionTreeClassifier
     from sklearn.model_selection import train_test_split
    @@ -415,22 +339,8 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs020.html b/doc/pub/week45/html/._week45-bs020.html index 1183f109f..cb8da4f27 100644 --- a/doc/pub/week45/html/._week45-bs020.html +++ b/doc/pub/week45/html/._week45-bs020.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Visualizing the Tree, The Moons

    + +

    Visualizing the Tree, The Moons

    +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.tree import DecisionTreeClassifier
    @@ -406,22 +330,8 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs021.html b/doc/pub/week45/html/._week45-bs021.html index cd5d4cb96..0b60f1384 100644 --- a/doc/pub/week45/html/._week45-bs021.html +++ b/doc/pub/week45/html/._week45-bs021.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Other ways of visualizing the trees

    -

    Scikit-Learn has also another way to visualize the trees which is very useful, here with the Iris data.

    +

    Other ways of visualizing the trees

    +

    +Scikit-Learn has also another way to visualize the trees which is very useful, here with the Iris data. + +

    -

    -
    -
    -
    -
    -
    from sklearn.datasets import load_iris
    +
    from sklearn.datasets import load_iris
     from sklearn import tree
     X, y = load_iris(return_X_y=True)
     tree_clf = tree.DecisionTreeClassifier()
     tree_clf = tree_clf.fit(X, y)
     # and then plot the tree
     tree.plot_tree(tree_clf) 
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs022.html b/doc/pub/week45/html/._week45-bs022.html index f214fb51f..b88ed717c 100644 --- a/doc/pub/week45/html/._week45-bs022.html +++ b/doc/pub/week45/html/._week45-bs022.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Printing out as text

    -

    Alternatively, the tree can also be exported in textual format with the function exporttext. +

    Printing out as text

    + +

    +Alternatively, the tree can also be exported in textual format with the function exporttext. This method doesn’t require the installation of external libraries and is more compact: -

    +

    -

    -
    -
    -
    -
    -
    from sklearn.datasets import load_iris
    +
    from sklearn.datasets import load_iris
     from sklearn.tree import DecisionTreeClassifier
     from sklearn.tree import export_text
     iris = load_iris()
    @@ -395,22 +319,8 @@ decision_tree = DecisionTreeClassifier(rando
     decision_tree = decision_tree.fit(iris.data, iris.target)
     r = export_text(decision_tree, feature_names=iris['feature_names'])
     print(r)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs023.html b/doc/pub/week45/html/._week45-bs023.html index 3d7c0b193..db110f913 100644 --- a/doc/pub/week45/html/._week45-bs023.html +++ b/doc/pub/week45/html/._week45-bs023.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Algorithms for Setting up Decision Trees

    -

    Two algorithms stand out in the set up of decision trees:

    +

    Algorithms for Setting up Decision Trees

    + +

    +Two algorithms stand out in the set up of decision trees: +

    1. The CART (Classification And Regression Tree) algorithm for both classification and regression
    2. The ID3 algorithm based on the computation of the information gain for classification
    -

    We discuss both algorithms with applications here. The popular library + +We discuss both algorithms with applications here. The popular library Scikit-Learn uses the CART algorithm. For classification problems you can use either the gini index or the entropy to split a tree in two branches. -

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs024.html b/doc/pub/week45/html/._week45-bs024.html index adc4d2bc0..29fa4728b 100644 --- a/doc/pub/week45/html/._week45-bs024.html +++ b/doc/pub/week45/html/._week45-bs024.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    The CART algorithm for Classification

    -

    For classification, the CART algorithm splits the data set in two subsets using a single feature \( k \) and a threshold \( t_k \). +

    The CART algorithm for Classification

    + +

    +For classification, the CART algorithm splits the data set in two subsets using a single feature \( k \) and a threshold \( t_k \). This could be for example a threshold set by a number below a certain circumference of a malign tumor. -

    -

    How do we find these two quantities? +

    +How do we find these two quantities? We search for the pair \( (k,t_k) \) that produces the purest subset using for example the gini factor \( G \). The cost function it tries to minimize is then -

    $$ C(k,t_k) = \frac{m_{\mathrm{left}}}{m}G_{\mathrm{left}}+ \frac{m_{\mathrm{right}}}{m}G_{\mathrm{right}}, $$ -

    where \( G_{\mathrm{left/right}} \) measures the impurity of the left/right subset and \( m_{\mathrm{left/right}} \) +where \( G_{\mathrm{left/right}} \) measures the impurity of the left/right subset and \( m_{\mathrm{left/right}} \) is the number of instances in the left/right subset -

    -

    Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets +

    +Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the \( max\_depth \) hyperparameter), or if it cannot find a split that will reduce impurity. A few other hyperparameters control additional stopping conditions such as the \( min\_samples\_split \), \( min\_samples\_leaf \), \( min\_weight\_fraction\_leaf \), and \( max\_leaf\_nodes \). -

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs025.html b/doc/pub/week45/html/._week45-bs025.html index 7978c4bd0..754c9eaa5 100644 --- a/doc/pub/week45/html/._week45-bs025.html +++ b/doc/pub/week45/html/._week45-bs025.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    The CART algorithm for Regression

    -

    The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the +

    The CART algorithm for Regression

    + +

    +The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the training set in a way that minimizes say the gini or entropy impurity, it now tries to split the training set in a way that minimizes our well-known mean-squared error (MSE). The cost function is now -

    $$ C(k,t_k) = \frac{m_{\mathrm{left}}}{m}\mathrm{MSE}_{\mathrm{left}}+ \frac{m_{\mathrm{right}}}{m}\mathrm{MSE}_{\mathrm{right}}. $$ -

    Here the MSE for a specific node is defined as

    +Here the MSE for a specific node is defined as $$ \mathrm{MSE}_{\mathrm{node}}=\frac{1}{m_\mathrm{node}}\sum_{i\in \mathrm{node}}(\overline{y}_{\mathrm{node}}-y_i)^2, $$ -

    with

    +with $$ \overline{y}_{\mathrm{node}}=\frac{1}{m_\mathrm{node}}\sum_{i\in \mathrm{node}}y_i, $$ -

    the mean value of all observations in a specific node.

    +the mean value of all observations in a specific node. -

    Without any regularization, the regression task for decision trees, +

    +Without any regularization, the regression task for decision trees, just like for classification tasks, is prone to overfitting. -

    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs026.html b/doc/pub/week45/html/._week45-bs026.html index df025d454..0b6fba35e 100644 --- a/doc/pub/week45/html/._week45-bs026.html +++ b/doc/pub/week45/html/._week45-bs026.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Computing the Gini index

    -

    The example we will look at is a classical one in many Machine +

    Computing the Gini index

    + +

    +The example we will look at is a classical one in many Machine Learning applications. Based on various meteorological features, we have several so-called attributes which decide whether we at the end will do some outdoor activity like skiing, going for a bike ride etc @@ -386,12 +315,13 @@ etc. The table here contains the feautures outlook, temperature, attributes for each feature are then sunny, overcast and rain for the outlook, hot, cold and mild for temperature, high and normal for humidity and weak and strong for wind. -

    -

    The table here summarizes the various attributes and

    +

    +The table here summarizes the various attributes and +

    - +
    @@ -414,7 +344,7 @@ humidity and weak and strong for wind.
    Day Outlook Temperature Humidity Wind Ride
    - +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs027.html b/doc/pub/week45/html/._week45-bs027.html index 1f347bfc4..24950fc48 100644 --- a/doc/pub/week45/html/._week45-bs027.html +++ b/doc/pub/week45/html/._week45-bs027.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Simple Python Code to read in Data and perform Classification

    +

    Simple Python Code to read in Data and perform Classification

    + +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     import pandas as pd
     import matplotlib.pyplot as plt
    @@ -450,22 +374,8 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs028.html b/doc/pub/week45/html/._week45-bs028.html index e95274d58..671de813d 100644 --- a/doc/pub/week45/html/._week45-bs028.html +++ b/doc/pub/week45/html/._week45-bs028.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Computing the Gini Factor

    -

    The above functions (gini, entropy and misclassification error) are +

    Computing the Gini Factor

    + +

    +The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm below after we have discussed the information gain algorithm ID3. -

    -

    In the example here we have converted all our attributes into numerical values \( 0,1,2 \) etc.

    +

    +In the example here we have converted all our attributes into numerical values \( 0,1,2 \) etc. +

    -

    -
    -
    -
    -
    -
    # Split a dataset based on an attribute and an attribute value
    +
    # Split a dataset based on an attribute and an attribute value
     def test_split(index, value, dataset):
     	left, right = list(), list()
     	for row in dataset:
    @@ -451,22 +376,8 @@ dataset = [[0= get_split(dataset)
     print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs029.html b/doc/pub/week45/html/._week45-bs029.html index d43fc002a..074a07e1d 100644 --- a/doc/pub/week45/html/._week45-bs029.html +++ b/doc/pub/week45/html/._week45-bs029.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Entropy and the ID3 algorithm

    -

    The ID3 algorithm learns decision trees by constructing +

    Entropy and the ID3 algorithm

    + +

    +The ID3 algorithm learns decision trees by constructing them in a top down way, beginning with the question which attribute should be tested at the root of the tree? -

    1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.
    2. @@ -388,24 +316,26 @@ them in a top down way, beginning with the question which attribute should be
    3. The entire process is then repeated using the training examples associated with each descendant node to select the best attribute to test at that point in the tree.
    4. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices.
    -

    The ID3 algorithm selects which attribute to test at each node in the + +The ID3 algorithm selects which attribute to test at each node in the tree. -

    -

    We would like to select the attribute that is most useful for classifying +

    +We would like to select the attribute that is most useful for classifying examples. -

    -

    What is a good quantitative measure of the worth of an attribute?

    +

    +What is a good quantitative measure of the worth of an attribute? -

    Information gain measures how well a given attribute separates the +

    +Information gain measures how well a given attribute separates the training examples according to their target classification. -

    -

    The ID3 algorithm uses this information gain measure to select among the candidate +

    +The ID3 algorithm uses this information gain measure to select among the candidate attributes at each step while growing the tree. -

    +

      @@ -435,18 +365,25 @@ attributes at each step while growing the tree.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs030.html b/doc/pub/week45/html/._week45-bs030.html index b9e717ce5..f82c5146a 100644 --- a/doc/pub/week45/html/._week45-bs030.html +++ b/doc/pub/week45/html/._week45-bs030.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Cancer Data again now with Decision Trees and other Methods

    + +

    Cancer Data again now with Decision Trees and other Methods

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -423,22 +347,8 @@ svm.fit(X_train_scaled, y_train)
     # Decision Trees
     deep_tree_clf.fit(X_train_scaled, y_train)
     print("Test set accuracy with Decision Trees and scaled data: {:.2f}".format(deep_tree_clf.score(X_test_scaled,y_test)))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -468,18 +378,25 @@ deep_tree_clf.fit(X_train_scaled, y_train)
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs031.html b/doc/pub/week45/html/._week45-bs031.html index d2b9e2106..996acd39f 100644 --- a/doc/pub/week45/html/._week45-bs031.html +++ b/doc/pub/week45/html/._week45-bs031.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Another example, the moons again

    + +

    Another example, the moons again

    +

    -

    -
    -
    -
    -
    -
    from __future__ import division, print_function, unicode_literals
    +
    from __future__ import division, print_function, unicode_literals
     
     # Common imports
     import numpy as np
    @@ -446,22 +370,8 @@ plt.subplot(122
     plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
     plt.title("min_samples_leaf = {}".format(deep_tree_clf2.min_samples_leaf), fontsize=14)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -491,18 +401,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs032.html b/doc/pub/week45/html/._week45-bs032.html index 999571e8f..05f152103 100644 --- a/doc/pub/week45/html/._week45-bs032.html +++ b/doc/pub/week45/html/._week45-bs032.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Playing around with regions

    + +

    Playing around with regions

    +

    -

    -
    -
    -
    -
    -
    np.random.seed(6)
    +
    np.random.seed(6)
     Xs = np.random.rand(100, 2) - 0.5
     ys = (Xs[:, 0] > 0).astype(np.float32) * 2
     
    @@ -402,22 +326,8 @@ plt.subplot(122
     plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -447,18 +357,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs033.html b/doc/pub/week45/html/._week45-bs033.html index 2bb94767c..bf4160ed2 100644 --- a/doc/pub/week45/html/._week45-bs033.html +++ b/doc/pub/week45/html/._week45-bs033.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Regression trees

    + +

    Regression trees

    +

    -

    -
    -
    -
    -
    -
    # Quadratic training set + noise
    +
    # Quadratic training set + noise
     np.random.seed(42)
     m = 200
     X = np.random.rand(m, 1)
     y = 4 * (X - 0.5) ** 2
     y = y + np.random.randn(m, 1) / 10
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.tree import DecisionTreeRegressor
    +
    from sklearn.tree import DecisionTreeRegressor
     
     tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
     tree_reg.fit(X, y)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -456,18 +351,25 @@ tree_reg.fit(X, y)
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs034.html b/doc/pub/week45/html/._week45-bs034.html index ece8fcbfe..cd0c9566b 100644 --- a/doc/pub/week45/html/._week45-bs034.html +++ b/doc/pub/week45/html/._week45-bs034.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Final regressor code

    + +

    Final regressor code

    +

    -

    -
    -
    -
    -
    -
    from sklearn.tree import DecisionTreeRegressor
    +
    from sklearn.tree import DecisionTreeRegressor
     
     tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)
     tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)
    @@ -420,26 +344,11 @@ plt.text(0.3.title("max_depth=3", fontsize=14)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    tree_reg1 = DecisionTreeRegressor(random_state=42)
    +
    tree_reg1 = DecisionTreeRegressor(random_state=42)
     tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)
     tree_reg1.fit(X, y)
     tree_reg2.fit(X, y)
    @@ -467,22 +376,8 @@ plt.xlabel(&quo
     plt.title("min_samples_leaf={}".format(tree_reg2.min_samples_leaf), fontsize=14)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -512,18 +407,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs035.html b/doc/pub/week45/html/._week45-bs035.html index df438ea0f..14163942f 100644 --- a/doc/pub/week45/html/._week45-bs035.html +++ b/doc/pub/week45/html/._week45-bs035.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Pros and cons of trees, pros

    + +

    Pros and cons of trees, pros

    • White box, easy to interpret model. Some people believe that decision trees more closely mirror human decision-making than do the regression and classification approaches discussed earlier (think of support vector machines)
    • @@ -385,6 +313,7 @@ MathJax.Hub.Config({
    • Can model interactions between the different descriptive features
    • Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)
    +

      @@ -414,18 +343,25 @@ MathJax.Hub.Config({
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs036.html b/doc/pub/week45/html/._week45-bs036.html index f8d1cd9ef..b6ebe72c2 100644 --- a/doc/pub/week45/html/._week45-bs036.html +++ b/doc/pub/week45/html/._week45-bs036.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Disadvantages

    + +

    Disadvantages

    • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
    • @@ -385,11 +313,12 @@ MathJax.Hub.Config({
    • If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data
    • Features with many levels may be preferred over features with less levels since for them it is more easy to split the dataset such that the sub datasets only contain pure target feature values. This issue can be addressed by preferring for instance the information gain ratio as splitting criteria over information gain
    -

    However, by aggregating many decision trees, using methods like + +However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. -

    +

      @@ -419,18 +348,25 @@ trees can be substantially improved.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs037.html b/doc/pub/week45/html/._week45-bs037.html index 90cd45945..f781f35a6 100644 --- a/doc/pub/week45/html/._week45-bs037.html +++ b/doc/pub/week45/html/._week45-bs037.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods

    -

    As stated above and seen in many of the examples discussed here about +

    Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods

    + +

    +As stated above and seen in many of the examples discussed here about a single decision tree, we often end up overfitting our training data. This normally means that we have a high variance. Can we reduce the variance of a statistical learning method? -

    -

    This leads us to a set of different methods that can combine different +

    +This leads us to a set of different methods that can combine different machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are -

    1. Voting classifiers
    2. @@ -395,8 +323,10 @@ try to explain here. These are
    3. Random forests
    4. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)
    -

    We discuss these methods here.

    +We discuss these methods here. + +

      @@ -426,18 +356,25 @@ try to explain here. These are
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs038.html b/doc/pub/week45/html/._week45-bs038.html index 71333f1f8..8aaf74d8c 100644 --- a/doc/pub/week45/html/._week45-bs038.html +++ b/doc/pub/week45/html/._week45-bs038.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    An Overview of Ensemble Methods

    -

    -
    -

    -
    -

    +

    An Overview of Ensemble Methods

    +

    +



    + +

      @@ -411,18 +337,25 @@ MathJax.Hub.Config({
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs039.html b/doc/pub/week45/html/._week45-bs039.html index bc3c79b0e..d86b571b7 100644 --- a/doc/pub/week45/html/._week45-bs039.html +++ b/doc/pub/week45/html/._week45-bs039.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Bagging

    -

    The plain decision trees suffer from high +

    Bagging

    + +

    +The plain decision trees suffer from high variance. This means that if we split the training data into two parts at random, and fit a decision tree to both halves, the results that we get could be quite different. In contrast, a procedure with low variance will yield similar results if applied repeatedly to distinct data sets; linear regression tends to have low variance, if the ratio -of \( n \) to \( p \) is moderately large. -

    +of \( n \) to \( p \) is moderately large. -

    Bootstrap aggregation, or just bagging, is a +

    +Bootstrap aggregation, or just bagging, is a general-purpose procedure for reducing the variance of a statistical -learning method. -

    +learning method. +

      @@ -419,18 +348,25 @@ learning method.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs040.html b/doc/pub/week45/html/._week45-bs040.html index efa344e0f..c7ea74721 100644 --- a/doc/pub/week45/html/._week45-bs040.html +++ b/doc/pub/week45/html/._week45-bs040.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    More bagging

    -

    Bagging typically results in improved accuracy +

    More bagging

    + +

    +Bagging typically results in improved accuracy over prediction using a single tree. Unfortunately, however, it can be difficult to interpret the resulting model. Recall that one of the advantages of decision trees is the attractive and easily interpreted diagram that results. -

    -

    However, when we bag a large number of trees, it is no longer +

    +However, when we bag a large number of trees, it is no longer possible to represent the resulting statistical learning procedure using a single tree, and it is no longer clear which variables are most important to the procedure. Thus, bagging improves prediction @@ -398,8 +327,8 @@ trees. A large value indicates an important predictor. Similarly, in the context of bagging classification trees, we can add up the total amount that the Gini index is decreased by splits over a given predictor, averaged over all \( B \) trees. -

    +

      @@ -429,18 +358,25 @@ predictor, averaged over all \( B \) trees.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs041.html b/doc/pub/week45/html/._week45-bs041.html index d3ab059e4..090a57ede 100644 --- a/doc/pub/week45/html/._week45-bs041.html +++ b/doc/pub/week45/html/._week45-bs041.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Simple Voting Example, head or tail

    + +

    Simple Voting Example, head or tail

    +

    -

    -
    -
    -
    -
    -
    heads_proba = 0.51
    +
    heads_proba = 0.51
     coin_tosses = (np.random.rand(10000, 10) < heads_proba).astype(np.int32)
     cumulative_heads_ratio = np.cumsum(coin_tosses, axis=0) / np.arange(1, 10001).reshape(-1, 1)
     plt.figure(figsize=(8,3.5))
    @@ -395,22 +319,8 @@ plt.legend(loc=
     plt.axis([0, 10000, 0.42, 0.58])
     save_fig("votingsimple")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -440,18 +350,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs042.html b/doc/pub/week45/html/._week45-bs042.html index 2bec4ad6d..3b3b30afe 100644 --- a/doc/pub/week45/html/._week45-bs042.html +++ b/doc/pub/week45/html/._week45-bs042.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Using the Voting Classifier

    + +

    Using the Voting Classifier

    +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -425,22 +349,8 @@ voting_clf.fit(X_train, y_train)
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -470,18 +380,25 @@ voting_clf.fit(X_train, y_train)
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs043.html b/doc/pub/week45/html/._week45-bs043.html index 1b2892602..0dd01299d 100644 --- a/doc/pub/week45/html/._week45-bs043.html +++ b/doc/pub/week45/html/._week45-bs043.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Please, not the moons again! Voting and Bagging

    +

    Please, not the moons again! Voting and Bagging

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -401,51 +325,21 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='hard')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    log_clf = LogisticRegression(random_state=42)
    +
    log_clf = LogisticRegression(random_state=42)
     rnd_clf = RandomForestClassifier(random_state=42)
     svm_clf = SVC(probability=True, random_state=42)
     
    @@ -453,47 +347,18 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='soft')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -523,18 +388,25 @@ voting_clf.fit(X_train, y_train)
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs044.html b/doc/pub/week45/html/._week45-bs044.html index 28cdba414..3a09f2a78 100644 --- a/doc/pub/week45/html/._week45-bs044.html +++ b/doc/pub/week45/html/._week45-bs044.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Bagging Examples

    +

    Bagging Examples

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.ensemble import BaggingClassifier
    +
    from sklearn.ensemble import BaggingClassifier
     from sklearn.tree import DecisionTreeClassifier
     
     bag_clf = BaggingClassifier(
    @@ -391,70 +315,25 @@ bag_clf = BaggingClassifier(
         max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
     bag_clf.fit(X_train, y_train)
     y_pred = bag_clf.predict(X_test)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     print(accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    tree_clf = DecisionTreeClassifier(random_state=42)
    +
    tree_clf = DecisionTreeClassifier(random_state=42)
     tree_clf.fit(X_train, y_train)
     y_pred_tree = tree_clf.predict(X_test)
     print(accuracy_score(y_test, y_pred_tree))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from matplotlib.colors import ListedColormap
    +
    from matplotlib.colors import ListedColormap
     
     def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):
         x1s = np.linspace(axes[0], axes[1], 100)
    @@ -481,22 +360,8 @@ plot_decision_boundary(bag_clf, X, y)
     plt.title("Decision Trees with Bagging", fontsize=14)
     save_fig("baggingtree")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -526,18 +391,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs045.html b/doc/pub/week45/html/._week45-bs045.html index 1f3d09484..69129fbba 100644 --- a/doc/pub/week45/html/._week45-bs045.html +++ b/doc/pub/week45/html/._week45-bs045.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Making your own Bootstrap: Changing the Level of the Decision Tree

    -

    Let us bring up our good old boostrap example from the linear regression lectures. We change the linerar regression algorithm with +

    Making your own Bootstrap: Changing the Level of the Decision Tree

    + +

    +Let us bring up our good old boostrap example from the linear regression lectures. We change the linerar regression algorithm with a decision tree wth different depths and perform a bootstrap aggregate (in this case we perform as many bootstraps as data points \( n \)). -

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.pipeline import make_pipeline
    @@ -443,22 +367,8 @@ plt.plot(polydegree, variance, label.legend()
     save_fig("baggingboot")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -488,18 +398,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs046.html b/doc/pub/week45/html/._week45-bs046.html index f13436891..a8d98ce44 100644 --- a/doc/pub/week45/html/._week45-bs046.html +++ b/doc/pub/week45/html/._week45-bs046.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Why Voting?

    -

    The idea behind boosting, and voting as well can be phrased as follows: +

    Why Voting?

    + +

    +The idea behind boosting, and voting as well can be phrased as follows: Can a group of people somehow arrive at highly reasoned decisions, despite the weak judgement of the individual members? -

    -

    The aim is to create a good classifier by combining several weak classifiers. +

    +The aim is to create a good classifier by combining several weak classifiers. A weak classifier is a classifier which is able to produce results that are only slightly better than guessing at random. -

    -

    The basic approach is to apply repeatedly (in boosting this is done in an iterative way) a weak classifier to modifications of the data. +

    +The basic approach is to apply repeatedly (in boosting this is done in an iterative way) a weak classifier to modifications of the data. In voting we simply apply the law of large numbers while in boosting we give more weight to misclassified data in -each iteration. -

    +each iteration. -

    Decision trees play an important role as our weak classifier. They serve as the basic method.

    +

    +Decision trees play an important role as our weak classifier. They serve as the basic method. +

      @@ -422,18 +352,25 @@ each iteration.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs047.html b/doc/pub/week45/html/._week45-bs047.html index 7e32b6a7e..e83bd310f 100644 --- a/doc/pub/week45/html/._week45-bs047.html +++ b/doc/pub/week45/html/._week45-bs047.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Tossing coins

    -

    The simplest case is a so-called voting ensemble. To illustrate this, +

    Tossing coins

    + +

    +The simplest case is a so-called voting ensemble. To illustrate this, think of yourself tossing coins with a biased outcome of 51 per cent for heads and 49% for tails. With only few tosses, you may not clearly see this distribution for heads and tails. However, after some thousands of tosses, there will be a clear majority of heads. With 2000 tosses you should see approximately 1020 heads and 980 tails. -

    -

    We can then state that the outcome is a clear majority of heads. If +

    +We can then state that the outcome is a clear majority of heads. If you do this ten thousand times, it is easy to see that there is a 97% likelihood of a majority of heads. -

    -

    Another example would be to collect all polls before an +

    +Another example would be to collect all polls before an election. Different polls may show different likelihoods for a candidate winning with say a majority of the popular vote. The majority vote would then consist in many polls indicating that this candidate will actually win. -

    -

    The example here shows how we can implement the coin tossing case, +

    +The example here shows how we can implement the coin tossing case, clealry demostrating that after some tosses we see the law of large numbers kicking in. -

    +

      @@ -430,18 +359,25 @@ numbers kicking in.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs048.html b/doc/pub/week45/html/._week45-bs048.html index e01e0e507..7d0a40156 100644 --- a/doc/pub/week45/html/._week45-bs048.html +++ b/doc/pub/week45/html/._week45-bs048.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Standard imports first

    +

    Standard imports first

    + +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     from IPython.display import Image 
     from pydot import graph_from_dot_data
     import pandas as pd
    @@ -420,22 +344,8 @@ DATA_ID = "
     
     def save_fig(fig_id):
         plt.savefig(image_path(fig_id) + ".png", format='png')
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -465,18 +375,25 @@ DATA_ID = "
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs049.html b/doc/pub/week45/html/._week45-bs049.html index 9464541e2..4093a2585 100644 --- a/doc/pub/week45/html/._week45-bs049.html +++ b/doc/pub/week45/html/._week45-bs049.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Simple Voting Example, head or tail

    + +

    Simple Voting Example, head or tail

    +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     import matplotlib
     import matplotlib.pyplot as plt
    @@ -404,22 +328,8 @@ plt.legend(loc=
     plt.axis([0, 10000, 0.42, 0.58])
     save_fig("votingsimple")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -449,18 +359,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs050.html b/doc/pub/week45/html/._week45-bs050.html index 82e2ae1be..33ca8c7e1 100644 --- a/doc/pub/week45/html/._week45-bs050.html +++ b/doc/pub/week45/html/._week45-bs050.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Using the Voting Classifier

    -

    We can use the voting classifier on other data sets, here the exciting binary case of two distinct objects using the make moons functionality of Scikit-Learn.

    +

    Using the Voting Classifier

    + +

    +We can use the voting classifier on other data sets, here the exciting binary case of two distinct objects using the make moons functionality of Scikit-Learn. +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -426,22 +351,8 @@ voting_clf.fit(X_train, y_train)
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -471,18 +382,25 @@ voting_clf.fit(X_train, y_train)
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs051.html b/doc/pub/week45/html/._week45-bs051.html index b9e4c076b..cf61d060e 100644 --- a/doc/pub/week45/html/._week45-bs051.html +++ b/doc/pub/week45/html/._week45-bs051.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Voting and Bagging

    +

    Voting and Bagging

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -401,51 +325,21 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='hard')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    log_clf = LogisticRegression(random_state=42)
    +
    log_clf = LogisticRegression(random_state=42)
     rnd_clf = RandomForestClassifier(random_state=42)
     svm_clf = SVC(probability=True, random_state=42)
     
    @@ -453,47 +347,18 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='soft')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -523,18 +388,25 @@ voting_clf.fit(X_train, y_train)
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs052.html b/doc/pub/week45/html/._week45-bs052.html index 62dfad659..7b6e3911d 100644 --- a/doc/pub/week45/html/._week45-bs052.html +++ b/doc/pub/week45/html/._week45-bs052.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Random forests

    -

    Random forests provide an improvement over bagged trees by way of a -small tweak that decorrelates the trees. -

    +

    Random forests

    -

    As in bagging, we build a +

    +Random forests provide an improvement over bagged trees by way of a +small tweak that decorrelates the trees. + +

    +As in bagging, we build a number of decision trees on bootstrapped training samples. But when building these decision trees, each time a split in a tree is considered, a random sample of \( m \) predictors is chosen as split candidates from the full set of \( p \) predictors. The split is allowed to -use only one of those \( m \) predictors. -

    +use only one of those \( m \) predictors. -

    A fresh sample of \( m \) predictors is +

    +A fresh sample of \( m \) predictors is taken at each split, and typically we choose -

    $$ m\approx \sqrt{p}. $$ -

    In building a random forest, at +

    +In building a random forest, at each split in the tree, the algorithm is not even allowed to consider -a majority of the available predictors. -

    +a majority of the available predictors. -

    The reason for this is rather clever. Suppose that there is one very +

    +The reason for this is rather clever. Suppose that there is one very strong predictor in the data set, along with a number of other moderately strong predictors. Then in the collection of bagged variable importance random forest trees, most or all of the trees will @@ -413,8 +342,8 @@ lead to as large of a reduction in variance as averaging many uncorrelated quantities. In particular, this means that bagging will not lead to a substantial reduction in variance over a single tree in this setting. -

    +

      @@ -444,18 +373,25 @@ this setting.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs053.html b/doc/pub/week45/html/._week45-bs053.html index ba119cc67..f70977691 100644 --- a/doc/pub/week45/html/._week45-bs053.html +++ b/doc/pub/week45/html/._week45-bs053.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Random Forest Algorithm

    -

    The algorithm described here can be applied to both classification and regression problems.

    -

    We will grow of forest of say \( B \) trees.

    +

    Random Forest Algorithm

    +The algorithm described here can be applied to both classification and regression problems. + +

    +We will grow of forest of say \( B \) trees. +

    1. For \( b=1:B \)
    2. +
      • Draw a bootstrap sample from the training data organized in our \( \boldsymbol{X} \) matrix.
      • We grow then a random forest tree \( T_b \) based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached
      • +
        1. we select \( m \le p \) variables at random from the \( p \) predictors/features
        2. pick the best split point among the \( m \) features using for example the CART algorithm and create a new node
        3. split the node into daughter nodes
        +
      +
    3. Output then the ensemble of trees \( \{T_b\}_1^{B} \) and make predictions for either a regression type of problem or a classification type of problem.
    +

      @@ -420,18 +355,25 @@ MathJax.Hub.Config({
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs054.html b/doc/pub/week45/html/._week45-bs054.html index 496cf2537..1b5dba499 100644 --- a/doc/pub/week45/html/._week45-bs054.html +++ b/doc/pub/week45/html/._week45-bs054.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Random Forests Compared with other Methods on the Cancer Data

    + +

    Random Forests Compared with other Methods on the Cancer Data

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -448,31 +372,18 @@ skplt.metrics.<
     plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -

    Recall that the cumulative gains curve shows the percentage of the +

    +

    +Recall that the cumulative gains curve shows the percentage of the overall number of cases in a given category gained by targeting a percentage of the total number of cases. -

    -

    Similarly, the receiver operating characteristic curve, or ROC curve, +

    +Similarly, the receiver operating characteristic curve, or ROC curve, displays the diagnostic ability of a binary classifier system as its discrimination threshold is varied. It plots the true positive rate against the false positive rate. -

    +

      @@ -502,18 +413,25 @@ discrimination threshold is varied. It plots the true positive rate against the
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs055.html b/doc/pub/week45/html/._week45-bs055.html index 2ec95e02b..918ba2c9e 100644 --- a/doc/pub/week45/html/._week45-bs055.html +++ b/doc/pub/week45/html/._week45-bs055.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Compare Bagging on Trees with Random Forests

    + +

    Compare Bagging on Trees with Random Forests

    +

    -

    -
    -
    -
    -
    -
    bag_clf = BaggingClassifier(
    +
    bag_clf = BaggingClassifier(
         DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
         n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    bag_clf.fit(X_train, y_train)
    +
    bag_clf.fit(X_train, y_train)
     y_pred = bag_clf.predict(X_test)
     from sklearn.ensemble import RandomForestClassifier
     rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
     rnd_clf.fit(X_train, y_train)
     y_pred_rf = rnd_clf.predict(X_test)
     np.sum(y_pred == y_pred_rf) / len(y_pred) 
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -456,18 +351,25 @@ np.sum(y_pred =
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs056.html b/doc/pub/week45/html/._week45-bs056.html index eba024d51..2fdf49cb5 100644 --- a/doc/pub/week45/html/._week45-bs056.html +++ b/doc/pub/week45/html/._week45-bs056.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + +
    +
    +

     

     

     

    + -

    Boosting, a Bird's Eye View

    -

    The basic idea is to combine weak classifiers in order to create a good +

    Boosting, a Bird's Eye View

    + +

    +The basic idea is to combine weak classifiers in order to create a good classifier. With a weak classifier we often intend a classifier which produces results which are only slightly better than we would get by random guesses. -

    -

    This is done by applying in an iterative way a weak (or a standard +

    +This is done by applying in an iterative way a weak (or a standard classifier like decision trees) to modify the data. In each iteration we emphasize those observations which are misclassified by weighting them with a factor. -

    +

      @@ -417,18 +346,25 @@ them with a factor.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs057.html b/doc/pub/week45/html/._week45-bs057.html index d0ae95147..18e8e3eb3 100644 --- a/doc/pub/week45/html/._week45-bs057.html +++ b/doc/pub/week45/html/._week45-bs057.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    What is boosting? Additive Modelling/Iterative Fitting

    -

    Boosting is a way of fitting an additive expansion in a set of +

    What is boosting? Additive Modelling/Iterative Fitting

    + +

    +Boosting is a way of fitting an additive expansion in a set of elementary basis functions like for example some simple polynomials. Assume for example that we have a function -

    $$ f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m), $$ -

    where \( \beta_m \) are the expansion parameters to be determined in a +

    +where \( \beta_m \) are the expansion parameters to be determined in a minimization process and \( b(x;\gamma_m) \) are some simple functions of the multivariable parameter \( x \) which is characterized by the parameters \( \gamma_m \). -

    -

    As an example, consider the Sigmoid function we used in logistic +

    +As an example, consider the Sigmoid function we used in logistic regression. In that case, we can translate the function \( b(x;\gamma_m) \) into the Sigmoid function -

    $$ \sigma(t) = \frac{1}{1+\exp{(-t)}}, $$ -

    where \( t=\gamma_0+\gamma_1 x \) and the parameters \( \gamma_0 \) and +

    +where \( t=\gamma_0+\gamma_1 x \) and the parameters \( \gamma_0 \) and \( \gamma_1 \) were determined by the Logistic Regression fitting algorithm. -

    -

    As another example, consider the cost function we defined for linear regression

    +

    +As another example, consider the cost function we defined for linear regression $$ C(\boldsymbol{y},\boldsymbol{f}) = \frac{1}{n} \sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    In this case the function \( f(x) \) was replaced by the design matrix +

    +In this case the function \( f(x) \) was replaced by the design matrix \( \boldsymbol{X} \) and the unknown linear regression parameters \( \boldsymbol{\beta} \), that is \( \boldsymbol{f}=\boldsymbol{X}\boldsymbol{\beta} \). In linear regression we can simply invert a matrix and obtain the parameters \( \beta \) by -

    $$ \boldsymbol{\beta}=\left(\boldsymbol{X}^T\boldsymbol{X}\right)^{-1}\boldsymbol{X}^T\boldsymbol{y}. $$ -

    In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters \( \beta_m \) and \( \gamma_m \).

    +

    +In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters \( \beta_m \) and \( \gamma_m \). +

      @@ -450,18 +381,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs058.html b/doc/pub/week45/html/._week45-bs058.html index 10b102b13..f4a2c7baa 100644 --- a/doc/pub/week45/html/._week45-bs058.html +++ b/doc/pub/week45/html/._week45-bs058.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Iterative Fitting, Regression and Squared-error Cost Function

    -

    The way we proceed is as follows (here we specialize to the squared-error cost function)

    +

    Iterative Fitting, Regression and Squared-error Cost Function

    + +

    +The way we proceed is as follows (here we specialize to the squared-error cost function)

    1. Establish a cost function, here \( {\cal C}(\boldsymbol{y},\boldsymbol{f}) = \frac{1}{n} \sum_{i=0}^{n-1}(y_i-f_M(x_i))^2 \) with \( f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m) \).
    2. Initialize with a guess \( f_0(x) \). It could be one or even zero or some random numbers.
    3. For \( m=1:M \) +
      1. minimize \( \sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta b(x;\gamma))^2 \) wrt \( \gamma \) and \( \beta \)
      2. This gives the optimal values \( \beta_m \) and \( \gamma_m \)
      3. Determine then the new values \( f_m(x)=f_{m-1}(x) +\beta_m b(x;\gamma_m) \)
      +
    -

    We could use any of the algorithms we have discussed till now. If we + +We could use any of the algorithms we have discussed till now. If we use trees, \( \gamma \) parameterizes the split variables and split points at the internal nodes, and the predictions at the terminal nodes. -

    +

      @@ -422,18 +354,25 @@ at the internal nodes, and the predictions at the terminal nodes.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs059.html b/doc/pub/week45/html/._week45-bs059.html index fb7b629d4..f8176c72e 100644 --- a/doc/pub/week45/html/._week45-bs059.html +++ b/doc/pub/week45/html/._week45-bs059.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Squared-Error Example and Iterative Fitting

    -

    To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function.

    +

    Squared-Error Example and Iterative Fitting

    -

    For simplicity we assume also that our functions \( b(x;\gamma)=1+\gamma x \).

    +

    +To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function. -

    This means that for every iteration \( m \), we need to optimize

    +

    +For simplicity we assume also that our functions \( b(x;\gamma)=1+\gamma x \). + +

    +This means that for every iteration \( m \), we need to optimize $$ (\beta_m,\gamma_m) = \mathrm{argmin}_{\beta,\lambda}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta b(x;\gamma))^2=\sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta(1+\gamma x_i))^2. $$ -

    We start our iteration by simply setting \( f_0(x)=0 \). +

    +We start our iteration by simply setting \( f_0(x)=0 \). Taking the derivatives with respect to \( \beta \) and \( \gamma \) we obtain -

    $$ \frac{\partial {\cal C}}{\partial \beta} = -2\sum_{i}(1+\gamma x_i)(y_i-\beta(1+\gamma x_i))=0, $$ -

    and

    +and $$ \frac{\partial {\cal C}}{\partial \gamma} =-2\sum_{i}\beta x_i(y_i-\beta(1+\gamma x_i))=0. $$ -

    We can then rewrite these equations as (defining \( \boldsymbol{w}=\boldsymbol{e}+\gamma \boldsymbol{x}) \) with \( \boldsymbol{e} \) being the unit vector)

    +We can then rewrite these equations as (defining \( \boldsymbol{w}=\boldsymbol{e}+\gamma \boldsymbol{x}) \) with \( \boldsymbol{e} \) being the unit vector) $$ \gamma \boldsymbol{w}^T(\boldsymbol{y}-\beta\gamma \boldsymbol{w})=0, $$ -

    which gives us \( \beta = \boldsymbol{w}^T\boldsymbol{y}/(\boldsymbol{w}^T\boldsymbol{w}) \). Similarly we have

    +which gives us \( \beta = \boldsymbol{w}^T\boldsymbol{y}/(\boldsymbol{w}^T\boldsymbol{w}) \). Similarly we have $$ \beta\gamma \boldsymbol{x}^T(\boldsymbol{y}-\beta(1+\gamma \boldsymbol{x}))=0, $$ -

    which leads to \( \gamma =(\boldsymbol{x}^T\boldsymbol{y}-\beta\boldsymbol{x}^T\boldsymbol{e})/(\beta\boldsymbol{x}^T\boldsymbol{x}) \). Inserting -for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equation in the unknown \( \gamma \) and has to be solved numerically. -

    +

    +which leads to \( \gamma =(\boldsymbol{x}^T\boldsymbol{y}-\beta\boldsymbol{x}^T\boldsymbol{e})/(\beta\boldsymbol{x}^T\boldsymbol{x}) \). Inserting +for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equation in the unknown \( \gamma \) and has to be solved numerically. -

    The solution to these two equations gives us in turn \( \beta_1 \) and \( \gamma_1 \) leading to the new expression for \( f_1(x) \) as -\( f_1(x) = \beta_1(1+\gamma_1x) \). Doing this \( M \) times results in our final estimate for the function \( f \). -

    +

    +The solution to these two equations gives us in turn \( \beta_1 \) and \( \gamma_1 \) leading to the new expression for \( f_1(x) \) as +\( f_1(x) = \beta_1(1+\gamma_1x) \). Doing this \( M \) times results in our final estimate for the function \( f \). +

      @@ -445,18 +377,25 @@ for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equa
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs060.html b/doc/pub/week45/html/._week45-bs060.html index 50b3550ab..39d5384b5 100644 --- a/doc/pub/week45/html/._week45-bs060.html +++ b/doc/pub/week45/html/._week45-bs060.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Iterative Fitting, Classification and AdaBoost

    -

    Let us consider a binary classification problem with two outcomes \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of +

    Iterative Fitting, Classification and AdaBoost

    + +

    +Let us consider a binary classification problem with two outcomes \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of observations. We define a classification function \( G(x) \) which produces a prediction taking one or the other of the two values \( \{-1,1\} \). -

    -

    The error rate of the training sample is then

    +

    +The error rate of the training sample is then $$ \mathrm{\overline{err}}=\frac{1}{n} \sum_{i=0}^{n-1} I(y_i\ne G(x_i)). $$ -

    The iterative procedure starts with defining a weak classifier whose +

    +The iterative procedure starts with defining a weak classifier whose error rate is barely better than random guessing. The iterative procedure in boosting is to sequentially apply a weak classification algorithm to repeatedly modified versions of the data producing a sequence of weak classifiers \( G_m(x) \). -

    -

    Here we will express our function \( f(x) \) in terms of \( G(x) \). That is

    +

    +Here we will express our function \( f(x) \) in terms of \( G(x) \). That is $$ f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m), $$ -

    will be a function of

    +will be a function of $$ G_M(x) = \mathrm{sign} \sum_{i=1}^M \alpha_m G_m(x). $$ - +

      @@ -434,18 +364,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs061.html b/doc/pub/week45/html/._week45-bs061.html index 3705fe1a4..bc363142c 100644 --- a/doc/pub/week45/html/._week45-bs061.html +++ b/doc/pub/week45/html/._week45-bs061.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Adaptive Boosting, AdaBoost

    -

    In our iterative procedure we define thus

    +

    Adaptive Boosting, AdaBoost

    + +

    +In our iterative procedure we define thus $$ f_m(x) = f_{m-1}(x)+\beta_mG_m(x). $$ -

    The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the +

    +The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the exponential cost/loss function defined as -

    $$ C(\boldsymbol{y},\boldsymbol{f}) = \sum_{i=0}^{n-1}\exp{(-y_i(f_{m-1}(x_i)+\beta G(x_i))}. $$ -

    We optimize \( \beta \) and \( G \) for each value of \( m=1:M \) as we did in the regression case. +

    +We optimize \( \beta \) and \( G \) for each value of \( m=1:M \) as we did in the regression case. This is normally done in two steps. Let us however first rewrite the cost function as -

    $$ C(\boldsymbol{y},\boldsymbol{f}) = \sum_{i=0}^{n-1}w_i^{m}\exp{(-y_i\beta G(x_i))}, $$ -

    where we have defined \( w_i^m= \exp{(-y_if_{m-1}(x_i))} \).

    +where we have defined \( w_i^m= \exp{(-y_if_{m-1}(x_i))} \). +

      @@ -427,18 +357,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs062.html b/doc/pub/week45/html/._week45-bs062.html index 3418fa8c8..273c1d877 100644 --- a/doc/pub/week45/html/._week45-bs062.html +++ b/doc/pub/week45/html/._week45-bs062.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Building up AdaBoost

    -

    First, for any \( \beta > 0 \), we optimize \( G \) by setting

    +

    Building up AdaBoost

    + +

    +First, for any \( \beta > 0 \), we optimize \( G \) by setting $$ G_m(x) = \mathrm{sign} \sum_{i=0}^{n-1} w_i^m I(y_i \ne G_(x_i)), $$ -

    which is the classifier that minimizes the weighted error rate in predicting \( y \).

    +which is the classifier that minimizes the weighted error rate in predicting \( y \). -

    We can do this by rewriting

    +

    +We can do this by rewriting $$ \exp{-(\beta)}\sum_{y_i=G(x_i)}w_i^m+\exp{(\beta)}\sum_{y_i\ne G(x_i)}w_i^m, $$ -

    which can be rewritten as

    +which can be rewritten as $$ (\exp{(\beta)}-\exp{-(\beta)})\sum_{i=0}^{n-1}w_i^mI(y_i\ne G(x_i))+\exp{(-\beta)}\sum_{i=0}^{n-1}w_i^m=0, $$ -

    which leads to

    +which leads to $$ \beta_m = \frac{1}{2}\log{\frac{1-\mathrm{\overline{err}}}{\mathrm{\overline{err}}}}, $$ -

    where we have redefined the error as

    +where we have redefined the error as $$ \mathrm{\overline{err}}_m=\frac{1}{n}\frac{\sum_{i=0}^{n-1}w_i^mI(y_i\ne G(x_i)}{\sum_{i=0}^{n-1}w_i^m}, $$ -

    which leads to an update of

    +which leads to an update of $$ f_m(x) = f_{m-1}(x) +\beta_m G_m(x). $$ -

    This leads to the new weights

    +This leads to the new weights $$ w_i^{m+1} = w_i^m \exp{(-y_i\beta_m G_m(x_i))} $$ - +

      @@ -443,18 +373,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs063.html b/doc/pub/week45/html/._week45-bs063.html index cadeaee11..3f17d3c07 100644 --- a/doc/pub/week45/html/._week45-bs063.html +++ b/doc/pub/week45/html/._week45-bs063.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Adaptive boosting: AdaBoost, Basic Algorithm

    -

    The algorithm here is rather straightforward. Assume that our weak +

    Adaptive boosting: AdaBoost, Basic Algorithm

    + +

    +The algorithm here is rather straightforward. Assume that our weak classifier is a decision tree and we consider a binary set of outputs with \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of observations. Our design matrix is given in terms of the feature/predictor vectors \( \boldsymbol{X}=[\boldsymbol{x}_0\boldsymbol{x}_1\dots\boldsymbol{x}_{p-1}] \). Finally, we define also a -classifier determined by our data via a function \( G(x) \). This function tells us how well we are able to classify our outputs/targets \( \boldsymbol{y} \). -

    +classifier determined by our data via a function \( G(x) \). This function tells us how well we are able to classify our outputs/targets \( \boldsymbol{y} \). -

    We have already defined the misclassification error \( \mathrm{err} \) as

    +

    +We have already defined the misclassification error \( \mathrm{err} \) as $$ \mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(x_i)), $$ -

    where the function \( I() \) is one if we misclassify and zero if we classify correctly.

    +where the function \( I() \) is one if we misclassify and zero if we classify correctly. +

      @@ -421,18 +351,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs064.html b/doc/pub/week45/html/._week45-bs064.html index b2e2bd3e4..45170c3ae 100644 --- a/doc/pub/week45/html/._week45-bs064.html +++ b/doc/pub/week45/html/._week45-bs064.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Basic Steps of AdaBoost

    -

    With the above definitions we are now ready to set up the algorithm for AdaBoost. +

    Basic Steps of AdaBoost

    + +

    +With the above definitions we are now ready to set up the algorithm for AdaBoost. The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases. -

    +
    1. We start by initializing all weights to \( w_i = 1/n \), with \( i=0,1,2,\dots n-1 \). It is easy to see that we must have \( \sum_{i=0}^{n-1}w_i = 1 \).
    2. We rewrite the misclassification error as
    + $$ \mathrm{\overline{err}}_m=\frac{\sum_{i=0}^{n-1}w_i^m I(y_i\ne G(x_i))}{\sum_{i=0}^{n-1}w_i}, $$ +
    1. Then we start looping over all attempts at classifying, namely we start an iterative process for \( m=1:M \), where \( M \) is the final number of classifications. Our given classifier could for example be a plain decision tree. +
      1. Fit then a given classifier to the training set using the weights \( w_i \).
      2. Compute then \( \mathrm{err} \) and figure out which events are classified properly and which are classified wrongly.
      3. Define a quantity \( \alpha_{m} = \log{(1-\mathrm{\overline{err}}_m)/\mathrm{\overline{err}}_m} \)
      4. Set the new weights to \( w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(x_i)} \).
      +
    2. Compute the new classifier \( G(x)= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(x_i) \).
    -

    For the iterations with \( m \le 2 \) the weights are modified + +For the iterations with \( m \le 2 \) the weights are modified individually at each steps. The observations which were misclassified at iteration \( m-1 \) have a weight which is larger than those which were classified properly. As this proceeds, the observations which were difficult to classifiy correctly are given a larger influence. Each new classification step \( m \) is then forced to concentrate on those observations that are missed in the previous iterations. -

    +

      @@ -435,18 +369,25 @@ observations that are missed in the previous iterations.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs065.html b/doc/pub/week45/html/._week45-bs065.html index 573b2ead2..c800e1816 100644 --- a/doc/pub/week45/html/._week45-bs065.html +++ b/doc/pub/week45/html/._week45-bs065.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    AdaBoost Examples

    -

    Using Scikit-Learn it is easy to apply the adaptive boosting algorithm, as done here.

    +

    AdaBoost Examples

    +

    +Using Scikit-Learn it is easy to apply the adaptive boosting algorithm, as done here. + +

    -

    -
    -
    -
    -
    -
    from sklearn.ensemble import AdaBoostClassifier
    +
    from sklearn.ensemble import AdaBoostClassifier
     
     ada_clf = AdaBoostClassifier(
         DecisionTreeClassifier(max_depth=1), n_estimators=200,
    @@ -406,22 +331,8 @@ skplt.metrics.<
     plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -449,18 +360,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs066.html b/doc/pub/week45/html/._week45-bs066.html index 2128826a2..c31c9fc2a 100644 --- a/doc/pub/week45/html/._week45-bs066.html +++ b/doc/pub/week45/html/._week45-bs066.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent

    -

    Gradient boosting is again a similar technique to Adaptive boosting, +

    Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent

    + +

    +Gradient boosting is again a similar technique to Adaptive boosting, it combines so-called weak classifiers or regressors into a strong method via a series of iterations. -

    -

    In order to understand the method, let us illustrate its basics by +

    +In order to understand the method, let us illustrate its basics by bringing back the essential steps in linear regression, where our cost function was the least squares function. -

    +

      @@ -412,18 +341,25 @@ function was the least squares function.
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs067.html b/doc/pub/week45/html/._week45-bs067.html index 291a11266..c687af957 100644 --- a/doc/pub/week45/html/._week45-bs067.html +++ b/doc/pub/week45/html/._week45-bs067.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    The Squared-Error again! Steepest Descent

    -

    We start again with our cost function \( {\cal C}(\boldsymbol{y}m\boldsymbol{f})=\sum_{i=0}^{n-1}{\cal L}(y_i, f(x_i)) \) where we want to minimize +

    The Squared-Error again! Steepest Descent

    + +

    +We start again with our cost function \( {\cal C}(\boldsymbol{y}m\boldsymbol{f})=\sum_{i=0}^{n-1}{\cal L}(y_i, f(x_i)) \) where we want to minimize This means that for every iteration, we need to optimize -

    $$ (\hat{\boldsymbol{f}}) = \mathrm{argmin}_{\boldsymbol{f}}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    We define a real function \( h_m(x) \) that defines our final function \( f_M(x) \) as

    +

    +We define a real function \( h_m(x) \) that defines our final function \( f_M(x) \) as $$ f_M(x) = \sum_{m=0}^M h_m(x). $$ -

    In the steepest decent approach we approximate \( h_m(x) = -\rho_m g_m(x) \), where \( \rho_m \) is a scalar and \( g_m(x) \) the gradient defined as

    +

    +In the steepest decent approach we approximate \( h_m(x) = -\rho_m g_m(x) \), where \( \rho_m \) is a scalar and \( g_m(x) \) the gradient defined as $$ g_m(x_i) = \left[ \frac{\partial {\cal L}(y_i, f(x_i))}{\partial f(x_i)}\right]_{f(x_i)=f_{m-1}(x_i)}. $$ -

    With the new gradient we can update \( f_m(x) = f_{m-1}(x) -\rho_m g_m(x) \). Using the above squared-error function we see that +

    +With the new gradient we can update \( f_m(x) = f_{m-1}(x) -\rho_m g_m(x) \). Using the above squared-error function we see that the gradient is \( g_m(x_i) = -2(y_i-f(x_i)) \). -

    -

    Choosing \( f_0(x)=0 \) we obtain \( g_m(x) = -2y_i \) and inserting this into the minimization problem for the cost function we have

    +

    +Choosing \( f_0(x)=0 \) we obtain \( g_m(x) = -2y_i \) and inserting this into the minimization problem for the cost function we have $$ (\rho_1) = \mathrm{argmin}_{\rho}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i+2\rho y_i)^2. $$ - +

      @@ -429,18 +360,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs068.html b/doc/pub/week45/html/._week45-bs068.html index c865ab7bc..17f97bab8 100644 --- a/doc/pub/week45/html/._week45-bs068.html +++ b/doc/pub/week45/html/._week45-bs068.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Steepest Descent Example

    -

    Optimizing with respect to \( \rho \) we obtain (taking the derivative) that \( \rho_1 = -1/2 \). We have then that

    +

    Steepest Descent Example

    + +

    +Optimizing with respect to \( \rho \) we obtain (taking the derivative) that \( \rho_1 = -1/2 \). We have then that $$ f_1(x) = f_{0}(x) -\rho_1 g_1(x)=-y_i. $$ -

    We can then proceed and compute

    +We can then proceed and compute $$ g_2(x_i) = \left[ \frac{\partial {\cal L}(y_i, f(x_i))}{\partial f(x_i)}\right]_{f(x_i)=f_{1}(x_i)=y_i}=-4y_i, $$ -

    and find a new value for \( \rho_2=-1/2 \) and continue till we have reached \( m=M \). We can modify the steepest descent method, or steepest boosting, by introducing what is called gradient boosting.

    +and find a new value for \( \rho_2=-1/2 \) and continue till we have reached \( m=M \). We can modify the steepest descent method, or steepest boosting, by introducing what is called gradient boosting. +

      @@ -412,18 +342,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs069.html b/doc/pub/week45/html/._week45-bs069.html index 15fb71827..8400fb878 100644 --- a/doc/pub/week45/html/._week45-bs069.html +++ b/doc/pub/week45/html/._week45-bs069.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Gradient Boosting, algorithm

    -

    Steepest descent is however not much used, since it only optimizes \( f \) at a fixed set of \( n \) points, +

    Gradient Boosting, algorithm

    + +

    +Steepest descent is however not much used, since it only optimizes \( f \) at a fixed set of \( n \) points, so we do not learn a function that can generalize. However, we can modify the algorithm by -fitting a weak learner to approximate the negative gradient signal. -

    +fitting a weak learner to approximate the negative gradient signal. -

    Suppose we have a cost function \( C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i)) \) where \( y_i \) is our target and \( f(x_i) \) the function which is meant to model \( y_i \). The above cost function could be our standard squared-error function

    +

    +Suppose we have a cost function \( C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i)) \) where \( y_i \) is our target and \( f(x_i) \) the function which is meant to model \( y_i \). The above cost function could be our standard squared-error function $$ C(\boldsymbol{y},\boldsymbol{f})=\sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    The way we proceed in an iterative fashion is to

    +

    +The way we proceed in an iterative fashion is to +

    1. Initialize our estimate \( f_0(x) \).
    2. For \( m=1:M \), we +
      1. compute the negative gradient vector \( \boldsymbol{u}_m = -\partial C(\boldsymbol{y},\boldsymbol{f})/\partial \boldsymbol{f}(x) \) at \( f(x) = f_{m-1}(x) \);
      2. fit the so-called base-learner to the negative gradient \( h_m(u_m,x) \);
      3. update the estimate \( f_m(x) = f_{m-1}(x)+h_m(u_m,x) \);
      +
    3. The final estimate is then \( f_M(x) = \sum_{m=1}^M h_m(u_m,x) \).
    +

      @@ -420,18 +354,25 @@ $$
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs070.html b/doc/pub/week45/html/._week45-bs070.html index abc749067..7bbac6dcf 100644 --- a/doc/pub/week45/html/._week45-bs070.html +++ b/doc/pub/week45/html/._week45-bs070.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Gradient Boosting, Examples of Regression

    + +

    Gradient Boosting, Examples of Regression

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.ensemble import GradientBoostingRegressor
    @@ -428,22 +352,8 @@ plt.plot(polydegree, variance, label.legend()
     save_fig("gdregression")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -466,18 +376,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs071.html b/doc/pub/week45/html/._week45-bs071.html index 458bd8a3d..b64ddb47c 100644 --- a/doc/pub/week45/html/._week45-bs071.html +++ b/doc/pub/week45/html/._week45-bs071.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Gradient Boosting, Classification Example

    + +

    Gradient Boosting, Classification Example

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -422,22 +346,8 @@ plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     save_fig("gdclassiffiercgain")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -459,18 +369,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs072.html b/doc/pub/week45/html/._week45-bs072.html index 9391c31d7..f71902e30 100644 --- a/doc/pub/week45/html/._week45-bs072.html +++ b/doc/pub/week45/html/._week45-bs072.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    XGBoost: Extreme Gradient Boosting

    -

    XGBoost or Extreme Gradient +

    XGBoost: Extreme Gradient Boosting

    + +

    +XGBoost or Extreme Gradient Boosting, is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable. It implements machine learning algorithms under the Gradient Boosting framework. XGBoost provides a parallel tree boosting that solve many data science problems in a fast and accurate way. See the article by Chen and Guestrin. -

    -

    The authors design and build a highly scalable end-to-end tree +

    +The authors design and build a highly scalable end-to-end tree boosting system. It has a theoretically justified weighted quantile sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning. -

    -

    It is now the algorithm which wins essentially all ML competitions!!!

    +

    +It is now the algorithm which wins essentially all ML competitions!!! +

      @@ -411,18 +341,25 @@ sketch for efficient proposal calculation. It introduces a novel sparsity-aware
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs073.html b/doc/pub/week45/html/._week45-bs073.html index 62cca6362..d7ab7b52f 100644 --- a/doc/pub/week45/html/._week45-bs073.html +++ b/doc/pub/week45/html/._week45-bs073.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Regression Case

    +

    Regression Case

    + +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     import xgboost as xgb
    @@ -429,22 +353,8 @@ plt.plot(polydegree, bias, label.plot(polydegree, variance, label='Variance')
     plt.legend()
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +

      @@ -464,18 +374,25 @@ plt.show()
    • »
    +
    + + +
    + + + diff --git a/doc/pub/week45/html/._week45-bs074.html b/doc/pub/week45/html/._week45-bs074.html index faa7cffbb..ffc16d1d9 100644 --- a/doc/pub/week45/html/._week45-bs074.html +++ b/doc/pub/week45/html/._week45-bs074.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -

    Xgboost on the Cancer Data

    -

    As you will see from the confusion matrix below, XGBoots does an excellent job on the Wisconsin cancer data and outperforms essentially all agorithms we have discussed till now.

    +

    Xgboost on the Cancer Data

    + +

    +As you will see from the confusion matrix below, XGBoots does an excellent job on the Wisconsin cancer data and outperforms essentially all agorithms we have discussed till now. +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -435,21 +360,8 @@ xgb.plot_importance(xg_clf)
     plt.rcParams['figure.figsize'] = [5, 5]
     save_fig("xgparams")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - +
    +

    @@ -468,18 +380,25 @@ plt.show()

  • 75
  • +
    + + +
    + + + diff --git a/doc/pub/week45/html/week45-bs.html b/doc/pub/week45/html/week45-bs.html index 9b208d6d2..e6071ed7c 100644 --- a/doc/pub/week45/html/week45-bs.html +++ b/doc/pub/week45/html/week45-bs.html @@ -1,28 +1,31 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + - + + + @@ -274,6 +195,8 @@ MathJax.Hub.Config({ + + +
    +

     

     

     

    + -
    -
    -

    Week 45: Decisions Trees, Random Forests, Bagging and Boosting

    -
    + + +
    +

    Week 45: Decisions Trees, Random Forests, Bagging and Boosting

    + +

    +

    Morten Hjorth-Jensen [1, 2]
    - -
    -[1] Department of Physics, University of Oslo -
    -
    -[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University -
    -
    -
    -

    Nov 9, 2021

    -
    -
    +

    + + +

    [1] Department of Physics, University of Oslo
    +
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
    +
    +

    +

    Nov 10, 2021

    +
    +

    Read »

    @@ -421,18 +349,25 @@ MathJax.Hub.Config({
  • »
  • +
    + + +
    © 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
    + + + diff --git a/doc/pub/week45/html/week45-reveal.html b/doc/pub/week45/html/week45-reveal.html index ef385e828..3f12eb200 100644 --- a/doc/pub/week45/html/week45-reveal.html +++ b/doc/pub/week45/html/week45-reveal.html @@ -1,18 +1,19 @@ - - - + - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting - + + + + + + + @@ -54,81 +55,36 @@ document.getElementsByTagName( 'head' )[0].appendChild( link ); + + + @@ -301,122 +215,144 @@ MathJax.Hub.Config({ - -
    -

    Week 45: Decisions Trees, Random Forests, Bagging and Boosting

    -
    + + + + + +

    Week 45: Decisions Trees, Random Forests, Bagging and Boosting

    + +

    +

    Morten Hjorth-Jensen [1, 2]
    - -
    -[1] Department of Physics, University of Oslo -
    -
    -[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University -
    -
    -
    -

    Nov 9, 2021

    -
    -
    +

    + + +

    [1] Department of Physics, University of Oslo
    +
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
    +
    +

    +

    Nov 10, 2021

    +
    +











    -

    Overview of week 45

    + +

    Overview of week 45

    • Thursday: Basics of Decision Trees, Bagging and Voting
    • Friday: More on Bagging, Voting, Random Forests and start Boosting
    + -
    -Reading

    +

    +Reading. +

    +

    1. Decision Trees: Geron's chapter 6 covers decision trees while ensemble models, voting and bagging are discussed in chapter 7. See also lecture from STK-IN4300, lecture 7. Chapter 9.2 of Hastie et al contains also a good discussion.
    +











    -

    Decision trees, overarching aims

    -

    We start here with the most basic algorithm, the so-called decision +

    Decision trees, overarching aims

    + +

    +We start here with the most basic algorithm, the so-called decision tree. With this basic algorithm we can in turn build more complex networks, spanning from homogeneous and heterogenous forests (bagging, random forests and more) to one of the most popular supervised algorithms nowadays, the extreme gradient boosting, or just XGBoost. But let us start with the simplest possible ingredient. -

    -

    Decision trees are supervised learning algorithms used for both, +

    +Decision trees are supervised learning algorithms used for both, classification and regression tasks. -

    -

    The main idea of decision trees +

    +The main idea of decision trees is to find those descriptive features which contain the most information regarding the target feature and then split the dataset along the values of these features such that the target feature values for the resulting underlying datasets are as pure as possible. -

    -

    The descriptive features which reproduce best the target/output features are normally said +

    +The descriptive features which reproduce best the target/output features are normally said to be the most informative ones. The process of finding the most informative feature is done until we accomplish a stopping criteria -where we then finally end up in so called leaf nodes. -

    +where we then finally end up in so called leaf nodes. +











    -

    Basics of a tree

    -

    A decision tree is typically divided into a root node, the interior nodes, +

    Basics of a tree

    + +

    +A decision tree is typically divided into a root node, the interior nodes, and the final leaf nodes or just leaves. These entities are then connected by so-called branches. -

    -

    The leaf nodes +

    +The leaf nodes contain the predictions we will make for new query instances presented to our trained model. This is possible since the model has learned the underlying structure of the training data and hence can, given some assumptions, make predictions about the target feature value (class) of unseen query instances. -

    +











    -

    A Sketch of a Tree, Regression problem

    +

    A Sketch of a Tree, Regression problem

    + +

    +











    -

    A Sketch of a Tree, Classification problem

    +

    A Sketch of a Tree, Classification problem

    + +

    +











    -

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    -

    -
    -

    -
    -

    +

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    -

    This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using Scikit-Learn's decision tree classifier. Here we have used the so-called gini index (see below) to split the various branches.

    +

    +



    +

    +This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using Scikit-Learn's decision tree classifier. Here we have used the so-called gini index (see below) to split the various branches. + +











    -

    General Features

    -

    The overarching approach to decision trees is a top-down approach.

    +

    General Features

    + +

    +The overarching approach to decision trees is a top-down approach.

    • A leaf provides the classification of a given instance.
    • @@ -424,16 +360,18 @@ given some assumptions, make predictions about the target feature value
    • A branch corresponds to a possible values of an attribute.
    • An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.
    -

    This process is then repeated for the subtree rooted at the new + +This process is then repeated for the subtree rooted at the new node. -

    +











    -

    How do we set it up?

    -

    In simplified terms, the process of training a decision tree and +

    How do we set it up?

    + +

    +In simplified terms, the process of training a decision tree and predicting the target features of query instances is as follows: -

    1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature
    2. @@ -441,18 +379,17 @@ predicting the target features of query instances is as follows:
    3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the predictions we want to make for new query instances
    4. Show query instances to the tree and run down the tree until we arrive at leaf nodes
    -

    Then we are essentially done!

    +Then we are essentially done! + +











    -

    Decision trees and Regression

    + +

    Decision trees and Regression

    +

    -

    -
    -
    -
    -
    -
    import numpy as np
    +
    import numpy as np
     import matplotlib.pyplot as plt
     from sklearn.preprocessing import PolynomialFeatures
     from sklearn.linear_model import LinearRegression
    @@ -490,7 +427,7 @@ c=lin_reg.intercept_
     print ("first power: ", b[0])
     print ("second power: ",b[1])
     
    -z = np.arange(0, steps, .01)
    +z = np.arange(0, steps, .01)
     z_mod=b[1]*z**2+b[0]*z+c
     
     fit_mod=b[1]*X**2+b[0]*X+c
    @@ -540,102 +477,96 @@ plt.ylabel("Darget")
     plt.title("Decision Tree Regression")
     plt.legend()
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Building a tree, regression

    -

    There are mainly two steps

    +

    Building a tree, regression

    + +

    +There are mainly two steps +

    1. We split the predictor space (the set of possible values \( x_1,x_2,\dots, x_p \)) into \( J \) distinct and non-non-overlapping regions, \( R_1,R_2,\dots,R_J \).
    2. For every observation that falls into the region \( R_j \) , we make the same prediction, which is simply the mean of the response values for the training observations in \( R_j \).
    -

    How do we construct the regions \( R_1,\dots,R_J \)? In theory, the + +How do we construct the regions \( R_1,\dots,R_J \)? In theory, the regions could have any shape. However, we choose to divide the predictor space into high-dimensional rectangles, or boxes, for simplicity and for ease of interpretation of the resulting predictive model. The goal is to find boxes \( R_1,\dots,R_J \) that minimize the MSE, given by -

    $$ \sum_{j=1}^J\sum_{i\in R_j}(y_i-\overline{y}_{R_j})^2, $$ -

    where \( \overline{y}_{R_j} \) is the mean response for the training observations -within box \( j \). -

    +

    +where \( \overline{y}_{R_j} \) is the mean response for the training observations +within box \( j \). +











    -

    A top-down approach, recursive binary splitting

    -

    Unfortunately, it is computationally infeasible to consider every +

    A top-down approach, recursive binary splitting

    + +

    +Unfortunately, it is computationally infeasible to consider every possible partition of the feature space into \( J \) boxes. The common strategy is to take a top-down approach -

    -

    The approach is top-down because it begins at the top of the tree (all +

    +The approach is top-down because it begins at the top of the tree (all observations belong to a single region) and then successively splits the predictor space; each split is indicated via two new branches further down on the tree. It is greedy because at each step of the tree-building process, the best split is made at that particular step, rather than looking ahead and picking a split that will lead to a better tree in some future step. -

    +











    -

    Making a tree

    -

    In order to implement the recursive binary splitting we start by selecting +

    Making a tree

    + +

    +In order to implement the recursive binary splitting we start by selecting the predictor \( x_j \) and a cutpoint \( s \) that splits the predictor space into two regions \( R_1 \) and \( R_2 \) -

    $$ \left\{X\vert x_j < s\right\}, $$ -

    and

    +and $$ \left\{X\vert x_j \geq s\right\}, $$ -

    so that we obtain the lowest MSE, that is

    +so that we obtain the lowest MSE, that is $$ \sum_{i:x_i\in R_j}(y_i-\overline{y}_{R_1})^2+\sum_{i:x_i\in R_2}(y_i-\overline{y}_{R_2})^2, $$ -

    which we want to minimize by considering all predictors +

    +which we want to minimize by considering all predictors \( x_1,x_2,\dots,x_p \). We consider also all possible values of \( s \) for each predictor. These values could be determined by randomly assigned numbers or by starting at the midpoint and then proceed till we find an optimal value. -

    -

    For any \( j \) and \( s \), we define the pair of half-planes where +

    +For any \( j \) and \( s \), we define the pair of half-planes where \( \overline{y}_{R_1} \) is the mean response for the training observations in \( R_1(j,s) \), and \( \overline{y}_{R_2} \) is the mean response for the training observations in \( R_2(j,s) \). -

    -

    Finding the values of \( j \) and \( s \) that minimize the above equation can be +

    +Finding the values of \( j \) and \( s \) that minimize the above equation can be done quite quickly, especially when the number of features \( p \) is not too large. -

    -

    Next, we repeat the process, looking +

    +Next, we repeat the process, looking for the best predictor and best cutpoint in order to split the data further so as to minimize the MSE within each of the resulting regions. However, this time, instead of splitting the entire predictor @@ -644,83 +575,95 @@ have three regions. Again, we look to split one of these three regions further, so as to minimize the MSE. The process continues until a stopping criterion is reached; for instance, we may continue until no region contains more than five observations. -

    +

    -

    Pruning the tree

    -

    The above procedure is rather straightforward, but leads often to +

    Pruning the tree

    + +

    +The above procedure is rather straightforward, but leads often to overfitting and unnecessarily large and complicated trees. The basic idea is to grow a large tree \( T_0 \) and then prune it back in order to obtain a subtree. A smaller tree with fewer splits (fewer regions) can lead to smaller variance and better interpretation at the cost of a little more bias. -

    -

    The so-called Cost complexity pruning algorithm gives us a +

    +The so-called Cost complexity pruning algorithm gives us a way to do just this. Rather than considering every possible subtree, we consider a sequence of trees indexed by a nonnegative tuning parameter \( \alpha \). -

    -

    Read more at the following Scikit-Learn link on pruning.

    +

    +Read more at the following Scikit-Learn link on pruning. +











    -

    Cost complexity pruning

    -

    For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that

    +

    Cost complexity pruning

    + +

    +For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that $$ \sum_{m=1}^{\overline{T}}\sum_{i:x_i\in R_m}(y_i-\overline{y}_{R_m})^2+\alpha\overline{T}, $$ -

    is as small as possible. Here \( \overline{T} \) is +is as small as possible. Here \( \overline{T} \) is the number of terminal nodes of the tree \( T \) , \( R_m \) is the rectangle (i.e. the subset of predictor space) corresponding to the \( m \)-th terminal node. -

    -

    The tuning parameter \( \alpha \) controls a trade-off between the subtree’s +

    +The tuning parameter \( \alpha \) controls a trade-off between the subtree’s complexity and its fit to the training data. When \( \alpha = 0 \), then the subtree \( T \) will simply equal \( T_0 \), because then the above equation just measures the training error. However, as \( \alpha \) increases, there is a price to pay for having a tree with many terminal nodes. The above equation will -tend to be minimized for a smaller subtree. -

    +tend to be minimized for a smaller subtree. -

    It turns out that as we increase \( \alpha \) from zero +

    +It turns out that as we increase \( \alpha \) from zero branches get pruned from the tree in a nested and predictable fashion, so obtaining the whole sequence of subtrees as a function of \( \alpha \) is easy. We can select a value of \( \alpha \) using a validation set or using cross-validation. We then return to the full data set and obtain the -subtree corresponding to \( \alpha \). -

    +subtree corresponding to \( \alpha \). +











    -

    Schematic Regression Procedure

    +

    Schematic Regression Procedure

    + +

    -Building a Regression Tree +Building a Regression Tree.

    1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.
    2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of \( \alpha \).
    3. Use for example \( K \)-fold cross-validation to choose \( \alpha \). Divide the training observations into \( K \) folds. For each \( k=1,2,\dots,K \) we:
    4. +
      • repeat steps 1 and 2 on all but the \( k \)-th fold of the training data.
      • Then we valuate the mean squared prediction error on the data in the left-out \( k \)-th fold, as a function of \( \alpha \).
      • Finally we average the results for each value of \( \alpha \), and pick \( \alpha \) to minimize the average error.
      +
    5. Return the subtree from Step 2 that corresponds to the chosen value of \( \alpha \).
    +











    -

    A Classification Tree

    -

    A classification tree is very similar to a regression tree, except +

    A Classification Tree

    + +

    +A classification tree is very similar to a regression tree, except that it is used to predict a qualitative response rather than a quantitative one. Recall that for a regression tree, the predicted response for an observation is given by the mean response of the @@ -731,13 +674,15 @@ in the region to which it belongs. In interpreting the results of a classification tree, we are often interested not only in the class prediction corresponding to a particular terminal node region, but also in the class proportions among the training observations that -fall into that region. -

    +fall into that region. +











    -

    Growing a classification tree

    -

    The task of growing a +

    Growing a classification tree

    + +

    +The task of growing a classification tree is quite similar to the task of growing a regression tree. Just as in the regression setting, we use recursive binary splitting to grow a classification tree. However, in the @@ -747,69 +692,72 @@ error rate. Since we plan to assign an observation in a given region to the most commonly occurring error rate class of training observations in that region, the classification error rate is simply the fraction of the training observations in that region that do not -belong to the most common class. -

    +belong to the most common class. -

    When building a classification tree, either the Gini index or the +

    +When building a classification tree, either the Gini index or the entropy are typically used to evaluate the quality of a particular split, since these two approaches are more sensitive to node purity -than is the classification error rate. -

    +than is the classification error rate. +











    -

    Classification tree, how to split nodes

    -

    If our targets are the outcome of a classification process that takes +

    Classification tree, how to split nodes

    + +

    +If our targets are the outcome of a classification process that takes for example \( k=1,2,\dots,K \) values, the only thing we need to think of is to set up the splitting criteria for each node. -

    -

    We define a PDF \( p_{mk} \) that represents the number of observations of +

    +We define a PDF \( p_{mk} \) that represents the number of observations of a class \( k \) in a region \( R_m \) with \( N_m \) observations. We represent this likelihood function in terms of the proportion \( I(y_i=k) \) of observations of this class in the region \( R_m \) as -

    $$ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i=k). +p_{mk} = \frac{1}{N_m}\sum_{i\in R_m}I(y_i=k). $$ -

    We let \( p_{mk} \) represent the majority class of observations in region +

    +We let \( p_{mk} \) represent the majority class of observations in region \( m \). The three most common ways of splitting a node are given by -

    • Misclassification error
    + $$ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i\ne k) = 1-p_{mk}. +\frac{1}{N_m}\sum_{i\in R_m}I(y_i\ne k) = 1-p_{mk}. $$ +
    • Gini index \( g \)
    + $$ g = \sum_{k=1}^K p_{mk}(1-p_{mk}). $$ +
    • Information entropy or just entropy \( s \)
    + $$ s = -\sum_{k=1}^K p_{mk}\log{p_{mk}}. $$ - +











    -

    Visualizing the Tree, Classification

    + +

    Visualizing the Tree, Classification

    +

    -

    -
    -
    -
    -
    -
    import os
    +
    import os
     from sklearn.datasets import load_breast_cancer
     from sklearn.tree import DecisionTreeClassifier
     from sklearn.model_selection import train_test_split
    @@ -842,32 +790,15 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Visualizing the Tree, The Moons

    + +

    Visualizing the Tree, The Moons

    +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.tree import DecisionTreeClassifier
    @@ -891,72 +822,39 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Other ways of visualizing the trees

    -

    Scikit-Learn has also another way to visualize the trees which is very useful, here with the Iris data.

    +

    Other ways of visualizing the trees

    +

    +Scikit-Learn has also another way to visualize the trees which is very useful, here with the Iris data. + +

    -

    -
    -
    -
    -
    -
    from sklearn.datasets import load_iris
    +
    from sklearn.datasets import load_iris
     from sklearn import tree
     X, y = load_iris(return_X_y=True)
     tree_clf = tree.DecisionTreeClassifier()
     tree_clf = tree_clf.fit(X, y)
     # and then plot the tree
     tree.plot_tree(tree_clf) 
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Printing out as text

    -

    Alternatively, the tree can also be exported in textual format with the function exporttext. +

    Printing out as text

    + +

    +Alternatively, the tree can also be exported in textual format with the function exporttext. This method doesn’t require the installation of external libraries and is more compact: -

    +

    -

    -
    -
    -
    -
    -
    from sklearn.datasets import load_iris
    +
    from sklearn.datasets import load_iris
     from sklearn.tree import DecisionTreeClassifier
     from sklearn.tree import export_text
     iris = load_iris()
    @@ -964,92 +862,87 @@ decision_tree = DecisionTreeClassifier(random_state='feature_names'])
     print(r)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Algorithms for Setting up Decision Trees

    -

    Two algorithms stand out in the set up of decision trees:

    +

    Algorithms for Setting up Decision Trees

    + +

    +Two algorithms stand out in the set up of decision trees: +

    1. The CART (Classification And Regression Tree) algorithm for both classification and regression
    2. The ID3 algorithm based on the computation of the information gain for classification
    -

    We discuss both algorithms with applications here. The popular library + +We discuss both algorithms with applications here. The popular library Scikit-Learn uses the CART algorithm. For classification problems you can use either the gini index or the entropy to split a tree in two branches. -

    +











    -

    The CART algorithm for Classification

    -

    For classification, the CART algorithm splits the data set in two subsets using a single feature \( k \) and a threshold \( t_k \). +

    The CART algorithm for Classification

    + +

    +For classification, the CART algorithm splits the data set in two subsets using a single feature \( k \) and a threshold \( t_k \). This could be for example a threshold set by a number below a certain circumference of a malign tumor. -

    -

    How do we find these two quantities? +

    +How do we find these two quantities? We search for the pair \( (k,t_k) \) that produces the purest subset using for example the gini factor \( G \). The cost function it tries to minimize is then -

    $$ C(k,t_k) = \frac{m_{\mathrm{left}}}{m}G_{\mathrm{left}}+ \frac{m_{\mathrm{right}}}{m}G_{\mathrm{right}}, $$ -

    where \( G_{\mathrm{left/right}} \) measures the impurity of the left/right subset and \( m_{\mathrm{left/right}} \) +where \( G_{\mathrm{left/right}} \) measures the impurity of the left/right subset and \( m_{\mathrm{left/right}} \) is the number of instances in the left/right subset -

    -

    Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets +

    +Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the \( max\_depth \) hyperparameter), or if it cannot find a split that will reduce impurity. A few other hyperparameters control additional stopping conditions such as the \( min\_samples\_split \), \( min\_samples\_leaf \), \( min\_weight\_fraction\_leaf \), and \( max\_leaf\_nodes \). -

    +











    -

    The CART algorithm for Regression

    -

    The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the +

    The CART algorithm for Regression

    + +

    +The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the training set in a way that minimizes say the gini or entropy impurity, it now tries to split the training set in a way that minimizes our well-known mean-squared error (MSE). The cost function is now -

    $$ C(k,t_k) = \frac{m_{\mathrm{left}}}{m}\mathrm{MSE}_{\mathrm{left}}+ \frac{m_{\mathrm{right}}}{m}\mathrm{MSE}_{\mathrm{right}}. $$ -

    Here the MSE for a specific node is defined as

    +Here the MSE for a specific node is defined as $$ \mathrm{MSE}_{\mathrm{node}}=\frac{1}{m_\mathrm{node}}\sum_{i\in \mathrm{node}}(\overline{y}_{\mathrm{node}}-y_i)^2, $$ -

    with

    +with $$ \overline{y}_{\mathrm{node}}=\frac{1}{m_\mathrm{node}}\sum_{i\in \mathrm{node}}y_i, $$ -

    the mean value of all observations in a specific node.

    +the mean value of all observations in a specific node. -

    Without any regularization, the regression task for decision trees, +

    +Without any regularization, the regression task for decision trees, just like for classification tasks, is prone to overfitting. -

    +











    -

    Computing the Gini index

    -

    The example we will look at is a classical one in many Machine +

    Computing the Gini index

    + +

    +The example we will look at is a classical one in many Machine Learning applications. Based on various meteorological features, we have several so-called attributes which decide whether we at the end will do some outdoor activity like skiing, going for a bike ride etc @@ -1059,10 +952,10 @@ etc. The table here contains the feautures outlook, temperature, attributes for each feature are then sunny, overcast and rain for the outlook, hot, cold and mild for temperature, high and normal for humidity and weak and strong for wind. -

    -

    The table here summarizes the various attributes and

    - +

    +The table here summarizes the various attributes and +

    @@ -1083,18 +976,15 @@ humidity and weak and strong for wind.
    Day Outlook Temperature Humidity Wind Ride
    14 Rain Mild High Strong 0
    - +











    -

    Simple Python Code to read in Data and perform Classification

    +

    Simple Python Code to read in Data and perform Classification

    + +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     import pandas as pd
     import matplotlib.pyplot as plt
    @@ -1161,41 +1051,25 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Computing the Gini Factor

    -

    The above functions (gini, entropy and misclassification error) are +

    Computing the Gini Factor

    + +

    +The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm below after we have discussed the information gain algorithm ID3. -

    -

    In the example here we have converted all our attributes into numerical values \( 0,1,2 \) etc.

    +

    +In the example here we have converted all our attributes into numerical values \( 0,1,2 \) etc. +

    -

    -
    -
    -
    -
    -
    # Split a dataset based on an attribute and an attribute value
    +
    # Split a dataset based on an attribute and an attribute value
     def test_split(index, value, dataset):
     	left, right = list(), list()
     	for row in dataset:
    @@ -1255,28 +1129,15 @@ dataset = [[0,0
     
     split = get_split(dataset)
     print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Entropy and the ID3 algorithm

    -

    The ID3 algorithm learns decision trees by constructing +

    Entropy and the ID3 algorithm

    + +

    +The ID3 algorithm learns decision trees by constructing them in a top down way, beginning with the question which attribute should be tested at the root of the tree? -

    1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.
    2. @@ -1286,34 +1147,33 @@ them in a top down way, beginning with the question which attribute should be
    3. The entire process is then repeated using the training examples associated with each descendant node to select the best attribute to test at that point in the tree.
    4. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices.
    -

    The ID3 algorithm selects which attribute to test at each node in the + +The ID3 algorithm selects which attribute to test at each node in the tree. -

    -

    We would like to select the attribute that is most useful for classifying +

    +We would like to select the attribute that is most useful for classifying examples. -

    -

    What is a good quantitative measure of the worth of an attribute?

    +

    +What is a good quantitative measure of the worth of an attribute? -

    Information gain measures how well a given attribute separates the +

    +Information gain measures how well a given attribute separates the training examples according to their target classification. -

    -

    The ID3 algorithm uses this information gain measure to select among the candidate +

    +The ID3 algorithm uses this information gain measure to select among the candidate attributes at each step while growing the tree. -

    +











    -

    Cancer Data again now with Decision Trees and other Methods

    + +

    Cancer Data again now with Decision Trees and other Methods

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -1354,32 +1214,15 @@ svm.fit(X_train_scaled, y_train)
     # Decision Trees
     deep_tree_clf.fit(X_train_scaled, y_train)
     print("Test set accuracy with Decision Trees and scaled data: {:.2f}".format(deep_tree_clf.score(X_test_scaled,y_test)))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Another example, the moons again

    + +

    Another example, the moons again

    +

    -

    -
    -
    -
    -
    -
    from __future__ import division, print_function, unicode_literals
    +
    from __future__ import division, print_function, unicode_literals
     
     # Common imports
     import numpy as np
    @@ -1443,32 +1286,15 @@ plt.subplot(122)
     plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
     plt.title("min_samples_leaf = {}".format(deep_tree_clf2.min_samples_leaf), fontsize=14)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Playing around with regions

    + +

    Playing around with regions

    +

    -

    -
    -
    -
    -
    -
    np.random.seed(6)
    +
    np.random.seed(6)
     Xs = np.random.rand(100, 2) - 0.5
     ys = (Xs[:, 0] > 0).astype(np.float32) * 2
     
    @@ -1488,86 +1314,37 @@ plt.subplot(122)
     plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Regression trees

    + +

    Regression trees

    +

    -

    -
    -
    -
    -
    -
    # Quadratic training set + noise
    +
    # Quadratic training set + noise
     np.random.seed(42)
     m = 200
     X = np.random.rand(m, 1)
     y = 4 * (X - 0.5) ** 2
     y = y + np.random.randn(m, 1) / 10
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.tree import DecisionTreeRegressor
    +
    from sklearn.tree import DecisionTreeRegressor
     
     tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
     tree_reg.fit(X, y)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Final regressor code

    + +

    Final regressor code

    +

    -

    -
    -
    -
    -
    -
    from sklearn.tree import DecisionTreeRegressor
    +
    from sklearn.tree import DecisionTreeRegressor
     
     tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)
     tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)
    @@ -1605,26 +1382,11 @@ plt.text(0.3, 0
     plt.title("max_depth=3", fontsize=14)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    tree_reg1 = DecisionTreeRegressor(random_state=42)
    +
    tree_reg1 = DecisionTreeRegressor(random_state=42)
     tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)
     tree_reg1.fit(X, y)
     tree_reg2.fit(X, y)
    @@ -1652,24 +1414,11 @@ plt.xlabel("$x_1$", fontsize="min_samples_leaf={}".format(tree_reg2.min_samples_leaf), fontsize=14)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Pros and cons of trees, pros

    + +

    Pros and cons of trees, pros

    • White box, easy to interpret model. Some people believe that decision trees more closely mirror human decision-making than do the regression and classification approaches discussed earlier (think of support vector machines)
    • @@ -1680,8 +1429,10 @@ plt.show()
    • Can model interactions between the different descriptive features
    • Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)
    +









    -

    Disadvantages

    + +

    Disadvantages

    • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
    • @@ -1692,26 +1443,28 @@ plt.show()
    • If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data
    • Features with many levels may be preferred over features with less levels since for them it is more easy to split the dataset such that the sub datasets only contain pure target feature values. This issue can be addressed by preferring for instance the information gain ratio as splitting criteria over information gain
    -

    However, by aggregating many decision trees, using methods like + +However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. -

    +











    -

    Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods

    -

    As stated above and seen in many of the examples discussed here about +

    Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods

    + +

    +As stated above and seen in many of the examples discussed here about a single decision tree, we often end up overfitting our training data. This normally means that we have a high variance. Can we reduce the variance of a statistical learning method? -

    -

    This leads us to a set of different methods that can combine different +

    +This leads us to a set of different methods that can combine different machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are -

    1. Voting classifiers
    2. @@ -1719,45 +1472,50 @@ try to explain here. These are
    3. Random forests
    4. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)
    -

    We discuss these methods here.

    +We discuss these methods here. + +











    -

    An Overview of Ensemble Methods

    -

    -
    -

    -
    -

    +

    An Overview of Ensemble Methods

    +

    +



    + +











    -

    Bagging

    -

    The plain decision trees suffer from high +

    Bagging

    + +

    +The plain decision trees suffer from high variance. This means that if we split the training data into two parts at random, and fit a decision tree to both halves, the results that we get could be quite different. In contrast, a procedure with low variance will yield similar results if applied repeatedly to distinct data sets; linear regression tends to have low variance, if the ratio -of \( n \) to \( p \) is moderately large. -

    +of \( n \) to \( p \) is moderately large. -

    Bootstrap aggregation, or just bagging, is a +

    +Bootstrap aggregation, or just bagging, is a general-purpose procedure for reducing the variance of a statistical -learning method. -

    +learning method. +











    -

    More bagging

    -

    Bagging typically results in improved accuracy +

    More bagging

    + +

    +Bagging typically results in improved accuracy over prediction using a single tree. Unfortunately, however, it can be difficult to interpret the resulting model. Recall that one of the advantages of decision trees is the attractive and easily interpreted diagram that results. -

    -

    However, when we bag a large number of trees, it is no longer +

    +However, when we bag a large number of trees, it is no longer possible to represent the resulting statistical learning procedure using a single tree, and it is no longer clear which variables are most important to the procedure. Thus, bagging improves prediction @@ -1772,18 +1530,15 @@ trees. A large value indicates an important predictor. Similarly, in the context of bagging classification trees, we can add up the total amount that the Gini index is decreased by splits over a given predictor, averaged over all \( B \) trees. -

    +











    -

    Simple Voting Example, head or tail

    + +

    Simple Voting Example, head or tail

    +

    -

    -
    -
    -
    -
    -
    heads_proba = 0.51
    +
    heads_proba = 0.51
     coin_tosses = (np.random.rand(10000, 10) < heads_proba).astype(np.int32)
     cumulative_heads_ratio = np.cumsum(coin_tosses, axis=0) / np.arange(1, 10001).reshape(-1, 1)
     plt.figure(figsize=(8,3.5))
    @@ -1796,32 +1551,15 @@ plt.legend(loc="lower right")
     plt.axis([0, 10000, 0.42, 0.58])
     save_fig("votingsimple")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Using the Voting Classifier

    + +

    Using the Voting Classifier

    +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -1864,33 +1602,16 @@ voting_clf.fit(X_train, y_train)
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Please, not the moons again! Voting and Bagging

    +

    Please, not the moons again! Voting and Bagging

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -1908,51 +1629,21 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='hard')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    log_clf = LogisticRegression(random_state=42)
    +
    log_clf = LogisticRegression(random_state=42)
     rnd_clf = RandomForestClassifier(random_state=42)
     svm_clf = SVC(probability=True, random_state=42)
     
    @@ -1960,58 +1651,26 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='soft')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Bagging Examples

    +

    Bagging Examples

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.ensemble import BaggingClassifier
    +
    from sklearn.ensemble import BaggingClassifier
     from sklearn.tree import DecisionTreeClassifier
     
     bag_clf = BaggingClassifier(
    @@ -2019,70 +1678,25 @@ bag_clf = BaggingClassifier(
         max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
     bag_clf.fit(X_train, y_train)
     y_pred = bag_clf.predict(X_test)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     print(accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    tree_clf = DecisionTreeClassifier(random_state=42)
    +
    tree_clf = DecisionTreeClassifier(random_state=42)
     tree_clf.fit(X_train, y_train)
     y_pred_tree = tree_clf.predict(X_test)
     print(accuracy_score(y_test, y_pred_tree))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from matplotlib.colors import ListedColormap
    +
    from matplotlib.colors import ListedColormap
     
     def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):
         x1s = np.linspace(axes[0], axes[1], 100)
    @@ -2109,36 +1723,19 @@ plot_decision_boundary(bag_clf, X, y)
     plt.title("Decision Trees with Bagging", fontsize=14)
     save_fig("baggingtree")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Making your own Bootstrap: Changing the Level of the Decision Tree

    -

    Let us bring up our good old boostrap example from the linear regression lectures. We change the linerar regression algorithm with +

    Making your own Bootstrap: Changing the Level of the Decision Tree

    + +

    +Let us bring up our good old boostrap example from the linear regression lectures. We change the linerar regression algorithm with a decision tree wth different depths and perform a bootstrap aggregate (in this case we perform as many bootstraps as data points \( n \)). -

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.pipeline import make_pipeline
    @@ -2195,81 +1792,69 @@ plt.plot(polydegree, variance, label='Variance&
     plt.legend()
     save_fig("baggingboot")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Why Voting?

    -

    The idea behind boosting, and voting as well can be phrased as follows: +

    Why Voting?

    + +

    +The idea behind boosting, and voting as well can be phrased as follows: Can a group of people somehow arrive at highly reasoned decisions, despite the weak judgement of the individual members? -

    -

    The aim is to create a good classifier by combining several weak classifiers. +

    +The aim is to create a good classifier by combining several weak classifiers. A weak classifier is a classifier which is able to produce results that are only slightly better than guessing at random. -

    -

    The basic approach is to apply repeatedly (in boosting this is done in an iterative way) a weak classifier to modifications of the data. +

    +The basic approach is to apply repeatedly (in boosting this is done in an iterative way) a weak classifier to modifications of the data. In voting we simply apply the law of large numbers while in boosting we give more weight to misclassified data in -each iteration. -

    +each iteration. -

    Decision trees play an important role as our weak classifier. They serve as the basic method.

    +

    +Decision trees play an important role as our weak classifier. They serve as the basic method. +











    -

    Tossing coins

    -

    The simplest case is a so-called voting ensemble. To illustrate this, +

    Tossing coins

    + +

    +The simplest case is a so-called voting ensemble. To illustrate this, think of yourself tossing coins with a biased outcome of 51 per cent for heads and 49% for tails. With only few tosses, you may not clearly see this distribution for heads and tails. However, after some thousands of tosses, there will be a clear majority of heads. With 2000 tosses you should see approximately 1020 heads and 980 tails. -

    -

    We can then state that the outcome is a clear majority of heads. If +

    +We can then state that the outcome is a clear majority of heads. If you do this ten thousand times, it is easy to see that there is a 97% likelihood of a majority of heads. -

    -

    Another example would be to collect all polls before an +

    +Another example would be to collect all polls before an election. Different polls may show different likelihoods for a candidate winning with say a majority of the popular vote. The majority vote would then consist in many polls indicating that this candidate will actually win. -

    -

    The example here shows how we can implement the coin tossing case, +

    +The example here shows how we can implement the coin tossing case, clealry demostrating that after some tosses we see the law of large numbers kicking in. -

    +











    -

    Standard imports first

    +

    Standard imports first

    + +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     from IPython.display import Image 
     from pydot import graph_from_dot_data
     import pandas as pd
    @@ -2306,32 +1891,15 @@ DATA_ID = "DataFiles/"
     
     def save_fig(fig_id):
         plt.savefig(image_path(fig_id) + ".png", format='png')
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Simple Voting Example, head or tail

    + +

    Simple Voting Example, head or tail

    +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     import matplotlib
     import matplotlib.pyplot as plt
    @@ -2353,34 +1921,18 @@ plt.legend(loc="lower right")
     plt.axis([0, 10000, 0.42, 0.58])
     save_fig("votingsimple")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Using the Voting Classifier

    -

    We can use the voting classifier on other data sets, here the exciting binary case of two distinct objects using the make moons functionality of Scikit-Learn.

    +

    Using the Voting Classifier

    + +

    +We can use the voting classifier on other data sets, here the exciting binary case of two distinct objects using the make moons functionality of Scikit-Learn. +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -2422,33 +1974,16 @@ voting_clf.fit(X_train, y_train)
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Voting and Bagging

    +

    Voting and Bagging

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -2466,51 +2001,21 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='hard')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    log_clf = LogisticRegression(random_state=42)
    +
    log_clf = LogisticRegression(random_state=42)
     rnd_clf = RandomForestClassifier(random_state=42)
     svm_clf = SVC(probability=True, random_state=42)
     
    @@ -2518,76 +2023,49 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='soft')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Random forests

    -

    Random forests provide an improvement over bagged trees by way of a -small tweak that decorrelates the trees. -

    +

    Random forests

    -

    As in bagging, we build a +

    +Random forests provide an improvement over bagged trees by way of a +small tweak that decorrelates the trees. + +

    +As in bagging, we build a number of decision trees on bootstrapped training samples. But when building these decision trees, each time a split in a tree is considered, a random sample of \( m \) predictors is chosen as split candidates from the full set of \( p \) predictors. The split is allowed to -use only one of those \( m \) predictors. -

    +use only one of those \( m \) predictors. -

    A fresh sample of \( m \) predictors is +

    +A fresh sample of \( m \) predictors is taken at each split, and typically we choose -

    $$ m\approx \sqrt{p}. $$ -

    In building a random forest, at +

    +In building a random forest, at each split in the tree, the algorithm is not even allowed to consider -a majority of the available predictors. -

    +a majority of the available predictors. -

    The reason for this is rather clever. Suppose that there is one very +

    +The reason for this is rather clever. Suppose that there is one very strong predictor in the data set, along with a number of other moderately strong predictors. Then in the collection of bagged variable importance random forest trees, most or all of the trees will @@ -2599,36 +2077,41 @@ lead to as large of a reduction in variance as averaging many uncorrelated quantities. In particular, this means that bagging will not lead to a substantial reduction in variance over a single tree in this setting. -

    +











    -

    Random Forest Algorithm

    -

    The algorithm described here can be applied to both classification and regression problems.

    -

    We will grow of forest of say \( B \) trees.

    +

    Random Forest Algorithm

    +The algorithm described here can be applied to both classification and regression problems. + +

    +We will grow of forest of say \( B \) trees. +

    1. For \( b=1:B \)
    2. +
      • Draw a bootstrap sample from the training data organized in our \( \boldsymbol{X} \) matrix.
      • We grow then a random forest tree \( T_b \) based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached
      • +
        1. we select \( m \le p \) variables at random from the \( p \) predictors/features
        2. pick the best split point among the \( m \) features using for example the CART algorithm and create a new node
        3. split the node into daughter nodes
        +
      +
    3. Output then the ensemble of trees \( \{T_b\}_1^{B} \) and make predictions for either a regression type of problem or a classification type of problem.
    +









    -

    Random Forests Compared with other Methods on the Cancer Data

    + +

    Random Forests Compared with other Methods on the Cancer Data

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -2694,374 +2177,362 @@ skplt.metrics.plot_roc(y_test, y_probas)
     plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -

    Recall that the cumulative gains curve shows the percentage of the +

    +

    +Recall that the cumulative gains curve shows the percentage of the overall number of cases in a given category gained by targeting a percentage of the total number of cases. -

    -

    Similarly, the receiver operating characteristic curve, or ROC curve, +

    +Similarly, the receiver operating characteristic curve, or ROC curve, displays the diagnostic ability of a binary classifier system as its discrimination threshold is varied. It plots the true positive rate against the false positive rate. -

    +











    -

    Compare Bagging on Trees with Random Forests

    + +

    Compare Bagging on Trees with Random Forests

    +

    -

    -
    -
    -
    -
    -
    bag_clf = BaggingClassifier(
    +
    bag_clf = BaggingClassifier(
         DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
         n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    bag_clf.fit(X_train, y_train)
    +
    bag_clf.fit(X_train, y_train)
     y_pred = bag_clf.predict(X_test)
     from sklearn.ensemble import RandomForestClassifier
     rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
     rnd_clf.fit(X_train, y_train)
     y_pred_rf = rnd_clf.predict(X_test)
     np.sum(y_pred == y_pred_rf) / len(y_pred) 
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Boosting, a Bird's Eye View

    -

    The basic idea is to combine weak classifiers in order to create a good +

    Boosting, a Bird's Eye View

    + +

    +The basic idea is to combine weak classifiers in order to create a good classifier. With a weak classifier we often intend a classifier which produces results which are only slightly better than we would get by random guesses. -

    -

    This is done by applying in an iterative way a weak (or a standard +

    +This is done by applying in an iterative way a weak (or a standard classifier like decision trees) to modify the data. In each iteration we emphasize those observations which are misclassified by weighting them with a factor. -

    +











    -

    What is boosting? Additive Modelling/Iterative Fitting

    -

    Boosting is a way of fitting an additive expansion in a set of +

    What is boosting? Additive Modelling/Iterative Fitting

    + +

    +Boosting is a way of fitting an additive expansion in a set of elementary basis functions like for example some simple polynomials. Assume for example that we have a function -

    $$ f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m), $$ -

    where \( \beta_m \) are the expansion parameters to be determined in a +

    +where \( \beta_m \) are the expansion parameters to be determined in a minimization process and \( b(x;\gamma_m) \) are some simple functions of the multivariable parameter \( x \) which is characterized by the parameters \( \gamma_m \). -

    -

    As an example, consider the Sigmoid function we used in logistic +

    +As an example, consider the Sigmoid function we used in logistic regression. In that case, we can translate the function \( b(x;\gamma_m) \) into the Sigmoid function -

    $$ \sigma(t) = \frac{1}{1+\exp{(-t)}}, $$ -

    where \( t=\gamma_0+\gamma_1 x \) and the parameters \( \gamma_0 \) and +

    +where \( t=\gamma_0+\gamma_1 x \) and the parameters \( \gamma_0 \) and \( \gamma_1 \) were determined by the Logistic Regression fitting algorithm. -

    -

    As another example, consider the cost function we defined for linear regression

    +

    +As another example, consider the cost function we defined for linear regression $$ C(\boldsymbol{y},\boldsymbol{f}) = \frac{1}{n} \sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    In this case the function \( f(x) \) was replaced by the design matrix +

    +In this case the function \( f(x) \) was replaced by the design matrix \( \boldsymbol{X} \) and the unknown linear regression parameters \( \boldsymbol{\beta} \), that is \( \boldsymbol{f}=\boldsymbol{X}\boldsymbol{\beta} \). In linear regression we can simply invert a matrix and obtain the parameters \( \beta \) by -

    $$ \boldsymbol{\beta}=\left(\boldsymbol{X}^T\boldsymbol{X}\right)^{-1}\boldsymbol{X}^T\boldsymbol{y}. $$ -

    In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters \( \beta_m \) and \( \gamma_m \).

    +

    +In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters \( \beta_m \) and \( \gamma_m \). +











    -

    Iterative Fitting, Regression and Squared-error Cost Function

    -

    The way we proceed is as follows (here we specialize to the squared-error cost function)

    +

    Iterative Fitting, Regression and Squared-error Cost Function

    + +

    +The way we proceed is as follows (here we specialize to the squared-error cost function)

    1. Establish a cost function, here \( {\cal C}(\boldsymbol{y},\boldsymbol{f}) = \frac{1}{n} \sum_{i=0}^{n-1}(y_i-f_M(x_i))^2 \) with \( f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m) \).
    2. Initialize with a guess \( f_0(x) \). It could be one or even zero or some random numbers.
    3. For \( m=1:M \) +
      1. minimize \( \sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta b(x;\gamma))^2 \) wrt \( \gamma \) and \( \beta \)
      2. This gives the optimal values \( \beta_m \) and \( \gamma_m \)
      3. Determine then the new values \( f_m(x)=f_{m-1}(x) +\beta_m b(x;\gamma_m) \)
      +
    -

    We could use any of the algorithms we have discussed till now. If we + +We could use any of the algorithms we have discussed till now. If we use trees, \( \gamma \) parameterizes the split variables and split points at the internal nodes, and the predictions at the terminal nodes. -

    +











    -

    Squared-Error Example and Iterative Fitting

    -

    To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function.

    +

    Squared-Error Example and Iterative Fitting

    -

    For simplicity we assume also that our functions \( b(x;\gamma)=1+\gamma x \).

    +

    +To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function. -

    This means that for every iteration \( m \), we need to optimize

    +

    +For simplicity we assume also that our functions \( b(x;\gamma)=1+\gamma x \). + +

    +This means that for every iteration \( m \), we need to optimize $$ (\beta_m,\gamma_m) = \mathrm{argmin}_{\beta,\lambda}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta b(x;\gamma))^2=\sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta(1+\gamma x_i))^2. $$ -

    We start our iteration by simply setting \( f_0(x)=0 \). +

    +We start our iteration by simply setting \( f_0(x)=0 \). Taking the derivatives with respect to \( \beta \) and \( \gamma \) we obtain -

    $$ \frac{\partial {\cal C}}{\partial \beta} = -2\sum_{i}(1+\gamma x_i)(y_i-\beta(1+\gamma x_i))=0, $$ -

    and

    +and $$ \frac{\partial {\cal C}}{\partial \gamma} =-2\sum_{i}\beta x_i(y_i-\beta(1+\gamma x_i))=0. $$ -

    We can then rewrite these equations as (defining \( \boldsymbol{w}=\boldsymbol{e}+\gamma \boldsymbol{x}) \) with \( \boldsymbol{e} \) being the unit vector)

    +We can then rewrite these equations as (defining \( \boldsymbol{w}=\boldsymbol{e}+\gamma \boldsymbol{x}) \) with \( \boldsymbol{e} \) being the unit vector) $$ \gamma \boldsymbol{w}^T(\boldsymbol{y}-\beta\gamma \boldsymbol{w})=0, $$ -

    which gives us \( \beta = \boldsymbol{w}^T\boldsymbol{y}/(\boldsymbol{w}^T\boldsymbol{w}) \). Similarly we have

    +which gives us \( \beta = \boldsymbol{w}^T\boldsymbol{y}/(\boldsymbol{w}^T\boldsymbol{w}) \). Similarly we have $$ \beta\gamma \boldsymbol{x}^T(\boldsymbol{y}-\beta(1+\gamma \boldsymbol{x}))=0, $$ -

    which leads to \( \gamma =(\boldsymbol{x}^T\boldsymbol{y}-\beta\boldsymbol{x}^T\boldsymbol{e})/(\beta\boldsymbol{x}^T\boldsymbol{x}) \). Inserting -for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equation in the unknown \( \gamma \) and has to be solved numerically. -

    +

    +which leads to \( \gamma =(\boldsymbol{x}^T\boldsymbol{y}-\beta\boldsymbol{x}^T\boldsymbol{e})/(\beta\boldsymbol{x}^T\boldsymbol{x}) \). Inserting +for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equation in the unknown \( \gamma \) and has to be solved numerically. -

    The solution to these two equations gives us in turn \( \beta_1 \) and \( \gamma_1 \) leading to the new expression for \( f_1(x) \) as -\( f_1(x) = \beta_1(1+\gamma_1x) \). Doing this \( M \) times results in our final estimate for the function \( f \). -

    +

    +The solution to these two equations gives us in turn \( \beta_1 \) and \( \gamma_1 \) leading to the new expression for \( f_1(x) \) as +\( f_1(x) = \beta_1(1+\gamma_1x) \). Doing this \( M \) times results in our final estimate for the function \( f \). +











    -

    Iterative Fitting, Classification and AdaBoost

    -

    Let us consider a binary classification problem with two outcomes \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of +

    Iterative Fitting, Classification and AdaBoost

    + +

    +Let us consider a binary classification problem with two outcomes \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of observations. We define a classification function \( G(x) \) which produces a prediction taking one or the other of the two values \( \{-1,1\} \). -

    -

    The error rate of the training sample is then

    +

    +The error rate of the training sample is then $$ \mathrm{\overline{err}}=\frac{1}{n} \sum_{i=0}^{n-1} I(y_i\ne G(x_i)). $$ -

    The iterative procedure starts with defining a weak classifier whose +

    +The iterative procedure starts with defining a weak classifier whose error rate is barely better than random guessing. The iterative procedure in boosting is to sequentially apply a weak classification algorithm to repeatedly modified versions of the data producing a sequence of weak classifiers \( G_m(x) \). -

    -

    Here we will express our function \( f(x) \) in terms of \( G(x) \). That is

    +

    +Here we will express our function \( f(x) \) in terms of \( G(x) \). That is $$ f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m), $$ -

    will be a function of

    +will be a function of $$ G_M(x) = \mathrm{sign} \sum_{i=1}^M \alpha_m G_m(x). $$ - +











    -

    Adaptive Boosting, AdaBoost

    -

    In our iterative procedure we define thus

    +

    Adaptive Boosting, AdaBoost

    + +

    +In our iterative procedure we define thus $$ f_m(x) = f_{m-1}(x)+\beta_mG_m(x). $$ -

    The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the +

    +The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the exponential cost/loss function defined as -

    $$ C(\boldsymbol{y},\boldsymbol{f}) = \sum_{i=0}^{n-1}\exp{(-y_i(f_{m-1}(x_i)+\beta G(x_i))}. $$ -

    We optimize \( \beta \) and \( G \) for each value of \( m=1:M \) as we did in the regression case. +

    +We optimize \( \beta \) and \( G \) for each value of \( m=1:M \) as we did in the regression case. This is normally done in two steps. Let us however first rewrite the cost function as -

    $$ C(\boldsymbol{y},\boldsymbol{f}) = \sum_{i=0}^{n-1}w_i^{m}\exp{(-y_i\beta G(x_i))}, $$ -

    where we have defined \( w_i^m= \exp{(-y_if_{m-1}(x_i))} \).

    +where we have defined \( w_i^m= \exp{(-y_if_{m-1}(x_i))} \). +











    -

    Building up AdaBoost

    -

    First, for any \( \beta > 0 \), we optimize \( G \) by setting

    +

    Building up AdaBoost

    + +

    +First, for any \( \beta > 0 \), we optimize \( G \) by setting $$ G_m(x) = \mathrm{sign} \sum_{i=0}^{n-1} w_i^m I(y_i \ne G_(x_i)), $$ -

    which is the classifier that minimizes the weighted error rate in predicting \( y \).

    +which is the classifier that minimizes the weighted error rate in predicting \( y \). -

    We can do this by rewriting

    +

    +We can do this by rewriting $$ \exp{-(\beta)}\sum_{y_i=G(x_i)}w_i^m+\exp{(\beta)}\sum_{y_i\ne G(x_i)}w_i^m, $$ -

    which can be rewritten as

    +which can be rewritten as $$ (\exp{(\beta)}-\exp{-(\beta)})\sum_{i=0}^{n-1}w_i^mI(y_i\ne G(x_i))+\exp{(-\beta)}\sum_{i=0}^{n-1}w_i^m=0, $$ -

    which leads to

    +which leads to $$ \beta_m = \frac{1}{2}\log{\frac{1-\mathrm{\overline{err}}}{\mathrm{\overline{err}}}}, $$ -

    where we have redefined the error as

    +where we have redefined the error as $$ \mathrm{\overline{err}}_m=\frac{1}{n}\frac{\sum_{i=0}^{n-1}w_i^mI(y_i\ne G(x_i)}{\sum_{i=0}^{n-1}w_i^m}, $$ -

    which leads to an update of

    +which leads to an update of $$ f_m(x) = f_{m-1}(x) +\beta_m G_m(x). $$ -

    This leads to the new weights

    +This leads to the new weights $$ w_i^{m+1} = w_i^m \exp{(-y_i\beta_m G_m(x_i))} $$ - +











    -

    Adaptive boosting: AdaBoost, Basic Algorithm

    -

    The algorithm here is rather straightforward. Assume that our weak +

    Adaptive boosting: AdaBoost, Basic Algorithm

    + +

    +The algorithm here is rather straightforward. Assume that our weak classifier is a decision tree and we consider a binary set of outputs with \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of observations. Our design matrix is given in terms of the feature/predictor vectors \( \boldsymbol{X}=[\boldsymbol{x}_0\boldsymbol{x}_1\dots\boldsymbol{x}_{p-1}] \). Finally, we define also a -classifier determined by our data via a function \( G(x) \). This function tells us how well we are able to classify our outputs/targets \( \boldsymbol{y} \). -

    +classifier determined by our data via a function \( G(x) \). This function tells us how well we are able to classify our outputs/targets \( \boldsymbol{y} \). -

    We have already defined the misclassification error \( \mathrm{err} \) as

    +

    +We have already defined the misclassification error \( \mathrm{err} \) as $$ \mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(x_i)), $$ -

    where the function \( I() \) is one if we misclassify and zero if we classify correctly.

    +where the function \( I() \) is one if we misclassify and zero if we classify correctly. +











    -

    Basic Steps of AdaBoost

    -

    With the above definitions we are now ready to set up the algorithm for AdaBoost. +

    Basic Steps of AdaBoost

    + +

    +With the above definitions we are now ready to set up the algorithm for AdaBoost. The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases. -

    +
    1. We start by initializing all weights to \( w_i = 1/n \), with \( i=0,1,2,\dots n-1 \). It is easy to see that we must have \( \sum_{i=0}^{n-1}w_i = 1 \).
    2. We rewrite the misclassification error as
    + $$ \mathrm{\overline{err}}_m=\frac{\sum_{i=0}^{n-1}w_i^m I(y_i\ne G(x_i))}{\sum_{i=0}^{n-1}w_i}, $$ +
    1. Then we start looping over all attempts at classifying, namely we start an iterative process for \( m=1:M \), where \( M \) is the final number of classifications. Our given classifier could for example be a plain decision tree. +
      1. Fit then a given classifier to the training set using the weights \( w_i \).
      2. Compute then \( \mathrm{err} \) and figure out which events are classified properly and which are classified wrongly.
      3. Define a quantity \( \alpha_{m} = \log{(1-\mathrm{\overline{err}}_m)/\mathrm{\overline{err}}_m} \)
      4. Set the new weights to \( w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(x_i)} \).
      +
    2. Compute the new classifier \( G(x)= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(x_i) \).
    -

    For the iterations with \( m \le 2 \) the weights are modified + +For the iterations with \( m \le 2 \) the weights are modified individually at each steps. The observations which were misclassified at iteration \( m-1 \) have a weight which is larger than those which were classified properly. As this proceeds, the observations which were difficult to classifiy correctly are given a larger influence. Each new classification step \( m \) is then forced to concentrate on those observations that are missed in the previous iterations. -

    +











    -

    AdaBoost Examples

    -

    Using Scikit-Learn it is easy to apply the adaptive boosting algorithm, as done here.

    +

    AdaBoost Examples

    +

    +Using Scikit-Learn it is easy to apply the adaptive boosting algorithm, as done here. + +

    -

    -
    -
    -
    -
    -
    from sklearn.ensemble import AdaBoostClassifier
    +
    from sklearn.ensemble import AdaBoostClassifier
     
     ada_clf = AdaBoostClassifier(
         DecisionTreeClassifier(max_depth=1), n_estimators=200,
    @@ -3082,115 +2553,114 @@ skplt.metrics.plot_roc(y_test, y_probas)
     plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent

    -

    Gradient boosting is again a similar technique to Adaptive boosting, +

    Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent

    + +

    +Gradient boosting is again a similar technique to Adaptive boosting, it combines so-called weak classifiers or regressors into a strong method via a series of iterations. -

    -

    In order to understand the method, let us illustrate its basics by +

    +In order to understand the method, let us illustrate its basics by bringing back the essential steps in linear regression, where our cost function was the least squares function. -

    +











    -

    The Squared-Error again! Steepest Descent

    -

    We start again with our cost function \( {\cal C}(\boldsymbol{y}m\boldsymbol{f})=\sum_{i=0}^{n-1}{\cal L}(y_i, f(x_i)) \) where we want to minimize +

    The Squared-Error again! Steepest Descent

    + +

    +We start again with our cost function \( {\cal C}(\boldsymbol{y}m\boldsymbol{f})=\sum_{i=0}^{n-1}{\cal L}(y_i, f(x_i)) \) where we want to minimize This means that for every iteration, we need to optimize -

    $$ (\hat{\boldsymbol{f}}) = \mathrm{argmin}_{\boldsymbol{f}}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    We define a real function \( h_m(x) \) that defines our final function \( f_M(x) \) as

    +

    +We define a real function \( h_m(x) \) that defines our final function \( f_M(x) \) as $$ f_M(x) = \sum_{m=0}^M h_m(x). $$ -

    In the steepest decent approach we approximate \( h_m(x) = -\rho_m g_m(x) \), where \( \rho_m \) is a scalar and \( g_m(x) \) the gradient defined as

    +

    +In the steepest decent approach we approximate \( h_m(x) = -\rho_m g_m(x) \), where \( \rho_m \) is a scalar and \( g_m(x) \) the gradient defined as $$ g_m(x_i) = \left[ \frac{\partial {\cal L}(y_i, f(x_i))}{\partial f(x_i)}\right]_{f(x_i)=f_{m-1}(x_i)}. $$ -

    With the new gradient we can update \( f_m(x) = f_{m-1}(x) -\rho_m g_m(x) \). Using the above squared-error function we see that +

    +With the new gradient we can update \( f_m(x) = f_{m-1}(x) -\rho_m g_m(x) \). Using the above squared-error function we see that the gradient is \( g_m(x_i) = -2(y_i-f(x_i)) \). -

    -

    Choosing \( f_0(x)=0 \) we obtain \( g_m(x) = -2y_i \) and inserting this into the minimization problem for the cost function we have

    +

    +Choosing \( f_0(x)=0 \) we obtain \( g_m(x) = -2y_i \) and inserting this into the minimization problem for the cost function we have $$ (\rho_1) = \mathrm{argmin}_{\rho}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i+2\rho y_i)^2. $$ - +











    -

    Steepest Descent Example

    -

    Optimizing with respect to \( \rho \) we obtain (taking the derivative) that \( \rho_1 = -1/2 \). We have then that

    +

    Steepest Descent Example

    + +

    +Optimizing with respect to \( \rho \) we obtain (taking the derivative) that \( \rho_1 = -1/2 \). We have then that $$ f_1(x) = f_{0}(x) -\rho_1 g_1(x)=-y_i. $$ -

    We can then proceed and compute

    +We can then proceed and compute $$ g_2(x_i) = \left[ \frac{\partial {\cal L}(y_i, f(x_i))}{\partial f(x_i)}\right]_{f(x_i)=f_{1}(x_i)=y_i}=-4y_i, $$ -

    and find a new value for \( \rho_2=-1/2 \) and continue till we have reached \( m=M \). We can modify the steepest descent method, or steepest boosting, by introducing what is called gradient boosting.

    +and find a new value for \( \rho_2=-1/2 \) and continue till we have reached \( m=M \). We can modify the steepest descent method, or steepest boosting, by introducing what is called gradient boosting. +











    -

    Gradient Boosting, algorithm

    -

    Steepest descent is however not much used, since it only optimizes \( f \) at a fixed set of \( n \) points, +

    Gradient Boosting, algorithm

    + +

    +Steepest descent is however not much used, since it only optimizes \( f \) at a fixed set of \( n \) points, so we do not learn a function that can generalize. However, we can modify the algorithm by -fitting a weak learner to approximate the negative gradient signal. -

    +fitting a weak learner to approximate the negative gradient signal. -

    Suppose we have a cost function \( C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i)) \) where \( y_i \) is our target and \( f(x_i) \) the function which is meant to model \( y_i \). The above cost function could be our standard squared-error function

    +

    +Suppose we have a cost function \( C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i)) \) where \( y_i \) is our target and \( f(x_i) \) the function which is meant to model \( y_i \). The above cost function could be our standard squared-error function $$ C(\boldsymbol{y},\boldsymbol{f})=\sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    The way we proceed in an iterative fashion is to

    +

    +The way we proceed in an iterative fashion is to +

    1. Initialize our estimate \( f_0(x) \).
    2. For \( m=1:M \), we +
      1. compute the negative gradient vector \( \boldsymbol{u}_m = -\partial C(\boldsymbol{y},\boldsymbol{f})/\partial \boldsymbol{f}(x) \) at \( f(x) = f_{m-1}(x) \);
      2. fit the so-called base-learner to the negative gradient \( h_m(u_m,x) \);
      3. update the estimate \( f_m(x) = f_{m-1}(x)+h_m(u_m,x) \);
      +
    3. The final estimate is then \( f_M(x) = \sum_{m=1}^M h_m(u_m,x) \).
    +









    -

    Gradient Boosting, Examples of Regression

    + +

    Gradient Boosting, Examples of Regression

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.ensemble import GradientBoostingRegressor
    @@ -3236,32 +2706,15 @@ plt.plot(polydegree, variance, label='Variance&
     plt.legend()
     save_fig("gdregression")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Gradient Boosting, Classification Example

    + +

    Gradient Boosting, Classification Example

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -3301,51 +2754,37 @@ plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     save_fig("gdclassiffiercgain")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    XGBoost: Extreme Gradient Boosting

    -

    XGBoost or Extreme Gradient +

    XGBoost: Extreme Gradient Boosting

    + +

    +XGBoost or Extreme Gradient Boosting, is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable. It implements machine learning algorithms under the Gradient Boosting framework. XGBoost provides a parallel tree boosting that solve many data science problems in a fast and accurate way. See the article by Chen and Guestrin. -

    -

    The authors design and build a highly scalable end-to-end tree +

    +The authors design and build a highly scalable end-to-end tree boosting system. It has a theoretically justified weighted quantile sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning. -

    -

    It is now the algorithm which wins essentially all ML competitions!!!

    +

    +It is now the algorithm which wins essentially all ML competitions!!! +











    -

    Regression Case

    +

    Regression Case

    + +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     import xgboost as xgb
    @@ -3391,34 +2830,18 @@ plt.plot(polydegree, bias, label='bias''Variance')
     plt.legend()
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Xgboost on the Cancer Data

    -

    As you will see from the confusion matrix below, XGBoots does an excellent job on the Wisconsin cancer data and outperforms essentially all agorithms we have discussed till now.

    +

    Xgboost on the Cancer Data

    + +

    +As you will see from the confusion matrix below, XGBoots does an excellent job on the Wisconsin cancer data and outperforms essentially all agorithms we have discussed till now. +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -3469,26 +2892,18 @@ xgb.plot_importance(xg_clf)
     plt.rcParams['figure.figsize'] = [5, 5]
     save_fig("xgparams")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - +
    +

    + +

    © 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
    + + + diff --git a/doc/pub/week45/html/week45.html b/doc/pub/week45/html/week45.html index 7794e13ef..497127df5 100644 --- a/doc/pub/week45/html/week45.html +++ b/doc/pub/week45/html/week45.html @@ -1,105 +1,36 @@ - + + Week 45: Decisions Trees, Random Forests, Bagging and Boosting + + + + @@ -378,122 +220,144 @@ MathJax.Hub.Config({ - -
    -

    Week 45: Decisions Trees, Random Forests, Bagging and Boosting

    -
    + + + + + +

    Week 45: Decisions Trees, Random Forests, Bagging and Boosting

    + +

    +

    Morten Hjorth-Jensen [1, 2]
    - -
    -[1] Department of Physics, University of Oslo -
    -
    -[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University -
    -
    -
    -

    Nov 9, 2021

    -
    -
    +

    + + +

    [1] Department of Physics, University of Oslo
    +
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University
    +
    +

    +

    Nov 10, 2021

    +
    +











    -

    Overview of week 45

    + +

    Overview of week 45

    • Thursday: Basics of Decision Trees, Bagging and Voting
    • Friday: More on Bagging, Voting, Random Forests and start Boosting
    + -
    -Reading

    +

    +Reading. +

    +

    1. Decision Trees: Geron's chapter 6 covers decision trees while ensemble models, voting and bagging are discussed in chapter 7. See also lecture from STK-IN4300, lecture 7. Chapter 9.2 of Hastie et al contains also a good discussion.
    +











    -

    Decision trees, overarching aims

    -

    We start here with the most basic algorithm, the so-called decision +

    Decision trees, overarching aims

    + +

    +We start here with the most basic algorithm, the so-called decision tree. With this basic algorithm we can in turn build more complex networks, spanning from homogeneous and heterogenous forests (bagging, random forests and more) to one of the most popular supervised algorithms nowadays, the extreme gradient boosting, or just XGBoost. But let us start with the simplest possible ingredient. -

    -

    Decision trees are supervised learning algorithms used for both, +

    +Decision trees are supervised learning algorithms used for both, classification and regression tasks. -

    -

    The main idea of decision trees +

    +The main idea of decision trees is to find those descriptive features which contain the most information regarding the target feature and then split the dataset along the values of these features such that the target feature values for the resulting underlying datasets are as pure as possible. -

    -

    The descriptive features which reproduce best the target/output features are normally said +

    +The descriptive features which reproduce best the target/output features are normally said to be the most informative ones. The process of finding the most informative feature is done until we accomplish a stopping criteria -where we then finally end up in so called leaf nodes. -

    +where we then finally end up in so called leaf nodes. +











    -

    Basics of a tree

    -

    A decision tree is typically divided into a root node, the interior nodes, +

    Basics of a tree

    + +

    +A decision tree is typically divided into a root node, the interior nodes, and the final leaf nodes or just leaves. These entities are then connected by so-called branches. -

    -

    The leaf nodes +

    +The leaf nodes contain the predictions we will make for new query instances presented to our trained model. This is possible since the model has learned the underlying structure of the training data and hence can, given some assumptions, make predictions about the target feature value (class) of unseen query instances. -

    +











    -

    A Sketch of a Tree, Regression problem

    +

    A Sketch of a Tree, Regression problem

    + +

    +











    -

    A Sketch of a Tree, Classification problem

    +

    A Sketch of a Tree, Classification problem

    + +

    +











    -

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    -

    -
    -

    -
    -

    +

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    -

    This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using Scikit-Learn's decision tree classifier. Here we have used the so-called gini index (see below) to split the various branches.

    +

    +



    +

    +This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using Scikit-Learn's decision tree classifier. Here we have used the so-called gini index (see below) to split the various branches. + +











    -

    General Features

    -

    The overarching approach to decision trees is a top-down approach.

    +

    General Features

    + +

    +The overarching approach to decision trees is a top-down approach.

    • A leaf provides the classification of a given instance.
    • @@ -501,16 +365,18 @@ given some assumptions, make predictions about the target feature value
    • A branch corresponds to a possible values of an attribute.
    • An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.
    -

    This process is then repeated for the subtree rooted at the new + +This process is then repeated for the subtree rooted at the new node. -

    +











    -

    How do we set it up?

    -

    In simplified terms, the process of training a decision tree and +

    How do we set it up?

    + +

    +In simplified terms, the process of training a decision tree and predicting the target features of query instances is as follows: -

    1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature
    2. @@ -518,18 +384,17 @@ predicting the target features of query instances is as follows:
    3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the predictions we want to make for new query instances
    4. Show query instances to the tree and run down the tree until we arrive at leaf nodes
    -

    Then we are essentially done!

    +Then we are essentially done! + +











    -

    Decision trees and Regression

    + +

    Decision trees and Regression

    +

    -

    -
    -
    -
    -
    -
    import numpy as np
    +
    import numpy as np
     import matplotlib.pyplot as plt
     from sklearn.preprocessing import PolynomialFeatures
     from sklearn.linear_model import LinearRegression
    @@ -617,102 +482,96 @@ plt.ylabel(&quo
     plt.title("Decision Tree Regression")
     plt.legend()
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Building a tree, regression

    -

    There are mainly two steps

    +

    Building a tree, regression

    + +

    +There are mainly two steps +

    1. We split the predictor space (the set of possible values \( x_1,x_2,\dots, x_p \)) into \( J \) distinct and non-non-overlapping regions, \( R_1,R_2,\dots,R_J \).
    2. For every observation that falls into the region \( R_j \) , we make the same prediction, which is simply the mean of the response values for the training observations in \( R_j \).
    -

    How do we construct the regions \( R_1,\dots,R_J \)? In theory, the + +How do we construct the regions \( R_1,\dots,R_J \)? In theory, the regions could have any shape. However, we choose to divide the predictor space into high-dimensional rectangles, or boxes, for simplicity and for ease of interpretation of the resulting predictive model. The goal is to find boxes \( R_1,\dots,R_J \) that minimize the MSE, given by -

    $$ \sum_{j=1}^J\sum_{i\in R_j}(y_i-\overline{y}_{R_j})^2, $$ -

    where \( \overline{y}_{R_j} \) is the mean response for the training observations -within box \( j \). -

    +

    +where \( \overline{y}_{R_j} \) is the mean response for the training observations +within box \( j \). +











    -

    A top-down approach, recursive binary splitting

    -

    Unfortunately, it is computationally infeasible to consider every +

    A top-down approach, recursive binary splitting

    + +

    +Unfortunately, it is computationally infeasible to consider every possible partition of the feature space into \( J \) boxes. The common strategy is to take a top-down approach -

    -

    The approach is top-down because it begins at the top of the tree (all +

    +The approach is top-down because it begins at the top of the tree (all observations belong to a single region) and then successively splits the predictor space; each split is indicated via two new branches further down on the tree. It is greedy because at each step of the tree-building process, the best split is made at that particular step, rather than looking ahead and picking a split that will lead to a better tree in some future step. -

    +











    -

    Making a tree

    -

    In order to implement the recursive binary splitting we start by selecting +

    Making a tree

    + +

    +In order to implement the recursive binary splitting we start by selecting the predictor \( x_j \) and a cutpoint \( s \) that splits the predictor space into two regions \( R_1 \) and \( R_2 \) -

    $$ \left\{X\vert x_j < s\right\}, $$ -

    and

    +and $$ \left\{X\vert x_j \geq s\right\}, $$ -

    so that we obtain the lowest MSE, that is

    +so that we obtain the lowest MSE, that is $$ \sum_{i:x_i\in R_j}(y_i-\overline{y}_{R_1})^2+\sum_{i:x_i\in R_2}(y_i-\overline{y}_{R_2})^2, $$ -

    which we want to minimize by considering all predictors +

    +which we want to minimize by considering all predictors \( x_1,x_2,\dots,x_p \). We consider also all possible values of \( s \) for each predictor. These values could be determined by randomly assigned numbers or by starting at the midpoint and then proceed till we find an optimal value. -

    -

    For any \( j \) and \( s \), we define the pair of half-planes where +

    +For any \( j \) and \( s \), we define the pair of half-planes where \( \overline{y}_{R_1} \) is the mean response for the training observations in \( R_1(j,s) \), and \( \overline{y}_{R_2} \) is the mean response for the training observations in \( R_2(j,s) \). -

    -

    Finding the values of \( j \) and \( s \) that minimize the above equation can be +

    +Finding the values of \( j \) and \( s \) that minimize the above equation can be done quite quickly, especially when the number of features \( p \) is not too large. -

    -

    Next, we repeat the process, looking +

    +Next, we repeat the process, looking for the best predictor and best cutpoint in order to split the data further so as to minimize the MSE within each of the resulting regions. However, this time, instead of splitting the entire predictor @@ -721,83 +580,95 @@ have three regions. Again, we look to split one of these three regions further, so as to minimize the MSE. The process continues until a stopping criterion is reached; for instance, we may continue until no region contains more than five observations. -

    +

    -

    Pruning the tree

    -

    The above procedure is rather straightforward, but leads often to +

    Pruning the tree

    + +

    +The above procedure is rather straightforward, but leads often to overfitting and unnecessarily large and complicated trees. The basic idea is to grow a large tree \( T_0 \) and then prune it back in order to obtain a subtree. A smaller tree with fewer splits (fewer regions) can lead to smaller variance and better interpretation at the cost of a little more bias. -

    -

    The so-called Cost complexity pruning algorithm gives us a +

    +The so-called Cost complexity pruning algorithm gives us a way to do just this. Rather than considering every possible subtree, we consider a sequence of trees indexed by a nonnegative tuning parameter \( \alpha \). -

    -

    Read more at the following Scikit-Learn link on pruning.

    +

    +Read more at the following Scikit-Learn link on pruning. +











    -

    Cost complexity pruning

    -

    For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that

    +

    Cost complexity pruning

    + +

    +For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that $$ \sum_{m=1}^{\overline{T}}\sum_{i:x_i\in R_m}(y_i-\overline{y}_{R_m})^2+\alpha\overline{T}, $$ -

    is as small as possible. Here \( \overline{T} \) is +is as small as possible. Here \( \overline{T} \) is the number of terminal nodes of the tree \( T \) , \( R_m \) is the rectangle (i.e. the subset of predictor space) corresponding to the \( m \)-th terminal node. -

    -

    The tuning parameter \( \alpha \) controls a trade-off between the subtree’s +

    +The tuning parameter \( \alpha \) controls a trade-off between the subtree’s complexity and its fit to the training data. When \( \alpha = 0 \), then the subtree \( T \) will simply equal \( T_0 \), because then the above equation just measures the training error. However, as \( \alpha \) increases, there is a price to pay for having a tree with many terminal nodes. The above equation will -tend to be minimized for a smaller subtree. -

    +tend to be minimized for a smaller subtree. -

    It turns out that as we increase \( \alpha \) from zero +

    +It turns out that as we increase \( \alpha \) from zero branches get pruned from the tree in a nested and predictable fashion, so obtaining the whole sequence of subtrees as a function of \( \alpha \) is easy. We can select a value of \( \alpha \) using a validation set or using cross-validation. We then return to the full data set and obtain the -subtree corresponding to \( \alpha \). -

    +subtree corresponding to \( \alpha \). +











    -

    Schematic Regression Procedure

    +

    Schematic Regression Procedure

    + +

    -Building a Regression Tree +Building a Regression Tree.

    1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.
    2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of \( \alpha \).
    3. Use for example \( K \)-fold cross-validation to choose \( \alpha \). Divide the training observations into \( K \) folds. For each \( k=1,2,\dots,K \) we:
    4. +
      • repeat steps 1 and 2 on all but the \( k \)-th fold of the training data.
      • Then we valuate the mean squared prediction error on the data in the left-out \( k \)-th fold, as a function of \( \alpha \).
      • Finally we average the results for each value of \( \alpha \), and pick \( \alpha \) to minimize the average error.
      +
    5. Return the subtree from Step 2 that corresponds to the chosen value of \( \alpha \).
    +











    -

    A Classification Tree

    -

    A classification tree is very similar to a regression tree, except +

    A Classification Tree

    + +

    +A classification tree is very similar to a regression tree, except that it is used to predict a qualitative response rather than a quantitative one. Recall that for a regression tree, the predicted response for an observation is given by the mean response of the @@ -808,13 +679,15 @@ in the region to which it belongs. In interpreting the results of a classification tree, we are often interested not only in the class prediction corresponding to a particular terminal node region, but also in the class proportions among the training observations that -fall into that region. -

    +fall into that region. +











    -

    Growing a classification tree

    -

    The task of growing a +

    Growing a classification tree

    + +

    +The task of growing a classification tree is quite similar to the task of growing a regression tree. Just as in the regression setting, we use recursive binary splitting to grow a classification tree. However, in the @@ -824,69 +697,72 @@ error rate. Since we plan to assign an observation in a given region to the most commonly occurring error rate class of training observations in that region, the classification error rate is simply the fraction of the training observations in that region that do not -belong to the most common class. -

    +belong to the most common class. -

    When building a classification tree, either the Gini index or the +

    +When building a classification tree, either the Gini index or the entropy are typically used to evaluate the quality of a particular split, since these two approaches are more sensitive to node purity -than is the classification error rate. -

    +than is the classification error rate. +











    -

    Classification tree, how to split nodes

    -

    If our targets are the outcome of a classification process that takes +

    Classification tree, how to split nodes

    + +

    +If our targets are the outcome of a classification process that takes for example \( k=1,2,\dots,K \) values, the only thing we need to think of is to set up the splitting criteria for each node. -

    -

    We define a PDF \( p_{mk} \) that represents the number of observations of +

    +We define a PDF \( p_{mk} \) that represents the number of observations of a class \( k \) in a region \( R_m \) with \( N_m \) observations. We represent this likelihood function in terms of the proportion \( I(y_i=k) \) of observations of this class in the region \( R_m \) as -

    $$ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i=k). +p_{mk} = \frac{1}{N_m}\sum_{i\in R_m}I(y_i=k). $$ -

    We let \( p_{mk} \) represent the majority class of observations in region +

    +We let \( p_{mk} \) represent the majority class of observations in region \( m \). The three most common ways of splitting a node are given by -

    • Misclassification error
    + $$ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i\ne k) = 1-p_{mk}. +\frac{1}{N_m}\sum_{i\in R_m}I(y_i\ne k) = 1-p_{mk}. $$ +
    • Gini index \( g \)
    + $$ g = \sum_{k=1}^K p_{mk}(1-p_{mk}). $$ +
    • Information entropy or just entropy \( s \)
    + $$ s = -\sum_{k=1}^K p_{mk}\log{p_{mk}}. $$ - +











    -

    Visualizing the Tree, Classification

    + +

    Visualizing the Tree, Classification

    +

    -

    -
    -
    -
    -
    -
    import os
    +
    import os
     from sklearn.datasets import load_breast_cancer
     from sklearn.tree import DecisionTreeClassifier
     from sklearn.model_selection import train_test_split
    @@ -919,32 +795,15 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Visualizing the Tree, The Moons

    + +

    Visualizing the Tree, The Moons

    +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.tree import DecisionTreeClassifier
    @@ -968,72 +827,39 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Other ways of visualizing the trees

    -

    Scikit-Learn has also another way to visualize the trees which is very useful, here with the Iris data.

    +

    Other ways of visualizing the trees

    +

    +Scikit-Learn has also another way to visualize the trees which is very useful, here with the Iris data. + +

    -

    -
    -
    -
    -
    -
    from sklearn.datasets import load_iris
    +
    from sklearn.datasets import load_iris
     from sklearn import tree
     X, y = load_iris(return_X_y=True)
     tree_clf = tree.DecisionTreeClassifier()
     tree_clf = tree_clf.fit(X, y)
     # and then plot the tree
     tree.plot_tree(tree_clf) 
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Printing out as text

    -

    Alternatively, the tree can also be exported in textual format with the function exporttext. +

    Printing out as text

    + +

    +Alternatively, the tree can also be exported in textual format with the function exporttext. This method doesn’t require the installation of external libraries and is more compact: -

    +

    -

    -
    -
    -
    -
    -
    from sklearn.datasets import load_iris
    +
    from sklearn.datasets import load_iris
     from sklearn.tree import DecisionTreeClassifier
     from sklearn.tree import export_text
     iris = load_iris()
    @@ -1041,92 +867,87 @@ decision_tree = DecisionTreeClassifier(rando
     decision_tree = decision_tree.fit(iris.data, iris.target)
     r = export_text(decision_tree, feature_names=iris['feature_names'])
     print(r)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Algorithms for Setting up Decision Trees

    -

    Two algorithms stand out in the set up of decision trees:

    +

    Algorithms for Setting up Decision Trees

    + +

    +Two algorithms stand out in the set up of decision trees: +

    1. The CART (Classification And Regression Tree) algorithm for both classification and regression
    2. The ID3 algorithm based on the computation of the information gain for classification
    -

    We discuss both algorithms with applications here. The popular library + +We discuss both algorithms with applications here. The popular library Scikit-Learn uses the CART algorithm. For classification problems you can use either the gini index or the entropy to split a tree in two branches. -

    +











    -

    The CART algorithm for Classification

    -

    For classification, the CART algorithm splits the data set in two subsets using a single feature \( k \) and a threshold \( t_k \). +

    The CART algorithm for Classification

    + +

    +For classification, the CART algorithm splits the data set in two subsets using a single feature \( k \) and a threshold \( t_k \). This could be for example a threshold set by a number below a certain circumference of a malign tumor. -

    -

    How do we find these two quantities? +

    +How do we find these two quantities? We search for the pair \( (k,t_k) \) that produces the purest subset using for example the gini factor \( G \). The cost function it tries to minimize is then -

    $$ C(k,t_k) = \frac{m_{\mathrm{left}}}{m}G_{\mathrm{left}}+ \frac{m_{\mathrm{right}}}{m}G_{\mathrm{right}}, $$ -

    where \( G_{\mathrm{left/right}} \) measures the impurity of the left/right subset and \( m_{\mathrm{left/right}} \) +where \( G_{\mathrm{left/right}} \) measures the impurity of the left/right subset and \( m_{\mathrm{left/right}} \) is the number of instances in the left/right subset -

    -

    Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets +

    +Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the \( max\_depth \) hyperparameter), or if it cannot find a split that will reduce impurity. A few other hyperparameters control additional stopping conditions such as the \( min\_samples\_split \), \( min\_samples\_leaf \), \( min\_weight\_fraction\_leaf \), and \( max\_leaf\_nodes \). -

    +











    -

    The CART algorithm for Regression

    -

    The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the +

    The CART algorithm for Regression

    + +

    +The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the training set in a way that minimizes say the gini or entropy impurity, it now tries to split the training set in a way that minimizes our well-known mean-squared error (MSE). The cost function is now -

    $$ C(k,t_k) = \frac{m_{\mathrm{left}}}{m}\mathrm{MSE}_{\mathrm{left}}+ \frac{m_{\mathrm{right}}}{m}\mathrm{MSE}_{\mathrm{right}}. $$ -

    Here the MSE for a specific node is defined as

    +Here the MSE for a specific node is defined as $$ \mathrm{MSE}_{\mathrm{node}}=\frac{1}{m_\mathrm{node}}\sum_{i\in \mathrm{node}}(\overline{y}_{\mathrm{node}}-y_i)^2, $$ -

    with

    +with $$ \overline{y}_{\mathrm{node}}=\frac{1}{m_\mathrm{node}}\sum_{i\in \mathrm{node}}y_i, $$ -

    the mean value of all observations in a specific node.

    +the mean value of all observations in a specific node. -

    Without any regularization, the regression task for decision trees, +

    +Without any regularization, the regression task for decision trees, just like for classification tasks, is prone to overfitting. -

    +











    -

    Computing the Gini index

    -

    The example we will look at is a classical one in many Machine +

    Computing the Gini index

    + +

    +The example we will look at is a classical one in many Machine Learning applications. Based on various meteorological features, we have several so-called attributes which decide whether we at the end will do some outdoor activity like skiing, going for a bike ride etc @@ -1136,10 +957,10 @@ etc. The table here contains the feautures outlook, temperature, attributes for each feature are then sunny, overcast and rain for the outlook, hot, cold and mild for temperature, high and normal for humidity and weak and strong for wind. -

    -

    The table here summarizes the various attributes and

    - +

    +The table here summarizes the various attributes and +

    @@ -1160,18 +981,15 @@ humidity and weak and strong for wind.
    Day Outlook Temperature Humidity Wind Ride
    14 Rain Mild High Strong 0
    - +











    -

    Simple Python Code to read in Data and perform Classification

    +

    Simple Python Code to read in Data and perform Classification

    + +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     import pandas as pd
     import matplotlib.pyplot as plt
    @@ -1238,41 +1056,25 @@ export_graphviz(
     )
     cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
     os.system(cmd)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Computing the Gini Factor

    -

    The above functions (gini, entropy and misclassification error) are +

    Computing the Gini Factor

    + +

    +The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm below after we have discussed the information gain algorithm ID3. -

    -

    In the example here we have converted all our attributes into numerical values \( 0,1,2 \) etc.

    +

    +In the example here we have converted all our attributes into numerical values \( 0,1,2 \) etc. +

    -

    -
    -
    -
    -
    -
    # Split a dataset based on an attribute and an attribute value
    +
    # Split a dataset based on an attribute and an attribute value
     def test_split(index, value, dataset):
     	left, right = list(), list()
     	for row in dataset:
    @@ -1332,28 +1134,15 @@ dataset = [[0= get_split(dataset)
     print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Entropy and the ID3 algorithm

    -

    The ID3 algorithm learns decision trees by constructing +

    Entropy and the ID3 algorithm

    + +

    +The ID3 algorithm learns decision trees by constructing them in a top down way, beginning with the question which attribute should be tested at the root of the tree? -

    1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.
    2. @@ -1363,34 +1152,33 @@ them in a top down way, beginning with the question which attribute should be
    3. The entire process is then repeated using the training examples associated with each descendant node to select the best attribute to test at that point in the tree.
    4. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices.
    -

    The ID3 algorithm selects which attribute to test at each node in the + +The ID3 algorithm selects which attribute to test at each node in the tree. -

    -

    We would like to select the attribute that is most useful for classifying +

    +We would like to select the attribute that is most useful for classifying examples. -

    -

    What is a good quantitative measure of the worth of an attribute?

    +

    +What is a good quantitative measure of the worth of an attribute? -

    Information gain measures how well a given attribute separates the +

    +Information gain measures how well a given attribute separates the training examples according to their target classification. -

    -

    The ID3 algorithm uses this information gain measure to select among the candidate +

    +The ID3 algorithm uses this information gain measure to select among the candidate attributes at each step while growing the tree. -

    +











    -

    Cancer Data again now with Decision Trees and other Methods

    + +

    Cancer Data again now with Decision Trees and other Methods

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -1431,32 +1219,15 @@ svm.fit(X_train_scaled, y_train)
     # Decision Trees
     deep_tree_clf.fit(X_train_scaled, y_train)
     print("Test set accuracy with Decision Trees and scaled data: {:.2f}".format(deep_tree_clf.score(X_test_scaled,y_test)))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Another example, the moons again

    + +

    Another example, the moons again

    +

    -

    -
    -
    -
    -
    -
    from __future__ import division, print_function, unicode_literals
    +
    from __future__ import division, print_function, unicode_literals
     
     # Common imports
     import numpy as np
    @@ -1520,32 +1291,15 @@ plt.subplot(122
     plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
     plt.title("min_samples_leaf = {}".format(deep_tree_clf2.min_samples_leaf), fontsize=14)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Playing around with regions

    + +

    Playing around with regions

    +

    -

    -
    -
    -
    -
    -
    np.random.seed(6)
    +
    np.random.seed(6)
     Xs = np.random.rand(100, 2) - 0.5
     ys = (Xs[:, 0] > 0).astype(np.float32) * 2
     
    @@ -1565,86 +1319,37 @@ plt.subplot(122
     plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Regression trees

    + +

    Regression trees

    +

    -

    -
    -
    -
    -
    -
    # Quadratic training set + noise
    +
    # Quadratic training set + noise
     np.random.seed(42)
     m = 200
     X = np.random.rand(m, 1)
     y = 4 * (X - 0.5) ** 2
     y = y + np.random.randn(m, 1) / 10
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.tree import DecisionTreeRegressor
    +
    from sklearn.tree import DecisionTreeRegressor
     
     tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
     tree_reg.fit(X, y)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Final regressor code

    + +

    Final regressor code

    +

    -

    -
    -
    -
    -
    -
    from sklearn.tree import DecisionTreeRegressor
    +
    from sklearn.tree import DecisionTreeRegressor
     
     tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)
     tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)
    @@ -1682,26 +1387,11 @@ plt.text(0.3.title("max_depth=3", fontsize=14)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    tree_reg1 = DecisionTreeRegressor(random_state=42)
    +
    tree_reg1 = DecisionTreeRegressor(random_state=42)
     tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)
     tree_reg1.fit(X, y)
     tree_reg2.fit(X, y)
    @@ -1729,24 +1419,11 @@ plt.xlabel(&quo
     plt.title("min_samples_leaf={}".format(tree_reg2.min_samples_leaf), fontsize=14)
     
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Pros and cons of trees, pros

    + +

    Pros and cons of trees, pros

    • White box, easy to interpret model. Some people believe that decision trees more closely mirror human decision-making than do the regression and classification approaches discussed earlier (think of support vector machines)
    • @@ -1757,8 +1434,10 @@ plt.show()
    • Can model interactions between the different descriptive features
    • Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)
    +









    -

    Disadvantages

    + +

    Disadvantages

    • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
    • @@ -1769,26 +1448,28 @@ plt.show()
    • If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data
    • Features with many levels may be preferred over features with less levels since for them it is more easy to split the dataset such that the sub datasets only contain pure target feature values. This issue can be addressed by preferring for instance the information gain ratio as splitting criteria over information gain
    -

    However, by aggregating many decision trees, using methods like + +However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. -

    +











    -

    Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods

    -

    As stated above and seen in many of the examples discussed here about +

    Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods

    + +

    +As stated above and seen in many of the examples discussed here about a single decision tree, we often end up overfitting our training data. This normally means that we have a high variance. Can we reduce the variance of a statistical learning method? -

    -

    This leads us to a set of different methods that can combine different +

    +This leads us to a set of different methods that can combine different machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are -

    1. Voting classifiers
    2. @@ -1796,45 +1477,50 @@ try to explain here. These are
    3. Random forests
    4. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)
    -

    We discuss these methods here.

    +We discuss these methods here. + +











    -

    An Overview of Ensemble Methods

    -

    -
    -

    -
    -

    +

    An Overview of Ensemble Methods

    +

    +



    + +











    -

    Bagging

    -

    The plain decision trees suffer from high +

    Bagging

    + +

    +The plain decision trees suffer from high variance. This means that if we split the training data into two parts at random, and fit a decision tree to both halves, the results that we get could be quite different. In contrast, a procedure with low variance will yield similar results if applied repeatedly to distinct data sets; linear regression tends to have low variance, if the ratio -of \( n \) to \( p \) is moderately large. -

    +of \( n \) to \( p \) is moderately large. -

    Bootstrap aggregation, or just bagging, is a +

    +Bootstrap aggregation, or just bagging, is a general-purpose procedure for reducing the variance of a statistical -learning method. -

    +learning method. +











    -

    More bagging

    -

    Bagging typically results in improved accuracy +

    More bagging

    + +

    +Bagging typically results in improved accuracy over prediction using a single tree. Unfortunately, however, it can be difficult to interpret the resulting model. Recall that one of the advantages of decision trees is the attractive and easily interpreted diagram that results. -

    -

    However, when we bag a large number of trees, it is no longer +

    +However, when we bag a large number of trees, it is no longer possible to represent the resulting statistical learning procedure using a single tree, and it is no longer clear which variables are most important to the procedure. Thus, bagging improves prediction @@ -1849,18 +1535,15 @@ trees. A large value indicates an important predictor. Similarly, in the context of bagging classification trees, we can add up the total amount that the Gini index is decreased by splits over a given predictor, averaged over all \( B \) trees. -

    +











    -

    Simple Voting Example, head or tail

    + +

    Simple Voting Example, head or tail

    +

    -

    -
    -
    -
    -
    -
    heads_proba = 0.51
    +
    heads_proba = 0.51
     coin_tosses = (np.random.rand(10000, 10) < heads_proba).astype(np.int32)
     cumulative_heads_ratio = np.cumsum(coin_tosses, axis=0) / np.arange(1, 10001).reshape(-1, 1)
     plt.figure(figsize=(8,3.5))
    @@ -1873,32 +1556,15 @@ plt.legend(loc=
     plt.axis([0, 10000, 0.42, 0.58])
     save_fig("votingsimple")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Using the Voting Classifier

    + +

    Using the Voting Classifier

    +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -1941,33 +1607,16 @@ voting_clf.fit(X_train, y_train)
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Please, not the moons again! Voting and Bagging

    +

    Please, not the moons again! Voting and Bagging

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -1985,51 +1634,21 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='hard')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    log_clf = LogisticRegression(random_state=42)
    +
    log_clf = LogisticRegression(random_state=42)
     rnd_clf = RandomForestClassifier(random_state=42)
     svm_clf = SVC(probability=True, random_state=42)
     
    @@ -2037,58 +1656,26 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='soft')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Bagging Examples

    +

    Bagging Examples

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.ensemble import BaggingClassifier
    +
    from sklearn.ensemble import BaggingClassifier
     from sklearn.tree import DecisionTreeClassifier
     
     bag_clf = BaggingClassifier(
    @@ -2096,70 +1683,25 @@ bag_clf = BaggingClassifier(
         max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
     bag_clf.fit(X_train, y_train)
     y_pred = bag_clf.predict(X_test)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     print(accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    tree_clf = DecisionTreeClassifier(random_state=42)
    +
    tree_clf = DecisionTreeClassifier(random_state=42)
     tree_clf.fit(X_train, y_train)
     y_pred_tree = tree_clf.predict(X_test)
     print(accuracy_score(y_test, y_pred_tree))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from matplotlib.colors import ListedColormap
    +
    from matplotlib.colors import ListedColormap
     
     def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):
         x1s = np.linspace(axes[0], axes[1], 100)
    @@ -2186,36 +1728,19 @@ plot_decision_boundary(bag_clf, X, y)
     plt.title("Decision Trees with Bagging", fontsize=14)
     save_fig("baggingtree")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Making your own Bootstrap: Changing the Level of the Decision Tree

    -

    Let us bring up our good old boostrap example from the linear regression lectures. We change the linerar regression algorithm with +

    Making your own Bootstrap: Changing the Level of the Decision Tree

    + +

    +Let us bring up our good old boostrap example from the linear regression lectures. We change the linerar regression algorithm with a decision tree wth different depths and perform a bootstrap aggregate (in this case we perform as many bootstraps as data points \( n \)). -

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.pipeline import make_pipeline
    @@ -2272,81 +1797,69 @@ plt.plot(polydegree, variance, label.legend()
     save_fig("baggingboot")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Why Voting?

    -

    The idea behind boosting, and voting as well can be phrased as follows: +

    Why Voting?

    + +

    +The idea behind boosting, and voting as well can be phrased as follows: Can a group of people somehow arrive at highly reasoned decisions, despite the weak judgement of the individual members? -

    -

    The aim is to create a good classifier by combining several weak classifiers. +

    +The aim is to create a good classifier by combining several weak classifiers. A weak classifier is a classifier which is able to produce results that are only slightly better than guessing at random. -

    -

    The basic approach is to apply repeatedly (in boosting this is done in an iterative way) a weak classifier to modifications of the data. +

    +The basic approach is to apply repeatedly (in boosting this is done in an iterative way) a weak classifier to modifications of the data. In voting we simply apply the law of large numbers while in boosting we give more weight to misclassified data in -each iteration. -

    +each iteration. -

    Decision trees play an important role as our weak classifier. They serve as the basic method.

    +

    +Decision trees play an important role as our weak classifier. They serve as the basic method. +











    -

    Tossing coins

    -

    The simplest case is a so-called voting ensemble. To illustrate this, +

    Tossing coins

    + +

    +The simplest case is a so-called voting ensemble. To illustrate this, think of yourself tossing coins with a biased outcome of 51 per cent for heads and 49% for tails. With only few tosses, you may not clearly see this distribution for heads and tails. However, after some thousands of tosses, there will be a clear majority of heads. With 2000 tosses you should see approximately 1020 heads and 980 tails. -

    -

    We can then state that the outcome is a clear majority of heads. If +

    +We can then state that the outcome is a clear majority of heads. If you do this ten thousand times, it is easy to see that there is a 97% likelihood of a majority of heads. -

    -

    Another example would be to collect all polls before an +

    +Another example would be to collect all polls before an election. Different polls may show different likelihoods for a candidate winning with say a majority of the popular vote. The majority vote would then consist in many polls indicating that this candidate will actually win. -

    -

    The example here shows how we can implement the coin tossing case, +

    +The example here shows how we can implement the coin tossing case, clealry demostrating that after some tosses we see the law of large numbers kicking in. -

    +











    -

    Standard imports first

    +

    Standard imports first

    + +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     from IPython.display import Image 
     from pydot import graph_from_dot_data
     import pandas as pd
    @@ -2383,32 +1896,15 @@ DATA_ID = "
     
     def save_fig(fig_id):
         plt.savefig(image_path(fig_id) + ".png", format='png')
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Simple Voting Example, head or tail

    + +

    Simple Voting Example, head or tail

    +

    -

    -
    -
    -
    -
    -
    # Common imports
    +
    # Common imports
     import numpy as np
     import matplotlib
     import matplotlib.pyplot as plt
    @@ -2430,34 +1926,18 @@ plt.legend(loc=
     plt.axis([0, 10000, 0.42, 0.58])
     save_fig("votingsimple")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Using the Voting Classifier

    -

    We can use the voting classifier on other data sets, here the exciting binary case of two distinct objects using the make moons functionality of Scikit-Learn.

    +

    Using the Voting Classifier

    + +

    +We can use the voting classifier on other data sets, here the exciting binary case of two distinct objects using the make moons functionality of Scikit-Learn. +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -2499,33 +1979,16 @@ voting_clf.fit(X_train, y_train)
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Voting and Bagging

    +

    Voting and Bagging

    + +

    -

    -
    -
    -
    -
    -
    from sklearn.model_selection import train_test_split
    +
    from sklearn.model_selection import train_test_split
     from sklearn.datasets import make_moons
     
     X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
    @@ -2543,51 +2006,21 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='hard')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    log_clf = LogisticRegression(random_state=42)
    +
    log_clf = LogisticRegression(random_state=42)
     rnd_clf = RandomForestClassifier(random_state=42)
     svm_clf = SVC(probability=True, random_state=42)
     
    @@ -2595,76 +2028,49 @@ voting_clf = VotingClassifier(
         estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
         voting='soft')
     voting_clf.fit(X_train, y_train)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    from sklearn.metrics import accuracy_score
    +
    from sklearn.metrics import accuracy_score
     
     for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
         clf.fit(X_train, y_train)
         y_pred = clf.predict(X_test)
         print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Random forests

    -

    Random forests provide an improvement over bagged trees by way of a -small tweak that decorrelates the trees. -

    +

    Random forests

    -

    As in bagging, we build a +

    +Random forests provide an improvement over bagged trees by way of a +small tweak that decorrelates the trees. + +

    +As in bagging, we build a number of decision trees on bootstrapped training samples. But when building these decision trees, each time a split in a tree is considered, a random sample of \( m \) predictors is chosen as split candidates from the full set of \( p \) predictors. The split is allowed to -use only one of those \( m \) predictors. -

    +use only one of those \( m \) predictors. -

    A fresh sample of \( m \) predictors is +

    +A fresh sample of \( m \) predictors is taken at each split, and typically we choose -

    $$ m\approx \sqrt{p}. $$ -

    In building a random forest, at +

    +In building a random forest, at each split in the tree, the algorithm is not even allowed to consider -a majority of the available predictors. -

    +a majority of the available predictors. -

    The reason for this is rather clever. Suppose that there is one very +

    +The reason for this is rather clever. Suppose that there is one very strong predictor in the data set, along with a number of other moderately strong predictors. Then in the collection of bagged variable importance random forest trees, most or all of the trees will @@ -2676,36 +2082,41 @@ lead to as large of a reduction in variance as averaging many uncorrelated quantities. In particular, this means that bagging will not lead to a substantial reduction in variance over a single tree in this setting. -

    +











    -

    Random Forest Algorithm

    -

    The algorithm described here can be applied to both classification and regression problems.

    -

    We will grow of forest of say \( B \) trees.

    +

    Random Forest Algorithm

    +The algorithm described here can be applied to both classification and regression problems. + +

    +We will grow of forest of say \( B \) trees. +

    1. For \( b=1:B \)
    2. +
      • Draw a bootstrap sample from the training data organized in our \( \boldsymbol{X} \) matrix.
      • We grow then a random forest tree \( T_b \) based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached
      • +
        1. we select \( m \le p \) variables at random from the \( p \) predictors/features
        2. pick the best split point among the \( m \) features using for example the CART algorithm and create a new node
        3. split the node into daughter nodes
        +
      +
    3. Output then the ensemble of trees \( \{T_b\}_1^{B} \) and make predictions for either a regression type of problem or a classification type of problem.
    +









    -

    Random Forests Compared with other Methods on the Cancer Data

    + +

    Random Forests Compared with other Methods on the Cancer Data

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -2771,374 +2182,362 @@ skplt.metrics.<
     plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -

    Recall that the cumulative gains curve shows the percentage of the +

    +

    +Recall that the cumulative gains curve shows the percentage of the overall number of cases in a given category gained by targeting a percentage of the total number of cases. -

    -

    Similarly, the receiver operating characteristic curve, or ROC curve, +

    +Similarly, the receiver operating characteristic curve, or ROC curve, displays the diagnostic ability of a binary classifier system as its discrimination threshold is varied. It plots the true positive rate against the false positive rate. -

    +











    -

    Compare Bagging on Trees with Random Forests

    + +

    Compare Bagging on Trees with Random Forests

    +

    -

    -
    -
    -
    -
    -
    bag_clf = BaggingClassifier(
    +
    bag_clf = BaggingClassifier(
         DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
         n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +

    + -

    -
    -
    -
    -
    -
    bag_clf.fit(X_train, y_train)
    +
    bag_clf.fit(X_train, y_train)
     y_pred = bag_clf.predict(X_test)
     from sklearn.ensemble import RandomForestClassifier
     rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
     rnd_clf.fit(X_train, y_train)
     y_pred_rf = rnd_clf.predict(X_test)
     np.sum(y_pred == y_pred_rf) / len(y_pred) 
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Boosting, a Bird's Eye View

    -

    The basic idea is to combine weak classifiers in order to create a good +

    Boosting, a Bird's Eye View

    + +

    +The basic idea is to combine weak classifiers in order to create a good classifier. With a weak classifier we often intend a classifier which produces results which are only slightly better than we would get by random guesses. -

    -

    This is done by applying in an iterative way a weak (or a standard +

    +This is done by applying in an iterative way a weak (or a standard classifier like decision trees) to modify the data. In each iteration we emphasize those observations which are misclassified by weighting them with a factor. -

    +











    -

    What is boosting? Additive Modelling/Iterative Fitting

    -

    Boosting is a way of fitting an additive expansion in a set of +

    What is boosting? Additive Modelling/Iterative Fitting

    + +

    +Boosting is a way of fitting an additive expansion in a set of elementary basis functions like for example some simple polynomials. Assume for example that we have a function -

    $$ f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m), $$ -

    where \( \beta_m \) are the expansion parameters to be determined in a +

    +where \( \beta_m \) are the expansion parameters to be determined in a minimization process and \( b(x;\gamma_m) \) are some simple functions of the multivariable parameter \( x \) which is characterized by the parameters \( \gamma_m \). -

    -

    As an example, consider the Sigmoid function we used in logistic +

    +As an example, consider the Sigmoid function we used in logistic regression. In that case, we can translate the function \( b(x;\gamma_m) \) into the Sigmoid function -

    $$ \sigma(t) = \frac{1}{1+\exp{(-t)}}, $$ -

    where \( t=\gamma_0+\gamma_1 x \) and the parameters \( \gamma_0 \) and +

    +where \( t=\gamma_0+\gamma_1 x \) and the parameters \( \gamma_0 \) and \( \gamma_1 \) were determined by the Logistic Regression fitting algorithm. -

    -

    As another example, consider the cost function we defined for linear regression

    +

    +As another example, consider the cost function we defined for linear regression $$ C(\boldsymbol{y},\boldsymbol{f}) = \frac{1}{n} \sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    In this case the function \( f(x) \) was replaced by the design matrix +

    +In this case the function \( f(x) \) was replaced by the design matrix \( \boldsymbol{X} \) and the unknown linear regression parameters \( \boldsymbol{\beta} \), that is \( \boldsymbol{f}=\boldsymbol{X}\boldsymbol{\beta} \). In linear regression we can simply invert a matrix and obtain the parameters \( \beta \) by -

    $$ \boldsymbol{\beta}=\left(\boldsymbol{X}^T\boldsymbol{X}\right)^{-1}\boldsymbol{X}^T\boldsymbol{y}. $$ -

    In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters \( \beta_m \) and \( \gamma_m \).

    +

    +In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters \( \beta_m \) and \( \gamma_m \). +











    -

    Iterative Fitting, Regression and Squared-error Cost Function

    -

    The way we proceed is as follows (here we specialize to the squared-error cost function)

    +

    Iterative Fitting, Regression and Squared-error Cost Function

    + +

    +The way we proceed is as follows (here we specialize to the squared-error cost function)

    1. Establish a cost function, here \( {\cal C}(\boldsymbol{y},\boldsymbol{f}) = \frac{1}{n} \sum_{i=0}^{n-1}(y_i-f_M(x_i))^2 \) with \( f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m) \).
    2. Initialize with a guess \( f_0(x) \). It could be one or even zero or some random numbers.
    3. For \( m=1:M \) +
      1. minimize \( \sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta b(x;\gamma))^2 \) wrt \( \gamma \) and \( \beta \)
      2. This gives the optimal values \( \beta_m \) and \( \gamma_m \)
      3. Determine then the new values \( f_m(x)=f_{m-1}(x) +\beta_m b(x;\gamma_m) \)
      +
    -

    We could use any of the algorithms we have discussed till now. If we + +We could use any of the algorithms we have discussed till now. If we use trees, \( \gamma \) parameterizes the split variables and split points at the internal nodes, and the predictions at the terminal nodes. -

    +











    -

    Squared-Error Example and Iterative Fitting

    -

    To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function.

    +

    Squared-Error Example and Iterative Fitting

    -

    For simplicity we assume also that our functions \( b(x;\gamma)=1+\gamma x \).

    +

    +To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function. -

    This means that for every iteration \( m \), we need to optimize

    +

    +For simplicity we assume also that our functions \( b(x;\gamma)=1+\gamma x \). + +

    +This means that for every iteration \( m \), we need to optimize $$ (\beta_m,\gamma_m) = \mathrm{argmin}_{\beta,\lambda}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta b(x;\gamma))^2=\sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\beta(1+\gamma x_i))^2. $$ -

    We start our iteration by simply setting \( f_0(x)=0 \). +

    +We start our iteration by simply setting \( f_0(x)=0 \). Taking the derivatives with respect to \( \beta \) and \( \gamma \) we obtain -

    $$ \frac{\partial {\cal C}}{\partial \beta} = -2\sum_{i}(1+\gamma x_i)(y_i-\beta(1+\gamma x_i))=0, $$ -

    and

    +and $$ \frac{\partial {\cal C}}{\partial \gamma} =-2\sum_{i}\beta x_i(y_i-\beta(1+\gamma x_i))=0. $$ -

    We can then rewrite these equations as (defining \( \boldsymbol{w}=\boldsymbol{e}+\gamma \boldsymbol{x}) \) with \( \boldsymbol{e} \) being the unit vector)

    +We can then rewrite these equations as (defining \( \boldsymbol{w}=\boldsymbol{e}+\gamma \boldsymbol{x}) \) with \( \boldsymbol{e} \) being the unit vector) $$ \gamma \boldsymbol{w}^T(\boldsymbol{y}-\beta\gamma \boldsymbol{w})=0, $$ -

    which gives us \( \beta = \boldsymbol{w}^T\boldsymbol{y}/(\boldsymbol{w}^T\boldsymbol{w}) \). Similarly we have

    +which gives us \( \beta = \boldsymbol{w}^T\boldsymbol{y}/(\boldsymbol{w}^T\boldsymbol{w}) \). Similarly we have $$ \beta\gamma \boldsymbol{x}^T(\boldsymbol{y}-\beta(1+\gamma \boldsymbol{x}))=0, $$ -

    which leads to \( \gamma =(\boldsymbol{x}^T\boldsymbol{y}-\beta\boldsymbol{x}^T\boldsymbol{e})/(\beta\boldsymbol{x}^T\boldsymbol{x}) \). Inserting -for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equation in the unknown \( \gamma \) and has to be solved numerically. -

    +

    +which leads to \( \gamma =(\boldsymbol{x}^T\boldsymbol{y}-\beta\boldsymbol{x}^T\boldsymbol{e})/(\beta\boldsymbol{x}^T\boldsymbol{x}) \). Inserting +for \( \beta \) gives us an equation for \( \gamma \). This is a non-linear equation in the unknown \( \gamma \) and has to be solved numerically. -

    The solution to these two equations gives us in turn \( \beta_1 \) and \( \gamma_1 \) leading to the new expression for \( f_1(x) \) as -\( f_1(x) = \beta_1(1+\gamma_1x) \). Doing this \( M \) times results in our final estimate for the function \( f \). -

    +

    +The solution to these two equations gives us in turn \( \beta_1 \) and \( \gamma_1 \) leading to the new expression for \( f_1(x) \) as +\( f_1(x) = \beta_1(1+\gamma_1x) \). Doing this \( M \) times results in our final estimate for the function \( f \). +











    -

    Iterative Fitting, Classification and AdaBoost

    -

    Let us consider a binary classification problem with two outcomes \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of +

    Iterative Fitting, Classification and AdaBoost

    + +

    +Let us consider a binary classification problem with two outcomes \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of observations. We define a classification function \( G(x) \) which produces a prediction taking one or the other of the two values \( \{-1,1\} \). -

    -

    The error rate of the training sample is then

    +

    +The error rate of the training sample is then $$ \mathrm{\overline{err}}=\frac{1}{n} \sum_{i=0}^{n-1} I(y_i\ne G(x_i)). $$ -

    The iterative procedure starts with defining a weak classifier whose +

    +The iterative procedure starts with defining a weak classifier whose error rate is barely better than random guessing. The iterative procedure in boosting is to sequentially apply a weak classification algorithm to repeatedly modified versions of the data producing a sequence of weak classifiers \( G_m(x) \). -

    -

    Here we will express our function \( f(x) \) in terms of \( G(x) \). That is

    +

    +Here we will express our function \( f(x) \) in terms of \( G(x) \). That is $$ f_M(x) = \sum_{i=1}^M \beta_m b(x;\gamma_m), $$ -

    will be a function of

    +will be a function of $$ G_M(x) = \mathrm{sign} \sum_{i=1}^M \alpha_m G_m(x). $$ - +











    -

    Adaptive Boosting, AdaBoost

    -

    In our iterative procedure we define thus

    +

    Adaptive Boosting, AdaBoost

    + +

    +In our iterative procedure we define thus $$ f_m(x) = f_{m-1}(x)+\beta_mG_m(x). $$ -

    The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the +

    +The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the exponential cost/loss function defined as -

    $$ C(\boldsymbol{y},\boldsymbol{f}) = \sum_{i=0}^{n-1}\exp{(-y_i(f_{m-1}(x_i)+\beta G(x_i))}. $$ -

    We optimize \( \beta \) and \( G \) for each value of \( m=1:M \) as we did in the regression case. +

    +We optimize \( \beta \) and \( G \) for each value of \( m=1:M \) as we did in the regression case. This is normally done in two steps. Let us however first rewrite the cost function as -

    $$ C(\boldsymbol{y},\boldsymbol{f}) = \sum_{i=0}^{n-1}w_i^{m}\exp{(-y_i\beta G(x_i))}, $$ -

    where we have defined \( w_i^m= \exp{(-y_if_{m-1}(x_i))} \).

    +where we have defined \( w_i^m= \exp{(-y_if_{m-1}(x_i))} \). +











    -

    Building up AdaBoost

    -

    First, for any \( \beta > 0 \), we optimize \( G \) by setting

    +

    Building up AdaBoost

    + +

    +First, for any \( \beta > 0 \), we optimize \( G \) by setting $$ G_m(x) = \mathrm{sign} \sum_{i=0}^{n-1} w_i^m I(y_i \ne G_(x_i)), $$ -

    which is the classifier that minimizes the weighted error rate in predicting \( y \).

    +which is the classifier that minimizes the weighted error rate in predicting \( y \). -

    We can do this by rewriting

    +

    +We can do this by rewriting $$ \exp{-(\beta)}\sum_{y_i=G(x_i)}w_i^m+\exp{(\beta)}\sum_{y_i\ne G(x_i)}w_i^m, $$ -

    which can be rewritten as

    +which can be rewritten as $$ (\exp{(\beta)}-\exp{-(\beta)})\sum_{i=0}^{n-1}w_i^mI(y_i\ne G(x_i))+\exp{(-\beta)}\sum_{i=0}^{n-1}w_i^m=0, $$ -

    which leads to

    +which leads to $$ \beta_m = \frac{1}{2}\log{\frac{1-\mathrm{\overline{err}}}{\mathrm{\overline{err}}}}, $$ -

    where we have redefined the error as

    +where we have redefined the error as $$ \mathrm{\overline{err}}_m=\frac{1}{n}\frac{\sum_{i=0}^{n-1}w_i^mI(y_i\ne G(x_i)}{\sum_{i=0}^{n-1}w_i^m}, $$ -

    which leads to an update of

    +which leads to an update of $$ f_m(x) = f_{m-1}(x) +\beta_m G_m(x). $$ -

    This leads to the new weights

    +This leads to the new weights $$ w_i^{m+1} = w_i^m \exp{(-y_i\beta_m G_m(x_i))} $$ - +











    -

    Adaptive boosting: AdaBoost, Basic Algorithm

    -

    The algorithm here is rather straightforward. Assume that our weak +

    Adaptive boosting: AdaBoost, Basic Algorithm

    + +

    +The algorithm here is rather straightforward. Assume that our weak classifier is a decision tree and we consider a binary set of outputs with \( y_i \in \{-1,1\} \) and \( i=0,1,2,\dots,n-1 \) as our set of observations. Our design matrix is given in terms of the feature/predictor vectors \( \boldsymbol{X}=[\boldsymbol{x}_0\boldsymbol{x}_1\dots\boldsymbol{x}_{p-1}] \). Finally, we define also a -classifier determined by our data via a function \( G(x) \). This function tells us how well we are able to classify our outputs/targets \( \boldsymbol{y} \). -

    +classifier determined by our data via a function \( G(x) \). This function tells us how well we are able to classify our outputs/targets \( \boldsymbol{y} \). -

    We have already defined the misclassification error \( \mathrm{err} \) as

    +

    +We have already defined the misclassification error \( \mathrm{err} \) as $$ \mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(x_i)), $$ -

    where the function \( I() \) is one if we misclassify and zero if we classify correctly.

    +where the function \( I() \) is one if we misclassify and zero if we classify correctly. +











    -

    Basic Steps of AdaBoost

    -

    With the above definitions we are now ready to set up the algorithm for AdaBoost. +

    Basic Steps of AdaBoost

    + +

    +With the above definitions we are now ready to set up the algorithm for AdaBoost. The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases. -

    +
    1. We start by initializing all weights to \( w_i = 1/n \), with \( i=0,1,2,\dots n-1 \). It is easy to see that we must have \( \sum_{i=0}^{n-1}w_i = 1 \).
    2. We rewrite the misclassification error as
    + $$ \mathrm{\overline{err}}_m=\frac{\sum_{i=0}^{n-1}w_i^m I(y_i\ne G(x_i))}{\sum_{i=0}^{n-1}w_i}, $$ +
    1. Then we start looping over all attempts at classifying, namely we start an iterative process for \( m=1:M \), where \( M \) is the final number of classifications. Our given classifier could for example be a plain decision tree. +
      1. Fit then a given classifier to the training set using the weights \( w_i \).
      2. Compute then \( \mathrm{err} \) and figure out which events are classified properly and which are classified wrongly.
      3. Define a quantity \( \alpha_{m} = \log{(1-\mathrm{\overline{err}}_m)/\mathrm{\overline{err}}_m} \)
      4. Set the new weights to \( w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(x_i)} \).
      +
    2. Compute the new classifier \( G(x)= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(x_i) \).
    -

    For the iterations with \( m \le 2 \) the weights are modified + +For the iterations with \( m \le 2 \) the weights are modified individually at each steps. The observations which were misclassified at iteration \( m-1 \) have a weight which is larger than those which were classified properly. As this proceeds, the observations which were difficult to classifiy correctly are given a larger influence. Each new classification step \( m \) is then forced to concentrate on those observations that are missed in the previous iterations. -

    +











    -

    AdaBoost Examples

    -

    Using Scikit-Learn it is easy to apply the adaptive boosting algorithm, as done here.

    +

    AdaBoost Examples

    +

    +Using Scikit-Learn it is easy to apply the adaptive boosting algorithm, as done here. + +

    -

    -
    -
    -
    -
    -
    from sklearn.ensemble import AdaBoostClassifier
    +
    from sklearn.ensemble import AdaBoostClassifier
     
     ada_clf = AdaBoostClassifier(
         DecisionTreeClassifier(max_depth=1), n_estimators=200,
    @@ -3159,115 +2558,114 @@ skplt.metrics.<
     plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent

    -

    Gradient boosting is again a similar technique to Adaptive boosting, +

    Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent

    + +

    +Gradient boosting is again a similar technique to Adaptive boosting, it combines so-called weak classifiers or regressors into a strong method via a series of iterations. -

    -

    In order to understand the method, let us illustrate its basics by +

    +In order to understand the method, let us illustrate its basics by bringing back the essential steps in linear regression, where our cost function was the least squares function. -

    +











    -

    The Squared-Error again! Steepest Descent

    -

    We start again with our cost function \( {\cal C}(\boldsymbol{y}m\boldsymbol{f})=\sum_{i=0}^{n-1}{\cal L}(y_i, f(x_i)) \) where we want to minimize +

    The Squared-Error again! Steepest Descent

    + +

    +We start again with our cost function \( {\cal C}(\boldsymbol{y}m\boldsymbol{f})=\sum_{i=0}^{n-1}{\cal L}(y_i, f(x_i)) \) where we want to minimize This means that for every iteration, we need to optimize -

    $$ (\hat{\boldsymbol{f}}) = \mathrm{argmin}_{\boldsymbol{f}}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    We define a real function \( h_m(x) \) that defines our final function \( f_M(x) \) as

    +

    +We define a real function \( h_m(x) \) that defines our final function \( f_M(x) \) as $$ f_M(x) = \sum_{m=0}^M h_m(x). $$ -

    In the steepest decent approach we approximate \( h_m(x) = -\rho_m g_m(x) \), where \( \rho_m \) is a scalar and \( g_m(x) \) the gradient defined as

    +

    +In the steepest decent approach we approximate \( h_m(x) = -\rho_m g_m(x) \), where \( \rho_m \) is a scalar and \( g_m(x) \) the gradient defined as $$ g_m(x_i) = \left[ \frac{\partial {\cal L}(y_i, f(x_i))}{\partial f(x_i)}\right]_{f(x_i)=f_{m-1}(x_i)}. $$ -

    With the new gradient we can update \( f_m(x) = f_{m-1}(x) -\rho_m g_m(x) \). Using the above squared-error function we see that +

    +With the new gradient we can update \( f_m(x) = f_{m-1}(x) -\rho_m g_m(x) \). Using the above squared-error function we see that the gradient is \( g_m(x_i) = -2(y_i-f(x_i)) \). -

    -

    Choosing \( f_0(x)=0 \) we obtain \( g_m(x) = -2y_i \) and inserting this into the minimization problem for the cost function we have

    +

    +Choosing \( f_0(x)=0 \) we obtain \( g_m(x) = -2y_i \) and inserting this into the minimization problem for the cost function we have $$ (\rho_1) = \mathrm{argmin}_{\rho}\hspace{0.1cm} \sum_{i=0}^{n-1}(y_i+2\rho y_i)^2. $$ - +











    -

    Steepest Descent Example

    -

    Optimizing with respect to \( \rho \) we obtain (taking the derivative) that \( \rho_1 = -1/2 \). We have then that

    +

    Steepest Descent Example

    + +

    +Optimizing with respect to \( \rho \) we obtain (taking the derivative) that \( \rho_1 = -1/2 \). We have then that $$ f_1(x) = f_{0}(x) -\rho_1 g_1(x)=-y_i. $$ -

    We can then proceed and compute

    +We can then proceed and compute $$ g_2(x_i) = \left[ \frac{\partial {\cal L}(y_i, f(x_i))}{\partial f(x_i)}\right]_{f(x_i)=f_{1}(x_i)=y_i}=-4y_i, $$ -

    and find a new value for \( \rho_2=-1/2 \) and continue till we have reached \( m=M \). We can modify the steepest descent method, or steepest boosting, by introducing what is called gradient boosting.

    +and find a new value for \( \rho_2=-1/2 \) and continue till we have reached \( m=M \). We can modify the steepest descent method, or steepest boosting, by introducing what is called gradient boosting. +











    -

    Gradient Boosting, algorithm

    -

    Steepest descent is however not much used, since it only optimizes \( f \) at a fixed set of \( n \) points, +

    Gradient Boosting, algorithm

    + +

    +Steepest descent is however not much used, since it only optimizes \( f \) at a fixed set of \( n \) points, so we do not learn a function that can generalize. However, we can modify the algorithm by -fitting a weak learner to approximate the negative gradient signal. -

    +fitting a weak learner to approximate the negative gradient signal. -

    Suppose we have a cost function \( C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i)) \) where \( y_i \) is our target and \( f(x_i) \) the function which is meant to model \( y_i \). The above cost function could be our standard squared-error function

    +

    +Suppose we have a cost function \( C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i)) \) where \( y_i \) is our target and \( f(x_i) \) the function which is meant to model \( y_i \). The above cost function could be our standard squared-error function $$ C(\boldsymbol{y},\boldsymbol{f})=\sum_{i=0}^{n-1}(y_i-f(x_i))^2. $$ -

    The way we proceed in an iterative fashion is to

    +

    +The way we proceed in an iterative fashion is to +

    1. Initialize our estimate \( f_0(x) \).
    2. For \( m=1:M \), we +
      1. compute the negative gradient vector \( \boldsymbol{u}_m = -\partial C(\boldsymbol{y},\boldsymbol{f})/\partial \boldsymbol{f}(x) \) at \( f(x) = f_{m-1}(x) \);
      2. fit the so-called base-learner to the negative gradient \( h_m(u_m,x) \);
      3. update the estimate \( f_m(x) = f_{m-1}(x)+h_m(u_m,x) \);
      +
    3. The final estimate is then \( f_M(x) = \sum_{m=1}^M h_m(u_m,x) \).
    +









    -

    Gradient Boosting, Examples of Regression

    + +

    Gradient Boosting, Examples of Regression

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.ensemble import GradientBoostingRegressor
    @@ -3313,32 +2711,15 @@ plt.plot(polydegree, variance, label.legend()
     save_fig("gdregression")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Gradient Boosting, Classification Example

    + +

    Gradient Boosting, Classification Example

    +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -3378,51 +2759,37 @@ plt.show()
     skplt.metrics.plot_cumulative_gain(y_test, y_probas)
     save_fig("gdclassiffiercgain")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    XGBoost: Extreme Gradient Boosting

    -

    XGBoost or Extreme Gradient +

    XGBoost: Extreme Gradient Boosting

    + +

    +XGBoost or Extreme Gradient Boosting, is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable. It implements machine learning algorithms under the Gradient Boosting framework. XGBoost provides a parallel tree boosting that solve many data science problems in a fast and accurate way. See the article by Chen and Guestrin. -

    -

    The authors design and build a highly scalable end-to-end tree +

    +The authors design and build a highly scalable end-to-end tree boosting system. It has a theoretically justified weighted quantile sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning. -

    -

    It is now the algorithm which wins essentially all ML competitions!!!

    +

    +It is now the algorithm which wins essentially all ML competitions!!! +











    -

    Regression Case

    +

    Regression Case

    + +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import train_test_split
     import xgboost as xgb
    @@ -3468,34 +2835,18 @@ plt.plot(polydegree, bias, label.plot(polydegree, variance, label='Variance')
     plt.legend()
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - +
    +











    -

    Xgboost on the Cancer Data

    -

    As you will see from the confusion matrix below, XGBoots does an excellent job on the Wisconsin cancer data and outperforms essentially all agorithms we have discussed till now.

    +

    Xgboost on the Cancer Data

    + +

    +As you will see from the confusion matrix below, XGBoots does an excellent job on the Wisconsin cancer data and outperforms essentially all agorithms we have discussed till now. +

    -

    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     import numpy as np
     from sklearn.model_selection import  train_test_split 
     from sklearn.datasets import load_breast_cancer
    @@ -3546,26 +2897,18 @@ xgb.plot_importance(xg_clf)
     plt.rcParams['figure.figsize'] = [5, 5]
     save_fig("xgparams")
     plt.show()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - +
    +

    + +

    © 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
    + + + diff --git a/doc/pub/week45/ipynb/ipynb-week45-src.tar.gz b/doc/pub/week45/ipynb/ipynb-week45-src.tar.gz index b424739dd61d316bb7427a0faf89af3862acf9c4..1b3d5b1f4c8e1a22bb9ac7cf4aa5db2eb0907802 100644 GIT binary patch delta 246216 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ⅆ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 L*F6wn&>AUEBpeFL(={yix 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 YEB}@M%75j*@_$DD2W=%m2LP-D0LPTT^8f$< delta 246915 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

    W^i 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 diff --git a/doc/pub/week45/ipynb/week45.ipynb b/doc/pub/week45/ipynb/week45.ipynb index 6a20f05e4..887022d0d 100644 --- a/doc/pub/week45/ipynb/week45.ipynb +++ b/doc/pub/week45/ipynb/week45.ipynb @@ -2,38 +2,20 @@ "cells": [ { "cell_type": "markdown", - "id": "999587fc", - "metadata": { - "editable": true - }, - "source": [ - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "id": "f3ea736a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ + "\n", "# Week 45: Decisions Trees, Random Forests, Bagging and Boosting\n", + "\n", + " \n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", "\n", - "Date: **Nov 9, 2021**\n", + "Date: **Nov 10, 2021**\n", + "\n", + "Copyright 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", + "\n", + "\n", "\n", - "Copyright 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license" - ] - }, - { - "cell_type": "markdown", - "id": "f4a62cf4", - "metadata": { - "editable": true - }, - "source": [ "## Overview of week 45\n", "\n", "* Thursday: Basics of Decision Trees, Bagging and Voting\n", @@ -46,20 +28,18 @@ "\n", "[Video on boosting methods by Hastie](https://www.youtube.com/watch?v=wPqtzj5VZus&ab_channel=H2O.ai).\n", "\n", + "\n", + "\n", "**Reading.**\n", "\n", - "1. Decision Trees: Geron's chapter 6 covers decision trees while ensemble models, voting and bagging are discussed in chapter 7. See also lecture from [STK-IN4300, lecture 7](https://www.uio.no/studier/emner/matnat/math/STK-IN4300/h20/slides/lecture_7.pdf). Chapter 9.2 of Hastie et al contains also a good discussion." - ] - }, - { - "cell_type": "markdown", - "id": "7d7e0a30", - "metadata": { - "editable": true - }, - "source": [ + "1. Decision Trees: Geron's chapter 6 covers decision trees while ensemble models, voting and bagging are discussed in chapter 7. See also lecture from [STK-IN4300, lecture 7](https://www.uio.no/studier/emner/matnat/math/STK-IN4300/h20/slides/lecture_7.pdf). Chapter 9.2 of Hastie et al contains also a good discussion.\n", + "\n", + "\n", + "\n", + "\n", "## Decision trees, overarching aims\n", "\n", + "\n", "We start here with the most basic algorithm, the so-called decision\n", "tree. With this basic algorithm we can in turn build more complex\n", "networks, spanning from homogeneous and heterogenous forests (bagging,\n", @@ -70,6 +50,7 @@ "Decision trees are supervised learning algorithms used for both,\n", "classification and regression tasks.\n", "\n", + "\n", "The main idea of decision trees\n", "is to find those descriptive features which contain the most\n", "**information** regarding the target feature and then split the dataset\n", @@ -79,16 +60,8 @@ "The descriptive features which reproduce best the target/output features are normally said\n", "to be the most informative ones. The process of finding the **most\n", "informative** feature is done until we accomplish a stopping criteria\n", - "where we then finally end up in so called **leaf nodes**." - ] - }, - { - "cell_type": "markdown", - "id": "f448055c", - "metadata": { - "editable": true - }, - "source": [ + "where we then finally end up in so called **leaf nodes**. \n", + "\n", "## Basics of a tree\n", "\n", "A decision tree is typically divided into a **root node**, the **interior nodes**,\n", @@ -99,58 +72,35 @@ "to our trained model. This is possible since the model has \n", "learned the underlying structure of the training data and hence can,\n", "given some assumptions, make predictions about the target feature value\n", - "(class) of unseen query instances." - ] - }, - { - "cell_type": "markdown", - "id": "0cacfbd6", - "metadata": { - "editable": true - }, - "source": [ + "(class) of unseen query instances.\n", + "\n", "## A Sketch of a Tree, Regression problem\n", "\n", - "" - ] - }, - { - "cell_type": "markdown", - "id": "09cac93a", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "\n", + "\n", + "\n", "## A Sketch of a Tree, Classification problem\n", "\n", - "" - ] - }, - { - "cell_type": "markdown", - "id": "9e7e3a96", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "\n", + "\n", + "\n", "## A typical Decision Tree with its pertinent Jargon, Classification Problem\n", "\n", "\n", "\n", "\n", - "

    Figure 1:

    \n", + "

    \n", + "\n", + "\n", "\n", "\n", - "This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using **Scikit-Learn**'s decision tree classifier. Here we have used the so-called **gini** index (see below) to split the various branches." - ] - }, - { - "cell_type": "markdown", - "id": "260a1d3f", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using **Scikit-Learn**'s decision tree classifier. Here we have used the so-called **gini** index (see below) to split the various branches.\n", + "\n", + "\n", + "\n", "## General Features\n", "\n", "The overarching approach to decision trees is a top-down approach.\n", @@ -164,18 +114,12 @@ "* An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.\n", "\n", "This process is then repeated for the subtree rooted at the new\n", - "node." - ] - }, - { - "cell_type": "markdown", - "id": "71e35330", - "metadata": { - "editable": true - }, - "source": [ + "node.\n", + "\n", + "\n", "## How do we set it up?\n", "\n", + "\n", "In simplified terms, the process of training a decision tree and\n", "predicting the target features of query instances is as follows:\n", "\n", @@ -187,26 +131,20 @@ "\n", "4. Show query instances to the tree and run down the tree until we arrive at leaf nodes\n", "\n", - "Then we are essentially done!" - ] - }, - { - "cell_type": "markdown", - "id": "c999b0f7", - "metadata": { - "editable": true - }, - "source": [ + "Then we are essentially done!\n", + "\n", + "\n", + "\n", + "\n", + "\n", "## Decision trees and Regression" ] }, { "cell_type": "code", "execution_count": 1, - "id": "d3154072", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -304,10 +242,7 @@ }, { "cell_type": "markdown", - "id": "f38fb41a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Building a tree, regression\n", "\n", @@ -326,10 +261,7 @@ }, { "cell_type": "markdown", - "id": "3f153956", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\sum_{j=1}^J\\sum_{i\\in R_j}(y_i-\\overline{y}_{R_j})^2,\n", @@ -338,22 +270,11 @@ }, { "cell_type": "markdown", - "id": "be1e684e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $\\overline{y}_{R_j}$ is the mean response for the training observations \n", - "within box $j$." - ] - }, - { - "cell_type": "markdown", - "id": "69f23ebf", - "metadata": { - "editable": true - }, - "source": [ + "within box $j$. \n", + "\n", "## A top-down approach, recursive binary splitting\n", "\n", "Unfortunately, it is computationally infeasible to consider every\n", @@ -366,16 +287,8 @@ "further down on the tree. It is greedy because at each step of the\n", "tree-building process, the best split is made at that particular step,\n", "rather than looking ahead and picking a split that will lead to a\n", - "better tree in some future step." - ] - }, - { - "cell_type": "markdown", - "id": "0c7546ee", - "metadata": { - "editable": true - }, - "source": [ + "better tree in some future step.\n", + "\n", "## Making a tree\n", "\n", "In order to implement the recursive binary splitting we start by selecting\n", @@ -384,10 +297,7 @@ }, { "cell_type": "markdown", - "id": "901c465d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\left\\{X\\vert x_j < s\\right\\},\n", @@ -396,20 +306,14 @@ }, { "cell_type": "markdown", - "id": "f193d5dc", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "5b6fee06", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\left\\{X\\vert x_j \\geq s\\right\\},\n", @@ -418,20 +322,14 @@ }, { "cell_type": "markdown", - "id": "fb7f787a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "so that we obtain the lowest MSE, that is" ] }, { "cell_type": "markdown", - "id": "76179adf", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\sum_{i:x_i\\in R_j}(y_i-\\overline{y}_{R_1})^2+\\sum_{i:x_i\\in R_2}(y_i-\\overline{y}_{R_2})^2,\n", @@ -440,10 +338,7 @@ }, { "cell_type": "markdown", - "id": "6c8ec2b3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which we want to minimize by considering all predictors\n", "$x_1,x_2,\\dots,x_p$. We consider also all possible values of $s$ for\n", @@ -468,16 +363,9 @@ "have three regions. Again, we look to split one of these three regions\n", "further, so as to minimize the MSE. The process continues until a\n", "stopping criterion is reached; for instance, we may continue until no\n", - "region contains more than five observations." - ] - }, - { - "cell_type": "markdown", - "id": "ee74a1ea", - "metadata": { - "editable": true - }, - "source": [ + "region contains more than five observations.\n", + "\n", + "\n", "## Pruning the tree\n", "\n", "The above procedure is rather straightforward, but leads often to\n", @@ -492,16 +380,8 @@ "we consider a sequence of trees indexed by a nonnegative tuning\n", "parameter $\\alpha$.\n", "\n", - "Read more at the following [Scikit-Learn link on pruning](https://scikit-learn.org/stable/auto_examples/tree/plot_cost_complexity_pruning.html#sphx-glr-auto-examples-tree-plot-cost-complexity-pruning-py)." - ] - }, - { - "cell_type": "markdown", - "id": "6ab80129", - "metadata": { - "editable": true - }, - "source": [ + "Read more at the following [Scikit-Learn link on pruning](https://scikit-learn.org/stable/auto_examples/tree/plot_cost_complexity_pruning.html#sphx-glr-auto-examples-tree-plot-cost-complexity-pruning-py).\n", + "\n", "## Cost complexity pruning\n", "\n", "For each value of $\\alpha$ there corresponds a subtree $T \\in T_0$ such that" @@ -509,10 +389,7 @@ }, { "cell_type": "markdown", - "id": "4fb3b414", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\sum_{m=1}^{\\overline{T}}\\sum_{i:x_i\\in R_m}(y_i-\\overline{y}_{R_m})^2+\\alpha\\overline{T},\n", @@ -521,10 +398,7 @@ }, { "cell_type": "markdown", - "id": "4a53cd13", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "is as small as possible. Here $\\overline{T}$ is \n", "the number of terminal nodes of the tree $T$ , $R_m$ is the\n", @@ -539,25 +413,20 @@ "having a tree with many terminal nodes. The above equation will\n", "tend to be minimized for a smaller subtree. \n", "\n", + "\n", "It turns out that as we increase $\\alpha$ from zero\n", "branches get pruned from the tree in a nested and predictable fashion,\n", "so obtaining the whole sequence of subtrees as a function of $\\alpha$ is\n", "easy. We can select a value of $\\alpha$ using a validation set or using\n", "cross-validation. We then return to the full data set and obtain the\n", - "subtree corresponding to $\\alpha$." - ] - }, - { - "cell_type": "markdown", - "id": "d4972eb3", - "metadata": { - "editable": true - }, - "source": [ + "subtree corresponding to $\\alpha$. \n", + "\n", + "\n", "## Schematic Regression Procedure\n", "\n", "**Building a Regression Tree.**\n", "\n", + "\n", "1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.\n", "\n", "2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of $\\alpha$.\n", @@ -570,16 +439,12 @@ "\n", " * Finally we average the results for each value of $\\alpha$, and pick $\\alpha$ to minimize the average error.\n", "\n", - "4. Return the subtree from Step 2 that corresponds to the chosen value of $\\alpha$." - ] - }, - { - "cell_type": "markdown", - "id": "fa21cd89", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "4. Return the subtree from Step 2 that corresponds to the chosen value of $\\alpha$.\n", + "\n", + "\n", + "\n", + "\n", "## A Classification Tree\n", "\n", "A classification tree is very similar to a regression tree, except\n", @@ -593,16 +458,8 @@ "classification tree, we are often interested not only in the class\n", "prediction corresponding to a particular terminal node region, but\n", "also in the class proportions among the training observations that\n", - "fall into that region." - ] - }, - { - "cell_type": "markdown", - "id": "ed9e140f", - "metadata": { - "editable": true - }, - "source": [ + "fall into that region. \n", + "\n", "## Growing a classification tree\n", "\n", "The task of growing a\n", @@ -620,16 +477,9 @@ "When building a classification tree, either the Gini index or the\n", "entropy are typically used to evaluate the quality of a particular\n", "split, since these two approaches are more sensitive to node purity\n", - "than is the classification error rate." - ] - }, - { - "cell_type": "markdown", - "id": "8339299a", - "metadata": { - "editable": true - }, - "source": [ + "than is the classification error rate. \n", + "\n", + "\n", "## Classification tree, how to split nodes\n", "\n", "If our targets are the outcome of a classification process that takes\n", @@ -644,22 +494,16 @@ }, { "cell_type": "markdown", - "id": "5a01e8b0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", - "p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i=k).\n", + "p_{mk} = \\frac{1}{N_m}\\sum_{i\\in R_m}I(y_i=k).\n", "$$" ] }, { "cell_type": "markdown", - "id": "3b46b1a0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We let $p_{mk}$ represent the majority class of observations in region\n", "$m$. The three most common ways of splitting a node are given by\n", @@ -669,32 +513,23 @@ }, { "cell_type": "markdown", - "id": "bf8cf60e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", - "p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i\\ne k) = 1-p_{mk}.\n", + "\\frac{1}{N_m}\\sum_{i\\in R_m}I(y_i\\ne k) = 1-p_{mk}.\n", "$$" ] }, { "cell_type": "markdown", - "id": "91bb9314", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "* Gini index $g$" ] }, { "cell_type": "markdown", - "id": "21041ba3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "g = \\sum_{k=1}^K p_{mk}(1-p_{mk}).\n", @@ -703,20 +538,14 @@ }, { "cell_type": "markdown", - "id": "27f57a10", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "* Information entropy or just entropy $s$" ] }, { "cell_type": "markdown", - "id": "28610811", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "s = -\\sum_{k=1}^K p_{mk}\\log{p_{mk}}.\n", @@ -725,10 +554,7 @@ }, { "cell_type": "markdown", - "id": "448db121", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Visualizing the Tree, Classification" ] @@ -736,10 +562,8 @@ { "cell_type": "code", "execution_count": 2, - "id": "daa33ec4", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -780,10 +604,7 @@ }, { "cell_type": "markdown", - "id": "c35660d4", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Visualizing the Tree, The Moons" ] @@ -791,10 +612,8 @@ { "cell_type": "code", "execution_count": 3, - "id": "20d3782d", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -826,10 +645,7 @@ }, { "cell_type": "markdown", - "id": "4b50c098", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Other ways of visualizing the trees\n", "\n", @@ -839,10 +655,8 @@ { "cell_type": "code", "execution_count": 4, - "id": "df24658e", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -857,10 +671,7 @@ }, { "cell_type": "markdown", - "id": "88327e54", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Printing out as text\n", "\n", @@ -871,10 +682,8 @@ { "cell_type": "code", "execution_count": 5, - "id": "cabfc0eb", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -890,10 +699,7 @@ }, { "cell_type": "markdown", - "id": "f9b97781", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Algorithms for Setting up Decision Trees\n", "\n", @@ -905,16 +711,8 @@ "We discuss both algorithms with applications here. The popular library\n", "**Scikit-Learn** uses the CART algorithm. For classification problems\n", "you can use either the **gini** index or the **entropy** to split a tree\n", - "in two branches." - ] - }, - { - "cell_type": "markdown", - "id": "6d158b95", - "metadata": { - "editable": true - }, - "source": [ + "in two branches.\n", + "\n", "## The CART algorithm for Classification\n", "\n", "For classification, the CART algorithm splits the data set in two subsets using a single feature $k$ and a threshold $t_k$.\n", @@ -927,10 +725,7 @@ }, { "cell_type": "markdown", - "id": "3916a0a9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}G_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}G_{\\mathrm{right}},\n", @@ -939,10 +734,7 @@ }, { "cell_type": "markdown", - "id": "35e64400", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $G_{\\mathrm{left/right}}$ measures the impurity of the left/right subset and $m_{\\mathrm{left/right}}$\n", " is the number of instances in the left/right subset\n", @@ -951,16 +743,8 @@ "and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the\n", "$max\\_depth$ hyperparameter), or if it cannot find a split that will reduce impurity. A few other\n", "hyperparameters control additional stopping conditions such as the $min\\_samples\\_split$,\n", - "$min\\_samples\\_leaf$, $min\\_weight\\_fraction\\_leaf$, and $max\\_leaf\\_nodes$." - ] - }, - { - "cell_type": "markdown", - "id": "6b6f2758", - "metadata": { - "editable": true - }, - "source": [ + "$min\\_samples\\_leaf$, $min\\_weight\\_fraction\\_leaf$, and $max\\_leaf\\_nodes$.\n", + "\n", "## The CART algorithm for Regression\n", "\n", "The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the\n", @@ -969,10 +753,7 @@ }, { "cell_type": "markdown", - "id": "56a085e6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}\\mathrm{MSE}_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}\\mathrm{MSE}_{\\mathrm{right}}.\n", @@ -981,20 +762,14 @@ }, { "cell_type": "markdown", - "id": "fa6f435c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Here the MSE for a specific node is defined as" ] }, { "cell_type": "markdown", - "id": "8afa690b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathrm{MSE}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}(\\overline{y}_{\\mathrm{node}}-y_i)^2,\n", @@ -1003,20 +778,14 @@ }, { "cell_type": "markdown", - "id": "1b9c7d84", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "with" ] }, { "cell_type": "markdown", - "id": "1af13ff9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\overline{y}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}y_i,\n", @@ -1025,24 +794,14 @@ }, { "cell_type": "markdown", - "id": "aa4dc553", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "the mean value of all observations in a specific node.\n", "\n", "Without any regularization, the regression task for decision trees, \n", - "just like for classification tasks, is prone to overfitting." - ] - }, - { - "cell_type": "markdown", - "id": "aa1afc4e", - "metadata": { - "editable": true - }, - "source": [ + "just like for classification tasks, is prone to overfitting.\n", + "\n", + "\n", "## Computing the Gini index\n", "\n", "The example we will look at is a classical one in many Machine\n", @@ -1057,7 +816,7 @@ "humidity and weak and strong for wind.\n", "\n", "The table here summarizes the various attributes and\n", - "\n", + "
    \n", "\n", "\n", "\n", @@ -1077,26 +836,16 @@ "\n", "\n", "\n", - "
    Day Outlook Temperature Humidity Wind Ride
    13 Overcast Hot Normal Weak 1
    14 Rain Mild High Strong 0
    " - ] - }, - { - "cell_type": "markdown", - "id": "391b026f", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "\n", "## Simple Python Code to read in Data and perform Classification" ] }, { "cell_type": "code", "execution_count": 6, - "id": "5d786a97", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1171,10 +920,7 @@ }, { "cell_type": "markdown", - "id": "2ed48016", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Computing the Gini Factor\n", "\n", @@ -1189,10 +935,8 @@ { "cell_type": "code", "execution_count": 7, - "id": "a3b26fd1", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1260,10 +1004,7 @@ }, { "cell_type": "markdown", - "id": "2896b4f4", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Entropy and the ID3 algorithm\n", "\n", @@ -1294,26 +1035,17 @@ "training examples according to their target classification.\n", "\n", "The ID3 algorithm uses this information gain measure to select among the candidate\n", - "attributes at each step while growing the tree." - ] - }, - { - "cell_type": "markdown", - "id": "fea0e5e6", - "metadata": { - "editable": true - }, - "source": [ + "attributes at each step while growing the tree.\n", + "\n", + "\n", "## Cancer Data again now with Decision Trees and other Methods" ] }, { "cell_type": "code", "execution_count": 8, - "id": "1dbc948a", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1362,10 +1094,7 @@ }, { "cell_type": "markdown", - "id": "7b0d35e1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Another example, the moons again" ] @@ -1373,10 +1102,8 @@ { "cell_type": "code", "execution_count": 9, - "id": "ef709f87", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1448,10 +1175,7 @@ }, { "cell_type": "markdown", - "id": "e7a8b237", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Playing around with regions" ] @@ -1459,10 +1183,8 @@ { "cell_type": "code", "execution_count": 10, - "id": "c5be70d1", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1490,10 +1212,7 @@ }, { "cell_type": "markdown", - "id": "0c4d5dab", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Regression trees" ] @@ -1501,10 +1220,8 @@ { "cell_type": "code", "execution_count": 11, - "id": "0963d7fc", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1519,10 +1236,8 @@ { "cell_type": "code", "execution_count": 12, - "id": "689f738f", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1534,10 +1249,7 @@ }, { "cell_type": "markdown", - "id": "f476fc1b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Final regressor code" ] @@ -1545,10 +1257,8 @@ { "cell_type": "code", "execution_count": 13, - "id": "ec98869a", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1595,10 +1305,8 @@ { "cell_type": "code", "execution_count": 14, - "id": "ae89b603", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1634,10 +1342,7 @@ }, { "cell_type": "markdown", - "id": "f4c99932", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Pros and cons of trees, pros\n", "\n", @@ -1653,16 +1358,8 @@ "\n", "* Can model interactions between the different descriptive features\n", "\n", - "* Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)" - ] - }, - { - "cell_type": "markdown", - "id": "bcc7fb3d", - "metadata": { - "editable": true - }, - "source": [ + "* Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)\n", + "\n", "## Disadvantages\n", "\n", "* Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches\n", @@ -1681,16 +1378,9 @@ "\n", "However, by aggregating many decision trees, using methods like\n", "bagging, random forests, and boosting, the predictive performance of\n", - "trees can be substantially improved." - ] - }, - { - "cell_type": "markdown", - "id": "029c3b45", - "metadata": { - "editable": true - }, - "source": [ + "trees can be substantially improved.\n", + "\n", + "\n", "## Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods\n", "\n", "As stated above and seen in many of the examples discussed here about\n", @@ -1712,32 +1402,22 @@ "\n", "4. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)\n", "\n", - "We discuss these methods here." - ] - }, - { - "cell_type": "markdown", - "id": "597ecf99", - "metadata": { - "editable": true - }, - "source": [ + "We discuss these methods here.\n", + "\n", + "\n", "## An Overview of Ensemble Methods\n", "\n", "\n", "\n", "\n", - "

    Figure 1:

    \n", - "" - ] - }, - { - "cell_type": "markdown", - "id": "34ccd8a6", - "metadata": { - "editable": true - }, - "source": [ + "

    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "## Bagging\n", "\n", "The **plain** decision trees suffer from high\n", @@ -1750,16 +1430,9 @@ "\n", "**Bootstrap aggregation**, or just **bagging**, is a\n", "general-purpose procedure for reducing the variance of a statistical\n", - "learning method." - ] - }, - { - "cell_type": "markdown", - "id": "60285855", - "metadata": { - "editable": true - }, - "source": [ + "learning method. \n", + "\n", + "\n", "## More bagging\n", "\n", "Bagging typically results in improved accuracy\n", @@ -1782,26 +1455,16 @@ "trees. A large value indicates an important predictor. Similarly, in\n", "the context of bagging classification trees, we can add up the total\n", "amount that the Gini index is decreased by splits over a given\n", - "predictor, averaged over all $B$ trees." - ] - }, - { - "cell_type": "markdown", - "id": "da86704c", - "metadata": { - "editable": true - }, - "source": [ + "predictor, averaged over all $B$ trees.\n", + "\n", "## Simple Voting Example, head or tail" ] }, { "cell_type": "code", "execution_count": 15, - "id": "86f01d7b", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1822,10 +1485,7 @@ }, { "cell_type": "markdown", - "id": "66aa1558", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Using the Voting Classifier" ] @@ -1833,10 +1493,8 @@ { "cell_type": "code", "execution_count": 16, - "id": "1782fb88", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1887,10 +1545,7 @@ }, { "cell_type": "markdown", - "id": "f5aa4b7b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Please, not the moons again! Voting and Bagging" ] @@ -1898,10 +1553,8 @@ { "cell_type": "code", "execution_count": 17, - "id": "3c1a494b", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1928,10 +1581,8 @@ { "cell_type": "code", "execution_count": 18, - "id": "15cc6ef1", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1946,10 +1597,8 @@ { "cell_type": "code", "execution_count": 19, - "id": "d5380589", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1966,10 +1615,8 @@ { "cell_type": "code", "execution_count": 20, - "id": "2630974e", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -1983,10 +1630,7 @@ }, { "cell_type": "markdown", - "id": "4bb8f29b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Bagging Examples" ] @@ -1994,10 +1638,8 @@ { "cell_type": "code", "execution_count": 21, - "id": "47d6424f", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2014,10 +1656,8 @@ { "cell_type": "code", "execution_count": 22, - "id": "554b7c3e", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2028,10 +1668,8 @@ { "cell_type": "code", "execution_count": 23, - "id": "5cdabae8", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2044,10 +1682,8 @@ { "cell_type": "code", "execution_count": 24, - "id": "511564a7", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2082,10 +1718,7 @@ }, { "cell_type": "markdown", - "id": "2179d349", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Making your own Bootstrap: Changing the Level of the Decision Tree\n", "\n", @@ -2096,10 +1729,8 @@ { "cell_type": "code", "execution_count": 25, - "id": "42afc36e", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2165,10 +1796,7 @@ }, { "cell_type": "markdown", - "id": "5b790359", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Why Voting?\n", "\n", @@ -2184,16 +1812,8 @@ "In voting we simply apply the law of large numbers while in boosting we give more weight to misclassified data in\n", "each iteration. \n", "\n", - "Decision trees play an important role as our weak classifier. They serve as the basic method." - ] - }, - { - "cell_type": "markdown", - "id": "c3c7a9fd", - "metadata": { - "editable": true - }, - "source": [ + "Decision trees play an important role as our weak classifier. They serve as the basic method. \n", + "\n", "## Tossing coins\n", "\n", "The simplest case is a so-called voting ensemble. To illustrate this,\n", @@ -2215,26 +1835,16 @@ "\n", "The example here shows how we can implement the coin tossing case,\n", "clealry demostrating that after some tosses we see the [law of large](https://en.wikipedia.org/wiki/Law_of_large_numbers)\n", - "numbers kicking in." - ] - }, - { - "cell_type": "markdown", - "id": "50fc15a0", - "metadata": { - "editable": true - }, - "source": [ + "numbers kicking in.\n", + "\n", "## Standard imports first" ] }, { "cell_type": "code", "execution_count": 26, - "id": "c0b99f8c", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2279,10 +1889,7 @@ }, { "cell_type": "markdown", - "id": "69f8628e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Simple Voting Example, head or tail" ] @@ -2290,10 +1897,8 @@ { "cell_type": "code", "execution_count": 27, - "id": "805d4227", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2324,10 +1929,7 @@ }, { "cell_type": "markdown", - "id": "49717d4a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Using the Voting Classifier\n", "\n", @@ -2337,10 +1939,8 @@ { "cell_type": "code", "execution_count": 28, - "id": "34a0cc41", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2390,10 +1990,7 @@ }, { "cell_type": "markdown", - "id": "452d0656", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Voting and Bagging" ] @@ -2401,10 +1998,8 @@ { "cell_type": "code", "execution_count": 29, - "id": "de6fd29b", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2431,10 +2026,8 @@ { "cell_type": "code", "execution_count": 30, - "id": "37edc304", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2449,10 +2042,8 @@ { "cell_type": "code", "execution_count": 31, - "id": "e1f00841", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2469,10 +2060,8 @@ { "cell_type": "code", "execution_count": 32, - "id": "08dced6b", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2486,10 +2075,7 @@ }, { "cell_type": "markdown", - "id": "0ed0228e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Random forests\n", "\n", @@ -2509,10 +2095,7 @@ }, { "cell_type": "markdown", - "id": "bc05ef74", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "m\\approx \\sqrt{p}.\n", @@ -2521,10 +2104,7 @@ }, { "cell_type": "markdown", - "id": "ffb4b144", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "In building a random forest, at\n", "each split in the tree, the algorithm is not even allowed to consider\n", @@ -2541,16 +2121,9 @@ "lead to as large of a reduction in variance as averaging many\n", "uncorrelated quantities. In particular, this means that bagging will\n", "not lead to a substantial reduction in variance over a single tree in\n", - "this setting." - ] - }, - { - "cell_type": "markdown", - "id": "c75cd923", - "metadata": { - "editable": true - }, - "source": [ + "this setting.\n", + "\n", + "\n", "## Random Forest Algorithm\n", "The algorithm described here can be applied to both classification and regression problems.\n", "\n", @@ -2567,26 +2140,18 @@ "\n", "3. split the node into daughter nodes\n", "\n", - "4. Output then the ensemble of trees $\\{T_b\\}_1^{B}$ and make predictions for either a regression type of problem or a classification type of problem." - ] - }, - { - "cell_type": "markdown", - "id": "2e732ead", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "\n", + "4. Output then the ensemble of trees $\\{T_b\\}_1^{B}$ and make predictions for either a regression type of problem or a classification type of problem. \n", + "\n", "## Random Forests Compared with other Methods on the Cancer Data" ] }, { "cell_type": "code", "execution_count": 33, - "id": "befbdbd7", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2660,10 +2225,7 @@ }, { "cell_type": "markdown", - "id": "9173c1f7", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Recall that the cumulative gains curve shows the percentage of the\n", "overall number of cases in a given category *gained* by targeting a\n", @@ -2671,26 +2233,17 @@ "\n", "Similarly, the receiver operating characteristic curve, or ROC curve,\n", "displays the diagnostic ability of a binary classifier system as its\n", - "discrimination threshold is varied. It plots the true positive rate against the false positive rate." - ] - }, - { - "cell_type": "markdown", - "id": "9cb41a55", - "metadata": { - "editable": true - }, - "source": [ + "discrimination threshold is varied. It plots the true positive rate against the false positive rate.\n", + "\n", + "\n", "## Compare Bagging on Trees with Random Forests" ] }, { "cell_type": "code", "execution_count": 34, - "id": "d83311e2", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2702,10 +2255,8 @@ { "cell_type": "code", "execution_count": 35, - "id": "8cd7ddc3", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -2720,10 +2271,7 @@ }, { "cell_type": "markdown", - "id": "27c06676", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Boosting, a Bird's Eye View\n", "\n", @@ -2735,16 +2283,9 @@ "This is done by applying in an iterative way a weak (or a standard\n", "classifier like decision trees) to modify the data. In each iteration\n", "we emphasize those observations which are misclassified by weighting\n", - "them with a factor." - ] - }, - { - "cell_type": "markdown", - "id": "42ba5198", - "metadata": { - "editable": true - }, - "source": [ + "them with a factor.\n", + "\n", + "\n", "## What is boosting? Additive Modelling/Iterative Fitting\n", "\n", "Boosting is a way of fitting an additive expansion in a set of\n", @@ -2754,10 +2295,7 @@ }, { "cell_type": "markdown", - "id": "7d10fac1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f_M(x) = \\sum_{i=1}^M \\beta_m b(x;\\gamma_m),\n", @@ -2766,10 +2304,7 @@ }, { "cell_type": "markdown", - "id": "9e3039f9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $\\beta_m$ are the expansion parameters to be determined in a\n", "minimization process and $b(x;\\gamma_m)$ are some simple functions of\n", @@ -2783,10 +2318,7 @@ }, { "cell_type": "markdown", - "id": "afc02aa3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\sigma(t) = \\frac{1}{1+\\exp{(-t)}},\n", @@ -2795,10 +2327,7 @@ }, { "cell_type": "markdown", - "id": "a614ac0d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $t=\\gamma_0+\\gamma_1 x$ and the parameters $\\gamma_0$ and\n", "$\\gamma_1$ were determined by the Logistic Regression fitting\n", @@ -2809,10 +2338,7 @@ }, { "cell_type": "markdown", - "id": "a8df1b75", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{y},\\boldsymbol{f}) = \\frac{1}{n} \\sum_{i=0}^{n-1}(y_i-f(x_i))^2.\n", @@ -2821,10 +2347,7 @@ }, { "cell_type": "markdown", - "id": "f5fc30cf", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "In this case the function $f(x)$ was replaced by the design matrix\n", "$\\boldsymbol{X}$ and the unknown linear regression parameters $\\boldsymbol{\\beta}$,\n", @@ -2834,10 +2357,7 @@ }, { "cell_type": "markdown", - "id": "c7fe95ae", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{\\beta}=\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2846,21 +2366,11 @@ }, { "cell_type": "markdown", - "id": "2c6f0083", - "metadata": { - "editable": true - }, - "source": [ - "In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters $\\beta_m$ and $\\gamma_m$." - ] - }, - { - "cell_type": "markdown", - "id": "b73d8c2d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ + "In iterative fitting or additive modeling, we minimize the cost function with respect to the parameters $\\beta_m$ and $\\gamma_m$.\n", + "\n", + "\n", "## Iterative Fitting, Regression and Squared-error Cost Function\n", "\n", "The way we proceed is as follows (here we specialize to the squared-error cost function)\n", @@ -2877,18 +2387,12 @@ "\n", "c. Determine then the new values $f_m(x)=f_{m-1}(x) +\\beta_m b(x;\\gamma_m)$\n", "\n", + "\n", "We could use any of the algorithms we have discussed till now. If we\n", "use trees, $\\gamma$ parameterizes the split variables and split points\n", - "at the internal nodes, and the predictions at the terminal nodes." - ] - }, - { - "cell_type": "markdown", - "id": "5c6f971b", - "metadata": { - "editable": true - }, - "source": [ + "at the internal nodes, and the predictions at the terminal nodes.\n", + "\n", + "\n", "## Squared-Error Example and Iterative Fitting\n", "\n", "To better understand what happens, let us develop the steps for the iterative fitting using the above squared error function.\n", @@ -2900,10 +2404,7 @@ }, { "cell_type": "markdown", - "id": "e0ed27b3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "(\\beta_m,\\gamma_m) = \\mathrm{argmin}_{\\beta,\\lambda}\\hspace{0.1cm} \\sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\\beta b(x;\\gamma))^2=\\sum_{i=0}^{n-1}(y_i-f_{m-1}(x_i)-\\beta(1+\\gamma x_i))^2.\n", @@ -2912,10 +2413,7 @@ }, { "cell_type": "markdown", - "id": "fc9f5f4f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We start our iteration by simply setting $f_0(x)=0$. \n", "Taking the derivatives with respect to $\\beta$ and $\\gamma$ we obtain" @@ -2923,10 +2421,7 @@ }, { "cell_type": "markdown", - "id": "02c2ec22", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial {\\cal C}}{\\partial \\beta} = -2\\sum_{i}(1+\\gamma x_i)(y_i-\\beta(1+\\gamma x_i))=0,\n", @@ -2935,20 +2430,14 @@ }, { "cell_type": "markdown", - "id": "e2288bd2", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "98153a85", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial {\\cal C}}{\\partial \\gamma} =-2\\sum_{i}\\beta x_i(y_i-\\beta(1+\\gamma x_i))=0.\n", @@ -2957,20 +2446,14 @@ }, { "cell_type": "markdown", - "id": "c39e24a0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We can then rewrite these equations as (defining $\\boldsymbol{w}=\\boldsymbol{e}+\\gamma \\boldsymbol{x})$ with $\\boldsymbol{e}$ being the unit vector)" ] }, { "cell_type": "markdown", - "id": "afdfb641", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\gamma \\boldsymbol{w}^T(\\boldsymbol{y}-\\beta\\gamma \\boldsymbol{w})=0,\n", @@ -2979,20 +2462,14 @@ }, { "cell_type": "markdown", - "id": "3039d39b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which gives us $\\beta = \\boldsymbol{w}^T\\boldsymbol{y}/(\\boldsymbol{w}^T\\boldsymbol{w})$. Similarly we have" ] }, { "cell_type": "markdown", - "id": "2ce0aa48", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\beta\\gamma \\boldsymbol{x}^T(\\boldsymbol{y}-\\beta(1+\\gamma \\boldsymbol{x}))=0,\n", @@ -3001,25 +2478,16 @@ }, { "cell_type": "markdown", - "id": "119b9640", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which leads to $\\gamma =(\\boldsymbol{x}^T\\boldsymbol{y}-\\beta\\boldsymbol{x}^T\\boldsymbol{e})/(\\beta\\boldsymbol{x}^T\\boldsymbol{x})$. Inserting\n", "for $\\beta$ gives us an equation for $\\gamma$. This is a non-linear equation in the unknown $\\gamma$ and has to be solved numerically. \n", "\n", "The solution to these two equations gives us in turn $\\beta_1$ and $\\gamma_1$ leading to the new expression for $f_1(x)$ as\n", - "$f_1(x) = \\beta_1(1+\\gamma_1x)$. Doing this $M$ times results in our final estimate for the function $f$." - ] - }, - { - "cell_type": "markdown", - "id": "419822da", - "metadata": { - "editable": true - }, - "source": [ + "$f_1(x) = \\beta_1(1+\\gamma_1x)$. Doing this $M$ times results in our final estimate for the function $f$. \n", + "\n", + "\n", + "\n", "## Iterative Fitting, Classification and AdaBoost\n", "\n", "Let us consider a binary classification problem with two outcomes $y_i \\in \\{-1,1\\}$ and $i=0,1,2,\\dots,n-1$ as our set of\n", @@ -3031,10 +2499,7 @@ }, { "cell_type": "markdown", - "id": "1430356a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathrm{\\overline{err}}=\\frac{1}{n} \\sum_{i=0}^{n-1} I(y_i\\ne G(x_i)).\n", @@ -3043,10 +2508,7 @@ }, { "cell_type": "markdown", - "id": "c3a81493", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "The iterative procedure starts with defining a weak classifier whose\n", "error rate is barely better than random guessing. The iterative\n", @@ -3059,10 +2521,7 @@ }, { "cell_type": "markdown", - "id": "190028df", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f_M(x) = \\sum_{i=1}^M \\beta_m b(x;\\gamma_m),\n", @@ -3071,20 +2530,14 @@ }, { "cell_type": "markdown", - "id": "bbbca2ac", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "will be a function of" ] }, { "cell_type": "markdown", - "id": "7aee5d30", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "G_M(x) = \\mathrm{sign} \\sum_{i=1}^M \\alpha_m G_m(x).\n", @@ -3093,10 +2546,7 @@ }, { "cell_type": "markdown", - "id": "16cc7ab6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Adaptive Boosting, AdaBoost\n", "\n", @@ -3105,10 +2555,7 @@ }, { "cell_type": "markdown", - "id": "0e525c09", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f_m(x) = f_{m-1}(x)+\\beta_mG_m(x).\n", @@ -3117,10 +2564,7 @@ }, { "cell_type": "markdown", - "id": "df0326b4", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "The simplest possible cost function which leads (also simple from a computational point of view) to the AdaBoost algorithm is the\n", "exponential cost/loss function defined as" @@ -3128,10 +2572,7 @@ }, { "cell_type": "markdown", - "id": "07d19584", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{y},\\boldsymbol{f}) = \\sum_{i=0}^{n-1}\\exp{(-y_i(f_{m-1}(x_i)+\\beta G(x_i))}.\n", @@ -3140,10 +2581,7 @@ }, { "cell_type": "markdown", - "id": "76774593", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We optimize $\\beta$ and $G$ for each value of $m=1:M$ as we did in the regression case.\n", "This is normally done in two steps. Let us however first rewrite the cost function as" @@ -3151,10 +2589,7 @@ }, { "cell_type": "markdown", - "id": "bb66a839", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{y},\\boldsymbol{f}) = \\sum_{i=0}^{n-1}w_i^{m}\\exp{(-y_i\\beta G(x_i))},\n", @@ -3163,21 +2598,10 @@ }, { "cell_type": "markdown", - "id": "bcd0b507", - "metadata": { - "editable": true - }, - "source": [ - "where we have defined $w_i^m= \\exp{(-y_if_{m-1}(x_i))}$." - ] - }, - { - "cell_type": "markdown", - "id": "0c203949", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ + "where we have defined $w_i^m= \\exp{(-y_if_{m-1}(x_i))}$.\n", + "\n", "## Building up AdaBoost\n", "\n", "First, for any $\\beta > 0$, we optimize $G$ by setting" @@ -3185,10 +2609,7 @@ }, { "cell_type": "markdown", - "id": "415377f0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "G_m(x) = \\mathrm{sign} \\sum_{i=0}^{n-1} w_i^m I(y_i \\ne G_(x_i)),\n", @@ -3197,10 +2618,7 @@ }, { "cell_type": "markdown", - "id": "daaca279", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which is the classifier that minimizes the weighted error rate in predicting $y$.\n", "\n", @@ -3209,10 +2627,7 @@ }, { "cell_type": "markdown", - "id": "f7bfba93", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\exp{-(\\beta)}\\sum_{y_i=G(x_i)}w_i^m+\\exp{(\\beta)}\\sum_{y_i\\ne G(x_i)}w_i^m,\n", @@ -3221,20 +2636,14 @@ }, { "cell_type": "markdown", - "id": "4f6a2f84", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which can be rewritten as" ] }, { "cell_type": "markdown", - "id": "6858be89", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "(\\exp{(\\beta)}-\\exp{-(\\beta)})\\sum_{i=0}^{n-1}w_i^mI(y_i\\ne G(x_i))+\\exp{(-\\beta)}\\sum_{i=0}^{n-1}w_i^m=0,\n", @@ -3243,20 +2652,14 @@ }, { "cell_type": "markdown", - "id": "eecfcfb5", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which leads to" ] }, { "cell_type": "markdown", - "id": "cd73a579", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\beta_m = \\frac{1}{2}\\log{\\frac{1-\\mathrm{\\overline{err}}}{\\mathrm{\\overline{err}}}},\n", @@ -3265,20 +2668,14 @@ }, { "cell_type": "markdown", - "id": "33302d95", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where we have redefined the error as" ] }, { "cell_type": "markdown", - "id": "ce21db0f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathrm{\\overline{err}}_m=\\frac{1}{n}\\frac{\\sum_{i=0}^{n-1}w_i^mI(y_i\\ne G(x_i)}{\\sum_{i=0}^{n-1}w_i^m},\n", @@ -3287,20 +2684,14 @@ }, { "cell_type": "markdown", - "id": "1fd9965f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which leads to an update of" ] }, { "cell_type": "markdown", - "id": "2a092b92", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f_m(x) = f_{m-1}(x) +\\beta_m G_m(x).\n", @@ -3309,20 +2700,14 @@ }, { "cell_type": "markdown", - "id": "1553ca38", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "This leads to the new weights" ] }, { "cell_type": "markdown", - "id": "60bd5373", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "w_i^{m+1} = w_i^m \\exp{(-y_i\\beta_m G_m(x_i))}\n", @@ -3331,10 +2716,7 @@ }, { "cell_type": "markdown", - "id": "eace9c52", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Adaptive boosting: AdaBoost, Basic Algorithm\n", "\n", @@ -3351,10 +2733,7 @@ }, { "cell_type": "markdown", - "id": "8cb0caec", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathrm{err}=\\frac{1}{n}\\sum_{i=0}^{n-1}I(y_i\\ne G(x_i)),\n", @@ -3363,21 +2742,10 @@ }, { "cell_type": "markdown", - "id": "4545fb70", - "metadata": { - "editable": true - }, - "source": [ - "where the function $I()$ is one if we misclassify and zero if we classify correctly." - ] - }, - { - "cell_type": "markdown", - "id": "c8c0b69c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ + "where the function $I()$ is one if we misclassify and zero if we classify correctly. \n", + "\n", "## Basic Steps of AdaBoost\n", "\n", "With the above definitions we are now ready to set up the algorithm for AdaBoost.\n", @@ -3389,10 +2757,7 @@ }, { "cell_type": "markdown", - "id": "9a715091", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathrm{\\overline{err}}_m=\\frac{\\sum_{i=0}^{n-1}w_i^m I(y_i\\ne G(x_i))}{\\sum_{i=0}^{n-1}w_i},\n", @@ -3401,10 +2766,7 @@ }, { "cell_type": "markdown", - "id": "ebec62af", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "1. Then we start looping over all attempts at classifying, namely we start an iterative process for $m=1:M$, where $M$ is the final number of classifications. Our given classifier could for example be a plain decision tree.\n", "\n", @@ -3416,6 +2778,7 @@ "\n", "d. Set the new weights to $w_i = w_i\\times \\exp{(\\alpha_m I(y_i\\ne G(x_i)}$.\n", "\n", + "\n", "5. Compute the new classifier $G(x)= \\sum_{i=0}^{n-1}\\alpha_m I(y_i\\ne G(x_i)$.\n", "\n", "For the iterations with $m \\le 2$ the weights are modified\n", @@ -3424,16 +2787,10 @@ "classified properly. As this proceeds, the observations which were\n", "difficult to classifiy correctly are given a larger influence. Each\n", "new classification step $m$ is then forced to concentrate on those\n", - "observations that are missed in the previous iterations." - ] - }, - { - "cell_type": "markdown", - "id": "6df3a47f", - "metadata": { - "editable": true - }, - "source": [ + "observations that are missed in the previous iterations.\n", + "\n", + "\n", + "\n", "## AdaBoost Examples\n", "\n", "Using **Scikit-Learn** it is easy to apply the adaptive boosting algorithm, as done here." @@ -3442,10 +2799,8 @@ { "cell_type": "code", "execution_count": 36, - "id": "a762adfc", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -3474,10 +2829,7 @@ }, { "cell_type": "markdown", - "id": "38d12d89", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Gradient boosting: Basics with Steepest Descent/Functional Gradient Descent\n", "\n", @@ -3487,16 +2839,8 @@ "\n", "In order to understand the method, let us illustrate its basics by\n", "bringing back the essential steps in linear regression, where our cost\n", - "function was the least squares function." - ] - }, - { - "cell_type": "markdown", - "id": "1b792064", - "metadata": { - "editable": true - }, - "source": [ + "function was the least squares function.\n", + "\n", "## The Squared-Error again! Steepest Descent\n", "\n", "We start again with our cost function ${\\cal C}(\\boldsymbol{y}m\\boldsymbol{f})=\\sum_{i=0}^{n-1}{\\cal L}(y_i, f(x_i))$ where we want to minimize\n", @@ -3505,10 +2849,7 @@ }, { "cell_type": "markdown", - "id": "beaf036c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "(\\hat{\\boldsymbol{f}}) = \\mathrm{argmin}_{\\boldsymbol{f}}\\hspace{0.1cm} \\sum_{i=0}^{n-1}(y_i-f(x_i))^2.\n", @@ -3517,20 +2858,14 @@ }, { "cell_type": "markdown", - "id": "702b65a0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We define a real function $h_m(x)$ that defines our final function $f_M(x)$ as" ] }, { "cell_type": "markdown", - "id": "2652a1da", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f_M(x) = \\sum_{m=0}^M h_m(x).\n", @@ -3539,20 +2874,14 @@ }, { "cell_type": "markdown", - "id": "be287ca2", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "In the steepest decent approach we approximate $h_m(x) = -\\rho_m g_m(x)$, where $\\rho_m$ is a scalar and $g_m(x)$ the gradient defined as" ] }, { "cell_type": "markdown", - "id": "ff3901b6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "g_m(x_i) = \\left[ \\frac{\\partial {\\cal L}(y_i, f(x_i))}{\\partial f(x_i)}\\right]_{f(x_i)=f_{m-1}(x_i)}.\n", @@ -3561,10 +2890,7 @@ }, { "cell_type": "markdown", - "id": "5228f5fd", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "With the new gradient we can update $f_m(x) = f_{m-1}(x) -\\rho_m g_m(x)$. Using the above squared-error function we see that\n", "the gradient is $g_m(x_i) = -2(y_i-f(x_i))$.\n", @@ -3574,10 +2900,7 @@ }, { "cell_type": "markdown", - "id": "1e30448f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "(\\rho_1) = \\mathrm{argmin}_{\\rho}\\hspace{0.1cm} \\sum_{i=0}^{n-1}(y_i+2\\rho y_i)^2.\n", @@ -3586,10 +2909,7 @@ }, { "cell_type": "markdown", - "id": "5bd43cc1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Steepest Descent Example\n", "\n", @@ -3598,10 +2918,7 @@ }, { "cell_type": "markdown", - "id": "acaae452", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f_1(x) = f_{0}(x) -\\rho_1 g_1(x)=-y_i.\n", @@ -3610,20 +2927,14 @@ }, { "cell_type": "markdown", - "id": "022645ac", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We can then proceed and compute" ] }, { "cell_type": "markdown", - "id": "8e6bbfb4", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "g_2(x_i) = \\left[ \\frac{\\partial {\\cal L}(y_i, f(x_i))}{\\partial f(x_i)}\\right]_{f(x_i)=f_{1}(x_i)=y_i}=-4y_i,\n", @@ -3632,21 +2943,10 @@ }, { "cell_type": "markdown", - "id": "66ce0709", - "metadata": { - "editable": true - }, - "source": [ - "and find a new value for $\\rho_2=-1/2$ and continue till we have reached $m=M$. We can modify the steepest descent method, or steepest boosting, by introducing what is called **gradient boosting**." - ] - }, - { - "cell_type": "markdown", - "id": "8ac79309", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ + "and find a new value for $\\rho_2=-1/2$ and continue till we have reached $m=M$. We can modify the steepest descent method, or steepest boosting, by introducing what is called **gradient boosting**. \n", + "\n", "## Gradient Boosting, algorithm\n", "\n", "Steepest descent is however not much used, since it only optimizes $f$ at a fixed set of $n$ points,\n", @@ -3658,10 +2958,7 @@ }, { "cell_type": "markdown", - "id": "d562f162", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{y},\\boldsymbol{f})=\\sum_{i=0}^{n-1}(y_i-f(x_i))^2.\n", @@ -3670,10 +2967,7 @@ }, { "cell_type": "markdown", - "id": "9e609544", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "The way we proceed in an iterative fashion is to\n", "1. Initialize our estimate $f_0(x)$.\n", @@ -3686,26 +2980,17 @@ "\n", "c. update the estimate $f_m(x) = f_{m-1}(x)+h_m(u_m,x)$;\n", "\n", - "4. The final estimate is then $f_M(x) = \\sum_{m=1}^M h_m(u_m,x)$." - ] - }, - { - "cell_type": "markdown", - "id": "eced6bdc", - "metadata": { - "editable": true - }, - "source": [ + "\n", + "4. The final estimate is then $f_M(x) = \\sum_{m=1}^M h_m(u_m,x)$.\n", + "\n", "## Gradient Boosting, Examples of Regression" ] }, { "cell_type": "code", "execution_count": 37, - "id": "613e05cd", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -3759,10 +3044,7 @@ }, { "cell_type": "markdown", - "id": "77c76d85", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Gradient Boosting, Classification Example" ] @@ -3770,10 +3052,8 @@ { "cell_type": "code", "execution_count": 38, - "id": "af5a3843", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -3821,13 +3101,11 @@ }, { "cell_type": "markdown", - "id": "0ca37c1d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## XGBoost: Extreme Gradient Boosting\n", "\n", + "\n", "[XGBoost](https://github.com/dmlc/xgboost) or Extreme Gradient\n", "Boosting, is an optimized distributed gradient boosting library\n", "designed to be highly efficient, flexible and portable. It implements\n", @@ -3839,26 +3117,16 @@ "boosting system. It has a theoretically justified weighted quantile\n", "sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning.\n", "\n", - "It is now the algorithm which wins essentially all ML competitions!!!" - ] - }, - { - "cell_type": "markdown", - "id": "b2dd3360", - "metadata": { - "editable": true - }, - "source": [ + "It is now the algorithm which wins essentially all ML competitions!!!\n", + "\n", "## Regression Case" ] }, { "cell_type": "code", "execution_count": 39, - "id": "4bf9f894", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -3912,10 +3180,7 @@ }, { "cell_type": "markdown", - "id": "00b1f1af", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Xgboost on the Cancer Data\n", "\n", @@ -3925,10 +3190,8 @@ { "cell_type": "code", "execution_count": 40, - "id": "4454900b", "metadata": { - "collapsed": false, - "editable": true + "collapsed": false }, "outputs": [], "source": [ @@ -3989,5 +3252,5 @@ ], "metadata": {}, "nbformat": 4, - "nbformat_minor": 5 + "nbformat_minor": 4 } diff --git a/doc/src/week45/week45.do.txt b/doc/src/week45/week45.do.txt index f7dc247d1..3bc775cc3 100644 --- a/doc/src/week45/week45.do.txt +++ b/doc/src/week45/week45.do.txt @@ -412,7 +412,7 @@ observations of this class in the region $R_m$ as !bt \[ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i=k). +p_{mk} = \frac{1}{N_m}\sum_{i\in R_m}I(y_i=k). \] !et @@ -422,7 +422,7 @@ $m$. The three most common ways of splitting a node are given by * Misclassification error !bt \[ -p_{mk} = \frac{1}{N_m}\sum_{x_i\in R_m}I(y_i\ne k) = 1-p_{mk}. +\frac{1}{N_m}\sum_{i\in R_m}I(y_i\ne k) = 1-p_{mk}. \] !et * Gini index $g$

    XK#*`Fj+ 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