From b5a10fb2dc6176bbcd2a68785a1d143b80660a3c Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 31 Oct 2019 06:38:24 +0100 Subject: [PATCH] update on decision trees --- .../html/._DecisionTrees-bs000.html | 91 +-- .../html/._DecisionTrees-bs001.html | 89 +-- .../html/._DecisionTrees-bs002.html | 89 +-- .../html/._DecisionTrees-bs003.html | 89 +-- .../html/._DecisionTrees-bs004.html | 89 +-- .../html/._DecisionTrees-bs005.html | 89 +-- .../html/._DecisionTrees-bs006.html | 89 +-- .../html/._DecisionTrees-bs007.html | 89 +-- .../html/._DecisionTrees-bs008.html | 89 +-- .../html/._DecisionTrees-bs009.html | 89 +-- .../html/._DecisionTrees-bs010.html | 89 +-- .../html/._DecisionTrees-bs011.html | 89 +-- .../html/._DecisionTrees-bs012.html | 89 +-- .../html/._DecisionTrees-bs013.html | 89 +-- .../html/._DecisionTrees-bs014.html | 89 +-- .../html/._DecisionTrees-bs015.html | 89 +-- .../html/._DecisionTrees-bs016.html | 299 +++----- .../html/._DecisionTrees-bs017.html | 143 ++-- .../html/._DecisionTrees-bs018.html | 130 ++-- .../html/._DecisionTrees-bs019.html | 180 +++-- .../html/._DecisionTrees-bs020.html | 221 +++--- .../html/._DecisionTrees-bs021.html | 135 ++-- .../html/._DecisionTrees-bs022.html | 304 ++++++-- .../html/._DecisionTrees-bs023.html | 198 +++-- .../html/._DecisionTrees-bs024.html | 167 +++-- .../html/._DecisionTrees-bs025.html | 123 ++-- .../html/._DecisionTrees-bs026.html | 140 ++-- .../html/._DecisionTrees-bs027.html | 174 +++-- .../html/._DecisionTrees-bs028.html | 143 ++-- .../html/._DecisionTrees-bs029.html | 119 +-- .../html/._DecisionTrees-bs030.html | 155 ++-- .../html/._DecisionTrees-bs031.html | 166 ++--- .../DecisionTrees/html/DecisionTrees-bs.html | 91 +-- .../html/DecisionTrees-reveal.html | 642 ++++++++++++---- .../html/DecisionTrees-solarized.html | 683 +++++++++++++----- doc/pub/DecisionTrees/html/DecisionTrees.html | 683 +++++++++++++----- .../DecisionTrees/ipynb/DecisionTrees.ipynb | 661 ++++++++++++----- .../ipynb/ipynb-DecisionTrees-src.tar.gz | Bin 194 -> 194 bytes .../pdf/DecisionTrees-minted.pdf | Bin 266231 -> 283918 bytes doc/src/DecisionTrees/DataFiles/cancer.dot | 57 ++ doc/src/DecisionTrees/DataFiles/cancer.png | Bin 0 -> 221561 bytes doc/src/DecisionTrees/DecisionTrees.do.txt | 570 +++++++++++---- .../{ => Results/FigureFiles}/cancer.dot | 8 +- doc/src/DecisionTrees/dtcancer.py | 31 +- doc/src/DecisionTrees/gini.py | 19 + 45 files changed, 4856 insertions(+), 2812 deletions(-) create mode 100644 doc/src/DecisionTrees/DataFiles/cancer.dot create mode 100644 doc/src/DecisionTrees/DataFiles/cancer.png rename doc/src/DecisionTrees/{ => Results/FigureFiles}/cancer.dot (85%) diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html index 8136086bf..4591c0dc0 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -195,7 +202,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 29, 2019

    +

    Oct 31, 2019


    @@ -219,7 +226,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html index 017dbf0d2..da1b18b86 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -224,7 +231,7 @@ given some assumptions, make predictions about the target feature value
  • 10
  • 11
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html index dd41cd135..c2d203db9 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -199,7 +206,7 @@ In the figure here we present a decision tree obtained from a classification pro
  • 11
  • 12
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html index 827610f21..bd90da767 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -200,7 +207,7 @@ In the figure we present a decision tree obtained from a simple regression prob
  • 12
  • 13
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html index f9696d635..b35e3c6ad 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -211,7 +218,7 @@ node.
  • 13
  • 14
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html index fe313790f..7f7d52061 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -212,7 +219,7 @@ Then we are essentially done!
  • 14
  • 15
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html index 5ea3aa965..151427dea 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -291,7 +298,7 @@ plt.show()
  • 15
  • 16
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html index 45d860328..fcc3f8e61 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -224,7 +231,7 @@ within box \( j \).
  • 16
  • 17
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html index c0391d238..c8533f1f2 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -216,7 +223,7 @@ better tree in some future step.
  • 17
  • 18
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html index 29a2bf72e..525fffcfd 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -249,7 +256,7 @@ region contains more than five observations.
  • 18
  • 19
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html index 9b03e5c6f..83fbc8ee0 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -218,7 +225,7 @@ parameter \( \alpha \).
  • 19
  • 20
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html index f6e230314..87d3174c7 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -230,7 +237,7 @@ subtree corresponding to \( \alpha \).
  • 20
  • 21
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html index d660d8e01..d322da06d 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -226,7 +233,7 @@ MathJax.Hub.Config({
  • 21
  • 22
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html index fed826427..bdf58e375 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -218,7 +225,7 @@ fall into that region.
  • 22
  • 23
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html index 16a25427e..3743f474b 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -223,7 +230,7 @@ than is the classification error rate.
  • 23
  • 24
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html index 6a1d92ce7..09645870c 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -249,7 +256,7 @@ $$
  • 24
  • 25
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html index 0486b997b..31ddce3f4 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,185 +183,43 @@ MathJax.Hub.Config({ -

    The CART (Classification and Regression Tree) algorithm

    - -

    -The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm first before we move on to the information gain algorithm ID3. - +

    Visualizing the Tree, Classification

    -

    from random import seed
    -from random import randrange
    -from csv import reader
    - 
    -# Load a CSV file
    -def load_csv(filename):
    -	file = open(filename, "rb")
    -	lines = reader(file)
    -	dataset = list(lines)
    -	return dataset
    - 
    -# Convert string column to float
    -def str_column_to_float(dataset, column):
    -	for row in dataset:
    -		row[column] = float(row[column].strip())
    - 
    -# Split a dataset into k folds
    -def cross_validation_split(dataset, n_folds):
    -	dataset_split = list()
    -	dataset_copy = list(dataset)
    -	fold_size = int(len(dataset) / n_folds)
    -	for i in range(n_folds):
    -		fold = list()
    -		while len(fold) < fold_size:
    -			index = randrange(len(dataset_copy))
    -			fold.append(dataset_copy.pop(index))
    -		dataset_split.append(fold)
    -	return dataset_split
    - 
    -# Calculate accuracy percentage
    -def accuracy_metric(actual, predicted):
    -	correct = 0
    -	for i in range(len(actual)):
    -		if actual[i] == predicted[i]:
    -			correct += 1
    -	return correct / float(len(actual)) * 100.0
    - 
    -# Evaluate an algorithm using a cross validation split
    -def evaluate_algorithm(dataset, algorithm, n_folds, *args):
    -	folds = cross_validation_split(dataset, n_folds)
    -	scores = list()
    -	for fold in folds:
    -		train_set = list(folds)
    -		train_set.remove(fold)
    -		train_set = sum(train_set, [])
    -		test_set = list()
    -		for row in fold:
    -			row_copy = list(row)
    -			test_set.append(row_copy)
    -			row_copy[-1] = None
    -		predicted = algorithm(train_set, test_set, *args)
    -		actual = [row[-1] for row in fold]
    -		accuracy = accuracy_metric(actual, predicted)
    -		scores.append(accuracy)
    -	return scores
    - 
    -# 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:
    -		if row[index] < value:
    -			left.append(row)
    -		else:
    -			right.append(row)
    -	return left, right
    - 
    -# Calculate the Gini index for a split dataset
    -def gini_index(groups, classes):
    -	# count all samples at split point
    -	n_instances = float(sum([len(group) for group in groups]))
    -	# sum weighted Gini index for each group
    -	gini = 0.0
    -	for group in groups:
    -		size = float(len(group))
    -		# avoid divide by zero
    -		if size == 0:
    -			continue
    -		score = 0.0
    -		# score the group based on the score for each class
    -		for class_val in classes:
    -			p = [row[-1] for row in group].count(class_val) / size
    -			score += p * p
    -		# weight the group score by its relative size
    -		gini += (1.0 - score) * (size / n_instances)
    -	return gini
    - 
    -# Select the best split point for a dataset
    -def get_split(dataset):
    -	class_values = list(set(row[-1] for row in dataset))
    -	b_index, b_value, b_score, b_groups = 999, 999, 999, None
    -	for index in range(len(dataset[0])-1):
    -		for row in dataset:
    -			groups = test_split(index, row[index], dataset)
    -			gini = gini_index(groups, class_values)
    -			if gini < b_score:
    -				b_index, b_value, b_score, b_groups = index, row[index], gini, groups
    -	return {'index':b_index, 'value':b_value, 'groups':b_groups}
    - 
    -# Create a terminal node value
    -def to_terminal(group):
    -	outcomes = [row[-1] for row in group]
    -	return max(set(outcomes), key=outcomes.count)
    - 
    -# Create child splits for a node or make terminal
    -def split(node, max_depth, min_size, depth):
    -	left, right = node['groups']
    -	del(node['groups'])
    -	# check for a no split
    -	if not left or not right:
    -		node['left'] = node['right'] = to_terminal(left + right)
    -		return
    -	# check for max depth
    -	if depth >= max_depth:
    -		node['left'], node['right'] = to_terminal(left), to_terminal(right)
    -		return
    -	# process left child
    -	if len(left) <= min_size:
    -		node['left'] = to_terminal(left)
    -	else:
    -		node['left'] = get_split(left)
    -		split(node['left'], max_depth, min_size, depth+1)
    -	# process right child
    -	if len(right) <= min_size:
    -		node['right'] = to_terminal(right)
    -	else:
    -		node['right'] = get_split(right)
    -		split(node['right'], max_depth, min_size, depth+1)
    - 
    -# Build a decision tree
    -def build_tree(train, max_depth, min_size):
    -	root = get_split(train)
    -	split(root, max_depth, min_size, 1)
    -	return root
    - 
    -# Make a prediction with a decision tree
    -def predict(node, row):
    -	if row[node['index']] < node['value']:
    -		if isinstance(node['left'], dict):
    -			return predict(node['left'], row)
    -		else:
    -			return node['left']
    -	else:
    -		if isinstance(node['right'], dict):
    -			return predict(node['right'], row)
    -		else:
    -			return node['right']
    - 
    -# Classification and Regression Tree Algorithm
    -def decision_tree(train, test, max_depth, min_size):
    -	tree = build_tree(train, max_depth, min_size)
    -	predictions = list()
    -	for row in test:
    -		prediction = predict(tree, row)
    -		predictions.append(prediction)
    -	return(predictions)
    - 
    -# Test CART 
    -seed(1)
    -# load and prepare data
    -filename = 'DataFiles/rideclass.csv'
    -dataset = load_csv(filename)
    -# convert string attributes to integers
    -for i in range(len(dataset[0])):
    -	str_column_to_float(dataset, i)
    -# evaluate algorithm
    -n_folds = 5
    -max_depth = 5
    -min_size = 10
    -scores = evaluate_algorithm(dataset, decision_tree, n_folds, max_depth, min_size)
    -print('Scores: %s' % scores)
    -print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores))))
    +
    import os
    +from sklearn.datasets import load_breast_cancer
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.metrics import confusion_matrix
    +from sklearn.tree import export_graphviz
    +
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import numpy as np
    +
    +
    +cancer = load_breast_cancer()
    +X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
    +print(X)
    +y = pd.Categorical.from_codes(cancer.target, cancer.target_names)
    +y = pd.get_dummies(y)
    +print(y)
    +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/cancer.dot",
    +    feature_names=cancer.feature_names,
    +    class_names=cancer.target_names,
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
     

    @@ -382,7 +247,7 @@ scores = evaluate_algorithm(dataset, decisio

  • 25
  • 26
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html index 3ff2e4c07..ab845fe0f 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,39 +183,35 @@ MathJax.Hub.Config({ -

    Entropy and the ID3 algorithm

    - +

    Visualizing the Tree, The Moons

    -ID3, learns decision trees by constructing -them topdown, 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. -
    3. The best attribute is selected and used as the test at the root node of the tree.
    4. -
    5. A descendant of the root node is then created for each possible value of this attribute.
    6. -
    7. Training examples are sorted to the appropriate descendant node.
    8. -
    9. 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.
    10. -
    11. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices.
    12. -
    + +
    # Common imports
    +import numpy as np
    +from sklearn.model_selection import  train_test_split 
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.datasets import make_moons
    +from sklearn.tree import export_graphviz
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import os
     
    -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 -examples. - -

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

    -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 -attributes at each step while growing the tree. +np.random.seed(42) +X, y = make_moons(n_samples=100, noise=0.25, random_state=53) +X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0) +tree_clf = DecisionTreeClassifier(max_depth=5) +tree_clf.fit(X_train, y_train) +export_graphviz( + tree_clf, + out_file="DataFiles/moons.dot", + rounded=True, + filled=True +) +cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png' +os.system(cmd) +

    @@ -235,7 +238,7 @@ attributes at each step while growing the tree.

  • 26
  • 27
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html index 0b61ea913..504c3373f 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,11 +183,48 @@ MathJax.Hub.Config({ -

    Implementing the ID3 Algorithm

    +

    Computing the Gini index

    -more text to come here, material presented during lecture Friday Oct 25. +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 +etc. The table here contains the feautures outlook, temperature, +humidity and wind. The target or output is whether we ride +(True=1) or whether we do something else that day (False=0). The +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 + +

    +
    + + + + + + + + + + + + + + + + + + + + +
    Day Outlook Temperature Humidity Wind Ride
    1 Sunny Hot High Weak 0
    2 Sunny Hot High Strong 1
    3 Overcast Hot High Weak 1
    4 Rain Mild High Weak 1
    5 Rain Cool Normal Weak 1
    6 Rain Cool Normal Strong 0
    7 Overcast Cool Normal Strong 1
    8 Sunny Mild High Weak 0
    9 Sunny Cool Normal Weak 1
    10 Rain Mild Normal Weak 1
    11 Sunny Mild Normal Strong 1
    12 Overcast Mild High Strong 1
    13 Overcast Hot Normal Weak 1
    14 Rain Mild High Strong 0
    +
    +

    @@ -207,7 +251,7 @@ MathJax.Hub.Config({

  • 27
  • 28
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html index c9605d53a..6cc582f6b 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,51 +183,64 @@ MathJax.Hub.Config({ -

    Cancer Data again now with Decision Trees

    +

    Simple Python Code to read in Data

    +

    -

    import matplotlib.pyplot as plt
    +
    # Common imports
     import numpy as np
    -from sklearn.model_selection import  train_test_split 
    -from sklearn.datasets import load_breast_cancer
    -from sklearn.svm import SVC
    -from sklearn.linear_model import LogisticRegression
    -from sklearn.tree import DecisionTreeClassifier
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import StandardScaler, OneHotEncoder
    +from sklearn.compose import ColumnTransformer
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import os
     
    -# Load the data
    -cancer = load_breast_cancer()
    +# Where to save the figures and data files
    +PROJECT_ROOT_DIR = "Results"
    +FIGURE_ID = "Results/FigureFiles"
    +DATA_ID = "DataFiles/"
     
    -X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
    -print(X_train.shape)
    -print(X_test.shape)
    -# Logistic Regression
    -logreg = LogisticRegression(solver='lbfgs')
    -logreg.fit(X_train, y_train)
    -print("Test set accuracy with Logistic Regression: {:.2f}".format(logreg.score(X_test,y_test)))
    -# Support vector machine
    -svm = SVC(gamma='auto', C=100)
    -svm.fit(X_train, y_train)
    -print("Test set accuracy with SVM: {:.2f}".format(svm.score(X_test,y_test)))
    -# Decision Trees
    -deep_tree_clf = DecisionTreeClassifier(max_depth=None)
    -deep_tree_clf.fit(X_train, y_train)
    -print("Test set accuracy with Decision Trees: {:.2f}".format(deep_tree_clf.score(X_test,y_test)))
    -#now scale the data
    -from sklearn.preprocessing import StandardScaler
    -scaler = StandardScaler()
    -scaler.fit(X_train)
    -X_train_scaled = scaler.transform(X_train)
    -X_test_scaled = scaler.transform(X_test)
    -# Logistic Regression
    -logreg.fit(X_train_scaled, y_train)
    -print("Test set accuracy Logistic Regression with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
    -# Support Vector Machine
    -svm.fit(X_train_scaled, y_train)
    -print("Test set accuracy SVM with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
    -# 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)))
    +if not os.path.exists(PROJECT_ROOT_DIR):
    +    os.mkdir(PROJECT_ROOT_DIR)
    +
    +if not os.path.exists(FIGURE_ID):
    +    os.makedirs(FIGURE_ID)
    +
    +if not os.path.exists(DATA_ID):
    +    os.makedirs(DATA_ID)
    +
    +def image_path(fig_id):
    +    return os.path.join(FIGURE_ID, fig_id)
    +
    +def data_path(dat_id):
    +    return os.path.join(DATA_ID, dat_id)
    +
    +def save_fig(fig_id):
    +    plt.savefig(image_path(fig_id) + ".png", format='png')
    +
    +infile = open(data_path("ride.csv"),'r')
    +
    +# Read the experimental data with Pandas
    +from IPython.display import display
    +ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))
    +ridedata = pd.DataFrame(ridedata)
    +display(ridedata)
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +display(X)
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +display(y)
    +# Categorical variables to one-hot's
    +onehotencoder = OneHotEncoder(categories="auto")
    +
    +X = ColumnTransformer([("", onehotencoder)]).fit_transform(X)
    +y.shape
    +
    +display(X)
    +display(y)
     

    @@ -248,7 +268,7 @@ deep_tree_clf.fit(X_train_scaled, y_train)

  • 28
  • 29
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html index 644725d7e..c20d867e3 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,74 +183,80 @@ MathJax.Hub.Config({ -

    Another example, the moons again

    +

    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. +

    -

    from __future__ import division, print_function, unicode_literals
    +
    # 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:
    +		if row[index] < value:
    +			left.append(row)
    +		else:
    +			right.append(row)
    +	return left, right
    + 
    +# Calculate the Gini index for a split dataset
    +def gini_index(groups, classes):
    +	# count all samples at split point
    +	n_instances = float(sum([len(group) for group in groups]))
    +	# sum weighted Gini index for each group
    +	gini = 0.0
    +	for group in groups:
    +		size = float(len(group))
    +		# avoid divide by zero
    +		if size == 0:
    +			continue
    +		score = 0.0
    +		# score the group based on the score for each class
    +		for class_val in classes:
    +			p = [row[-1] for row in group].count(class_val) / size
    +			score += p * p
    +		# weight the group score by its relative size
    +		gini += (1.0 - score) * (size / n_instances)
    +	return gini
     
    -# Common imports
    -import numpy as np
    -import os
    +# Select the best split point for a dataset
    +def get_split(dataset):
    +	class_values = list(set(row[-1] for row in dataset))
    +	b_index, b_value, b_score, b_groups = 999, 999, 999, None
    +	for index in range(len(dataset[0])-1):
    +		for row in dataset:
    +			groups = test_split(index, row[index], dataset)
    +			gini = gini_index(groups, class_values)
    +			print('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))
    +			if gini < b_score:
    +				b_index, b_value, b_score, b_groups = index, row[index], gini, groups
    +	return {'index':b_index, 'value':b_value, 'groups':b_groups}
    + 
    +dataset = [[0,0,0,0,0],
    +            [0,0,0,1,1],
    +            [1,0,0,0,1],
    +            [2,1,0,0,1],
    +            [2,2,1,0,1],
    +            [2,2,1,1,0],
    +            [1,2,1,1,1],
    +            [0,1,0,0,0],
    +            [0,2,1,0,1],
    +            [2,1,1,0,1],
    +            [0,1,1,1,1],
    +            [1,1,0,1,1],
    +            [1,0,1,0,1],
    +            [2,1,0,1,0]]
     
    -# to make this notebook's output stable across runs
    -np.random.seed(42)
    -
    -# To plot pretty figures
    -import matplotlib
    -import matplotlib.pyplot as plt
    -from matplotlib.colors import ListedColormap
    -plt.rcParams['axes.labelsize'] = 14
    -plt.rcParams['xtick.labelsize'] = 12
    -plt.rcParams['ytick.labelsize'] = 12
    -
    -
    -from sklearn.svm import SVC
    -from sklearn import datasets
    -from sklearn.tree import DecisionTreeClassifier
    -from sklearn.datasets import make_moons
    -from sklearn.tree import export_graphviz
    -
    -Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)
    -
    -deep_tree_clf1 = DecisionTreeClassifier(random_state=42)
    -deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)
    -deep_tree_clf1.fit(Xm, ym)
    -deep_tree_clf2.fit(Xm, ym)
    -
    -
    -def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):
    -    x1s = np.linspace(axes[0], axes[1], 100)
    -    x2s = np.linspace(axes[2], axes[3], 100)
    -    x1, x2 = np.meshgrid(x1s, x2s)
    -    X_new = np.c_[x1.ravel(), x2.ravel()]
    -    y_pred = clf.predict(X_new).reshape(x1.shape)
    -    custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
    -    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
    -    if not iris:
    -        custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
    -        plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
    -    if plot_training:
    -        plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", label="Iris-Setosa")
    -        plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", label="Iris-Versicolor")
    -        plt.plot(X[:, 0][y==2], X[:, 1][y==2], "g^", label="Iris-Virginica")
    -        plt.axis(axes)
    -    if iris:
    -        plt.xlabel("Petal length", fontsize=14)
    -        plt.ylabel("Petal width", fontsize=14)
    -    else:
    -        plt.xlabel(r"$x_1$", fontsize=18)
    -        plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
    -    if legend:
    -        plt.legend(loc="lower right", fontsize=14)
    -plt.figure(figsize=(11, 4))
    -plt.subplot(121)
    -plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
    -plt.title("No restrictions", fontsize=16)
    -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()
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
     

    @@ -271,7 +284,7 @@ plt.show()

  • 29
  • 30
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html index 03d9652fb..5bc4ec431 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,31 +183,39 @@ MathJax.Hub.Config({ -

    Playing around with regions

    +

    Entropy and the ID3 algorithm

    +

    +ID3, learns decision trees by constructing +them topdown, beginning with the question which attribute should be tested at the root of the tree? - -

    np.random.seed(6)
    -Xs = np.random.rand(100, 2) - 0.5
    -ys = (Xs[:, 0] > 0).astype(np.float32) * 2
    +
      +
    1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.
    2. +
    3. The best attribute is selected and used as the test at the root node of the tree.
    4. +
    5. A descendant of the root node is then created for each possible value of this attribute.
    6. +
    7. Training examples are sorted to the appropriate descendant node.
    8. +
    9. 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.
    10. +
    11. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices.
    12. +
    -angle = np.pi / 4 -rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) -Xsr = Xs.dot(rotation_matrix) +The ID3 algorithm selects, which attribute to test at each node in the +tree. -tree_clf_s = DecisionTreeClassifier(random_state=42) -tree_clf_s.fit(Xs, ys) -tree_clf_sr = DecisionTreeClassifier(random_state=42) -tree_clf_sr.fit(Xsr, ys) +

    +We would like to select the attribute that is most useful for classifying +examples. -plt.figure(figsize=(11, 4)) -plt.subplot(121) -plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False) -plt.subplot(122) -plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False) +

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

    +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 +attributes at each step while growing the tree. -plt.show() -

    @@ -227,7 +242,7 @@ plt.show()

  • 30
  • 31
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html index cd54b9b78..25c8cbcc9 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,25 +183,212 @@ MathJax.Hub.Config({ -

    Regression trees

    +

    Implementing the ID3 Algorithm

    +

    +import re +import math +from collections import deque - -

    # 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
    +

    +class Node(object): + def __init__(self): + self.value = None + self.next = None + self.childs = None + +

    + + +class DecisionTree(object): + def __init__(self, sample, attributes, labels): + self.sample = sample + self.attributes = attributes + self.labels = labels + self.labelCodes = None + self.labelCodesCount = None + self.initLabelCodes() + # print(self.labelCodes) + self.root = None + self.entropy = self.getEntropy([x for x in range(len(self.labels))]) + +

    + def initLabelCodes(self): + self.labelCodes = [] + self.labelCodesCount = [] + for l in self.labels: + if l not in self.labelCodes: + self.labelCodes.append(l) + self.labelCodesCount.append(0) + self.labelCodesCount[self.labelCodes.index(l)] += 1 + +

    + def getLabelCodeId(self, sampleId): + return self.labelCodes.index(self.labels[sampleId]) + +

    + def getAttributeValues(self, sampleIds, attributeId): + vals = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in vals: + vals.append(val) + # print(vals) + return vals + +

    + def getEntropy(self, sampleIds): + entropy = 0 + labelCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCount[self.getLabelCodeId(sid)] += 1 + # print("-ge", labelCount) + for lv in labelCount: + # print(lv) + if lv != 0: + entropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2) + else: + entropy += 0 + return entropy + +

    + def getDominantLabel(self, sampleIds): + labelCodesCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCodesCount[self.labelCodes.index(self.labels[sid])] += 1 + return self.labelCodes[labelCodesCount.index(max(labelCodesCount))] + +

    + def getInformationGain(self, sampleIds, attributeId): + gain = self.getEntropy(sampleIds) + attributeVals = [] + attributeValsCount = [] + attributeValsIds = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in attributeVals: + attributeVals.append(val) + attributeValsCount.append(0) + attributeValsIds.append([]) + vid = attributeVals.index(val) + attributeValsCount[vid] += 1 + attributeValsIds[vid].append(sid) + # print("-gig", self.attributes[attributeId]) + for vc, vids in zip(attributeValsCount, attributeValsIds): + # print("-gig", vids) + gain -= vc/len(sampleIds) * self.getEntropy(vids) + return gain + +

    + def getAttributeMaxInformationGain(self, sampleIds, attributeIds): + attributesEntropy = [0] * len(attributeIds) + for i, attId in zip(range(len(attributeIds)), attributeIds): + attributesEntropy[i] = self.getInformationGain(sampleIds, attId) + maxId = attributeIds[attributesEntropy.index(max(attributesEntropy))] + return self.attributes[maxId], maxId + +

    + def isSingleLabeled(self, sampleIds): + label = self.labels[sampleIds[0]] + for sid in sampleIds: + if self.labels[sid] != label: + return False + return True + +

    + def getLabel(self, sampleId): + return self.labels[sampleId] + +

    + def id3(self): + sampleIds = [x for x in range(len(self.sample))] + attributeIds = [x for x in range(len(self.attributes))] + self.root = self.id3Recv(sampleIds, attributeIds, self.root) + +

    + def id3Recv(self, sampleIds, attributeIds, root): + root = Node() # Initialize current root + if self.isSingleLabeled(sampleIds): + root.value = self.labels[sampleIds[0]] + return root + # print(attributeIds) + if len(attributeIds) == 0: + root.value = self.getDominantLabel(sampleIds) + return root + bestAttrName, bestAttrId = self.getAttributeMaxInformationGain( + sampleIds, attributeIds) + # print(bestAttrName) + root.value = bestAttrName + root.childs = [] # Create list of children + for value in self.getAttributeValues(sampleIds, bestAttrId): + # print(value) + child = Node() + child.value = value + root.childs.append(child) # Append new child node to current + # root + childSampleIds = [] + for sid in sampleIds: + if self.sample[sid][bestAttrId] == value: + childSampleIds.append(sid) + if len(childSampleIds) == 0: + child.next = self.getDominantLabel(sampleIds) + else: + # print(bestAttrName, bestAttrId) + # print(attributeIds) + if len(attributeIds) > 0 and bestAttrId in attributeIds: + toRemove = attributeIds.index(bestAttrId) + attributeIds.pop(toRemove) + child.next = self.id3Recv( + childSampleIds, attributeIds, child.next) + return root + +

    + def printTree(self): + if self.root: + roots = deque() + roots.append(self.root) + while len(roots) > 0: + root = roots.popleft() + print(root.value) + if root.childs: + for child in root.childs: + print('({})'.format(child.value)) + roots.append(child.next) + elif root.next: + print(root.next) + +

    +def test(): + f = open('DataFiles/rideclass.csv') + attributes = f.readline().split(',') + attributes = attributes[1:len(attributes)-1] + print(attributes) + sample = f.readlines() + f.close() + for i in range(len(sample)): + sample[i] = re.sub('\d+,', '', sample[i]) + sample[i] = sample[i].strip().split(',') + labels = [] + for s in sample: + labels.append(s.pop()) + # print(sample) + # print(labels) + decisionTree = DecisionTree(sample, attributes, labels) + print("System entropy {}".format(decisionTree.entropy)) + decisionTree.id3() + decisionTree.printTree() + +

    +if __name__ == '__main__': + test() -tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42) -tree_reg.fit(X, y) -

    @@ -221,7 +415,7 @@ tree_reg.fit(X, y)

  • 31
  • 32
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html index 67de6c38d..6c66fb5e7 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,80 +183,51 @@ MathJax.Hub.Config({ -

    Final regressor code

    +

    Cancer Data again now with Decision Trees and other Methods

    -

    from sklearn.tree import DecisionTreeRegressor
    +
    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import  train_test_split 
    +from sklearn.datasets import load_breast_cancer
    +from sklearn.svm import SVC
    +from sklearn.linear_model import LogisticRegression
    +from sklearn.tree import DecisionTreeClassifier
     
    -tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)
    -tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)
    -tree_reg1.fit(X, y)
    -tree_reg2.fit(X, y)
    +# Load the data
    +cancer = load_breast_cancer()
     
    -def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel="$y$"):
    -    x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)
    -    y_pred = tree_reg.predict(x1)
    -    plt.axis(axes)
    -    plt.xlabel("$x_1$", fontsize=18)
    -    if ylabel:
    -        plt.ylabel(ylabel, fontsize=18, rotation=0)
    -    plt.plot(X, y, "b.")
    -    plt.plot(x1, y_pred, "r.-", linewidth=2, label=r"$\hat{y}$")
    -
    -plt.figure(figsize=(11, 4))
    -plt.subplot(121)
    -plot_regression_predictions(tree_reg1, X, y)
    -for split, style in ((0.1973, "k-"), (0.0917, "k--"), (0.7718, "k--")):
    -    plt.plot([split, split], [-0.2, 1], style, linewidth=2)
    -plt.text(0.21, 0.65, "Depth=0", fontsize=15)
    -plt.text(0.01, 0.2, "Depth=1", fontsize=13)
    -plt.text(0.65, 0.8, "Depth=1", fontsize=13)
    -plt.legend(loc="upper center", fontsize=18)
    -plt.title("max_depth=2", fontsize=14)
    -
    -plt.subplot(122)
    -plot_regression_predictions(tree_reg2, X, y, ylabel=None)
    -for split, style in ((0.1973, "k-"), (0.0917, "k--"), (0.7718, "k--")):
    -    plt.plot([split, split], [-0.2, 1], style, linewidth=2)
    -for split in (0.0458, 0.1298, 0.2873, 0.9040):
    -    plt.plot([split, split], [-0.2, 1], "k:", linewidth=1)
    -plt.text(0.3, 0.5, "Depth=2", fontsize=13)
    -plt.title("max_depth=3", fontsize=14)
    -
    -plt.show()
    -
    -

    - - -

    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)
    -
    -x1 = np.linspace(0, 1, 500).reshape(-1, 1)
    -y_pred1 = tree_reg1.predict(x1)
    -y_pred2 = tree_reg2.predict(x1)
    -
    -plt.figure(figsize=(11, 4))
    -
    -plt.subplot(121)
    -plt.plot(X, y, "b.")
    -plt.plot(x1, y_pred1, "r.-", linewidth=2, label=r"$\hat{y}$")
    -plt.axis([0, 1, -0.2, 1.1])
    -plt.xlabel("$x_1$", fontsize=18)
    -plt.ylabel("$y$", fontsize=18, rotation=0)
    -plt.legend(loc="upper center", fontsize=18)
    -plt.title("No restrictions", fontsize=14)
    -
    -plt.subplot(122)
    -plt.plot(X, y, "b.")
    -plt.plot(x1, y_pred2, "r.-", linewidth=2, label=r"$\hat{y}$")
    -plt.axis([0, 1, -0.2, 1.1])
    -plt.xlabel("$x_1$", fontsize=18)
    -plt.title("min_samples_leaf={}".format(tree_reg2.min_samples_leaf), fontsize=14)
    -
    -plt.show()
    +X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
    +print(X_train.shape)
    +print(X_test.shape)
    +# Logistic Regression
    +logreg = LogisticRegression(solver='lbfgs')
    +logreg.fit(X_train, y_train)
    +print("Test set accuracy with Logistic Regression: {:.2f}".format(logreg.score(X_test,y_test)))
    +# Support vector machine
    +svm = SVC(gamma='auto', C=100)
    +svm.fit(X_train, y_train)
    +print("Test set accuracy with SVM: {:.2f}".format(svm.score(X_test,y_test)))
    +# Decision Trees
    +deep_tree_clf = DecisionTreeClassifier(max_depth=None)
    +deep_tree_clf.fit(X_train, y_train)
    +print("Test set accuracy with Decision Trees: {:.2f}".format(deep_tree_clf.score(X_test,y_test)))
    +#now scale the data
    +from sklearn.preprocessing import StandardScaler
    +scaler = StandardScaler()
    +scaler.fit(X_train)
    +X_train_scaled = scaler.transform(X_train)
    +X_test_scaled = scaler.transform(X_test)
    +# Logistic Regression
    +logreg.fit(X_train_scaled, y_train)
    +print("Test set accuracy Logistic Regression with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
    +# Support Vector Machine
    +svm.fit(X_train_scaled, y_train)
    +print("Test set accuracy SVM with scaled data: {:.2f}".format(logreg.score(X_test_scaled,y_test)))
    +# 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)))
     

    @@ -277,7 +255,7 @@ plt.show()

  • 32
  • 33
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html index 245bac28b..4edb2d51a 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,18 +183,76 @@ MathJax.Hub.Config({ -

    Pros and cons of trees, pros

    +

    Another example, the moons again

    +

    -

      -
    • 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)
    • -
    • Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression!
    • -
    • No feature normalization needed
    • -
    • Tree models can handle both continuous and categorical data (Classification and Regression Trees)
    • -
    • Can model nonlinear relationships
    • -
    • 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)
    • -
    + +
    from __future__ import division, print_function, unicode_literals
     
    +# Common imports
    +import numpy as np
    +import os
    +
    +# to make this notebook's output stable across runs
    +np.random.seed(42)
    +
    +# To plot pretty figures
    +import matplotlib
    +import matplotlib.pyplot as plt
    +from matplotlib.colors import ListedColormap
    +plt.rcParams['axes.labelsize'] = 14
    +plt.rcParams['xtick.labelsize'] = 12
    +plt.rcParams['ytick.labelsize'] = 12
    +
    +
    +from sklearn.svm import SVC
    +from sklearn import datasets
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.datasets import make_moons
    +from sklearn.tree import export_graphviz
    +
    +Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)
    +
    +deep_tree_clf1 = DecisionTreeClassifier(random_state=42)
    +deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)
    +deep_tree_clf1.fit(Xm, ym)
    +deep_tree_clf2.fit(Xm, ym)
    +
    +
    +def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):
    +    x1s = np.linspace(axes[0], axes[1], 100)
    +    x2s = np.linspace(axes[2], axes[3], 100)
    +    x1, x2 = np.meshgrid(x1s, x2s)
    +    X_new = np.c_[x1.ravel(), x2.ravel()]
    +    y_pred = clf.predict(X_new).reshape(x1.shape)
    +    custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
    +    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
    +    if not iris:
    +        custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
    +        plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
    +    if plot_training:
    +        plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", label="Iris-Setosa")
    +        plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", label="Iris-Versicolor")
    +        plt.plot(X[:, 0][y==2], X[:, 1][y==2], "g^", label="Iris-Virginica")
    +        plt.axis(axes)
    +    if iris:
    +        plt.xlabel("Petal length", fontsize=14)
    +        plt.ylabel("Petal width", fontsize=14)
    +    else:
    +        plt.xlabel(r"$x_1$", fontsize=18)
    +        plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
    +    if legend:
    +        plt.legend(loc="lower right", fontsize=14)
    +plt.figure(figsize=(11, 4))
    +plt.subplot(121)
    +plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)
    +plt.title("No restrictions", fontsize=16)
    +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()
    +
    +

      @@ -212,6 +277,8 @@ MathJax.Hub.Config({
    • 32
    • 33
    • 34
    • +
    • ...
    • +
    • 39
    • »
    diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html index 199639975..9b12a47de 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,20 +183,31 @@ MathJax.Hub.Config({ -

    Disadvantages

    +

    Playing around with regions

    +

    -

      -
    • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
    • -
    • If continuous features are used the tree may become quite large and hence less interpretable
    • -
    • Decision trees are prone to overfit the training data and hence do not well generalize the data if no stopping criteria or improvements like pruning, boosting or bagging are implemented
    • -
    • Small changes in the data may lead to a completely different tree. This issue can be addressed by using ensemble methods like bagging, boosting or random forests
    • -
    • Unbalanced datasets where some target feature values occur much more frequently than others may lead to biased trees since the frequently occurring feature values are preferred over the less frequently occurring ones.
    • -
    • 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
    • -
    + +
    np.random.seed(6)
    +Xs = np.random.rand(100, 2) - 0.5
    +ys = (Xs[:, 0] > 0).astype(np.float32) * 2
     
    -However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved.
    +angle = np.pi/4
    +rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])
    +Xsr = Xs.dot(rotation_matrix)
     
    +tree_clf_s = DecisionTreeClassifier(random_state=42)
    +tree_clf_s.fit(Xs, ys)
    +tree_clf_sr = DecisionTreeClassifier(random_state=42)
    +tree_clf_sr.fit(Xsr, ys)
    +
    +plt.figure(figsize=(11, 4))
    +plt.subplot(121)
    +plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
    +plt.subplot(122)
    +plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)
    +
    +plt.show()
    +

    @@ -214,6 +232,9 @@ However, by aggregating many decision trees, using methods like bagging, random

  • 32
  • 33
  • 34
  • +
  • 35
  • +
  • ...
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html index 585aa4cfd..8f217f034 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,46 +183,25 @@ MathJax.Hub.Config({ -

    Bagging

    - +

    Regression trees

    -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. + +

    # 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
    +

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

    -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 -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 -accuracy at the expense of interpretability. Although the collection -of bagged trees is much more difficult to interpret than a single -tree, one can obtain an overall summary of the importance of each -predictor using the MSE (for bagging regression trees) or the Gini -index (for bagging classification trees). In the case of bagging -regression trees, we can record the total amount that the MSE is -decreased due to splits over a given predictor, averaged over all \( B \) possible -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. + +

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

    @@ -239,6 +225,10 @@ predictor, averaged over all \( B \) trees.

  • 32
  • 33
  • 34
  • +
  • 35
  • +
  • 36
  • +
  • ...
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html index 7c8f43f65..21cc1bb47 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,21 +183,79 @@ MathJax.Hub.Config({ -

    Simple example, head or tail

    +

    Final regressor code

    -

    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))
    -plt.plot(cumulative_heads_ratio)
    -plt.plot([0, 10000], [0.51, 0.51], "k--", linewidth=2, label="51%")
    -plt.plot([0, 10000], [0.5, 0.5], "k-", label="50%")
    -plt.xlabel("Number of coin tosses")
    -plt.ylabel("Heads ratio")
    -plt.legend(loc="lower right")
    -plt.axis([0, 10000, 0.42, 0.58])
    +
    from sklearn.tree import DecisionTreeRegressor
    +
    +tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)
    +tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)
    +tree_reg1.fit(X, y)
    +tree_reg2.fit(X, y)
    +
    +def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel="$y$"):
    +    x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)
    +    y_pred = tree_reg.predict(x1)
    +    plt.axis(axes)
    +    plt.xlabel("$x_1$", fontsize=18)
    +    if ylabel:
    +        plt.ylabel(ylabel, fontsize=18, rotation=0)
    +    plt.plot(X, y, "b.")
    +    plt.plot(x1, y_pred, "r.-", linewidth=2, label=r"$\hat{y}$")
    +
    +plt.figure(figsize=(11, 4))
    +plt.subplot(121)
    +plot_regression_predictions(tree_reg1, X, y)
    +for split, style in ((0.1973, "k-"), (0.0917, "k--"), (0.7718, "k--")):
    +    plt.plot([split, split], [-0.2, 1], style, linewidth=2)
    +plt.text(0.21, 0.65, "Depth=0", fontsize=15)
    +plt.text(0.01, 0.2, "Depth=1", fontsize=13)
    +plt.text(0.65, 0.8, "Depth=1", fontsize=13)
    +plt.legend(loc="upper center", fontsize=18)
    +plt.title("max_depth=2", fontsize=14)
    +
    +plt.subplot(122)
    +plot_regression_predictions(tree_reg2, X, y, ylabel=None)
    +for split, style in ((0.1973, "k-"), (0.0917, "k--"), (0.7718, "k--")):
    +    plt.plot([split, split], [-0.2, 1], style, linewidth=2)
    +for split in (0.0458, 0.1298, 0.2873, 0.9040):
    +    plt.plot([split, split], [-0.2, 1], "k:", linewidth=1)
    +plt.text(0.3, 0.5, "Depth=2", fontsize=13)
    +plt.title("max_depth=3", fontsize=14)
    +
    +plt.show()
    +
    +

    + + +

    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)
    +
    +x1 = np.linspace(0, 1, 500).reshape(-1, 1)
    +y_pred1 = tree_reg1.predict(x1)
    +y_pred2 = tree_reg2.predict(x1)
    +
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.plot(X, y, "b.")
    +plt.plot(x1, y_pred1, "r.-", linewidth=2, label=r"$\hat{y}$")
    +plt.axis([0, 1, -0.2, 1.1])
    +plt.xlabel("$x_1$", fontsize=18)
    +plt.ylabel("$y$", fontsize=18, rotation=0)
    +plt.legend(loc="upper center", fontsize=18)
    +plt.title("No restrictions", fontsize=14)
    +
    +plt.subplot(122)
    +plt.plot(X, y, "b.")
    +plt.plot(x1, y_pred2, "r.-", linewidth=2, label=r"$\hat{y}$")
    +plt.axis([0, 1, -0.2, 1.1])
    +plt.xlabel("$x_1$", fontsize=18)
    +plt.title("min_samples_leaf={}".format(tree_reg2.min_samples_leaf), fontsize=14)
    +
     plt.show()
     

    @@ -215,6 +280,11 @@ plt.show()

  • 32
  • 33
  • 34
  • +
  • 35
  • +
  • 36
  • +
  • 37
  • +
  • ...
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html index 6dcc724bf..de920c9e4 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,48 +183,18 @@ MathJax.Hub.Config({ -

    Random forests

    +

    Pros and cons of trees, pros

    -

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

      +
    • 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)
    • +
    • Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression!
    • +
    • No feature normalization needed
    • +
    • Tree models can handle both continuous and categorical data (Classification and Regression Trees)
    • +
    • Can model nonlinear relationships
    • +
    • 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)
    • +
    -

    -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. - -

    -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 -each split in the tree, the algorithm is not even allowed to consider -a majority of the available predictors. - -

    -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 -use this strong predictor in the top split. Consequently, all of the -bagged trees will look quite similar to each other. Hence the -predictions from the bagged trees will be highly correlated. -Unfortunately, averaging many highly correlated quantities does not -lead to as large of a reduction in variance as averaging many -uncorrelated quanti- ties. In particular, this means that bagging will -not lead to a substantial reduction in variance over a single tree in -this setting. - -

    diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html index c7afc7f08..0ccfacfb4 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,21 +183,20 @@ MathJax.Hub.Config({ -

    A simple scikit-learn example

    -

    +

    Disadvantages

    + +
      +
    • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
    • +
    • If continuous features are used the tree may become quite large and hence less interpretable
    • +
    • Decision trees are prone to overfit the training data and hence do not well generalize the data if no stopping criteria or improvements like pruning, boosting or bagging are implemented
    • +
    • Small changes in the data may lead to a completely different tree. This issue can be addressed by using ensemble methods like bagging, boosting or random forests
    • +
    • Unbalanced datasets where some target feature values occur much more frequently than others may lead to biased trees since the frequently occurring feature values are preferred over the less frequently occurring ones.
    • +
    • 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 bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. - -
    from sklearn.ensemble import RandomForestClassifier
    -from sklearn.preprocessing import LabelEncoder
    -from sklearn.model_selection import cross_validate
    -# Data set not specificied
    -X = dataset.XXX
    -Y = dataset.YYY
    -#Instantiate the model with 100 trees and entropy as splitting criteria
    -Random_Forest_model = RandomForestClassifier(n_estimators=100,criterion="entropy")
    -#Cross validation
    -accuracy = cross_validate(Random_Forest_model,X,Y,cv=10)['test_score']
    -

    @@ -211,6 +217,11 @@ accuracy = cross_validate(Random_Forest_mode

  • 32
  • 33
  • 34
  • +
  • 35
  • +
  • 36
  • +
  • 37
  • +
  • 38
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html index 233dda632..0227cab95 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,61 +183,22 @@ MathJax.Hub.Config({ -

    Please, not the moons again!

    +

    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. - -

    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)
    -X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
    -from sklearn.ensemble import RandomForestClassifier
    -from sklearn.ensemble import VotingClassifier
    -from sklearn.linear_model import LogisticRegression
    -from sklearn.svm import SVC
    -
    -log_clf = LogisticRegression(random_state=42)
    -rnd_clf = RandomForestClassifier(random_state=42)
    -svm_clf = SVC(random_state=42)
    -
    -voting_clf = VotingClassifier(
    -    estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
    -    voting='hard')
    -voting_clf.fit(X_train, y_train)
    -

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

    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)
    -rnd_clf = RandomForestClassifier(random_state=42)
    -svm_clf = SVC(probability=True, random_state=42)
    -
    -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
    -
    -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))
    -

    @@ -250,6 +218,11 @@ voting_clf.fit(X_train, y_train)

  • 32
  • 33
  • 34
  • +
  • 35
  • +
  • 36
  • +
  • 37
  • +
  • 38
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html index d85e0ae27..8c89c0702 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -176,64 +183,32 @@ MathJax.Hub.Config({ -

    Bagging examples

    +

    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. - -

    from sklearn.ensemble import BaggingClassifier
    -from sklearn.tree import DecisionTreeClassifier
    -
    -bag_clf = BaggingClassifier(
    -    DecisionTreeClassifier(random_state=42), n_estimators=500,
    -    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)
    -

    +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 +accuracy at the expense of interpretability. Although the collection +of bagged trees is much more difficult to interpret than a single +tree, one can obtain an overall summary of the importance of each +predictor using the MSE (for bagging regression trees) or the Gini +index (for bagging classification trees). In the case of bagging +regression trees, we can record the total amount that the MSE is +decreased due to splits over a given predictor, averaged over all \( B \) possible +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. - -

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

    - - -

    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
    -
    -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)
    -    x2s = np.linspace(axes[2], axes[3], 100)
    -    x1, x2 = np.meshgrid(x1s, x2s)
    -    X_new = np.c_[x1.ravel(), x2.ravel()]
    -    y_pred = clf.predict(X_new).reshape(x1.shape)
    -    custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
    -    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
    -    if contour:
    -        custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
    -        plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
    -    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
    -    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
    -    plt.axis(axes)
    -    plt.xlabel(r"$x_1$", fontsize=18)
    -    plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
    -plt.figure(figsize=(11,4))
    -plt.subplot(121)
    -plot_decision_boundary(tree_clf, X, y)
    -plt.title("Decision Tree", fontsize=14)
    -plt.subplot(122)
    -plot_decision_boundary(bag_clf, X, y)
    -plt.title("Decision Trees with Bagging", fontsize=14)
    -plt.show()
    -

    @@ -252,6 +227,11 @@ plt.show()

  • 32
  • 33
  • 34
  • +
  • 35
  • +
  • 36
  • +
  • 37
  • +
  • 38
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/DecisionTrees-bs.html b/doc/pub/DecisionTrees/html/DecisionTrees-bs.html index 8136086bf..4591c0dc0 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees-bs.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees-bs.html @@ -67,30 +67,32 @@ Automatically generated HTML file from DocOnce source ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -143,24 +145,29 @@ MathJax.Hub.Config({
  • A Classification Tree
  • Growing a classification tree
  • Classification tree, how to split nodes
  • -
  • The CART (Classification and Regression Tree) algorithm
  • -
  • Entropy and the ID3 algorithm
  • -
  • Implementing the ID3 Algorithm
  • -
  • Cancer Data again now with Decision Trees
  • -
  • Another example, the moons again
  • -
  • Playing around with regions
  • -
  • Regression trees
  • -
  • Final regressor code
  • -
  • Pros and cons of trees, pros
  • -
  • Disadvantages
  • -
  • Bagging
  • -
  • Simple example, head or tail
  • -
  • Random forests
  • -
  • A simple scikit-learn example
  • -
  • Please, not the moons again!
  • -
  • Bagging examples
  • -
  • Then random forests
  • -
  • Boosting and more
  • +
  • Visualizing the Tree, Classification
  • +
  • Visualizing the Tree, The Moons
  • +
  • Computing the Gini index
  • +
  • Simple Python Code to read in Data
  • +
  • Computing the Gini Factor
  • +
  • Entropy and the ID3 algorithm
  • +
  • Implementing the ID3 Algorithm
  • +
  • Cancer Data again now with Decision Trees and other Methods
  • +
  • Another example, the moons again
  • +
  • Playing around with regions
  • +
  • Regression trees
  • +
  • Final regressor code
  • +
  • Pros and cons of trees, pros
  • +
  • Disadvantages
  • +
  • Bagging
  • +
  • More bagging
  • +
  • Simple example, head or tail
  • +
  • Bagging Example
  • +
  • Random forests
  • +
  • A simple scikit-learn example
  • +
  • Please, not the moons again!
  • +
  • Bagging examples
  • +
  • Then random forests
  • @@ -195,7 +202,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 29, 2019

    +

    Oct 31, 2019


    @@ -219,7 +226,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 34
  • +
  • 39
  • »
  • diff --git a/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html b/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html index aca451881..2b39f802b 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html @@ -148,7 +148,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

     
    -

    Oct 29, 2019

    +

    Oct 31, 2019


    @@ -627,71 +627,200 @@ $$

    -

    The CART (Classification and Regression Tree) algorithm

    +

    Visualizing the Tree, Classification

    +

    + + +

    import os
    +from sklearn.datasets import load_breast_cancer
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.metrics import confusion_matrix
    +from sklearn.tree import export_graphviz
    +
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import numpy as np
    +
    +
    +cancer = load_breast_cancer()
    +X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
    +print(X)
    +y = pd.Categorical.from_codes(cancer.target, cancer.target_names)
    +y = pd.get_dummies(y)
    +print(y)
    +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/cancer.dot",
    +    feature_names=cancer.feature_names,
    +    class_names=cancer.target_names,
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
    +
    +
    + + +
    +

    Visualizing the Tree, The Moons

    +

    + + +

    # Common imports
    +import numpy as np
    +from sklearn.model_selection import  train_test_split 
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.datasets import make_moons
    +from sklearn.tree import export_graphviz
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import os
    +
    +np.random.seed(42)
    +X, y = make_moons(n_samples=100, noise=0.25, random_state=53)
    +X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/moons.dot",
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
    +os.system(cmd)
    +
    +
    + + +
    +

    Computing the Gini index

    -The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm first before we move on to the information gain algorithm ID3. +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 +etc. The table here contains the feautures outlook, temperature, +humidity and wind. The target or output is whether we ride +(True=1) or whether we do something else that day (False=0). The +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 + + + + + + + + + + + + + + + + + + + + +
    Day Outlook Temperature Humidity Wind Ride
    1 Sunny Hot High Weak 0
    2 Sunny Hot High Strong 1
    3 Overcast Hot High Weak 1
    4 Rain Mild High Weak 1
    5 Rain Cool Normal Weak 1
    6 Rain Cool Normal Strong 0
    7 Overcast Cool Normal Strong 1
    8 Sunny Mild High Weak 0
    9 Sunny Cool Normal Weak 1
    10 Rain Mild Normal Weak 1
    11 Sunny Mild Normal Strong 1
    12 Overcast Mild High Strong 1
    13 Overcast Hot Normal Weak 1
    14 Rain Mild High Strong 0
    +

    + + +
    +

    Simple Python Code to read in Data

    -

    from random import seed
    -from random import randrange
    -from csv import reader
    - 
    -# Load a CSV file
    -def load_csv(filename):
    -	file = open(filename, "rb")
    -	lines = reader(file)
    -	dataset = list(lines)
    -	return dataset
    - 
    -# Convert string column to float
    -def str_column_to_float(dataset, column):
    -	for row in dataset:
    -		row[column] = float(row[column].strip())
    - 
    -# Split a dataset into k folds
    -def cross_validation_split(dataset, n_folds):
    -	dataset_split = list()
    -	dataset_copy = list(dataset)
    -	fold_size = int(len(dataset) / n_folds)
    -	for i in range(n_folds):
    -		fold = list()
    -		while len(fold) < fold_size:
    -			index = randrange(len(dataset_copy))
    -			fold.append(dataset_copy.pop(index))
    -		dataset_split.append(fold)
    -	return dataset_split
    - 
    -# Calculate accuracy percentage
    -def accuracy_metric(actual, predicted):
    -	correct = 0
    -	for i in range(len(actual)):
    -		if actual[i] == predicted[i]:
    -			correct += 1
    -	return correct / float(len(actual)) * 100.0
    - 
    -# Evaluate an algorithm using a cross validation split
    -def evaluate_algorithm(dataset, algorithm, n_folds, *args):
    -	folds = cross_validation_split(dataset, n_folds)
    -	scores = list()
    -	for fold in folds:
    -		train_set = list(folds)
    -		train_set.remove(fold)
    -		train_set = sum(train_set, [])
    -		test_set = list()
    -		for row in fold:
    -			row_copy = list(row)
    -			test_set.append(row_copy)
    -			row_copy[-1] = None
    -		predicted = algorithm(train_set, test_set, *args)
    -		actual = [row[-1] for row in fold]
    -		accuracy = accuracy_metric(actual, predicted)
    -		scores.append(accuracy)
    -	return scores
    - 
    -# Split a dataset based on an attribute and an attribute value
    +
    # Common imports
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import StandardScaler, OneHotEncoder
    +from sklearn.compose import ColumnTransformer
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import os
    +
    +# Where to save the figures and data files
    +PROJECT_ROOT_DIR = "Results"
    +FIGURE_ID = "Results/FigureFiles"
    +DATA_ID = "DataFiles/"
    +
    +if not os.path.exists(PROJECT_ROOT_DIR):
    +    os.mkdir(PROJECT_ROOT_DIR)
    +
    +if not os.path.exists(FIGURE_ID):
    +    os.makedirs(FIGURE_ID)
    +
    +if not os.path.exists(DATA_ID):
    +    os.makedirs(DATA_ID)
    +
    +def image_path(fig_id):
    +    return os.path.join(FIGURE_ID, fig_id)
    +
    +def data_path(dat_id):
    +    return os.path.join(DATA_ID, dat_id)
    +
    +def save_fig(fig_id):
    +    plt.savefig(image_path(fig_id) + ".png", format='png')
    +
    +infile = open(data_path("ride.csv"),'r')
    +
    +# Read the experimental data with Pandas
    +from IPython.display import display
    +ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))
    +ridedata = pd.DataFrame(ridedata)
    +display(ridedata)
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +display(X)
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +display(y)
    +# Categorical variables to one-hot's
    +onehotencoder = OneHotEncoder(categories="auto")
    +
    +X = ColumnTransformer([("", onehotencoder)]).fit_transform(X)
    +y.shape
    +
    +display(X)
    +display(y)
    +
    +
    + + +
    +

    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. + +

    + + +

    # 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:
    @@ -720,7 +849,7 @@ The above functions (gini, entropy and misclassification error) are important co
     		# weight the group score by its relative size
     		gini += (1.0 - score) * (size / n_instances)
     	return gini
    - 
    +
     # Select the best split point for a dataset
     def get_split(dataset):
     	class_values = list(set(row[-1] for row in dataset))
    @@ -729,89 +858,34 @@ The above functions (gini, entropy and misclassification error) are important co
     		for row in dataset:
     			groups = test_split(index, row[index], dataset)
     			gini = gini_index(groups, class_values)
    +			print('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))
     			if gini < b_score:
     				b_index, b_value, b_score, b_groups = index, row[index], gini, groups
     	return {'index':b_index, 'value':b_value, 'groups':b_groups}
      
    -# Create a terminal node value
    -def to_terminal(group):
    -	outcomes = [row[-1] for row in group]
    -	return max(set(outcomes), key=outcomes.count)
    - 
    -# Create child splits for a node or make terminal
    -def split(node, max_depth, min_size, depth):
    -	left, right = node['groups']
    -	del(node['groups'])
    -	# check for a no split
    -	if not left or not right:
    -		node['left'] = node['right'] = to_terminal(left + right)
    -		return
    -	# check for max depth
    -	if depth >= max_depth:
    -		node['left'], node['right'] = to_terminal(left), to_terminal(right)
    -		return
    -	# process left child
    -	if len(left) <= min_size:
    -		node['left'] = to_terminal(left)
    -	else:
    -		node['left'] = get_split(left)
    -		split(node['left'], max_depth, min_size, depth+1)
    -	# process right child
    -	if len(right) <= min_size:
    -		node['right'] = to_terminal(right)
    -	else:
    -		node['right'] = get_split(right)
    -		split(node['right'], max_depth, min_size, depth+1)
    - 
    -# Build a decision tree
    -def build_tree(train, max_depth, min_size):
    -	root = get_split(train)
    -	split(root, max_depth, min_size, 1)
    -	return root
    - 
    -# Make a prediction with a decision tree
    -def predict(node, row):
    -	if row[node['index']] < node['value']:
    -		if isinstance(node['left'], dict):
    -			return predict(node['left'], row)
    -		else:
    -			return node['left']
    -	else:
    -		if isinstance(node['right'], dict):
    -			return predict(node['right'], row)
    -		else:
    -			return node['right']
    - 
    -# Classification and Regression Tree Algorithm
    -def decision_tree(train, test, max_depth, min_size):
    -	tree = build_tree(train, max_depth, min_size)
    -	predictions = list()
    -	for row in test:
    -		prediction = predict(tree, row)
    -		predictions.append(prediction)
    -	return(predictions)
    - 
    -# Test CART 
    -seed(1)
    -# load and prepare data
    -filename = 'DataFiles/rideclass.csv'
    -dataset = load_csv(filename)
    -# convert string attributes to integers
    -for i in range(len(dataset[0])):
    -	str_column_to_float(dataset, i)
    -# evaluate algorithm
    -n_folds = 5
    -max_depth = 5
    -min_size = 10
    -scores = evaluate_algorithm(dataset, decision_tree, n_folds, max_depth, min_size)
    -print('Scores: %s' % scores)
    -print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores))))
    +dataset = [[0,0,0,0,0],
    +            [0,0,0,1,1],
    +            [1,0,0,0,1],
    +            [2,1,0,0,1],
    +            [2,2,1,0,1],
    +            [2,2,1,1,0],
    +            [1,2,1,1,1],
    +            [0,1,0,0,0],
    +            [0,2,1,0,1],
    +            [2,1,1,0,1],
    +            [0,1,1,1,1],
    +            [1,1,0,1,1],
    +            [1,0,1,0,1],
    +            [2,1,0,1,0]]
    +
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
     
    -

    Entropy and the ID3 algorithm

    +

    Entropy and the ID3 algorithm

    ID3, learns decision trees by constructing @@ -848,15 +922,216 @@ attributes at each step while growing the tree.

    -

    Implementing the ID3 Algorithm

    +

    Implementing the ID3 Algorithm

    -more text to come here, material presented during lecture Friday Oct 25. +import re +import math +from collections import deque + +

    + + + + + + +

    +class Node(object): + def __init__(self): + self.value = None + self.next = None + self.childs = None + +

    + + +class DecisionTree(object): + def __init__(self, sample, attributes, labels): + self.sample = sample + self.attributes = attributes + self.labels = labels + self.labelCodes = None + self.labelCodesCount = None + self.initLabelCodes() + # print(self.labelCodes) + self.root = None + self.entropy = self.getEntropy([x for x in range(len(self.labels))]) + +

    + def initLabelCodes(self): + self.labelCodes = [] + self.labelCodesCount = [] + for l in self.labels: + if l not in self.labelCodes: + self.labelCodes.append(l) + self.labelCodesCount.append(0) + self.labelCodesCount[self.labelCodes.index(l)] += 1 + +

    + def getLabelCodeId(self, sampleId): + return self.labelCodes.index(self.labels[sampleId]) + +

    + def getAttributeValues(self, sampleIds, attributeId): + vals = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in vals: + vals.append(val) + # print(vals) + return vals + +

    + def getEntropy(self, sampleIds): + entropy = 0 + labelCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCount[self.getLabelCodeId(sid)] += 1 + # print("-ge", labelCount) + for lv in labelCount: + # print(lv) + if lv != 0: + entropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2) + else: + entropy += 0 + return entropy + +

    + def getDominantLabel(self, sampleIds): + labelCodesCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCodesCount[self.labelCodes.index(self.labels[sid])] += 1 + return self.labelCodes[labelCodesCount.index(max(labelCodesCount))] + +

    + def getInformationGain(self, sampleIds, attributeId): + gain = self.getEntropy(sampleIds) + attributeVals = [] + attributeValsCount = [] + attributeValsIds = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in attributeVals: + attributeVals.append(val) + attributeValsCount.append(0) + attributeValsIds.append([]) + vid = attributeVals.index(val) + attributeValsCount[vid] += 1 + attributeValsIds[vid].append(sid) + # print("-gig", self.attributes[attributeId]) + for vc, vids in zip(attributeValsCount, attributeValsIds): + # print("-gig", vids) + gain -= vc/len(sampleIds) * self.getEntropy(vids) + return gain + +

    + def getAttributeMaxInformationGain(self, sampleIds, attributeIds): + attributesEntropy = [0] * len(attributeIds) + for i, attId in zip(range(len(attributeIds)), attributeIds): + attributesEntropy[i] = self.getInformationGain(sampleIds, attId) + maxId = attributeIds[attributesEntropy.index(max(attributesEntropy))] + return self.attributes[maxId], maxId + +

    + def isSingleLabeled(self, sampleIds): + label = self.labels[sampleIds[0]] + for sid in sampleIds: + if self.labels[sid] != label: + return False + return True + +

    + def getLabel(self, sampleId): + return self.labels[sampleId] + +

    + def id3(self): + sampleIds = [x for x in range(len(self.sample))] + attributeIds = [x for x in range(len(self.attributes))] + self.root = self.id3Recv(sampleIds, attributeIds, self.root) + +

    + def id3Recv(self, sampleIds, attributeIds, root): + root = Node() # Initialize current root + if self.isSingleLabeled(sampleIds): + root.value = self.labels[sampleIds[0]] + return root + # print(attributeIds) + if len(attributeIds) == 0: + root.value = self.getDominantLabel(sampleIds) + return root + bestAttrName, bestAttrId = self.getAttributeMaxInformationGain( + sampleIds, attributeIds) + # print(bestAttrName) + root.value = bestAttrName + root.childs = [] # Create list of children + for value in self.getAttributeValues(sampleIds, bestAttrId): + # print(value) + child = Node() + child.value = value + root.childs.append(child) # Append new child node to current + # root + childSampleIds = [] + for sid in sampleIds: + if self.sample[sid][bestAttrId] == value: + childSampleIds.append(sid) + if len(childSampleIds) == 0: + child.next = self.getDominantLabel(sampleIds) + else: + # print(bestAttrName, bestAttrId) + # print(attributeIds) + if len(attributeIds) > 0 and bestAttrId in attributeIds: + toRemove = attributeIds.index(bestAttrId) + attributeIds.pop(toRemove) + child.next = self.id3Recv( + childSampleIds, attributeIds, child.next) + return root + +

    + def printTree(self): + if self.root: + roots = deque() + roots.append(self.root) + while len(roots) > 0: + root = roots.popleft() + print(root.value) + if root.childs: + for child in root.childs: + print('({})'.format(child.value)) + roots.append(child.next) + elif root.next: + print(root.next) + +

    +def test(): + f = open('DataFiles/rideclass.csv') + attributes = f.readline().split(',') + attributes = attributes[1:len(attributes)-1] + print(attributes) + sample = f.readlines() + f.close() + for i in range(len(sample)): + sample[i] = re.sub('\d+,', '', sample[i]) + sample[i] = sample[i].strip().split(',') + labels = [] + for s in sample: + labels.append(s.pop()) + # print(sample) + # print(labels) + decisionTree = DecisionTree(sample, attributes, labels) + print("System entropy {}".format(decisionTree.entropy)) + decisionTree.id3() + decisionTree.printTree() + +

    +if __name__ == '__main__': + test()

    -

    Cancer Data again now with Decision Trees

    +

    Cancer Data again now with Decision Trees and other Methods

    @@ -906,7 +1181,7 @@ deep_tree_clf.fit(X_train_scaled, y_train)

    -

    Another example, the moons again

    +

    Another example, the moons again

    @@ -979,7 +1254,7 @@ plt.show()

    -

    Playing around with regions

    +

    Playing around with regions

    @@ -987,7 +1262,7 @@ plt.show() Xs = np.random.rand(100, 2) - 0.5 ys = (Xs[:, 0] > 0).astype(np.float32) * 2 -angle = np.pi / 4 +angle = np.pi/4 rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) Xsr = Xs.dot(rotation_matrix) @@ -1008,7 +1283,7 @@ plt.show()

    -

    Regression trees

    +

    Regression trees

    @@ -1031,7 +1306,7 @@ tree_reg.fit(X, y)

    -

    Final regressor code

    +

    Final regressor code

    @@ -1110,7 +1385,7 @@ 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)
    • @@ -1125,7 +1400,7 @@ plt.show()
      -

      Disadvantages

      +

      Disadvantages

      • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
      • @@ -1143,7 +1418,7 @@ However, by aggregating many decision trees, using methods like bagging, random
        -

        Bagging

        +

        Bagging

        The plain decision trees suffer from high @@ -1158,6 +1433,11 @@ of \( n \) to \( p \) is moderately large. Bootstrap aggregation, or just bagging, is a general-purpose procedure for reducing the variance of a statistical learning method. +

        + + +
        +

        More bagging

        Bagging typically results in improved accuracy @@ -1186,7 +1466,7 @@ predictor, averaged over all \( B \) trees.

        -

        Simple example, head or tail

        +

        Simple example, head or tail

        @@ -1207,7 +1487,59 @@ plt.show()

        -

        Random forests

        +

        Bagging Example

        +

        + + +

        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)
        +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
        +
        +from sklearn.ensemble import RandomForestClassifier
        +from sklearn.ensemble import VotingClassifier
        +from sklearn.linear_model import LogisticRegression
        +from sklearn.svm import SVC
        +
        +log_clf = LogisticRegression(solver="liblinear", random_state=42)
        +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
        +svm_clf = SVC(gamma="auto", random_state=42)
        +
        +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
        +
        +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(solver="liblinear", random_state=42)
        +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
        +svm_clf = SVC(gamma="auto", probability=True, random_state=42)
        +
        +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
        +
        +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 @@ -1253,7 +1585,7 @@ this setting.

        -

        A simple scikit-learn example

        +

        A simple scikit-learn example

        @@ -1272,7 +1604,7 @@ accuracy = cross_validate(Random_Forest_model,X,Y,cv=Please, not the moons again! +

        Please, not the moons again!

        @@ -1331,7 +1663,7 @@ voting_clf.fit(X_train, y_train)

        -

        Bagging examples

        +

        Bagging examples

        @@ -1393,7 +1725,7 @@ plt.show()

        -

        Then random forests

        +

        Then random forests

        @@ -1415,12 +1747,6 @@ np.sum(y_pred == y_pred_rf) / len(y_pred)

        -
        -

        Boosting and more

        -More material to come here. -
        - -
    diff --git a/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html b/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html index c889b56e0..b75715681 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html @@ -87,30 +87,32 @@ div { text-align: justify; text-justify: inter-word; } ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -152,7 +154,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 29, 2019

    +

    Oct 31, 2019












    @@ -606,71 +608,196 @@ $$











    -

    The CART (Classification and Regression Tree) algorithm

    +

    Visualizing the Tree, Classification

    +

    + + +

    import os
    +from sklearn.datasets import load_breast_cancer
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.metrics import confusion_matrix
    +from sklearn.tree import export_graphviz
    +
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import numpy as np
    +
    +
    +cancer = load_breast_cancer()
    +X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
    +print(X)
    +y = pd.Categorical.from_codes(cancer.target, cancer.target_names)
    +y = pd.get_dummies(y)
    +print(y)
    +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/cancer.dot",
    +    feature_names=cancer.feature_names,
    +    class_names=cancer.target_names,
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
    +
    +

    +









    + +

    Visualizing the Tree, The Moons

    +

    + + +

    # Common imports
    +import numpy as np
    +from sklearn.model_selection import  train_test_split 
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.datasets import make_moons
    +from sklearn.tree import export_graphviz
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import os
    +
    +np.random.seed(42)
    +X, y = make_moons(n_samples=100, noise=0.25, random_state=53)
    +X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/moons.dot",
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
    +os.system(cmd)
    +
    +

    +









    + +

    Computing the Gini index

    -The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm first before we move on to the information gain algorithm ID3. +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 +etc. The table here contains the feautures outlook, temperature, +humidity and wind. The target or output is whether we ride +(True=1) or whether we do something else that day (False=0). The +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 + + + + + + + + + + + + + + + + + + + + +
    Day Outlook Temperature Humidity Wind Ride
    1 Sunny Hot High Weak 0
    2 Sunny Hot High Strong 1
    3 Overcast Hot High Weak 1
    4 Rain Mild High Weak 1
    5 Rain Cool Normal Weak 1
    6 Rain Cool Normal Strong 0
    7 Overcast Cool Normal Strong 1
    8 Sunny Mild High Weak 0
    9 Sunny Cool Normal Weak 1
    10 Rain Mild Normal Weak 1
    11 Sunny Mild Normal Strong 1
    12 Overcast Mild High Strong 1
    13 Overcast Hot Normal Weak 1
    14 Rain Mild High Strong 0
    +

    +









    + +

    Simple Python Code to read in Data

    -

    from random import seed
    -from random import randrange
    -from csv import reader
    - 
    -# Load a CSV file
    -def load_csv(filename):
    -	file = open(filename, "rb")
    -	lines = reader(file)
    -	dataset = list(lines)
    -	return dataset
    - 
    -# Convert string column to float
    -def str_column_to_float(dataset, column):
    -	for row in dataset:
    -		row[column] = float(row[column].strip())
    - 
    -# Split a dataset into k folds
    -def cross_validation_split(dataset, n_folds):
    -	dataset_split = list()
    -	dataset_copy = list(dataset)
    -	fold_size = int(len(dataset) / n_folds)
    -	for i in range(n_folds):
    -		fold = list()
    -		while len(fold) < fold_size:
    -			index = randrange(len(dataset_copy))
    -			fold.append(dataset_copy.pop(index))
    -		dataset_split.append(fold)
    -	return dataset_split
    - 
    -# Calculate accuracy percentage
    -def accuracy_metric(actual, predicted):
    -	correct = 0
    -	for i in range(len(actual)):
    -		if actual[i] == predicted[i]:
    -			correct += 1
    -	return correct / float(len(actual)) * 100.0
    - 
    -# Evaluate an algorithm using a cross validation split
    -def evaluate_algorithm(dataset, algorithm, n_folds, *args):
    -	folds = cross_validation_split(dataset, n_folds)
    -	scores = list()
    -	for fold in folds:
    -		train_set = list(folds)
    -		train_set.remove(fold)
    -		train_set = sum(train_set, [])
    -		test_set = list()
    -		for row in fold:
    -			row_copy = list(row)
    -			test_set.append(row_copy)
    -			row_copy[-1] = None
    -		predicted = algorithm(train_set, test_set, *args)
    -		actual = [row[-1] for row in fold]
    -		accuracy = accuracy_metric(actual, predicted)
    -		scores.append(accuracy)
    -	return scores
    - 
    -# Split a dataset based on an attribute and an attribute value
    +
    # Common imports
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import StandardScaler, OneHotEncoder
    +from sklearn.compose import ColumnTransformer
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import os
    +
    +# Where to save the figures and data files
    +PROJECT_ROOT_DIR = "Results"
    +FIGURE_ID = "Results/FigureFiles"
    +DATA_ID = "DataFiles/"
    +
    +if not os.path.exists(PROJECT_ROOT_DIR):
    +    os.mkdir(PROJECT_ROOT_DIR)
    +
    +if not os.path.exists(FIGURE_ID):
    +    os.makedirs(FIGURE_ID)
    +
    +if not os.path.exists(DATA_ID):
    +    os.makedirs(DATA_ID)
    +
    +def image_path(fig_id):
    +    return os.path.join(FIGURE_ID, fig_id)
    +
    +def data_path(dat_id):
    +    return os.path.join(DATA_ID, dat_id)
    +
    +def save_fig(fig_id):
    +    plt.savefig(image_path(fig_id) + ".png", format='png')
    +
    +infile = open(data_path("ride.csv"),'r')
    +
    +# Read the experimental data with Pandas
    +from IPython.display import display
    +ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))
    +ridedata = pd.DataFrame(ridedata)
    +display(ridedata)
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +display(X)
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +display(y)
    +# Categorical variables to one-hot's
    +onehotencoder = OneHotEncoder(categories="auto")
    +
    +X = ColumnTransformer([("", onehotencoder)]).fit_transform(X)
    +y.shape
    +
    +display(X)
    +display(y)
    +
    +

    +









    + +

    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. + +

    + + +

    # 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:
    @@ -699,7 +826,7 @@ The above functions (gini, entropy and misclassification error) are important co
     		# weight the group score by its relative size
     		gini += (1.0 - score) * (size / n_instances)
     	return gini
    - 
    +
     # Select the best split point for a dataset
     def get_split(dataset):
     	class_values = list(set(row[-1] for row in dataset))
    @@ -708,88 +835,33 @@ The above functions (gini, entropy and misclassification error) are important co
     		for row in dataset:
     			groups = test_split(index, row[index], dataset)
     			gini = gini_index(groups, class_values)
    +			print('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))
     			if gini < b_score:
     				b_index, b_value, b_score, b_groups = index, row[index], gini, groups
     	return {'index':b_index, 'value':b_value, 'groups':b_groups}
      
    -# Create a terminal node value
    -def to_terminal(group):
    -	outcomes = [row[-1] for row in group]
    -	return max(set(outcomes), key=outcomes.count)
    - 
    -# Create child splits for a node or make terminal
    -def split(node, max_depth, min_size, depth):
    -	left, right = node['groups']
    -	del(node['groups'])
    -	# check for a no split
    -	if not left or not right:
    -		node['left'] = node['right'] = to_terminal(left + right)
    -		return
    -	# check for max depth
    -	if depth >= max_depth:
    -		node['left'], node['right'] = to_terminal(left), to_terminal(right)
    -		return
    -	# process left child
    -	if len(left) <= min_size:
    -		node['left'] = to_terminal(left)
    -	else:
    -		node['left'] = get_split(left)
    -		split(node['left'], max_depth, min_size, depth+1)
    -	# process right child
    -	if len(right) <= min_size:
    -		node['right'] = to_terminal(right)
    -	else:
    -		node['right'] = get_split(right)
    -		split(node['right'], max_depth, min_size, depth+1)
    - 
    -# Build a decision tree
    -def build_tree(train, max_depth, min_size):
    -	root = get_split(train)
    -	split(root, max_depth, min_size, 1)
    -	return root
    - 
    -# Make a prediction with a decision tree
    -def predict(node, row):
    -	if row[node['index']] < node['value']:
    -		if isinstance(node['left'], dict):
    -			return predict(node['left'], row)
    -		else:
    -			return node['left']
    -	else:
    -		if isinstance(node['right'], dict):
    -			return predict(node['right'], row)
    -		else:
    -			return node['right']
    - 
    -# Classification and Regression Tree Algorithm
    -def decision_tree(train, test, max_depth, min_size):
    -	tree = build_tree(train, max_depth, min_size)
    -	predictions = list()
    -	for row in test:
    -		prediction = predict(tree, row)
    -		predictions.append(prediction)
    -	return(predictions)
    - 
    -# Test CART 
    -seed(1)
    -# load and prepare data
    -filename = 'DataFiles/rideclass.csv'
    -dataset = load_csv(filename)
    -# convert string attributes to integers
    -for i in range(len(dataset[0])):
    -	str_column_to_float(dataset, i)
    -# evaluate algorithm
    -n_folds = 5
    -max_depth = 5
    -min_size = 10
    -scores = evaluate_algorithm(dataset, decision_tree, n_folds, max_depth, min_size)
    -print('Scores: %s' % scores)
    -print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores))))
    +dataset = [[0,0,0,0,0],
    +            [0,0,0,1,1],
    +            [1,0,0,0,1],
    +            [2,1,0,0,1],
    +            [2,2,1,0,1],
    +            [2,2,1,1,0],
    +            [1,2,1,1,1],
    +            [0,1,0,0,0],
    +            [0,2,1,0,1],
    +            [2,1,1,0,1],
    +            [0,1,1,1,1],
    +            [1,1,0,1,1],
    +            [1,0,1,0,1],
    +            [2,1,0,1,0]]
    +
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
     











    -

    Entropy and the ID3 algorithm

    +

    Entropy and the ID3 algorithm

    ID3, learns decision trees by constructing @@ -825,15 +897,216 @@ attributes at each step while growing the tree.











    -

    Implementing the ID3 Algorithm

    +

    Implementing the ID3 Algorithm

    -more text to come here, material presented during lecture Friday Oct 25. +import re +import math +from collections import deque + +

    + + + + + + +

    +class Node(object): + def __init__(self): + self.value = None + self.next = None + self.childs = None + +

    + + +class DecisionTree(object): + def __init__(self, sample, attributes, labels): + self.sample = sample + self.attributes = attributes + self.labels = labels + self.labelCodes = None + self.labelCodesCount = None + self.initLabelCodes() + # print(self.labelCodes) + self.root = None + self.entropy = self.getEntropy([x for x in range(len(self.labels))]) + +

    + def initLabelCodes(self): + self.labelCodes = [] + self.labelCodesCount = [] + for l in self.labels: + if l not in self.labelCodes: + self.labelCodes.append(l) + self.labelCodesCount.append(0) + self.labelCodesCount[self.labelCodes.index(l)] += 1 + +

    + def getLabelCodeId(self, sampleId): + return self.labelCodes.index(self.labels[sampleId]) + +

    + def getAttributeValues(self, sampleIds, attributeId): + vals = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in vals: + vals.append(val) + # print(vals) + return vals + +

    + def getEntropy(self, sampleIds): + entropy = 0 + labelCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCount[self.getLabelCodeId(sid)] += 1 + # print("-ge", labelCount) + for lv in labelCount: + # print(lv) + if lv != 0: + entropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2) + else: + entropy += 0 + return entropy + +

    + def getDominantLabel(self, sampleIds): + labelCodesCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCodesCount[self.labelCodes.index(self.labels[sid])] += 1 + return self.labelCodes[labelCodesCount.index(max(labelCodesCount))] + +

    + def getInformationGain(self, sampleIds, attributeId): + gain = self.getEntropy(sampleIds) + attributeVals = [] + attributeValsCount = [] + attributeValsIds = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in attributeVals: + attributeVals.append(val) + attributeValsCount.append(0) + attributeValsIds.append([]) + vid = attributeVals.index(val) + attributeValsCount[vid] += 1 + attributeValsIds[vid].append(sid) + # print("-gig", self.attributes[attributeId]) + for vc, vids in zip(attributeValsCount, attributeValsIds): + # print("-gig", vids) + gain -= vc/len(sampleIds) * self.getEntropy(vids) + return gain + +

    + def getAttributeMaxInformationGain(self, sampleIds, attributeIds): + attributesEntropy = [0] * len(attributeIds) + for i, attId in zip(range(len(attributeIds)), attributeIds): + attributesEntropy[i] = self.getInformationGain(sampleIds, attId) + maxId = attributeIds[attributesEntropy.index(max(attributesEntropy))] + return self.attributes[maxId], maxId + +

    + def isSingleLabeled(self, sampleIds): + label = self.labels[sampleIds[0]] + for sid in sampleIds: + if self.labels[sid] != label: + return False + return True + +

    + def getLabel(self, sampleId): + return self.labels[sampleId] + +

    + def id3(self): + sampleIds = [x for x in range(len(self.sample))] + attributeIds = [x for x in range(len(self.attributes))] + self.root = self.id3Recv(sampleIds, attributeIds, self.root) + +

    + def id3Recv(self, sampleIds, attributeIds, root): + root = Node() # Initialize current root + if self.isSingleLabeled(sampleIds): + root.value = self.labels[sampleIds[0]] + return root + # print(attributeIds) + if len(attributeIds) == 0: + root.value = self.getDominantLabel(sampleIds) + return root + bestAttrName, bestAttrId = self.getAttributeMaxInformationGain( + sampleIds, attributeIds) + # print(bestAttrName) + root.value = bestAttrName + root.childs = [] # Create list of children + for value in self.getAttributeValues(sampleIds, bestAttrId): + # print(value) + child = Node() + child.value = value + root.childs.append(child) # Append new child node to current + # root + childSampleIds = [] + for sid in sampleIds: + if self.sample[sid][bestAttrId] == value: + childSampleIds.append(sid) + if len(childSampleIds) == 0: + child.next = self.getDominantLabel(sampleIds) + else: + # print(bestAttrName, bestAttrId) + # print(attributeIds) + if len(attributeIds) > 0 and bestAttrId in attributeIds: + toRemove = attributeIds.index(bestAttrId) + attributeIds.pop(toRemove) + child.next = self.id3Recv( + childSampleIds, attributeIds, child.next) + return root + +

    + def printTree(self): + if self.root: + roots = deque() + roots.append(self.root) + while len(roots) > 0: + root = roots.popleft() + print(root.value) + if root.childs: + for child in root.childs: + print('({})'.format(child.value)) + roots.append(child.next) + elif root.next: + print(root.next) + +

    +def test(): + f = open('DataFiles/rideclass.csv') + attributes = f.readline().split(',') + attributes = attributes[1:len(attributes)-1] + print(attributes) + sample = f.readlines() + f.close() + for i in range(len(sample)): + sample[i] = re.sub('\d+,', '', sample[i]) + sample[i] = sample[i].strip().split(',') + labels = [] + for s in sample: + labels.append(s.pop()) + # print(sample) + # print(labels) + decisionTree = DecisionTree(sample, attributes, labels) + print("System entropy {}".format(decisionTree.entropy)) + decisionTree.id3() + decisionTree.printTree() + +

    +if __name__ == '__main__': + test()











    -

    Cancer Data again now with Decision Trees

    +

    Cancer Data again now with Decision Trees and other Methods

    @@ -882,7 +1155,7 @@ deep_tree_clf.fit(X_train_scaled, y_train)











    -

    Another example, the moons again

    +

    Another example, the moons again

    @@ -954,7 +1227,7 @@ plt.show()











    -

    Playing around with regions

    +

    Playing around with regions

    @@ -962,7 +1235,7 @@ plt.show() Xs = np.random.rand(100, 2) - 0.5 ys = (Xs[:, 0] > 0).astype(np.float32) * 2 -angle = np.pi / 4 +angle = np.pi/4 rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) Xsr = Xs.dot(rotation_matrix) @@ -982,7 +1255,7 @@ plt.show()











    -

    Regression trees

    +

    Regression trees

    @@ -1004,7 +1277,7 @@ tree_reg.fit(X, y)











    -

    Final regressor code

    +

    Final regressor code

    @@ -1082,7 +1355,7 @@ 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)
    • @@ -1096,7 +1369,7 @@ plt.show()









      -

      Disadvantages

      +

      Disadvantages

      • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
      • @@ -1113,7 +1386,7 @@ However, by aggregating many decision trees, using methods like bagging, random











        -

        Bagging

        +

        Bagging

        The plain decision trees suffer from high @@ -1129,6 +1402,11 @@ of \( n \) to \( p \) is moderately large. general-purpose procedure for reducing the variance of a statistical learning method. +

        +









        + +

        More bagging

        +

        Bagging typically results in improved accuracy over prediction using a single tree. Unfortunately, however, it can be @@ -1156,7 +1434,7 @@ predictor, averaged over all \( B \) trees.











        -

        Simple example, head or tail

        +

        Simple example, head or tail

        @@ -1176,7 +1454,58 @@ plt.show()











        -

        Random forests

        +

        Bagging Example

        +

        + + +

        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)
        +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
        +
        +from sklearn.ensemble import RandomForestClassifier
        +from sklearn.ensemble import VotingClassifier
        +from sklearn.linear_model import LogisticRegression
        +from sklearn.svm import SVC
        +
        +log_clf = LogisticRegression(solver="liblinear", random_state=42)
        +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
        +svm_clf = SVC(gamma="auto", random_state=42)
        +
        +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
        +
        +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(solver="liblinear", random_state=42)
        +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
        +svm_clf = SVC(gamma="auto", probability=True, random_state=42)
        +
        +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
        +
        +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 @@ -1220,7 +1549,7 @@ this setting.











        -

        A simple scikit-learn example

        +

        A simple scikit-learn example

        @@ -1238,7 +1567,7 @@ accuracy = cross_validate(Random_Forest_model,X,Y,cv=Please, not the moons again! +

        Please, not the moons again!

        @@ -1296,7 +1625,7 @@ voting_clf.fit(X_train, y_train)











        -

        Bagging examples

        +

        Bagging examples

        @@ -1357,7 +1686,7 @@ plt.show()











        -

        Then random forests

        +

        Then random forests

        @@ -1376,12 +1705,6 @@ 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 and more

    -More material to come here. -

    diff --git a/doc/pub/DecisionTrees/html/DecisionTrees.html b/doc/pub/DecisionTrees/html/DecisionTrees.html index dfb71089a..5885a1674 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees.html @@ -92,30 +92,32 @@ div { text-align: justify; text-justify: inter-word; } ('A Classification Tree', 2, None, '___sec12'), ('Growing a classification tree', 2, None, '___sec13'), ('Classification tree, how to split nodes', 2, None, '___sec14'), - ('The CART (Classification and Regression Tree) algorithm', + ('Visualizing the Tree, Classification', 2, None, '___sec15'), + ('Visualizing the Tree, The Moons', 2, None, '___sec16'), + ('Computing the Gini index', 2, None, '___sec17'), + ('Simple Python Code to read in Data', 2, None, '___sec18'), + ('Computing the Gini Factor', 2, None, '___sec19'), + ('Entropy and the ID3 algorithm', 2, None, '___sec20'), + ('Implementing the ID3 Algorithm', 2, None, '___sec21'), + ('Cancer Data again now with Decision Trees and other Methods', 2, None, - '___sec15'), - ('Entropy and the ID3 algorithm', 2, None, '___sec16'), - ('Implementing the ID3 Algorithm', 2, None, '___sec17'), - ('Cancer Data again now with Decision Trees', - 2, - None, - '___sec18'), - ('Another example, the moons again', 2, None, '___sec19'), - ('Playing around with regions', 2, None, '___sec20'), - ('Regression trees', 2, None, '___sec21'), - ('Final regressor code', 2, None, '___sec22'), - ('Pros and cons of trees, pros', 2, None, '___sec23'), - ('Disadvantages', 2, None, '___sec24'), - ('Bagging', 2, None, '___sec25'), - ('Simple example, head or tail', 2, None, '___sec26'), - ('Random forests', 2, None, '___sec27'), - ('A simple scikit-learn example', 2, None, '___sec28'), - ('Please, not the moons again!', 2, None, '___sec29'), - ('Bagging examples', 2, None, '___sec30'), - ('Then random forests', 2, None, '___sec31'), - ('Boosting and more', 2, None, '___sec32')]} + '___sec22'), + ('Another example, the moons again', 2, None, '___sec23'), + ('Playing around with regions', 2, None, '___sec24'), + ('Regression trees', 2, None, '___sec25'), + ('Final regressor code', 2, None, '___sec26'), + ('Pros and cons of trees, pros', 2, None, '___sec27'), + ('Disadvantages', 2, None, '___sec28'), + ('Bagging', 2, None, '___sec29'), + ('More bagging', 2, None, '___sec30'), + ('Simple example, head or tail', 2, None, '___sec31'), + ('Bagging Example', 2, None, '___sec32'), + ('Random forests', 2, None, '___sec33'), + ('A simple scikit-learn example', 2, None, '___sec34'), + ('Please, not the moons again!', 2, None, '___sec35'), + ('Bagging examples', 2, None, '___sec36'), + ('Then random forests', 2, None, '___sec37')]} end of tocinfo --> @@ -157,7 +159,7 @@ MathJax.Hub.Config({

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

    -

    Oct 29, 2019

    +

    Oct 31, 2019












    @@ -611,71 +613,196 @@ $$











    -

    The CART (Classification and Regression Tree) algorithm

    +

    Visualizing the Tree, Classification

    +

    + + +

    import os
    +from sklearn.datasets import load_breast_cancer
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.metrics import confusion_matrix
    +from sklearn.tree import export_graphviz
    +
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import numpy as np
    +
    +
    +cancer = load_breast_cancer()
    +X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
    +print(X)
    +y = pd.Categorical.from_codes(cancer.target, cancer.target_names)
    +y = pd.get_dummies(y)
    +print(y)
    +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/cancer.dot",
    +    feature_names=cancer.feature_names,
    +    class_names=cancer.target_names,
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
    +
    +

    +









    + +

    Visualizing the Tree, The Moons

    +

    + + +

    # Common imports
    +import numpy as np
    +from sklearn.model_selection import  train_test_split 
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.datasets import make_moons
    +from sklearn.tree import export_graphviz
    +from pydot import graph_from_dot_data
    +import pandas as pd
    +import os
    +
    +np.random.seed(42)
    +X, y = make_moons(n_samples=100, noise=0.25, random_state=53)
    +X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
    +tree_clf = DecisionTreeClassifier(max_depth=5)
    +tree_clf.fit(X_train, y_train)
    +
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/moons.dot",
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'
    +os.system(cmd)
    +
    +

    +









    + +

    Computing the Gini index

    -The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm first before we move on to the information gain algorithm ID3. +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 +etc. The table here contains the feautures outlook, temperature, +humidity and wind. The target or output is whether we ride +(True=1) or whether we do something else that day (False=0). The +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 + + + + + + + + + + + + + + + + + + + + +
    Day Outlook Temperature Humidity Wind Ride
    1 Sunny Hot High Weak 0
    2 Sunny Hot High Strong 1
    3 Overcast Hot High Weak 1
    4 Rain Mild High Weak 1
    5 Rain Cool Normal Weak 1
    6 Rain Cool Normal Strong 0
    7 Overcast Cool Normal Strong 1
    8 Sunny Mild High Weak 0
    9 Sunny Cool Normal Weak 1
    10 Rain Mild Normal Weak 1
    11 Sunny Mild Normal Strong 1
    12 Overcast Mild High Strong 1
    13 Overcast Hot Normal Weak 1
    14 Rain Mild High Strong 0
    +

    +









    + +

    Simple Python Code to read in Data

    -

    from random import seed
    -from random import randrange
    -from csv import reader
    - 
    -# Load a CSV file
    -def load_csv(filename):
    -	file = open(filename, "rb")
    -	lines = reader(file)
    -	dataset = list(lines)
    -	return dataset
    - 
    -# Convert string column to float
    -def str_column_to_float(dataset, column):
    -	for row in dataset:
    -		row[column] = float(row[column].strip())
    - 
    -# Split a dataset into k folds
    -def cross_validation_split(dataset, n_folds):
    -	dataset_split = list()
    -	dataset_copy = list(dataset)
    -	fold_size = int(len(dataset) / n_folds)
    -	for i in range(n_folds):
    -		fold = list()
    -		while len(fold) < fold_size:
    -			index = randrange(len(dataset_copy))
    -			fold.append(dataset_copy.pop(index))
    -		dataset_split.append(fold)
    -	return dataset_split
    - 
    -# Calculate accuracy percentage
    -def accuracy_metric(actual, predicted):
    -	correct = 0
    -	for i in range(len(actual)):
    -		if actual[i] == predicted[i]:
    -			correct += 1
    -	return correct / float(len(actual)) * 100.0
    - 
    -# Evaluate an algorithm using a cross validation split
    -def evaluate_algorithm(dataset, algorithm, n_folds, *args):
    -	folds = cross_validation_split(dataset, n_folds)
    -	scores = list()
    -	for fold in folds:
    -		train_set = list(folds)
    -		train_set.remove(fold)
    -		train_set = sum(train_set, [])
    -		test_set = list()
    -		for row in fold:
    -			row_copy = list(row)
    -			test_set.append(row_copy)
    -			row_copy[-1] = None
    -		predicted = algorithm(train_set, test_set, *args)
    -		actual = [row[-1] for row in fold]
    -		accuracy = accuracy_metric(actual, predicted)
    -		scores.append(accuracy)
    -	return scores
    - 
    -# Split a dataset based on an attribute and an attribute value
    +
    # Common imports
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import StandardScaler, OneHotEncoder
    +from sklearn.compose import ColumnTransformer
    +from IPython.display import Image 
    +from pydot import graph_from_dot_data
    +import os
    +
    +# Where to save the figures and data files
    +PROJECT_ROOT_DIR = "Results"
    +FIGURE_ID = "Results/FigureFiles"
    +DATA_ID = "DataFiles/"
    +
    +if not os.path.exists(PROJECT_ROOT_DIR):
    +    os.mkdir(PROJECT_ROOT_DIR)
    +
    +if not os.path.exists(FIGURE_ID):
    +    os.makedirs(FIGURE_ID)
    +
    +if not os.path.exists(DATA_ID):
    +    os.makedirs(DATA_ID)
    +
    +def image_path(fig_id):
    +    return os.path.join(FIGURE_ID, fig_id)
    +
    +def data_path(dat_id):
    +    return os.path.join(DATA_ID, dat_id)
    +
    +def save_fig(fig_id):
    +    plt.savefig(image_path(fig_id) + ".png", format='png')
    +
    +infile = open(data_path("ride.csv"),'r')
    +
    +# Read the experimental data with Pandas
    +from IPython.display import display
    +ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))
    +ridedata = pd.DataFrame(ridedata)
    +display(ridedata)
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +display(X)
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +display(y)
    +# Categorical variables to one-hot's
    +onehotencoder = OneHotEncoder(categories="auto")
    +
    +X = ColumnTransformer([("", onehotencoder)]).fit_transform(X)
    +y.shape
    +
    +display(X)
    +display(y)
    +
    +

    +









    + +

    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. + +

    + + +

    # 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:
    @@ -704,7 +831,7 @@ The above functions (gini, entropy and misclassification error) are important co
     		# weight the group score by its relative size
     		gini += (1.0 - score) * (size / n_instances)
     	return gini
    - 
    +
     # Select the best split point for a dataset
     def get_split(dataset):
     	class_values = list(set(row[-1] for row in dataset))
    @@ -713,88 +840,33 @@ The above functions (gini, entropy and misclassification error) are important co
     		for row in dataset:
     			groups = test_split(index, row[index], dataset)
     			gini = gini_index(groups, class_values)
    +			print('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))
     			if gini < b_score:
     				b_index, b_value, b_score, b_groups = index, row[index], gini, groups
     	return {'index':b_index, 'value':b_value, 'groups':b_groups}
      
    -# Create a terminal node value
    -def to_terminal(group):
    -	outcomes = [row[-1] for row in group]
    -	return max(set(outcomes), key=outcomes.count)
    - 
    -# Create child splits for a node or make terminal
    -def split(node, max_depth, min_size, depth):
    -	left, right = node['groups']
    -	del(node['groups'])
    -	# check for a no split
    -	if not left or not right:
    -		node['left'] = node['right'] = to_terminal(left + right)
    -		return
    -	# check for max depth
    -	if depth >= max_depth:
    -		node['left'], node['right'] = to_terminal(left), to_terminal(right)
    -		return
    -	# process left child
    -	if len(left) <= min_size:
    -		node['left'] = to_terminal(left)
    -	else:
    -		node['left'] = get_split(left)
    -		split(node['left'], max_depth, min_size, depth+1)
    -	# process right child
    -	if len(right) <= min_size:
    -		node['right'] = to_terminal(right)
    -	else:
    -		node['right'] = get_split(right)
    -		split(node['right'], max_depth, min_size, depth+1)
    - 
    -# Build a decision tree
    -def build_tree(train, max_depth, min_size):
    -	root = get_split(train)
    -	split(root, max_depth, min_size, 1)
    -	return root
    - 
    -# Make a prediction with a decision tree
    -def predict(node, row):
    -	if row[node['index']] < node['value']:
    -		if isinstance(node['left'], dict):
    -			return predict(node['left'], row)
    -		else:
    -			return node['left']
    -	else:
    -		if isinstance(node['right'], dict):
    -			return predict(node['right'], row)
    -		else:
    -			return node['right']
    - 
    -# Classification and Regression Tree Algorithm
    -def decision_tree(train, test, max_depth, min_size):
    -	tree = build_tree(train, max_depth, min_size)
    -	predictions = list()
    -	for row in test:
    -		prediction = predict(tree, row)
    -		predictions.append(prediction)
    -	return(predictions)
    - 
    -# Test CART 
    -seed(1)
    -# load and prepare data
    -filename = 'DataFiles/rideclass.csv'
    -dataset = load_csv(filename)
    -# convert string attributes to integers
    -for i in range(len(dataset[0])):
    -	str_column_to_float(dataset, i)
    -# evaluate algorithm
    -n_folds = 5
    -max_depth = 5
    -min_size = 10
    -scores = evaluate_algorithm(dataset, decision_tree, n_folds, max_depth, min_size)
    -print('Scores: %s' % scores)
    -print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores))))
    +dataset = [[0,0,0,0,0],
    +            [0,0,0,1,1],
    +            [1,0,0,0,1],
    +            [2,1,0,0,1],
    +            [2,2,1,0,1],
    +            [2,2,1,1,0],
    +            [1,2,1,1,1],
    +            [0,1,0,0,0],
    +            [0,2,1,0,1],
    +            [2,1,1,0,1],
    +            [0,1,1,1,1],
    +            [1,1,0,1,1],
    +            [1,0,1,0,1],
    +            [2,1,0,1,0]]
    +
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
     











    -

    Entropy and the ID3 algorithm

    +

    Entropy and the ID3 algorithm

    ID3, learns decision trees by constructing @@ -830,15 +902,216 @@ attributes at each step while growing the tree.











    -

    Implementing the ID3 Algorithm

    +

    Implementing the ID3 Algorithm

    -more text to come here, material presented during lecture Friday Oct 25. +import re +import math +from collections import deque + +

    + + + + + + +

    +class Node(object): + def __init__(self): + self.value = None + self.next = None + self.childs = None + +

    + + +class DecisionTree(object): + def __init__(self, sample, attributes, labels): + self.sample = sample + self.attributes = attributes + self.labels = labels + self.labelCodes = None + self.labelCodesCount = None + self.initLabelCodes() + # print(self.labelCodes) + self.root = None + self.entropy = self.getEntropy([x for x in range(len(self.labels))]) + +

    + def initLabelCodes(self): + self.labelCodes = [] + self.labelCodesCount = [] + for l in self.labels: + if l not in self.labelCodes: + self.labelCodes.append(l) + self.labelCodesCount.append(0) + self.labelCodesCount[self.labelCodes.index(l)] += 1 + +

    + def getLabelCodeId(self, sampleId): + return self.labelCodes.index(self.labels[sampleId]) + +

    + def getAttributeValues(self, sampleIds, attributeId): + vals = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in vals: + vals.append(val) + # print(vals) + return vals + +

    + def getEntropy(self, sampleIds): + entropy = 0 + labelCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCount[self.getLabelCodeId(sid)] += 1 + # print("-ge", labelCount) + for lv in labelCount: + # print(lv) + if lv != 0: + entropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2) + else: + entropy += 0 + return entropy + +

    + def getDominantLabel(self, sampleIds): + labelCodesCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCodesCount[self.labelCodes.index(self.labels[sid])] += 1 + return self.labelCodes[labelCodesCount.index(max(labelCodesCount))] + +

    + def getInformationGain(self, sampleIds, attributeId): + gain = self.getEntropy(sampleIds) + attributeVals = [] + attributeValsCount = [] + attributeValsIds = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in attributeVals: + attributeVals.append(val) + attributeValsCount.append(0) + attributeValsIds.append([]) + vid = attributeVals.index(val) + attributeValsCount[vid] += 1 + attributeValsIds[vid].append(sid) + # print("-gig", self.attributes[attributeId]) + for vc, vids in zip(attributeValsCount, attributeValsIds): + # print("-gig", vids) + gain -= vc/len(sampleIds) * self.getEntropy(vids) + return gain + +

    + def getAttributeMaxInformationGain(self, sampleIds, attributeIds): + attributesEntropy = [0] * len(attributeIds) + for i, attId in zip(range(len(attributeIds)), attributeIds): + attributesEntropy[i] = self.getInformationGain(sampleIds, attId) + maxId = attributeIds[attributesEntropy.index(max(attributesEntropy))] + return self.attributes[maxId], maxId + +

    + def isSingleLabeled(self, sampleIds): + label = self.labels[sampleIds[0]] + for sid in sampleIds: + if self.labels[sid] != label: + return False + return True + +

    + def getLabel(self, sampleId): + return self.labels[sampleId] + +

    + def id3(self): + sampleIds = [x for x in range(len(self.sample))] + attributeIds = [x for x in range(len(self.attributes))] + self.root = self.id3Recv(sampleIds, attributeIds, self.root) + +

    + def id3Recv(self, sampleIds, attributeIds, root): + root = Node() # Initialize current root + if self.isSingleLabeled(sampleIds): + root.value = self.labels[sampleIds[0]] + return root + # print(attributeIds) + if len(attributeIds) == 0: + root.value = self.getDominantLabel(sampleIds) + return root + bestAttrName, bestAttrId = self.getAttributeMaxInformationGain( + sampleIds, attributeIds) + # print(bestAttrName) + root.value = bestAttrName + root.childs = [] # Create list of children + for value in self.getAttributeValues(sampleIds, bestAttrId): + # print(value) + child = Node() + child.value = value + root.childs.append(child) # Append new child node to current + # root + childSampleIds = [] + for sid in sampleIds: + if self.sample[sid][bestAttrId] == value: + childSampleIds.append(sid) + if len(childSampleIds) == 0: + child.next = self.getDominantLabel(sampleIds) + else: + # print(bestAttrName, bestAttrId) + # print(attributeIds) + if len(attributeIds) > 0 and bestAttrId in attributeIds: + toRemove = attributeIds.index(bestAttrId) + attributeIds.pop(toRemove) + child.next = self.id3Recv( + childSampleIds, attributeIds, child.next) + return root + +

    + def printTree(self): + if self.root: + roots = deque() + roots.append(self.root) + while len(roots) > 0: + root = roots.popleft() + print(root.value) + if root.childs: + for child in root.childs: + print('({})'.format(child.value)) + roots.append(child.next) + elif root.next: + print(root.next) + +

    +def test(): + f = open('DataFiles/rideclass.csv') + attributes = f.readline().split(',') + attributes = attributes[1:len(attributes)-1] + print(attributes) + sample = f.readlines() + f.close() + for i in range(len(sample)): + sample[i] = re.sub('\d+,', '', sample[i]) + sample[i] = sample[i].strip().split(',') + labels = [] + for s in sample: + labels.append(s.pop()) + # print(sample) + # print(labels) + decisionTree = DecisionTree(sample, attributes, labels) + print("System entropy {}".format(decisionTree.entropy)) + decisionTree.id3() + decisionTree.printTree() + +

    +if __name__ == '__main__': + test()











    -

    Cancer Data again now with Decision Trees

    +

    Cancer Data again now with Decision Trees and other Methods

    @@ -887,7 +1160,7 @@ deep_tree_clf.fit(X_train_scaled, y_train)











    -

    Another example, the moons again

    +

    Another example, the moons again

    @@ -959,7 +1232,7 @@ plt.show()











    -

    Playing around with regions

    +

    Playing around with regions

    @@ -967,7 +1240,7 @@ plt.show() Xs = np.random.rand(100, 2) - 0.5 ys = (Xs[:, 0] > 0).astype(np.float32) * 2 -angle = np.pi / 4 +angle = np.pi/4 rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) Xsr = Xs.dot(rotation_matrix) @@ -987,7 +1260,7 @@ plt.show()











    -

    Regression trees

    +

    Regression trees

    @@ -1009,7 +1282,7 @@ tree_reg.fit(X, y)











    -

    Final regressor code

    +

    Final regressor code

    @@ -1087,7 +1360,7 @@ 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)
    • @@ -1101,7 +1374,7 @@ plt.show()









      -

      Disadvantages

      +

      Disadvantages

      • Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches
      • @@ -1118,7 +1391,7 @@ However, by aggregating many decision trees, using methods like bagging, random











        -

        Bagging

        +

        Bagging

        The plain decision trees suffer from high @@ -1134,6 +1407,11 @@ of \( n \) to \( p \) is moderately large. general-purpose procedure for reducing the variance of a statistical learning method. +

        +









        + +

        More bagging

        +

        Bagging typically results in improved accuracy over prediction using a single tree. Unfortunately, however, it can be @@ -1161,7 +1439,7 @@ predictor, averaged over all \( B \) trees.











        -

        Simple example, head or tail

        +

        Simple example, head or tail

        @@ -1181,7 +1459,58 @@ plt.show()











        -

        Random forests

        +

        Bagging Example

        +

        + + +

        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)
        +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
        +
        +from sklearn.ensemble import RandomForestClassifier
        +from sklearn.ensemble import VotingClassifier
        +from sklearn.linear_model import LogisticRegression
        +from sklearn.svm import SVC
        +
        +log_clf = LogisticRegression(solver="liblinear", random_state=42)
        +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
        +svm_clf = SVC(gamma="auto", random_state=42)
        +
        +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
        +
        +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(solver="liblinear", random_state=42)
        +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)
        +svm_clf = SVC(gamma="auto", probability=True, random_state=42)
        +
        +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
        +
        +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 @@ -1225,7 +1554,7 @@ this setting.











        -

        A simple scikit-learn example

        +

        A simple scikit-learn example

        @@ -1243,7 +1572,7 @@ accuracy = cross_validate(Random_Forest_mode











        -

        Please, not the moons again!

        +

        Please, not the moons again!

        @@ -1301,7 +1630,7 @@ voting_clf.fit(X_train, y_train)











        -

        Bagging examples

        +

        Bagging examples

        @@ -1362,7 +1691,7 @@ plt.show()











        -

        Then random forests

        +

        Then random forests

        @@ -1381,12 +1710,6 @@ 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 and more

    -More material to come here. -

    diff --git a/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb b/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb index ac3afe181..e06ed31ed 100644 --- a/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb +++ b/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb @@ -10,7 +10,7 @@ " \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: **Oct 29, 2019**\n", + "Date: **Oct 31, 2019**\n", "\n", "Copyright 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", @@ -506,9 +506,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## The CART (Classification and Regression Tree) algorithm\n", - "\n", - "The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm first before we move on to the information gain algorithm ID3." + "## Visualizing the Tree, Classification" ] }, { @@ -519,62 +517,210 @@ }, "outputs": [], "source": [ - "from random import seed\n", - "from random import randrange\n", - "from csv import reader\n", - " \n", - "# Load a CSV file\n", - "def load_csv(filename):\n", - "\tfile = open(filename, \"rb\")\n", - "\tlines = reader(file)\n", - "\tdataset = list(lines)\n", - "\treturn dataset\n", - " \n", - "# Convert string column to float\n", - "def str_column_to_float(dataset, column):\n", - "\tfor row in dataset:\n", - "\t\trow[column] = float(row[column].strip())\n", - " \n", - "# Split a dataset into k folds\n", - "def cross_validation_split(dataset, n_folds):\n", - "\tdataset_split = list()\n", - "\tdataset_copy = list(dataset)\n", - "\tfold_size = int(len(dataset) / n_folds)\n", - "\tfor i in range(n_folds):\n", - "\t\tfold = list()\n", - "\t\twhile len(fold) < fold_size:\n", - "\t\t\tindex = randrange(len(dataset_copy))\n", - "\t\t\tfold.append(dataset_copy.pop(index))\n", - "\t\tdataset_split.append(fold)\n", - "\treturn dataset_split\n", - " \n", - "# Calculate accuracy percentage\n", - "def accuracy_metric(actual, predicted):\n", - "\tcorrect = 0\n", - "\tfor i in range(len(actual)):\n", - "\t\tif actual[i] == predicted[i]:\n", - "\t\t\tcorrect += 1\n", - "\treturn correct / float(len(actual)) * 100.0\n", - " \n", - "# Evaluate an algorithm using a cross validation split\n", - "def evaluate_algorithm(dataset, algorithm, n_folds, *args):\n", - "\tfolds = cross_validation_split(dataset, n_folds)\n", - "\tscores = list()\n", - "\tfor fold in folds:\n", - "\t\ttrain_set = list(folds)\n", - "\t\ttrain_set.remove(fold)\n", - "\t\ttrain_set = sum(train_set, [])\n", - "\t\ttest_set = list()\n", - "\t\tfor row in fold:\n", - "\t\t\trow_copy = list(row)\n", - "\t\t\ttest_set.append(row_copy)\n", - "\t\t\trow_copy[-1] = None\n", - "\t\tpredicted = algorithm(train_set, test_set, *args)\n", - "\t\tactual = [row[-1] for row in fold]\n", - "\t\taccuracy = accuracy_metric(actual, predicted)\n", - "\t\tscores.append(accuracy)\n", - "\treturn scores\n", - " \n", + "import os\n", + "from sklearn.datasets import load_breast_cancer\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.tree import export_graphviz\n", + "\n", + "from IPython.display import Image \n", + "from pydot import graph_from_dot_data\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "\n", + "cancer = load_breast_cancer()\n", + "X = pd.DataFrame(cancer.data, columns=cancer.feature_names)\n", + "print(X)\n", + "y = pd.Categorical.from_codes(cancer.target, cancer.target_names)\n", + "y = pd.get_dummies(y)\n", + "print(y)\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)\n", + "tree_clf = DecisionTreeClassifier(max_depth=5)\n", + "tree_clf.fit(X_train, y_train)\n", + "\n", + "export_graphviz(\n", + " tree_clf,\n", + " out_file=\"DataFiles/cancer.dot\",\n", + " feature_names=cancer.feature_names,\n", + " class_names=cancer.target_names,\n", + " rounded=True,\n", + " filled=True\n", + ")\n", + "cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n", + "os.system(cmd)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing the Tree, The Moons" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Common imports\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split \n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.datasets import make_moons\n", + "from sklearn.tree import export_graphviz\n", + "from pydot import graph_from_dot_data\n", + "import pandas as pd\n", + "import os\n", + "\n", + "np.random.seed(42)\n", + "X, y = make_moons(n_samples=100, noise=0.25, random_state=53)\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)\n", + "tree_clf = DecisionTreeClassifier(max_depth=5)\n", + "tree_clf.fit(X_train, y_train)\n", + "\n", + "export_graphviz(\n", + " tree_clf,\n", + " out_file=\"DataFiles/moons.dot\",\n", + " rounded=True,\n", + " filled=True\n", + ")\n", + "cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'\n", + "os.system(cmd)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computing the Gini index\n", + "\n", + "The example we will look at is a classical one in many Machine\n", + "Learning applications. Based on various meteorological features, we\n", + "have several so-called attributes which decide whether we at the end\n", + "will do some outdoor activity like skiing, going for a bike ride etc\n", + "etc. The table here contains the feautures **outlook**, **temperature**,\n", + "**humidity** and **wind**. The target or output is whether we ride\n", + "(True=1) or whether we do something else that day (False=0). The\n", + "attributes for each feature are then sunny, overcast and rain for the\n", + "outlook, hot, cold and mild for temperature, high and normal for\n", + "humidity and weak and strong for wind.\n", + "\n", + "The table here summarizes the various attributes and\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    Day Outlook Temperature Humidity Wind Ride
    1 Sunny Hot High Weak 0
    2 Sunny Hot High Strong 1
    3 Overcast Hot High Weak 1
    4 Rain Mild High Weak 1
    5 Rain Cool Normal Weak 1
    6 Rain Cool Normal Strong 0
    7 Overcast Cool Normal Strong 1
    8 Sunny Mild High Weak 0
    9 Sunny Cool Normal Weak 1
    10 Rain Mild Normal Weak 1
    11 Sunny Mild Normal Strong 1
    12 Overcast Mild High Strong 1
    13 Overcast Hot Normal Weak 1
    14 Rain Mild High Strong 0
    \n", + "\n", + "## Simple Python Code to read in Data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Common imports\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "from IPython.display import Image \n", + "from pydot import graph_from_dot_data\n", + "import os\n", + "\n", + "# Where to save the figures and data files\n", + "PROJECT_ROOT_DIR = \"Results\"\n", + "FIGURE_ID = \"Results/FigureFiles\"\n", + "DATA_ID = \"DataFiles/\"\n", + "\n", + "if not os.path.exists(PROJECT_ROOT_DIR):\n", + " os.mkdir(PROJECT_ROOT_DIR)\n", + "\n", + "if not os.path.exists(FIGURE_ID):\n", + " os.makedirs(FIGURE_ID)\n", + "\n", + "if not os.path.exists(DATA_ID):\n", + " os.makedirs(DATA_ID)\n", + "\n", + "def image_path(fig_id):\n", + " return os.path.join(FIGURE_ID, fig_id)\n", + "\n", + "def data_path(dat_id):\n", + " return os.path.join(DATA_ID, dat_id)\n", + "\n", + "def save_fig(fig_id):\n", + " plt.savefig(image_path(fig_id) + \".png\", format='png')\n", + "\n", + "infile = open(data_path(\"ride.csv\"),'r')\n", + "\n", + "# Read the experimental data with Pandas\n", + "from IPython.display import display\n", + "ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))\n", + "ridedata = pd.DataFrame(ridedata)\n", + "display(ridedata)\n", + "# Features and targets\n", + "X = ridedata.loc[:, ridedata.columns != 'Ride'].values\n", + "display(X)\n", + "y = ridedata.loc[:, ridedata.columns == 'Ride'].values\n", + "display(y)\n", + "# Categorical variables to one-hot's\n", + "onehotencoder = OneHotEncoder(categories=\"auto\")\n", + "\n", + "X = ColumnTransformer([(\"\", onehotencoder)]).fit_transform(X)\n", + "y.shape\n", + "\n", + "display(X)\n", + "display(y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computing the Gini Factor\n", + "\n", + "The above functions (gini, entropy and misclassification error) are\n", + "important components of the so-called CART algorithm. We will discuss\n", + "this algorithm below after we have discussed the information gain\n", + "algorithm ID3.\n", + "\n", + "In the example here we have converted all our attributes into numerical values $0,1,2$ etc." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ "# Split a dataset based on an attribute and an attribute value\n", "def test_split(index, value, dataset):\n", "\tleft, right = list(), list()\n", @@ -604,7 +750,7 @@ "\t\t# weight the group score by its relative size\n", "\t\tgini += (1.0 - score) * (size / n_instances)\n", "\treturn gini\n", - " \n", + "\n", "# Select the best split point for a dataset\n", "def get_split(dataset):\n", "\tclass_values = list(set(row[-1] for row in dataset))\n", @@ -613,83 +759,28 @@ "\t\tfor row in dataset:\n", "\t\t\tgroups = test_split(index, row[index], dataset)\n", "\t\t\tgini = gini_index(groups, class_values)\n", + "\t\t\tprint('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))\n", "\t\t\tif gini < b_score:\n", "\t\t\t\tb_index, b_value, b_score, b_groups = index, row[index], gini, groups\n", "\treturn {'index':b_index, 'value':b_value, 'groups':b_groups}\n", " \n", - "# Create a terminal node value\n", - "def to_terminal(group):\n", - "\toutcomes = [row[-1] for row in group]\n", - "\treturn max(set(outcomes), key=outcomes.count)\n", - " \n", - "# Create child splits for a node or make terminal\n", - "def split(node, max_depth, min_size, depth):\n", - "\tleft, right = node['groups']\n", - "\tdel(node['groups'])\n", - "\t# check for a no split\n", - "\tif not left or not right:\n", - "\t\tnode['left'] = node['right'] = to_terminal(left + right)\n", - "\t\treturn\n", - "\t# check for max depth\n", - "\tif depth >= max_depth:\n", - "\t\tnode['left'], node['right'] = to_terminal(left), to_terminal(right)\n", - "\t\treturn\n", - "\t# process left child\n", - "\tif len(left) <= min_size:\n", - "\t\tnode['left'] = to_terminal(left)\n", - "\telse:\n", - "\t\tnode['left'] = get_split(left)\n", - "\t\tsplit(node['left'], max_depth, min_size, depth+1)\n", - "\t# process right child\n", - "\tif len(right) <= min_size:\n", - "\t\tnode['right'] = to_terminal(right)\n", - "\telse:\n", - "\t\tnode['right'] = get_split(right)\n", - "\t\tsplit(node['right'], max_depth, min_size, depth+1)\n", - " \n", - "# Build a decision tree\n", - "def build_tree(train, max_depth, min_size):\n", - "\troot = get_split(train)\n", - "\tsplit(root, max_depth, min_size, 1)\n", - "\treturn root\n", - " \n", - "# Make a prediction with a decision tree\n", - "def predict(node, row):\n", - "\tif row[node['index']] < node['value']:\n", - "\t\tif isinstance(node['left'], dict):\n", - "\t\t\treturn predict(node['left'], row)\n", - "\t\telse:\n", - "\t\t\treturn node['left']\n", - "\telse:\n", - "\t\tif isinstance(node['right'], dict):\n", - "\t\t\treturn predict(node['right'], row)\n", - "\t\telse:\n", - "\t\t\treturn node['right']\n", - " \n", - "# Classification and Regression Tree Algorithm\n", - "def decision_tree(train, test, max_depth, min_size):\n", - "\ttree = build_tree(train, max_depth, min_size)\n", - "\tpredictions = list()\n", - "\tfor row in test:\n", - "\t\tprediction = predict(tree, row)\n", - "\t\tpredictions.append(prediction)\n", - "\treturn(predictions)\n", - " \n", - "# Test CART \n", - "seed(1)\n", - "# load and prepare data\n", - "filename = 'DataFiles/rideclass.csv'\n", - "dataset = load_csv(filename)\n", - "# convert string attributes to integers\n", - "for i in range(len(dataset[0])):\n", - "\tstr_column_to_float(dataset, i)\n", - "# evaluate algorithm\n", - "n_folds = 5\n", - "max_depth = 5\n", - "min_size = 10\n", - "scores = evaluate_algorithm(dataset, decision_tree, n_folds, max_depth, min_size)\n", - "print('Scores: %s' % scores)\n", - "print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores))))" + "dataset = [[0,0,0,0,0],\n", + " [0,0,0,1,1],\n", + " [1,0,0,0,1],\n", + " [2,1,0,0,1],\n", + " [2,2,1,0,1],\n", + " [2,2,1,1,0],\n", + " [1,2,1,1,1],\n", + " [0,1,0,0,0],\n", + " [0,2,1,0,1],\n", + " [2,1,1,0,1],\n", + " [0,1,1,1,1],\n", + " [1,1,0,1,1],\n", + " [1,0,1,0,1],\n", + " [2,1,0,1,0]]\n", + "\n", + "split = get_split(dataset)\n", + "print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))" ] }, { @@ -729,14 +820,201 @@ "\n", "## Implementing the ID3 Algorithm\n", "\n", - "**more text to come here**, material presented during lecture Friday Oct 25.\n", + "import re\n", + "import math\n", + "from collections import deque\n", "\n", - "## Cancer Data again now with Decision Trees" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "class Node(object):\n", + "\tdef __init__(self):\n", + "\t\tself.value = None\n", + "\t\tself.next = None\n", + "\t\tself.childs = None\n", + "\n", + "\n", + "\n", + "class DecisionTree(object):\n", + "\tdef __init__(self, sample, attributes, labels):\n", + "\t\tself.sample = sample\n", + "\t\tself.attributes = attributes\n", + "\t\tself.labels = labels\n", + "\t\tself.labelCodes = None\n", + "\t\tself.labelCodesCount = None\n", + "\t\tself.initLabelCodes()\n", + "\t\t# print(self.labelCodes)\n", + "\t\tself.root = None\n", + "\t\tself.entropy = self.getEntropy([x for x in range(len(self.labels))])\n", + "\n", + "\tdef initLabelCodes(self):\n", + "\t\tself.labelCodes = []\n", + "\t\tself.labelCodesCount = []\n", + "\t\tfor l in self.labels:\n", + "\t\t\tif l not in self.labelCodes:\n", + "\t\t\t\tself.labelCodes.append(l)\n", + "\t\t\t\tself.labelCodesCount.append(0)\n", + "\t\t\tself.labelCodesCount[self.labelCodes.index(l)] += 1\n", + "\n", + "\tdef getLabelCodeId(self, sampleId):\n", + "\t\treturn self.labelCodes.index(self.labels[sampleId])\n", + "\n", + "\tdef getAttributeValues(self, sampleIds, attributeId):\n", + "\t\tvals = []\n", + "\t\tfor sid in sampleIds:\n", + "\t\t\tval = self.sample[sid][attributeId]\n", + "\t\t\tif val not in vals:\n", + "\t\t\t\tvals.append(val)\n", + "\t\t# print(vals)\n", + "\t\treturn vals\n", + "\n", + "\tdef getEntropy(self, sampleIds):\n", + "\t\tentropy = 0\n", + "\t\tlabelCount = [0] * len(self.labelCodes)\n", + "\t\tfor sid in sampleIds:\n", + "\t\t\tlabelCount[self.getLabelCodeId(sid)] += 1\n", + "\t\t# print(\"-ge\", labelCount)\n", + "\t\tfor lv in labelCount:\n", + "\t\t\t# print(lv)\n", + "\t\t\tif lv != 0:\n", + "\t\t\t\tentropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2)\n", + "\t\t\telse:\n", + "\t\t\t\tentropy += 0\n", + "\t\treturn entropy\n", + "\n", + "\tdef getDominantLabel(self, sampleIds):\n", + "\t\tlabelCodesCount = [0] * len(self.labelCodes)\n", + "\t\tfor sid in sampleIds:\n", + "\t\t\tlabelCodesCount[self.labelCodes.index(self.labels[sid])] += 1\n", + "\t\treturn self.labelCodes[labelCodesCount.index(max(labelCodesCount))]\n", + "\n", + "\tdef getInformationGain(self, sampleIds, attributeId):\n", + "\t\tgain = self.getEntropy(sampleIds)\n", + "\t\tattributeVals = []\n", + "\t\tattributeValsCount = []\n", + "\t\tattributeValsIds = []\n", + "\t\tfor sid in sampleIds:\n", + "\t\t\tval = self.sample[sid][attributeId]\n", + "\t\t\tif val not in attributeVals:\n", + "\t\t\t\tattributeVals.append(val)\n", + "\t\t\t\tattributeValsCount.append(0)\n", + "\t\t\t\tattributeValsIds.append([])\n", + "\t\t\tvid = attributeVals.index(val)\n", + "\t\t\tattributeValsCount[vid] += 1\n", + "\t\t\tattributeValsIds[vid].append(sid)\n", + "\t\t# print(\"-gig\", self.attributes[attributeId])\n", + "\t\tfor vc, vids in zip(attributeValsCount, attributeValsIds):\n", + "\t\t\t# print(\"-gig\", vids)\n", + "\t\t\tgain -= vc/len(sampleIds) * self.getEntropy(vids)\n", + "\t\treturn gain\n", + "\n", + "\tdef getAttributeMaxInformationGain(self, sampleIds, attributeIds):\n", + "\t\tattributesEntropy = [0] * len(attributeIds)\n", + "\t\tfor i, attId in zip(range(len(attributeIds)), attributeIds):\n", + "\t\t\tattributesEntropy[i] = self.getInformationGain(sampleIds, attId)\n", + "\t\tmaxId = attributeIds[attributesEntropy.index(max(attributesEntropy))]\n", + "\t\treturn self.attributes[maxId], maxId\n", + "\n", + "\tdef isSingleLabeled(self, sampleIds):\n", + "\t\tlabel = self.labels[sampleIds[0]]\n", + "\t\tfor sid in sampleIds:\n", + "\t\t\tif self.labels[sid] != label:\n", + "\t\t\t\treturn False\n", + "\t\treturn True\n", + "\n", + "\tdef getLabel(self, sampleId):\n", + "\t\treturn self.labels[sampleId]\n", + "\n", + "\tdef id3(self):\n", + "\t\tsampleIds = [x for x in range(len(self.sample))]\n", + "\t\tattributeIds = [x for x in range(len(self.attributes))]\n", + "\t\tself.root = self.id3Recv(sampleIds, attributeIds, self.root)\n", + "\n", + "\tdef id3Recv(self, sampleIds, attributeIds, root):\n", + "\t\troot = Node() # Initialize current root\n", + "\t\tif self.isSingleLabeled(sampleIds):\n", + "\t\t\troot.value = self.labels[sampleIds[0]]\n", + "\t\t\treturn root\n", + "\t\t# print(attributeIds)\n", + "\t\tif len(attributeIds) == 0:\n", + "\t\t\troot.value = self.getDominantLabel(sampleIds)\n", + "\t\t\treturn root\n", + "\t\tbestAttrName, bestAttrId = self.getAttributeMaxInformationGain(\n", + "\t\t\tsampleIds, attributeIds)\n", + "\t\t# print(bestAttrName)\n", + "\t\troot.value = bestAttrName\n", + "\t\troot.childs = [] # Create list of children\n", + "\t\tfor value in self.getAttributeValues(sampleIds, bestAttrId):\n", + "\t\t\t# print(value)\n", + "\t\t\tchild = Node()\n", + "\t\t\tchild.value = value\n", + "\t\t\troot.childs.append(child) # Append new child node to current\n", + "\t\t\t\t\t\t\t\t\t # root\n", + "\t\t\tchildSampleIds = []\n", + "\t\t\tfor sid in sampleIds:\n", + "\t\t\t\tif self.sample[sid][bestAttrId] == value:\n", + "\t\t\t\t\tchildSampleIds.append(sid)\n", + "\t\t\tif len(childSampleIds) == 0:\n", + "\t\t\t\tchild.next = self.getDominantLabel(sampleIds)\n", + "\t\t\telse:\n", + "\t\t\t\t# print(bestAttrName, bestAttrId)\n", + "\t\t\t\t# print(attributeIds)\n", + "\t\t\t\tif len(attributeIds) > 0 and bestAttrId in attributeIds:\n", + "\t\t\t\t\ttoRemove = attributeIds.index(bestAttrId)\n", + "\t\t\t\t\tattributeIds.pop(toRemove)\n", + "\t\t\t\tchild.next = self.id3Recv(\n", + "\t\t\t\t\tchildSampleIds, attributeIds, child.next)\n", + "\t\treturn root\n", + "\n", + "\tdef printTree(self):\n", + "\t\tif self.root:\n", + "\t\t\troots = deque()\n", + "\t\t\troots.append(self.root)\n", + "\t\t\twhile len(roots) > 0:\n", + "\t\t\t\troot = roots.popleft()\n", + "\t\t\t\tprint(root.value)\n", + "\t\t\t\tif root.childs:\n", + "\t\t\t\t\tfor child in root.childs:\n", + "\t\t\t\t\t\tprint('({})'.format(child.value))\n", + "\t\t\t\t\t\troots.append(child.next)\n", + "\t\t\t\telif root.next:\n", + "\t\t\t\t\tprint(root.next)\n", + "\n", + "\n", + "def test():\n", + "\tf = open('DataFiles/rideclass.csv')\n", + "\tattributes = f.readline().split(',')\n", + "\tattributes = attributes[1:len(attributes)-1]\n", + "\tprint(attributes)\n", + "\tsample = f.readlines()\n", + "\tf.close()\n", + "\tfor i in range(len(sample)):\n", + "\t\tsample[i] = re.sub('\\d+,', '', sample[i])\n", + "\t\tsample[i] = sample[i].strip().split(',')\n", + "\tlabels = []\n", + "\tfor s in sample:\n", + "\t\tlabels.append(s.pop())\n", + "\t# print(sample)\n", + "\t# print(labels)\n", + "\tdecisionTree = DecisionTree(sample, attributes, labels)\n", + "\tprint(\"System entropy {}\".format(decisionTree.entropy))\n", + "\tdecisionTree.id3()\n", + "\tdecisionTree.printTree()\n", + "\n", + "\n", + "if __name__ == '__main__':\n", + "\ttest()\n", + "\n", + "\n", + "## Cancer Data again now with Decision Trees and other Methods" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -794,7 +1072,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -875,7 +1153,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -885,7 +1163,7 @@ "Xs = np.random.rand(100, 2) - 0.5\n", "ys = (Xs[:, 0] > 0).astype(np.float32) * 2\n", "\n", - "angle = np.pi / 4\n", + "angle = np.pi/4\n", "rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])\n", "Xsr = Xs.dot(rotation_matrix)\n", "\n", @@ -912,7 +1190,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -928,7 +1206,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -949,7 +1227,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -997,7 +1275,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -1086,6 +1364,8 @@ "learning method. \n", "\n", "\n", + "## More bagging\n", + "\n", "Bagging typically results in improved accuracy\n", "over prediction using a single tree. Unfortunately, however, it can be\n", "difficult to interpret the resulting model. Recall that one of the\n", @@ -1113,7 +1393,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -1133,6 +1413,66 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bagging Example" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.datasets import make_moons\n", + "\n", + "X, y = make_moons(n_samples=500, noise=0.30, random_state=42)\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)\n", + "\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.ensemble import VotingClassifier\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.svm import SVC\n", + "\n", + "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42)\n", + "rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n", + "svm_clf = SVC(gamma=\"auto\", random_state=42)\n", + "\n", + "voting_clf = VotingClassifier(\n", + " estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],\n", + " voting='hard')\n", + "\n", + "voting_clf.fit(X_train, y_train)\n", + "\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "for clf in (log_clf, rnd_clf, svm_clf, voting_clf):\n", + " clf.fit(X_train, y_train)\n", + " y_pred = clf.predict(X_test)\n", + " print(clf.__class__.__name__, accuracy_score(y_test, y_pred))\n", + "\n", + "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42)\n", + "rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n", + "svm_clf = SVC(gamma=\"auto\", probability=True, random_state=42)\n", + "\n", + "voting_clf = VotingClassifier(\n", + " estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],\n", + " voting='soft')\n", + "voting_clf.fit(X_train, y_train)\n", + "\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "for clf in (log_clf, rnd_clf, svm_clf, voting_clf):\n", + " clf.fit(X_train, y_train)\n", + " y_pred = clf.predict(X_test)\n", + " print(clf.__class__.__name__, accuracy_score(y_test, y_pred))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1188,7 +1528,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -1215,7 +1555,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -1243,7 +1583,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -1259,7 +1599,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -1277,7 +1617,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -1300,7 +1640,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -1318,7 +1658,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -1330,7 +1670,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -1344,7 +1684,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -1387,7 +1727,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 24, "metadata": { "collapsed": false }, @@ -1400,7 +1740,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -1414,15 +1754,6 @@ "y_pred_rf = rnd_clf.predict(X_test)\n", "np.sum(y_pred == y_pred_rf) / len(y_pred)" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Boosting and more\n", - "More material to come here." - ] } ], "metadata": {}, diff --git a/doc/pub/DecisionTrees/ipynb/ipynb-DecisionTrees-src.tar.gz b/doc/pub/DecisionTrees/ipynb/ipynb-DecisionTrees-src.tar.gz index 88c12c16b09be70966f9af990a3c2b39c48e1100..9ecef5eeab02b05da75ca7f5f1905f458098c376 100644 GIT binary patch literal 194 zcmV;z06qU7iwFQHbGlss1MSaE3WG2Z1z^{nVoo4Qjk+%AqKiT)ULe-7ray^IBGlVA zDzvM%D=CG1o5#RonAsQWd|O2JZiB@TLQ=+H%q&f&B&&IzP&d#xNm7^-K2|KNhnqN&6{`x1+^E~gn2fvey?*Iq@0I*S55C8xG literal 194 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 delta 134054 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 TkOoFe3#kc$!_NXPn1lWTWST32 diff --git a/doc/src/DecisionTrees/DataFiles/cancer.dot b/doc/src/DecisionTrees/DataFiles/cancer.dot new file mode 100644 index 000000000..5b4b48a9b --- /dev/null +++ b/doc/src/DecisionTrees/DataFiles/cancer.dot @@ -0,0 +1,57 @@ +digraph Tree { +node [shape=box, style="filled, rounded", color="black", fontname=helvetica] ; +edge [fontname=helvetica] ; +0 [label="worst perimeter <= 106.05\ngini = 0.465\nsamples = 426\nvalue = [[269, 157]\n[157, 269]]", fillcolor="#e5813908"] ; +1 [label="worst concave points <= 0.159\ngini = 0.067\nsamples = 259\nvalue = [[250, 9]\n[9, 250]]", fillcolor="#e58139db"] ; +0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ; +2 [label="worst concave points <= 0.135\ngini = 0.031\nsamples = 253\nvalue = [[249, 4]\n[4, 249]]", fillcolor="#e58139ee"] ; +1 -> 2 ; +3 [label="radius error <= 0.643\ngini = 0.008\nsamples = 242\nvalue = [[241, 1]\n[1, 241]]", fillcolor="#e58139fb"] ; +2 -> 3 ; +4 [label="gini = 0.0\nsamples = 239\nvalue = [[239, 0]\n[0, 239]]", fillcolor="#e58139ff"] ; +3 -> 4 ; +5 [label="worst symmetry <= 0.208\ngini = 0.444\nsamples = 3\nvalue = [[2, 1]\n[1, 2]]", fillcolor="#e5813913"] ; +3 -> 5 ; +6 [label="gini = 0.0\nsamples = 1\nvalue = [[0, 1]\n[1, 0]]", fillcolor="#e58139ff"] ; +5 -> 6 ; +7 [label="gini = 0.0\nsamples = 2\nvalue = [[2, 0]\n[0, 2]]", fillcolor="#e58139ff"] ; +5 -> 7 ; +8 [label="worst texture <= 29.455\ngini = 0.397\nsamples = 11\nvalue = [[8, 3]\n[3, 8]]", fillcolor="#e581392c"] ; +2 -> 8 ; +9 [label="gini = 0.0\nsamples = 8\nvalue = [[8, 0]\n[0, 8]]", fillcolor="#e58139ff"] ; +8 -> 9 ; +10 [label="gini = 0.0\nsamples = 3\nvalue = [[0, 3]\n[3, 0]]", fillcolor="#e58139ff"] ; +8 -> 10 ; +11 [label="mean texture <= 16.22\ngini = 0.278\nsamples = 6\nvalue = [[1, 5]\n[5, 1]]", fillcolor="#e581396b"] ; +1 -> 11 ; +12 [label="gini = 0.0\nsamples = 1\nvalue = [[1, 0]\n[0, 1]]", fillcolor="#e58139ff"] ; +11 -> 12 ; +13 [label="gini = 0.0\nsamples = 5\nvalue = [[0, 5]\n[5, 0]]", fillcolor="#e58139ff"] ; +11 -> 13 ; +14 [label="worst texture <= 20.645\ngini = 0.202\nsamples = 167\nvalue = [[19, 148]\n[148, 19]]", fillcolor="#e5813994"] ; +0 -> 14 [labeldistance=2.5, labelangle=-45, headlabel="False"] ; +15 [label="worst radius <= 17.74\ngini = 0.375\nsamples = 16\nvalue = [[12, 4]\n[4, 12]]", fillcolor="#e5813938"] ; +14 -> 15 ; +16 [label="gini = 0.0\nsamples = 11\nvalue = [[11, 0]\n[0, 11]]", fillcolor="#e58139ff"] ; +15 -> 16 ; +17 [label="mean texture <= 13.745\ngini = 0.32\nsamples = 5\nvalue = [[1, 4]\n[4, 1]]", fillcolor="#e5813955"] ; +15 -> 17 ; +18 [label="gini = 0.0\nsamples = 1\nvalue = [[1, 0]\n[0, 1]]", fillcolor="#e58139ff"] ; +17 -> 18 ; +19 [label="gini = 0.0\nsamples = 4\nvalue = [[0, 4]\n[4, 0]]", fillcolor="#e58139ff"] ; +17 -> 19 ; +20 [label="mean concave points <= 0.049\ngini = 0.088\nsamples = 151\nvalue = [[7, 144]\n[144, 7]]", fillcolor="#e58139d0"] ; +14 -> 20 ; +21 [label="concave points error <= 0.01\ngini = 0.48\nsamples = 15\nvalue = [[6, 9]\n[9, 6]]", fillcolor="#e5813900"] ; +20 -> 21 ; +22 [label="gini = 0.0\nsamples = 9\nvalue = [[0, 9]\n[9, 0]]", fillcolor="#e58139ff"] ; +21 -> 22 ; +23 [label="gini = 0.0\nsamples = 6\nvalue = [[6, 0]\n[0, 6]]", fillcolor="#e58139ff"] ; +21 -> 23 ; +24 [label="worst smoothness <= 0.096\ngini = 0.015\nsamples = 136\nvalue = [[1, 135]\n[135, 1]]", fillcolor="#e58139f7"] ; +20 -> 24 ; +25 [label="gini = 0.0\nsamples = 1\nvalue = [[1, 0]\n[0, 1]]", fillcolor="#e58139ff"] ; +24 -> 25 ; +26 [label="gini = 0.0\nsamples = 135\nvalue = [[0, 135]\n[135, 0]]", fillcolor="#e58139ff"] ; +24 -> 26 ; +} \ No newline at end of file diff --git a/doc/src/DecisionTrees/DataFiles/cancer.png b/doc/src/DecisionTrees/DataFiles/cancer.png new file mode 100644 index 0000000000000000000000000000000000000000..2ceb5e1f87d923a1cbee266c6cdd1b116e2ed85a GIT binary patch literal 221561 zcmZ_01z43`w*^WgjYvp?AShCTgmj01bho6`29a(ll?EwkL0Y=IK^p1YgmibqU7UN4 z?ElY@Jei= zhBWvG-d;&k1g@Z;Y#scEn2Cn8shk`f1Niv?9DLw=IHbE@0e?xrUpP3#RCqW<@Gtz` zYpDqT^M8?#QW5{>XM|68zZl%)DG3KB1Sc&ftl|v6HH++wFHM3nkK=?Blj?)}srJzf zIiXV}?t`73AUE4UWI`uhvQM>0PMUa;$e&g(SSnWOC}O&d4@UW;)(gNNSGOIT%9@M9 zXLDKzkC2}U!J{j9BjBgP{U1NlG2xD8Xm@rf{{Q{Lf4wagi92S;T9l(%i*?P!K4uM45pV)Zfa?18BE@VHquy(P#zi|S)YgEJw>OjF%g0) z`Rp2XxRfv*ztL?tRPAW=3hqIo*Y8I9_|}{}%JsORyJ8oAY#S|`3BJ6ws?Lsh$+|xH zhRI{3(!*ut!Z_kU7_d=QGt%cDhQ|6QdwLWBkty3v~C zV(mbI^8Gy{J)2)%_CG&dHJY2LcD`Le{7S&|_2c@V#o;V@sqeI37Wg~{_1M7Wj-gr} zH|szzmGlON8$%9_wFSqW8n!lnR|O~2L*bVLJ6~33+EJQ7x&0lq5iMkdwpp1WIvvj1 zEa_e{w@23XiMt;B`VCLl8!0`eTZbRLeAhNe@r1wqOBDS>UNy##TO(-XypCcsRd%DV zuSD}-vG_QLk+4DFTmkW$|WCAV#Aqe+}J%qJz^ebT^Xw;s$VU7`BeEp-T^Na^!?ZP2{E z@yh<1r9h>EJTo(+Fw^jgK_%Nep4}{9qg>Lc4!ah#OrtnU7c| zmbrbJt1yDqu*KF2jYZBU6*-bl?kjuNTPnjyV~e2~&+7|h4?G!|P#1HC$6k{>)9%8C zdGRW@X|CSwr9(Hq4!0BCAM6!Dw-d}l{o9b4YWr&j`T-mopR@g?rQ;y8F6~s@4=cT2 za#iyJhN4}F?@y7>9^PjXJ)#u{*kCt6N6>F@7anKUEpi@0h(a&5Ki$#AeEjM$WUdbF zQD$}jq2f>15QXZo6((&~xBeN09Nvr<+oM@5T4fg7SyQuaC#e#@c#32bC=Ap(eZ+_qxGnLY8#k>zkD(eMCP>R+V_|(bOJE~{ocLp*b|d`T+A4#Nvgd1=SZ(s(*;IA4LvIfU1ScxJ z1R2zG{VINGlL~Ogv-cQ!DX%O24Cj}0Bw*`?BJ^h5XE;_;u=NRjzlhk3^CyQw4MY-myORIJZ}Cn8GAR0pASRF+t@1&8h7 zik!pN?UZ{(wcwUdr?@ZV&MHCuPXOz4N;yKWtsRJw@oh zIonU?%oafI45gGzWdgA zRmAtYfce+{Fj;-U(5XF-Fe*|LeT_A3HmTc^e%V^Vp zY7T0{i$AorGS#L#yh15>18ip9nx;wDpp`fvWdx!}=gqeV5#>%8TaQ)x8aZVYze%Ui z(5Z13cS}{kV~g9-*WQ_J40}W`pKDL~p4u=YWvQGCDOWA$$LKXhpH`X5@nkIHm#gyw z!z;fp+_rlL;o~3;Qn8tos39&MZ;lR6ZHBy2%`=?6z{*yxjXB8)fzr#VQJZJ5-A-jP z<29vRYSo$u@ylHVn@`mtXKa56@fNsIjiM4pu=bgZ+K76g{#H=jrnaV~!5EG5oRc%& z?s&?mt<7}3okPwpIMz33+3;vF; z1Tv$F<*steANCiYicWfS{=JYd50tp6C%_$i-J5lPz&?8;ObM>B!DM^|Dkb!-sq&s$ z5&wfZXrnv&Ua9erh;1pU)vS#nlYU`kXt*#t zoD+C@{32E*Y099wCg7;~)U0b>IAC+*nAnSmNvloU?ejvq?7`pP_2jj$&$@<9N8NfH zQuyi$3#c10tRu8`w7bznW@*a#ysar?N7q6x=Q?_jD@sHU2LrLWny#ifGVCh^?O z&D{4aS0wVe(~daCnY6K z$=O8cc&Ha>D0=h+pH$f`wI~OjQjC-zT^#KmuCiqJU87=W<8qZ8&Nqt^e2_HF-h}WX zjc~f~{*WA)3ojBrF!euSMJ~4-RVkf2w!|c5n}FJKec*E{&~Ys`@RE_DK+7^tEJGz> z*y=xA6`cEAG~y{qG?3)OnO)ezApJP=9E0$k(5+`jRt^{L(VoZ!e2z@yi8q|f;fl|R z0!qExu~_iqmnskFH2Ivm_7=F^_q;v7HbP@^l$QXUyrD3nyGJtKE)Q&lpnN+tZo>EI zX^#?VuF(tf7#C;lqje?+032y3hfjOuS}%?lR(3+`FHdrWjjdz&0N6o4trR3wDwo|p zgl|6Gg?gwYy^>aHZD4GxH5kvdJ~zr7KnP=7mZ%=lXya|qm7|0ge(=K2`D_{+wit8Tbzfg)?e2+Utv z6|9&mGLzm@jvHk`B)ze2ixa={(9vjd7=oi1pOHpBH|hSik>+cc1cIMh@?=XYp3T48 zW+Jr#{BBZ>!$vmL&u?QtDT5hpoVKyvd4DmdRVfy8!|eAvMC*XY6Wgrs3$I)h6r|n4 z7eA~7Q?sOExm3{{!v<(vA)L`#!fw6E08APGgd480f>+3wO^cZ8cCyp%k3poGf5i4v zCTH7v+9|tP?X{rj1!gXZriQA#Q`y$fS6*6K5x9@|@Rk zXM|AVm=||zsm;sDX0FDhD<=Mc&63}(!m6mEKl?xip9Pz#E%c%{fn7VOF9m&l_$Pbf zBRo<;Hzvz%CIso(S_k&BU)tjZgDq3pC&;6j#p#m57#@Bq&y~~El3XpCq13GbmWVqz zm{~D}8pK~BwazXhxK9NWJ}mcsu^cbV<6`}*C3N0)HMjEu`T6bw&)5VCAU&TNF08!x!=NxF zbmeIiyvJcp$`;mr{58oxFt_9MRjpBKN3Zg{Mlo)BrQcBZOs(vhvD#S(DOYM>S_JWu zW~pg=qRSx_;yD1W&4UXxBZ$5oAtV=Wh-v&T{iJI#120XY3cljC|$JTZV68pj%DgNX9dH6WdX;{9>=O=2&aGFx_F= zG4AY=R_a+&xNLKEOclS!1!iUWplG?pm_pju3#`Wv&>CrQSihHB`2*nlp8e<%(&Q`R zq8R^=%Y6a7l{P|iJhsV=aATYm4DLe_G?GIVa+a8sJZ(^U0}LwEkNbpu3AylY#O94| zr_2{8l&L#~b!b$LzK+(@=0Oi2&0DYSsWB!T?bb3;u1y{qNN@9eY|9=p8gUHS7#-nv z+?ds#t?bjT$iAdKm6QLFqE@Jx=PAkWcG}Egy+4~7Lb@4kg!+0XUw`xfeWq7 zXYYG%@O}ztUD6DfGQ$;kpDSfFT+0g=d43lO)N;L*P^OL}c*Y>7X zXGXuKIBk5pAN&m~FX!k8BlnGH4FuoV7sur#pjN1h;X+DHtK3Jzk;;UR89yuN(yekV zB%;0c7|%vJQs;JO)@^O9K5#0Q__EZjUjfI9)(Coo7@#0|Fg;n}@+fyS-+$)(AnyRr zRC*))mC+Qw``Ml_zxUA6iDeLaYnmmIL!uW<0(ep>gs*wc_2E&`DNMvis5VVb5)-i` zb|z}Fiv|m!7(!;Ma!k$5dQ6For6|uk_lLD~oHY%&KsgtfqIRgRuFkQ2)qpzjh+Za? z+85=A%<9`JmqWr2%iTE?43E{R_AgD;uBIy~!Yj^*5TR99g;uBzOlZP1FAq&345Zo2 zJ&rdxmT4edXFE_Y>!6VrzAI@F8948laFqUfp1;L&lw4epVRYvgXxL@DXwZ7>7wVB7D4^3{TTkK%b8MYQyB3TeDr=2OQQ)ii1m`W z)dQyA{mj(#_~PN^P4O|zf;Up(CJwSSDtKfkTNoOqwZQprh-xOV+`Flx&g zbAK~b69|cElvWIcuuU45&u6}LO+vrxXj+V4bZ@>XV4O$N4O$or>!F1hnZ5|Q)*rOBsO06)t z@fh0ZMS0hv{`^V+fTf~neDz`C!p=^pWh~1R&#N;AL5GczfWTJ;PCHccJ2Pv84M_`R z_Hzc99`+5jTcrQ$*cr7!^6g1WEesVVf(gJPM}wNELk>`$3_oVHT^n_NOO`?Tk;FHfCMclfa> zUw^8EKrebS2GCD;r%%xaQUui+)kBXN6R! zS8gX(XPZr)m}G;LmgMB za@O0tB3_#vo5$>qi4_z=cE<|MPP!{akbX#FTwM6FGUM7Ngb>L~@d+mIL~P zQF6u-I&(# z8ZdQ;nz$z;_ks{Gs}F;``I7F>H`O9~+-C5~(Yj}Ek)Y#M)xt_u;%mzZ?3@tI(p4%& zB@8b?|F49H_QYReDR~{Oq@2n4*MnwOx^|qJX9KV{T8k6z2=H8i`21g^+DIiS3?>W& zEcz`N9v4T_h1fWh0!k1poqAU+lOFXpKvZIN8lyDw35AP)>U$Z#xjRX=OK>UnFQjks z;LO%;)n6w|{(A|8$|HiVm_F=^ii$Ws2NIXq2EMu4S(IQC23@FN*HneE;n_3`@XFd8viMqp1o``Ta*#>wua|0;`~!NlhX3yE9E z@y11VEH6wF$N&5c@Y-R|oW5?u)T{?~@MwxpDD7qNGEKL0qs?av$TzsG@smGYvlY*7ySk%00y;H?**6JHjgZr~VnKv* zs-=)yc+is3XsE_8tD>h%hAJQ)mpmw<{SqrEr9GieLD99?P?BAs8>+Jr=SQX0@DYv8 zq&wrJZ#!&;Wy#Id=Gq7r9hG^hjqCLs(INdym_Ye?lHLSBqTTu;a&HoUPks$cQ2(1M z^4fgO(WVMa8xRC!Kf7am0sA5FZZlB5b9c5j5QnlZoF)*ez$-XShl7JNQ|E%Q{^zIo z#z@X}qUY_62Z5XZ9Kz>^Gyy3~E0GHmt!SK@Rtsxu=FGb91pnm%IAnJ;+kgfZ+#Mwt zoJ{otqYLvI-WMfLfj3<;SfR9{_H--9beNRo8)@=&+1TPjpvs$X&mIDP3g5tinB5d} z?=cPxhp#~O1kF})=JUtO3AOti1CNfRY|t^16CP{Vqnhsr=sGI9A8ivg?~PaoOkcwO zo3elxMcePSk%_I*LwC zO19f63=Q4J5J&gIKm|<&3shY&=q=z*H(P_kO`(;^jO3MRN(h>j?hB`Ad6YK26jDP9L-;n}nu)$-Z(4T$*(BCE0AktOaW9R8 zDr6?7jaCb0&4&x>H$(%D)`zMTMMYg~V2@;z3KHmjRd$f3VaTmJT(&h?E6?&t8i7Mxi2qW`BKt9Nu0)%@3Ru{y_hznJ8TND+iWsur;G}Wcf z?@M{Jhs@SYgDQEW>+yHa$6k{PYJ^&|SF0$-{fU}=wq8ePFHHxMf-0=FNW0x{t~C9N zbJQ!D$8PtH!W&%6bBp?75P@VMQD5U=D{Cnk+n+Sz@}a;whViE3Bo-C%V6dt28;7Nu zPUDB)18Gt8@`h(!iriI@LiAroI!*ok*at&Vd^6#i=RhG4uCSW4J)PrE6!d}zea0vxie2!IiEcBB&zVABthJP=JRq>^|zxBaHVfrmUPek>P~UcKi}k)yTFAL2m)+FIF3NN9N3 zlecWsw-ftI*;+r*H_UyP0ZBO=MA87@R`9py$|NTtK&`6ZrCs;JCYx+M)-H~6 zspL;bzizD|^yb=ptPIVxFRlO^$fi2}v^?&6aBpH5eLANQgYbTK8vwo-Xu&9dIqz4& zTl$Xmq_sgL{g1$yN0a)TWE6;Fm_~Ra@orTnE}`KXb-r0wonuMYv|T1wBaM&YJ>m`M z8BUe$T95=#J4~ARQ;iK5*ki7;bPnR#S8ua7~{PQE?2r zGoW@0E#fM9z-T=hKDY-tJuu`miZ!j_5QBmkUvpVVJr$b?rBBJ+pUe%)gQDqxK0fm}PBv6h$(tSli}ZU$R4itR7v>Xy(LI@4mlb+rz-^+m;D z9d{A9I9?A4C7)UXZA-RVDIs8E7R-e7P4{s~*hVC;FG7D=6ILbirS0bK>b$o9Q3!gl zoAXu5#Mky}80$tsWRsXumtjIU^#aoET;3(#|`&6p7Xe*2E1Ulb`~dXW<6$d4^^$ZOpV(v zbACSK=wf+iSc*cLwQ=*zZ6xitw*zw?gRRA+YWX_;K}0OV@AgRP(IRNloM}hGFpE}4 z2vf<^`V zmrC6gO33$Y569KNOLiBMfKdeO=bbf_- ziew6#v8fV~e>ht{Pn>S*fpG>XQ0X8gCMDVJx487ibFk|a+`b@+7T2Q`^h6+j97fJt z5tjQmuFXFd+4^a{>+zdt>9|3&Eq6-#^U~o4BYK@`R|5Jl^7eAe@d&z*Xjk^8lphQ- zi^tG0!e)=lF~rG|$>!5zTCz|8!n;h(vItMGvXl2fF?(n;SNAjiCr5P!@_0G`0mj9B z=&0Lrh_IV+h(C|%aadQlMR0%4gjkV`;dp-ZLy9XZ0^F};8V;2+q!#px4OV~4x_e}L z7|{RDKg-uFMbQu=gfgjDSb2B09t!;s`!doRv1ipiV302N6|@JJo#nF4uf*RkNtzI5EzW>jqp%Kh_Jcd{roHEi#fvm zrB0lEJ)lCk6>ai4ZgJNMxKgY2YA}R0?p_x62w-?$LFM0}43b;3oydS>) zyJ>Q(QAsgd!<)7P!J-P<2yptk*0{QNvUL2fi53#W1*F|)+t>*Sn443081A$9nM71j zMaZ-GkEe%gy1G2QC{xEJcIa%e#WBepD+SnsRv;e?RlR4&XV8EnW-}HVw+Wr7@IXzh z;cXe?#E=Lf4&vPAo!@Ilv|w#iPia_NA3=O7gWnk-$n^tgF?SpZK7-1jZM`=q1;48w z5Z3a1t`fK)i%Xqh0$=rN+=;^|_&YuuihBG7WZI+igB5?wZ=_kkO|v+%K5StJO&Bjo zb?H&tJG$zulB%*gJSAh^s(bb?6dx$x<;3S)EE2GNZVG~G-nd_quA1zP$BzYXOuak1 zk)_%%6>5h}*@OU4c&LF#rieuoZ>b|#Vr!xpYuQ8;C0D!LId<0Ehv-?n-gdx@|ZnIP6FWvfedi9G2aaMtgVPWwD%E7O!z^UFNz~AM~g7zrA%HuiT zC=xRxX3;{4WNzbeU{6!-F-5X#8Y zpT%zwUE+pBFrfA)Gq3NsGd7vI*=weJ4jlg9t-*lQTnIS9rQyyAU2$9)k=~lA7=;8-q}ZVbWqN#Ol?QSOSB)&5=mE+B&##hOb2jT3|AoirR|pH2 z5SEC5cybtW53C4revI(co-7+Hqwkrk>={tIgcpBv4Ih{&yaw=CjamEaPUtMF`8?b= zCS{ZaPRRK>T^P9_{Ll|^-=5z~YqNRuocY>8pu0Eh*D(`x;CDGd0<<6Yp1p3u!Y%uA z*Q2%E>&envXZ!iclW^fVx^UrhH70HI;)C6s4F;8hAEtA=leIWN022eMl8R?R;_G5y zL*nzeP}$y{sD1?M?7{xtqS@3^ZT=>?dLoa5mjA4sy;Eyk@lshi+E;)+ZUxCA>^W_w zGAO>wKIR&8BA_dVpf{RDc^lCDOOf8h7_5IoiJ>}{d}6=S%Y89U4Y+oS0sT6KQEB(< z_sVpl-M@cSy-+J?0nlM23#e>TkR;-GHj__zE4cJ;$&5$d?FNcj+%tzN4hI2ZM1eL8 zm}Nm#LQ8RfMW(G1OBry<cPbQPX}d%PBD^Rs>{Sd%LDFC+-IE@>CS~STHx?GNh7qbkpVX z)HdLQ{6^jn)y0zx#s)qH>|)2yL$lEz6+7Rh-!o-in_Cms=kw#@z4soYSfcgV9jizE zFCARK^UCjg5{uo99EV*%L(Uv=MbN)q*Dn!ZBGLXx4jA{37%RMT{19XDa+YjTz@0{6 z%Ns(xalCyQ=2sqZv~zunx@EGj&9A9#)&`s$Ma~Nd z{4)Gv;kJSeQGOM_W7sQqty*u^A9aRvYz|;$a@kCgF`M<9Q+vIoQZGmhs4=Dit*FKA zLV6$rX80DL`6&AbCWV1Uz{SEqoxvZ!%ACLwdgewSScd8Ax!SbHD2)pz}i&JOJ*O#iYsjF8Ee zu8Fc~;_ZGB9G|U|gQt`!n{)95W97|%gWY2DeY`H&{j2lC9Ax{^X0Kc0-|x~1&&b&w z`4-zl0(}Fq7kcAMi;9aCpMHO3kPl?zl_v4cTF*TLjeA_A+ znyn!G^ed6%!Cyk#jZxGbrJo|LD95TC;|02%-om~^>26#OSoJ&e?mewYE`x(<%0yex zQW^i-2*)nONa)5WhYEG_T~8TwM8YO#)rvpI{qiLqXW+j$h)cTj?(M{sh{Ax9W`c0y ziv@B~eTe07N64Mn@d`4gG9dEnJBR8WH1_msjELVZVcp@j_L&CFLh}OjZ0Aql9aX~0 z`5_+|B*T%-O*pG5Xc|3gE2^B=@gzbh(gi+5@RVDMrX1T;WmiN1%NzIcnoZ)d%rslV zO;0R~g@QiHNk|l+4hXos`nn0sN6LtERr1oX&3fY=dKFxXV&w<@2K}W%g^2hu6^->& znMPXs86e>s7%ne%$0r($P&Y=e9|D!v^R^;nw|b=5@%RlU2^+rS>km1Lf4nqBg%*!x zE-rT)?XEAdwuPlI$|1R4vg@Z-xe``H_c?wIL9t9zdV%!Ss~;F8*D$N{P|aXxrn>6m zKEg_WvdJHhDyQ9Kl8Lvm%t;ojdFq8KS1$3=ySy&0t|ISNd%UZ>)`8qJ^`pcooLN_E z`!HSLw)@&j5765qhyi;1Nh3K8r@qQifW?5vT8?SV>*KMhaGCj#dm`PnD{yKb{M{$T z&IVXzZ6poxD-p}eQew(vwbyL}x(h9YqstYsS?+_i{D4=H$#6N6&o`bz&NF9yu)eY9srU`9g z7{wpS0gRkoBQ0(!3=E925s?e2gL=vl2ijh_{zO4S_>)4b664=gl+g8~_e3+pz{X6- zIDa`Pzm0l?OPl(puCDHm66|WJ&r!-m&(?@rW)JX;Q#=&;x1dxrNV2z3y_S#wqRe}I z&gulO{3Q*7-7k(#^eLg1l+$|dN6nI(;HyiGR3T3?-YfOE&dS@feVVZX?X0<&2V25o z<|ngNHXVapWApcn1*<&3^8eeIHEM1+y8PgrrYtVTO?7(xK4R%{s;pQTdw9>X`^FHC(3}PFfp8-Kz z%1ra#=l(h4P9T?t@YTxQ<3~6^lZR9MM_ z7dBkIJ9#<_SEQ1= zmB>?Gxu6?!*3o`Rht^p0X7t2KlSf%=5()hQvhQH79Pb??nXqKuahB zf{x^TLT4sS+jv#ujkzHi@C~>R5_vpj9ge}NoB&|`zXuS~Km2?n@PJvjAsASljQ|@d zaA4FCoYP(;|Fr{)^rFk_rF<|Ez-+b&uvQwGGi|RJ#*bSVKdB z*E~n&a_+Q{eQSUB%X5DgvFiNT5h{VTDnlmKpSk`(PEGj zQ$1TdCcNh1EK~|@vf0^e#KxfZ#&zTOgnNWKU>GA#=So-a562%2DUBHU6ajIbKtTD; z_vS?9Lff}x&et3LmiPCLgr-l(_ZHh_fDTJk@5XaZ>gENk?+lm&DVsNY%3)r_KeuFl z7=Kv|5QR2)w9dMnV)~vQu%`XDxDDnMsDS8cK9+&@75{lKyIFtkA+RuWCPE^5MXaG! zcItj$^I{Ng?y-x z4p#btO3em@TN+re^$mb)6|iuj)ajbTbe{>CNd61gMGZ0!oAuvSz!6*JzK|HEas6C5Q)s0(Ua`a&O*I;GMLkDHTAOcNbsL9-8_vyfTLA~I#$o$Y z2E>m`jDjUOQC3U&m*-?~wsgLL;@_(-5g+ zy~eEq!0c|uMYs00(fpTRTSOqm`}}-NSuic8l=eaE6~wd)qrc;8blzYsL=dzWgwqvP zN*I4hQevq+T!F0hr*jGgq`prxFTOm40tTvUu@H399l-Nqw>#(IPy<@;C5tDsClTqA zhS79b`N2Di8KMS(_ml)J5OX|ftA1}ixleLJO$g+?4lOFyhU%G=2r!~CXfzIPdE6f- z)$mY(&g$%!o-X1rfV;Rf5}4nf>rRDdLCVZWNz%)3U*9}MD~_U-#?#Q!dIwT*Kv-K> zENz+-ZG|UjBC0;Fvt_DL#>S1A7tagE>a11fiXco8mEb z&%Y~ohLY3BI8Dm`+ikFlKP0D;OPBryEhx}~NZ+|2p>{@{?*LJstuS5^VEP6HDqEj=x6>bTn`2eBJD7}&o|yQko)T?5 zQD1+59X<}eB7PW#R~7vH?x0pXVH*7E#Dk_ zkI~9b69>?y@m0)2!Vk=Faufk@INN}MBrIiSb9?gDGyir+b?k_70RR@fbNYZ>yyp=6?B#Zm+v4W*jsh zbDQ?YIRo7NHkrp?W6E)rS$8l^6tyjcRQ>Bqm{=EM1L#7sgtQ;l3~^Q01g1Fcc4l7l zxgI?Lene3KjWMIwd`}|NAU#ea*^2wumrkuh75g_pn=EoUG#&Y+tPxXV=?u^2`FH9WiBVFKRB zc2TLL03GW&pBq11){eZn9I6E6K1d};iCXUat7i(SaA0st_4N%5efPQU&Ja^~n#>O~ z2=u@RKK@wnOU$Itk^!N93dtPzJu;^2us4qQ*DJ;)$FYXZYMMoXX zV6qS`;n`}6*I=Q(pw(;*0pO5Ck2gkXiX|qTbX#^Nrl&waZ;>{=_zy=45-@}a zBE8gvkrv>PgOMG#r~IuZON0rVqJ2!TS4cPg`YO(3oM|)*=K&jIXs@W}|F0be+DaNN zpy|_)dMseh&L=|Wo2zPc;YSL;0U8tQ@)v^Ex%dJKI@^{7ud!Y>o(x-CC(DY}qJ!n)L9x#FE`H#b30$O1{3!KT@VPifRBLr0j z5*YFM)ZlTMy8#ewAjn3BVARQcy5d)N5FwM6lrF=_W`yRXZmnZGxRASu=5Qw4AX-NL z#DojnXjW5YXyQSHs;6{d{=g@hl-*PooQy7cVu93s(H2aYWXOtdfO*Z@w(=7uD%{b# zs4VZ~9eTqSzYT*r=Y32UpuI@;#4wFonGrL_ipznI{qjWoYj)g`t2NtjqhV{n1#^Fj zU>G_9L(`u>O8&KzB_=@&8s=7vnk7iD?N?M%z)pN%6?_#gn)=q#(y}+1pA-a@Z(yKg zDu)DU0s&q+I*eddh*bNf<=-9sB5x_0LG{xW%9TutfQJ$!t*ey*Z5;R~$@$z)dKF&f zd*uaS*uyBuR3hjAZ;H%ua)N0sB3d)~|9KX`e~;{oQTTvvD&1@#S);-Ib$1L?9wBEm zD_;jjqJaAuE?YSB`pNe6GrhX1uYD}5PvyR=FnzA^xIDp?jN0t>MRZBEoo|B2q!b`y zD^2+Q5!v%{n+s$WQT}J>`Ozie`@gg+-Q9QQ>hs=4K=r`};l5B~3?}8mmX4$q2Dsxo zX{gb5K_r-%T_QR*PzhXwcpx^p3cumGHdcNiAB@<6YX=-4^ouhuD!%c)NFM>~tbj9lL2Ff+H7rQO8mL2Cfe^Zr(L~#-C9B*#i)&c z;}Wm1o(>qi__Z+(EBtt$qXD+`YUjDzefQU^1?msw?E_0b1F!8V4$%~og<&v|Yy=vw zfI5?&m<5pd1FlnM!_Th3=BQz$b~^&Eg;xc743{uGv4$YX{{YxxqlG-0d1XEI%DDR* zT1kVipHn0>p>6P#C4_>X1kY3w*d#GMU8qJXA^KG{HBVl7=G~P0z`F8RXqv?B`d0Ny z=>LIcDy0X;zaz!5esqhZmvHAWzG2uuI3CH6egxzc)Ybs3R$#4o>2dLqW8wn%rR$}N z8t+upW?$62@aK4zx~3ZTtb!Bn4}YX$R=EN0ZgCQoOH)g05u8@%gTH8?_!fw;{;pOE zW6ZQnG@jS<ckm*FvrwY)wx9NLb|0LPIcdnBE90FL1@(wug7S zLCg6DtgcjU2LJ+r;m$jkZ9T0EjhLt9L3k7QZ{XOPrUg|_BAL%6 z7$;}@_Cotu`5~+>->U~2WmB)9Nnx0}F^|3lZPf4k&a9e?pZPWk9WA5<-vvn`_%Xc8 z;nIAwZvgR0MAqpREDs8FYj01nDj6#pm?kkBz0Tv35V#;dVXgs38zsp4=%bs(ABOS6 zHBSj%sEGmS^U`AE*{~I@wm8fg&Ov@GDyRhYbWFZqAp=mLx{~>M0nGNb951kA6~w!x zrQNv(t5D>;{|*cU)8ok$ZNe;eCIi44nXYCN%rLj6Kmdm1ImpP!Y!_OPIlQ$&B~+-V zcoD{p0Q~TskjCo(zz^giLulUiOe)>K58j>#SS#!sTem3h@6VgkM-}+OG|x*?cK{vT z-0UtW7QvGav{Bm+AC!DAfK4c5gm8-w<{j_v%)akuaVi4t?~Do`8EnrdkRTU;M^mHb z<8#0g5PelQ8hxnQG(AnqVL2ui!>GyXa`5-_3_%5qjlC)OZU8FShOYMBnE!0P(Hpa$ zhnJT|KAF#=dH8U3z@8QA#jtYo0{7_~d`A5SGEz<}@BGrH`}_mo0dQ<$dMH<6SRvkD ztxz@^Fgp-gPgk^q#VI!ajW;nl=|5GjQGAXDOj0P|=KX_$Flfad!5DqvkXw|!*^gS4 zQ^sMK=LZ}<5NJb=!gGIg0+H>ha$tZ$!(IveUU9CbQ)D2FNzS9vK70$F!m+V-rxrJQ zc{#hd#6vn^`5XACJ9|r19g`LQ{WUffKG3Ok!~$ti;_7U_*nH?ofBp@DY;qpb#&}`a z-``P2f4d?!;D-Rj87h0PoUc?wW+al4{l5b4#s`h)lu1*fj5tF;wTG5w%@Rlj(- z8s?jtiRJ}eP@rF*!XRH+F$2(MS)}~|scQk0lw4K3O+Ju6xSe*$nDrZao82E(tFQbC z1{0?Xz=!C3ds7c4hdqC{R7-}Ey^Lipp@jK@heBZ4X`1BT!9HQ=hQ;>auk<%2Z8fG3 zFA#G9a1&kbj#gcZdOw_*2F%>IEWJ$Ve%?Y6PsDAHH&i*|AUa9Cy|I--p!E+at%m7M zg?tnqfg_$hRPyfrSonk!-W?~<2!Syrn`|CXzZt+jdlVHFvHk@Jj`}GsK&Ne=A0h%1 z%$~9dIJ^rhE19O7m#@2EfGRw?UlHIG{8*pm!Lpy^K7iIp*DALF`TlHqBlv)FE67St0rSDE#6I9z zI15wdmH}tW9avG~Z@`H#Pi(hF_lxuP8zbhhzy}B{9L#ls4s~3ivUf_q*728N3MtHL z<3Est512ud(;b6ZBittlypCH!0Gv^m?t9Rq`9CpqG7e~947W5hTdjR?dUw?zDYOI2 zFstX4v-`yn+T7fnRKycxy#{yUcjE@)|M3k{AT`7PW=*-johDkO9cW`1ID908w9(Eh zco$+VsUXND{TCv{KbS21SsO}E5KEYRa7Yv$C*0AI#5A+s_1~ zGp``Qo?aolIePtPReEpxhbxaEzlR56t@(*5#}AJn@0Zd<1Me{NH!yu-f~qptSaa-( zz(c5@`$12r^F~Hj(Cw|z@^ufFO;*D%FVa&{@I0&I8uwk9h8bn)i+WYwDa!MDVC&Jp zJ}mr@+|{oDQ+*=GVk~r^iet$9$7xs2>r)Qd4TYe!Wtg z|9Aa)k&zNz_ELxS=;qNixk`L$XrLJHC;O1pZX}b36L!$f;6jtS>$YwFcVb}y_-OBP zpg#M>-W4I6W8isUL1~^1?lOP8Qc6yZs&JhzZ`j|p2m8<`>)W2(KtHFjzO4DU>EpOP zou?qUA$EiI(gzV0+n{^*ku4a?#Qz;nT%q=Rud`bq9Va%lu}B(erV7r%~Y=9y9hf=G*&skANV|uFBm&y?xBoht45=bK@8gpnhl+R zN?O|+CyOc4XR{4;hnE#cHAnvOBAx&y?Xno2-w`a-)Jrw2VHda?jL3T zXcDaaPv#R5h5B%I_8{-SsBgmb{_8olT*`aIDUuxt=_Oo~Wff?{j~`mPoi|1ZC&5Ik zE9i1>iS@LLpSY+afl))TSOn-)q>UWyENi}z;1ei}dPz-|C;T3P`f_qON|Md>LE37$ z1rMqRVCy`u0s2PJyi1M_|6iOHbMYgZDm1(gRGOd3rN-`$B3b~>gHQ?K`CHpM3QkPq zGB5c&uJ^5fK_tdup(8Bf<`3AKlMQT#j;5IR@QL3$SWyA3UPzqxW8L|(NwJI?6$WKd zg@5a*em|gdpg!|y7vcX0U4F>4cDv(mKNK4vJ$NiSn)n1Zd-{+(o(*v?dmY21#iP7o z#W#w7z`MUo*T^JSvfqEhWKiQ5VT%}d0u>j3WpMEIH53Pyh*u+BFyZHRRH9h{U5Ek_ zk9+eO=b&|!wJ7!DF6HLP`cBjCGPFoA^(qGnU&s3TEy*jjmj#V zb#obwGMPQDU-6akyOZk;e*HMQUndZTVeuhQAD( zzf*I0%D%8$^+4w)Zxv%7$@QoL5H9DSZuW%3*xK64-EC3SXZ(ca9=oA4OCrl%ni1YN z4tqQbm@8x@tog!y{Zn^Nm;X$sxMf$r{R4Z!b>nVRzb9+FOL{Q4k=;<@1~Is4A3YTd zXp(-@f_a|uE`47Klmol9%m0M8`*i^VF{Ysz9THOR9F)k{6L>N z(N9}YPjTRV^s&#D1B=RInl5>sj=TgS9YEh~`?)K+v`_7Jo+XVLZ<0DR9O}yVzaY^D ze$c&cIMEeExY&}j7O;`dVS4fAr!HvSmXWN@uDkXs#>j+9;XeiLC9D* zegY~9bfncw5dD4ncWZPTbr{CP$_}Wu7x}+TP)?s>(T+LAi*Z5t50&Wp^xg4+Ygd(r zh&^9w-Ihe#0n~Df$!ANI**A-hnl6Vd&(9E?a1;4x z;DfE$<+FXY0r+Vowm2So-CqSjn+F6e;&3|@w6%dlO;U0 zle~<%T9}QwUm08|;NBR7ly9qU$4Yf8u1D^Xs~$ulHZ6*CpKu}li!eH@{1S!vg={tt zYPxQ_!D5T4utc>V9i&M{`KK#9iMqMsC*$G!HI#KfE2>UKfX%mIuu@Kh%M!nYau9zVa4eC9c0y5_=v>3TPY;f!Ve&+Kx7pl zOY#I+-n<8H_G3OrUS41=t2Tdq^=LXdZ>@2rjAmWa=t*QOMMnO+F6B-(dNqhiPKV>< z#dP(+nXL5*^#ZGLliYge#PX;?g)<4Snna*y-eDt*fwx4TY+F95=QOMYV{_=_laCI& zPJ3)!kVo7`FqaCbbx8Ec8bL>FYVbA*+#40Fl@^_&7b5>mYO>l6>j)YC$Zm@@&AbOf zzi`)y{<6DCYNpE~1kJGh5tgEJPg+Lk5~*@iQGAY`9Y2sYilvF$M#0+~8EsEy>}F$J z%4@a~NV2Yp>!;O9CGPg4-^<6%txqtzmI>HliV|3BaBR9}HU+;$YY;{J#%;NwF5o54HUa3HrJpwy7B|b-Mmt2o&^WxQU#^`F8^tO)oWHWz(i95}5ILRi%bKZ%mo~Lci?MUU|yk7QHv%%3_9Xs$bpt-X;XP3;!g^ zy0LuJ|0`pFp=eVudZ^kv|urUnMDpt#3v-vXtEX< z8co2;7`Kog^AcBORs}9JInUoe0q36mX>wR z=<4ex_{MH7qG`eL^gHU6G&fnBV*f0rZ9vzeySvq7QA`WxYen$G`E4B%S=+VP0QedP z&q(kuO?nUfr{wYL)u_;y)Z)tuVC`d$#Ni<3%Jj~wHtx_9**F{*WdFrr ze$m(;TG?xUbN`6J`P{$i-XZR6W%w9@pco!5RYe(!9Nv1f>KVZ~t7-J1ewU-Kr${Lm z`cpMm#MZa!dD0q@GcW$;O^-j#NxIfabu*KiYKP;h?Sdy{bU5Q~ZN(efU2*c*1g9}z zC|LW^rc8#6zgbW%=bTB3M<1C!_(or4i%hqN3!F#LrB02Fgm5V;=4GC1{ApU>JCIlz3boBe(#9Zj~?EsTFway z4sJi{F>;6%$`=pZ+RlTfYqZi$)0DLD`GP|p9hK|8(w-#MU{RKOYhRZB#)$rGs}Mn4 zmhBVSH;Cyzq)N}0*A^o~Hhi%~cgkOz+!29#csggbbl1!yQ_a$nyzVN5>r89aueUkg z>R^-CP_H<#n>MyOQ9{y6euBF2&cf5;Q z*;Y0yBA+-NGWqgrl$$Bv*);j?^g4bQZPewFuI7A9|H7`{qWR;5p(Jv_Uwf;8-V`Y7 zAa=z*m$eq481FD<>@+Yk5qu64NSI(w>nufSdeKp$x!jtrZhSd9EE@JPt36r~_k~QG zpBK%ft1p5^y;!9Lfv{W&(c>LImj3Io!9h>n4R9qZEF4^J3FU9G&sX6frFPZnb8#(> zuN}`d8up_G1OlxdYvzDvCpgbvTEl(vb}miLyr!zr&-9EpMaXC5ywlK@%GEhC9)wN> zr?Ie%wU@NERKUHYQrl-1wN>+B5uVuYmj{=+*x5-~W}o!(oa2L}0W7rp=jy3O9_b#! zR3k(k@6FZy-qv*y`QMBUWZxy)h3rD|96g{!0lnUQ!lZ}air-0JJfgh-q18`CgW~iI z=TRKfOJB9fU{-QqY};u-s#?H&;zyZ{(pK%7wJxn>J2VvwDFxPWya1VH&K~(9^denA0l!$KxCHX# zJZ5jvj{ig2i0Q>SVNpl9^-Q)td+&zh?8;WQli#QsG5=!H)ZSfgX1nS2YgiFsWMr7P z6!6%1Fe~lR*fX)l@Bb_X3V(TP2UXK>?Hol)8YaH&^r?lVKQaC?f1$Vpidzb)$}2|u z3W;GtP~FqxXWca>fd(G)2EbBotfCUi>_*n;manw?KZ1EfW=R|XPYZ4E#CQYIv||P( zg1qsLk_VH(nFv=DyS#TNh^M3JWUO?k?J7aK--3HbuX=Gi*P;Mh0sH%uJV$iwFB%SF zYuS1*Whi6v7q%9=fbbSg#r?vl4}Ax87qfmVl?B|0vje5~JDP__xcOs!=NvY;q=L%Mww-UnRSQvy5quXiWQrTB8MJL}cFMxMHz&yseB6IIdjs>*|x~Fe~q= z0MFgAZg|d12tK=8c6P9W$zx0=3dm-E9JY@we3siZcx$4R^-+m>?;fg#N*PTJtqE*@Ie6>lJ zz)hQ~$|UyYndJ3r-0s$(% zL0czB{nN0cmoViW5hSEO`ce}QG@WQD1uj9yH~yLxd~WJTh_{{(_S(Y0@EIXjP8|bF zgB}hN`K+{3AKSZ^n4Uo2zwQ-_iySH{M9)t{l>6_RUyRr~R5Gxuo*5Vx;|vVnt~E6> zeKvI1OuBIr8;`RCTzY;_e>luD?SD3#Bx|72!Y79th}*OwQd?rgr5{NQ2J|?i8msj) zZA_NLmx70YVx#9Jt1Jxk^s>1<#!N7m_ah*>Ps;C8tK?AIuj5)U4W_95Z<|P%apzSo zIb%c}caz@Hwwo-lYfnW7*f|fPC<9R#hv2JzQ-_?_oxPD3aChxYc808z--?M>I+8NC z)k#+Yk|mY)J?S^I@&o39t4a8n^O`mxkYQ;}PNRXhLaDN+p_J zL!&uQtlrlZ?O1A8qA`zp3A%HKqw7ezr3ov-_1!4m+S9H+K8d!c z2cBoa?Mj!};dythqo1G6-^zESZA2ACcw=^=Q-rCxAna_ zM;bFwnWQgET5WL0qbWTP7K8(|3bm-{>E_URNBeWf_u13B6GVHp%S~LQ+KUPBT`bH` z9Lr5yT_L?l%Rej^seiyitS>7u)~&s-@-`hHS*lHxIhVA&i2Sfw85@XBB71Zy(!JZx zMU_#9_wL%FL@nYh!-tnjYf2_4o+FF3$H}(4uch1Yv{vmW=`A51n#bqshH|AsRYC7d zzB$tArY7(sn^hs{#ipog{c(p@9omM{E(fQOKJJ3gBe-M~Y!uuV(H$)BbEN%B{IaI% za(uS}Bi=ES0NG8ld!1`W%|WkCFy2Kqx#p3Ypr@JHL#cXmy0+Ut4g+%XJ{){#({*1Z zFwCj+byhvG#K+F=J-cz}-HT4np%lyi3kUzVdDr2vUxz#+1u{2a{~IV`r;!7Lf;KoD z^=Sgac=Ba)YxfpX#^fIngKFp-!5IXw@l(x;E}r1ND#bUWW$mN)+o`P{KQB|-y?T=Ta@W`8AQVf4EF`C zAg`uHssqfDisw9nysGs&0T|2lExT$eF89SCc8l-bZ1B-7Psv^C>=r_LyJsRTeLe{T z+ZpBJQAaZ_z6(b*`;H!Vi);XaId7sXZ5Wxx74ZEbYX$LridDH?9Cb80Gu>ejn1h`u z;>g}s+xUI0N$q;q9Vw3=i%u=CaH#g>2A%h+^=p+j-!U_kkaoT=J1EeW z7}!c_5`lN6$~`!abi|n%bqEe$m7;Hz(6|jpe83Vpp>}OP`{DBHy};ZIC0ARywsEGQ zTrF*x%_e(Yh2g@$+NGE~aP%|k)cL;*s{cAYgK#s6vyh=x{02WA$wZyOe&#H=1R@MR%%8-DdS!GtMGlYAJkv+eM!|0J4}HT zvlb9icx~(@Ko7_ii87)SK*NMn0u$?5O@nmW zyS~OMQJ0>_s9V#1dm7M|Xw!8%uFGK#Gs7MeZMC-;ip7Fvs$>LZy9cczFnWdkz~xoS zYADX8gYx3Z(u{hgEH|v;aVbi2!x_ar*u+yelJilE)#sc$>mZGJ(L+r7-p-Hph+=)$ zYZaw~{Ue-|0_gfX*L_nk(%~scB+QMoS!yeM^h;BN;nK;{oO07s%^a!l5ILlX6!nnb zRwtLofoIQ$iex-GXe%BtmwsigPV}TrShJB1e>nV7Wkh;uqdicR;)##sFj&~NQ2NF} zmno@dCqwkco5L!0MVf$g><;S|SaZgf#vx65#kQA4fXZ`choa3deWrz4O9CWMk6T9~ zjxb4&@x_7k8Q0IUf$)v?MJv$$Va)$Rr072o8Is3*^A{p}ki`P~Kq9ktm>XC-c%(rHlwa~zcfW=n7E zs?`=RTV8)-v9@sF$;ub2r;o1@IJIUs=zd0zNy8t)lt&$6XJVRRPh33Tgu6MAQ+g?z z0MXvkXSTUT88XTj7i7m{2|J3^h-LxHsI9NV$|LrhcO0U3$YmV_m_F5nIo*ILB^%9g z8{1$=nfM$;%_kw>gF@e^Ceav{#7PK9(n|L8-Yyt*+vEuBAbZwR#kb6*09Mkc-I!@u z$!2Q5r*e#Ok{(g6XAl?kp}jK_Vl8u^ev}Q1gG|AG+FElh2EZTDbHmcoRNT*|*eur1 z>j2+%JLvz~2pk#?;(UZC)_N&w^3+O!o|ztnhnrQ0qa3K8a5Jj-Cs4GL_Zqed6TQ`7 zVBU`5KB!(c{uZZ8MAQ7EpBA*{XF6nLDf5ph~6v3w)T!>0aZ%-FNj5R`ka z#S3Agsry=tr;ogDc2Y-uHu+S}B`BF*^ZYPe_mD7^MfyxdV5N$poTg4^oX84Nn17QI z4QRZQ!pU-8>)zvLRKQ%Z#gm-Q%7rh(@)!L^-+E??CK+8r%6ozp4QnfL|KLr_+D`{| zF;^?6;{x!<7}m@&K)7Y$t{$&!!P`}oVQE~+^(L%7`ag-H1_^{)Ck21xkV?Cf1s84C zH&&Y{H^RDAWh-Yd%k-I|GwX_(POL1|>M_Wu4&7`g3GK~{t=K6Z`4Bc3mo^!I9A=?3 z0+#8M@#wt0jRn8P&IrJ5LcHcfyzx()J+F9MiuTEaN?~jvVEPeTe6r^_f8F-a)^{uj ztb^!QYEhJrtqB)Tri*@^k6IFYH(&WwpC}t^==)n|h1$s}=-+V@AWlkcMY83)aX z-p`j*21b#I>y^@N^?tQ;UZZD0AyvXUqK0=|VP;a2Oa~l6;Dh?CHY`%pVXT35;UNuy#9~pGt?G&aXFyUO{ z(Hwn+xXgur#}`~d@N7K zvYh;aK+A5jM`JUV_3h1N%H|j`$w~ER_k#PN>Xf5MNIp@FIWZ0Hb4uo?ls6=5Y-1-e ztaJ6WUEm_Ew6%mKi{h}9Z^~}^+*zKmR0YO zC9^Xmt*6zVHKabSd;fgKIzONnWo)}sCKReH(6`aK&nENobYWOCZZqxmqZX4@YB*mH zj!C+}+XVxHz0w+mXzkE7-~|L{#4T4WfDi$7FJq%P_LDad7N8QF?5@+@*KZS~Ja^1| zm;F~(=&Q^VoBa#>ypltefEhK`tD3Dq))w=R!BH8vHD(Zz{t2{k<6U&M9hrz%7a_H| zy__pKISi4TW68%D=5IIw0%kD3X_!ZU)D@ae?sXjVlG5$Ki<#GIQzHHXc8YUHf|0DL*=hZ~Bz0NTXQ(~uzy*!-%D~{hrwm#k zLE@Xq+Sy8^;J1u4%D;O9lOyXO?!$+45H2OH3K&NE?206CnqicyZFn&Ekx)fhZWBR` zhuF8%vW2k-n&GQtP^?4Ig~%tbLxkU0p^T14g8ZzBB%7qK4yQpHTaa#)&=r7nyi1!Q zsM74%)GV6@>*!WWRQ_pxz5_It<1{3=3%yOqss!ZVOeW|R%1?Iu^L%a`K8=sho^=IX zksXF{&2AK_bK?NX$}wpL zWpBzwh7;A_a|;+DqS_$lK#`07&(a5BrFiqnO?W;q5J!D#8|ZAVnY4#06_ zPMvBIbXWCGPVApc8GAZy`LIVb<+J5TwsK*(M{12EZ1teNMxt$o&7mONPiq(yrd%jf zJU7k_n){UxC>~{X#LwVJKIv834eo;!d<~w<<>hL{;yV+lmS83Lx~SoGVm&|h;IMNc zkn_dL4Rn+Y8LI}Kamq{RhEjWMerZ7-%93XL%V30&sqtX#(cGmNYQXlWf0+%6h%aeF z88>s{E%N-5CS6Ky4>vo}8<6cSjY+2Oy`6O4Xf!ii-Ud&25p$;0nP zR+#c~jn!aJ@Bie*KwYlcTEH986T7OLe zC{d>Xr2~Dy?yBsHfB)4wGmQQ2kmSdIAMg7*6zm)Rp&&5wOBL0){SJ)kxkJ~lf}kAh z4itOK$7+ny2UQUinfQl_KFrBAE`y#Xl?Lg9=OA$RUA7VoPa#L;TknSnmB_-pwq{m@ zSg$Aqi{E2q*liAZ3`>nmoyoPoDP8o?72RL`BW?DdH>y&uwM9gylG=Qf$sCdn>7`rv zA+{^|z&3ssRxbl?op+$K`w&hp!`fCAI<{Z#ZU; zy9b6E))Tsk1V|Dj>%QpkFGeI)zPGy8w&HU^afK!Cj;cL=;Hr$2_>Gp@td_$XcVd|X z5@Q$sYq*X;U#a8dSKn0ru2A^D;tRV4K@Io5RaDxkJf5#_5J(EWrNj2Ol=cG~S7c6C zU=+c7!!7q(hQ08tG`wIT8u#*>1I&conOYRu+@tqKLeVP9I{I$Ax^D>ztS)-Tf77bX zP-wq4kt)0g7Lj>e8FKZI#lSYy%X3vsD;4SnO=u zSE88ztr)=q8tI7d-^l5=`2>6`9s4|$!Y89%2rU*d3AwjacM}9T&ga4b zJDZ1rp5`{4TggTw1~ z`AQSCn+~2a*DEJ{UT}vMaw*CMH_GcZB0-5@w&M!>?t2dy8HjWD0As_Ct)HxiN0T{g z5H(e5&yL*J`=)SxF1EuZ$pox<%{^M{@+(FoALpBU%9cl#Cg7wco;k$-{Asr^EzMREV- zs;5=RcH5gIVIO9<$ZIcoOb%Nj2Ukb!@Dr7tSP5V|uyh_BcRxDvDykim=r(^@%+ z2}UZ^=Gql#@d=Lk)zNV7MSzN9C(t2U5lU3peOH<=i`|>T-OJ+A>+crd`0a*2N7!s7 z#Rfc3`ipc=Tg5=N{hXD%?Z`D!^yDU3jT3kV(}$Iix4ZlUKNkKeGoSQ;&e0X`nKa>K|m0 zP7y{8XMdLaa5+P@U3A}z^fb{>&>%>>G6KC`Q7S@^VQA}1NP>X|yreI_{YYp5=+OV9 z^|dB=iishu`Uu-c*M0HuD;BNJ;ZsGy1gFb*4RBtJde*77MtS1OPeGq><~L47mSA}h zah!{i&MRaOY9iqFfbhkvsm2c$1moft4$X?%k%S8DLKzHh z6tcm!+8XEb@NODtlGza{w6UsGmnTA~y zw}KYx!aDk!f)Jk&cu$9q^Ypceh9JY*4di&J+aj5Vqn{x@Z?U#A1P;e?Ok_WLzN;Q%Foe~RXimy0L5 zVs$*bJ(k)-zs)0{vh+9Gp-gnxs}qY2GYhC154H$={;hMf*L;D9hbFN-P^3!dT8rr| z?>02*RS%GF(qm(C#Zjx)uF%K;k5!AVrY~qoj;eJ^TP*0O9HL4mum^pMTdNg%X~sGm zA%FSOk7D4Z-xxZ%3gKmy@(F2Q3hs-3j6_63^it6Ob!&9T^0SerXuEA;ZFKC1o-$7& z@>AYvym91T%lN*9vIUaKSfjtT>j?FQ2JH3mZTqrv%Jh9AjGRp>3kg7eU1(@ej5Uk@ z@~F$YhSeuoi6IAIzJOCT-{B9C+?z{xUCM(C)9Sh&(eP!{J#tIg6(I!oZ+--?G(AEp zYXY(|?yLab20_%piKLAcGEzmnxx@)0uuaG4vU$igY=w?mm!7i9V9v-cg$B*fHcfL!HbG+iGrqwv0W z*@<_l43ZVG?WL?D#(MDEfKrPh`f)DL&jwL|bCJ{Ta#0koQRw;tnbdmf!D|qLolX8U zrBL$begVKy6h_Jq`b5+5JI<($J2%UUzXGZ{X6;zNUt-r#mpr^JZDTIgcIJ~+2e9gUW^ zVC<)AXW}PWuUjprw)fy9Tcp0wwT4f@4$-_?yQt2CXJs(sYZM+~M^LBNvl~lVQ4qjQ6{raX)!I&7!kxsR}fPV3vn2bc9gNZwdixUKG z_1Dm~a;oY2DG_~FKXqMf!jd=fqA+$Y!yAGIW$C^eCK-?N+Tq)J^L0$xPmKf#KC?6z zWfDzKYqJx~lt1Ep>{h%8o1fEVV26(m6xo*rIa_WOiB4YqN~0m2B$PrmpWDt5LIUG* zH;ws4D>!jtLpW!@WeF59dnjYiyX5Y4C+4~CCym6k*8{Ro{N)|`b|0+I5$5FGpHsyF z<}|{cx>_@gIn+D3_5vhZ`x(NuxAyfV=|CgiGN>XUKJN%~u2RPUObX-9ETkwmXUyVEhzZY z596=-54OlD?=leEj{?_NF$Owc&N%a);Ih`WZY^6c1bO}Wvm6`912SHsUHZTz%h8UA zx|qmH-=5_6a^yEjRs;lREa4I}J{IG*PCy5#6!1RQUSOi52b!|D>gqju*Ir>S^=eca zFzykJS;>F4_OkS-!u@pQr();05GpmvNpAF*zI(kFVb^-`tk-wSb4bLp))M1olM+`e z;UkC6zZBgQ#sOL1#Ma8BE2ww)lWYD{J|Yi*;x`C=-$CIoq*DyMSx0_?vhdhxc^SOU z(QkF4&jQ6cdpH3cS$<8tyI`X}M3%8a;p-w-*!gcv3UB5jtM+8}k^L0>UrFx1@R+uO z7w;s_vR^cXb@i~1`O-#tF~WBS&Z-J1Z}9$;K%r@;zi>F+V7}&G zIEA*{bOd%lQ_qexk~F!+Ad@&(M&^42J?AjWPbGuJ&{rRb?U+Bt=v+!Wz`A#07pA^(%MwjIEH2ywTfHhu8uHJ7Dm9OVxb1eXH-3nf(UPDUPZ{=4IZk-hxk5nmi(U&vbh@M-jv zI;T)%u^w^{mIDTXSpvD7*ZMxbkz9#I8*y3+v}iQ*U(@Qh*n`V?f{qg$a|4^Iu2AEKZMXCkfW)&28)bCyOWlZ{3*(5B3{jVhq z{MIkZ^mx7UNyGkjUv!%y)Ku&?0K4F-tlWv*K$YOlPq(7RfsJ)96<<&QG@+Hm~Zh9Vgb|Z{y1G3apv~bv`O| zN}FnswM&1?{$6jhtJFKiGy`m|TxSh;0^M#SgzpT88e*VPl(x!8_n-I_Ib_=AR9#f~ z1>*_`eRt8%qecmHtvez(&XyI&;#4>;{h0>Gm98HZ)Uyk^^0G@fUMUPF&`ua6+EbUs zGSG;AAt%ODoMTWle!f?6eIK!-JYVOQcdrcHyKsJ2NMnZ2eWE;W&%`{9hvTdk*-(}8 z=KQdZFS*5w+a;qVQf|*$kvEGZ*trOUF=G0s3-{}ceio7b#rz*u5ER|Ur&ovL$BNC= zZ5d72kjgbt7@2gwx)aFsEPmYc3W`hOlG5Y?RAMjLwX<0&l@_ldG^tn#K}f?a4ZZoI zUvXQkqG#+lO;g+EZ~#+KwphxIfR&mbc*M$KOb(&uH-V2oxnRjw*y zyR%4_4x}pzM1ii`V~J!!75twfQ06H8zCvCo!sEx%1(}<`#v_eOF-n$?T!E86=kJ*X zgSVcs*kaRfzw)zhxPm+HZhl=!J=wuX{*t(2x9)J+y&61|Xb@@uI`c>gSZ(Ly$~jo4A* zwT9B5+HHXC*_IVQrl&+ZOyvYrngcYt=>b;`63#l&9jgB+uYLNxcag;7vWMvLRFBI- zbhN&eNHnE>qQ=fyJm9`k;9-AQ5aj#qg1h+s5Iw8Sgnaf`C}7lCmeKTOT+5OTG?gu7 zHh;GU8bmdAkqRM;8r(XZ;VZfyIYD;6*PS_fdJx)Q4Op5MZhSnxb>4GfTCwL>7Seq^ zbCWeRq6IAn&fn>fKXSA<=0RyBoSGIs@mwrX>4fw0mwzbhlVBzGfZ;C3~WhrvEF?LA{%l0QNKzaB=8m8kXEAUTw6U$^q3g(21;> zH}=0r%(Euz(Gobu0u~NqU%-^}oCg|1Bu{(2qil0NjO+2Es1eOcDoH?@tlUS=E&lF{ zrg){MOFf3?kfoSWKxh-llOoAfs}jQK$3Pqth_2PAZ?;&4wRc zr4i3fLsSb(5|FKjVJW}dMO1R566b$93dV#=v+Fje96w{x#}XY~&nPYtCiCmYo8n#H z#ug!43AsqqG+BQdy-{{|%#rRDAry3lgY_3lh!cV=g+7TiIs>V%vsz^^?`n2ug>Oh9 z1JE3wxV5Bo?NyRQz=l;8=Flo{H|ywO#CGCSXQ&wv-Z2+C_yaNJ7- zF-lG_;a?SDrz}{_9*fA-GsoCWwyJ^<$ms2lfpvLa8^@;F0y~%$MPMfHXgbf5&JsIuq z!Wor&9mO#4pRPp#A1GV~P56aoi}G^*Mx|I?6xADhzqky%RJp}`><0BS7m4=NRl7X) z`r;$m^%K!KHqeRMkKvJz4tX_)(b;%ZKmeD^^n#Ag_j8>_G8Us^(wC0+f~tv}qT0WQ zAvhHV!RecT8C$bCddf^!WcXmg{ueqK1CGS0MiHYQRWhF(xGNYIU&d#IRj*t=9>HoU zQZ&nli@%S6+rTO^I-MTK*7i*Qnz+6LsLL zP<>7X%hab=Bc&rJ4QX8$cJ^e@JwEZ)5jrFohfT)vzp*@tK=JF5`fh?^>(H^3{k$%u z)M#g;%9x4-r=uQ(lTbARm?w^?CsV`zph3r*L3;mH%B6o?CKiB60xINK)XKG(Kqg}D zN9Up*$#wL1%&D#Dju7c~t+8Tq@ye z?MpyiGi5r-&a~iy9h^yziNR`2htUa9kE^t!T$!Vn}*#KkkJWyZ{bZ z8K2)EOMre#s4JO0+TmpEuQycl>arb*i?I)y^g47f*2vd?5sMR{UWkK%4h_&SdmG3t zd%?s>mA1R1XyiUS@-6up*t4~nJ`iow<@H9a&Roz*3P8|58}&cB#)}Gb=o_1<^CP(^ zsS2{Xoqp+$?wt8?f6EN7vTZ}en~m*-9M6GW@u>Nr@Og8$7#*9pjwz9xtocrGHY&^E06tm zepo9e+8#8*blLCX2|0t=W7vE^J-{@S6rW@TS8y`v2xmZ(W2pE1Z8~$Mh4MI8Q#yhF zAXGa2m2CfVUXi2x^&qRkq(>#YNrcR+q0wi_Jd}3l&uR(FiG@u^kFBn$YzGtV*=l~c zwsCXE&0gf0EWEU>vsDEj$FPO@-*LG-zEnR0s+9tTpmPH&2O;`u7e#?BhrYH?5Pi8^ zI(L*8_iY)1^K_=O1Pcpd3E_!2%Yl zjU&5U3!!?4>&3Nwgt=j|xYdc)cPlj4ZN@3WM^IL*6wb4#e5Yp_qi@kSBtc2 zt6_D~yll0GZ_fqR-oap$sH3mnDh1sImTAp9JkRf(F?c`c@eS<%P!l&(=&lEu22T3@ z2Vv7FKMbBi@Csw2w@rEWj*cW15=2uo4p|4-M*6_O(d{yQXoUkauICd>cqC-I>WnRM z^3Lau-l=%o4}@vZuQfSm8b&T^)RNSZJm;3^!HJ46(Qpt(qi18K z{eGm`{O5kUZ?HF><4`C}-8nJ-UW^vmuW3z-5LbrNC)QOACDw9G)>k}= z`p^)1ya5`L|BTGcWtEQ*-53w|J+xFn`f!)h6^I1GDq&n()dQ_|&A5@^Pwd55dJi0M!r&z{9lSb$tDo5(Hn3E%Os19kL6dyHcCJ7ymzjWy==;m=-HIQDi>sr1g zl-+xb0S~y?YLbEC9yX z660@gIFB@My%#Xuj7I{!fX>ZGZc5wFxr$VKZ>M~=b^kYyr8tJ~$tHI-nH2fEDrEv+ z68r2$Gud)dcN*%EUnfa{VmeHZ5rz&Wruk!yOgnI zXwWS3r9_(uVP;Lib00?oo6+1?%{&=D#GvYLWl>2bW6qo;Yt_iSqx`-VxXfdH%?J`) z%tcAdhUNEJbD8-W@N?77E=8`DU>#DDXG1MApWaz{6^EsyTFp**PamSiBs~82{(W|- zl*dVc%l>LA?&+`5n=iT6_ReJkCm)`@Y4s=M1DR@bKc5ry8d}r8Tz)X7?+*)kWx1n4 zzZrInlUSsoEsOSnrqF$4Q=dT+{@`~5d7UsuGU@C;dQ4#c(ln*;(*Bz;D-6>f^c0QoZMN#gLN#$LI^xxEfPMW0b;8Udaodfa6E3t6 z)pzfcptkL45`I5tY>9pVjp-xZO_wqBC2Mg`r=L!4w(n$VqPpkOC-Wy#y<=U;NKRPn zzSBJpZ`X3yeg8oaZrWDX2No!}0x#YDPy2{NnzsKi1bQObudR(}Mi9oQ*k|l&9FUBz zC*ylfV4oJj>i8|OWM|DX#!|q#qNXw_AI_0iH`h*d`?EFu=-pcPEJ~~0#=QWPW5--_ zDS=$IDzk9T1Tj4e{&^{a`%7T--KrSbd8#}AhzV*VIr40C zpyWb(gnds%;xbp0kEZDwRcc^;x>rL>p^B4UOM@kU{VwGT@UGGvcKwDcS!}xMel=M- zH8nK&Rw*QBD~`t~Tvw0X-(Y9BmS4p~$8qM1USB(mcAmFWl%}bWD_1{VsU7=jID$Y< z%d;S>-3Oo525i2Q3&E2bTm9sC!iF1Z&HMidK6a`v3z~|^4Z{-(%>Tr9xMahGSnAvB+faBY1Gf{pMe$l@r~O4I;ap69;)9vq91Oi4xQo(RCjQJm zWY4{Y@A(&oLagy?+MBPXn!iMSa0JgUVwe8Yj>FP?c`k8oF1}6t`LDM{@T!!OxlR@2 z&OBk8I}w<=-Ip0j_Ro-8zTemulmZa)uBp?xU((7SsnYOzAaSl#o)VU|bQ|G5buIP@ zwKwesKB$Mnv}!20!~Y*uXBn2&(luZOB&9*RyBjI#PATaUC8VUgM5Mc z?98ft3`AR4vn~^<0Vye8v}fI2>H?`z(ED{5f>Nx?dEeXTN6)=8lQDDlYlEAb&rt;t z$X-&if1%)}ii-NSA40DrdMRn|meH8B!AL*j2BrLF@5_87k-*hN{arb%!9d5NxXY=Q zq|f|`HXbom*6zVEL{dC2)R(#^NO}j|VYXw-e5U81B~r9$_;T?4m{zkwy{W>|W0P>1 zo zuwF^DH?$bVweORELi2a8eSl!d z-4n8;;=P%u_3}vSppLwqTQ>eWmQLP3i`11m?Ox`W@q@seUe)drC6KX(HGn)-WN4fB zCk=mz434`1fzgh{dn;qm=A6?bA7yxxtD0+lXbEeh_|7d(nlLX$AgKB7nup7N8TC_p zds(Hi^ToT~G|S_p73XFh7kp!@XWIl8uku%*sm3^}K$|l$r0K1KxsI$({>ExB2bHD4 z9$^bM!PT9&0hi4w$rp}aVf~nPKY2#fvqW<>U`i87&&)2!gY5z~zpiS-ii)LyHq=F_ zfcFv}IAs+^KY~YVubH7hDNoy^nIp6FrR5HfGfw>QbebLi%jes#r>X0cuZ<)e&f#R3 zFB8{(M9pf+AOd3M}naGAmyRHy+XgCihk*t3#+G zP7SQs@k;AhCf4a_Xhc?j%rx?Wh#ya$OasJ(lePY?cSTQnNeT7eGxdk4fdwr*tCoc{ z68>>F@asSTG7E8A@=C7NUJ@hX+Ws*lZ|!7?Qr2c;lZSNi8m3saW0LceZpp9|viWU{ zU-|EhU+gsCZu)%mAsrkDx1AZB@b(1tW~wU^kuU9Or0+mh!>%Mri=tyS@4U}=ADeTC z$SfjbZSFMYt+Rd{WmV+(&nWKX=FU-=^erw9sRiw(dr{N<`}$1?C-2PtjLe>)64kTJ z`s^7t)7&jkUm?yQi;bDU4d;PdENvT(5pHxg7Q1zD)Pzz*J=vT~Tt^Ulh{C4eHJK%O zXmD9OF>TO)<+Cz4CMEldVlrWJ8~Nc#P+d4@*Wa1T=CD4{twgO0=Arm(1`&o#j(BGh z;h|sKV8AZby0|rB+qih{jeW_Cix=+gU2C#m*ieP_vzVJ|#M7q3!AnVZYwx=K`Zq?^ zLeG7dT{*k@=dTtDC^1P#pL-ldzo1t7M(w#GkWFvks)zc4IHO}zp--9Hy{ir?w}r2q5twwF+QcK9t*PRZ-%AvO zu1e3F>4HyF5g$YF@19j`u9ciF#{Ps(gxvd(tJr)j4}~E8yWwa8Q6+sA{zau%>BRzv zssKHFd?+=q%qQS2*{&Hg7^OU^V8IfyY<6gm<}6UbM&Kj@6^;%is-#SuL``1C(b{Ln zJ-(=DXZYMYtZz54s$Nq&a@u#?8kfA?y#tA`H0>m4=DU51lVk<&U3AwD%8=|Ue3gfm z-Qwx61d7IxtG84xb4=pcF*qssHx(@&pa$02E$moPNiX)NM%g+>UxUB2aIedm`4I(1Y+Kst>(% zE%}tWgM9Ujmda5(l~-cBBB}4ksPT!MvznKl7o(D{o+QlXu;xNobths_aA@*~22OJK z*>`~hIOscfZO~TzsdK}~S4BD1eDhF1vvNTP7Qbx3Mnuf7sC%QzxGZ0Rf{#igB(5^e z(B#_>MNcmJj=;AAi?UCbC7b&tL&{Oa8ui1__Gyq&Iv=UOVKysriWJTTp;^l~btbxjN>4 zTjvlyM~RqoYV|Ey+{LjvY(fWp^DQ4dt}?{*Lm}99ZD-G6zm3S0e87%8k4CYRT|okr zAHP^Gi)Xq-<`MPcZoUHp_F3mJKWO*!0iniFou%oF3rg@$I)~+g0GTombL5VEq8oM6 z69F!py7WK(;6W&e_wGZVWY_)sk@t!$ah>=^1*Bh8)14gZrU8?#0Rn{^fy&Dgm*_Al z#+;LbkgeK`ICRQ^Ce2jEFyCB_%B$M@{J?!q$ndUDMc{}sgD9!y ze;){^{6V$4;3SsH`u6Gja-vi!X!3RL_!nCSQBm+ z5MSKVWuWkGR&WB{xWy3@DD?9&&aw!gx`H%@`l$VrCKJjE5zU7DBC^7aI-9f&;y8~! z;Y*a+X5IL)5{~Cs>lv^xXn$n%($>INiN2$sdZlk>-^a<$k`@#jrc`G57&{v;9bm;Bn3TDOhxxOZaAde+{Lnw?N(<)AC{@&~ z!(Gax#8;kG;}1fD4NgJqry5~;75L<{=m!_v9%jn2bV@<61MOr~G4GOZ%gO8!;I4Y0 zVeqb1z5TpDhqh5v_#q3YW}^mwR6`A~APLN=nimKwP z^)S@*0YihyWP#ZIc7JEQHpOGPpKSwOE_-1=Xj;sMU($X^?X3b>eNyDPt77`?$WR;ljU9P-Z9MwxW}GwYmvt1ZD?8RPJD zj_NEY4i99?Wb)kQi%XmOG=&lAD-Yp-0c+{cy;9yy+R4_Tkx0kFA6)Qe-Rm;gRyp($ z;NhvZ2&F<^^uqEk-Rdr7e?5u;k}t`e#hr@6 zh&#HsXl?KenS9;hioFN5FLVb&C6!DXF@$4_`zbvW{BOqaPDxF_ZH^oXI|Et46Q|UGqOv$GU`nsFG(3y)T+;<#%f#Rvve@QBc5+HlfWA9wMh?r{ z@<|p9D>GgI{hzMMfB`ddH(0R zt)*#!I_ml)g4V(qD~tEuv$@68-Br9|4HX;(>aY*JaCy%X2lF)*&AFTiJB&)iT3)Em zouM3d4fFX-sf1B8bK6M9l^&^p8n4%c-eg(3R=!qRY8@w|u4T8iOm9MWGWLEUpbPYC zgzX{rrVF>#t|HJR@$z0|<1l^rxZ;_()%iNJ_N98k{eY_Lkmr`oiKP-8i9)L3R?jPG zXc`3wdTJAJsb~YR{(cFSf3uJLl;8y1Q})Wn>M>dlNO~eMd~_dKz+oWgY}55J)3Fbn zW*43u@q#o~U}HrVWN-IP^(Co?x;1Y64!zJF-+OwEj&jx(rK4#nEk-2>b*zs|>U~qO z4jteS3%lj8(Z!mZ_pYTlR-z!oa~<}|GRAg$VE%OB>%GY6vw?x%Z=%HS@^YThNMB;Q zF!6ngv%;cvYE16gCOt4yD%Vdr|K5l7TOPXLHw{aMln{sB9=Lg``-At===S}ObSoE_ zG*1hwC42Zi$T#^x+0<5TrC(4Ro|4u`@>6WNM#(x>lYdtpK9urLS(=lu4ICz7@g&p4 zmYn@f6R)uOPd>~3$I#lp`K;)@216IErZG27o27FQGNIqih330cwbA*pnI5?=9~Hsm zTQnq4SYK@s1nV@4HPx2tni9E<6qeUpUiiJYbm7d`SC7{3p4zWo><%Zma!*w2+Bt<` ze!ps&RaKcLTBUm0e+|kiN)Hd5e=`+KtD=wSKfmTI>UAccs64-Ve`F{*jjJw+0FUXa zpfb)S>ka(LRCIlvM7af6lmWmx=g7V_>N2*>WRM_Wms0HQ?U zBKqpP@+2ruP)0!diNd^4(q~Hh^Cie6M~snTvWiA9pMjbZZPx=R4c4sDb7QBH3qmY{ zY9xZ6PX_`l6y{)sL-eW_C&KKP?7{|(nHJB9qhFAk_kFnb8$9iOO7cS{;%4Xf_zs-d z{rI&#jKlL#p7yWXHd!9^mETU4_%*NPKp92Q=JiKIVMBG?lL8%up8fw+MP>1YoO7PF zwhB6}*>sO~&bQRKe$O=orLAp|JUbUgt|<8MGC{wMPWQRnld|8czwJ(%^~8X0;q{i5 z7T+GwZmNx4wGu$n8>92lm7~qi$yqPk+#lT@=aQ59&}36f9Flz)8qe55|4^v#n$@a* z!Va^9$JnIJ=N>&e+k+l4>GI#8lvsb%B=g8=mK-VMPi55-n%^5G)jtyp%u-luH=^H# z({U{C-$f`RZjA`i{QRCipQ?bi7zs7vjE_Yg4KJoFlb^?sn@Db$s@~; z6Z?7}T=F3z9=U9)sv4Kral)5#oh2PVEJ-L);CZrS55jxN@p4nK{ngoS2HPx;aRM$G zX9PxZ+Iy5|8R_>V)V;6%o(X*>C!VZFi_AHp_%}2sjz@j1IbI&mG{mp!P$@vFbA6g+ zZzU2@P4P3JW&7|!d<$aiU)U8-_KEKO!cRt1@^OngIvV{Rf= zk0Kx$6dS9Ywx>*jg9|zH#IE|e9U+V0t%MXjo#17-Uc|Clq~~Au!8>y?t)kc75@Uli zyKl$fKB3kDrgRJQb8)!Y_l4I{u(#@&k%5mc{AWQ@l7}|oBjR`1kDsBDf!;ewFOQp) zUpMY*EQagv-wl|A{M5scK!P!gQE?o|ev(DnjYAc1TimQrnC(j0JT{Q zpf4+3B(*0h*7@;Mf0(D%(p``VLg=Z5n`NFRa;t9ZP^Aq&fb zZ@!@8*X_sBs_$8xo#DMdkt|I4t{LZHcz2wGUwpH>r)PhqM(`t*3l)VW{;M^`_x=)Jl*LLBzz+vy;TCVc~RJmb2 zhj1^g7_;TiH>)Nurvs!6?9PqO82kp>`qASK?MI}sXL5Kzt5FE0i19;F;zgqkDhCXL zG(4p9*z)jOp-@? zhSKJ*+~8Xn20HYX&R2Ocuh?Hiw8Xi2CvWR?F+i9t+LAXKfqYdytaE5Wi55>P?VQI9 zmKlxn&Vjsr)d$693CDdiN1~-cXU|cE@vHZ$L=UB5pdEULZ!<`f;z)eb%BJyv5aV+s z8D)IbpLi|Y|KZvx)K|}O0v}_D@8ZOKeE5qP9JFVapbqLw0g?^Z#0GD9O|?pQ91XX* zERy@!ys>jKUzT;rn#C!!_d9e8nvnmu>BEHzpzX&80=kD3|l! ztPO>L9ka~_R+{8JxMq(9_y$~A6<_X~{3h(TST)r~7<%G&f2A?kyTS+zl?`l0D$bLV z&HC)3nXY?&K)M}d*711q>N)q{dPSf~sE8wZ18$!FJb2XHZn6-ZoSaUO0WUqqjl+ZN z_B4i#R?G18jrZ};+VtEG61F($`HZ@)ERA{XzHK~pn5!t`7myf_>)nM_8167`y2dJ* z(_fC~l}sjm23j^kw_40Qz3GruZq3e9i8Dhip9*0P64l6ZI$f;zI?(RJNiGOn^{Z=b z<7dH5Sd?$}w6{ZiQQiTDuS$s9bSv*t>uY{ z`W+}MuPf&n-dB{qk+Bg3UCc-Po)-KWSBS26o41r7S@mUP4Da@zYw-MM)UB@M#P^XN zVIQ;29vxSyWG`^dHiWSK(5jR>Ba!V*HHN`_P0ma4l2-+ldz0}wyKW0vb!8m)tyI_- z=hmYVBX7Bx>orJ5e^Y6>+?43@pX4olOS(HJ6c8CQ*dDzFCB&cCD|?qHxObm3U~=E> zN_~-_UxYhw{PNGWMgV&LiNaAhh2KvHAH6YQpJg)!Ix5BEZ@wWg@tg=pZYg@+BBruB z&)C7PSPQp?5X$fJg@N6 z>8Z~#VwOV5bl(Y0pU&EUj-qrxxqw3bfV}u)DdR#DI<-n3io6bDE1h&t!j^^Ig=>o` zYg5}xj>d;-=(DRizmWH|7~p8Xt7RWTV!peJt88~YT68>Nig7~|dh}RqWAC_Zv5rk@ z@1aLHU|T4ETekX5?IrWC4Nf5greJcnV8$M)M!3eDSuCoOXK4VkaJaXuY@$xxf*h*b z7~13eO2BthJYo6&X9BDUwm_`Y@t6pxgne1$DN}1a^z;4U{sFisjBedyOm=_GYi~Y- zHgKiC_??^ihpBgY`@BRsL%VuLo`v^> z=rg|rna$lgiE}c6Pd*O!ejT!W@%2dlh+AF_-b$-+H-F+w(|tYCCN~GpihlzB1Dk-s z6*a7t0bcY8cbX?Db+#RCZHvj*()|SNCNmfXXQ>MP%E1nn|3=@`>&u~Ny2aEh5ptvF z#N7ByYR0Ag?tvJoBu#Rf?gIU1_49#gD9fGP?!M}Te6ELRdiT}QNfS?~W_QOk;7w1q zU)Yfm@6*<4+ZoG#KSkWtg)$229& zSy8O-OM11?%{Fh{hBlGkuUWKQKop#%baiy^uO-RnXTdAm-5?WeZ|Fg4zEM>+Rc^wb zdczbtd^rFqH*darOO zCX?k9;)q0F7*-^UV-@V$mal(Yjh}TP)5*8Fw@QzSebbI-E;R6Pcf{J~qcpxHh3jocF5rn=BRrpGzdd%izk+VMxv}9dpUi7`@u}}(w?I7gM`31) z5j;{H)yN#Us5Okl!c3opqM&HPHKV=@^{S%TqKJLJPJeqS$Vn9U`mju>sDLiy&RniV zxvzH+0^FLq-IZHFK5g{9ox$WaaA* zagR`72HCloD3fY)!EEa6N|@)uy;rP~ZrxHHW8E-zpXTcA7-EMHr^0Y5 z&zkg=^8qzR#n`Td;A_cGA%oovY)1{oEH-Pl>tyRzqCvD`^PBw6<-8I$YpLfg1#4-y zl%?bYIUQJYoBRRa4x8CLHZHGQ)GI6@cXoHtM+V=~|7Xblm=Dbj@KGv%qo(G)S(y2= z{UB)19T?vH&J3!BE&ULBoZ+{fWq3~d3xi?#qiH;sgDLE%0+l)xa_)qNa4%url~;V) zy!0bfP-@WA-#~DBt{qUF+>mM2awlbRLFC@(e7x5AO*wbae1blE^==5}1PSuTW+bWx z0o%g74wbdQ#ZTT7jE0;B%2OfG17@hkjZ}5B2bIqq-IItOx@l1s^g_$cY7VCNC@V{} zNow+L(i-2sIXOS+@)PjqjWKL@Z}liz8C^}iWIOYqbL zd!o@Cqf0*v?9KtCp^w0uowjHWm{Nn07Z~)|O`j)ox=gg{+A#sUMy|)(*D?uZI2C?tg8exXaVt;O*REPeBX2duHpo8|;#Z%Qw zK=Y31%PXBar@iOU>?QtPnDF9}@t5Djf7s1O2!f6V_2z5xE~e>_q&hwp_c45c-Rj62 z2c))iHVTuy@e-mBqxrrAbClGa`Q-m?a{zS;-_uk53BNoS`!|6hs6=|O)QRvbfg9aZ z7C&r3LWnx07gb|dX%R#fr8U*e3Gn+czum~E4nc>{qWEiUZ31)Z#mv3>MPA2Ni&}dA z?x8A{rW{NCgYJW7=+3JS$EJP)iZA?caYclK+3H=t>ay{@Sj!6qNAiUi>Qh4l{@%yh1|q)(+gbvTjYXGQ zGh!!6V($f%PusVis!ZsVy?d12P?5mc?#e5;wt!6dw_=aZc6hbB+rhQqHOFfz4U6^Whnwr}5(39TvqV*< z2fk*K!|yFt{&gpd%sS3~S}uzL*Xn3S-Nj*j>|cCZi3rXtNM$;&e$nu-i49#$kxe80NJoK_aB zvGp32FC)RnHc6DR!(0llH?QtY?Qw~GdeBws6B85L$pFu{OBE&wMpfeVrncg1XHfs3 zRBxTo%-}vzOLWC{d~`3$_8n)521IjYmy z4h|9#fAIEr$#T0d!bb;(H^&{e--%KbUfkB5X=V0h#xmv2WA9EaT%FhstkYlFi3BfB ztIS#be3;(2?D;3Q_VGdYv1fgw?`d_zQeTXPx-?dnYbMm$hOQ$Aan@{oZsz0T!^lRO z&lL;A5CWXDsx0C#7$p1$GV8~a4aG{Uc|rnShtDA)a^b7wK96(wFuMY1PZc-rB`dQT zgalDgprD=#5u=f%(O+TFw*pXDIEe`Kb9^oo3Ypm8@BVJ{g8bWKGhWY?+H&J06Mtv-TlpX!g>jaA&RwFOkzi`0nPirA(ZL@_*t* z412=`6-h4j=_w?1Yj-ycA|9to>=kHv?Sz=J=xXQ}1+((+EW>}-C4*#Pdpn3xr=HlbE75&`z1==#U! zdQ190v3(9eceoF%K7b65RsxU0DXpjo`fPGjOLBkI%jAzHM!4#Mzcd_4jMDtD{;9k~ z@odIjfba%Df`}l{%K!|@Jf&>-v%T4CTVBed{|Lb-8L^f38-Y$%!N&$ElWOGlN%ZTr6s<(xp{kz&^Hbgi2LjL`-6GU`)7es=-{{f`Cxxo30{2N2Hdm7 z^LbA-zU!(Fqr$oJ$>D6q@()mGK>LFwN{-h3&sbGSh~eD}66A4$A7vlq4EBK{`GB|l zrj(7rbO$a>VF8@<(qlo?Kkvp$`alq@G@nERcyDMXOD3&q*$i zbxOrN*87t&^_qV|pwT?aH!MU?%`c#PtO4McnL`0U$A2T$_`o2;^Za>PFfndy5E+B_ zMjKgakF%uT1k3#L_zNOl_)9C@lbuPn*78yS-t;GYRey@4E&gZ!d}f8%(J}&v=UVq` zPFmIcEc~Cx_uGM(bO&ItuPx>B(f^LZOacsIjK71G|8ZEvP_TeTD0O%Tu;`e-u6sl8 zW@cxH(u5#I14zRVNxWEpRonr|W2G_(EoUc&{j3MI@{;(bKcp_DGZ0gT<`}T3^D%A! zYt#==tCwcZ&(B|~$u9lX0bp@Hdo{+xd=im=oJ;Q?0j+@a%i_4F&Be>>gZUf)z#sfF z3_X6j5Ycubh{m9$mis#dPl6~yIEYWJ$U=f1kRGtV42EIvOMs%oaXsJbjAhXJc(^3? z0F2hDw^OWiFc{8Lq5V7OZ+yI{Pl}9a-xEL1vfvL?r|YvKr8!=pC;-a24Zv2*JnuaK zBa?F_Mhfn6M!*}RLe$x;wgWx-akU5Ydk_{fBO_y;axPLR;3;RgkXJk|5izVN;e+Hk zuW5?^c{UXB!Of*@FySjri&NuuH=y#`0S`L5quEOq?O&}5es~jo63kcmhA~QTyc0*S zfd*jNV%`wXN?lGrFcYNs|9t{11TK(_@$m4>$InpUP#ze{(8z?(fw*cnyJ=`FmuS@> z0ZeQFRAwB>AKkc!=gnokL@jYLUZN+_;&IDt*!BE0^_A%`Ik@SX)Xh=Xh3fBw2|zs< zBb2Y%f41PlI_by#xmQ5+l&x0;08c$vA+-zKBNzdw?y1u(raJ$#Sr7Z88QexUG@hpj z*%)LA;Luy1(}0ov%H_l>ENnpSl0x|JH%XDfXu|kx8OSjICzk%7VQ1>?5de%$0$@LM01-VHpBoLJ#L@j9H^5V&R(KSDEGEKwhu!?U<@is2m#4`|Ne_0Z(d}{=UYuIw z&mV+(Dg!LVJQ`2rpA9dH0u@TY`vst@GeKCW4{qkOvU+e7fF%zmCJVRxv;Ln1B~kQK zZUOFe`9}nqdesNa2Uo~$b2wcgl^>WVdCC09#>edeTnfLkI!wB1~{`@ zGtz$a9cX`6k>O$aE0vibvHo5DAF$?=6kD0H+jPU)y5&AMXOVzdLW)&(jF}&m1@j0iCz_o-&K* z@sEKWUfRK1-E3IUAmjs`Zak1u>vBp9%-|;gD}q+kjQlH0#O1`{#6l3KNgt2b8__jL($@y|=jdRCnbkfPeECOZ<>+`kvJD;N9sb14HX&-@hG(i)p)4 zae4>9>Z8TYK(0steq12m*;L~1mJ)^oJJ$~_Tq)#n*-)ln8(q(lfL88)a3pDzDOXow zYx;sjb)h^iSFwV8uy_%J4kR;(Q5I2w7Xd5ayZH8ruCDHbCkYlI=Vt#PRABCwiuA8~ zK!tqDvKWYcOy2ab0W2kjBII+@w`OP3YyN(5xV*Tq;HA^xU;r4n6HTr)ORZJvuhEJK zy+OkWnbEJWdLdEnRL=?dE()9i9)x>a7%25ZGk(u86MO=K2a-H9fdWtfugl(wMboJv z0XREW%55qK&2aIbQ9(TDT8L8eg2zt|nqV)ku1MeaMEB74*D?wS2mqcm#@X2!5W+&G zC99cQ)XSq)HXx}H7~WkWcpcHcj3YbjV4p>1kaoO)0?OzJ55;-yN+OtDF++4?x~9Y? zZMxCf_Bl4QAk77^h*7|COviXY8Q^QTO-@d7 zY4!uzYwZEP-4nXR!H=v-Kx{G%I=(!Bp@D_=Wzeejx>x)190$Tfd`Jd(iU7YHip%j~ z0leWAIow}&uN7Gsh`j);iK+PiB!$?9ERE)v=#>kUgH121!;ZS$-V6>7>$_GE8d=}n zIMb__3Sv}5Tr0uZoHSx%P{}8Gxjg{nx5tVg`zaor{IL+P8))_Oo4cK%vXT^Fu)GO2 z%2`thN@_lg!UHF*3ux2_H}v#Zx$yv@*oa|&O0Y4xktTC zyhKL);tJIh={?lHTXzxLo7ZuVI)R}2*ErpAU2kLOE4c*rj9 zR+~?X#uIscd5~U-2kG?;?HGZLqLd2+m|WVRTd=H9)W>yU=E(!_9>AgIbH8Hev)8)% zvy0R@fby%^+Kg!fZp}l0eIpB{9zTF&AxCpu2kz->YWGJagPN0IyziBS{R8GHV1l8P*38^p&i4pF{Q2M_&a`;y1;zgH5`eEp0wD}? zISbOG|Bf>P%NyuA65F+3MlqMNH62=`lPrwKgRzV{JV&1>$dFke+-AvTVr6O6oZ0~W zS(Kz$1Rj`B!S7;Vw4{48V&7AaPh*)4goAX#UN9tF>G6PVwu4*YA5H#ePt1o2R_>Pw zfB0uZ5bvPs!)ODy;Y&@;OUwD@B3*2tf8w6Vq~G7}d-|hwmTqnUPtS*64grs-Zu}uT zz!z7A0g?mJVgD~V(EQ=w(B(Z*C?&SnI>Xf90aWy=o{U z*cHC-+NIX8UNtkd@BN}=ATwr>EQqsZYR1(5fTh-2li;cxpA*X}UsvWbWP7wfzCECu z%lYUX1MQE@I(}dA#&0~bA*#K(1a%{t>YgjytSK@UUQ>J@)_)!TI+uG;YqcK@N;CCQ zx5d0luGx(HTl@OtG@yw8e2@FMB{`# z&@LND74bv*=DODzgcS%#K#|t#cCp=ILc?CcbKrS-A#e=h7I+|#l_WQ7V6cU0i>3c?<|n7ce)GwAv) z<+OK>afu(<%ISg8=zLBnwcPcjVEK92+g4AzqszKr!e7r92d;QT(`Az^-B!9PxsYs~ zi-PM)`CGDClZ=w$mf6dqyPQ8skDn_Pj9g%=q@)dtWD>QRlI8IU85q#aa>>od^8Yd% zO@*N83$yhiMt7E_<`aR?$tX&Ct3Z@e(1n$@$8d(|;gDhG~;lFgWm z@CUfen9MbG`#UlQay!34T`iTj1&nMB_Lxf89_DPVvaTJOoyPMd6!fa-hO&)|n|x2q z?@+m~bemF~XJQBq-e-igJ$<~Zu}l;qlDwM z;lNo@FK9e7TMgRua2~ze{_BTsrN*)1!yy%c;A4|@5{nU)*?IKbs*+KIy`<&K%szs1 zy~LJ0Mdvc;1!K`W0;j8AM7aZc?M;4RgN+)tcKbt+JGH9hCnyWgDg=ywwa#d;9c@1UVtfsl- zJPDIZ-^9hL@ftT)a`Bg&44~gM9C5>2352&n_4VAw5m`?iqh@^f_nn_|5bTyuMiKCE zQ43>qcsM42HBPo=4^tW;*Yju75Tje77@yQXQJ1R%DodQ4%ikm5!l`c{0hwLURa?{d|g?l zY_EaMkPQCv{2>x+M*zkJnTd_$7N}nDCs33MNnQbl;`-8Z#u(PISbk6R$x${@xVBC) zbjF<1%=Yg#W^=8wa0IT2s5Kg~ZFq9Ne=U|n6(}Ce6;1ew-09uya{S^pm$CDkSxuQm zw>-!#eR;d9G#V!CRaBYCZuwjxtU#UbeKhrvC&mG4CBd7Wnhj1AhqF-i#&>XULE=hC z;^?^H)w=^h`gj4DiiA}WUB4B97Lj2{p#>_kg|%C#-8-IuD>*HLl?@hwx|hR^z#fV^ zJa~AMB~Nf#9`ep#nT;@9&WZeweFDkE+??SMj7P|3FX3SMoKFc=*ONqwuH;w@dMZ-~ zeTb%4fT_nYHZ5ZHEq$jFMl@YpX%qu1t6PsswqDc){;$*dBUIudNS}60PHJ5CJG*Z; zE^USCi-hmpK|wj8=2<3Ma@pUpy1BbUUd(z5tC5;VL0+AF-#Cm~;I1QF>JCLU=q4e+ zf)d8_jUfktyYqk>;A-_ATx2hrJbpH&m%H%J@~Y7I4>QxILG}16@^I zko4{P^73|JEW6H1%!_*jq`v&MHHMdq!WyWLTQGk}s)ur4jrXVKB-M<4J1$t75BtpQ zb{u|x;m*uitouc41lOPSK2b6H6G(kFst=VF8JiYrH@)zIKB*Zq=y}L@5p~M9?jDv|?+$W) z`ogvU-6}E1&H2T(>&4~>6+XW;w8zTE>F%^6m+c*?Zj;CDEvCdUu9KSIe8)95r=1D8 z81YKST&V%%i-E)dxmjsa`R6unbZ;?XXFShvv8)8D0?R)834ISFRNd9pD03owQ=&^i zSWoW$um>dly8+pi#7yJ_9iB2Y3 z>;%%rU=LX z<9-5Vv90nuXDczxaIHjWkx%0_yTX`NF&Q7m&BY-+y-|FN_%~vI9fh;Kt$nvBirbD z|I{a!sWWBS^1%H9Bh*wmL#-mgdun97Gw=qj2s(4TmBeH)&6{7UeewAN@_nT*3MSXF zSZphrrd@7dTs}S|qu5!oP`{aZGwS{rOERL0n3Ewsgq?k_arJ}2emwLmN$xi&BC-<9UJY+%wi55Jk1PvXZ3`S&9l#VtPoOSpjMEvOnZT zesR5-Z7V0q0}>+hWxc^=1YRxI-Z-($yxR#xFS2Wz$Yh};+Wz`T>YeLPEQE8t4(I*c zAJIG{Q*l2(4Nne##fRD7NvK~Ytxh`jo-c6xXe}F>UUf|RK7*+RPqS^VH_WhOQ>&Jx zt~qe2-1b~omFv}sr_T(M)KImGQS^^UO}eAe!-uP0sxH`zUFU>>8{Z-w2m4PH(vJ4v z70K9TTY`VWzJPcL2!~DfJ7QQK%wuFKOv+pAzl`w?Xd>Dg$u^X5 zqS`q7J=HUGbk7_|{%>OI6M zYW4-%mjEK{O-)3tL$4am?CI?Wza@XH)npiSOrYV}e)7kyNSG<)d*xIL;>Pu_c$&BT znAV2f?Z1Qw1`9P!W%bIQ9gpoQIlBa>hWY+}V;#5iRiF}KI9ob&%_pbzdauKa=j3V5 zBKBwM`3CbH^iD2x|vp&4fbnp2y*)8tS@OhWdM4s4|*K~M$#*!Gn89`_i z$U<*3U-|K~;wzUKiKfGLm|s{bR7UO3WCpe^)e?*i^i&MJxDsbli>(r@qx@JVOlqsy z4>2D{u92J~n7>$(T(@O*n@luQ@w;7^9D2ydlj87HefW&p;Rj>O9`SOzvCcNaFBo1l z-pYMka3o{1EJOLHKH{(SLmAm=XSh31GeGC5Ze(-r9QdLFnONgS{p(yK%5bi%e;3>N z;*Y9p%EaW#J_7U_UBM3Fer#m{0n4E!(U?QtHeSEe^3C9vcRVZJ$o1=I-1oX|3mmzM ztTME+mP#lA%il#uG_I}B)(qW;1PvTs=(MuX81=E=;-gbnB>j{8MCpP3!C(IxTIJys zz&o6b*=*`vC7u2pTHdAJdi2{`H4S4`=Ynj@3t!>m#1*A=TV&_u=ySGTW=ZHZQf)j7 zsdQY+%V85knQ1l-cqeqJDbky$l`5mLTgwG4rD8U1_s@1rRX8s0T?;QN`CMrW=;88shBo6Br%9N0 zdv!*P?+awi-LSpGOo0xO{Pye3I$5<&cNGlNVl*G)6o!-^yoQ|N{O9Q3!J{lnl0?Tx zK01*T*qRh%+QSq|?vQ@e*X0>> z4LRc}KgQtz$5L-(lqHKIQ-zmQV#|Jy*FWFE+|EZ{?nQr$KEly94lNV#{Aa1}+Q-Ag zX=>49efr?_;bq5zHYne21kE%q=U!xG6N5B)LLd9E`EBG6p?iF;1%>yoh+4#JltN7e zkFm5(mlGhAjb*_h6vHPi@|ksBw+rUC;Q>McZj*gyRg+#)KO)+mra11=1nneY5Dur4 ztd&d$?E3XnZ||nt=~lnCRP8>FD`C-}Lfa8=7Sga)qe(%A)EXD5G*MKoZ|G*o#-H=t zf{3J&_XnggeUol+e@r&$7ZwvC9qWu891`Nc^cv6y^qQW=5shbdsv#gn#oa(w4|*P6 zA@2XKQQ>y2d|yhcGj`X)ufMghjUarIrD*FMST5_|yMae6rEj-A%&BC~ZP?eO zJa2t8S{wzv@#9sTl`RsVjZ-h)848S^ON;4*zw&8P%wHX`RckEuI=DVK+h%ilyDO=sRDJEV`^$kgmhl(I2GAz>_ZgEyH9ai;#17CMZJL zXt7JqDoZ92+MVa-%M}M*LA{m(o|pC{t6~B&5+N^KO;cj2^Ef}fW*w4*LaMKij^^{- zS)5gA4564Vi?$ahws)Go=Z(Bs5`KcW4I=V!+cle^gu7b$cjX*EA}GkZo^ScaY}e>t zUiE!!a1x_g-+oizZ*=-0zno~Jo{0Gan!_G%@b>_;3=c$+7Oq2nnnIYc_&}Nt7-G8J zw}sR7bkZ*v(_Zj!-5%L1RBm#^2IYqMR`?`Odf3h_{Ahv+D>WJAQK8ZLbVXQx-{11m zvV-QOqf+7henF1YOCJx3j!wF97N;GRUxd6E&NlCEX*~m4z=cW zvmR{*>~yh&c=8eNkA2qj!r2%SBFddw=W{=v?yXQ2T$S*(Q&-who_M{zz~=Y}#~(6unuvGiSY6-CiuN>w5An0a9^umWt~r<;8M!(y5~K>6hR4;XgpD&*()C zCqq_X47u55pK()}|Jpa^KA*B*6ZUX@LB^uJXgI29_w#CrrRWWeGeT93n<`1?%UBy_ zJJ`~SI^8C792)L32z9$rZ#PO9Y4f>g&T3LyLY`fhkcNq%GEA#=J5VGITA#_DY|XA0 zu>W&PAVf@$3OiTwQTMwq_epF+TR!YPpKv%NsUG&* zlvTgu_Dm&=&Rjy&&{IjZM|&wH#gq5eh25d5Q?J`H^SoY$mWZyq2CYd7nMWatD^_Xk zT-OoDSn6^*G5W$c3C)m)=1RjLB{8~ZGqQ_hJ9r~cItU`?U27Me{D6U!2Uql_-hZ5$CgL6@_gc?X%i}!GQi`l$_)yX{78$+KU>ea8okX1Q_2~?ii@?5i zyLVxaK>A)ITRxGHL7%fTYU_QUM9?w_?4bj>@Gw^2`;Sq+|MXQ|=!94K+=Yh1Dd>}_ zbxQRA(R3C}adl1C4(`t-JDPmd+j?FhOb!ob_ znRSC!Xf=@3+*YsFuluxLu@n$e5N_W3wpp9!Ng!z7SVygxMTs=sWix!7WxyDFZT>4X zs1hxaIyx?+5RElcHO=-1MxB_VDDsN}T6s^_vwohq-zBB!j8&n-eI%`?f>zG*@mJTX zyrfct+Vo?|=)>uF!A?QFdLa4vDG#qa;Iw+ZL*3&k3hxt(UU%t~51CN!kPq!&qX8xz zCaKT@BdM&=<_{p#fF{d2Nd9-8Qf-0mUc{^S4y8n0)3 z-#`C8XTKFQ4cUtpZ4nzyw~JR+CqL=6AWoyl94|BFkQM=N+HO8g=ZmY(w+Xo2G2oy{ zJ+#?Af(%iarDL$3YAkmoWVNZ!Xen#lF7#V=Ct?dC(4vNiemX)h$Fc>p8_t&{GT$6- z3sk;TZ#+M}cY0yyKAeVS*;<_ndK3ThJ%KKEv1GU1B{y|)6{~0QNxA-m(r(Zix-L3w zw6q*Ur@V*@eg)-A53ft5a1a$Dlw8Ir885g?d z-*-Bk+>`9mnB9#!Ds)2fji8 z81)dp{t$guTj`gtyTbZVUV85ilxr6fjThEL=PFSjR7(|cT-ql?a$_@hxDa`o%wju-yWVfoA>-N~B1v?INcaK|52`Y@&U+AO%lwjV+_cY;qqtEb zv#oJWU*qE?^KCmZTt$VTT1-~m! zaz;CQA@6|o6z3imZ2{E6kYL;brUT#llqS5wH+{}Hm7)6WF51SyzOzbx4^{f*la_Df zxYP9$w2^6d#dc-4Z)q3XJUV(c@>m$1CFi;YpY6U{3zL3kjw)m~mB~UZwtzC)*kc9n zmB)H8FyL$K*Y|-^4ob0yzqkMU?HDnnYc%27n3F>|?;}X_oSwfx_W6ETi8lz1xy-c3 zwRy#&c{6?tcNV{staCtGvHzy4@Tw>$Bs~v=`+wEuhbJDz-UC6M%7rdXv6a{IR8+%f zlOBnM!Ro*YUNQye`1*}+-1e(>QhvGuWI~ePb!MldL?dCXuB6C@w-DZ|=g_r$e1~yD z;RN(;jE#cIn{F`jtIG3rJ}W1Hy0bfds{z^#Em|%=>&PNb9$p*il7{t;61UIF@mhS} z+D2U>{-;-ySA4E{9m3YAlYz>ZuZ;^(%^5BC`3yt>j}NaKMv@26BbL^ibRQu$Ps8VJ0UL}!wYmDM#R~W(WhzaE zx~`9KY}4;+naM+Fqn=s9HjSh)6^@X-l(J)wGDpjGmkY$tHUVA7w?F6XHm;}2&L3;@ z=*4e;s;slpmSwxn7TcLJgZrZ3LWaqdeN3ag08IrKKc|#Z&;0K7dFU)Wlmk*mP%?JK zT>3(A*UY4(eIkcmP|SAW{GS?#w(!1{W-`NlO@MnkFOU11my@OAt##q5c*hUF)$qGw zm2+`G+*Re!?WYf>a>>NKLRG^jEO|k-v_G!IQPQJ&U!9%iXm_ghEU^t0@`=ls?G}Em zQdH#C*6wWQ)O@WPpLJKIi7rgu_De|N*DbxFL}vZLh9=LMk(SN{zrVTRvBVVu-`qRq z+LUwf6UAQWHSAh@1UX~BfLeP&GZzk3zlNRW`Q743Kh6L_k6$MfW^xdXGm2D)R8=yY zU%v*@ja)Ll)4Y2D)*E}A4@5Qey#>$74bZ&hGjj(Cv#X=rK)S2ipHr&9diSFa`x68Z zSD*eI!F2ajwonL5Vo>t=y`8(kfOe+T;W#><;hIf;1=kXlx zc?f6A6pWAE60R7Vs&VqE4^#(LL+N&tDY*2ETVbE^yt0`>y)MI7%*-q|0+_nEm*i5n zmNJiozJ!(C@96|qK5Ji9r5StFmkL}+8U3xY6F0LIvfI)z3z$khWWtSVAz!G@s*Om# zh$&AM>(=OIAoV!EsLDTJbCaSikjaK+woVcD>?}v*^(N2-K+mnwh;qSG#F&xr0enWtoZtWVF~N&4L(f)uC2e? z(!xFIa+T|`s`;0RNB;%wEDWBz+>qi-fljTkYqZGy`|fL({Fj+P?ACzGP4V#l zKN|3~{O|ZYXs)HI-|ZXyGU?(%6`!%&-_a+E$<#usTI;taj%G?AUNI$YDzk4JZXV%6 z)VzH%XZq?+B?lueKQ$N%FUqD0)u$P|z{$oLibXbVni{M8FX}%aV|MlTfB8+uTLIQ| zY5l1==I%DVJkoO5v`R<)Vc!cXobBx zO6O{BE8^}ptU16mxW?FBxqUnI;QG{3$#Ykuu;Spr&Dmr#3)N<=Yi&~U4AHRgB|EC? zP>Tgcu-H!p@S$!wfwGLF`No{K27n8-QG2~W3+EV0zOBr_&Kf83B_o&-9`GYc#-*>fiY$3O3r5Imy>zL{+g7T2GT&r8`ib<{Ca1oS=5e(|n>tN8~vY7HZGFWV#no>v;oTt_#*k=uEf zN)E132_`Na*wq!b|4-;6h0XI(G@@tx&%xC5@INDCK{)WKINVZEODg~j$}`PHN^!}hi;cU_&mBitxPy<)(*n;it-Pue}TmVH|M&(wi?zjHKGP@y?_T`?kN&WvK zwQajp4$CGa3`o^BXg$Bv9j5b=7m7N1T^`U~6*y;P=MA!J>rqqCw9sn%TO<4Uc&aXN76K zzGTR>KV+R*%{~2T&cFelB_E?KB=n!yOMg3Y^k5o5;agRQNE8Ry5XAMhE!C-D4XgBM zkKSBlKD(hmpc+>-k$Y}ICf4mX@a_uRa_Lu}i_FGJMYAkD!fw8`BNemUTh~)Y9qp2o!-w@xsAlDxPv;c--4DyqQ*b%p#m*k+Wae7~9MLn)}mLCEG2^EFvbPm#d zQ+K7YKC3H07fu}9;7FrAd}H)otMYWjxzBPMuDxj(4-WR26HW}_A@hJT+^VtD>iX54 z7uE{7EJI2)-7-na?=DEIUW{|+J!M-&rEwC9`V7!n8HP+|(dw9%I^~Gu~(~mTj=e zGoWU%!DO!s@p`={MjoKCbnyGTWgX%njNvfj+k|xaCdo-Xuh~LOfb-hb=l1$FS^~DH z*ZZ$^{(WlVUq{i9mFKkAGy@;6T!0i93fY~AxU#sSU8_q$Ox`C=tnN^T=fPW03Y#7j zfo@7JZMKhI~W~u#zZ{7+tj8 z^_rx2w&@A5YHNP+=$2c9_hL;ce4VXeQicrnhkBB^bJpweLPWlzN)vOXTwn-xeAz(ip zX!eejM_Ve9c?AxS$}F|alccdWTM3R7+9wdir=ECi>XWS~~3 zN>5LpQli-GZ-d$%ikw1q(s24ygI9pkGAltbA(rM^=|U2$9hW(2ytnZsqX*}uszrO! zG6LsC!5(|M*xV?pO>Eq9UOFO&&08oWXsm{dSYg7tJ~u&Ux++Qw1#5^*daT{i9eHW= z^4C~ozR)_b?6jlXaOVj2>Skr>Zl*|NIP*ilGKi`jh3;`{%GC9jQyei~M#_9>&JgKD zQHW)Acaf4)=))oAxhSp<{#^9Q-&a4NUp^s5P#5FD-lOH<2`>l!IjS%06cQ?7Qx&+{ zMpZ@LYgVif>QGX3J$Agj8;U}M`Gtb}iuJ(gct&>XUUrzkM1MOvf%ae7s!0r`rw>eo zbwtbT(CKn_ga%n(f%Wlgj7Z&z7L25209!V#lV-evZX`i@Z4K5e$rRS^Cg%sdwOv~7 zjvl_f7_kCWh4o)p4TzZf9y`7dZjT%%E6`ji{Kgj}>hD8-iXTz^=!rr;Wz%rRA;@gH zv$f@S$ta0jXN2==_e?4AbA2{7JDYk#XEri`W0IH71-sXE2Zrtvr{O+#lx$nPG-9RU z-oX^T7XpOb4?Z~`TlWFp@4R9LF|X-+8UzJ1=9PX~9qq@~nhf?N6^9POIeSn;&;gql zAJK>WHq5R$HW7W1*`dsvzuU8!$J1Urp~7N88h~e;yQw}GZc7#4R&(C-`~<%+YSZ7< z(wU33wf1i+gSp*N73=Njgc0vlw7olzEYz~sW>5y>_QxgF_HRu;#eg#~zi0UK5Sck# z>=&T35KuJ-v%A?|H46SQ10aXNVQ;h^2&FCh@1nB(VTXAdhCR-27!ZRa>?b0QGm^P3 z?Q`pxizy_-&#?H-Z!c52x6JOFGUi|`E_P#iGRg?}X3|CcCBnQ^?W}0mWu?Xt?2CAh z+4=90!UyJ>5Frm6cft9iy3#Y|Mtt7+PM}J)K({X-WydoDxX*XJbmDf*_lA2GJ{Rn9 zyp!}D2E{qIIm7ESfeMY-ca>E)>aG_dM%33co%h9E7+LK13ocsUS%CBCpXX|G23&m$ zwmaV(2(A&g^HA4Q0tKZ`PNyVv|IH0ajeatTrmzqwb%5$qb8^D zB+lllYSc^Tv#Ez7c(<1zUn4dyb*LOXyp^ykOJ4j_<+LCR+xcEEHwzCh1r+QFmj!Jm zD0=(j)P!6%L(JkQLz2q-iO2m?oCpb_fmHCpWY{a&;b7c8mGg16Uz`UI6pHE_4y6ty zV4Zyv48Agb5>88gs#paYz%seL>C?B(mx;~IM!3o+gA)KR@aoF#VlAkuM72q4sJr1j zbh!)40)BQ{#K;WQ1^@F5f7U^SeLq01)F~wWpF$lNA#!^-jj39^_*FBy^7fMRnrSq3zW zSruLNIY+(-(S-={hnw-q-W_}?u4J0n5c&wmD4HEDoBBOPI}T)Y*uV3Wi1d9iEy9g2 z>p5W6-F{e@8DIl@!qjPf1QGwMgE4550NS}~d=e%vuJxJsqn~8`!tGqF(!dKw$`35K zg-q>yQ(a~c5DH*H*GpTB!*4#zn$xomi^(tjJn@8F(07>JaG= zNmIqY-b81AIrG;gAk>};!7$DM6IXfF-)afm+r5Ttj5N8$o2O3L`qt(YxSC#)O!_5^H}$=i?--f-34lLYrP@N#}I-H_<5S zGioE7bnsWlh;VKHy(%l4-s^4V~482t@fBZALEG?$|&b^jh+hbHbss64>Xg zEY-*wC4yW<8cLMm8^>@|#$MY8ra{g6JU$5`TW?WA&Qch&mudyhGRlAox)@hCS)K69b-kns`}N2DJ1Y_pGD_&c_>Iv44L<2{Vq zN3?oleK>y(7mu>6@NT3gAU;co<-LYTKh?1|a0VSpz7?xA>W<}Uw6sl3M>eWkBhoP3 zaT;WdDOsm5tooLgr=J&IVp&7)&dP)|1q2eh`>M5SjG3SRvG~U$GZto@&TLPdqczBe zG4YOG*+_2x1#Z39XYzVMv9zKBPQn!NapW0#52HvtyQ%ekitinTl5DQ{Cke;j5n2-J-kT@$ zJF%Cc-u%XuO&pU|!y-}88UEI4Lxq13rEjNUMcmZIMPxqu2xeOzE>AqB$kjGoCW-g6 zygI6mMJ!gC5}V?yXkPDc83iY9BXp0VY$GE$M#g3g)T+D^k93&Mg==h``OhS0Bc33V zJC3thw5zWAhV)KQiR$(bSueR;`iy@M#81$MMzW_cnreSf@h(se(LLnTQM%4&1@ZNV zX-3$0DKf}OcRY`YRFTjqikq2^gmit{|NR&exhCuB;}Y0uj>lleR&Z2@f4+9#Br{~6 za{0kTph_FO#@zqd{VTeR65BwiA<6&9`CA&e%>89)tZOT}Grj%+IU4s_03A=K<}vD; z=Xa~Yq^M{fy0K)J&EAyS*N`wfj_F7WD`0n|lzo8!SSE_7!#N1|rh~U<7@LRmN51Jl z%^@{`SMP}~L@vI4qny(TxhT{QUCKYUSj-W}G0+>u)d`^IiCKaA2fZPF4xM9}*fec? zS=Zy$ns`+a0%xc$H{+q#xiGoSaYmh%6wQ5FJ$f*0mts#{j2+=8uT|NvwGaQ)0 zuqH-~ey%MOQ7|1N{mzGy?d%QK(bXZjy4CsenEZ7eJo3^xbE7Ee-nP*jJ}@1KgYDmn zrte1k_z})$TJEP=k^+dTjYUFkBTYanJ122INLs0zYdonZh{C14ZzPCzapgGRuC282EQ zEKp1%9Q;{F{|!R?o}n*)xQd!LV&*%nlttI8_IhD>e{I`~`t0Tl#Iaq+TN|FDY6Dd? zM3HwbmpUAUVvq{mg>lXe&XVW}*`213VO|ob81k?9EICzQ(6VZ1S?Pk(`d9TAhUWej zDy#2(cI$oqc_?6o{w${x40)`IH#e%q&xIDP9=@B+Ffj(4DcM;WX*T2YjfQxlpPlK7 z+HIHw7MZ8z{#Pc}ud!%lIbvO>i=LM_ShV3`$)i||w1Yajjw4phdK69$9jt2F|I=i4E~opED(4ipqX>d!rG~RTUA^>9cjKbkvLcrbbUOR4L3w zrb~H05xKoaaSS2{k{sx_c%yL+zZ=!5+VrltJ;G8`u6yjabj#0gUPR2(%fgHLbd>Kx zFtqNEk4P%i^{-?-Xa#lBkj%@)3`-!w*yyi~tsS*?utAqv$6W^-`%85SoqEG3QbAwj z{d*o-8@_Ij1^whA$AMxvdRIWXw9?!B^;JR^nw$L!@!B$%D!StV^P4W;@!8Wb{w!@9 zc@YxfYJPr~lnC$9!OyQym=uULH)~j2lBXLYtP@)sacmc_y4cCo!vjnm@z?&os*NE8 z%)+eR7Exrx!zk3wsTDu!pShJwUH-O5>~<~0zdqvw7H7Yl+zK%&7@nH*%+gw)XB}J^ zE{4`0YV_9ln~6>VeWXXnHP)&}BmG8n`UB@tJXwH)wo(NeLSEZ#-6fer_vNYB6(egh z3MRB%PH;D8iffJu$$JMW*Q;qb*A*@-*?hQs1!%7j#NVXBsPegK-R%Cg95z=fUErdX z0Fm+|EH}KykA*S&xCq^~IhLhkkD1ahS^;{&5D$XSDz>&QcG92+rQ8<~%tz)ueB5AW z^r8cL(=5;x(Eix-%d}t(O%6&e=J+j}{dmQskawKkDQ~bG1yMRdpH zV>BNtRMAF5$zzONSDFe~!hpH>RPw|2W)(nXMX4{gX+5^|CEz;1utSS24nU(YQw6<0 z1KbJ;Oc28ujA9zKkQ~b4E=~vpgt=3Y^I`!WlpK~*1R&SQ&mNfJ0FN*hDoA)MAUyb! zYARbJvg%k3r7$}Ey|$6(S+DG`-CBsN)ju=Be1J`*rEX6UMORO;#7xO5iRD{7E}L-8 zJ;P2g`#@*+YeDrGcx?7w{7gMPrAl`6xNCPe|B^smW6;vz^;)3b*Okj)J5)m!%qZC= zSIJT4X+GC|bXT|2Txdtf^08}J-c@i6|VSN zJdwL$HwZVI=_7-?M*=^QYu_QLWx#q<^wqIZ9pv0#9awqqQM-5QpJQ-&cXzoh&ZD!L z-Uf~W#CPon18Y!KFt2g_{YiCWU-#1J0-C@GrUm|$@*H~>O*E#uPYc(Bwa!UotYA@4n2ZKqf2Zo~puH0k2Dx4|1Z2(PhKebE7D z(=`|FX5Xhg(g8qkFhHi&V81yaTpYP_dM$%-xQdhB{tECmZ9ir_@seK;S=(?>R$2B2 z*WboK_!|ilCovs|8re<<*vx?=?Ezgww>Z$mz*1WU9vVHx(O16N11M%+w(9phKUc=# zt}G%AZguKKN4@4Ra^(%~Vs2bi^BiDS9GkS@ktL zp1RR~7pdpQp0XOzq!`H*3J$N%N`i7>rV-!@|1KP)ISh!2s2<`mZsx%&MHBDUv5~}m z>HOB9BJli6*KIEEZ;`a1lc%m|)=9NuY>84G-PrVx@8#z(b77VJCvzpiV*~wQm1Z4r zIfI($^LDyN>t!w6VxOxi41iBo1(*F|6#@s2X>qpl-{fU88t$7nykC=1;;NGQuH{oB z>Sb*V<6OL&_NxWoW=o&{^{uTmiNx%a;DlhzJhOcWUJ!4(1|2`7Eq4XCfC?jVlt3>S zWZ2d3-x*AXBCJqZub3%(w>GR&vEPa z*v|=8d!`;{NxT3SXhicoAOWYAelk}@gKKmj@yE#WdN8ld% z^cslI%AdRU6FLh()@yJkLq{V39G-M~b z>RdsdIF;*rdGY)7LN&%h?qJZ{E>81&!OzG#ZZy83tfji}YnWUxt?a8^ zQTpY-pGRSkiJBG>GzuQez&cz$TW*_b30h2++)uB|$ciNsa%Miqxo(Set6dsxxLPb; z(Mb0(Xnj!Fi7~0Kvx4#y?d=!kX=*B<4wBGJk;UHARwBLiqLUB|{oc|KVe0F2rl%#3 zRFY}9qmb4v)(yY!v;2<9CI$*Oxy<>eOlf%hfr*l0?K|RQz8c9ZSVH^M{qdcL`pcM; z5qA6VF+r7EF((-G^ZU!j6^ns_^jjmW>d}ld=!4X7ysWd{QI{;S@y1n+{X53MUIFt- z6=_+Nql8vvK_q(s?J{2vtBvQ@Q-}LSNL#4f8TItRT;JPQuRNtBA&Z%!7yxc=+*IuS zBTxk-@_Lxdp0hB3?Xxr^sT~CT)uf8d?bFHQLq;bw*Fc|CZqXD8H1mR1ISf;KHRz%| zdH+bB<4=2wt3VO-KJNuRK6COdhL$K)Me*JL7S7mv8eb5@6np5171pOoe|pYtYGi0d zccrYjy0N~>bu{gU*R)@w$iB63C<*}-Q9dPXzic9nH4q__ac~yDJ>1o;T;k?r+etiDbQsuWk)BLj0yPx9mAM81^NY_b~ z?#6FSBy&EB55=_*>l_CrjV7V@=$F)QivMZakG#=9$ei>lAJf_tPf z9QQVPT4%SqyK?4po};A#*1hVzU!Ngl(m)ny=F9iR3sX6EzABiE@=98-%q9%)Ic|Ue z#)+^et(k6!Y>i1Yey~N$TfDBJr?Rilp0s28*H%~gmJ1Tsly}qJetyg{vH!D31oJ@$ zG$I?VXF{+q5D`tp5LV04`jqLbLu@>#)>x2C`x-%WJ0Y;Kgy0#+gr?Im>y;zt;MYQN zePQ@eZgm`n-Qp&~<_UtAZ_QT?CnCl-=Ej6fSENhY7OX$69BgZG^hoscMaP@GLoyq* zLn$QpzH#2=9H5n5$GzH@uKUKWdT5XvMLKr2qU=%8*p-R^qke_BJCl)-LC-7`i}uW) z5a|oU6wX2^k3*_3P8|RY+FgDCy7dB7M^p!8HFImUI4sACQvMwu?xj2L7XQ+fA^XWYlu; zqg_MPM~=0hOtlXzG8Cz564F}gw7Gu*VwlWOW?a|!Q1_w&PcsV_p+@zIX# zA2&1|I63bmLm(HQ5e*Qv4zP6}`?Nf%AYTmd*>I5gMkgv*7&dVrLP3M=ng{dUJd~aU zdgfd3uuy1$VucuTX`!CfaT){yLJC!6y=kpL?M>O!4R`JJS?J&k<%5i%{g{uvD>B+g zzj+eP7A@81BtYM9iSRd{2*^_(e`>rp_ic1Y#lb>Bz(VWh6+WS6-hm>#lH^QGxBXA? z-Q`{j=iO=wjzML?&BX0%SDGujL1We|Z|)m;7RrC8^y&sa#9$Y(AX)BZzxnvSKFSAR zObESi`ac>v4_PiE;ArnzIgfqN7{gI+w7=G27)MU79?3_O`0hsY_<~(L_Ug;`yz5lD z-l@!PsVOJ4WSj4Rc+`y$f6sLs6rXzh(87?eB?&5b=$qpW8mrVCF~KA+VPzM=?|a;7 z`gB2PRSFeRY6B-MSnr=V*Y+`={1{&;7z81#l7LNe@?`$r@6y-*9sG0(@>F+#}pn493;Ofr??v-SvEJhE;2EAO_?B$M$B z1o0dJmgq(sKzsIx%xBV$D_A7UKXxG%^nddk^0&8kU5n4|`i4**t~Q_eah&7=BX={K z&8vEJJ%q9RfTi@q$vfLte5#=Z?HZtkWv1K8Bexvo4J0~MHaxywTg$6&9gZ)gk=z$y zKb^z!m8vEHH}JFx7s{^L?T#BrgUuHif>aW}Y$Mf1lhT=dgC5_OFj-j{*uw0ynH2C> zI^q5m%f>9PNp96{I4A8jO%eZKtt2mQ^{Vj&E3bOp;;75+N=9XvrOX&4h4g7t>mEkY z{N(+E!+5OF`E{)a-HR5jexlHOr-%nxy)>@#BsIt3U0@^T(+7NX7CXj=%|=kMFL)%^ zMj@JHmZ(%UqX?hR;gniJE+ZsLvzp2oo;H~_tjBiL$RRHnN$G!?ujg4)kZYAr_(?X; zw8!RU^*^_2eOOm&V$#8kcVHj10gRB5a{b->QXuhi>ckHP?-K%Ir$0occ#gYiM4f1V zJX0j0oDyF;`yQTWN$_ezGAB8}olz!EsFhiG^rKJ}^jAL5$kcJ>{#Y7^7t|!`4LcY#%T1mQ@gQU2qoX6b1 zo1tku@A`En{{W>tT8=)Q5BLcx+wRj7pK2d69;ls0H_c)3bWnx7O6j<}UmwH3+qOjl zcP&!!C;_Bby|60x3sYIhd*ektQ{x!ZMuqL$)76P<@NTc`oBqStHk2X4{J6fdcM-4> z{`LgcZT1yMZkyE!YYA*!y;o+N+9=-prhl+LrpS<7=ZOe8Tzhq*X+z!*?IsN+6?`SZ z20_+vkwa!2HY53M@M+q4z>Bs5sWOBUo=G#@~#(6v`XaKRLbr&#*|z!2Yc{f_dHg6 zan}Bz)T&HWGqVvP`m*&Dm3GMO!o;H26}mV3QMM-w2kCG=_)Lny;yTx&J?H^^8@5hd zuU=q8jTfqv4EUEV&UmvJ)@IOw2?T^4>$(iW~O^YG>UtaQf@z zF2#MfN@|gl@HnuXJx+C{Hue`T05L@5(eETu$w3APi4c<)Al8V-I~@9bKZBv~mAtql zr+J_%kikc}`>A3QwBmzWCNk=41(kV3(^M&;W%aaAhJc8naYf^D;)IHi^0D`Oc=j z=L~ZH-n&P#{ok@wBXC(3EcF*?dm03O^T2(ccpcj z=Giq|zk#eDu{7h_Pa(eox5$L>C%CPyIjNt^Sx+d9eWQUGYtx&vi8NDts9=Q?CAm}u-smkCS>th@ctlY znQLp+qv;_i-M-hb$yQmrxc34sVRZv)}aDAxt@`0@M6Of2j1DSyw3?b*sCzQ|Q% zi5Ie0)3E|-aDIL5z*ieH4Ga1FJ3@ zk4@s2AAf|+=}vBo3&??dd%h&3>u&0geRsNte7;Z}=c}4y_b+j;f3F`(BY8e(91qC8 zc_F>C>X&v585Et%Gf(keybb%7P4%^+J>VAe7s?mbu@`sO*3|jg!~sUOZ_V8NX_Y_K ziqWEYcV22qOzOr2*q*@seMokiltv*eu8lbKLC@?8*Di0O5KjyqNfoN0{BEG=j*PNk z>z)x){erdbhtY;g9B_n^nyVK@tiukb#`(iYz~f#HZGU$OMNHaRHiT8LEz&MX zvhOApW0|Wm%nO4w&+?#a?D=i3e1X^f6(?Je=hYRTDtGOoD0ax>LeO38SJ!t;%`|^% zAVU9}&r^n^NG9Mv#}dowMg=6h@R7Sy?6|o|pUi;eeie6P@X!{5nFLJa_8tE8Op3v3 z|0wJi@wF2^-*e{v(d5A*_TE~)Q0 zN&ig~)@9wc9{Sttv@oC|x!xT0V%uD@zt2yGwU zA>7K@xu^0-49*Hx4H6vqh&1r%8GO$hnjT;e>2(O>dy5G<@--HV3hZdO%!$aChrX-Y zym_RFOsLBS4G!Bl1rc4nV(7YQbf&SVd`4lsar^h9S0nFXYcRmWtD4f|RcplRWiLyl zoQH#Kua%Mm+!g)v^P>kMtgrQp$6I{rf8{-q@^b={bH8WgVp%rxTs!uHH<&}Aj89S} zSdrS3&^dAX3+a6GWU)Kj%`%NxmIqL3^c}hOaBD4d;+s24e-mNFW%NyfB4(O}3o=6F zy{C;5@0S=NL2@CF*Yt2ADu(Qi*XO-~lTmBxyftX$ym*2qpb;{8D(yhG0bSvD$L`w! zlG`;0?JLI{1(>E;JV?6&U$w&e2w$!CIEkz5i?CScd$iwqxKM`v{GlNUb!;Q~+FEe= zl~$X0#(4NN*Gf{n%Z5Oya7Rh6(*uEhbZjn@Eo8FCQdaH@ut711v%DBy#ze?F)ieSd zcHqWXR3LAbeJ}(x+6#D{Hr)zcOK-NLmDwGSotQP~ME%o=Wf@^rJP5S*RybLz`0~E) z_!;db7GvaFk=G4kzbu&e*?Te~SP{1G=Asv-uI$75P8k1hBMJO3`|3|}7lze1>-&Ev z5~m5g=9x4WG9fB%iBdN%MB}Aqs7T+BG`!9nJmfJB9KDsBiskLLSIyySN(V}3-$o@) ze(~TKp!!xRsrU-Lx0h7Vpz1H|3w}-bqRC!2{}H@cD`m7)cBSd@@qdP4xVq(smOc6T zSJDRZ&qS=2M#i@dd|K@u2nwfK*oIdh>f*wDKbUTr75$;ePCTk=1eSADm&$zilobcL zH_Bzu)q5gvwsxBJ*mQZZm5*&sl@$a(_GwP;msRgKp9TE}qDkj$e*bP~-HH1Jlq)J$ z{QXJty@Zr*@+8-2i^;NsRj5LRIy|O@J%5_>X+^~2Dfosq5?l37TGr*UVJSq z90siaV4%XN0he|W5B>f*p>_hEA&R@1b?MIk{LQ0^6`%d?t6-SQ@~yl5D(DPzBV=$t z^V7N3K45XXnnbau;#;4x6MDte4y>E-3<10@I^AlO#XqAUy577UOn9cPnH`aja~ycE zxSc0+a$fA6uM0Zw3px_sGV<^68;RjyEz5fH+u2YBd0XB~Hzs_JK>aVES^(W&@isxCurL5?^GV#XEK9RG(OFB&1lxaf1flJJ2e5qYq-fU?{CP`bbQ}Z&6{=n z{)^+BtOGOnS23C4(scWwMn4J30a>W_J=39fd&y#9&1(sUgne6hk=Plw?q~hNi)fcr z(r1DryYW^TSX6|7^i-mLf;mL9<_d=46o+hkaB2aqX>O9&nc@8|QA2eJgJ@?+~zJOYj+<&EAx z*susu(8?Y-i-cqhZ=iV(IcMxPY0*&-=U+~BRMETjQEoL^+U!&exuP0C^;$-KfTP*B zzg;Dp%IkJp=LbmnCx)lErVX%Mpp5+yE~KyBguy?0#J| z8Qbkg77D*Utwti#*?QvI6AXR)l~%NqvY8Biv&#On#DkS2)UQ8LryMw(IW{X$iwz$I zY}bsx(C(N7Z_)0iN`}lvF5tGR)z)jx`SS7RnV5|YGIt2}*do5p(}%u2o{L~E{Mdy2 za@$gl_j;%aU#=wRqV5RZLX@Yp)9IpygEK>BE$j;`(xcc7XfV-e6kt| z2fkk$Ec7&GhyQ|n|F+qE$YbXLGQ!(2NUipW{)OEBjeD_^!tk;6rd%%pjLDCtSB4jc zYIY7WJ+N*Nrp|iP530(#U!UxR;n~l%|;(Ex<)_M|Rw8e3NFAj!( zA(!%ld)ynIF6$#QRrg4;pT%&X<6u)_vl=BirW6^XRFLm;i=tC97F51?PrTq&7uO-2 zu-78!&W9d))9E7(hEl~Fe_Y|&yh{r@47)OXFNIevFivQ*i z4s;8@$}H3CrEMn^E4BpY`c@3dr&0XN$^wwX+joV84py=^MYNX;3sc@;Wr3Y_VB-_n zU<<;0`y6DBbmRp4ou0=?Fh8Zu;MpDfrM57Y)*0^DMgQ*Buy@wXd*o|!iqz1i@Y2n@ z7>PW2@Sc03W!V5&`oO>aJ=n7Nd&A@2!f(`nYs5BA&?%CuArc{vppa`hiTqbDc~cx3 zFupo{E2J?10*8(P8*a!2!*BocoVJ@n&I39~@KiCon;LqPBN30qK+#d;fY~5QS+%jW zFzFaS-SFjcx0u%|>CfANHWwt9=X3|;^oz>kN#DB;D)_ziUrax!Xk~5PN~sep8NpOBO6lQhPHWttK1ca|q73KWmK?r=}V0MEvirCpBPbWLS<=_pvHjO>rp zhClvzjP3~{GF;F@fE5N$a}FBJctm^-=zlr(BW{wh@{j{DqJ-Fj>DL*hj?Topk8&Rg zmXNqLXx@-^MC}+E5h{uG1$PS&CiBV+pPFry1f#uw!S0@romyITvMay$J|E!PC%;~ zig`u|-)Mc4b_}vsod;;M7ia~-tk;OFZCflwwGoa5A-s5N;7hE24709(y7*e6-&BBT zS6*7K5u(zk1s3?oh13ZJag0gh+W3U1z~d?X8`kNk-9QxPFB5v5@=A+rZ}B)0{_Ipe z`Zpn?IYQ3UGBr>Fy7LwIyq+qNimiER2)-nXy4CtoV16eq6zBaBibH!q<+?wi`dI&H z6?tgvAC{rxu`6XU|wPW(oV*Bh1ql22r9HyCc_#and9j~)xkL?nmJW3v9ckC5YP zy{325#P7@Tp&NRkMyCNy;ayJ2?y746zI?YwdNasZTAU$ejC;x{YiB-XmWP8wk5fmA zUGbZ5#ttG-GM6I9sy}dxcA8KKC;WW6xC?C62tBaMGvVPd&`P5!++RoA| ze*#)KZt}u)L#TH0uw7=$AP)q)-aum@Zr#^my}qC$voh@ey)VdL45Y5;!WMiNw!KR0 zl!fIGfF6<{Nz5b~drd=GPW$oEZNC{dr`bEpZzHuK65v!1REBfdWzLGUC=y>k;D})` zMk!G-;7emNL>I!MO3J|Pr9yUHu^cp;p7^Ty)#h+NM6SUsZEvv?xLa9$Z9ev0H}>Or zI|6;2HGh9%Ca2W{7B0>3<;5-xS3m8H^GsV^w8raMWJ zoriu~kN(Oc`YvFYe+RM9{I%VbYB*t6a`;=1@M3^NmliZuXYp=tS;RfgB}~LM^8@Pb zib+|Gc)V# zE}IOV(py!%niQ)KjbEEJ;N9{5Wies18na2RSQk4qVR_%L)#j0ZVNiVemS?|-RVsqWMF z?sL!DYpuOE;T-QxS!pwUgtS@470Xq9`4r(t_Um$~hx4LCSaBk7$-x7b?{YB;cy}l$Z6BO-9ci9S;qYPvM=9 zaBGd6+b;=(ytI0;87x{q}KuW;;}+mB{EQ;D?!boMkjwtc-maaEjZ>K zrsT7gOXTZFth3*Ei`JYd75%uP@A~igr*U&eyBj#i`|=-c>;26Zj=*#;UrfB=&x%Iw z+VKga-p$@y$pOUj#wh-Ve}*~u&r2LIrO^zh-PvlyjE)~+%U6uiydTf4u@ZTb(XG}< z#CP;&>jOxg`^Hr@9g6EsMfW+zrKH_+I-Cg}yko_#chnnHmVL*whk||>_WDJbgsE)R z<6t}na*5c=&2rk zBUF16>ET?o(J-AH61*m*YDH_mIoJ7N-fL;pK}21Zv2{eY<1j=XOrZSW$f8fX3MaSj zj-8eY>ZWGsKgX1)33{4=5~SGZGCpTYbP5WUX>k9Z=m|XdBTQEP5pm<3mz5yy&canmav^rsDn!*2)ESZgiO`=;sVk98PK9&!y206u!N6!5B|j zP7yueZJKuC?&hwGVhiXR=GqNS8um*LH`LYTAbnfJFu(^zMOv6A9Y-jn$w6nd z3=|s psEtV6a<%QM6(Ll4~Dd1gan%zfI#ED+227ACCkUUX}o{Z*Lb)d?x@5QHM@>bv- zyhMfAolrKx@8!tj^=>KkDG=T;NNu|QHw7ear^z#4HP8zCR4D&Dx#*!(fXEy*7F2Kl ze)=D12*Qy)Vf+b-k#4ranz{-~;o8pl#`yOBpda%pn||-8dmb;_k&1Z45xpUpb1(Nb zJE3*oE0Azp5(Ea~3CMKB?;8PePR%hv=8uIDEAAKYV&t2JKV1wsXnw>U693kDhS|%o88o{bzRW#Yl5YfElXrsKa(!AHf}q=4n6VsD3OH`ypD&#oIYhKh2!_gY}~iviZ7M zvYT&d#fKiNOR1k&E$+K7FUrkVMFXxBI6QC&$Wo^M%RSs{)wdBxH=4ll??9bO%oL~@6DF^|B1ru_)K{%|_ikYpqWJS{Qla3#q`H-G{icoN*-;a!9$1Qp*FdUAD zAyU6p0fh$(DHKG$^v+n#=!*Ls>QkP?HY4=-VoI`yxRG%d(ZhGi(P^4%FU@{f9jKLW zBcF(<`6lB#o#omLy%wsO|9fL$1gVLMe7RSJ*Q(F}ePSZqF?pZV5$92` zkb^DOZ>+^1(7gi#d;UEBKzxSrNd10ZRH+3IN%z}@C%;D>yefW8nn*^?yzTyZngx1` zxcCD^ll|ZPZQ@vbgghP^XD0O=)8Q|pzUa@p$TwG({lBXep|(8A5ZsT|7nMC^cD-M$ z1FDOi1Y^7t*ihP8D+>t_4waR?91UX>pOgCEX+4)kRB!W0)XLC!%I%#GSiBB_+ZUvV z;~f(!TRtO1{iiNLcnU57Xpdh$Z25}y|3a{K@VRm$Ep9N}NLTF^RTEzDXa(%BUJ68| zzMY;kJa|_=QnJjCGQ)vj z-pJ{A$ZWL*^ju}4zR)?JJGdNTN-6~G_awMq9#Eef9(a?>A0eu^O#S1V@en(Yq8q1l zfcdl5E0e>bR36`5hH8epfzB@65!5qgfu;1?jZnV`#R3p@pw;;3a3g?penTYW`yPmo zsJXpZCDUxb1h-c%^!<*hJ8W~$l6m_%6Vb7mKG3>2qCgD)gVhzMS})?@jGN;8FJcO_ zDnha}O0XaJB1%i!NY46O11R0h>2=O^ZyUPb?|Ius|6FauKEs*m<3>JN4-gur!u~5=V$**fnB75+kArMj42O9VljjYp%u=Q(L z8@;S=6h4nn=Ifm)_)!4JJ$CiAO z!%xl!cf8SKEsOu*H>7xxTj39OokqGGB08#2wmzjZxgiUV`|@vE@kHsVu$}S35vmkNrOC zyLvt(boHId^Az?mmp2#FmVaRXmLEmj3qrwdPA$48K5%nntJjY~6$A zH7-Xa9LPqaUxZgWqaQ3zJrns#J)!xC+2qfAf*(@sESK@b62WWdW`J2vrBo zND$iIK9u_XLDysF!;N2JmRwZNbZMdR7v|lROZHz(sonb- zv6YJF+AT-DE^o}iSJ(6rUrt#zV>nQ#`6m#6j~^UhAdup?!y37XzeAblfAP6d*mT=b z*7L*)-!yY|IJZXSYOLeCqzL~!{E*hWMIH=Pw@hUAK*4IA6gN2Wh%B{$ZJg!jCFoLI z_X{3htBZbp$_q7xZ`pDiCeg3L#u@qC`fQKnq`n*u42}a1F6C1QeGndNSHXE27k=(< zcuMY>;J3YUF#Tx@#~@NL=O&n<`jR7WNisY;h#%$mn_y1hDZwh#O?WZ3@Jf)E1WF)g z;KYZ_$gYEtFC4i{y_dJGk(L+DNmnQuXAHBrd+Hy;{0}6Gig+KFq138W{g=hhifu;% z*b!Xc@(a>wuTo&A$LIb2O>~G3pl>zo znw{wV=cT}H0n26GiH=T6ljW=Y?X6~LNNMfyK0Ng#;qy+wBb>Jv%A_J}fnR&DEVeO6 zzSni(wUyy|Vaiw?h&M_t%N=6ct#y!C;1obHz}j~A#cG_0n)2?t^D+*^MZS-!a#J9D zYj4y*hsAjlHT}VDO;)%yLNF$ZNMzr2JD4B)a{jeBf~8!KhMDQLcc^z++;PtdYJ|%v zLh!=TNLw<7SiE)JgaD2Xt@gZv8HDn`z!CDeKs#)9OOH}7$4rLDmvH0$q3`>piW}ygRKp73nJNniQUK>ZFf{e(sc_)Ii$lsBz zZj3sf56Cm%uW44*b|u37l7@OD5&YI)w^ihFc37@g+q@kDbemv+iVzA*l{DbtUqMXx zU@KAMAI^xkSi1~)uCRrDaP_Fu4JNN`CRKQUV(fSnt(&=E@qY&EDhlf(f{ow)g1=|0 zp?u+Zb4wG?c^7~Scwc_7>F;*-t6pz|77ut8tw|8vpq@66A-;AS!~8@|+NyWw#Hw3` z)Ab+$8-0wlpK70)UhwAWM}!<4QCyx-WdfzCP7l}a2W+B85&qys1|jYnP(n$~kqz#5 zy*$pRgc?(MIiy65KP9%mlR9RUn{Otv%XG>zm2aEGIZW`G3@lB;!3R)SnG@Ei5x)_m z;F$1OUPc%lrGmXHvGYAH6i89BmOFjBQMjD-Ai6zZ>wgt$k@#2>We#IC$VBW-t~*yJ znprwLHkc<8m2hafKi2ov9agUpyV}oZFO(m*D?#W|I8fp}@cZZ(9=5Z#N4-NF88XSx2)Z0IZimzp~@LuqjvJAz^eE7=HZj z-$r~*xaY=mZ>mm?2-;--WwFEPi7+2n5o&b*1Hi24M&j+rUJxxhzTk^`j7swx7?3vn zgITv)hrb!g1ZFjJ;fKVFvWx-u(PjlpSf#&=UxZ)H6VnAguseunn%JfhdI7|jzWSsd z?#5F`9Ltu)JU$P$(OY-ik)(?6^7eIrfM0eI`YOkPgD1yaZl%2*ur{SP` zHtb<)Kdmu$%G?Word<6RiF?ak?V^d_^a&?2ySCI1IW0%3d>tXb`wH<*vY@aP_g4E* zw3uYH0K~nP>yBd%_Bg;3OqgnO{T5z27YHudPYu`tHWW-6uM$Z*XC9)B`1Tw^gQf9d z3l9HfD1!&3Y!rh%Ht7hK8npUq0-ZUa1YDZ$GT<@#NFYsGw6Ixxn=`KmZnWU!yL#q5 zHzs4o%QNiUv(7NDg&U;oLUAtS5>6$wH&;h}t6f!ot1*)qtRCPn zxXT%^w<&H2s+vaM#O_+4`x`hj;)`PdW~6-VJ!K^tC-`Y7DHZMesoEl@{lE@L;a7Ns zF7)iCPbGeZjU<971mv0al}E{P3EpLHi>Gi?ygtRcOr64{lpD?yaB0wmlvoIrO;5|Y zHSKo$W8A7O>_8`OjUo;5>wtYYt>9I^Sn~T5Jr|2Yjl_9iG>V0b6#N(ut|x=^jS+q< z_Ey$ipwj?@BuK;ZLh5_3-CS`z3@Ruv&dO$g5{JHsr{Xb3tgyNm;^&>yU;0WEt(9pR z;h@!=jI4TC&zc{0)})-%{mMC<5PR5V`(!<&8%xUUC;6P4GumfxeL;_lvH58kNmUL~ zGp+WG6IAkXiBevD57~%Agjl)9imfVm+n9{IGF*4=FW2dFOGz;`ODm0Q0%WE&aTmACQENro6UqhcH6&&_hjy@#C~% zOZo{{-~Z9Kd!r?)_i$bV;NYgPtQ)AgxEmK|!W7VbK;KxTy9!#x7BF#?%RW%MpqnF1 z=Ec7?#XQ_uPI)2`Lipi5-Ib0$H_|6lbfEl8Kg5PcV@#9*V~ESbTv^n5kRKK#5Yp_O zNx=AVDLGaLJ|b7ahX^rS@!(FSE2%f;{gX|`j7@?Evo+ySKK%CotzeLPs;`^K)p_#&)(V^&-O~Y3WO0}Bo`a}PKEo0 z2f-T|;6J+U9W0*T{g8QRaenx{ji-UPJ2@aMy0|sErxJIX8KUd7IG3FQva>W}WT)#V zciDuObOj*i&ev+i?sg+V;>~|B=J^)RN;jg%7uYEM z-<3o%wC%vQbGMm(gBPP>*IezghHx6wl@;Lb1MK;kuITj!J1OBkC+}@!*8{KBhGzbW zlY*cp6Vi4TAJLfA%m4?c02L0`t0Fb?Q?OTK%uOv1CaJ(KZ#fgeHa|lrL-79Tm;3aj zC*ZGc))x`&GQ_$2^ULBQtZiFK@7iuA6G%sGWnFtZuqBV}8PzEVLyUGIAIuj_e}?n^ zEt5HD4u&6$#~wV2o-%W_VMoeyF<3eO;E4*HqoX#+Iq`fk`ncP6M}wBihlC;O{C5Q? zAb>%wDKA+uFjF+?SH?tLb=KJjOQMwtE~D8wq?v%AnKsGQ zR564n-OqQ81A}#WKtvi?Df}36dfS9dsoKIIyymh*!4wF~D!HIOlnxKM=!4q2`6GH4=8AfB5C3usW0KPkY=Z3z0bj>OKU= zLHA?=6B;ccD$Lrm^rDR_c$e*B8UaCPEkfXcxBSOKC#n_jh>StNm7oL0@9{Ig?IL=% z@NIN>gzzn#dto~MF6)7)jW{%HqbupGX%HnR2rrNL_=~h)_{U(NsR5y*m1o3l9eQoz86pT3%m57_DJ&LbPJA{vXmXQGPcWegHk^yz>I!`#CGp%kbR`rOv*mc~5+~|kO z;kfTz+}T1PJN`vL=6!_cA;EHOZOO#Q1jZtL>R_e(no?0DL3EPl=RPmu&C{dcKMmI) z@xK+SNZ?|33q&H6wf^|s_Ivg(*{{~03KoM|i%O*V$RnSh)Q#rqepFLh^@L&8PJyFz zlH^7-aMw>S$MU!*xdQY&cy^>tt4-pF1b1$B73Y(*UVHL;Og&h8Djh_g< zF3aQ2g8Ekgh2GG(A@W0bpE-wD*Cmv0SQZrGolX2ha5PrSg zKJX)1DM56(aGo#fdh%A_EOWZ0Qt%a!4PDhK-X5Rh%xX$=111>wQRWoFcbb!p&0G`- z3!viCY)?W}93Qlho7js7$f$@hCM)Pk}y{2ge}43hWJlVW?Yd>?(RH2W}a zT>)7qz-za0UkTg2ua&kOgIA2vyKm~6b1pTN4x5ZDc~BG?*AcX5@W2FD>-m1#cO`!=MwPhL+_=2%UK- zYxc`6KMGL)eqiK*OkdXs)F#MG$q=4>7oh1rImCs;WLexzPAMZ@hR!}z6y&z4m%;k% zV@wl(R^UziiCPK!2{807{Ft>qzMUi~vR2qV$a}o=7-+jv=(jT^X!?`j{OITbLjsS@ zwNis843=B5W$`f*V=;Bt>po#*M%ANF3yR=)k&iE%<=@r#wosoX3FR#3OSQ#0ib$J5 zQ#mnwUoL!5u;v+*f3bu=T?EkvFyX+sx#&F4`{q3u_a6YC0_Fe$J}m)ndw_wx%`Aac z%QztPurR>@XYbXKB2fs}##^!YRlgYH6;1}L1rPp{{?6qo;aP^;=(ctd&9h82&7Sg1 zH3h-kkD4t0xDie`dA>(18!zepa7p$PcG1s$IfR);`BPG*Do_6fnlutWjXVrk)oVv1 zJrpte&2jyjIr|&dIbMS0zkx!w0OZ(Gk)|z;C175~3&XX~?-6?5>L@^-2Q&lK%u97< zuh=|W{IRCtgHV;WlT-x4amO`H2eb0Ut$xg7 zOe&nUiN}*S^>@}$KKI6u{jKNL-%i3yjFtrZ+H;%LFVo(#S*_s01tML9u`yoPZf`MP znE)V~(XojuEUujkwY-R;Wk!H&Q{O0)y=r@M86?RZ+}6UB{xxR)U>4+>Zty+1uMZ$8 zP#GmV-t2x$zvNSYb#ZbZTEZ9KzRwh+Qs?_dRw5UGiH8y1IIIWl&{e9#G${veeQ{eM za441^LBWsTGd*6Ak2h{uj2W)dw{gjM)<4QDgLlh&Y;HHOzVSq3^y9gTraz=^%}~!Y zUfxpdP8fr-k7!H8j4UKKMqda$hrQ5#zS2NxjD6vf7v@u1b2jZ009^tpbYE3`NUGf#TIGBY#8w zZho~+lZK&FI3QaHG}i^CcA(s%gbfL&XFm-1JZzgnHQ08^&zpYp#0%SO?)BwHYJrua z?sI4?P`%8F|CrJpwI+c-!H_&4F9-Bo{JcRq&dr|)%rbxD-TvhZW>D=fh?2uJ=W54z z`cYWdJG39=;k>GE^o{sU0F`zQPHxj587EcObSM&iF7rQ&lnj&#KKKb!(gfJ|hku@e zb-3%Sq8_k%r&ihC5;@$#2%)*@R*pq3!ed)ZO=6#An!HD+MN@#0=Gltjl>E5(*czo* zo{-Z6i6(vmBNrgR;N8fZcvU-RCp3N64U(nQ63vt8WVkmFm&iodb9UMi@VXxfkB^G2 z@Y!}>U*=$ZJCY#3`^Cl19wQ5|`Fs**auiT-MU)Fx3ZGk7o&E}kw|W%R6hiboOWpBu zuANWFT1do&Kpmjx{haCH5#=W>4|?3+9b{8(AR-!@NGb12Qc!MsX!GB+cGPx~8{XeD zn5eiW@HTwui-x|%U-P$PtaC95?&b;@o?oGqV#T&rcG`fmG6_~FQ*DkXpSN~DAkPR~J-Co!JcG3W!r$(H7)T9@!8yDC ztIuv1Sn_JR9W^Nb`y~jG=5;sAp5G<;-kcvs7zFyif*3G@ZI^i_Rglx^{}8;4^*^Ja zECt=exBvF889CbPDN$aJcY?`FGLDsvT=Kv;p{VO!Q-ZN@d3r%fnsL;e0dCz33yyuag~=$H!(ro0_plTW ztFCBsdmWjia1zux%8v2QM!%DH=yEZC9h{{GS@ovA9#$CkI+YxqMFT1?G@Ois0ck2E zAFJKZ#6u-(*y@gs4Z)IGAN$2!0y1T5MCU9Ea-lR8L?w$uT^xMcdTFL?O-!Fn*jo1}TB8pp?;^Y_ z4TCSzcsiQ=b7&pczhk6%+=?(FaCAMlkthgx2BG~q<1geICT9T|r0W#%=3Pwf@*%fA z_%N}*cbJYO{)qa}RG52xiVWzr&UbPwFlr$pSO$ZAT1)8<44%bnMV3Db_GE}x4@%%*Kw?-824n14p=CV+yEP3{t{#j|%Qhl^?a)%Y_ zfp(d@S%ysz*nW7#WEi3=^wiG}o3&II#v1Y#d=iL30h^F7H9yl`Z+$}eC4$?6SwF0} zY=#Wvu_3=S#1M7GEM{(Zo8JSfJ0Im_Jkt4M%#)ig=zE+B;ShJltA8e`S;Y@B;^sZ<$O%xiCR={5yQ7}0% zxw2l&AaG%Ngu19AhueiW>o=|L`#c2vUiqi}Le^xfM#VJ>xR4yx$E`o6eDaH^qBG+S=_RXM%Gbr|4 z+jmK=&bl>h;%!DKex~03NZ|7+gdy(&GD2BzKm#&}hel0-80YDe9kTo2oSY3n&1{4+`Xy&`%_O7>Qe9k6T`I7 zd#go6&lgLo)21cY?tVIW>%_z05!V3t9c4>$+T`UyU7Q9Q_VV{LUbhRdj2kAa=k`Uv z%IK;E%r(bDqE5kdjN|u{vuPW(GYUpfY+&I2EC9|!d*+{6<#`v*xAPnWzv{~7VRBh; z*#Oh4HQ4Z<4niY%LvuRA7pDx|B(up@)OmO@0SW%b`%4VRuglogLRCeL+wZob=vLj& z5VCQ?!45ciqj}kdS&OQSesNv5`MsZk=0t*_mVN|v5Xah!=;@FHPJ2$F9b4)g8Z-0A zU2jjrMxHB~rmlMf<%UyVRC{R=P}*9~Q+hk>ec?aBCpzIKR=)EkJlFp`fS2Ar-H0gv z+;BYSbyD7-Ii1#Bc>Tn!Uhx*$ui5fLl7EX2QSGjM&g$CM{P2;{*JN+7nkR0?=a6Ja zya<;YzGZw{^wKMH9_^=DZ-eEF%LodjR$Mf%$n<=>gtVyHj8_Gvm|t~wdHt_op^ATH zQ*?0E6}veW=>0>`p?#?Yt;!|e_|N$~)dbJWm+O>kv|$-^JHPGMtaU-g@!yMxCR7fb z`5lBao_1tKLDMf69z3l|oh=F95B>pow=pf#ZWUl7q*gH^ZGDRNXVIx}cK@?|uQsG3 zUF2)_aeDJRo~OWpbyfJy*R2j3n=TA~l?Jr`l(beyPPd|o>J2bDLQ%+|5ZD z@%|xG8y=XJQA?v=t3IzB{eOdAF;Q#^Y2IZRhV7eDY^wixPh_Be#s+d6Q{(gfRRUd* zfrsjOJ*~ncrlc+8u5nw*upBhBgjf`YGr+W;2K{A}zYIk(UUdM<(IOK*ORjw#wANuJ z6``&0Pf~AS1p>a0+-QQ_@`luq{s4>f7U>xC zS_6?z?$_;sSb^J7jP7_JAyu~vY2!LczVB3v%agg(bx@Rm^QB>H{`yDMP{*Pjr?G7D z4KAOuEF{61YfR%UQ+Yj>) zq?%q3*aGcuvxT?p=R0g7Ch_Z3`;UzbZi8TNPQDiFq;>EfeOY9P*Ci(X(?@Xs-Z|$F z;+_*>a8ulBaULg6f)17g6d>Rms~psy-Ma!UV_bo2N(3G@(2|a3op#0zI?PyeI(?D1 z9!TQtw403H>p#bGCkcg72q68!J$w5`x1k~A+kHQ9AcP1mfLd)3A5sb;qPhh4ABC8; zTOEj3b!%k1>c1>7-S{Z;y)^iI24r$J+rdA4Ts58wzjo254DTm}qQAlqjE5^&$hPL&?y}9y)oyaa)U+unU4vPgH=Xk-SHv!H>$l%4hay6d_oFm?1adQI>X_)N&9&eai<`jC|JW zlo+b_*VXW<y*dqdG(1NH>BJw zLfq|UdDRWyTUN(XDw+8;^~~PvYo=T~g|K1lzQu$!$c2Xv0UyBsT{`)v_e=n{aa;VunlJLG=~lIXU3< z#}HXQUZ&qOdQVa7*oK7D;Ctr#Ucu!#yOt9lm|L`#b%nQF4465UBmqqe!pZJfpDc|X zrhU#b<8rrqaR-Pk%X_A`o-2|q>=Hv|Ho4bwLC&Sal91e;SxzPYZNa1P3>DEE21*Bc zMDW5Sd!&CPhx&2q7eFVSyj_{9J~fWv$8ab8$RBa8d57ajd-)fuI7PA622~hbmxA#i z34oLy|FV^sFNA!?oko2He=VxC^jnLw7Q1<(R-&Cw6T~O4BSPnRaj(zhD|`=Qwa+Qr z?QZd76?Ijt6>_C#f3Z2qoOA>gXR~X=4KV$0fb{__ZWs~b_U?%G!~rg^Fe&OsHtKs4 zyAPMdAC&Nl$#86x&jmd0{EA}zwM}! z>j?eDp6GTPeqi!vivzEc0g;wHUW0rq_gBQ{e2!3p{H@jHa6%D`;m_+} zdYFJp>dJK+3({&wnTxhreVa7$4u@})<&}5>{1+i-#P`5aLI-e-x9np~g!TCBi2{YOIm$%7V@-@y}Z8N1lk2=V=I0 z5j_N-pU`#hk(`u={5pkdNZy;dY9!QZ4{z7?j8`=l10?fm$@jX4Sf^@mPPKBFYP1{} z5}X6|TZKFk^13{ey(G+JEt7ZJuzTQ4;HKSuI_C`k(H>W9mgDdZ5eGB7!XGSd-Cw$# zKnfA})l4Z@%&KQwpvx*LDCCk2g-W}pNFV8j0Nem$QIWZb`BdTk&78=E;(D0CPan@d z?|xSCLwBvThdb@ZW<>FkLxJo`QLw+|$`hmHsNph=V$OXUUaO-ZF?9I$pNlv0{D3ZM zDPribpVDu(2vP*`pzgGl*%n1aOhTWcr?!;Jb91lSajXV4>1oV#iHKcq}$WuP|m4De#1| z8k(oe_u+A={vAjzO~=q~8}8%Xn>|lxFzk^wMxFZ$gLJ5!K5 zEdYZ@%SiXqqAIubz!TbT+09qGvHZ4&#*TYN-qv~r{c*|7H<#Y3>g<}HLw)FPsa|gm zgVf z!iT#a&W$GqIx;q?qWxKDR7S{J;gqWM=#L1s*^AAsKSXO&_@V^aKNLGlaHHs`**{Nr zD>kvOqut4_QNkeFn~E7Fl(2yzNIUyds*zYlvOD2-$neH$_qg$8W0N;b|B#6(1Qy6NaTr zbHOjB+2EglY_P^du6$TKhuoo(Rz4m%p{6RM*iMWRemKz@_s}ZrxHUtwPV=+%8l3M!78%f|lmJUv)YX+8^_}E4$&-~9d=2>CWbP;D zq40TBbjb!&ly$g)`Z~cO(m}&s>EStD$qw(icXB*Clg&DV#0Fh2>VTJ5qV8lM$-|8@ zvWT`NeMaWcy%ivn5mARS5kua3832tk)~W=5ykPk}tg)eoLs_ zA~fYT{Ac{!{*g^TbL&*og|Vc}SNo8k)SX_or%M*W^soL8R1g~8vEkeZDnbw!@r1&! zkRIgTuj$!tBcZzLX7=RI_Swhe-gda13J{fg@$;iEfWmLlM%h5dwA>Kx5JpA~UlfXRPTXr@yT$ksY6

    $SlJpzY(BB_TeUdD` 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 literal 0 HcmV?d00001 diff --git a/doc/src/DecisionTrees/DecisionTrees.do.txt b/doc/src/DecisionTrees/DecisionTrees.do.txt index 44b510e89..abcc176f6 100644 --- a/doc/src/DecisionTrees/DecisionTrees.do.txt +++ b/doc/src/DecisionTrees/DecisionTrees.do.txt @@ -400,67 +400,179 @@ s = -\sum_{k=1}^K p_{mk}\log{p_{mk}}. !split -===== The CART (Classification and Regression Tree) algorithm ===== +===== Visualizing the Tree, Classification ===== +!bc pycod +import os +from sklearn.datasets import load_breast_cancer +from sklearn.tree import DecisionTreeClassifier +from sklearn.model_selection import train_test_split +from sklearn.metrics import confusion_matrix +from sklearn.tree import export_graphviz -The above functions (gini, entropy and misclassification error) are important components of the so-called CART algorithm. We will discuss this algorithm first before we move on to the information gain algorithm ID3. +from IPython.display import Image +from pydot import graph_from_dot_data +import pandas as pd +import numpy as np + + +cancer = load_breast_cancer() +X = pd.DataFrame(cancer.data, columns=cancer.feature_names) +print(X) +y = pd.Categorical.from_codes(cancer.target, cancer.target_names) +y = pd.get_dummies(y) +print(y) +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1) +tree_clf = DecisionTreeClassifier(max_depth=5) +tree_clf.fit(X_train, y_train) + +export_graphviz( + tree_clf, + out_file="DataFiles/cancer.dot", + feature_names=cancer.feature_names, + class_names=cancer.target_names, + rounded=True, + filled=True +) +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png' +os.system(cmd) +!ec + +!split +===== Visualizing the Tree, The Moons ===== +!bc pycod +# Common imports +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.tree import DecisionTreeClassifier +from sklearn.datasets import make_moons +from sklearn.tree import export_graphviz +from pydot import graph_from_dot_data +import pandas as pd +import os + +np.random.seed(42) +X, y = make_moons(n_samples=100, noise=0.25, random_state=53) +X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0) +tree_clf = DecisionTreeClassifier(max_depth=5) +tree_clf.fit(X_train, y_train) + +export_graphviz( + tree_clf, + out_file="DataFiles/moons.dot", + rounded=True, + filled=True +) +cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png' +os.system(cmd) +!ec + + +!split +===== 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 +etc. The table here contains the feautures _outlook_, _temperature_, +_humidity_ and _wind_. The target or output is whether we ride +(True=1) or whether we do something else that day (False=0). The +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 +|-------------------------------------------| +|Day| Outlook |Temperature | Humidity | Wind | Ride| +|-------------------------------------------| +|1 | Sunny | Hot | High | Weak | 0 | +|2 | Sunny | Hot | High | Strong | 1 | +|3 | Overcast | Hot | High | Weak | 1 | +|4 | Rain | Mild | High | Weak | 1 | +|5 | Rain | Cool | Normal | Weak | 1 | +|6 | Rain | Cool | Normal | Strong | 0 | +|7 | Overcast | Cool | Normal | Strong | 1 | +|8 | Sunny | Mild | High | Weak | 0 | +|9 | Sunny | Cool | Normal | Weak | 1 | +|10 | Rain | Mild | Normal | Weak | 1 | +|11 | Sunny | Mild | Normal | Strong | 1 | +|12 | Overcast | Mild | High | Strong | 1 | +|13 | Overcast | Hot | Normal | Weak | 1 | +|14 | Rain | Mild | High | Strong | 0 | +|-------------------------------------------| + + +!split +===== Simple Python Code to read in Data ===== + +!bc pycod +# Common imports +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from sklearn.preprocessing import StandardScaler, OneHotEncoder +from sklearn.compose import ColumnTransformer +from IPython.display import Image +from pydot import graph_from_dot_data +import os + +# Where to save the figures and data files +PROJECT_ROOT_DIR = "Results" +FIGURE_ID = "Results/FigureFiles" +DATA_ID = "DataFiles/" + +if not os.path.exists(PROJECT_ROOT_DIR): + os.mkdir(PROJECT_ROOT_DIR) + +if not os.path.exists(FIGURE_ID): + os.makedirs(FIGURE_ID) + +if not os.path.exists(DATA_ID): + os.makedirs(DATA_ID) + +def image_path(fig_id): + return os.path.join(FIGURE_ID, fig_id) + +def data_path(dat_id): + return os.path.join(DATA_ID, dat_id) + +def save_fig(fig_id): + plt.savefig(image_path(fig_id) + ".png", format='png') + +infile = open(data_path("ride.csv"),'r') + +# Read the experimental data with Pandas +from IPython.display import display +ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride')) +ridedata = pd.DataFrame(ridedata) +display(ridedata) +# Features and targets +X = ridedata.loc[:, ridedata.columns != 'Ride'].values +display(X) +y = ridedata.loc[:, ridedata.columns == 'Ride'].values +display(y) +# Categorical variables to one-hot's +onehotencoder = OneHotEncoder(categories="auto") + +X = ColumnTransformer([("", onehotencoder)]).fit_transform(X) +y.shape + +display(X) +display(y) + +!ec + +!split +===== 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. !bc pycod -from random import seed -from random import randrange -from csv import reader - -# Load a CSV file -def load_csv(filename): - file = open(filename, "rb") - lines = reader(file) - dataset = list(lines) - return dataset - -# Convert string column to float -def str_column_to_float(dataset, column): - for row in dataset: - row[column] = float(row[column].strip()) - -# Split a dataset into k folds -def cross_validation_split(dataset, n_folds): - dataset_split = list() - dataset_copy = list(dataset) - fold_size = int(len(dataset) / n_folds) - for i in range(n_folds): - fold = list() - while len(fold) < fold_size: - index = randrange(len(dataset_copy)) - fold.append(dataset_copy.pop(index)) - dataset_split.append(fold) - return dataset_split - -# Calculate accuracy percentage -def accuracy_metric(actual, predicted): - correct = 0 - for i in range(len(actual)): - if actual[i] == predicted[i]: - correct += 1 - return correct / float(len(actual)) * 100.0 - -# Evaluate an algorithm using a cross validation split -def evaluate_algorithm(dataset, algorithm, n_folds, *args): - folds = cross_validation_split(dataset, n_folds) - scores = list() - for fold in folds: - train_set = list(folds) - train_set.remove(fold) - train_set = sum(train_set, []) - test_set = list() - for row in fold: - row_copy = list(row) - test_set.append(row_copy) - row_copy[-1] = None - predicted = algorithm(train_set, test_set, *args) - actual = [row[-1] for row in fold] - accuracy = accuracy_metric(actual, predicted) - scores.append(accuracy) - return scores - # Split a dataset based on an attribute and an attribute value def test_split(index, value, dataset): left, right = list(), list() @@ -490,7 +602,7 @@ def gini_index(groups, classes): # weight the group score by its relative size gini += (1.0 - score) * (size / n_instances) return gini - + # Select the best split point for a dataset def get_split(dataset): class_values = list(set(row[-1] for row in dataset)) @@ -499,84 +611,28 @@ def get_split(dataset): for row in dataset: groups = test_split(index, row[index], dataset) gini = gini_index(groups, class_values) + print('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini)) if gini < b_score: b_index, b_value, b_score, b_groups = index, row[index], gini, groups return {'index':b_index, 'value':b_value, 'groups':b_groups} -# Create a terminal node value -def to_terminal(group): - outcomes = [row[-1] for row in group] - return max(set(outcomes), key=outcomes.count) - -# Create child splits for a node or make terminal -def split(node, max_depth, min_size, depth): - left, right = node['groups'] - del(node['groups']) - # check for a no split - if not left or not right: - node['left'] = node['right'] = to_terminal(left + right) - return - # check for max depth - if depth >= max_depth: - node['left'], node['right'] = to_terminal(left), to_terminal(right) - return - # process left child - if len(left) <= min_size: - node['left'] = to_terminal(left) - else: - node['left'] = get_split(left) - split(node['left'], max_depth, min_size, depth+1) - # process right child - if len(right) <= min_size: - node['right'] = to_terminal(right) - else: - node['right'] = get_split(right) - split(node['right'], max_depth, min_size, depth+1) - -# Build a decision tree -def build_tree(train, max_depth, min_size): - root = get_split(train) - split(root, max_depth, min_size, 1) - return root - -# Make a prediction with a decision tree -def predict(node, row): - if row[node['index']] < node['value']: - if isinstance(node['left'], dict): - return predict(node['left'], row) - else: - return node['left'] - else: - if isinstance(node['right'], dict): - return predict(node['right'], row) - else: - return node['right'] - -# Classification and Regression Tree Algorithm -def decision_tree(train, test, max_depth, min_size): - tree = build_tree(train, max_depth, min_size) - predictions = list() - for row in test: - prediction = predict(tree, row) - predictions.append(prediction) - return(predictions) - -# Test CART -seed(1) -# load and prepare data -filename = 'DataFiles/rideclass.csv' -dataset = load_csv(filename) -# convert string attributes to integers -for i in range(len(dataset[0])): - str_column_to_float(dataset, i) -# evaluate algorithm -n_folds = 5 -max_depth = 5 -min_size = 10 -scores = evaluate_algorithm(dataset, decision_tree, n_folds, max_depth, min_size) -print('Scores: %s' % scores) -print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores)))) +dataset = [[0,0,0,0,0], + [0,0,0,1,1], + [1,0,0,0,1], + [2,1,0,0,1], + [2,2,1,0,1], + [2,2,1,1,0], + [1,2,1,1,1], + [0,1,0,0,0], + [0,2,1,0,1], + [2,1,1,0,1], + [0,1,1,1,1], + [1,1,0,1,1], + [1,0,1,0,1], + [2,1,0,1,0]] +split = get_split(dataset) +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value'])) !ec !split @@ -609,10 +665,197 @@ attributes at each step while growing the tree. !split ===== Implementing the ID3 Algorithm ===== -_more text to come here_, material presented during lecture Friday Oct 25. +import re +import math +from collections import deque + +# x is examples in training set +# y is set of attributes +# label is target attributes +# Node is a class which has properties values, childs, and next +# root is top node in the decision tree + +class Node(object): + def __init__(self): + self.value = None + self.next = None + self.childs = None + +# Simple class of Decision Tree +# Aimed for who want to learn Decision Tree, so it is not optimized +class DecisionTree(object): + def __init__(self, sample, attributes, labels): + self.sample = sample + self.attributes = attributes + self.labels = labels + self.labelCodes = None + self.labelCodesCount = None + self.initLabelCodes() + # print(self.labelCodes) + self.root = None + self.entropy = self.getEntropy([x for x in range(len(self.labels))]) + + def initLabelCodes(self): + self.labelCodes = [] + self.labelCodesCount = [] + for l in self.labels: + if l not in self.labelCodes: + self.labelCodes.append(l) + self.labelCodesCount.append(0) + self.labelCodesCount[self.labelCodes.index(l)] += 1 + + def getLabelCodeId(self, sampleId): + return self.labelCodes.index(self.labels[sampleId]) + + def getAttributeValues(self, sampleIds, attributeId): + vals = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in vals: + vals.append(val) + # print(vals) + return vals + + def getEntropy(self, sampleIds): + entropy = 0 + labelCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCount[self.getLabelCodeId(sid)] += 1 + # print("-ge", labelCount) + for lv in labelCount: + # print(lv) + if lv != 0: + entropy += -lv/len(sampleIds) * math.log(lv/len(sampleIds), 2) + else: + entropy += 0 + return entropy + + def getDominantLabel(self, sampleIds): + labelCodesCount = [0] * len(self.labelCodes) + for sid in sampleIds: + labelCodesCount[self.labelCodes.index(self.labels[sid])] += 1 + return self.labelCodes[labelCodesCount.index(max(labelCodesCount))] + + def getInformationGain(self, sampleIds, attributeId): + gain = self.getEntropy(sampleIds) + attributeVals = [] + attributeValsCount = [] + attributeValsIds = [] + for sid in sampleIds: + val = self.sample[sid][attributeId] + if val not in attributeVals: + attributeVals.append(val) + attributeValsCount.append(0) + attributeValsIds.append([]) + vid = attributeVals.index(val) + attributeValsCount[vid] += 1 + attributeValsIds[vid].append(sid) + # print("-gig", self.attributes[attributeId]) + for vc, vids in zip(attributeValsCount, attributeValsIds): + # print("-gig", vids) + gain -= vc/len(sampleIds) * self.getEntropy(vids) + return gain + + def getAttributeMaxInformationGain(self, sampleIds, attributeIds): + attributesEntropy = [0] * len(attributeIds) + for i, attId in zip(range(len(attributeIds)), attributeIds): + attributesEntropy[i] = self.getInformationGain(sampleIds, attId) + maxId = attributeIds[attributesEntropy.index(max(attributesEntropy))] + return self.attributes[maxId], maxId + + def isSingleLabeled(self, sampleIds): + label = self.labels[sampleIds[0]] + for sid in sampleIds: + if self.labels[sid] != label: + return False + return True + + def getLabel(self, sampleId): + return self.labels[sampleId] + + def id3(self): + sampleIds = [x for x in range(len(self.sample))] + attributeIds = [x for x in range(len(self.attributes))] + self.root = self.id3Recv(sampleIds, attributeIds, self.root) + + def id3Recv(self, sampleIds, attributeIds, root): + root = Node() # Initialize current root + if self.isSingleLabeled(sampleIds): + root.value = self.labels[sampleIds[0]] + return root + # print(attributeIds) + if len(attributeIds) == 0: + root.value = self.getDominantLabel(sampleIds) + return root + bestAttrName, bestAttrId = self.getAttributeMaxInformationGain( + sampleIds, attributeIds) + # print(bestAttrName) + root.value = bestAttrName + root.childs = [] # Create list of children + for value in self.getAttributeValues(sampleIds, bestAttrId): + # print(value) + child = Node() + child.value = value + root.childs.append(child) # Append new child node to current + # root + childSampleIds = [] + for sid in sampleIds: + if self.sample[sid][bestAttrId] == value: + childSampleIds.append(sid) + if len(childSampleIds) == 0: + child.next = self.getDominantLabel(sampleIds) + else: + # print(bestAttrName, bestAttrId) + # print(attributeIds) + if len(attributeIds) > 0 and bestAttrId in attributeIds: + toRemove = attributeIds.index(bestAttrId) + attributeIds.pop(toRemove) + child.next = self.id3Recv( + childSampleIds, attributeIds, child.next) + return root + + def printTree(self): + if self.root: + roots = deque() + roots.append(self.root) + while len(roots) > 0: + root = roots.popleft() + print(root.value) + if root.childs: + for child in root.childs: + print('({})'.format(child.value)) + roots.append(child.next) + elif root.next: + print(root.next) + + +def test(): + f = open('DataFiles/rideclass.csv') + attributes = f.readline().split(',') + attributes = attributes[1:len(attributes)-1] + print(attributes) + sample = f.readlines() + f.close() + for i in range(len(sample)): + sample[i] = re.sub('\d+,', '', sample[i]) + sample[i] = sample[i].strip().split(',') + labels = [] + for s in sample: + labels.append(s.pop()) + # print(sample) + # print(labels) + decisionTree = DecisionTree(sample, attributes, labels) + print("System entropy {}".format(decisionTree.entropy)) + decisionTree.id3() + decisionTree.printTree() + + +if __name__ == '__main__': + test() + !split -===== Cancer Data again now with Decision Trees ===== +===== Cancer Data again now with Decision Trees and other Methods ===== !bc pycod import matplotlib.pyplot as plt import numpy as np @@ -736,7 +979,7 @@ np.random.seed(6) Xs = np.random.rand(100, 2) - 0.5 ys = (Xs[:, 0] > 0).astype(np.float32) * 2 -angle = np.pi / 4 +angle = np.pi/4 rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) Xsr = Xs.dot(rotation_matrix) @@ -889,6 +1132,9 @@ general-purpose procedure for reducing the variance of a statistical learning method. +!split +===== 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 @@ -929,6 +1175,56 @@ plt.show() !ec +!split +===== Bagging Example ===== +!bc pycod +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) +X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) + +from sklearn.ensemble import RandomForestClassifier +from sklearn.ensemble import VotingClassifier +from sklearn.linear_model import LogisticRegression +from sklearn.svm import SVC + +log_clf = LogisticRegression(solver="liblinear", random_state=42) +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42) +svm_clf = SVC(gamma="auto", random_state=42) + +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 + +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(solver="liblinear", random_state=42) +rnd_clf = RandomForestClassifier(n_estimators=10, random_state=42) +svm_clf = SVC(gamma="auto", probability=True, random_state=42) + +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 + +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)) + +!ec + + !split ===== Random forests ===== @@ -1113,8 +1409,4 @@ np.sum(y_pred == y_pred_rf) / len(y_pred) !ec -!split -===== Boosting and more ===== -More material to come here. - diff --git a/doc/src/DecisionTrees/cancer.dot b/doc/src/DecisionTrees/Results/FigureFiles/cancer.dot similarity index 85% rename from doc/src/DecisionTrees/cancer.dot rename to doc/src/DecisionTrees/Results/FigureFiles/cancer.dot index a0d5d819c..bf6a8ded3 100644 --- a/doc/src/DecisionTrees/cancer.dot +++ b/doc/src/DecisionTrees/Results/FigureFiles/cancer.dot @@ -10,7 +10,7 @@ edge [fontname=helvetica] ; 2 -> 3 ; 4 [label="gini = 0.0\nsamples = 239\nvalue = [[239, 0]\n[0, 239]]", fillcolor="#e58139ff"] ; 3 -> 4 ; -5 [label="symmetry error <= 0.025\ngini = 0.444\nsamples = 3\nvalue = [[2, 1]\n[1, 2]]", fillcolor="#e5813913"] ; +5 [label="compactness error <= 0.014\ngini = 0.444\nsamples = 3\nvalue = [[2, 1]\n[1, 2]]", fillcolor="#e5813913"] ; 3 -> 5 ; 6 [label="gini = 0.0\nsamples = 1\nvalue = [[0, 1]\n[1, 0]]", fillcolor="#e58139ff"] ; 5 -> 6 ; @@ -22,7 +22,7 @@ edge [fontname=helvetica] ; 8 -> 9 ; 10 [label="gini = 0.0\nsamples = 3\nvalue = [[0, 3]\n[3, 0]]", fillcolor="#e58139ff"] ; 8 -> 10 ; -11 [label="worst texture <= 24.785\ngini = 0.278\nsamples = 6\nvalue = [[1, 5]\n[5, 1]]", fillcolor="#e581396b"] ; +11 [label="mean texture <= 16.22\ngini = 0.278\nsamples = 6\nvalue = [[1, 5]\n[5, 1]]", fillcolor="#e581396b"] ; 1 -> 11 ; 12 [label="gini = 0.0\nsamples = 1\nvalue = [[1, 0]\n[0, 1]]", fillcolor="#e58139ff"] ; 11 -> 12 ; @@ -30,11 +30,11 @@ edge [fontname=helvetica] ; 11 -> 13 ; 14 [label="worst texture <= 20.645\ngini = 0.202\nsamples = 167\nvalue = [[19, 148]\n[148, 19]]", fillcolor="#e5813994"] ; 0 -> 14 [labeldistance=2.5, labelangle=-45, headlabel="False"] ; -15 [label="worst perimeter <= 116.8\ngini = 0.375\nsamples = 16\nvalue = [[12, 4]\n[4, 12]]", fillcolor="#e5813938"] ; +15 [label="worst area <= 964.4\ngini = 0.375\nsamples = 16\nvalue = [[12, 4]\n[4, 12]]", fillcolor="#e5813938"] ; 14 -> 15 ; 16 [label="gini = 0.0\nsamples = 11\nvalue = [[11, 0]\n[0, 11]]", fillcolor="#e58139ff"] ; 15 -> 16 ; -17 [label="mean concavity <= 0.06\ngini = 0.32\nsamples = 5\nvalue = [[1, 4]\n[4, 1]]", fillcolor="#e5813955"] ; +17 [label="worst compactness <= 0.126\ngini = 0.32\nsamples = 5\nvalue = [[1, 4]\n[4, 1]]", fillcolor="#e5813955"] ; 15 -> 17 ; 18 [label="gini = 0.0\nsamples = 1\nvalue = [[1, 0]\n[0, 1]]", fillcolor="#e58139ff"] ; 17 -> 18 ; diff --git a/doc/src/DecisionTrees/dtcancer.py b/doc/src/DecisionTrees/dtcancer.py index 45d9e5fe1..ee4e677d2 100644 --- a/doc/src/DecisionTrees/dtcancer.py +++ b/doc/src/DecisionTrees/dtcancer.py @@ -1,3 +1,4 @@ +import os from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split @@ -9,6 +10,31 @@ from pydot import graph_from_dot_data import pandas as pd import numpy as np + +# Where to save the figures and data files +PROJECT_ROOT_DIR = "Results" +FIGURE_ID = "Results/FigureFiles" +DATA_ID = "DataFiles/" + +if not os.path.exists(PROJECT_ROOT_DIR): + os.mkdir(PROJECT_ROOT_DIR) + +if not os.path.exists(FIGURE_ID): + os.makedirs(FIGURE_ID) + +if not os.path.exists(DATA_ID): + os.makedirs(DATA_ID) + +def image_path(fig_id): + return os.path.join(FIGURE_ID, fig_id) + +def data_path(dat_id): + return os.path.join(DATA_ID, dat_id) + +def save_fig(fig_id): + plt.savefig(image_path(fig_id) + ".png", format='png') + + cancer = load_breast_cancer() X = pd.DataFrame(cancer.data, columns=cancer.feature_names) print(X) @@ -21,10 +47,11 @@ tree_clf.fit(X_train, y_train) export_graphviz( tree_clf, - out_file="cancer.dot", + out_file="DataFiles/cancer.dot", feature_names=cancer.feature_names, class_names=cancer.target_names, rounded=True, filled=True ) - +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png' +os.system(cmd) diff --git a/doc/src/DecisionTrees/gini.py b/doc/src/DecisionTrees/gini.py index a393242d7..cf4509b9c 100644 --- a/doc/src/DecisionTrees/gini.py +++ b/doc/src/DecisionTrees/gini.py @@ -41,6 +41,7 @@ def get_split(dataset): b_index, b_value, b_score, b_groups = index, row[index], gini, groups return {'index':b_index, 'value':b_value, 'groups':b_groups} +""" dataset = [[2.771244718,1.784783929,0], [1.728571309,1.169761413,0], [3.678319846,2.81281357,0], @@ -51,5 +52,23 @@ dataset = [[2.771244718,1.784783929,0], [7.444542326,0.476683375,1], [10.12493903,3.234550982,1], [6.642287351,3.319983761,1]] +""" +dataset = [[0,0,0,0,0], + [0,0,0,1,1], + [1,0,0,0,1], + [2,1,0,0,1], + [2,2,1,0,1], + [2,2,1,1,0], + [1,2,1,1,1], + [0,1,0,0,0], + [0,2,1,0,1], + [2,1,1,0,1], + [0,1,1,1,1], + [1,1,0,1,1], + [1,0,1,0,1], + [2,1,0,1,0]] + split = get_split(dataset) print('Split: [X%d < %.3f]' % ((split['index']+1), split['value'])) + +