From 31eea8bbebb19428ba938bd37b8701758f40e269 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 7 Nov 2019 14:11:06 +0100 Subject: [PATCH] interchanging --- .../html/._DecisionTrees-bs000.html | 14 +- .../html/._DecisionTrees-bs001.html | 14 +- .../html/._DecisionTrees-bs002.html | 14 +- .../html/._DecisionTrees-bs003.html | 14 +- .../html/._DecisionTrees-bs004.html | 14 +- .../html/._DecisionTrees-bs005.html | 14 +- .../html/._DecisionTrees-bs006.html | 14 +- .../html/._DecisionTrees-bs007.html | 14 +- .../html/._DecisionTrees-bs008.html | 14 +- .../html/._DecisionTrees-bs009.html | 14 +- .../html/._DecisionTrees-bs010.html | 14 +- .../html/._DecisionTrees-bs011.html | 14 +- .../html/._DecisionTrees-bs012.html | 14 +- .../html/._DecisionTrees-bs013.html | 14 +- .../html/._DecisionTrees-bs014.html | 14 +- .../html/._DecisionTrees-bs015.html | 14 +- .../html/._DecisionTrees-bs016.html | 14 +- .../html/._DecisionTrees-bs017.html | 14 +- .../html/._DecisionTrees-bs018.html | 14 +- .../html/._DecisionTrees-bs019.html | 14 +- .../html/._DecisionTrees-bs020.html | 14 +- .../html/._DecisionTrees-bs021.html | 14 +- .../html/._DecisionTrees-bs022.html | 14 +- .../html/._DecisionTrees-bs023.html | 14 +- .../html/._DecisionTrees-bs024.html | 14 +- .../html/._DecisionTrees-bs025.html | 14 +- .../html/._DecisionTrees-bs026.html | 14 +- .../html/._DecisionTrees-bs027.html | 14 +- .../html/._DecisionTrees-bs028.html | 14 +- .../html/._DecisionTrees-bs029.html | 14 +- .../html/._DecisionTrees-bs030.html | 14 +- .../html/._DecisionTrees-bs031.html | 14 +- .../html/._DecisionTrees-bs032.html | 14 +- .../html/._DecisionTrees-bs033.html | 14 +- .../html/._DecisionTrees-bs034.html | 14 +- .../html/._DecisionTrees-bs035.html | 14 +- .../html/._DecisionTrees-bs036.html | 14 +- .../html/._DecisionTrees-bs037.html | 14 +- .../html/._DecisionTrees-bs038.html | 14 +- .../html/._DecisionTrees-bs039.html | 14 +- .../html/._DecisionTrees-bs040.html | 14 +- .../html/._DecisionTrees-bs041.html | 14 +- .../html/._DecisionTrees-bs042.html | 14 +- .../html/._DecisionTrees-bs043.html | 14 +- .../html/._DecisionTrees-bs044.html | 107 +- .../html/._DecisionTrees-bs045.html | 91 +- .../html/._DecisionTrees-bs046.html | 80 +- .../html/._DecisionTrees-bs047.html | 14 +- .../html/._DecisionTrees-bs048.html | 14 +- .../html/._DecisionTrees-bs049.html | 14 +- .../html/._DecisionTrees-bs050.html | 14 +- .../html/._DecisionTrees-bs051.html | 14 +- .../html/._DecisionTrees-bs052.html | 14 +- .../html/._DecisionTrees-bs053.html | 14 +- .../html/._DecisionTrees-bs054.html | 14 +- .../html/._DecisionTrees-bs055.html | 14 +- .../html/._DecisionTrees-bs056.html | 14 +- .../html/._DecisionTrees-bs057.html | 14 +- .../DecisionTrees/html/DecisionTrees-bs.html | 14 +- .../html/DecisionTrees-reveal.html | 126 +- .../html/DecisionTrees-solarized.html | 132 +- doc/pub/DecisionTrees/html/DecisionTrees.html | 132 +- .../DecisionTrees/ipynb/DataFiles/cancer.dot | 16 +- .../DecisionTrees/ipynb/DataFiles/cancer.png | Bin 223889 -> 221592 bytes .../DecisionTrees/ipynb/DecisionTrees.ipynb | 144 +- .../ipynb/ipynb-DecisionTrees-src.tar.gz | Bin 294061 -> 294061 bytes .../pdf/DecisionTrees-minted.pdf | Bin 526683 -> 526688 bytes doc/src/DecisionTrees/DecisionTrees-bs.html | 311 ++ .../DecisionTrees/DecisionTrees-minted.pdf | Bin 0 -> 526688 bytes .../DecisionTrees-plain-minted.tex | 2395 +++++++++ .../DecisionTrees/DecisionTrees-reveal.html | 2657 ++++++++++ .../DecisionTrees-solarized.html | 2502 +++++++++ doc/src/DecisionTrees/DecisionTrees.do.txt | 125 +- doc/src/DecisionTrees/DecisionTrees.html | 2507 +++++++++ doc/src/DecisionTrees/DecisionTrees.ipynb | 2602 ++++++++++ doc/src/DecisionTrees/DecisionTrees.p.tex | 2425 +++++++++ doc/src/DecisionTrees/DecisionTrees.tex | 2395 +++++++++ .../_minted-DecisionTrees/default.pygstyle | 0 .../ipynb-DecisionTrees-src.tar.gz | Bin 0 -> 294061 bytes doc/src/DecisionTrees/reveal.js/.gitignore | 8 + doc/src/DecisionTrees/reveal.js/.travis.yml | 5 + .../DecisionTrees/reveal.js/CONTRIBUTING.md | 23 + doc/src/DecisionTrees/reveal.js/Gruntfile.js | 140 + doc/src/DecisionTrees/reveal.js/LICENSE | 19 + doc/src/DecisionTrees/reveal.js/README.md | 1052 ++++ doc/src/DecisionTrees/reveal.js/bower.json | 27 + .../reveal.js/css/images/cbc_footer.png | Bin 0 -> 10008 bytes .../reveal.js/css/images/cbc_symbol.png | Bin 0 -> 2946 bytes .../reveal.js/css/images/simula_footer.png | Bin 0 -> 2513 bytes .../reveal.js/css/images/simula_logo.png | Bin 0 -> 2138 bytes .../reveal.js/css/images/simula_symbol.png | Bin 0 -> 2138 bytes .../reveal.js/css/images/uio_footer.png | Bin 0 -> 18189 bytes .../reveal.js/css/images/uio_symbol.png | Bin 0 -> 11352 bytes .../reveal.js/css/print/paper.css | 202 + .../DecisionTrees/reveal.js/css/print/pdf.css | 157 + .../DecisionTrees/reveal.js/css/reveal.css | 1886 +++++++ .../DecisionTrees/reveal.js/css/reveal.scss | 1319 +++++ .../reveal.js/css/theme/README.md | 23 + .../reveal.js/css/theme/beige.css | 154 + .../reveal.js/css/theme/beigesmall.css | 155 + .../reveal.js/css/theme/black.css | 273 + .../reveal.js/css/theme/blood.css | 180 + .../DecisionTrees/reveal.js/css/theme/cbc.css | 144 + .../reveal.js/css/theme/darkgray.css | 153 + .../reveal.js/css/theme/default.css | 153 + .../reveal.js/css/theme/league.css | 279 + .../reveal.js/css/theme/moon.css | 153 + .../reveal.js/css/theme/night.css | 141 + .../reveal.js/css/theme/serif.css | 143 + .../reveal.js/css/theme/simple.css | 144 + .../reveal.js/css/theme/simula.css | 144 + .../DecisionTrees/reveal.js/css/theme/sky.css | 150 + .../reveal.js/css/theme/solarized.css | 153 + .../reveal.js/css/theme/source/beige.scss | 50 + .../css/theme/source/beigesmall.scss | 51 + .../reveal.js/css/theme/source/black.scss | 49 + .../reveal.js/css/theme/source/blood.scss | 91 + .../reveal.js/css/theme/source/cbc.scss | 39 + .../reveal.js/css/theme/source/darkgray.scss | 42 + .../reveal.js/css/theme/source/default.scss | 42 + .../reveal.js/css/theme/source/league.scss | 34 + .../reveal.js/css/theme/source/moon.scss | 68 + .../reveal.js/css/theme/source/night.scss | 35 + .../reveal.js/css/theme/source/serif.scss | 35 + .../reveal.js/css/theme/source/simple.scss | 38 + .../reveal.js/css/theme/source/simula.scss | 39 + .../reveal.js/css/theme/source/sky.scss | 46 + .../reveal.js/css/theme/source/solarized.scss | 74 + .../reveal.js/css/theme/source/white.scss | 49 + .../reveal.js/css/theme/white.css | 273 + doc/src/DecisionTrees/reveal.js/index.html | 411 ++ doc/src/DecisionTrees/reveal.js/js/reveal.js | 4508 +++++++++++++++++ .../reveal.js/lib/css/zenburn.css | 117 + .../reveal.js/lib/font/league-gothic/LICENSE | 2 + .../lib/font/league-gothic/league-gothic.css | 10 + .../lib/font/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../lib/font/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../lib/font/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../lib/font/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../font/source-sans-pro/source-sans-pro.css | 39 + .../reveal.js/lib/js/classList.js | 2 + .../reveal.js/lib/js/head.min.js | 8 + .../reveal.js/lib/js/html5shiv.js | 7 + doc/src/DecisionTrees/reveal.js/package.json | 45 + .../reveal.js/plugin/highlight/highlight.js | 30 + .../reveal.js/plugin/leap/leap.js | 159 + .../reveal.js/plugin/markdown/example.html | 129 + .../reveal.js/plugin/markdown/example.md | 31 + .../reveal.js/plugin/markdown/markdown.js | 393 ++ .../reveal.js/plugin/markdown/marked.js | 6 + .../reveal.js/plugin/math/math.js | 64 + .../reveal.js/plugin/multiplex/client.js | 13 + .../reveal.js/plugin/multiplex/index.js | 56 + .../reveal.js/plugin/multiplex/master.js | 51 + .../reveal.js/plugin/notes-server/client.js | 60 + .../reveal.js/plugin/notes-server/index.js | 66 + .../reveal.js/plugin/notes-server/notes.html | 396 ++ .../reveal.js/plugin/notes/notes.html | 406 ++ .../reveal.js/plugin/notes/notes.js | 122 + .../reveal.js/plugin/print-pdf/print-pdf.js | 48 + .../reveal.js/plugin/remotes/remotes.js | 39 + .../reveal.js/plugin/search/search.js | 196 + .../reveal.js/plugin/zoom-js/zoom.js | 278 + .../reveal.js/test/examples/assets/image1.png | Bin 0 -> 21991 bytes .../reveal.js/test/examples/assets/image2.png | Bin 0 -> 10237 bytes .../reveal.js/test/examples/barebones.html | 41 + .../test/examples/embedded-media.html | 49 + .../reveal.js/test/examples/math.html | 185 + .../test/examples/slide-backgrounds.html | 144 + .../test/examples/slide-transitions.html | 101 + .../reveal.js/test/qunit-1.12.0.css | 244 + .../reveal.js/test/qunit-1.12.0.js | 2212 ++++++++ .../test-markdown-element-attributes.html | 134 + .../test/test-markdown-element-attributes.js | 46 + .../test/test-markdown-slide-attributes.html | 128 + .../test/test-markdown-slide-attributes.js | 47 + .../reveal.js/test/test-markdown.html | 52 + .../reveal.js/test/test-markdown.js | 15 + .../reveal.js/test/test-pdf.html | 83 + .../DecisionTrees/reveal.js/test/test-pdf.js | 15 + .../DecisionTrees/reveal.js/test/test.html | 85 + doc/src/DecisionTrees/reveal.js/test/test.js | 589 +++ 194 files changed, 39006 insertions(+), 867 deletions(-) create mode 100644 doc/src/DecisionTrees/DecisionTrees-bs.html create mode 100644 doc/src/DecisionTrees/DecisionTrees-minted.pdf create mode 100644 doc/src/DecisionTrees/DecisionTrees-plain-minted.tex create mode 100644 doc/src/DecisionTrees/DecisionTrees-reveal.html create mode 100644 doc/src/DecisionTrees/DecisionTrees-solarized.html create mode 100644 doc/src/DecisionTrees/DecisionTrees.html create mode 100644 doc/src/DecisionTrees/DecisionTrees.ipynb create mode 100644 doc/src/DecisionTrees/DecisionTrees.p.tex create mode 100644 doc/src/DecisionTrees/DecisionTrees.tex create mode 100644 doc/src/DecisionTrees/_minted-DecisionTrees/default.pygstyle create mode 100644 doc/src/DecisionTrees/ipynb-DecisionTrees-src.tar.gz create mode 100644 doc/src/DecisionTrees/reveal.js/.gitignore create mode 100644 doc/src/DecisionTrees/reveal.js/.travis.yml create mode 100644 doc/src/DecisionTrees/reveal.js/CONTRIBUTING.md create mode 100644 doc/src/DecisionTrees/reveal.js/Gruntfile.js create mode 100644 doc/src/DecisionTrees/reveal.js/LICENSE create mode 100644 doc/src/DecisionTrees/reveal.js/README.md create mode 100644 doc/src/DecisionTrees/reveal.js/bower.json create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/cbc_footer.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/cbc_symbol.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/simula_footer.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/simula_logo.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/simula_symbol.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/uio_footer.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/images/uio_symbol.png create mode 100644 doc/src/DecisionTrees/reveal.js/css/print/paper.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/print/pdf.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/reveal.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/reveal.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/README.md create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/beige.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/beigesmall.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/black.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/blood.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/cbc.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/darkgray.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/default.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/league.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/moon.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/night.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/serif.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/simple.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/simula.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/sky.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/solarized.css create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/beige.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/beigesmall.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/black.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/blood.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/cbc.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/darkgray.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/default.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/league.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/moon.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/night.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/serif.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/simple.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/simula.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/sky.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/solarized.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/source/white.scss create mode 100644 doc/src/DecisionTrees/reveal.js/css/theme/white.css create mode 100644 doc/src/DecisionTrees/reveal.js/index.html create mode 100644 doc/src/DecisionTrees/reveal.js/js/reveal.js create mode 100644 doc/src/DecisionTrees/reveal.js/lib/css/zenburn.css create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/league-gothic/LICENSE create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/league-gothic/league-gothic.css create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/league-gothic/league-gothic.eot create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/league-gothic/league-gothic.ttf create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/league-gothic/league-gothic.woff create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/LICENSE create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.eot create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.ttf create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-italic.woff create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.eot create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.ttf create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-regular.woff create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.eot create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.ttf create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibold.woff create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 doc/src/DecisionTrees/reveal.js/lib/font/source-sans-pro/source-sans-pro.css create mode 100644 doc/src/DecisionTrees/reveal.js/lib/js/classList.js create mode 100644 doc/src/DecisionTrees/reveal.js/lib/js/head.min.js create mode 100644 doc/src/DecisionTrees/reveal.js/lib/js/html5shiv.js create mode 100644 doc/src/DecisionTrees/reveal.js/package.json create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/highlight/highlight.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/leap/leap.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/markdown/example.html create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/markdown/example.md create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/markdown/markdown.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/markdown/marked.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/math/math.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/multiplex/client.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/multiplex/index.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/multiplex/master.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/notes-server/client.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/notes-server/index.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/notes-server/notes.html create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/notes/notes.html create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/notes/notes.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/print-pdf/print-pdf.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/remotes/remotes.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/search/search.js create mode 100644 doc/src/DecisionTrees/reveal.js/plugin/zoom-js/zoom.js create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/assets/image1.png create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/assets/image2.png create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/barebones.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/embedded-media.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/math.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/slide-backgrounds.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/examples/slide-transitions.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/qunit-1.12.0.css create mode 100644 doc/src/DecisionTrees/reveal.js/test/qunit-1.12.0.js create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-markdown-element-attributes.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-markdown-element-attributes.js create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-markdown-slide-attributes.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-markdown-slide-attributes.js create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-markdown.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-markdown.js create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-pdf.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/test-pdf.js create mode 100644 doc/src/DecisionTrees/reveal.js/test/test.html create mode 100644 doc/src/DecisionTrees/reveal.js/test/test.js diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html index cfc8c9a63..263295b72 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs000.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html index ce0cd4709..79fbfc13e 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs001.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html index 826c588f6..54da0e0de 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs002.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html index 7227d3372..12f9d3166 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs003.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html index 95963bdbe..18a6fbe9b 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs004.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html index 7c89669c1..1a1bd8838 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs005.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html index d66b98492..500fbf4fa 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs006.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html index 0127d1301..d511cd5de 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs007.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html index 212fcf49e..11194998e 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs008.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html index 697c502e2..eb5aa5671 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs009.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html index d255f36e7..85b95dded 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs010.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html index 88e444f30..4be724e7f 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs011.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html index 2809ab887..72a1783d5 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs012.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html index 4f42c7a2b..3b717abff 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs013.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html index 02016f7be..c12a0d38c 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs014.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html index 7fd9c8230..8b6cf4b08 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs015.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html index 8c7b4e80d..60adf1836 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs016.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html index 904e184ad..d35ad431d 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs017.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html index 644fe7bbb..f1b07f07e 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs018.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html index 8d2a18b42..528dedd74 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs019.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html index a1a708d79..715646b0a 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs020.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html index c0c27cf60..a050b8b34 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs021.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html index cf1324afa..0177f1aae 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs022.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html index 1e3e04676..eea8b3d83 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs023.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html index 4be1ac486..9b371bc57 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs024.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html index b6806a8e1..0120d48af 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs025.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html index 7ab79cd45..b0014d62f 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs026.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html index 785b455fa..e19d0024e 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs027.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html index 7755c7d4d..62f8fa987 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs028.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html index ed615163d..fad03ce5d 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs029.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html index f7faa8f50..3431c71d4 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs030.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html index 5c6217b3f..62a37dcb0 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs031.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs032.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs032.html index 711b9c8e6..42345f6bb 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs032.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs032.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs033.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs033.html index d1b16089b..89a1e8210 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs033.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs033.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs034.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs034.html index 04be98f42..b3329a307 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs034.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs034.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs035.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs035.html index 0750e65bb..09eed4d06 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs035.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs035.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs036.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs036.html index f234a1f54..21fd02d4b 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs036.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs036.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs037.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs037.html index da7b2e0c1..33e9ecf58 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs037.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs037.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs038.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs038.html index 3b1d454d3..cc87226ec 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs038.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs038.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs039.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs039.html index c5850d1bb..f08ea8d23 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs039.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs039.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs040.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs040.html index b63ab6261..c3d1f4f4d 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs040.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs040.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs041.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs041.html index dbd2fe7c9..d2471d168 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs041.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs041.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs042.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs042.html index 9483dcfa1..795ef5233 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs042.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs042.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs043.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs043.html index 45f547496..459bb57ff 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs043.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs043.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs044.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs044.html index 7e7fe255f..757cecffe 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs044.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs044.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • @@ -240,74 +240,61 @@ MathJax.Hub.Config({ -

    Random Forests Compared with other Methods on the Cancer Data

    +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    +

    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
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
     
    -# Load the data
    -cancer = load_breast_cancer()
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
     
    -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)))
     
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
     
    -from sklearn.ensemble import RandomForestClassifier
    -from sklearn.preprocessing import LabelEncoder
    -from sklearn.model_selection import cross_validate
    -# Data set not specificied
    -#Instantiate the model with 500 trees and entropy as splitting criteria
    -Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy")
    -Random_Forest_model.fit(X_train_scaled, y_train)
    -#Cross validation
    -accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']
    -print(accuracy)
    -print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test)))
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
     
    -
    -import scikitplot as skplt
    -y_pred = Random_Forest_model.predict(X_test_scaled)
    -skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
    -plt.show()
    -y_probas = Random_Forest_model.predict_proba(X_test_scaled)
    -skplt.metrics.plot_roc(y_test, y_probas)
    -plt.show()
    -skplt.metrics.plot_cumulative_gain(y_test, y_probas)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
     plt.show()
     

    diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs045.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs045.html index 4372127c9..17be7fe3c 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs045.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs045.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({

  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • @@ -240,24 +240,75 @@ MathJax.Hub.Config({ -

    Compare Bagging on Trees with Random Forests

    +

    Random Forests Compared with other Methods on the Cancer Data

    -

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

    +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
     
    -
    -
    bag_clf.fit(X_train, y_train)
    -y_pred = bag_clf.predict(X_test)
     from sklearn.ensemble import RandomForestClassifier
    -rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
    -rnd_clf.fit(X_train, y_train)
    -y_pred_rf = rnd_clf.predict(X_test)
    -np.sum(y_pred == y_pred_rf) / len(y_pred) 
    +from sklearn.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +# Data set not specificied
    +#Instantiate the model with 500 trees and entropy as splitting criteria
    +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy")
    +Random_Forest_model.fit(X_train_scaled, y_train)
    +#Cross validation
    +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']
    +print(accuracy)
    +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test)))
    +
    +
    +import scikitplot as skplt
    +y_pred = Random_Forest_model.predict(X_test_scaled)
    +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
    +plt.show()
    +y_probas = Random_Forest_model.predict_proba(X_test_scaled)
    +skplt.metrics.plot_roc(y_test, y_probas)
    +plt.show()
    +skplt.metrics.plot_cumulative_gain(y_test, y_probas)
    +plt.show()
     

    diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs046.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs046.html index 09ecd3191..04cbb3018 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs046.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs046.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({

  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • @@ -240,62 +240,24 @@ MathJax.Hub.Config({ -

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    - +

    Compare Bagging on Trees with Random Forests

    -

    import matplotlib.pyplot as plt
    -import numpy as np
    -from sklearn.model_selection import train_test_split
    -from sklearn.pipeline import make_pipeline
    -from sklearn.utils import resample
    -from sklearn.ensemble import RandomForestRegressor
    +
    bag_clf = BaggingClassifier(
    +    DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
    +    n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)
    +
    +

    -np.random.seed(2018) - -n = 100 -n_boostraps = 100 -maxdegree = 14 - -# Make data set. -x = np.linspace(-3, 3, n).reshape(-1, 1) -y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) -error = np.zeros(maxdegree) -bias = np.zeros(maxdegree) -variance = np.zeros(maxdegree) -polydegree = np.zeros(maxdegree) -X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) - -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) - -for degree in range(maxdegree): - model = RandomForestRegressor() - y_pred = np.empty((y_test.shape[0], n_boostraps)) - for i in range(n_boostraps): - x_, y_ = resample(X_train_scaled, y_train) - model.fit(x_, y_.ravel()) - y_pred[:, i] = model.predict(X_test_scaled).ravel() - - polydegree[degree] = degree - error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) - bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) - variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) - print('Polynomial degree:', degree) - print('Error:', error[degree]) - print('Bias^2:', bias[degree]) - print('Var:', variance[degree]) - print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) - -plt.plot(polydegree, error, label='Error') -plt.plot(polydegree, bias, label='bias') -plt.plot(polydegree, variance, label='Variance') -plt.legend() -plt.show() + +

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

    diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs047.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs047.html index 2c10930ed..2eb3e3331 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs047.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs047.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({

  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs048.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs048.html index 633771aec..307d7d155 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs048.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs048.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs049.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs049.html index 0a56c63ac..720cd6745 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs049.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs049.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs050.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs050.html index c12d3cb33..b0f46a328 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs050.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs050.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs051.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs051.html index cbbe511d6..89e47b91f 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs051.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs051.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs052.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs052.html index 5b430bec9..61212693a 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs052.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs052.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs053.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs053.html index 6dabddbf2..255a7b826 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs053.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs053.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs054.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs054.html index 7f4292f42..0178c6e44 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs054.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs054.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs055.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs055.html index e5de741a6..00eaee4c4 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs055.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs055.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs056.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs056.html index 93ffabf9c..7d8c8d74c 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs056.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs056.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/._DecisionTrees-bs057.html b/doc/pub/DecisionTrees/html/._DecisionTrees-bs057.html index 08bf5350e..6a1d2bd8b 100644 --- a/doc/pub/DecisionTrees/html/._DecisionTrees-bs057.html +++ b/doc/pub/DecisionTrees/html/._DecisionTrees-bs057.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/DecisionTrees-bs.html b/doc/pub/DecisionTrees/html/DecisionTrees-bs.html index cfc8c9a63..263295b72 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees-bs.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees-bs.html @@ -104,16 +104,16 @@ Automatically generated HTML file from DocOnce source ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -211,9 +211,9 @@ MathJax.Hub.Config({
  • Changing the Level of the Decision Tree
  • Random forests
  • Random Forest Algorithm
  • -
  • Random Forests Compared with other Methods on the Cancer Data
  • -
  • Compare Bagging on Trees with Random Forests
  • -
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Bootstrap with Random Forests Instead of a Single Tree, own Bagging
  • +
  • Random Forests Compared with other Methods on the Cancer Data
  • +
  • Compare Bagging on Trees with Random Forests
  • Boosting, a Bird'e Eye
  • Adaptive boosting: AdaBoost, Basic Algorithm
  • Basic Steps of AdaBoost
  • diff --git a/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html b/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html index debbea6c2..0d1365a1e 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees-reveal.html @@ -1914,7 +1914,68 @@ We will grow of forest of say \( M \) trees.
    -

    Random Forests Compared with other Methods on the Cancer Data

    +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
    +
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +
    + + +
    +

    Random Forests Compared with other Methods on the Cancer Data

    @@ -1988,7 +2049,7 @@ plt.show()

    -

    Compare Bagging on Trees with Random Forests

    +

    Compare Bagging on Trees with Random Forests

    @@ -2010,67 +2071,6 @@ np.sum(y_pred == y_pred_rf) / len(y_pred)

    -
    -

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    - -

    - - -

    import matplotlib.pyplot as plt
    -import numpy as np
    -from sklearn.model_selection import train_test_split
    -from sklearn.pipeline import make_pipeline
    -from sklearn.utils import resample
    -from sklearn.ensemble import RandomForestRegressor
    -
    -np.random.seed(2018)
    -
    -n = 100
    -n_boostraps = 100
    -maxdegree = 14
    -
    -# Make data set.
    -x = np.linspace(-3, 3, n).reshape(-1, 1)
    -y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    -error = np.zeros(maxdegree)
    -bias = np.zeros(maxdegree)
    -variance = np.zeros(maxdegree)
    -polydegree = np.zeros(maxdegree)
    -X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    -
    -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)
    -
    -for degree in range(maxdegree):
    -    model = RandomForestRegressor()
    -    y_pred = np.empty((y_test.shape[0], n_boostraps))
    -    for i in range(n_boostraps):
    -        x_, y_ = resample(X_train_scaled, y_train)
    -        model.fit(x_, y_.ravel())
    -        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    -
    -    polydegree[degree] = degree
    -    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    -    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    -    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    -    print('Polynomial degree:', degree)
    -    print('Error:', error[degree])
    -    print('Bias^2:', bias[degree])
    -    print('Var:', variance[degree])
    -    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    -
    -plt.plot(polydegree, error, label='Error')
    -plt.plot(polydegree, bias, label='bias')
    -plt.plot(polydegree, variance, label='Variance')
    -plt.legend()
    -plt.show()
    -
    -
    - -

    Boosting, a Bird'e Eye

    diff --git a/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html b/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html index b220f97f4..1d6e730c8 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees-solarized.html @@ -124,16 +124,16 @@ div { text-align: justify; text-justify: inter-word; } ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -1904,7 +1904,67 @@ We will grow of forest of say \( M \) trees.









    -

    Random Forests Compared with other Methods on the Cancer Data

    +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
    +
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Random Forests Compared with other Methods on the Cancer Data

    @@ -1977,7 +2037,7 @@ plt.show()











    -

    Compare Bagging on Trees with Random Forests

    +

    Compare Bagging on Trees with Random Forests

    @@ -1999,66 +2059,6 @@ np.sum(y_pred == y_pred_rf) / len(y_pred)











    -

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    - -

    - - -

    import matplotlib.pyplot as plt
    -import numpy as np
    -from sklearn.model_selection import train_test_split
    -from sklearn.pipeline import make_pipeline
    -from sklearn.utils import resample
    -from sklearn.ensemble import RandomForestRegressor
    -
    -np.random.seed(2018)
    -
    -n = 100
    -n_boostraps = 100
    -maxdegree = 14
    -
    -# Make data set.
    -x = np.linspace(-3, 3, n).reshape(-1, 1)
    -y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    -error = np.zeros(maxdegree)
    -bias = np.zeros(maxdegree)
    -variance = np.zeros(maxdegree)
    -polydegree = np.zeros(maxdegree)
    -X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    -
    -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)
    -
    -for degree in range(maxdegree):
    -    model = RandomForestRegressor()
    -    y_pred = np.empty((y_test.shape[0], n_boostraps))
    -    for i in range(n_boostraps):
    -        x_, y_ = resample(X_train_scaled, y_train)
    -        model.fit(x_, y_.ravel())
    -        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    -
    -    polydegree[degree] = degree
    -    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    -    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    -    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    -    print('Polynomial degree:', degree)
    -    print('Error:', error[degree])
    -    print('Bias^2:', bias[degree])
    -    print('Var:', variance[degree])
    -    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    -
    -plt.plot(polydegree, error, label='Error')
    -plt.plot(polydegree, bias, label='bias')
    -plt.plot(polydegree, variance, label='Variance')
    -plt.legend()
    -plt.show()
    -
    -

    -









    -

    Boosting, a Bird'e Eye

    diff --git a/doc/pub/DecisionTrees/html/DecisionTrees.html b/doc/pub/DecisionTrees/html/DecisionTrees.html index 98e5b068e..e66d392b2 100644 --- a/doc/pub/DecisionTrees/html/DecisionTrees.html +++ b/doc/pub/DecisionTrees/html/DecisionTrees.html @@ -129,16 +129,16 @@ div { text-align: justify; text-justify: inter-word; } ('Changing the Level of the Decision Tree', 2, None, '___sec40'), ('Random forests', 2, None, '___sec41'), ('Random Forest Algorithm', 2, None, '___sec42'), - ('Random Forests Compared with other Methods on the Cancer Data', + ('Bootstrap with Random Forests Instead of a Single Tree, own ' + 'Bagging', 2, None, '___sec43'), - ('Compare Bagging on Trees with Random Forests', + ('Random Forests Compared with other Methods on the Cancer Data', 2, None, '___sec44'), - ('Bootstrap with Random Forests Instead of a Single Tree, own ' - 'Bagging', + ('Compare Bagging on Trees with Random Forests', 2, None, '___sec45'), @@ -1909,7 +1909,67 @@ We will grow of forest of say \( M \) trees.









    -

    Random Forests Compared with other Methods on the Cancer Data

    +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
    +
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Random Forests Compared with other Methods on the Cancer Data

    @@ -1982,7 +2042,7 @@ plt.show()











    -

    Compare Bagging on Trees with Random Forests

    +

    Compare Bagging on Trees with Random Forests

    @@ -2004,66 +2064,6 @@ np.sum(y_pred =











    -

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    - -

    - - -

    import matplotlib.pyplot as plt
    -import numpy as np
    -from sklearn.model_selection import train_test_split
    -from sklearn.pipeline import make_pipeline
    -from sklearn.utils import resample
    -from sklearn.ensemble import RandomForestRegressor
    -
    -np.random.seed(2018)
    -
    -n = 100
    -n_boostraps = 100
    -maxdegree = 14
    -
    -# Make data set.
    -x = np.linspace(-3, 3, n).reshape(-1, 1)
    -y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    -error = np.zeros(maxdegree)
    -bias = np.zeros(maxdegree)
    -variance = np.zeros(maxdegree)
    -polydegree = np.zeros(maxdegree)
    -X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    -
    -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)
    -
    -for degree in range(maxdegree):
    -    model = RandomForestRegressor()
    -    y_pred = np.empty((y_test.shape[0], n_boostraps))
    -    for i in range(n_boostraps):
    -        x_, y_ = resample(X_train_scaled, y_train)
    -        model.fit(x_, y_.ravel())
    -        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    -
    -    polydegree[degree] = degree
    -    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    -    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    -    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    -    print('Polynomial degree:', degree)
    -    print('Error:', error[degree])
    -    print('Bias^2:', bias[degree])
    -    print('Var:', variance[degree])
    -    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    -
    -plt.plot(polydegree, error, label='Error')
    -plt.plot(polydegree, bias, label='bias')
    -plt.plot(polydegree, variance, label='Variance')
    -plt.legend()
    -plt.show()
    -
    -

    -









    -

    Boosting, a Bird'e Eye

    diff --git a/doc/pub/DecisionTrees/ipynb/DataFiles/cancer.dot b/doc/pub/DecisionTrees/ipynb/DataFiles/cancer.dot index a8bce3417..4d258be18 100644 --- a/doc/pub/DecisionTrees/ipynb/DataFiles/cancer.dot +++ b/doc/pub/DecisionTrees/ipynb/DataFiles/cancer.dot @@ -6,15 +6,15 @@ edge [fontname=helvetica] ; 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="area error <= 48.975\ngini = 0.008\nsamples = 242\nvalue = [[241, 1]\n[1, 241]]", fillcolor="#e58139fb"] ; +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="mean area <= 469.25\ngini = 0.444\nsamples = 3\nvalue = [[2, 1]\n[1, 2]]", fillcolor="#e5813913"] ; +5 [label="texture error <= 1.938\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"] ; +6 [label="gini = 0.0\nsamples = 2\nvalue = [[2, 0]\n[0, 2]]", fillcolor="#e58139ff"] ; 5 -> 6 ; -7 [label="gini = 0.0\nsamples = 2\nvalue = [[2, 0]\n[0, 2]]", fillcolor="#e58139ff"] ; +7 [label="gini = 0.0\nsamples = 1\nvalue = [[0, 1]\n[1, 0]]", fillcolor="#e58139ff"] ; 5 -> 7 ; 8 [label="mean texture <= 20.84\ngini = 0.397\nsamples = 11\nvalue = [[8, 3]\n[3, 8]]", fillcolor="#e581392c"] ; 2 -> 8 ; @@ -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="mean texture <= 16.22\ngini = 0.278\nsamples = 6\nvalue = [[1, 5]\n[5, 1]]", fillcolor="#e581396b"] ; +11 [label="area error <= 13.475\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 area <= 964.4\ngini = 0.375\nsamples = 16\nvalue = [[12, 4]\n[4, 12]]", fillcolor="#e5813938"] ; +15 [label="worst concavity <= 0.318\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 fractal dimension <= 0.054\ngini = 0.32\nsamples = 5\nvalue = [[1, 4]\n[4, 1]]", fillcolor="#e5813955"] ; +17 [label="mean concavity <= 0.07\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 ; @@ -42,7 +42,7 @@ edge [fontname=helvetica] ; 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"] ; +21 [label="compactness error <= 0.016\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 ; diff --git a/doc/pub/DecisionTrees/ipynb/DataFiles/cancer.png b/doc/pub/DecisionTrees/ipynb/DataFiles/cancer.png index 22ae432a03c841dfc34de7df2ada031d576d0157..98014cc9c4f87884d2ee399136c4e95bedb8df7c 100644 GIT binary patch literal 221592 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%0DUoYjBZ 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 literal 223889 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 z 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

    wCR5i#`QU?Tik8b$ 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 diff --git a/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb b/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb index 6353b4ab0..1161b80b6 100644 --- a/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb +++ b/doc/pub/DecisionTrees/ipynb/DecisionTrees.ipynb @@ -1935,7 +1935,7 @@ "\n", "4. Output then the ensemble of trees $\\{T_m\\}_1^{M}$ and make predictions for either a regression type of problem or a classification type of problem. \n", "\n", - "## Random Forests Compared with other Methods on the Cancer Data" + "## Bootstrap with Random Forests Instead of a Single Tree, own Bagging" ] }, { @@ -1945,6 +1945,75 @@ "collapsed": false }, "outputs": [], + "source": [ + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.utils import resample\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "\n", + "np.random.seed(2018)\n", + "\n", + "n = 100\n", + "n_boostraps = 100\n", + "maxdegree = 14\n", + "\n", + "# Make data set.\n", + "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", + "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", + "error = np.zeros(maxdegree)\n", + "bias = np.zeros(maxdegree)\n", + "variance = np.zeros(maxdegree)\n", + "polydegree = np.zeros(maxdegree)\n", + "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", + "\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "for degree in range(maxdegree):\n", + " model = RandomForestRegressor()\n", + " y_pred = np.empty((y_test.shape[0], n_boostraps))\n", + " for i in range(n_boostraps):\n", + " x_, y_ = resample(X_train_scaled, y_train)\n", + " model.fit(x_, y_.ravel())\n", + " y_pred[:, i] = model.predict(X_test_scaled).ravel()\n", + "\n", + " polydegree[degree] = degree\n", + " error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", + " bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", + " variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", + " print('Polynomial degree:', degree)\n", + " print('Error:', error[degree])\n", + " print('Bias^2:', bias[degree])\n", + " print('Var:', variance[degree])\n", + " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", + "\n", + "plt.plot(polydegree, error, label='Error')\n", + "plt.plot(polydegree, bias, label='bias')\n", + "plt.plot(polydegree, variance, label='Variance')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Random Forests Compared with other Methods on the Cancer Data" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -2022,7 +2091,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -2035,7 +2104,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -2050,75 +2119,6 @@ "np.sum(y_pred == y_pred_rf) / len(y_pred)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Bootstrap with Random Forests Instead of a Single Tree, own Bagging" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.pipeline import make_pipeline\n", - "from sklearn.utils import resample\n", - "from sklearn.ensemble import RandomForestRegressor\n", - "\n", - "np.random.seed(2018)\n", - "\n", - "n = 100\n", - "n_boostraps = 100\n", - "maxdegree = 14\n", - "\n", - "# Make data set.\n", - "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", - "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", - "error = np.zeros(maxdegree)\n", - "bias = np.zeros(maxdegree)\n", - "variance = np.zeros(maxdegree)\n", - "polydegree = np.zeros(maxdegree)\n", - "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", - "\n", - "from sklearn.preprocessing import StandardScaler\n", - "scaler = StandardScaler()\n", - "scaler.fit(X_train)\n", - "X_train_scaled = scaler.transform(X_train)\n", - "X_test_scaled = scaler.transform(X_test)\n", - "\n", - "for degree in range(maxdegree):\n", - " model = RandomForestRegressor()\n", - " y_pred = np.empty((y_test.shape[0], n_boostraps))\n", - " for i in range(n_boostraps):\n", - " x_, y_ = resample(X_train_scaled, y_train)\n", - " model.fit(x_, y_.ravel())\n", - " y_pred[:, i] = model.predict(X_test_scaled).ravel()\n", - "\n", - " polydegree[degree] = degree\n", - " error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", - " bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", - " variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", - " print('Polynomial degree:', degree)\n", - " print('Error:', error[degree])\n", - " print('Bias^2:', bias[degree])\n", - " print('Var:', variance[degree])\n", - " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", - "\n", - "plt.plot(polydegree, error, label='Error')\n", - "plt.plot(polydegree, bias, label='bias')\n", - "plt.plot(polydegree, variance, label='Variance')\n", - "plt.legend()\n", - "plt.show()" - ] - }, { "cell_type": "markdown", "metadata": {}, diff --git a/doc/pub/DecisionTrees/ipynb/ipynb-DecisionTrees-src.tar.gz b/doc/pub/DecisionTrees/ipynb/ipynb-DecisionTrees-src.tar.gz index e1351e4b1c57dcdeece9a9ea51ebfb66af4722a7..0ff487d36292b6af24323c88adb0fa4b5eb3d383 100644 GIT binary patch delta 29 lcmZ4cQ*iB1K{okr4u-4Zjcl!KjIC@;t!&I&*;tm>005ib2_pai delta 29 kcmZ4cQ*iB1K{okr4hBonMz&Tq##T0_RyO9XY%I%b0FcB8g#Z8m diff --git a/doc/pub/DecisionTrees/pdf/DecisionTrees-minted.pdf b/doc/pub/DecisionTrees/pdf/DecisionTrees-minted.pdf index 0f6cc40c4fc831e195c0e9eeae3cf7c969d280d1..6fc29fb0bfc45c85ccd51f1d6c1e80a460be0b40 100644 GIT binary patch delta 6137 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 delta 6093 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 diff --git a/doc/src/DecisionTrees/DecisionTrees-bs.html b/doc/src/DecisionTrees/DecisionTrees-bs.html new file mode 100644 index 000000000..263295b72 --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees-bs.html @@ -0,0 +1,311 @@ + + + + + + + + +Data Analysis and Machine Learning: From Decision Trees to Forests and all that + + + + + + + + + + + + + + + + + + + + + + + +

    +
    + +
    + +

     

     

     

    + + + + + + +
    +

    Data Analysis and Machine Learning: From Decision Trees to Forests and all that

    + +

    + + +

    +Morten Hjorth-Jensen [1, 2] +
    + +

    + + +

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

    +

    Nov 7, 2019

    +
    +

    + + +

    Read »

    + + +
    + +

    + +

    + + +
    + + + + + + + +
    + © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
    + + + + + + diff --git a/doc/src/DecisionTrees/DecisionTrees-minted.pdf b/doc/src/DecisionTrees/DecisionTrees-minted.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6fc29fb0bfc45c85ccd51f1d6c1e80a460be0b40 GIT binary patch literal 526688 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�H8ZT{%|#{t++YT7;%T;4Y2EDG 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 z%0D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

    *DaN|YA&a(a^b|r3>x+f$^=HR}wi0F%pNlRE$ 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

    mo~J&Bk%BqCzOCW5PMoVuK=kPXX0u2zO6 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 HvOh-LKKR6cfu41Hv9^=Ol*R1FF z>d)EB3Kx!rhgAIuxU>Hrg%xk+_&|1Y#(o`UB1Dz-DFLL#tt!-NtzGeKYIa7zz{LeO&mW zmO|%Lq|*3DjCeuI9SMvzu1K6?KwgIe>PkAaeh?4yLDT!fPpr9JTc3Z6S=6ZoA455@ zDT*Q0WP3^ZWwosy}@Euuxq;{X&rJ{?pWR2(kCyvV;lpk&@G#|A>T&89pP z_mxA^0j}{zhp3QU^Y!As5OuRSG!*l{@|wU2A}xtuB1E0?os+qW6%Y7c=3~xB+C42$ z6?(=_nueJlOGVQc<5>8|REVzgu-<=aJkaCWM&97q_ss8g=^EWkS`*te!3eGb9sF+O zQMs?2%F7kUk?zIb?N0s8RSpo@Y{QC1#=#iSx$)kaXB=Xx9%;BR~5VUsxpb z>fSy5*B(S{>6~7e_d%--ogbYoZQ$N3qzFYW^O-+qtWB_Ycyff$WA{u)P0~lyonD8E z)etr?6Y&lySQ%Q9Xl>gc<&sP^GU^ss#8q(L1}J;1pFCe+)32d6%`8XF>m|2Rm?&;< zUg8?EyQo`EpJp)!2g&2jN5WVe-wHYg3zw!i^RHh2m_Z^{%g0GPfL({K;>oP0(bsQ^ z@#K3a77!>fzZ(S%n_l(PI{0}PFH?@x2qajRMsubVYBSy1xN*Byvp8yHOYv!f9y!3d zjCahzacgxuvHH~$tv{~j+@D~n#Y0t9Auggo9it0RF1CzAa+!qJxJ-Lw73}lL(T^+w zf||jUo48~Tmfke$TCK*>715LbLT;*a%Hi|8IkW7o9EMLpOmWB#DXU(*WT_#GdtUc= zVxJdQQAsbS=qCuK83x$?)Pf;O5+lR$SVtiTG)dZnPfGFYYJ@Xpk2ML}U^iBS1>*IF z1C>`LT=%M9rZ$Z+&PmNnjY-7YoNDFPr(&EKW$D%j7P|cyC2?Zk`*x|3grH2;w)Q!k%A(>ED5U^Xb&jYG1|51+t7&iBc;rq`;{{$4ZO}EV zeo2QGir<9T4|Wp*6Wa35AD?J7(%gwdJr>hOb?af*a{!>x>^gk z$X{&DUN^F&au$$%+<uulB=k{vB6W495NUaQsabBhjaBQLVHIv-V77RhG@>wIjD`_{PEGj{`4o1t%~BdO8NLFnSC!wHqtwn ztPLz{4ubaZm&8~B#EIrjJ{54WQ`FV;5BNcQnXMk`b#;bo#2ykYf+V*SvUhM_O{6tn z(<#7Ob>Qx`I#e8Y@!1|!EW)#N-Hl!bH1dnBxcd&8ueO?J*8wC3G|X{35nA&sg)K6% z0nc4>y!IV}E!LQ8T(cwTW`I%fC~Sk5<}n%a*-tccPo39u1B-WLa$~GkL(So`WfzN^ zJ;OQHrfr&gv;5uBLPa;XgBzNbEKb{Phjaiu%tW;t=v=EylV$Ig4GTSOhgI6wD=1}N z2<|gu4XjiO^XnnCpTitfCg1t)L@Xi87bS=NTQgQ{bz&h>LhF9H!ZgH!$FHYo*t`zL ze*T#J5!MNQa6K>6iB}g;QV&_?)3ty4)yLCxaJ$%K(_5L!`>AKBy*AEDz+_DS4Lr8 z%w=1~ct|d`umXNPt>|?nGvkC0VQ17^N*8>V1v&0hI;3uokcoD;VZXhT0vICoLg&Kn z26K40QNgrUaCUJw#T)_C%7Y{5DxD73o7A+}6tmT`c+T=;qMx%ewO^hS6$-F3&?Qa0 zQv&-=(T?PHla?Qay+I-FInni=ZV0P+6N0T)1`0dhZtq#vtBs7v(Xn?tC#v@#&u6H- zNwSM0v}iK-QPG)lHMp!na_kc4#y%rQqjzIQq@`!3VV4eCFStfN05E

    bl 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 z zW5ao0Y=l6G6k*O1WdNA80EF0Z;K2xIV`TtvAn*u!45bM`0&t{u1mTE~1VaQA4n9i3 zt8syd5zUxT{5|`7G^xVCYyp3}c3}wpW+sS8B&l>i$YI1^VlxC<0bf%*l<|HM!H7Cy zR>AQjMl%5Jcrb}l#@~S%I0oR`a)R<~;^j_Qe<4O0tM2ygrzdCG#MD9#kc{Dla_2AN z2`H#yZ)r@B+bkY1tKV z_I&&={Ve0?MS~$i!a;vbrTy|XbXt)BW>G7O`23~<@X0GN2*Le25(!iI1ueAqF;=^Z zPsDR$hstVeY9Hq@dTl8hk2+R7TrElb3I%4CL`0wtK~RhrlqDw6+NKEap&;N8Lr5+d z3wX0A2xXjXA+z~TbJ9FJ{&X}1_f9}uPxKrphYY>~RiagtC<;A)pp^*Hap{{pEA0s6 z3-{GuhdL>8b7&v!eA<|VYEu`WAX#WZTQ}Lt@7{DA~bf!3lqCsOb z3kcYFBT6V!s$+y6bq$nMFhChg1J~8hSa>z+T<~~`V&+6%OuSTDFM3)s|FiIaK)p*( zA}DZPaG4Y$OdX7XD#ieqNsVp$Kv5)zw_oYq@*bcTN)`6fP&hx$tpxz-8hMi+xAF3M z^znK(2r_Y&Qp^)2`G80m@+kTF#p49Uxb+|ln3*uT+~UA;8BQe>CP&I*8)rU>bS$`f z58FTmUSh2Zq%aiFZBc!MKc*;7%dnwr`(UA>k*IGR-yPY`_k!Az<0$S(`(4lgqKWFH zQ=k^Xw>NN&?&bi-^g?8W{U`e%G5GvNB~1a@_!`nh@7#dyy{# zpWgwn*4xoTp5{EfgoKgPEs&SO z*-q^*J7^mYrHboU>)3$BdAL+Qb z>D{FWTxVOHN1B2%y$(*}?lT)qqEWs~@HI4ZoAKY0aZpIyeHOy7sC&+TH^CjF6Vtdg ztT5`?Ecd;;B=W~p6?i#H3d=XG_X{uC3NcO8x0u)lmehJyKW1K!^;}m*SEq4^(pq_G zwY1G$$nPJ6mprfCXy-5&-EP``s_ozH3Kr9i%Sbln`WR&~p59wIZFpxH4$t(d%qq4oESyT1aXZt=*^wlBgeYvoVCy~Qj|5~8nepY zay5Q54$;2I43SxIyf!que^-~fc3DRLsQ7+k_pz@mewZsNdB?{joH^Zof~9F@(+HQe zgf^VyAD=+^BpA5~KIsaPO@%hKZpe*Yl|_AYwl#Wod)k0ub$^(RUviPPkHK`CV+N}L z*9tJbpsB~SgtNI{XYKo_@wS^;2xuidC3r}=wYA*|9xa<&%)wu-!+}4xX2ZXbNB$m< zXK1y3{p+fwUwliF%vEa1XLQk@+wVn;oEjba{>e!{a;g~F-;@*CJDah%oV9BCKEwEQO}5@4a@75ut}3Y)^p={2W7)DC#H{aiDta@% zucR71n;qkNENwmEkpuNLmWVNWUv`axxKy$-IWSlyo%E|op6fG2<|w`QmW%d2%E@@? z_OjhWE_g#dh@pLzKxU(($91chFH~#vNRe9q_w@t6mYtLJX1Mc0=Fiqv*2y}zgD(3L;3Vz_w`+ULFe;`H6IDq~%8YO8Cn zvia&EBn$HD;G_G!VzF?f<7JiW!on@?;qHERWVI9b#w$cc6Po&axa4P6D>GMirT@6q z5<~XlLX8{SY z={>~Xinm+Kxq@t8LdeHMdaCG2wc_FzKcC#uuN=&FHS!P8~q zuCac2Vnny~|Iz@hOk@&POvwjP_e z#SH^Ti)HKMk1v^>*l$CY5sai4Yb@P4Mfgr$E8#4~tJ>5v@|GvGNx+H`(bde<^wzJh zg^-rZeg+beYf@fM&evEOt4lWAq*T#bjb44t(aF!{gZ4=B_U_p$+4T+0QOjJ@-h$k( zlOFi3!E*4ES;P{mvZm}grPW6_Z)@>n7@ZZDnMHosuNUBJ<$?kmo762rLD5>u@{BDN zH5qkd=dq>q%k>UJ8)))o`bc#n+Pd%k(-Q94m&R#BM&`z=F1HCNP1ZLSfre7+L;LL* zs|XpgoL)HHrp6k}@92H$9-ty74*h?Mmn{DwUNZgo%$1pxspMBvDeE)LUA1=0k3?w@UdPbL*l1%OK!IRYUMBEVm3-^bFw zh?Nf)2JsFj3AD3si!h7|1K2RAWLz-2TdS|dwJrqfD?1w|3BSRp z4e%#F1$cRB1`q~7uo{q3`>!?tY&qFB1Xw*k0f1CI&in!xKnvh`Ak065@53f1fQXF@ z4-Jkgt-Aq^o0(bpWncUF-}Ao|jsVBSEY2r@_&#v{g}JdeLw-64AhUa^!1)ExuY6Ad z;Jn3EQrfyL zz&ykh|D@BL17eVJfm;T@1Ymd|R|Tawr7HXO$Kf6@c0P`VcT6fP&Tg z0rdFOJFxoqTVTKb)fvBp5J2OdU7fs7^1p3U&wMsNGCE*TevHUsdVcw5d~9IB?OpF* zHmtwj>#FkMSnIH-FKQwP{a{xRp8B^h^-T1~Z8AEVLK*_PVrfdSwLB1IoG83F5NOlT zFI*o5xy{*`==|c!0R7Ov+~>-;hBVMFj)6_CL!Rh)*yy}u=*ufvpMDVAfI!c|Z$JOV z*f|7Q(y-mOY}>YN+f`k*ZQHhO8(p?-+qUi7lP}^9-oZc2GtbDgpV(_J`Z`z)Lz~CH zpjK{Xw!9E)!??vXuXQ+Wke6}OXdu9M00MLX@o6czufmtR6CMnYeChkd_pdIYT)@`; zv9<($e_(CxBERQ+PgU~0dNJV|J?TfFk_v8 zxIX>xAN(S|0zLI*i2`3-fH;4J!C#dEyZ~uf1sJHh`oX@_f9jPK6Sl+>0Fc)Kpu_hf z?CRllhb^8!q_KWk0`Y6x!uuBZz3oLdJNo-?Z2ZB2lfc+{8rWNCm8_WTlx9-tIIEedvU)X0zNzr5N^)3|1TqC-(bz2*<)Nt8o2K4i5-I6 z`imVxuKp`K1Uc*vc5q|MFLv;v>l-r$9zg5i;KI+FDBzZy9|1iNz(W}AF0k`&7Pj2f zdmMHxl&x7lH4Kb%6WHdL!Ph37BdBoAZz@#Tds!Voc4`*!+_l{-Apg{spB*Uq$vZe7 z!~F+#@a?}l*q7b31+VsauN_7%Khf7}=LP#pK)VpG0Da%e9sBdH(B6PEs2ApAUmdt^ z8}85RtzPNxvj6?;^h>KXCT4jWJvl$Vf0BIssevGoJ>~t|uUhG{9(~L%I`UWb7dHRa z8UVr=v~fst6F@T(e7(FEzA7Gp9*auA1jU4lf+&?qexiRvGUu|GC|z2wApF0xPXi@I zR0T$5DTygo`~#ArWgmvnfqUyp_Lu8J+4G}WRv*AK02PnN`8H5UMx?p5Ib42HDLZ4Bc!~T@= zc7JF%OdcwAontJuv_2v+!B2k0@y6L)BX|8H(5O9*Err-I|}p!l$LO_kjb%rk48>&DuJ z5zhwRdd{3l#N9L6B=pGW`G6LTcEwN(^2B}iX%H8|3X9Zk^uN63ZyVRnS_uhF%H!h9 z8Pj6eIW%iUSX0Q5nHQTNz9+9m;yov+U`f;SG=HoCA~o7|d><3f!v$z4M>%t$=1e71 zDNxo)2uQZJ#$?pTzh|;_GqQrTSPGAS9#|D~rY#6&(%Lxzj=?~NIgJk$ zq{be2g^o&fpLK*Q3l)D$6!PrTro5J?v2IyksbJN*BWjU(%8Y|EstZckZVqSbj1unN zH(wbd3#Sf7%|r%pY`A)rB7o(emPgR*%aUQN^{1I2Cu?1kLS5rYg-`U-4!z}d|89a3 zcrNl~l^OTV5P$TT<74FIp*aDyov3(>X1RjjFBackDl7GtV}14TDwO5ae!TmpT>UY5 z6!}|ekhE_?M89AZ5EJ{@zxrW;O%{XCxjq$?C_yv^PlG|yns{zhMjA$CBP9KXS-crf z1-OC=(aVNon~_1HfD)eJr(!SGm8bed^e%~q>3oN5_Hu2s@=PRZe{8>?sVs|v*Qh8k zUghERds04odI-pn^Lb_uZw`9EBWIFwS{WVg4#-h=C6|F)Ntuu99LglwL_f!!(kj2UCr|tQ- zZ~o|FPx%@=vRm(4gFm+dg0?E(Os{@>8lzNCOU{nU5vSHtnV)Tv(7USGne*}ac(J>( zl_N;9W;iRL<+2QL!uI^J{G3f?7{$Sj-YR`loWHr7;V-3Os^CJ*ztfhTk?M{f&NM9c zV<;840l<8!(D}4l<17!Xrd(d@<;Ph1FqAQA((RG9 z{fxk(qM9-sfOmpmsB|-Ntj#1%F-iS*jS}G+f87Ia)l$ip+=M>40go58tnB$55(-9| z{sJOOxj)yO10Xc1rGJ8K3Jj(*N!jN!KaZ~s^oA;vIxk4!Ibo@z(luOnB_LKilj76y zRDjWEka|SU^sqAG9d0&-3{+3DO>K?-BWpsSIYQ zHc?TOZ&F*}7>vJ0N$#+?Q=z$a3kvLnH&fg?zXlD&j5^C?F+qvWzOx-v0oNg1N0T3i zXyNyx&Q0h&!{nE&_D#`X^^85oZm)pYJi`3pTE#ewuOoj)3LBYvh#Ah`^|X_y?T=8C zb&nlx5zqaKU-L1nNHzpiRkPh;?uZlLmBfAsljz_5)3j|t4|==DFAc{x^v*qTjVgD%QBi~ zJ3Jl#rh0(7I!j@TGJn0bWexx#mge{%{AyOFD@QGxEvM3)*u-6Hg1jxMyX6~y?n?I~ zBODmNko%e%RK^rr(R__P6RxhwKWV?~Jb!Pf?6LF_x>hLx_14LQ2poHzytLdL1(U?t z4B>dQ6eeyILB_(RmrdP>VU{)Q0NmlVTp2GjDlU6 zvdnHG$iQ&^b{wK@w25GxbPoz^#nP!hQCB6Rb(X^K8y>s13?N)==8`aTo2gsrM34*_4JldM{xvJ00rv;bp#kZTvFh$`6ZHcOqb`#9^QxtOvL9!t&j5@=8} zpQzUn@A{|}gz3P)L$Y!uwYt;)`IE;+iEUkLv1fmPERF^sM%) zbXV(j01v1fT~&_Tg_+=t$=evqUQ)qigt^OmoQFd@R9}#IglEZKF3ypCJ->*9nwP3j zLt$Jtkk8xrF!9FUKRhnmDGlVbSo#8ykb13?#oucs_|V<3=S$JGMF>7=IQ4G#*?)BH z*;30Xs!csG4Sf6~ez0J^uhXygUDul3xc*)^HzDr6_{57Mx0}nGYpA~QG2tyuB;$fB zO!+CBcrcxEEb0!I>FzxDEe%xgKyr$wl33(BARcMju4SQ3DX&^=nFQ5M`t0sT6+)X~ zH9Jv{*~^0Ez__@-vsCM={O>b#V9ie2EJnUY+MYi4oWENOA%*3t47fTQg4E0rLJ8uJ z*Vz^Qze=5$FBeAl?t-oIBS$C-W+#JS3oRl}4tX+eGj{^2B8Lw6{|+!1}?YJG8)GkeWWNek2KLs6vVCuj5o1zig5m1WrQ;jCKSwvh!a!{2r} zMWT6ppVp-O5iBHDk|WHgaOJRR49P2{sxz3vP*n*@J?W`rx`IXC@l?ov@`ZQhbWke$ zmOXJ?QoyN(d|d#a>*}GVGHT11*cheB+6VY`V`~h}fAi%HtluX|o7Y-tU$HhYoVzM{ zGSDG$*h!>xl#JI0rJBg|Z`4hn)0kD<4@c4r#~Jh|vLxQOEV@TCE_WH12%bm$e)B(5 zPThBjg($(n9M7_aHo}w!)KmfUwpA5Qow$%H=s69%s^kbuuL0ZyFjUyl6(QK(_L!sD zc?zwVVh`u30L)U2TaA3*oT;ZF$g$nS3mo6pT|F&P;WVYdz9XaCz8wo3GK7GJP0%Gf+vHj4D^)6Yo(Log_f#IU{#I8AAP zLqRTxJ<*UL^`4u|JtgIIkD(c?dT+PVa84g;x&asA!8v2#^U)$qxC2e=!M!$(u)}VZlMq6P`%w1M@KLCN!+Ngm zWbOt-rP0+TZ!r|CwTzTvtm@ud2p^YOe4e&gsbsI@b!A+duXry7#-dJESt};T-bFqM z!w7g0Bn5Ps3k)m2E@QeU(;tu|MYA&7)g;NIfv*IpQw}BIq3*na1P1w70?R<>?RjAGC zZdLH@hp9L|;cUSdTyJXnl$E}i-5C2=)X-(0{Ztcd6NidLsTx70ZB3(-K z8+rB<{d3v6d7(P9<^S$24(u$t<@6^sor){3cv9F4M&>FWpn|Z6hu5{jAJco=0lyjs^Od^H)nH}g@A~5n_N|hXn(q@gQ{1~(H%}p4$ z*vof~Z9RMa3r(H{;VP?GsyjzwgCk7{C&O$L#l0H%U0DRIoB{5VKI@52UP}pDmlJ@y z=zS??&syH9!&b542Cnj2hga}@v(2{5-SgLH3jo(bRlZGcQSQqoW$#b;BMQWQ#5;=$ z`?LA6lA4qrPxDx&@n`f*bK;(J1&DD`y8H_|%qqwR1{_5=Q{BuE>@WrPJvHmlfa~PQ z!d5QJkzcjGB(|>=PD5u_bFqxVKkw)nl)QObV)s3W`6>wxYBOa1aNXEEHCM{8u^=!Pl6ZHl;YqA}x@Mfc_b&iju zt8PcOgvHyBxn%paj!AK~Sqeqc)m{&aaHb*p^Ys;ggx3ykn%%zDQq}UFu0cZWn7A?i z{jpZ=ED>UE>Zls)sZdb^@oo82`07>$XP60w^bB9_tk`Smld|?V#N9&6b~>KGX^MES z0lX0+)aTgg<(zhK?u3^OAN?1LA59;jxg7hw#uEdjB$V_99ZU&(ou&U|NH*Xn5r4&T zV{YuT4sA?~BmKSLT-ZCO!!2&kYHJ8xLi7%2`|~;{Y%qEHKbZ)618DT$`J$?)h>vnEjx}8pcrQ)SA5E$};%3|Ce}KBU!VS4f z;a{`YZp#U-8&alKWGmmyT;X(cc^LH>A&w&hTFMxj{O-u|ulSFhJCnJwl}yNuY3C4n z7QQ!{4@TaI^WlxhVD=w?c1l?Ql_ES~kDQ!spvfzoLOY zTeiL$L_OrVUb%>@Ii#5tT~nQ=<3KJwNpWd8;4c&%zKJ3A%#_V?LpLu9w>@$KJb%Kk zj!yV<<@r>3K8_Ody>0{6kP0KzzvDkMs`1wHZc~8Uy(VH1XlEXjvs9I)0joIAK17J5 zAn6#1>HmPR-DJGuY2UoCClyWjQB)@$uH3q+L9-$Mx%dii+_|vljU5WY%5rz`*6w_` zh6Bezk8eBzgB)4_4@Vv-x{>@%aRDXdEHO~kP6LKDml9XBrqPG?AM=e=1f~ybB2_R- zxGvI?mX(#BHiaCb%FOC|XPj~=D;9U3!X0!x_3F}NT?JPnhZ2Vx4x_^A$i> zE_>XSF1&`509mg@*5M6cw6msZROQ%U906;&6k}qp+f=ZgXUGs%Wa1wL8nTZRq`D=Q zsg3RrHhkg5THnyl-jAmA_zM)pl|dgwKU&4y4m3B5Q)c@0CVjvnO!&PM+)apJFL@tV;bgRRgq766bcgE+z3DBS=63NP6C>?jgv3=} zW3g8PSxwB7PHCCph(&X~a49JdI8g_b2~&-gMG!8pEl>hB}H zE{nu=YdLQ{EmtYSNaf=?u9!84ua_X7wcfeie%m zfIY~m(_4WWLUg?{4z9d3kWy4`wzarvZKuCLI=mr@0V=J*z$Z`jTnbv`JVmLcIbTI6 zyoAdS-Tuv|;1cwS{H$yyAsxSTwg@%ZV-`8I#KRFL!>nvVs$-2NVSH0!jM*=5(^JlAcf`hgZrAu(s5HX>ij(IyzEOkYS`UgWAIltIKn$bQvhr0`JL znpXgcjY8J`h?-wH0Z7p z$D8--eQ`ZSP>?P0)~_Nz-~{1PHl-3!?AfG9BD+W7x=+P50+Xib#%TGXhI^LmaG)|h!}9!*Eo zu=L)#+HC|iA!675vY|kwov9NJ^Ep)pgCjT7J|RB`wjczQd(rjx&(%IgJY=627>p8m z$x?4ltxw_-jIuNxoBq6A#Mih8fss6A>`#Q2eyQ~jv>d8vwxh~`njvLD8C>bW?hc3; zk8CrM2UdWhM*vUwOX43-K&QU2KZVlC%s%Z$LM9BHl-3mIoHhMQp$gCcZeD+^0=BV8 zhL7ePv#Q(bWFa>bG8^zwQ`qncySG?Tyl}dE%~58!N*7qAty+suqAId0OD1!aqkofY znlJl^ouKaE;@pQnh9OVOpfo;{eI?&#MKFRhk*bZD&C`8@uH&wOgo~S4W-DuO8rtb1 zdOJy2LAa89p@iMeMsEu>oJf}rhsaCVu)%Z)u!23sdKA`(2JFSfyfTu>{8;^*`zXTZ zI42`4`v9h7DCNE5XoUjk4hOCMX^j69;( zuW|J7k-;IKn1*6}F^8tOFGA)E`_DoxO5nZv80u*@-@@+pT7G7cr)wZQ;{xbqn2;GHU^|Mbb3u<+ zO1Ek8@23HE@>bUZWy^BCdRHAO?s;xhl!aACj}0>WA#ABufHniQA2)Ckg^<% zt6X$yysPZHozfG{MXwufjG;EuRNAS`uI^+rNYkgnlMJdVs9f6Z6~iGeW^k47XjmvW z-Tn1EoLcge7JYLUKsYAWx>El!xvP&l<~+s-u+x-T`uuB9B>x0`;8lWfoQC$iyf2w} zE69Zz@I_KmugoXU=JBU9sMRj>>a?EqDI+`iFKcHex@(PVD@I#lLNjuUyQOcth5SPS zDvltb8A^Xfs@qETA~qSpPo+f+Hea+U=*A#bwE1@=$TK1Y@F*lA?)%>#jIwv>BXZfwf9*NH;o*2_io z@jle6W1J?LfcRM+f@94cwMtJ1^!fReMY;)jQ&*PL3^b@SWks5h&yfMyQ?#&mxnM(3 zj2ET9OL)zG5nNwPli7VKg3*$a-~9X*{iX@GfepFRPBk6p&f{2>M0YQRyS_`kkZU zZ?tk`qsUdIz~__s=B*_JL{A~>_Rw{ykB_cnPL&U_wwV^LsSjUv%9(1?T{iWg4XQ#g zCl}63M1|5h%uk5&wtUOixMyd3H@KBWD01y|IyWmYvB&{(T*q#WMdq4RT;+ceR3-on>iQd zd%;0&f>>OpgsQot1IE#3^dOi9EEQ$&_jaq>(sh;jwCNqJ$~bfSWyl$mUO!TZd8S$62!EaS31K^QJ> zm&ZrFFZ@dK?UuArU_Q9SWV42H75f{hX)}ukN#mYTH}90ip_lNh(>~Nk8VQY%Ic(oG zTKfTA5!FRN=iFb^=(w9GIQr3foVCvpD0zP2maS=~e-s*LTrUdZqR#Wy9wVuMfR@_r z!muOzZcy5JnsGFUgx^M^Xf0I)P9#pzvQ6 z+D&Eg`ksrI0w~Mq#_au0bX(qe9^S(xjdsY>znnu-KBiv{Sbc1SV4|&0rq4!wc&!Gk z+VMd#aT`-n{)#y9rSf4pN(+ejkA=W8ht_qD6dY>v{8k9a=2D)Cy0La9+;vr@LWp|l zl`b*FtR{^5Vc_=ny)2xsDjtjBHmts-(F`u+vFc=n#|F_unsHfNyknDVj{B0064oE) zEhl{_G~G%*qN2`afZ%axD#TzDxu7?i=hwo}CQU*&+ayL+li9T}OUhbtxumh3;|BzLCE!}8sc zxQ$#t5e(l7ZCOn;Iu}_v8Ew@N0QsXHJ&S^>4#jzujP>o$tXEeK)u#IfR6VbApKrt_ zb$>Ir6cEFyv-H@*X^cfZ=K7dRo5->5>^3!(-6htn`P=4XlDM3F2a{o?B7TTzFFwX{ z+bZQTT+#3t@vfVRg|EYIw=?BklxKlGO<*`DtPI;v2Jc9!K>IeOC~DuGYzxdfirch_WEFbr)fsFKe7&7hTbDzaB*#Qpd0oYxH#14B3V%%N^ohumWDA6r%j zMHWX%pf3f1stZy8bXQ_w>sV{m=*!EBE{;Qn{k}FPiC1HAoReFJuP0rQpN-Gb(@E*N zVfdTb!K1hc$d3_o|KLnByx==G(`vd7WuH$o`6xNm^^?3}WQQ?FkL0k4z^_0!!fQa+ zvW$lQ*k5IFhG z_qsQ2jbDvlhTVFR|G28I-C4`1115>FdsK5NGQcZUfJeFNY@A{iTU(hTOElsr)Lp$^ zfl2>h7`aT@nd)OzTnE1Ufn}j3`~A;y#M9dAg%bX@lTlBZK_*SOvlYW4*1pu{_Q%&V zdCX%uV2=0Qb7H-TpAa6pks@6-N@yT#Snt?tqUbZ~7?0q?xgsl%qT-@-$4C!Pu%G-G1k^!*R|&sL)t(GX7iCJ%hh1liL~2uRa>*mdj4gAeDi6D;nrjL-wshyz2~&4`Dx+RxHoqKXxh!Zq09 z*}9x|Yi zXE>+bXM}*&02Xx!`+i04$pLzSqv}eSrys%NQn>_YJWVmq2>o+r=y}=|4-f<+OPCyn zNGIBEO208>056=?ZaNY^5~Q~xHk}=@c4#SvtoN-X52?|apNUGp&>DHrH`$9;?caF$ zf`CZ6)D}tcj_=3Tk-K&q^-Wnq?Se|c{9{jhzGe0*WQ}r~&%TMWl0d`Hk}7G-t6dXD z0ymJ6&Q1sC)V;1Z4X%m4i&DJt1OZU#zN0BVCH70Xo+YPB=OMQIhZP&#dAFa~Dsgy4 z@&S3W+^n}q^jybO@s8Ko(O{R`wvWtR0$UfrUWnj8o)R0mKD&qLpTQ?40cAYl8mGCs zyoOPqDGrh^Es2!OWM9PM-&L#90m_esc1i54K6~3W3Q__jgn2 zTUnjtMrUtpiNLbiOZVQ;f6a<*vj}Qp>?R6h6W~g`KUIIb-LFHcaz)_P5Fjz_E`n_c za`944vvY9r?J@ukE1pyIi!O?>s7g8(*^gk){Y#%JZc$N5a_d&+PoCTOp0Cp<{J5wj z42maf{uq|FNw!tF(5?9vioGWr5DTR7>efDM#Z^oo*0e~_#aO8N7GjYh7Ki*qQc~3O zOa_{aUTv$c)}`)zydSP!4<&TAn1oy_20g~oRY!ATT}F1x7WL#}4A3cEB%hgdXt&k9 zE;ltEQ1I_LuZPq#<(u$Mw){MBczT5)`6afeMzmz|DlEjrJ3E^Kar{O@ZhBO=kMTG= z$e#TIf>4?~{a4S8{XcqcjO+{y|7*4}5iqebGym`D|HmkpSvi^h&pkKgf4c2Y{J6wL zDoKcAcgI-m)(owAPL}A>=@OfRVy4YT=tmwauhe$3NIFI3a0*f7VnxT8$Ri}ul*vC4 zL@D;pg2%7XTxB0QyLr8u$pPxTH{CeFcH!L&>u%7{P48i)497@>!LM2Ryc$fxI zZ#2?ZT=CS1459#lW~P>r^NUUh0W!hx!m%gE2(%9VA^k*rX<=iY=|=Spat)SV zIC}%epnZY|0DOJHYyQx&k-*yf1WV)KF!~U8z#cMy;QpKdxKBVBEDKy%dtEaz`*O@f z1u+qf(9{RaX?%-OO4;)T>XApW^z{>(vQX+DdB5W};qfZFHg+HBym$tg;b&P3ar zIU;?NGXMzwHTe=#X))h`n~o@$cknDt$;5%cWnchcJRpc0d-sBZf*iFX(R=!c=;SCe z`$dm$h6E63pa5re5GejiLlOjRQse``W!PhM;Q4nN1SDW4qH=f63k)7P25XKLLAi?Pf(6S=w;UX|^a_@8e@iqLg2p~8lLytNSkWdQA=0i-l| zx~%V#t&MF1r(zxu@u-4B0KzB{g7&@P!hiIIhNo%>{KHA~-OpMBZfRi*K>JP_5tQ%G zR`g3dk_h2o)a5(>kmw2PHRSPKC1 z7X&)HqCI8ZIhat31+dcmN#$U2hZUf6;42KFQbiR2By!k)eWC&(eBlAu^@+}S46uvb z3{J#u|XGU-nW~fB0;sUhy+Jt!+xi%pc(Q$t*ULMFd0~fZEf> zdGzlrlqU?L9_Jv+N)n(8aelqu&9`lUZokyMEK4shbu3FL{b`zc;!G`dU}_rK!QLt( zS$-vr`Ou-oSLJ=Z1oW~)? z!i9311hd);tR8z#*8%R)Led(Rf+sWod4@fG9bL|r*=h^NeTl@{*^C8#X4Jq2El4$G zQ6N-{tOnKL#1?K;$FZaIiyw{?7sJkZ-d$wI3s}0wkX0)5=ZRsHO`k2Rxh&HSdi>GH zb$*Rz%tLn)>P4&1BpTiZ@6&jreI}8e_vxEsaX7YhxGfyVj)D{X%p-cp!Mx|QYK@iM zz4$baf;tQpH!7vxK84G~IB_cG?=DBmf)?s$-_>QLYmg95?E4KtPVn;px0Nozx`jW4tQO}>Bu z54chaMw}-7YtviTqCgX8#glJ03gjVf^Uzx?%*kiR8YxcXWSyzz8r9Kd+^lXVA9Ihc ziO}HKvKSxpk>@8@Nweg~)`K+RLCXi^L(I#m+w|SyzU_%D7F6TviD0JXG}0XUpT%AC z+07g$_ReCqSVy*)ON&VSK?C06najQ0WQ|_W!L_~zVQxF4r|3D4li1X1G4DfL<*Z5B zor|7&AyNC_vOT_Efy3+abn;!8H@o>(e>b&g*(Eo;+3RK4VQ!ba8rw^jo!VohdmVe& z+j-*}PZvj9nVSuF#>jEwJ9)~r6Vr_#Xtz-pFgh447gag)7ANXwg<*DmCrYMdWd`1G zk42w;O0{P0uk5X%ali8I1gLD7F!)ExKTx?jHVdB`{^XK;HvX2*C_%v?=N~;xggv|D=vu_=B>#%%QSy4zp5op&JiQ4Q?})`D37 zfF-ANlONy%VXmXaKX8sqGDZH0Oxi8a@%|*`yE+#-j^Lb0Dl|-KBs7xba>5~FAMKd; z+ITpMMc3GIPngNTA2w5WXuZmO-fu2ne>(*3T>F5|kg`kBA}lp$dvhR~;RMWk&}L-cUq3wU_#FKVRb#BBhG_-O#$!uQyG-1yUU8qB6JoDs z*6Tdim|cKe%d$jkJMs8SX4?OcL5hBvSA*xL+FEA7we-W^O&}aM;P3ak{nu(3U2=C( zA|$TAGBIDq-@X|@k~w8IInHHnT?sC+RT?K$#Z8g=?C%1er=J8uZBlg9e8T3p^Sl*< ztncly^@p)~?xNcGe5Vop8HZ6cT&s|-8AaJF|6#lJ#cEOR%~Kb1u{!v`YuNqf3N+f( zLd?;%M%#>g-SJZCn37)QjQD9#6x`p}$+7W3!2>_LVz_s*N8a9e3dC|`*f3QhYw(gA ziYb5WivL#@N{^fZ7`?Ade7!}%X}M`JYE{6eq@3kBF^d zgjOY~iD5K1Gn(7m;at4P`Ih^enOv&42-9_T1wu{N`WOiPzzU^iK`hZU>#e-w80458 z##+|PrRa2PlC>EZ8mt4x6W?51LE11khikWDC|rup&wjIu^~%@E4vD%`SKAJ;Ku@mr z+IoG}Vo@Ci{yev8u*R#Axb}sM-;_V2Dmww2^Fh~%du89iIR3Ak-m>x_qX@^!jV8wp zx4WK8n&jUdq2{!sc4YCSF7>stor^@3R?E2fL#I=n>=<&KLiwX!!fB+g89s-ouTl(M zHnE)s>(!P_@&15EJ}>JW@%7@K!ykbH;kL(mOL+dq=zKm4W@7glDDy5$`Hc~WE11!! zNorNP?I2~fn(N1V=9IQUu#|6|@%r~>xs#Zy&KY{eMfsS|%$|mxLg4mc3ek=k-8w2i zlVUNmX1xhww`cL}0k#WFFCW+<(?oRjUOD?yv4B|HkeX-eqz2Hej(+o^fe|L{&i87z z_PmBpxT%g5$J$Oj=xsf7lzyM`gz?pTc?$+kLRPYy?W)biz5ga%%bEnd|O4 z#p#|6p0p_5I{V8>H2iMkN1i?}n?E77T40BPV)jhaZ-N(?2J(ZxxdKX!G>eiw$+0qG zBHiT{2bvjLSaAJum&-Lrep;fI@*4M3t?8+4Mt8vRPA_fZzY2~9v$y$b+$?v2xYvBm##6JbbmHq4l;G*+7GKJ z8y&98kY5|FTX%A{iN9D&WmrRxFFU$a;Ask>hEz}k-9D-7%AB}gi_2AdyFrevjLFYv zCGvH)>aD-KL{m=1sW{vDJx+PicU?aZ*8tdO)R>1MWo$6`eJ<=zvH0a-Me!Si-p`5N zs7Ck<=B$7z`mZmeX=+V_zOPT1&rH7pYyZ|$91_E`*y(QA0u_U}mxre_!K z)2G?L(@Se5aUEvvTzbSr{5If~H&iojTg8sOzklZ^qfYs&s3Xu(V7hWIsnZ#{OcHzu z$Z~n#P6xm@J--*f<$#xsD(vaheqJB13-^4tUZf48u0=8*r<83U7}{DtcU!VAg$oBp z3lrK((VfhFEQW`+Lbb`cJ8Q#El0_I0i$P0Q$01dRaXadI)c#rdG+wfPmj^DPMg_og zRl{r=DL1>z+HOKg{uMqo3~2;^5};NVcPtt=W){qv#_)DSsS)3cegVHdY0UpCe{%j; z{``kl{V#Dc5wNha|0id~%E8R?f6kvO9z4l5o3;rw3C4PMpGeGL8p5fBoAEll22)#8 z45lMfYl%AJNE!_?Aq~dzLM;%a>!L5g);1KPk>0|$k4uZMzJ9*F@6(Rimk#)=9=gPY zh8DDSQDkj_p&&e>cwm3#0H&s<6HuZVK_dnWm5*x#-0*P{LHYR!> zz$Bo`0sE9GF#51a6b0zj;z8zwmNG~Hh!Nlu&3#$+umIA7P>N*%5Q701#&q;036zd> z5{xskhdPb!^I>R3^8{cB47M4QbFicy9=KCn8=eXLA(4(H?})t&0ZH&+(*>po0Rs2L znGFFgfbi@=86~o@1?+*X1;G1Ouxw3WF*G#RG&Ls$%tLB?!bO12`L&;FY^-CB0DyIZ zVQ~Pij{u0Ztg>?Cu@U4CZ|T4Ztj&LN_?r51oSoWYYGaB>alp1c{zc8VKoTa`vTOV; z5{oH+y(RMsTav(4TVMe!;Q|EKd^UQ1%n778hnSB6Lb(C=OAa2Rf;5<3{%;YAL%$x^!#!Q6doXoboeE>|5-(|2M zlG~F^4b4nIT?v|8po0W=6x#T};2xnXwrF2cy)o3gnJ9w&;6Wem%TW&V;DMXXNe6_Ha9eXs z7pBe2-NOk;CYL+Ja9#s;x03v7pA4{qsuG~S6jk3$_Q1WlPhc8)3~PpkI3F;LEICvF z3c&a6<8=i2+dl9wd>J-coa-hha1%VDWz?wWr~e4puVg_+y6^gyAXGkp{|>-e+<<@^ z*6qx6EM|*QDI^k#1PKBlJ4q}In8CKd2D%af<~cMFN+LW4%3J5*Za8EqRDL}Ll+BTa z)nJp>HpZ;64h0KrZw;4t;Dq)jNVnGc}rvE4?fcabuWF&!tc@g3FZ=-|X6Vp@w zK7s_j!bk7LhZ(~HbQJX4?!I5}dJuPY2_i@$I?`(xyfoX;N07NR4QR+a<-PpptW<}) z8xF+SU@{?;6jdZYZwq%;Xi*HywdTN$wlz!dKpx*lQz6eiK?V#3yA$IC9c1v^@-IO3do7k9q9HmE?N#25e>=!QE59zPt&fH`v<*tgp$xWCXH z2ox^V6XoPew!p$dTI54@rhNWN zZ+#z%dCA{iK~#W?d+g$W4G-8#V1<7I^HKnT`(8m!vjh5aiN}xI0lzBKcBg_X+wcK; z%wMO)8$&Coh&{*+qxq)aj9nq~g~Y!st7<{{eM2X0+Mh$EwO|Q%! zPvfg&`j7g)s%^GrsklRIUmfof=6{OHr?8W%H)GwB^YrSZtC4}MxpyzB*ja3}|6Hx} zJy5DV)fIL`Xn}t{fEmDZNN~9RBC_>_eG&V>zbdw{b08hW({>a!0MoV7JGf-dA!lX9 z&X}#xTFxQ_deNi_?aD#6zbW<&-=uF9b@0H3k=GEI9l*19Y`!Yv3;`CpgfT@;vhOLvJUXW@OHFNb~jEZ%BIu_i6-7zJ)>zTq}*k zOh?4GuJ!s5MmB~GbykOoaXt)JnIH-L`f?WzEQotTA*_+wS{`24xrJ5@6fN*K)0w<$ z4k-1S8#3`bTD*V89vQXka$lddZF=3z(w@#L%e{Mk86PpL#BQ>Q&M+1t@qp%Y#&pjY z5~vDsbvaR}WSCWN_w6vv+c@2tsQW0OWdhZy#(ZlHdX2@cR#|j}^qxY?TOV%wlUpteZuLF|X%~_ZMz1C6%ERK|r?FXA{4ig#v5XW1T}FmXv20H|qkE_Ea3{8O;HcM0(jZbB-z}4&C9`kL*UfDA%z}vowOo~HSh#xo(CGencXS=eTo~UPI3>j37klSX zMWE_e3eCTr2BW=3rmrNoZ$Zp}ZxPI~E_-}!c~K?)zrUYihHC+bBekt2_}#-WJE{Zb$?B4Z53+^HVWmbmlx--+efbNjV_OOd)>AqWXC;$^Hpn8xkkC#%Tq1 zI$V@}#pqA=K9%S$C1z2w9LBkpbw#-{4F#GT74edUgCs-tM}shES*=Z_mU~&mp`%65 zfFreRibtfuEIgr=rcJ%M$=L@-ADf{c$eI9B6bPj(02 zSf_3j3NyKRGTO!teVWn2{^H2krCa@>jHTSL4dZ}-98q>*{0HHl5Xr7_p5vEPKu^za zd$HLr-j)=P^HcILvE1pwV{C0%U-=sLqReJLA@MnAkoX)-<4KDW`Wj#Toj!nbzM zqo(U(mEqhf7DDm`6j2n@RTM#hjXJz=%=ZG27c0)szC^f$MQi~!XTK(M*E$z{UY~tj_pU{;xJGdc$0<0jqUxi!S*p%EZ-Y&hg(Vr|&K)FH9c+ z4WM2ga-`gN*o4HFl2z$Hf3=-Q`V){)}X$8$end-i?iFO>&e}z)E zwu2YVN;fz-33F7V5!^K!10KF&auPdO@b`##A}YlpDS9cAbFXsQB};HAnSMc?=dl>y zUtab0{9Yrjf`PTVyYxtEV{-mPE?Fc?8y_B45|oy$nub=yS?TJ?>@)GNlQv*AV3`rP zlKWvHW~m*zS;xX|46+@ZVt6yRb5TovE9*=irGF#}pU0T^ikcNeM3t4XN$m?18ac5n z5Y{lXG1aslEaDjo1Mykwc|^_AzKQ>nbzDTd?hD84*Xb6f%E@PuTLtHZqBk9!I^^Xo zrMdV^*V{&uedO)$S1eQ`UZl-x-c_Dt$HPsD(f!R)l#fD!ymG;Ua$ihZ%IFoe82at z*@}o?nJ^`mblo1b864r_kKCJk+`j4CF zn{T&4t|+5DI(fXjiMGm-d~->Sm|f&|P5@No-lH5|zSGgEAmUmR+bfxJ3%A3;R!Fp| zdR1v#jEMi|a?s^X_BY_+dIFWn4z;rvQ)Br?o`?y4UJ++Fu$p@{Uig&N&=daKPii{US}qRJNl&6c!~z+mwx8(xaNS`W}#?zew{-M}NOS4Gm}JmiMT&eRpCr>l$pzn2Gh zTb9N|hj3i*7;oyVU#udUu>bNx;G$}IgX6cK3(plTgm>gi1DpCmQw!!$(0Rz;XObH9 z))TUHLXMYS=x~BNS)i-Y$?g9Ub`C+JFkO&s+qP}nwr$&dZQHhO+qP}ncK3WSo7wyk z6H&X`SKP{*d6IR_{H)>2mq$u6vR}hs`0={LF!;flw|HG7cn6nNU8Yqn+xHxJ63^Ry z%fyD2Ot+wy8N)0m(Kw^NC$@J87D9~^dh2g|iCuR!}G`(%IcxFxJ0F$@u= zF%9i$mr-^5RQ>)gN3V~oa=Oi1=SWL{CB*Xp$4(*zaPM7wr6Re1dx&=q>G~I(wSWo7qULTWR?Er=Vm=D*fj3 zKlU*PxA&gKA<<4m$G9M(VMBZ{e%LGZoh)U7{%i((-ab-X7fnKxgL;-S&qRfu4a>TV zBe%ZH49hC6>S&|cg6AIm z0}tY@LT}@V3@tW=ogURzVzD(pfA3HA*{eliL6UBkg^(^?P^#W&1MdXnPqlvGTe&=o zOon1m5)Uwl=X|2OhX_3mJTw_fj2 z65+_TsbPYsDiLZ7J{t~a4{0xwR^AM^#w_01Gm_H#xqwu5-}O$p(B487Oq#J{VZ-gH z8gDC;cV>Y47soiEQVt z$uj;`s?iDWJjkD7=effKI-e{yF87%H=pMhi89CNzt^;3cjYHR1%a1kPQ;A~tmyEQG@ zQk-T*6@|bQis7r|AIO3v)tk|IbrkQAiM3qFrD+qhxsj8R`P`o z7xpXF#2kfepJs;auCveTR{Oc2N~Ll7W;Z^3Eh`ho9QjFF73pP29{)4O{s(U!mEn_x zE6Y;LDcw0;lsuu>g`p6kmer0Ayr`%)w9KY#v ziMcZ=z|V<&JIOsTEwGUAL;ev;>fuWsZ$l{UxKVyh*7{WQkJj;_HuUKlqF{N|lw#iY zWQ<~k(`0B2@H{~?Em-}MNb5YOuU>s}Dek(#H5ZE=JGC^BpQsJc~dj6c(Lj@A#&R3pl`XzRO7A`v@pT|DG9{^$|%? zH{Yetyg(I!nmPe27u(qI*PObM!NrYES6}AkKSY1Ky4* zCSI>eA~NHR(U;41N8?klKApKq%&8IoAX(b~o>APME+!86)y(oJj8wYt+F|e|*t-9E zpid34M=KE<4gMErQ8WH&wev4bUTb5|F!khtz^dIUiJQF2}oZhwSQ zDA^9Ppm&>a)5~KKd-ovCAVt-^+E32z{h?{N0oLL>%o5sHHKH;ssXN&5?C0fl6Ils1Sy*U!QDlFRbBG-0UuFj&6MS@YZ)wO|#lR-nl=6*DY+> zj1~Ai^hFCBCm5EMeoq?LXV3OfV9jl(dK0pUoM~9x3@M8Yd{0W)68dzgv~zDt2ip&? zx!r^AVkC1)_Mfx!OpuA{`#kBli3?((M$1xymyZC-G$(cf@9|^Bx{=X884m_iz`Axd zWG&=8`vOKxDP5F@0F{eIhhU#=x2TyUg**Ht589^nG48qj*ZaZ2sFu_88G~P89mdI~ zJg+7k;6bPLD6J}HE87Xv|5F}9=>qI z8JBRhYkYsHkH`^u0|s1QAf*ClubRq+-?p9SqZBX5N}IM)Kb`t~SDCQ#`JV$}?tQl= zC$6~P1gu{_KX`pgFdb<|e8I^z?VPx{t}Pvlj<)RVQSVUdeH;#q;LJJfX6q)-;ATSVW0{NEyv>fkF_h%|h;WdGQ_n5Zo)i6-sapOlwiyFg4CAX|3aL`BlDa z*W0g^h*5Tj3tu$ynX58=S_RAG{r}7A<0yIrP$I3eIfwWDlh9N8kDFzhm38A2o-eu# zK(AahW)@=4{z0NYIUmnF9irI&gmF=YLtUHsg3+DnIuxV5Q*UjV+Gzp?M*Z|gr6&B( zAfo`=`Nc^(&&X&nU`F2asSFPCd76c;aZRD_B%D7}hUTezo6+n#ZJ|Sr1Y3Cut$=m0 zKUeRyx|N#vMN94DELq^c{=T5wKVTXJ_vHVfpffZ64+WixgMsb;Dd^11jGX`5!o|YQ z$o_vd^#4Bzx4F|)0Y|5mHM$F#N8sqzZeV98XLM&LNZ7$0nhr3q3&b5dczT4FN!_uYxz*gzOaV}8TA;t(ZK9fFdsky=q6y6paipj7@7dy zg;njz38WFAJmwEj3XZN8hHR9MfOUR%a1u`f*a^|q;n}IRvEJneHz+3Hz`b~Hmna$l z(^wfB93CB;+P|R(Qy^3^7cqZ-9}r0kupIXqkW4_@Slih@h*JQz98^IaRb3HOqLQML zx?+(b5U8q?lZ%VvPoB20(&{qt8Gz9cl+_VHAqbD4qPFt&s|;%%Po)o(S3nT9_%8?C z;$zjk6yV;yaEdb(HS!eUg%L0`NMz=2|!4 zb@a8AKv>;aogLkOfuCufeLnh99~20%&~A3N&w2c>Zt`Q#^0&oQ%GjfR?bfa+ClZi^mJh z0~~?-HM%yp_D|z4mYjxc40_+}6r}#X9ync4n99zc?9#v-ymAxtfZfMPjUZPCH@heO zcWz1Mw+v@5tx|4y2Q_>hbhV7G zU=iFV9mJnVS}VId!2P#0Oy#kk>K`-6@}G?=);u4pbA8(jP&(iYVmbJ32oAr*N|nedx(a!2SQ3ZJ+6fAq|i|g4zLO3jGk+ z{UxvA4*?k>{;(YxfzwHT3D5wNj`4?~3=%(s)&XP|{SdhQB~RgjOw+!C1U63o2o&5x z_#u*YANInrlXWlPflib^f&@NP{=497;fGl6`ossBtbG6vXte$n%)i$96XPMsdB6u* z%=i|}-<8c4Y=UuV0nP0CO$ef5`(Zx>_(BfY-vBXx80J8WbK+GP5I4kQBp z69G{Dn(P17OxW`zXE)yRlU^6-2}<2vUB9iPAaI-h6HrsoJXP~6Z2Sqm^;@j34~S&= zLry$u>k7(x(gzfzL-P|^m(2dHp0hs&bNM)vd2gG!6OglmtL^`bo*M)@{BKy( z6e#|QmAj}CbLi@t`FPe7-Z>n8=mcx+^SZS{sSrqef*0KqI&wU_Aj8D_b)L2Ue8Yu;cwS35?J&RjO&kj#V3toT8uSfH@gHW*S{qJxO9t;5C9Fj%! zz4zQ;65T52m9=_XzuTe{C^InZp&jZgC{+e%`EB|F4oIirn^q~`z)?Zk0L`=^C>y1& z*H0?mrvgosBK78KZuR)G!kXE%z}DE$!w(3>@t}bRR_tY;=HsOQKND~!a7MS#&D?d9 zrY)qc2*68&u;PCd$S{r73HIkH6{ViYR(#NTJklqcnY(OTMxL~Vdv3_oGVTH0J-l6? zNXA>_Upa1b6^u|`GT@{2t(XpAJY}MH9NC_v5wAE(xu5-KXVD)3HTK04Fl)kHj?R&ldF9yutJVHBu;LJiVs+6o2F%@nG3y4w>%{ zR(rmgu$=axImK;KYU!d~22EuEh2Z*7H5>$dRr?aBQ$;*)B4|G`TR)>yX+F5zH;ln+ zwC!J|cVZ5T6C$sg;ycj@#-fJwWim_U_g0}QyGZXW5!DJPDDVPUn?z_X3VWzYKgY1a*D3Ws}t&H7X-8=3AH;QrBNRc`UY06A_>;`Jk*f@AE2NfOCsv2N8z>n z`|s&$ZBV|g7IP`&l;;il=+jdKIyDK-gkJ^t(|;3m6b&6%gr7xHo?T~(kU5$G4TyRW z3FzVk?x?4RRuNS~Jb!Z)JXZgUw3%0|EWlcNJ}5z&wj>tn9}aAWcLL1B7CZ|>+U&{1 zR3KEbR25oKIZV!Sle_yQ`-u*>KZQ1e9O0m+)m%3_Hv&%iL-lZ4Aw zc_79PLKA-8T6vxhi^%~AKdKRZ{7zirX0Wj31Xj`bzy_9hfod(toeIH@%_NZ?jq3!l zZUw(2n=Qc2fW$;cq<@yxz2LFtaqAjn7TkA>I>YKt#(zL>Wk*1dxp|6eIKupw6}$AE z%LF?b*A|m|cKL+b5QGas!Ji9iPa@`=_3Qw$0&>o~p=>`3vt^o<=igS|v~*it2)04u(7_3}15)?mDk*tV{dX zTN8#7^~x(9edj|RbJ&PeVwVV$ZT2Gf&8?r4T7;Mup@A2nYoa=%yLZAJI}Ur_RD-6f zzPDKM&qU2B6TrB*u!^3nLwoj$a#}Q0_)bORs|QU*8ALK2G?FZPG6iQ!U$jcxyynCp zd!H9kh&Va7@tuIr*Gs2_&dC#Ac;xJbg&Zp<=IhE+zvB)m@ol9Rqlq9JKNR)wjP+5> zAxXoy26?3*=e8`%8~wz^Pc?E#BQvgr&*Kj6!YAcmCMYxK9JwMqs8Bz*==PwAdzEaL z4VLX`vuD1rxrT^!*%JXKL;7|=ePn69-J#>(2VaR;A2OCyxu1*EUb;-N5M0>`s9g#~ z#A1moh{ld)vZsEF?L0Xu{i(;0Au}ESh7~o!dZDZCuLAVz%rQ*BgNVrk()n8Cpx^?a zx8U>3o1^YMnQ@Emt`V_o9}#SZkZU8C>V?aji9OnTI)~7v5Usg&X(9ERgUStS342^# zRU<72@d3v%KopL1oB1)Zqx8jc(b`>bN|?=d_rynh5k{*b*Q+Oj59bfxed6Ks&dL;d z+=bO~E9D?!;JcnTH-T6l{K8z?B|JXO`bEBmxKf^9$Gsz>4rYV%x!ui8k6A*!eV*&f zX7cjD7w4E)d-)86qaobsy_>BlKawp7=h_=?x?-xAhs3P?&8?$@XaVm-pVq~Pndk6o z-9iPXUK`m66P|zxEfD1x6e8gS1?(kgnDUhFJNMHdbY5>l7Q&kubS6X;h%3tjx;8i_ zy~C?)(9u%eI34W)wXr?XrCi5?vzh%pYde12>5( za{}^t3hRa5sGAWt@hbehd8w;q#X?k`wbTkaNZmfX7c*P;?7;Cgm(wc9hDenJeO#!_dEjgI!J%;3ULw2DR?v+y>Req2i3M( zOkA-gmFys<6?9tnVndF7YPrxuDL)AtVulRV%Y|1VRt*?_Qk8Gh)E*x(>E^L`R+4WxNgns zR9B;k=3+Fd@Cz&?Xu{`-cNh9t#0p7R<0-VRwDe@DvWG75^T(P*VDLJgo1O!QMTLM; z3^~k|2io;TGXo+6}D(W=tkV(l@~*y$Ug=J#j%saR@6g#PH7 z1AXne87|m{u|B9Bwb)e?C<^$YL47>_N6o)aV~m2jAQ~>`j=-k#Y;u7 zB9Iz`)-{znkT17R+f(9C5`r=Gcd&-F3azvJs~g>qb_&N;jD+ACNZI_4{W^txPn7W* zk&GXc%c{xrcuuSYcuh>G3JlL^u2YfMU;~TAk0^eET5Dr5K`xhgx{oc+j$)W66Q|KQ z_QC$wYZd3@efOFA{@S@2i(}tWt6?4no%g5$ixrXkfkr zc3p3L6*I}z9SYgh<;SxN=%KkoUnxc6uAv7wM3H+2e&0fBw-lvihsG$np#ozpG3mv+ zqz)1GfY{%Zdd1mi!NqZgEblg84;Ec$0aZ&^5!r3V_Z1P)5g>3T-f_%tia~@>{c8^rXP4v!6En*LvSY#B!z6 z1WjB^F*mjV8Xq`+Bwi*@qPwFX#wLoD5osn}n0p%>7xBV=-% zrEyaclF^+FMS}GzmIYT2TH$O_-&82#@A&L|F$fTR>n5w%n^%e#`YB5WqHLlC*^qYA zgyT^ei+6r}vhNJz1;&*@@IrWrIpzLyFqTD3t;QqMB~Cw()6mQ1rLYW7Ya8?HDh28G z9c~#cXYL?#Kc`@N7lHeY5_%B!Ivj|_8iXGd#cZ54;b5j;q<98Vt@-4g=3taGry2Xb znaDi$_z32Yw|(efs00@OCj8<%bX%7yKI?izQvE7m@E?poPP<6E(VKp8eJ9vw^|kAuy+ z%Lnvx3!=%hO$+@v1HGv&kNc*a%N!1d*9dTp<_D+cPmx$uKgBr%?mi8*4^-Pzac_suSJ4vfu^aK_(FJKjaDzo3Yd zJW`+)#@7o1o+=zo)H_xWmd_^Y8p#mPy~U`0E)}=yd;4n*k2u{Gb3{PKuA9yPspH5Z z+LzYWb6D;wtlTsHXIL*@O{R6aOD&>(ul&tP``irMIfjn(b%v~ZN)Yq|5tUTqCe(0q zB8TbX)ODTBq)%_v8)S}ModCka1yr>aga-IW(*qz)wbM@aQfQYhNp=fiUNV2u8Tg_j z%9zXTu|!{1;x;8sAI(*(KEyEm0+u8ucK5>1PvILTndN<=}^cI|V$(D&0q z*S=r$l7x}AX3b?v=FS;=BOzh~tX$jc3S{c zE_K*kntQ9ha>ml?bcmRAUAA4Zj{0+5#RGl(!j`APU$YtE~s4ndatzgjCpl58hm zWGQ%F^$bl^&8C%fS!RKbb|xB@anA-8Qc2Seq*&WIR1MyRvgS$Lai|#6$>xV|RnzLi zmnjz$wVw-)y|XprL*SV#)s6M&&|TFi)?`m=Fv0-!oGYc`e|i{JT3M3XW4$-1p~l11 zcX7KuNY(l=wkXVjpZ_}LYb_^LF4l1Yo5&+>N(82QMhiM(Na9K$&84A3*!?|_#czWdlDIbO#&c|m8dfl zE~60^l6kaJdro9h8|W+x1L?h}wlN9sG$WEEo)6vSSUESCqb4;LMH|-uYL6Nkc_r(6 z*f!o$c&;Y%VtezA`-+|)(3(*Eci`Sh^#!s5CkxbahuoMoK4x{gZfB}>`6;tJhI6{a zU!*RBSZhQ^XAf!v)eaGqd^mXze6hPusX2u@--1dD?9QsU#BYR4>vo* z(#JBrbv)faJ(RmwI|@H&;@8~=&R0<1Pbi%j2SG!I>9~p7OFRZiL%#0ks_hR6SgA)8P?s+%IeD~d-zL_Jr+JN zdyMC(n;?e?K6E(phT=17y22gdXZkA^PL#XK+40E=VCn48+hu{}0s@%!>VVNopWIUD zMU-5MUhbpa^5*r;98toNYgUVdpkJ{NZf5?ABkKqo^SQC;(^A?stD+Is<4iyDYAepb zBq2O71>GFv!Ix!dAsT^Ty>YS8)EydcoW*AWFibiQB4YV8?>vW!SP`$DR&)6;PA#ES z@F#s3cB`_r6(5x+H|Okh@I4)?+RmRs6rP!#Rp#antR#v!%|^M#vNKpL1>hPbEiJ*j z##NwA)n98DZ|#9~3wB!`C61GbzrXMa6cz{4qtU2x;FNT6#pY}p#O>UywXt(zhc#?$ zSG&6g_5CaC56dTHG3K58XyX=*S_jH3FDl*Wp#eUM*N`GA%Q;xM`h*_NNT;)_&;@in z%Ynagl>zH=7QGPdZoGLx#crnIxaMy`Dr%Y9R&y{M_yo!GI3cqs=NL&^r}VTleb{!& zhV;&d9qBZdhk?Ca0I@8mI(SU&ZGqQ5zwu;v=fX?@=4yze?ya>+2_1~#@h?Cfy!DmX zHjp5HVur<$h2*sv)h=v`HSC>d`D?R8?kBVUua)^v_!G(DY_J!0;raau13`VCEM5ecSIak6h zkeb_nWZH8qkSOl={=gfd+XJmaWw4zcLPKP>f=xMo&MOKy6vAC6a-LpQ#-$Fc_G*fF z9A{dPyR!cxypTk*`XsvZLnKAa0n8jA-l-(seEi|vIev3kY(uj-5f2>Ac(>926y2=0 zGIj$0`T0{s=^dlt1sXWOmO73c@mr0-9)Hf+vj+*DPneLz;hG4UlB4*nCOH$~OtY<` z_0V*OV)+1LC8u65&X)+y&7${)i+g*|pq;2Ub*}1Ti1Ff~HzyIM@#;I$L3qcf>wR*J zz5S#Sm_4mNoq;X5<;o>y7VKp=Iq&h7kZ%{~ zr##zlN1dD@VZ?I<%{2eWA%kNd+7)->>RXEwniRFZ6b+UqKQFsaqdT15;ol-nDiS0M z)Q<6Fh9^fW;C_M=j?1+*M`+Xas%y38aKtGf1eS0xq|3aVgDIG&$vZ-QlQmPzkFyec zq!f_(_fJ67{!G_3gLv$AZR+8Ln9!`gsU22TKX#qXVn+oSWs*ZBZl~xkWD)vJKop{ zBe;fiE4iju{a}Ftx|T%Glv6o%IGK472N*pPTm$_AF<+{-Wsz-3!yebTB1SGHnlvln z1McXwY8R#yy!My$*n*fbvSzuohzPo&k>h~KW(6?YK;DPe4(OfJgA0}l-O*B4QW5PC zZEiJRd|x;|b3hz*2smkDhVh&z3v@wy*7B5`D>?0sbk@L>r8ex$xiuc{ri~b556L?R z&Zvn;anp0im#Mce4M~%aMC3i!UVW|J;plvCK@q<6?oPz zbn~C-l2yISia;Q(eKzIPwM$M3^=|u-w;hHM#B{bH7YUnKkS=$+;Atm1qJ#USg)Ixfgp_3p2cb zhvSy-AOd7BhPD#!w#XTl69xnx+}yJx#WVzdy3MoEERTcbT)3TIN>ZcVY>kK*Q3l=0 zVd}G12_a!L2=rk`GQ*v7-9L^H4o`YW`hca_M}%`O%V=F!GpL53`t(Di1O}Fyh6X&1 zrQdp{C7~p!Jz^Sd`UR(QyVZ>P19Dy&s!_*3$^z`A1bq^ zmjNl^vM=FX#-fc5Y=cS+=c8T!aYLQ~U$Sjaid5a9o^IQTwny@joXfTP zBJUu$cDAFo_@l(}th+O;^bsB_-0B=el4BarkmCN7L@XAah&RGsMhmgk*@OS^@%yRDndD8r$@LOV|AD&?aeXwrx$l(8UD<33IHvEh=Wk1Nzzf?1!jFBV%$*ceLTQmUBkPzg4)<7U|A6(vh9 z%7cU+jWzHdyn=tc&S^-Lruu5rdyZz-;#sMnijptO!nuD3fM0-7;u$gk`Skspd+225 zpEHT*UKicsE`_-dB2fnQIE&hNL+wvzgEaeJAOvO}hesHVM)lt7W{DdgbNF?eMQ3pG z%fJUN(<0#`?fiW>jBf7b+hwL+S1B|Ms4Szy`VcLR_?DJUVY|5xS!kP+dLhx{ekDfR zMpRx@ofd^zDA4HL_x@PvO*&gvrnz~SRz89+^-jIp|LC2osEx>_|5-{gutQ(5t>;pj zYKF}-%;Jy*54k;6dt2)Ay0^;RV4+_KlJr7V2`6N5aAt4Yvq={gz^^igldUK9feiL`$&_&=V9Q0;dr?7>y2!Eqr59 zBi=CU+hs1Vhf1Z`8_bzQ1r*8$RQNoy!TEGdwH4h%yl_J_ahgK(-nR~dg}CI7gDJO> z>a=s~@=`*jLt@P4LSA2<2U7p$um`oe#JAbHLaRO=2P6!3?bYTvadVLWFWAqxLojSzGr8s+=!b^8VTd&fJyz33vi9Zv$19G#)%=W)2=rd4|H zD4n}GJlpN%_}Yi3Xl+`qoO>tBFolp*BGBgyo= zzmFV*c(*W|oty_GR6ASSra+!UrfG(2W)7!@D7$L$%#R6vn84~lN4&p;uc!u|6Y%e; z3-a>qSuo}T=o9xnt{qql;741Wl5(!@e(;nNh=Tj!u{YBTVnOZm+f;p%Mkl7(xE;HA zc5?NV8L5|14u?p<%NCKd(bE6!itcZX^*z})$co0-T-WFd+R?*|aCX$SbLiNB8Okg3 z1fXxDcN1GaWX5v~DTUjaoPtt{^4Eyt4B`+88`+97@ zVFKF=wX%xKDTJv+-1J;K7t)*>Y2dW8W^Z;@Rm8J<5 zBF^VN<5U2_$3#-v4wpQO--O&AC`Ju7%>v*I=~ zpP&t5)dVM_M}FLbMLT_9G!)PXvm&fNm&~+&-{jqlsm*H&zFRu3T(yW+8b=;gXUvC$ zhl4oF%UzqMbaR}7p~c6-PKm3nGE|)KJ?qlm$9^)t#1)mUrfU|j3#M?xwD30lp(b5L zzDEi#t9QmK!&xI$LLI{Z_B{)!E8B)DD zqXxJci}i2q~9BD^mS{5#fQeL7|l zvc?8;vPnu-?*&m8St@yWKtU0EWQr6beO65AownXYy8cRD#C!4HM7$jj?J-d{fzA*# zMe$|=4EH|PIzh9c0s9zi;H$bDC()n(GDBhkdj9YRr_xwpoB-8 zV82WBc_@FgtOQn=zgj|g`&caw3=b1YJyl4cI-|HL&xg~P) zfH~2j3!xa1WU?$R8FRXn{9cPCIc|D0veEWkeQ~=s8J^o1Qb;J+iK??igVE$&O?e4q zGwqG|a<^OhqzLS&uiOYA#oVLfp=1cguJLYvNIj$hNQT9T{tx3Mh_tmw45-ujTq^TA z#e|DkNGBPkATPH(;0Tpgq8sVGl=J7B>w)wXF}wg&Nj*QUX^NBPjl zdl&l^&$zD_&slr32u)r~XTuRDZ-$lM>VwPq^rUlbVFvVs&u2Q78aU`=R(AO=}jR0 zie|01AG!Mli|0fKLjl0iL-@7V*G0hN$?~mHV2I;FfM-QCYa~MD=BAaN(SEuoerO?| z9Ed6_9U!F@_Uyfqba30U2@kGsTg2$;$Y1E?;`S`}Yc6h0YRL^LR8UXnUP4M@R<%gSvJbdjxdDr{>bCG}%M!?DuK66x1TLC67F z5Rdqd?-=6PHIyzCploZ$H>T+(2ES){4nR)lxV$#Mi9JtoHs8j=nx zRk*evk4*9lU{TJT7MOI}CW%rh8&s@-8dJfm+s# zFlD_3Oc8vMUq{z0tg_23JA7ebav4c^+O5VV4129fHN-KRRF|$*7l8s%O#Ksv(Ow@1 z{#UrZ(;X9}wy=Ip_$bIN-wu_&1;a3aGhPGJC~$&kOsW_-BWP8MEQrg`AeG)5dHd4A z-_?eY6?tAhn2)kyvDN>uux(~G>Xm;|rt#(7<}4A>43G*uT*BadCBRH7Zn>&*q}j^1 zz`Rk~8>#gRaCuZpZN=#re(W;bGux$E!R9+)`u0qHtG)KlnHf)zwJQC`h~ylHYVrI2 zTSAsY%=qa{*(@zP#e+NFg;g|SSFn0fubqlFgpv@^AFFGZH>50=Xv!qT#)Dq*A>TnA z3n>N7MxcTO2RZuj9k2?TxfP1_||X8M6nOCDio2nFzgcwppANT5c+qj z2sm4(gYM`e*@H6#vWpNo<)5dYgQPU7fDAOXng6BhB7lXS5bp=$`~->P4KNPt!0h+x zdRPm0K$DWAL%fDj%}RQF!E2gFKV%$Qsaq^%G#$%u{zw-VNroace>@; zpL85W^LAXNYD>ib$08*)>3z&GGX#-zMjC}v#%<`OIGk%$ew-RQ@a>pQ*$_U7B@A@; zp&7%a3p!7IkMd|t9Cza9G#OXpZKTc0Fqai}fyW~ZZkOaih`Syr(2gAW*YR%LrZSOk z=upUP`^ozVLag=HN||xV!EO&h(Ix(c+^k9cv;;yqIX-Fhts6eWqfADwByO618K}vk zxCzbx*(hF05f#R^-ga%nwZ!$7i!+tE?g)~^>ygW`vi*IcPZr@t7;HWK*+Ax^BTFCn z6fPXZt%-|Kdu1C&m#aky0A=z4*h-OpU~R=dlv96)x_IO$2Z=ZPg70#kF-)F=>9jXC z33QG`IYQ&^$i<39ntmnS71g27=QS@x8CQEofw5|&#(8BQX$^W=);-{tCG?o`D4Fn^ z{kiVe<1CtKd)P&j!UCcVp-&fVG_7r&W#2&rfToSKHT7Gk1GSYb!}^X7_?X^B^+ zc=HT+w|}$zUWz0BTAYK_aL+YC` zg9*OX2L%v8Fz|+I3P_PfCZ)ftF(V9yRZsu20w)uonPV~GU(g;GX0~G(t{fDJ<@;jC z*}mXqs9W-@QL`wlMJr9d)8G*5AX6YJReG^XB#ZQ23i5Jl8eNBCl-;&{AqP{6i)}Gb z{^TOqu&~ZBFrk}5YW$=gT`~}TGou?8YmBgrdZTT{a(}otY&PKK+4HKF_B3)|nq6-MsW}wMsTaz97$Q{Lr8wjTwT9&u+?(!8Up?x=KQ=X7v;?Yc*~>j+ zsr64GIjtW&dGf%hh}JGD{ar9H749^DGF{?7#{wE^Cw%eFQOqPr zy`sD{!OoJxf^WGcDU>ZRH=4`cd=s8LZ=6;l$!W_jY&W(-*8M#COhlmCTsh^>DtQ~{ zGBWhlSS*h?LiC|HvmtHUgypS~b|qIu#~lvKOX1>acK8P5SmF8`kfUo>s1?*x2uc$~ zt$Drh5Uyz-LRfRQV9%s#XI%KOn|6gToeKz6Rtd<`q}O=*OcpQ~dg9%|Ztcm^JOLt4 zx&~K>LP%^Dk77nV_(&EA*R;;HTY1>1F<2{y#)I}HL|fSJWESw7)Uj)?u9_}WiFmX> zcDGmii`1LDmoS^@q8Dg(Ne_fhVbX<$;%D6dlfs?*%gE1$kyIbk-2{>JLyjm)GVh18eSPL8B?vmcd<%_TqV) zEic!8J*W&SBH{-`;8@>}F&Z2BDdn}`$yWmN$Y`aAR2HkdEoj%k*@|FHd@%bl(n#ff z-Xgj0y`<;eKESc@1Ue6Wf8@hp%mD$`i5~_|*^eqRYw@Okb7>xS$Mwr40<VMGJ7<(Oi;z4DWRgYaZtml95ynl5~YL6>5Z{MVd?|9Mkuz|+3x`)nE|tWRMA z4i&<$fB`R9Qwi~v%W|rH-CM|R>|8MZdEF??pfTxWcy}vJ(*ydezHCR8fV7B@+7^pv z_Y0l;;e=ODym%h9q~gE?I7}rJ^bU#L0;fQ?+&VIZXw@eKAg{NGkP4&RW||8F{J089 zHfpa8cs^j^Thzlm^YU@WX;saoq&o8@knp4tQ6l+s^24cSMDNX=ny92j8MCf#;o{rc z@{1Bs(cu;;JhY@GQ2LwTVV$Vw>y6r(Zd+AdUMbLVd$_CLQy>`{E8sIc|NIQ+-hPJJ zP>t+9W#Qb_i*~C+JYMOPk10E=)=3!B>q70;+tZlw>Nn~X7wj_uF^{|t}<%hMg*SkwkvZnzD{YV zp~bYx)&xYpS~AjpIR;5FCD?!VWo#m8oENyzk$bM$tcAh&%iZ&tkb4=iZ5i*__-) zHV+JC%n{f_-i#c%|RVJwzHaJWWXE^s^Q6#qw13A|JzW)*<2= zYA)1-ds40wdvvMBu5)*EaN9V+|545dSICVR7t+jFa>w3t(&oo%htaMYV4E}8I5wZQ zE%x|`7~k|STpK2f0#DJNqQ3#2jT!}J@0R19jeP~Npw~-W(^Bs>a{H0ia4W?mC0xJ z6|{i2c8C^H!YczvXTxWQZXxhV@S4sG@j!vWxXS{zhzam5RI#n$x+k2b?nyAKg38_sn08F z8N8l4!)~Y*s0H+$1>f;X6vV~Ru5x6TsZLmfX5~7JqB&RlJ__;mF*u|@+l{7IZhh_5 zRC#rDg;ywjvP4W=UZ4*{r7=8pMk*z9o4`QC%(p9JZzGa$JKT@PkmPQ0E@&140|OR6 zS1-k?d$XCGMYO0)l>Glzk^hJwm#{V(UfPcfB^ATcr2pPsKPCplV&fLAV!Ng)sMnM` z0LuqEC97sY$0Ma~{Kx4#RUd_^ixyBKL?6t<=08M#gaV- zDdJF5X=;B^WbRcIX8T2fK9EKnUQ@1cFNT|&DARWXjrBmmNc!gd+l&|m$6n3$s|A<1 zTW?d`0xxLBhA0x*8z{wx@-?E9U4Q4m=+!_^j63k9k4&wwRc=FWM?Mf>-R)=rLa$I` z8`sY5!6EVh^`3^3S{eTj09HV$zj-k>{){U)zBiXTm44!0Xe4-9TMUuOh;zER!SqB& zHnW#5-#?%jzNbsvMmLxQ z<7c6E^#ts1^M;Vwoc(H)vZ4wGWN5+EB`l_D?~8F}B`#x5*EH3Q$b#;uNVAnaemI~A3(HoI(*W#A>A+qIC znEslyGZlA>Kj6FGD#Q;WBp7k41|X)Ot9(+}kMC0P70v!6`4bdAL$f z^2MK2b%M|7Qvb)FyWE!a@}oD;oN8cM@AFQGD7*AqO1i{$42Djuro|7Ww+zuPuVd`s zK0g@RyrFd6I5@6)#2K+}le4?GxJrmvRh4vyvdW`|WlD{dMat9k2~daQVm#thN`#MK z&I1TCWu={}8`GN=KZTv@ldR6k_zE()=`gXv&p)g`SzXfDPJAy z#C;?Sf}+dJg_&6`oI3eRqZZ1`9!lJOuR3VU}nVyO#!5Xk|zG zQT;Q~6d}g{@uq##euaxL*TjbO=D2ZfhbyBLzB089-oc%7`wr(sOE@FUlgCLH7Q1_+ z(bRk>UPU!haC*2MiE6L4+?(SNUpqrpf|T!jSl1XbOUfgX@nsvk$Se>a{<7e6Y?Rqf z#tziCRZZVl-6w*Lo+=}#Fs{oEj0~6857GeaM?IB;L_{8*H4k`4??u%S`*zAazA}`~ zV`^l#?C1n`bUZQG-QG^qCo4$?PkLaUr-=pe$!X23@X7a`z`3g2>lU`}%9CGVdC59M z$bu7ntID7z0#mWOL`6!Vd|~%2BX{}6FH*^BeZ;w~apzTjB;iSTx|p*$_a}RQ*yh7c zxqsj=2@R}4Tz3Ya?++Ji#Eo6&o-$6Zg|u&ghf-!CWQ4@p+x#F#%2O86@(g^*IU9;W zqT{NwBD(<0u1W)b$`O;*TPF)ugWa}ifKPs%_G%N|jKZI_>J$#Sh{f(I`AJuB_i;tq z^%FPl3kLV$8ox@@&^@>^fbh;s-qrV%REB6;?eWN0IR9gaS|b%q&BXVb&w7Y8=gSY* zLh_~qOai9*BX|ZS!A)^oOaqtmSKfS-JW+%?v-gT9m^@%nd{CLiYs93C^z(1&KLWf) zBFB5eM$2C&*A)ktVZPRve^(1H%IN<^VE;-= z9T{Dg$hv{zsn<)A2H0+s(MO2%HBWQTA4Al$KLk%K)rWWq?%~k$NxesZBkWBtD7S`@ z^=gn&DVU&;t@%4L-+=#s-}&%q#30-pl3z2p&skEb88X2f!BROM-Y_`OSa80h*LD7B zk#KLVW#D?x)|h6L>ZH1fXhi?s=<{fl;IK|?9r8#1VWC#0-r3k)(UQxwdjJ>?jP z0f;ax&}m710o09ZS(Z#@IQj@v6A4+kEHqCuP($t13)bH&;yi>*cU-Q)sC<-Ol9O9! zzfZ$6C&Kq?^r<*RU3_FpG>6{GjPCUMYHKWXm8O}TBhR@i0UTefi~J#o$a6Sc;}yf(H}uOK~Y z*KE~~13~qoxNIsr@ER=nB?2b|bq(Gslk51aiEK>*4Veo+&h4Iau4!TQQ2p)FO&i5# z@i736OU2_WbMLrcN=d%=9w`L5_EoU@wHjeq&JKH==sflgv|W6Eddl;AWIW9B-*?yq zmksjC&fVr(97H-F(!>3^xma-mW>E-Xz2S=J>iX;BWvSmwc+yc6vbl081QlH5ICQxT zO9F&ttE7hZwmq7cZ&S<S1v0=6fMDK>VT&UY445TM&}+`RM>|EQDTOvG%2qx%(0WOR028*N9Hrf zjtW=$pyD;3o3zQMGOqL|-MR2kqVoZmYZ!^tDF2L;G_}L83|%s%6zAd&g$f}<(+Ju& z1{^a4WwQ}R{o_u%1+R0Baqd4;R@Vo8eH2KE zI3w`om~E6YaqM1BokLprb?c$S=0OEx-@}upE6`FAcl&;i@&9Y!pm6;kIxe$*cJ)JujoLna4xi30P zBBGaMRt=pRthqRG4NK=wiM*w(_Q;a)<7$3t>0hI?Ak8b&2U>H`TF2GnP23sSb{KnQDsdX zyJbcTTeDkeD*ZxSzF}Kh*%Zx=XNdW~gjwRgsmT|)MD}R^e{9^tVkiKDMA6u`Z6`0b zZQHhO+qP}nwr$(y%q)6V{TH>kbuLg#MfNC75bUWbl5s+bi`(~YdOwA}^CQ={kzH+L zz+9ZrT8(JRLikRlfdZ$S+3M$-9OZ^XaM#r1TbfObYT4?c%WK|#^(LHvOV$ZGC{xu( zOA1qZC8L*upM3AboXFodiy(5Fh6l_vq>#`C%S0{Z6aWeys9yo;&N@OKnZrA&_VYd2 zjM`B935mBSd{Q%LLKL`rl!4fPE-L|fYO6C{(8GSB=E#k`&^t}qf&1phe#r~C&DIQ8 z`m=0%DBt(n)-D7YO1Bi1So1@U2l>9;Y>?japx5*RIm4i7C!OPHRkF9-O-godtILMG zC~ppGY~Vjjxuv4QJC>_9`lluMEvqC)W-zS$_&}LPX%dA~NPEKaEF8Ydt-5gJ;531b z^z?oSdFg@NQd!6rGJcS|;I2^!p?$8m=FPHWHy2jO32s_OP!N6#Q(FvYp9UCKz}v47 z)Z8Z!R7h%Xf4QMoghk5iSN1_5EBIE(HJDg7*!L<{9NX*GfcYKyq4CGOY%A#s9&JYe z;uMJ#__hqTdulbnozTH{rMf+Qy6q0%7vXl-4X)9kXB-EQki;K6B1YYL{sRfQ`r=mbxt zLPJY0$>X>Wb41x%P8f+xoLyy3|GL0E=KL5we{!`|W@sFj)gC-;jrG;7-b8K;PnQEDUbc_w@!| zC8E)94SOp*+B_n#!~~wseKNz7#9I{60j%a?L6pkfy^dFFCWdHIPj6qAc!#>g50~Jbb~hIwS?|*%1}8j0mrvy1m|y6VE`!2d zpRB5?Yq0LIRZD%SZI=$^a)#6~ zNa2C9mL^MYp~1C2-rNdP%aKHw7E)%xjM0heUCGpp7Kl#8i~?Vy^0{Rf5J?|r9#-pI zGnBhYcX&raw!K@q*|Bp%h>9V_jho(prrwTbh78**<4Ma|BOFhY_3^zK8E4hR^K;j=>EFAz_{?0$?q{;&SnuS)zUFi!F$FjYxU|e2)hSt?%UBg{4 zFa^=ztZc5bVi&!3oC-)X7;NsW1_O|SusSOV;l<3Tyz6xsB%=b^5 z+M;`3rs@Gnlwm)z9J72dF}dTjMRi0dDz=nlK$HWf&Zk@_@GZCmHy>`$F~KiyBiJU~ z1y{K}eSzxH%VZlA?=kD`K0Tn2UNUUab?mc1=Z>;WW1(cJ_6ec(B9ecV`!x>WC}WdM zctSM&KOJT{1_~7?5-iBgt6Z>ygfpx1F|(j9!8g0GuU!GJuu$HA6jKmGBE;Yc&jNYf zk9auN(LJ)f|A9?cOnz%wD*)kJ9jIf7?5Q*HD2jnC1D&8 z=g){c)BTNdEt>N2{2SH*HgTG;g5e2#LEnJ%2;XZk$4%f5Ryb<_zPY628sSZMW31U~n-@VU73pflZ&5<}AlDmh9S|$4} z$)TZ`jn~1ruReT1jXl;|d3*xq_N3@E+2kbpjlD4vRY`m9yDc4~bXA{JntLeY#Fs&s zcwaXp;Z-&`S}Gy%oE6YK1wqQFoQ*a?G4ZrIo=XG4~*GK@Fx9 zXyL^0@T2;jpJ*6rg{N(@s5I)68%}rkc@);?;fiN=1+Ilq zFn)WaY(JZYf4`fRM1pq(sx=atsLW$+9nCNYb4U_6P({S%azh^F zk7mtq>!)Cjsp7(a8@zDfcRm#%;#2U>5pkldmJqm`W*t{`TXiYMmTVy8?D&GGybp2X zkFB1fKMwy4I6fRNZ&uT)G{-YZo}USKgwr1Kp%ZHS%$C))4QGhK9)Lf;31zn$G!PuP zgGOu-GIx@iP?cH1}l-de^Yqx_l8HjE(eWO2O2?5#b$t7+1wiG{A2O zo6Kh+g_%Sm^w6@L!^Xn4C;9XapL0?TV#Ru5I8q?g2)4|$Hd1X>zL0F+{J}sNGci+} z-$865ILCQBPp1irylh4^oD>ddMuu&!Fu3~96PbY8(~e9u((hT_8+LY7IknG4ZqgRR z}z@!6s(VaO^4QW z8~D!T!Kywhs0mXAiwQYQ%g&s|k~n({0AQv}7880m=E#D5PA?W!`M5RSi+17~HV&O^ zA>df^3E8g>a3WRN`ufuh`mKl$tg*X^(>y)R>$vBhX#V)t^sEvRt#kEDYjN?WFQJ0D zSH;06LAc41f&ms2iBLJ{g+1`uvomgFSYeYZrj|L&ZSn*Vpsy!D3*D$BO8K2(s zg|Y5e*?BpidVRhb!}|cge8~%>-15=p9Bj&!<~xEQkMtiE9?Y$B{DZo+TP`VZ={Tb# zTYGESu|#f8Pu0H%_me_UV8dWDCc30le$RssU>+8Dndq?S+_Jw#xt{=nNlH$Qnz}@y zgJaOL>OJx(zGD=yP|mStgZ(d~HU6JUkEc~FI?dbPa^0^2&s%XWk`&UcoNoVDuP5_^ zc<0pH04DN)xhA1$1tRD)7IvR5R2KMP$K)F6H@`ZH#pjwCszo}03m#4FmvRGNR-Gde z;rgh(LI>M&YgPdiIA+Kkz8wW|YO#>ZQYR+}$)J+_N~vsw8Vh4f0GF7TRfv|*0TLJ7 zCjRMb+6^bWc8yb$g&1QaZUd^X9Kyq6iokM$R+Qeh$jAWJns-Bm?LorXv7wehr0 znq|`Zw3i+ILq%q?2Obs$1b0 zq~?K;`@)K-6XK3+jO|pU_|Et?$MH0hQWCa3j zFvX#UP&Hd~!BXP(AUlyDrXx7voBBak%r6ed3@+TVj zYTRw7I`@SP>(AT~qpT)0AdYOX5DMLBx)r*KQ6`&Y4GB;EIujU3iC4;hNR8(@nwyBE zEth@SFoLar!bGaUE$}0z30<7HMAmd5u;f;=mk$lST6yz}ZY%V|-?PRTe`CYoLyT6Y zCoVpF&6Z;6<2Hk-eh0MDE6sl3QajS7f2=rCBU41y>-x3McFsaib0JpM!0O9DB{%2*6OQg z5l(%&O~oAxx?~u|A`yj}R&|7S%*IZ+1_~~$1KClqHJjsZi1obtJ4qM{F#|ZcgZtro zwVh!)-tbh37@*j{`uLlI8Jrg?=OEf4fmp?_U-?WKN_*KJ_kuc5JVnrF0qv6t0{Wmr z0{y6yqf2Lt@s$TQ>|8lXe{Ph}rx5^)<{2D$ANX=i-%qF{aeQ=PAgUYB)EhdF#_3rX zRC*4@wJs;@P07zG9D-rC5szcj7L{akk7m3k9!^G!io_5AfDPo-&J!}T2|ZJ9Ymymd za;~DS40PsVXx=M+ZNksYoj0NunKezBm%=;SwtwE;=JSLH?DsqM*bi7Z7;eZ^;0yV#9miYPiNs9uHZ?Dkq4%QD_iMyXeQ1< z zZP-J4E+y;THtU|BBSaXR z0M;w4Ix>J{DpoDAfdtMu>dWMWBQ6DS)TlZlg1%G~ZE$(DanGbYpVgX^ygUn8>4{*g zkrE=@anep7VfsvNMdu6T1?HV>QPkQ_(ngotgUMd*x<wN}M)*SV9oIW1_3I)TPl5 z;~2ie(RGAQyD~PiOZImq&2Mthm0EVZHoZI7ClvOco{X0--RPZw%^Ic^uY*7N z`b1X*)&W6Zv%dKth9kQnJto&41KxuGZ-l%$Z$Ag67`~>$8Imn}Vn(dYWp8M7|1>R? z5r<2AHm$R~i{-HwXsJGEjjD}3T+6+GLqD2GFKh&iQH|}IM2T97(sTrq3>(9!^U13X zX6yi{ZdPYAaJIR@M zMaFnmsemHtl>YoV!mX|8I0tuA^!1FBjSZ#%@xu=((pQKSo#IcUcfUe6q?x7nh6kcF zR;C`F^JgZ(ux9xYK`Vb>Qsa`avG+96{2_tpS12|bk)MkX9-^~8{!CCPU;SPle!h+n zBpc_D@AY{Dm(_Ggk8uc+r)k+N#O1F~r2Q9Xec6!;MCeLzGTVX&xqs^HKqR%PDy_#g zwNy`SI7T<5alf6YFs&l$`~lV}UW!sPBX@hy$C#JZ?+j!gO5|U{5+RGP2@s~MZ=q^t zFmar?EpAN1Y67}Hr^TmSL@f9oWp1!J(j&*@$$$aR>FK2J%>oSV7W_)kB_uHZ6^0<< z@->d0pCPN}W9OX^0G_oX*F}5!P465%5$U*+$b;~FG&cvC&2N>z4PE^Nt(ST-mK;JJ zMytltm+<69%~5N5hqzq24;)K`@Kv-f(?}S3?_JEV*q#?BvGG)gA^GB>zk^)E;D|N~ zcOf?hNdNu6OjK}`wK52Mh}Og!*c#8vid(5Qz+?*&?r2MEXGW}8ps`pR)>>5QeT3w` zBSved>(7xfO#iTu0?nCC2gKslmX5NHW4P7l%af$2)xvy^fZsD%XV}kJ#T(MV7qN<` zJ)jfRR>l|vAK@^S4@!8Dxc71BPEgAzymH$vQRW5#dZXqwJ?Gk-Q zk5|3_s5{3{GyyyW;#`;qWsUQqF@k#M+Ir~!Bp}EciQI6uRz)&>|HcAuHqPrFRN|T;x-GX$9EVWr-8>BAD1JJrcJ)lv@_*=

    cQ3TK&r>n2Yo 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 `S)}#Nh2Pl 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 bCQ%Qr%h_Jh_-h2A)L9wKtNO`Qx3vV@hpzo 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 W?JXWg0 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() +\end{minted} + +% !split +\subsection*{Cancer Data again now with Decision Trees and other Methods} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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 + +# Load the data +cancer = load_breast_cancer() + +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))) + +\end{minted} + + +% !split +\subsection*{Another example, the moons again} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() + +\end{minted} + +% !split +\subsection*{Playing around with regions} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +np.random.seed(6) +Xs = np.random.rand(100, 2) - 0.5 +ys = (Xs[:, 0] > 0).astype(np.float32) * 2 + +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() +\end{minted} + +% !split +\subsection*{Regression trees} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +# 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 +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from sklearn.tree import DecisionTreeRegressor + +tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg.fit(X, y) +\end{minted} + +% !split +\subsection*{Final regressor code} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() +\end{minted} + + + +% !split +\subsection*{Pros and cons of trees, pros} + +\begin{itemize} +\item 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) + +\item Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression! + +\item No feature normalization needed + +\item Tree models can handle both continuous and categorical data (Classification and Regression Trees) + +\item Can model nonlinear relationships + +\item Can model interactions between the different descriptive features + +\item Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small) +\end{itemize} + +\noindent +% !split +\subsection*{Disadvantages} + +\begin{itemize} +\item Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches + +\item If continuous features are used the tree may become quite large and hence less interpretable + +\item 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 + +\item 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 + +\item 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. + +\item If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data + +\item Features with many levels may be preferred over features with less levels since for them it is \emph{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 +\end{itemize} + +\noindent +However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. + + +% !split +\subsection*{Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods} + +As stated above and seen in many of the examples discussed here about +a single decision tree, we often end up overfitting our training +data. This normally means that we have a high variance. Can we reduce +the variance of a statistical learning method? + +This leads us to a set of different methods that can combine different +machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are +\begin{enumerate} +\item Voting classifiers + +\item Bagging and Pasting + +\item Random forests + +\item Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost) +\end{enumerate} + +\noindent +We discuss these methods here. + + +% !split +\subsection*{An Overview of Ensemble Methods} + + + +\vspace{6mm} + +% inline figure +\centerline{\includegraphics[width=0.8\linewidth]{DataFiles/ensembleoverview.png}} + +\vspace{6mm} + + + + + +% !split +\subsection*{Bagging} + +The \textbf{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. + +\textbf{Bootstrap aggregation}, or just \textbf{bagging}, is a +general-purpose procedure for reducing the variance of a statistical +learning method. + + +% !split +\subsection*{More bagging} + +Bagging typically results in improved accuracy +over prediction using a single tree. Unfortunately, however, it can be +difficult to interpret the resulting model. Recall that one of the +advantages of decision trees is the attractive and easily interpreted +diagram that results. + +However, when we bag a large number of trees, it is no longer +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. + +% !split +\subsection*{Simple Voting Example, head or tail} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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]) +plt.show() + +\end{minted} + +% !split +\subsection*{Using the Voting Classifier} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) + +\end{minted} + +% !split +\subsection*{Please, not the moons again! Voting and Bagging} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) +\end{minted} + +% !split +\subsection*{Now Bagging} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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) +\end{minted} + + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from sklearn.metrics import accuracy_score +print(accuracy_score(y_test, y_pred)) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() +\end{minted} + + +% !split +\subsection*{Making our own Bagging with Bootstrap} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.tree import DecisionTreeRegressor + + +np.random.seed(2018) + +n = 40 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = DecisionTreeRegressor(max_depth=5) + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + +\end{minted} + + +% !split +\subsection*{Changing the Level of the Decision Tree} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.tree import DecisionTreeRegressor + +n = 100 +n_boostraps = 100 +maxdepth = 8 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdepth) +bias = np.zeros(maxdepth) +variance = np.zeros(maxdepth) +polydegree = np.zeros(maxdepth) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(1,maxdepth): + model = DecisionTreeRegressor(max_depth=degree) + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_) + y_pred[:, i] = model.predict(X_test_scaled)#.ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.xlim(1,maxdepth) +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + + +\end{minted} + + + + +% !split +\subsection*{Random forests} + +Random forests provide an improvement over bagged trees by way of a +small tweak that decorrelates the trees. + +As in bagging, we build a +number of decision trees on bootstrapped training samples. But when +building these decision trees, each time a split in a tree is +considered, a random sample of $m$ predictors is chosen as split +candidates from the full set of $p$ predictors. The split is allowed to +use only one of those $m$ predictors. + +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. + + +% !split +\subsection*{Random Forest Algorithm} +The algorithm described here can be applied to both classification and regression problems. + +We will grow of forest of say $M$ trees. +\begin{enumerate} +\item For $m=1:M$ we +\begin{itemize} + + \item Draw a bootstrap sample of from the training data organized in our $\bm{X}$ matrix. + + \item We grow then a random forest tree $T_m$ based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached +\begin{enumerate} + + \item we select $m \le p$ varibales at random from the $p$ predictors/features + + \item pick the best split point among the $m$ features using either the CART algorithm or the ID3 for classification and create a new node + + \item split the node into daughter nodes + +\end{enumerate} + +\noindent +\end{itemize} + +\noindent +\item Output then the ensemble of trees $\{T_m\}_1^{M}$ and make predictions for either a regression type of problem or a classification type of problem. +\end{enumerate} + +\noindent +% !split +\subsection*{Bootstrap with Random Forests Instead of a Single Tree, own Bagging} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.ensemble import RandomForestRegressor + +np.random.seed(2018) + +n = 100 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = RandomForestRegressor() + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_.ravel()) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + +\end{minted} + + + + +% !split +\subsection*{Random Forests Compared with other Methods on the Cancer Data} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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 + +# Load the data +cancer = load_breast_cancer() + +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))) + + +from sklearn.ensemble import RandomForestClassifier +from sklearn.preprocessing import LabelEncoder +from sklearn.model_selection import cross_validate +# Data set not specificied +#Instantiate the model with 500 trees and entropy as splitting criteria +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy") +Random_Forest_model.fit(X_train_scaled, y_train) +#Cross validation +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score'] +print(accuracy) +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test))) + + +import scikitplot as skplt +y_pred = Random_Forest_model.predict(X_test_scaled) +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True) +plt.show() +y_probas = Random_Forest_model.predict_proba(X_test_scaled) +skplt.metrics.plot_roc(y_test, y_probas) +plt.show() +skplt.metrics.plot_cumulative_gain(y_test, y_probas) +plt.show() + +\end{minted} + + +% !split +\subsection*{Compare Bagging on Trees with Random Forests} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +bag_clf = BaggingClassifier( + DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42), + n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42) +\end{minted} + + + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +bag_clf.fit(X_train, y_train) +y_pred = bag_clf.predict(X_test) +from sklearn.ensemble import RandomForestClassifier +rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42) +rnd_clf.fit(X_train, y_train) +y_pred_rf = rnd_clf.predict(X_test) +np.sum(y_pred == y_pred_rf) / len(y_pred) +\end{minted} + + + + + +% !split +\subsection*{Boosting, a Bird'e Eye} + +The basic idea is to combine weak classifiers in order to create a good +classifier. With a weak classifier we often intend a classifier which +produces results which are only slightly better than we would get by +random guesses. + +This is done by applying in an iterative way a weak (or a standard +classifier like decision trees) to modify the data. In each iteration +we emphasize those observations which are misclassified by weighting +them with a factor. + + +% !split +\subsection*{Adaptive boosting: AdaBoost, Basic Algorithm} + +The algorithm here is rather straightforward. Assume that our weak +classifier is a decision tree and we consider a binary set of outputs +with $y_i \in \{-1,1\}$ and $i=0,1,2,\dots,n-1$ as our set of +observations. Our design matrix is given in terms of the +feature/predictor vectors +$\bm{X}=[\bm{x}_0\bm{x}_1\dots\bm{x}_{p-1}$. Finally, we define also a +classifier determined by our data via a function $G(\bm{X})$. This function tells us how well we are able to classify our outputs/targets $\bm{y}$. + +We can then define the misclassification error $\mathrm{err}$ as +\[ +\mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(\bm{X}_{i*}), +\] +where the function $I()$ is one if we misclassify and zero if we classify correctly. + +% !split +\subsection*{Basic Steps of AdaBoost} + +With the above definitions we are now ready to set up the algorithm for AdaBoost. +The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases. +\begin{enumerate} +\item We start by initializing all weights to $w_i = 1/n$, with $i=0,1,2,\dots n-1$. It is to see then that $\sum_{i=0}^{n-1}w_i = 1$. + +\item We rewrite the misclassification error as +\end{enumerate} + +\noindent +\[ +\mathrm{err}=\frac{\sum_{i=0}^{n-1}w_iI(y_i\ne G(\bm{X}_{i*})}{\sum_{i=0}^{n-1}w_i}, +\] +\begin{enumerate} +\item Then we start looping over all attempts at classifying, namely we start an iterative process for $m=1:M$, where $M$ is the final number of classifications. Our given classifier could for example be a plain decision tree. +\begin{enumerate} + + \item Fit then a given classifier to the training using the weights $w_i$. + + \item Compute then $\mathrm{err}$ and figure out which events are classified properly and which are classified wrongly. + + \item Define a quantity $\alpha_{m} = \log{(1-\mathrm{err})/\mathrm{err}} + + \item Set the new weights to $w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(\bm{X}_{i*})}. + +\end{enumerate} + +\noindent +\item Compute the new classifier $G(\bm{X})= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(\bm{X}_{i*}). +\end{enumerate} + +\noindent +For the iterations with $m \le 2$ the weights are modified +individually at each steps. The obersvations which were misclassified +at iteration $m-1$ have a weight which is larger than those which were +classified properly. As this proceeds, the observations which were +difficult to classifiy correctly are given a larger influence. Each +new classification step $m$ is then forced to concentrate on those +observations that are missed in the previous iterations. + + + +% !split +\subsection*{AdaBoost Examples} + +Using \textbf{Scikit-Learn} it is easy to appply the adaptive boosting algorithm, as done here. + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from sklearn.ensemble import AdaBoostClassifier + +ada_clf = AdaBoostClassifier( + DecisionTreeClassifier(max_depth=1), n_estimators=200, + algorithm="SAMME.R", learning_rate=0.5, random_state=42) +ada_clf.fit(X_train, y_train) + +plot_decision_boundary(ada_clf, X, y) + +m = len(X_train) + +plt.figure(figsize=(11, 4)) +for subplot, learning_rate in ((121, 1), (122, 0.5)): + sample_weights = np.ones(m) + plt.subplot(subplot) + for i in range(5): + svm_clf = SVC(kernel="rbf", C=0.05, gamma="auto", random_state=42) + svm_clf.fit(X_train, y_train, sample_weight=sample_weights) + y_pred = svm_clf.predict(X_train) + sample_weights[y_pred != y_train] *= (1 + learning_rate) + plot_decision_boundary(svm_clf, X, y, alpha=0.2) + plt.title("learning_rate = {}".format(learning_rate), fontsize=16) + if subplot == 121: + plt.text(-0.7, -0.65, "1", fontsize=14) + plt.text(-0.6, -0.10, "2", fontsize=14) + plt.text(-0.5, 0.10, "3", fontsize=14) + plt.text(-0.4, 0.55, "4", fontsize=14) + plt.text(-0.3, 0.90, "5", fontsize=14) + +save_fig("boosting_plot") +plt.show() +\end{minted} + + +% !split +\subsection*{Gradient boosting: Basics} + +Gradient boosting is again a similar technique to Adapative boosting, +it combines so-called weak classifiers or regressors into a strong +method via a series of iterations. + +In order to understand the method, let us illustrate its basics by +bringing back the essential steps in linear regression, where our cost +function was the least squares function. + +% !split +\subsection*{Gradient Boosting, algorithm} + +Suppose we have a cost function $C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i))$ where $y_i$ is our target and $f(x_i)$ the function which is meant to model $y_i$. The above cost function could be our standard least squares function +\[ +C(\bm{y},\bm{f})=\frac{1}{n}\sum_{i=0}^{n-1}(y_i-f(x_i))^2. +\] + +The way we proceed in an iterative fashion is to +\begin{enumerate} +\item Initialize our estimate by $f_0(x)=0$. + +\item For $m=1:M$, we +\begin{enumerate} + + \item compute the negative gradient vector $\bm{u}_m = -\partial C(\bm{y},\bm{f})/\partial \bm{f}(x)$ at $f(x) = f_{m-1}(x); + + \item fit the so-called base-learner to the negative gradient $h_m(u_m,x)$; + + \item update the estimate $f_m(x) = f_{m-1}(x)+\nu h_m(u_m,x)$; + +\end{enumerate} + +\noindent +\item The final estimate is then $f_M(x) = \sum_{m=1}^M\nu h_m(u_m,x)$. +\end{enumerate} + +\noindent +% !split +\subsection*{Gradient Boosting, Examples} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +np.random.seed(42) +X = np.random.rand(100, 1) - 0.5 +y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100) + +from sklearn.tree import DecisionTreeRegressor + +tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg1.fit(X, y) + +y2 = y - tree_reg1.predict(X) +tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg2.fit(X, y2) + +y3 = y2 - tree_reg2.predict(X) +tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg3.fit(X, y3) + +X_new = np.array([[0.8]]) +y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3)) + +def plot_predictions(regressors, X, y, axes, label=None, style="r-", data_style="b.", data_label=None): + x1 = np.linspace(axes[0], axes[1], 500) + y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors) + plt.plot(X[:, 0], y, data_style, label=data_label) + plt.plot(x1, y_pred, style, linewidth=2, label=label) + if label or data_label: + plt.legend(loc="upper center", fontsize=16) + plt.axis(axes) + +plt.figure(figsize=(11,11)) + +plt.subplot(321) +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h_1(x_1)$", style="g-", data_label="Training set") +plt.ylabel("$y$", fontsize=16, rotation=0) +plt.title("Residuals and tree predictions", fontsize=16) + +plt.subplot(322) +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1)$", data_label="Training set") +plt.ylabel("$y$", fontsize=16, rotation=0) +plt.title("Ensemble predictions", fontsize=16) + +plt.subplot(323) +plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_2(x_1)$", style="g-", data_style="k+", data_label="Residuals") +plt.ylabel("$y - h_1(x_1)$", fontsize=16) + +plt.subplot(324) +plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1)$") +plt.ylabel("$y$", fontsize=16, rotation=0) + +plt.subplot(325) +plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_3(x_1)$", style="g-", data_style="k+") +plt.ylabel("$y - h_1(x_1) - h_2(x_1)$", fontsize=16) +plt.xlabel("$x_1$", fontsize=16) + +plt.subplot(326) +plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$") +plt.xlabel("$x_1$", fontsize=16) +plt.ylabel("$y$", fontsize=16, rotation=0) + +save_fig("gradient_boosting_plot") +plt.show() + +from sklearn.ensemble import GradientBoostingRegressor + +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42) +gbrt.fit(X, y) + +gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42) +gbrt_slow.fit(X, y) + +plt.figure(figsize=(11,4)) + +plt.subplot(121) +plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="Ensemble predictions") +plt.title("learning_rate={}, n_estimators={}".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14) + +plt.subplot(122) +plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8]) +plt.title("learning_rate={}, n_estimators={}".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14) + +save_fig("gbrt_learning_rate_plot") +plt.show() + +\end{minted} + + +% !split +\subsection*{Gradient Boots with Early Stopping} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} + +from sklearn.model_selection import train_test_split +from sklearn.metrics import mean_squared_error + +X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49) + +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42) +gbrt.fit(X_train, y_train) + +errors = [mean_squared_error(y_val, y_pred) + for y_pred in gbrt.staged_predict(X_val)] +bst_n_estimators = np.argmin(errors) + 1 + +gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42) +gbrt_best.fit(X_train, y_train) + +min_error = np.min(errors) +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plt.plot(errors, "b.-") +plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], "k--") +plt.plot([0, 120], [min_error, min_error], "k--") +plt.plot(bst_n_estimators, min_error, "ko") +plt.text(bst_n_estimators, min_error*1.2, "Minimum", ha="center", fontsize=14) +plt.axis([0, 120, 0, 0.01]) +plt.xlabel("Number of trees") +plt.title("Validation error", fontsize=14) + +plt.subplot(122) +plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8]) +plt.title("Best model (%d trees)" % bst_n_estimators, fontsize=14) + +save_fig("early_stopping_gbrt_plot") +plt.show() + + +gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42) + +min_val_error = float("inf") +error_going_up = 0 +for n_estimators in range(1, 120): + gbrt.n_estimators = n_estimators + gbrt.fit(X_train, y_train) + y_pred = gbrt.predict(X_val) + val_error = mean_squared_error(y_val, y_pred) + if val_error < min_val_error: + min_val_error = val_error + error_going_up = 0 + else: + error_going_up += 1 + if error_going_up == 5: + break # early stopping + + +print(gbrt.n_estimators) +print("Minimum validation MSE:", min_val_error) +\end{minted} + +% !split +\subsection*{XGBoost: Extreme Gradient Boosting} + + +\href{{https://github.com/dmlc/xgboost}}{XGBoost} or Extreme Gradient +Boosting, is an optimized distributed gradient boosting library +designed to be highly efficient, flexible and portable. It implements +machine learning algorithms under the Gradient Boosting +framework. XGBoost provides a parallel tree boosting that solve many +data science problems in a fast and accurate way. See the \href{{https://arxiv.org/abs/1603.02754}}{article by Chen and Guestrin}. + +The authors design and build a highly scalable end-to-end tree +boosting system. It has a theoretically justified weighted quantile +sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning. + +It is now the algorithm which wins essentially all ML competitions!!! + +% !split +\subsection*{Regression Case} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +import xgboost as xgb +from sklearn.preprocessing import StandardScaler +import scikitplot as skplt +from sklearn.metrics import mean_squared_error + +n = 100 +maxdegree = 6 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) + +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) +scaler = StandardScaler() +scaler.fit(X_train) +X_train_scaled = scaler.transform(X_train) +X_test_scaled = scaler.transform(X_test) + +for degree in range(maxdegree): + model = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1, + max_depth = degree, alpha = 10, n_estimators = 10) + model.fit(X_train_scaled,y_train) + y_pred = model.predict(X_test_scaled) + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 ) + variance[degree] = np.mean( np.var(y_pred) ) + print('Max depth:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.xlim(1,maxdegree-1) +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + +\end{minted} + + + +% !split +\subsection*{Xgboost on the Cancer Data} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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.preprocessing import LabelEncoder +from sklearn.model_selection import cross_validate +import scikitplot as skplt +import xgboost as xgb +# Load the data +cancer = load_breast_cancer() + +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) +#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) + +xg_clf = xgb.XGBClassifier() +xg_clf.fit(X_train_scaled,y_train) +xgb.plot_tree(xg_clf,num_trees=0) +plt.rcParams['figure.figsize'] = [50, 10] +plt.show() +xgb.plot_importance(xg_clf) +plt.rcParams['figure.figsize'] = [5, 5] +plt.show() +\end{minted} + +% ------------------- end of main content --------------- + +\end{document} + diff --git a/doc/src/DecisionTrees/DecisionTrees-reveal.html b/doc/src/DecisionTrees/DecisionTrees-reveal.html new file mode 100644 index 000000000..0d1365a1e --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees-reveal.html @@ -0,0 +1,2657 @@ + + + + + + + +Data Analysis and Machine Learning: From Decision Trees to Forests and all that + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + +
    + + + + + + + + + + + + + + +
    + + + + +

    Data Analysis and Machine Learning: From Decision Trees to Forests and all that

    + +

    + + +

    +Morten Hjorth-Jensen [1, 2] +
    + +

     
    + + +

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

     
    +

    Nov 7, 2019

    +
    +

    + +

    + © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
    +
    + + +
    +

    Decision trees, overarching aims

    + +

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

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

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

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

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

    + + +
    +

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    + +

    +



    + +

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

    + + +
    +

    General Features

    + +

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

      +

    • A leaf provides the classification of a given instance.
    • +

    • A node specifies a test of some attribute of the instance.
    • +

    • A branch corresponds to a possible values of an attribute.
    • +

    • An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.
    • +
    +

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

    + + +
    +

    How do we set it up?

    + +

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

      +

    1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature
    2. +

    3. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process
    4. +

    5. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the predictions we want to make for new query instances
    6. +

    7. Show query instances to the tree and run down the tree until we arrive at leaf nodes
    8. +
    +

    + +Then we are essentially done! +

    + + +
    +

    Decision trees and Regression

    +

    + + +

    import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import PolynomialFeatures
    +from sklearn.linear_model import LinearRegression
    +
    +steps=250
    +
    +distance=0
    +x=0
    +distance_list=[]
    +steps_list=[]
    +while x<steps:
    +    distance+=np.random.randint(-1,2)
    +    distance_list.append(distance)
    +    x+=1
    +    steps_list.append(x)
    +plt.plot(steps_list,distance_list, color='green', label="Random Walk Data")
    +
    +steps_list=np.asarray(steps_list)
    +distance_list=np.asarray(distance_list)
    +
    +X=steps_list[:,np.newaxis]
    +
    +#Polynomial fits
    +
    +#Degree 2
    +poly_features=PolynomialFeatures(degree=2, include_bias=False)
    +X_poly=poly_features.fit_transform(X)
    +
    +lin_reg=LinearRegression()
    +poly_fit=lin_reg.fit(X_poly,distance_list)
    +b=lin_reg.coef_
    +c=lin_reg.intercept_
    +print ("2nd degree coefficients:")
    +print ("zero power: ",c)
    +print ("first power: ", b[0])
    +print ("second power: ",b[1])
    +
    +z = np.arange(0, steps, .01)
    +z_mod=b[1]*z**2+b[0]*z+c
    +
    +fit_mod=b[1]*X**2+b[0]*X+c
    +plt.plot(z, z_mod, color='r', label="2nd Degree Fit")
    +plt.title("Polynomial Regression")
    +
    +plt.xlabel("Steps")
    +plt.ylabel("Distance")
    +
    +#Degree 10
    +poly_features10=PolynomialFeatures(degree=10, include_bias=False)
    +X_poly10=poly_features10.fit_transform(X)
    +
    +poly_fit10=lin_reg.fit(X_poly10,distance_list)
    +
    +y_plot=poly_fit10.predict(X_poly10)
    +plt.plot(X, y_plot, color='black', label="10th Degree Fit")
    +
    +plt.legend()
    +plt.show()
    +
    +
    +#Decision Tree Regression
    +from sklearn.tree import DecisionTreeRegressor
    +regr_1=DecisionTreeRegressor(max_depth=2)
    +regr_2=DecisionTreeRegressor(max_depth=5)
    +regr_3=DecisionTreeRegressor(max_depth=7)
    +regr_1.fit(X, distance_list)
    +regr_2.fit(X, distance_list)
    +regr_3.fit(X, distance_list)
    +
    +X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]
    +y_1 = regr_1.predict(X_test)
    +y_2 = regr_2.predict(X_test)
    +y_3=regr_3.predict(X_test)
    +
    +# Plot the results
    +plt.figure()
    +plt.scatter(X, distance_list, s=2.5, c="black", label="data")
    +plt.plot(X_test, y_1, color="red",
    +         label="max_depth=2", linewidth=2)
    +plt.plot(X_test, y_2, color="green", label="max_depth=5", linewidth=2)
    +plt.plot(X_test, y_3, color="m", label="max_depth=7", linewidth=2)
    +
    +plt.xlabel("Data")
    +plt.ylabel("Darget")
    +plt.title("Decision Tree Regression")
    +plt.legend()
    +plt.show()
    +
    +
    + + +
    +

    Building a tree, regression

    + +

    +There are mainly two steps + +

      +

    1. We split the predictor space (the set of possible values \( x_1,x_2,\dots, x_p \)) into \( J \) distinct and non-non-overlapping regions, \( R_1,R_2,\dots,R_J \).
    2. + +

    3. For every observation that falls into the region \( R_j \) , we make the same prediction, which is simply the mean of the response values for the training observations in \( R_j \).
    4. +
    +

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

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

     
    + +

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

    + + +
    +

    A top-down approach, recursive binary splitting

    + +

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

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

    + + +
    +

    Making a tree

    + +

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

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

     
    + +and +

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

     
    + +so that we obtain the lowest MSE, that is +

     
    +$$ +\sum_{i:x_i\in R_j}(y_i-\overline{y}_{R_1})^2+\sum_{i:x_i\in R_2}(y_i-\overline{y}_{R_2})^2, +$$ +

     
    + +

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

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

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

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

    + + +
    +

    Pruning the tree

    + +

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

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

    + + +
    +

    Cost complexity pruning

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

     
    +$$ +\sum_{m=1}^{\overline{T}}\sum_{i:x_i\in R_m}(y_i-\overline{y}_{R_m})^2+\alpha\overline{T}, +$$ +

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

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

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

    + + +
    +

    Schematic Regression Procedure

    + +

    +

    +Building a Regression Tree. +
      +

    1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.
    2. +

    3. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of \( \alpha \).
    4. +

    5. Use for example \( K \)-fold cross-validation to choose \( \alpha \). Divide the training observations into \( K \) folds. For each \( k=1,2,\dots,K \) we:
    6. + +
        + +

      • repeat steps 1 and 2 on all but the \( k \)-th fold of the training data.
      • + +

      • Then we valuate the mean squared prediction error on the data in the left-out \( k \)-th fold, as a function of \( \alpha \).
      • + +

      • Finally we average the results for each value of \( \alpha \), and pick \( \alpha \) to minimize the average error.
      • +
      +

    7. Return the subtree from Step 2 that corresponds to the chosen value of \( \alpha \).
    8. +
    +
    +
    + + +
    +

    A Classification Tree

    + +

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

    + + +
    +

    Growing a classification tree

    + +

    +The task of growing a +classification tree is quite similar to the task of growing a +regression tree. Just as in the regression setting, we use recursive +binary splitting to grow a classification tree. However, in the +classification setting, the MSE cannot be used as a criterion for making +the binary splits. A natural alternative to MSE is the classification +error rate. Since we plan to assign an observation in a given region +to the most commonly occurring error rate class of training +observations in that region, the classification error rate is simply +the fraction of the training observations in that region that do not +belong to the most common class. + +

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

    + + +
    +

    Classification tree, how to split nodes

    + +

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

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

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

     
    + +

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

      +

    • Misclassification error
    • +
    +

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

     
    + + +

      +

    • Gini index \( g \)
    • +
    +

     
    +$$ +g = \sum_{k=1}^K p_{mk}(1-p_{mk}). +$$ +

     
    + + +

      +

    • Information entropy or just entropy \( s \)
    • +
    +

     
    +$$ +s = -\sum_{k=1}^K p_{mk}\log{p_{mk}}. +$$ +

     
    +

    + + +
    +

    Visualizing the Tree, Classification

    +

    + + +

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

    Algorithms for Setting up Decision Trees

    + +

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

      +

    1. The CART (Classification And Regression Tree) algorithm for both classification and regression
    2. +

    3. The ID3 algorithm based on the computation of the information gain for classification
    4. +
    +

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

    + + +
    +

    The CART algorithm for Classification

    +
    + + +
    +

    The CART algorithm for Regression

    +
    + + +
    +

    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
    +

    + + +
    +

    Simple Python Code to read in Data and perform Classification

    + +

    + + +

    # Common imports
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.tree import export_graphviz
    +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("rideclass.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)
    +
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +
    +# Create the encoder.
    +encoder = OneHotEncoder(handle_unknown="ignore")
    +# Assume for simplicity all features are categorical.
    +encoder.fit(X)    
    +# Apply the encoder.
    +X = encoder.transform(X)
    +print(X)
    +# Then do a Classification tree
    +tree_clf = DecisionTreeClassifier(max_depth=2)
    +tree_clf.fit(X, y)
    +print("Train set accuracy with Decision Tree: {:.2f}".format(tree_clf.score(X,y)))
    +#transfer to a decision tree graph
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/ride.dot",
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
    +
    +
    + + +
    +

    Computing the Gini Factor

    + +

    +The above functions (gini, entropy and misclassification error) are +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:
    +		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)
    +			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]]
    +
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
    +
    +
    + + +
    +

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

      +

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

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

    + + +
    +

    Implementing the ID3 Algorithm

    + +

    + + +

    import re
    +import math
    +from collections import deque
    +
    +# x is examples in training set
    +# y is set of targets
    +# 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()
    +
    +
    + + +
    +

    Cancer Data again now with Decision Trees and other Methods

    +

    + + +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
    +
    + + +
    +

    Another example, the moons again

    +

    + + +

    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()
    +
    +
    + + +
    +

    Playing around with regions

    +

    + + +

    np.random.seed(6)
    +Xs = np.random.rand(100, 2) - 0.5
    +ys = (Xs[:, 0] > 0).astype(np.float32) * 2
    +
    +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()
    +
    +
    + + +
    +

    Regression trees

    +

    + + +

    # 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
    +
    +tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg.fit(X, y)
    +
    +
    + + +
    +

    Final regressor code

    +

    + + +

    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()
    +
    +
    + + +
    +

    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)
    • +

    • 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)
    • +
    +
    + + +
    +

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

    + + +
    +

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

    + +

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

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

      +

    1. Voting classifiers
    2. +

    3. Bagging and Pasting
    4. +

    5. Random forests
    6. +

    7. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)
    8. +
    +

    + +We discuss these methods here. +

    + + +
    +

    An Overview of Ensemble Methods

    + +

    +



    +
    + + +
    +

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

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

    + + +
    +

    Simple Voting Example, head or tail

    +

    + + +

    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])
    +plt.show()
    +
    +
    + + +
    +

    Using the Voting Classifier

    +

    + + +

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

    Please, not the moons again! Voting and Bagging

    +

    + + +

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

    + + +

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

    Now Bagging

    + +

    + + +

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

    + + +

    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()
    +
    +
    + + +
    +

    Making our own Bagging with Bootstrap

    +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.tree import DecisionTreeRegressor
    +
    +
    +np.random.seed(2018)
    +
    +n = 40
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = DecisionTreeRegressor(max_depth=5) 
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_)
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +
    + + +
    +

    Changing the Level of the Decision Tree

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.tree import DecisionTreeRegressor
    +
    +n = 100
    +n_boostraps = 100
    +maxdepth = 8
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdepth)
    +bias = np.zeros(maxdepth)
    +variance = np.zeros(maxdepth)
    +polydegree = np.zeros(maxdepth)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(1,maxdepth):
    +    model = DecisionTreeRegressor(max_depth=degree) 
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_)
    +        y_pred[:, i] = model.predict(X_test_scaled)#.ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.xlim(1,maxdepth)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +
    + + +
    +

    Random forests

    + +

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

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

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

    + + +
    +

    Random Forest Algorithm

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

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

      +

    1. For \( m=1:M \) we
    2. + +
        + +

      • Draw a bootstrap sample of from the training data organized in our \( \boldsymbol{X} \) matrix.
      • + +

      • We grow then a random forest tree \( T_m \) based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached
      • + +
          + +

        1. we select \( m \le p \) varibales at random from the \( p \) predictors/features
        2. + +

        3. pick the best split point among the \( m \) features using either the CART algorithm or the ID3 for classification and create a new node
        4. + +

        5. split the node into daughter nodes
        6. +
        +

        +

      +

    3. Output then the ensemble of trees \( \{T_m\}_1^{M} \) and make predictions for either a regression type of problem or a classification type of problem.
    4. +
    +
    + + +
    +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
    +
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +
    + + +
    +

    Random Forests Compared with other Methods on the Cancer Data

    +

    + + +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
    +
    +from sklearn.ensemble import RandomForestClassifier
    +from sklearn.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +# Data set not specificied
    +#Instantiate the model with 500 trees and entropy as splitting criteria
    +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy")
    +Random_Forest_model.fit(X_train_scaled, y_train)
    +#Cross validation
    +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']
    +print(accuracy)
    +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test)))
    +
    +
    +import scikitplot as skplt
    +y_pred = Random_Forest_model.predict(X_test_scaled)
    +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
    +plt.show()
    +y_probas = Random_Forest_model.predict_proba(X_test_scaled)
    +skplt.metrics.plot_roc(y_test, y_probas)
    +plt.show()
    +skplt.metrics.plot_cumulative_gain(y_test, y_probas)
    +plt.show()
    +
    +
    + + +
    +

    Compare Bagging on Trees with Random Forests

    +

    + + +

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

    + + +

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

    Boosting, a Bird'e Eye

    + +

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

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

    + + +
    +

    Adaptive boosting: AdaBoost, Basic Algorithm

    + +

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

    +We can then define the misclassification error \( \mathrm{err} \) as +

     
    +$$ +\mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(\boldsymbol{X}_{i*}), +$$ +

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

    + + +
    +

    Basic Steps of AdaBoost

    + +

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

      +

    1. We start by initializing all weights to \( w_i = 1/n \), with \( i=0,1,2,\dots n-1 \). It is to see then that \( \sum_{i=0}^{n-1}w_i = 1 \).
    2. +

    3. We rewrite the misclassification error as
    4. +
    +

     
    +$$ +\mathrm{err}=\frac{\sum_{i=0}^{n-1}w_iI(y_i\ne G(\boldsymbol{X}_{i*})}{\sum_{i=0}^{n-1}w_i}, +$$ +

     
    + + +

      +

    1. Then we start looping over all attempts at classifying, namely we start an iterative process for \( m=1:M \), where \( M \) is the final number of classifications. Our given classifier could for example be a plain decision tree. + +
        +

      1. Fit then a given classifier to the training using the weights \( w_i \).
      2. +

      3. Compute then \( \mathrm{err} \) and figure out which events are classified properly and which are classified wrongly.
      4. +

      5. Define a quantity $\alpha_{m} = \log{(1-\mathrm{err})/\mathrm{err}}
      6. +

      7. Set the new weights to $w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(\boldsymbol{X}_{i*})}.
      8. +
      +

    2. Compute the new classifier $G(\boldsymbol{X})= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(\boldsymbol{X}_{i*}).
    3. +
    +

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

    + + +
    +

    AdaBoost Examples

    + +

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

    + + +

    from sklearn.ensemble import AdaBoostClassifier
    +
    +ada_clf = AdaBoostClassifier(
    +    DecisionTreeClassifier(max_depth=1), n_estimators=200,
    +    algorithm="SAMME.R", learning_rate=0.5, random_state=42)
    +ada_clf.fit(X_train, y_train)
    +
    +plot_decision_boundary(ada_clf, X, y)
    +
    +m = len(X_train)
    +
    +plt.figure(figsize=(11, 4))
    +for subplot, learning_rate in ((121, 1), (122, 0.5)):
    +    sample_weights = np.ones(m)
    +    plt.subplot(subplot)
    +    for i in range(5):
    +        svm_clf = SVC(kernel="rbf", C=0.05, gamma="auto", random_state=42)
    +        svm_clf.fit(X_train, y_train, sample_weight=sample_weights)
    +        y_pred = svm_clf.predict(X_train)
    +        sample_weights[y_pred != y_train] *= (1 + learning_rate)
    +        plot_decision_boundary(svm_clf, X, y, alpha=0.2)
    +        plt.title("learning_rate = {}".format(learning_rate), fontsize=16)
    +    if subplot == 121:
    +        plt.text(-0.7, -0.65, "1", fontsize=14)
    +        plt.text(-0.6, -0.10, "2", fontsize=14)
    +        plt.text(-0.5,  0.10, "3", fontsize=14)
    +        plt.text(-0.4,  0.55, "4", fontsize=14)
    +        plt.text(-0.3,  0.90, "5", fontsize=14)
    +
    +save_fig("boosting_plot")
    +plt.show()
    +
    +
    + + +
    +

    Gradient boosting: Basics

    + +

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

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

    + + +
    +

    Gradient Boosting, algorithm

    + +

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

     
    +$$ +C(\boldsymbol{y},\boldsymbol{f})=\frac{1}{n}\sum_{i=0}^{n-1}(y_i-f(x_i))^2. +$$ +

     
    + +

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

      +

    1. Initialize our estimate by \( f_0(x)=0 \).
    2. +

    3. For \( m=1:M \), we + +
        +

      1. compute the negative gradient vector \( \boldsymbol{u}_m = -\partial C(\boldsymbol{y},\boldsymbol{f})/\partial \boldsymbol{f}(x) \) at $f(x) = f_{m-1}(x);
      2. +

      3. fit the so-called base-learner to the negative gradient \( h_m(u_m,x) \);
      4. +

      5. update the estimate \( f_m(x) = f_{m-1}(x)+\nu h_m(u_m,x) \);
      6. +
      +

    4. The final estimate is then \( f_M(x) = \sum_{m=1}^M\nu h_m(u_m,x) \).
    5. +
    +
    + + +
    +

    Gradient Boosting, Examples

    +

    + + +

    np.random.seed(42)
    +X = np.random.rand(100, 1) - 0.5
    +y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100)
    +
    +from sklearn.tree import DecisionTreeRegressor
    +
    +tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg1.fit(X, y)
    +
    +y2 = y - tree_reg1.predict(X)
    +tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg2.fit(X, y2)
    +
    +y3 = y2 - tree_reg2.predict(X)
    +tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg3.fit(X, y3)
    +
    +X_new = np.array([[0.8]])
    +y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))
    +
    +def plot_predictions(regressors, X, y, axes, label=None, style="r-", data_style="b.", data_label=None):
    +    x1 = np.linspace(axes[0], axes[1], 500)
    +    y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors)
    +    plt.plot(X[:, 0], y, data_style, label=data_label)
    +    plt.plot(x1, y_pred, style, linewidth=2, label=label)
    +    if label or data_label:
    +        plt.legend(loc="upper center", fontsize=16)
    +    plt.axis(axes)
    +
    +plt.figure(figsize=(11,11))
    +
    +plt.subplot(321)
    +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h_1(x_1)$", style="g-", data_label="Training set")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +plt.title("Residuals and tree predictions", fontsize=16)
    +
    +plt.subplot(322)
    +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1)$", data_label="Training set")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +plt.title("Ensemble predictions", fontsize=16)
    +
    +plt.subplot(323)
    +plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_2(x_1)$", style="g-", data_style="k+", data_label="Residuals")
    +plt.ylabel("$y - h_1(x_1)$", fontsize=16)
    +
    +plt.subplot(324)
    +plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1)$")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +
    +plt.subplot(325)
    +plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_3(x_1)$", style="g-", data_style="k+")
    +plt.ylabel("$y - h_1(x_1) - h_2(x_1)$", fontsize=16)
    +plt.xlabel("$x_1$", fontsize=16)
    +
    +plt.subplot(326)
    +plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$")
    +plt.xlabel("$x_1$", fontsize=16)
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +
    +save_fig("gradient_boosting_plot")
    +plt.show()
    +
    +from sklearn.ensemble import GradientBoostingRegressor
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42)
    +gbrt.fit(X, y)
    +
    +gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42)
    +gbrt_slow.fit(X, y)
    +
    +plt.figure(figsize=(11,4))
    +
    +plt.subplot(121)
    +plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="Ensemble predictions")
    +plt.title("learning_rate={}, n_estimators={}".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14)
    +
    +plt.subplot(122)
    +plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8])
    +plt.title("learning_rate={}, n_estimators={}".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14)
    +
    +save_fig("gbrt_learning_rate_plot")
    +plt.show()
    +
    +
    + + +
    +

    Gradient Boots with Early Stopping

    +

    + + +

    from sklearn.model_selection import train_test_split
    +from sklearn.metrics import mean_squared_error
    +
    +X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49)
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42)
    +gbrt.fit(X_train, y_train)
    +
    +errors = [mean_squared_error(y_val, y_pred)
    +          for y_pred in gbrt.staged_predict(X_val)]
    +bst_n_estimators = np.argmin(errors) + 1
    +
    +gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42)
    +gbrt_best.fit(X_train, y_train)
    +
    +min_error = np.min(errors)
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.plot(errors, "b.-")
    +plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], "k--")
    +plt.plot([0, 120], [min_error, min_error], "k--")
    +plt.plot(bst_n_estimators, min_error, "ko")
    +plt.text(bst_n_estimators, min_error*1.2, "Minimum", ha="center", fontsize=14)
    +plt.axis([0, 120, 0, 0.01])
    +plt.xlabel("Number of trees")
    +plt.title("Validation error", fontsize=14)
    +
    +plt.subplot(122)
    +plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8])
    +plt.title("Best model (%d trees)" % bst_n_estimators, fontsize=14)
    +
    +save_fig("early_stopping_gbrt_plot")
    +plt.show()
    +
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42)
    +
    +min_val_error = float("inf")
    +error_going_up = 0
    +for n_estimators in range(1, 120):
    +    gbrt.n_estimators = n_estimators
    +    gbrt.fit(X_train, y_train)
    +    y_pred = gbrt.predict(X_val)
    +    val_error = mean_squared_error(y_val, y_pred)
    +    if val_error < min_val_error:
    +        min_val_error = val_error
    +        error_going_up = 0
    +    else:
    +        error_going_up += 1
    +        if error_going_up == 5:
    +            break  # early stopping
    +
    +
    +print(gbrt.n_estimators)
    +print("Minimum validation MSE:", min_val_error)
    +
    +
    + + +
    +

    XGBoost: Extreme Gradient Boosting

    + +

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

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

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

    + + +
    +

    Regression Case

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +import xgboost as xgb
    +from sklearn.preprocessing import StandardScaler
    +import scikitplot as skplt
    +from sklearn.metrics import mean_squared_error
    +
    +n = 100
    +maxdegree = 6
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +scaler = StandardScaler()
    +scaler.fit(X_train)
    +X_train_scaled = scaler.transform(X_train)
    +X_test_scaled = scaler.transform(X_test)
    +
    +for degree in range(maxdegree):
    +    model =  xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,
    +                max_depth = degree, alpha = 10, n_estimators = 10)
    +    model.fit(X_train_scaled,y_train)
    +    y_pred = model.predict(X_test_scaled)
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 )
    +    variance[degree] = np.mean( np.var(y_pred) )
    +    print('Max depth:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.xlim(1,maxdegree-1)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +
    + + +
    +

    Xgboost on the Cancer Data

    +

    + + +

    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.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +import scikitplot as skplt
    +import xgboost as xgb
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)
    +#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)
    +
    +xg_clf = xgb.XGBClassifier()
    +xg_clf.fit(X_train_scaled,y_train)
    +xgb.plot_tree(xg_clf,num_trees=0)
    +plt.rcParams['figure.figsize'] = [50, 10]
    +plt.show()
    +xgb.plot_importance(xg_clf)
    +plt.rcParams['figure.figsize'] = [5, 5]
    +plt.show()
    +
    +
    + + + +
    +
    + + + + + + + + + + + + diff --git a/doc/src/DecisionTrees/DecisionTrees-solarized.html b/doc/src/DecisionTrees/DecisionTrees-solarized.html new file mode 100644 index 000000000..1d6e730c8 --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees-solarized.html @@ -0,0 +1,2502 @@ + + + + + + + + +Data Analysis and Machine Learning: From Decision Trees to Forests and all that + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Data Analysis and Machine Learning: From Decision Trees to Forests and all that

    + +

    + + +

    +Morten Hjorth-Jensen [1, 2] +
    + +

    + + +

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

    +

    Nov 7, 2019

    +
    +

    +









    + +

    Decision trees, overarching aims

    + +

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

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

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

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

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

    +









    + +

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    + +

    +



    + +

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

    +









    + +

    General Features

    + +

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

      +
    • A leaf provides the classification of a given instance.
    • +
    • A node specifies a test of some attribute of the instance.
    • +
    • A branch corresponds to a possible values of an attribute.
    • +
    • An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.
    • +
    + +This process is then repeated for the subtree rooted at the new +node. + +

    +









    + +

    How do we set it up?

    + +

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

      +
    1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature
    2. +
    3. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process
    4. +
    5. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the predictions we want to make for new query instances
    6. +
    7. Show query instances to the tree and run down the tree until we arrive at leaf nodes
    8. +
    + +Then we are essentially done! + +

    +









    + +

    Decision trees and Regression

    +

    + + +

    import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import PolynomialFeatures
    +from sklearn.linear_model import LinearRegression
    +
    +steps=250
    +
    +distance=0
    +x=0
    +distance_list=[]
    +steps_list=[]
    +while x<steps:
    +    distance+=np.random.randint(-1,2)
    +    distance_list.append(distance)
    +    x+=1
    +    steps_list.append(x)
    +plt.plot(steps_list,distance_list, color='green', label="Random Walk Data")
    +
    +steps_list=np.asarray(steps_list)
    +distance_list=np.asarray(distance_list)
    +
    +X=steps_list[:,np.newaxis]
    +
    +#Polynomial fits
    +
    +#Degree 2
    +poly_features=PolynomialFeatures(degree=2, include_bias=False)
    +X_poly=poly_features.fit_transform(X)
    +
    +lin_reg=LinearRegression()
    +poly_fit=lin_reg.fit(X_poly,distance_list)
    +b=lin_reg.coef_
    +c=lin_reg.intercept_
    +print ("2nd degree coefficients:")
    +print ("zero power: ",c)
    +print ("first power: ", b[0])
    +print ("second power: ",b[1])
    +
    +z = np.arange(0, steps, .01)
    +z_mod=b[1]*z**2+b[0]*z+c
    +
    +fit_mod=b[1]*X**2+b[0]*X+c
    +plt.plot(z, z_mod, color='r', label="2nd Degree Fit")
    +plt.title("Polynomial Regression")
    +
    +plt.xlabel("Steps")
    +plt.ylabel("Distance")
    +
    +#Degree 10
    +poly_features10=PolynomialFeatures(degree=10, include_bias=False)
    +X_poly10=poly_features10.fit_transform(X)
    +
    +poly_fit10=lin_reg.fit(X_poly10,distance_list)
    +
    +y_plot=poly_fit10.predict(X_poly10)
    +plt.plot(X, y_plot, color='black', label="10th Degree Fit")
    +
    +plt.legend()
    +plt.show()
    +
    +
    +#Decision Tree Regression
    +from sklearn.tree import DecisionTreeRegressor
    +regr_1=DecisionTreeRegressor(max_depth=2)
    +regr_2=DecisionTreeRegressor(max_depth=5)
    +regr_3=DecisionTreeRegressor(max_depth=7)
    +regr_1.fit(X, distance_list)
    +regr_2.fit(X, distance_list)
    +regr_3.fit(X, distance_list)
    +
    +X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]
    +y_1 = regr_1.predict(X_test)
    +y_2 = regr_2.predict(X_test)
    +y_3=regr_3.predict(X_test)
    +
    +# Plot the results
    +plt.figure()
    +plt.scatter(X, distance_list, s=2.5, c="black", label="data")
    +plt.plot(X_test, y_1, color="red",
    +         label="max_depth=2", linewidth=2)
    +plt.plot(X_test, y_2, color="green", label="max_depth=5", linewidth=2)
    +plt.plot(X_test, y_3, color="m", label="max_depth=7", linewidth=2)
    +
    +plt.xlabel("Data")
    +plt.ylabel("Darget")
    +plt.title("Decision Tree Regression")
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Building a tree, regression

    + +

    +There are mainly two steps + +

      +
    1. We split the predictor space (the set of possible values \( x_1,x_2,\dots, x_p \)) into \( J \) distinct and non-non-overlapping regions, \( R_1,R_2,\dots,R_J \).
    2. +
    3. For every observation that falls into the region \( R_j \) , we make the same prediction, which is simply the mean of the response values for the training observations in \( R_j \).
    4. +
    + +How do we construct the regions \( R_1,\dots,R_J \)? In theory, the +regions could have any shape. However, we choose to divide the +predictor space into high-dimensional rectangles, or boxes, for +simplicity and for ease of interpretation of the resulting predictive +model. The goal is to find boxes \( R_1,\dots,R_J \) that minimize the +MSE, given by + +$$ +\sum_{j=1}^J\sum_{i\in R_j}(y_i-\overline{y}_{R_j})^2, +$$ + +

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

    +









    + +

    A top-down approach, recursive binary splitting

    + +

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

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

    +









    + +

    Making a tree

    + +

    +In order to implement the recursive binary splitting we start by selecting +the predictor \( x_j \) and a cutpoint \( s \) that splits the predictor space into two regions \( R_1 \) and \( R_2 \) +$$ +\left\{X\vert x_j < s\right\}, +$$ + +and +$$ +\left\{X\vert x_j \geq s\right\}, +$$ + +so that we obtain the lowest MSE, that is +$$ +\sum_{i:x_i\in R_j}(y_i-\overline{y}_{R_1})^2+\sum_{i:x_i\in R_2}(y_i-\overline{y}_{R_2})^2, +$$ + +

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

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

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

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

    + + +

    Pruning the tree

    + +

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

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

    +









    + +

    Cost complexity pruning

    +For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that +$$ +\sum_{m=1}^{\overline{T}}\sum_{i:x_i\in R_m}(y_i-\overline{y}_{R_m})^2+\alpha\overline{T}, +$$ + +is as small as possible. Here \( \overline{T} \) is +the number of terminal nodes of the tree \( T \) , \( R_m \) is the +rectangle (i.e. the subset of predictor space) corresponding to the \( m \)-th terminal node. + +

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

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

    +









    + +

    Schematic Regression Procedure

    + +

    +

    +Building a Regression Tree. +

    + +

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

    +









    + +

    A Classification Tree

    + +

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

    +









    + +

    Growing a classification tree

    + +

    +The task of growing a +classification tree is quite similar to the task of growing a +regression tree. Just as in the regression setting, we use recursive +binary splitting to grow a classification tree. However, in the +classification setting, the MSE cannot be used as a criterion for making +the binary splits. A natural alternative to MSE is the classification +error rate. Since we plan to assign an observation in a given region +to the most commonly occurring error rate class of training +observations in that region, the classification error rate is simply +the fraction of the training observations in that region that do not +belong to the most common class. + +

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

    +









    + +

    Classification tree, how to split nodes

    + +

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

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

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

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

    +









    + +

    Visualizing the Tree, Classification

    +

    + + +

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

    +









    + +

    Algorithms for Setting up Decision Trees

    + +

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

      +
    1. The CART (Classification And Regression Tree) algorithm for both classification and regression
    2. +
    3. The ID3 algorithm based on the computation of the information gain for classification
    4. +
    + +We discuss both algorithms with applications here. The popular library Scikit-Learn uses the CART algorithm. For classification problems you can use either the gini index or the entropy to split a tree in two branches. + +

    +









    + +

    The CART algorithm for Classification

    + +

    +









    + +

    The CART algorithm for Regression

    + +

    +









    + +

    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
    +

    +









    + +

    Simple Python Code to read in Data and perform Classification

    + +

    + + +

    # Common imports
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.tree import export_graphviz
    +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("rideclass.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)
    +
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +
    +# Create the encoder.
    +encoder = OneHotEncoder(handle_unknown="ignore")
    +# Assume for simplicity all features are categorical.
    +encoder.fit(X)    
    +# Apply the encoder.
    +X = encoder.transform(X)
    +print(X)
    +# Then do a Classification tree
    +tree_clf = DecisionTreeClassifier(max_depth=2)
    +tree_clf.fit(X, y)
    +print("Train set accuracy with Decision Tree: {:.2f}".format(tree_clf.score(X,y)))
    +#transfer to a decision tree graph
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/ride.dot",
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
    +
    +

    +









    + +

    Computing the Gini Factor

    + +

    +The above functions (gini, entropy and misclassification error) are +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:
    +		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)
    +			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]]
    +
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
    +
    +

    +









    + +

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

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

    +









    + +

    Implementing the ID3 Algorithm

    + +

    + + +

    import re
    +import math
    +from collections import deque
    +
    +# x is examples in training set
    +# y is set of targets
    +# 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()
    +
    +

    +









    + +

    Cancer Data again now with Decision Trees and other Methods

    +

    + + +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
    +

    +









    + +

    Another example, the moons again

    +

    + + +

    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()
    +
    +

    +









    + +

    Playing around with regions

    +

    + + +

    np.random.seed(6)
    +Xs = np.random.rand(100, 2) - 0.5
    +ys = (Xs[:, 0] > 0).astype(np.float32) * 2
    +
    +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()
    +
    +

    +









    + +

    Regression trees

    +

    + + +

    # 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
    +
    +tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg.fit(X, y)
    +
    +

    +









    + +

    Final regressor code

    +

    + + +

    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()
    +
    +

    +









    + +

    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)
    • +
    • 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)
    • +
    + +









    + +

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

    +









    + +

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

    + +

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

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

      +
    1. Voting classifiers
    2. +
    3. Bagging and Pasting
    4. +
    5. Random forests
    6. +
    7. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)
    8. +
    + +We discuss these methods here. + +

    +









    + +

    An Overview of Ensemble Methods

    + +

    +



    + +

    +









    + +

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

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

    +









    + +

    Simple Voting Example, head or tail

    +

    + + +

    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])
    +plt.show()
    +
    +

    +









    + +

    Using the Voting Classifier

    +

    + + +

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

    +









    + +

    Please, not the moons again! Voting and Bagging

    +

    + + +

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

    + + +

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

    +









    + +

    Now Bagging

    + +

    + + +

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

    + + +

    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()
    +
    +

    +









    + +

    Making our own Bagging with Bootstrap

    +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.tree import DecisionTreeRegressor
    +
    +
    +np.random.seed(2018)
    +
    +n = 40
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = DecisionTreeRegressor(max_depth=5) 
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_)
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Changing the Level of the Decision Tree

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.tree import DecisionTreeRegressor
    +
    +n = 100
    +n_boostraps = 100
    +maxdepth = 8
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdepth)
    +bias = np.zeros(maxdepth)
    +variance = np.zeros(maxdepth)
    +polydegree = np.zeros(maxdepth)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(1,maxdepth):
    +    model = DecisionTreeRegressor(max_depth=degree) 
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_)
    +        y_pred[:, i] = model.predict(X_test_scaled)#.ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.xlim(1,maxdepth)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Random forests

    + +

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

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

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

    +









    + +

    Random Forest Algorithm

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

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

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









    + +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
    +
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Random Forests Compared with other Methods on the Cancer Data

    +

    + + +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
    +
    +from sklearn.ensemble import RandomForestClassifier
    +from sklearn.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +# Data set not specificied
    +#Instantiate the model with 500 trees and entropy as splitting criteria
    +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy")
    +Random_Forest_model.fit(X_train_scaled, y_train)
    +#Cross validation
    +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']
    +print(accuracy)
    +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test)))
    +
    +
    +import scikitplot as skplt
    +y_pred = Random_Forest_model.predict(X_test_scaled)
    +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
    +plt.show()
    +y_probas = Random_Forest_model.predict_proba(X_test_scaled)
    +skplt.metrics.plot_roc(y_test, y_probas)
    +plt.show()
    +skplt.metrics.plot_cumulative_gain(y_test, y_probas)
    +plt.show()
    +
    +

    +









    + +

    Compare Bagging on Trees with Random Forests

    +

    + + +

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

    + + +

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

    +









    + +

    Boosting, a Bird'e Eye

    + +

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

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

    +









    + +

    Adaptive boosting: AdaBoost, Basic Algorithm

    + +

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

    +We can then define the misclassification error \( \mathrm{err} \) as +$$ +\mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(\boldsymbol{X}_{i*}), +$$ + +where the function \( I() \) is one if we misclassify and zero if we classify correctly. + +

    +









    + +

    Basic Steps of AdaBoost

    + +

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

      +
    1. We start by initializing all weights to \( w_i = 1/n \), with \( i=0,1,2,\dots n-1 \). It is to see then that \( \sum_{i=0}^{n-1}w_i = 1 \).
    2. +
    3. We rewrite the misclassification error as
    4. +
    + +$$ +\mathrm{err}=\frac{\sum_{i=0}^{n-1}w_iI(y_i\ne G(\boldsymbol{X}_{i*})}{\sum_{i=0}^{n-1}w_i}, +$$ + + +
      +
    1. Then we start looping over all attempts at classifying, namely we start an iterative process for \( m=1:M \), where \( M \) is the final number of classifications. Our given classifier could for example be a plain decision tree. + +
        +
      1. Fit then a given classifier to the training using the weights \( w_i \).
      2. +
      3. Compute then \( \mathrm{err} \) and figure out which events are classified properly and which are classified wrongly.
      4. +
      5. Define a quantity $\alpha_{m} = \log{(1-\mathrm{err})/\mathrm{err}}
      6. +
      7. Set the new weights to $w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(\boldsymbol{X}_{i*})}.
      8. +
      + +
    2. Compute the new classifier $G(\boldsymbol{X})= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(\boldsymbol{X}_{i*}).
    3. +
    + +For the iterations with \( m \le 2 \) the weights are modified +individually at each steps. The obersvations which were misclassified +at iteration \( m-1 \) have a weight which is larger than those which were +classified properly. As this proceeds, the observations which were +difficult to classifiy correctly are given a larger influence. Each +new classification step \( m \) is then forced to concentrate on those +observations that are missed in the previous iterations. + +

    +









    + +

    AdaBoost Examples

    + +

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

    + + +

    from sklearn.ensemble import AdaBoostClassifier
    +
    +ada_clf = AdaBoostClassifier(
    +    DecisionTreeClassifier(max_depth=1), n_estimators=200,
    +    algorithm="SAMME.R", learning_rate=0.5, random_state=42)
    +ada_clf.fit(X_train, y_train)
    +
    +plot_decision_boundary(ada_clf, X, y)
    +
    +m = len(X_train)
    +
    +plt.figure(figsize=(11, 4))
    +for subplot, learning_rate in ((121, 1), (122, 0.5)):
    +    sample_weights = np.ones(m)
    +    plt.subplot(subplot)
    +    for i in range(5):
    +        svm_clf = SVC(kernel="rbf", C=0.05, gamma="auto", random_state=42)
    +        svm_clf.fit(X_train, y_train, sample_weight=sample_weights)
    +        y_pred = svm_clf.predict(X_train)
    +        sample_weights[y_pred != y_train] *= (1 + learning_rate)
    +        plot_decision_boundary(svm_clf, X, y, alpha=0.2)
    +        plt.title("learning_rate = {}".format(learning_rate), fontsize=16)
    +    if subplot == 121:
    +        plt.text(-0.7, -0.65, "1", fontsize=14)
    +        plt.text(-0.6, -0.10, "2", fontsize=14)
    +        plt.text(-0.5,  0.10, "3", fontsize=14)
    +        plt.text(-0.4,  0.55, "4", fontsize=14)
    +        plt.text(-0.3,  0.90, "5", fontsize=14)
    +
    +save_fig("boosting_plot")
    +plt.show()
    +
    +

    +









    + +

    Gradient boosting: Basics

    + +

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

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

    +









    + +

    Gradient Boosting, algorithm

    + +

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

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

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









    + +

    Gradient Boosting, Examples

    +

    + + +

    np.random.seed(42)
    +X = np.random.rand(100, 1) - 0.5
    +y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100)
    +
    +from sklearn.tree import DecisionTreeRegressor
    +
    +tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg1.fit(X, y)
    +
    +y2 = y - tree_reg1.predict(X)
    +tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg2.fit(X, y2)
    +
    +y3 = y2 - tree_reg2.predict(X)
    +tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg3.fit(X, y3)
    +
    +X_new = np.array([[0.8]])
    +y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))
    +
    +def plot_predictions(regressors, X, y, axes, label=None, style="r-", data_style="b.", data_label=None):
    +    x1 = np.linspace(axes[0], axes[1], 500)
    +    y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors)
    +    plt.plot(X[:, 0], y, data_style, label=data_label)
    +    plt.plot(x1, y_pred, style, linewidth=2, label=label)
    +    if label or data_label:
    +        plt.legend(loc="upper center", fontsize=16)
    +    plt.axis(axes)
    +
    +plt.figure(figsize=(11,11))
    +
    +plt.subplot(321)
    +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h_1(x_1)$", style="g-", data_label="Training set")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +plt.title("Residuals and tree predictions", fontsize=16)
    +
    +plt.subplot(322)
    +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1)$", data_label="Training set")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +plt.title("Ensemble predictions", fontsize=16)
    +
    +plt.subplot(323)
    +plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_2(x_1)$", style="g-", data_style="k+", data_label="Residuals")
    +plt.ylabel("$y - h_1(x_1)$", fontsize=16)
    +
    +plt.subplot(324)
    +plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1)$")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +
    +plt.subplot(325)
    +plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_3(x_1)$", style="g-", data_style="k+")
    +plt.ylabel("$y - h_1(x_1) - h_2(x_1)$", fontsize=16)
    +plt.xlabel("$x_1$", fontsize=16)
    +
    +plt.subplot(326)
    +plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$")
    +plt.xlabel("$x_1$", fontsize=16)
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +
    +save_fig("gradient_boosting_plot")
    +plt.show()
    +
    +from sklearn.ensemble import GradientBoostingRegressor
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42)
    +gbrt.fit(X, y)
    +
    +gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42)
    +gbrt_slow.fit(X, y)
    +
    +plt.figure(figsize=(11,4))
    +
    +plt.subplot(121)
    +plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="Ensemble predictions")
    +plt.title("learning_rate={}, n_estimators={}".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14)
    +
    +plt.subplot(122)
    +plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8])
    +plt.title("learning_rate={}, n_estimators={}".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14)
    +
    +save_fig("gbrt_learning_rate_plot")
    +plt.show()
    +
    +

    +









    + +

    Gradient Boots with Early Stopping

    +

    + + +

    from sklearn.model_selection import train_test_split
    +from sklearn.metrics import mean_squared_error
    +
    +X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49)
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42)
    +gbrt.fit(X_train, y_train)
    +
    +errors = [mean_squared_error(y_val, y_pred)
    +          for y_pred in gbrt.staged_predict(X_val)]
    +bst_n_estimators = np.argmin(errors) + 1
    +
    +gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42)
    +gbrt_best.fit(X_train, y_train)
    +
    +min_error = np.min(errors)
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.plot(errors, "b.-")
    +plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], "k--")
    +plt.plot([0, 120], [min_error, min_error], "k--")
    +plt.plot(bst_n_estimators, min_error, "ko")
    +plt.text(bst_n_estimators, min_error*1.2, "Minimum", ha="center", fontsize=14)
    +plt.axis([0, 120, 0, 0.01])
    +plt.xlabel("Number of trees")
    +plt.title("Validation error", fontsize=14)
    +
    +plt.subplot(122)
    +plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8])
    +plt.title("Best model (%d trees)" % bst_n_estimators, fontsize=14)
    +
    +save_fig("early_stopping_gbrt_plot")
    +plt.show()
    +
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42)
    +
    +min_val_error = float("inf")
    +error_going_up = 0
    +for n_estimators in range(1, 120):
    +    gbrt.n_estimators = n_estimators
    +    gbrt.fit(X_train, y_train)
    +    y_pred = gbrt.predict(X_val)
    +    val_error = mean_squared_error(y_val, y_pred)
    +    if val_error < min_val_error:
    +        min_val_error = val_error
    +        error_going_up = 0
    +    else:
    +        error_going_up += 1
    +        if error_going_up == 5:
    +            break  # early stopping
    +
    +
    +print(gbrt.n_estimators)
    +print("Minimum validation MSE:", min_val_error)
    +
    +

    +









    + +

    XGBoost: Extreme Gradient Boosting

    + +

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

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

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

    +









    + +

    Regression Case

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +import xgboost as xgb
    +from sklearn.preprocessing import StandardScaler
    +import scikitplot as skplt
    +from sklearn.metrics import mean_squared_error
    +
    +n = 100
    +maxdegree = 6
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +scaler = StandardScaler()
    +scaler.fit(X_train)
    +X_train_scaled = scaler.transform(X_train)
    +X_test_scaled = scaler.transform(X_test)
    +
    +for degree in range(maxdegree):
    +    model =  xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,
    +                max_depth = degree, alpha = 10, n_estimators = 10)
    +    model.fit(X_train_scaled,y_train)
    +    y_pred = model.predict(X_test_scaled)
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 )
    +    variance[degree] = np.mean( np.var(y_pred) )
    +    print('Max depth:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.xlim(1,maxdegree-1)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Xgboost on the Cancer Data

    +

    + + +

    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.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +import scikitplot as skplt
    +import xgboost as xgb
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)
    +#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)
    +
    +xg_clf = xgb.XGBClassifier()
    +xg_clf.fit(X_train_scaled,y_train)
    +xgb.plot_tree(xg_clf,num_trees=0)
    +plt.rcParams['figure.figsize'] = [50, 10]
    +plt.show()
    +xgb.plot_importance(xg_clf)
    +plt.rcParams['figure.figsize'] = [5, 5]
    +plt.show()
    +
    +

    + + + + +

    + © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
    + + + + + + diff --git a/doc/src/DecisionTrees/DecisionTrees.do.txt b/doc/src/DecisionTrees/DecisionTrees.do.txt index 59a5a1bf7..cbdaccecb 100644 --- a/doc/src/DecisionTrees/DecisionTrees.do.txt +++ b/doc/src/DecisionTrees/DecisionTrees.do.txt @@ -1567,6 +1567,70 @@ o For $m=1:M$ we o Output then the ensemble of trees $\{T_m\}_1^{M}$ and make predictions for either a regression type of problem or a classification type of problem. +!split +===== Bootstrap with Random Forests Instead of a Single Tree, own Bagging ===== + +!bc pycod + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.ensemble import RandomForestRegressor + +np.random.seed(2018) + +n = 100 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = RandomForestRegressor() + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_.ravel()) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + +!ec + + + + !split ===== Random Forests Compared with other Methods on the Cancer Data ===== !bc pycod @@ -1661,67 +1725,6 @@ np.sum(y_pred == y_pred_rf) / len(y_pred) -!split -===== Bootstrap with Random Forests Instead of a Single Tree, own Bagging ===== - -!bc pycod - -import matplotlib.pyplot as plt -import numpy as np -from sklearn.model_selection import train_test_split -from sklearn.pipeline import make_pipeline -from sklearn.utils import resample -from sklearn.ensemble import RandomForestRegressor - -np.random.seed(2018) - -n = 100 -n_boostraps = 100 -maxdegree = 14 - -# Make data set. -x = np.linspace(-3, 3, n).reshape(-1, 1) -y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) -error = np.zeros(maxdegree) -bias = np.zeros(maxdegree) -variance = np.zeros(maxdegree) -polydegree = np.zeros(maxdegree) -X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) - -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) - -for degree in range(maxdegree): - model = RandomForestRegressor() - y_pred = np.empty((y_test.shape[0], n_boostraps)) - for i in range(n_boostraps): - x_, y_ = resample(X_train_scaled, y_train) - model.fit(x_, y_.ravel()) - y_pred[:, i] = model.predict(X_test_scaled).ravel() - - polydegree[degree] = degree - error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) - bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) - variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) - print('Polynomial degree:', degree) - print('Error:', error[degree]) - print('Bias^2:', bias[degree]) - print('Var:', variance[degree]) - print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) - -plt.plot(polydegree, error, label='Error') -plt.plot(polydegree, bias, label='bias') -plt.plot(polydegree, variance, label='Variance') -plt.legend() -plt.show() - - - -!ec - !split diff --git a/doc/src/DecisionTrees/DecisionTrees.html b/doc/src/DecisionTrees/DecisionTrees.html new file mode 100644 index 000000000..e66d392b2 --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees.html @@ -0,0 +1,2507 @@ + + + + + + + + +Data Analysis and Machine Learning: From Decision Trees to Forests and all that + + + + + + + + + + + + + + + + + + + + + + + +

    Data Analysis and Machine Learning: From Decision Trees to Forests and all that

    + +

    + + +

    +Morten Hjorth-Jensen [1, 2] +
    + +

    + + +

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

    +

    Nov 7, 2019

    +
    +

    +









    + +

    Decision trees, overarching aims

    + +

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

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

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

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

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

    +









    + +

    A typical Decision Tree with its pertinent Jargon, Classification Problem

    + +

    +



    + +

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

    +









    + +

    General Features

    + +

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

      +
    • A leaf provides the classification of a given instance.
    • +
    • A node specifies a test of some attribute of the instance.
    • +
    • A branch corresponds to a possible values of an attribute.
    • +
    • An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.
    • +
    + +This process is then repeated for the subtree rooted at the new +node. + +

    +









    + +

    How do we set it up?

    + +

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

      +
    1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature
    2. +
    3. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process
    4. +
    5. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the predictions we want to make for new query instances
    6. +
    7. Show query instances to the tree and run down the tree until we arrive at leaf nodes
    8. +
    + +Then we are essentially done! + +

    +









    + +

    Decision trees and Regression

    +

    + + +

    import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.preprocessing import PolynomialFeatures
    +from sklearn.linear_model import LinearRegression
    +
    +steps=250
    +
    +distance=0
    +x=0
    +distance_list=[]
    +steps_list=[]
    +while x<steps:
    +    distance+=np.random.randint(-1,2)
    +    distance_list.append(distance)
    +    x+=1
    +    steps_list.append(x)
    +plt.plot(steps_list,distance_list, color='green', label="Random Walk Data")
    +
    +steps_list=np.asarray(steps_list)
    +distance_list=np.asarray(distance_list)
    +
    +X=steps_list[:,np.newaxis]
    +
    +#Polynomial fits
    +
    +#Degree 2
    +poly_features=PolynomialFeatures(degree=2, include_bias=False)
    +X_poly=poly_features.fit_transform(X)
    +
    +lin_reg=LinearRegression()
    +poly_fit=lin_reg.fit(X_poly,distance_list)
    +b=lin_reg.coef_
    +c=lin_reg.intercept_
    +print ("2nd degree coefficients:")
    +print ("zero power: ",c)
    +print ("first power: ", b[0])
    +print ("second power: ",b[1])
    +
    +z = np.arange(0, steps, .01)
    +z_mod=b[1]*z**2+b[0]*z+c
    +
    +fit_mod=b[1]*X**2+b[0]*X+c
    +plt.plot(z, z_mod, color='r', label="2nd Degree Fit")
    +plt.title("Polynomial Regression")
    +
    +plt.xlabel("Steps")
    +plt.ylabel("Distance")
    +
    +#Degree 10
    +poly_features10=PolynomialFeatures(degree=10, include_bias=False)
    +X_poly10=poly_features10.fit_transform(X)
    +
    +poly_fit10=lin_reg.fit(X_poly10,distance_list)
    +
    +y_plot=poly_fit10.predict(X_poly10)
    +plt.plot(X, y_plot, color='black', label="10th Degree Fit")
    +
    +plt.legend()
    +plt.show()
    +
    +
    +#Decision Tree Regression
    +from sklearn.tree import DecisionTreeRegressor
    +regr_1=DecisionTreeRegressor(max_depth=2)
    +regr_2=DecisionTreeRegressor(max_depth=5)
    +regr_3=DecisionTreeRegressor(max_depth=7)
    +regr_1.fit(X, distance_list)
    +regr_2.fit(X, distance_list)
    +regr_3.fit(X, distance_list)
    +
    +X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]
    +y_1 = regr_1.predict(X_test)
    +y_2 = regr_2.predict(X_test)
    +y_3=regr_3.predict(X_test)
    +
    +# Plot the results
    +plt.figure()
    +plt.scatter(X, distance_list, s=2.5, c="black", label="data")
    +plt.plot(X_test, y_1, color="red",
    +         label="max_depth=2", linewidth=2)
    +plt.plot(X_test, y_2, color="green", label="max_depth=5", linewidth=2)
    +plt.plot(X_test, y_3, color="m", label="max_depth=7", linewidth=2)
    +
    +plt.xlabel("Data")
    +plt.ylabel("Darget")
    +plt.title("Decision Tree Regression")
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Building a tree, regression

    + +

    +There are mainly two steps + +

      +
    1. We split the predictor space (the set of possible values \( x_1,x_2,\dots, x_p \)) into \( J \) distinct and non-non-overlapping regions, \( R_1,R_2,\dots,R_J \).
    2. +
    3. For every observation that falls into the region \( R_j \) , we make the same prediction, which is simply the mean of the response values for the training observations in \( R_j \).
    4. +
    + +How do we construct the regions \( R_1,\dots,R_J \)? In theory, the +regions could have any shape. However, we choose to divide the +predictor space into high-dimensional rectangles, or boxes, for +simplicity and for ease of interpretation of the resulting predictive +model. The goal is to find boxes \( R_1,\dots,R_J \) that minimize the +MSE, given by + +$$ +\sum_{j=1}^J\sum_{i\in R_j}(y_i-\overline{y}_{R_j})^2, +$$ + +

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

    +









    + +

    A top-down approach, recursive binary splitting

    + +

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

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

    +









    + +

    Making a tree

    + +

    +In order to implement the recursive binary splitting we start by selecting +the predictor \( x_j \) and a cutpoint \( s \) that splits the predictor space into two regions \( R_1 \) and \( R_2 \) +$$ +\left\{X\vert x_j < s\right\}, +$$ + +and +$$ +\left\{X\vert x_j \geq s\right\}, +$$ + +so that we obtain the lowest MSE, that is +$$ +\sum_{i:x_i\in R_j}(y_i-\overline{y}_{R_1})^2+\sum_{i:x_i\in R_2}(y_i-\overline{y}_{R_2})^2, +$$ + +

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

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

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

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

    + + +

    Pruning the tree

    + +

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

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

    +









    + +

    Cost complexity pruning

    +For each value of \( \alpha \) there corresponds a subtree \( T \in T_0 \) such that +$$ +\sum_{m=1}^{\overline{T}}\sum_{i:x_i\in R_m}(y_i-\overline{y}_{R_m})^2+\alpha\overline{T}, +$$ + +is as small as possible. Here \( \overline{T} \) is +the number of terminal nodes of the tree \( T \) , \( R_m \) is the +rectangle (i.e. the subset of predictor space) corresponding to the \( m \)-th terminal node. + +

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

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

    +









    + +

    Schematic Regression Procedure

    + +

    +

    +Building a Regression Tree. +

    + +

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

    +









    + +

    A Classification Tree

    + +

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

    +









    + +

    Growing a classification tree

    + +

    +The task of growing a +classification tree is quite similar to the task of growing a +regression tree. Just as in the regression setting, we use recursive +binary splitting to grow a classification tree. However, in the +classification setting, the MSE cannot be used as a criterion for making +the binary splits. A natural alternative to MSE is the classification +error rate. Since we plan to assign an observation in a given region +to the most commonly occurring error rate class of training +observations in that region, the classification error rate is simply +the fraction of the training observations in that region that do not +belong to the most common class. + +

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

    +









    + +

    Classification tree, how to split nodes

    + +

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

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

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

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

    +









    + +

    Visualizing the Tree, Classification

    +

    + + +

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

    +









    + +

    Algorithms for Setting up Decision Trees

    + +

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

      +
    1. The CART (Classification And Regression Tree) algorithm for both classification and regression
    2. +
    3. The ID3 algorithm based on the computation of the information gain for classification
    4. +
    + +We discuss both algorithms with applications here. The popular library Scikit-Learn uses the CART algorithm. For classification problems you can use either the gini index or the entropy to split a tree in two branches. + +

    +









    + +

    The CART algorithm for Classification

    + +

    +









    + +

    The CART algorithm for Regression

    + +

    +









    + +

    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
    +

    +









    + +

    Simple Python Code to read in Data and perform Classification

    + +

    + + +

    # Common imports
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import train_test_split
    +from sklearn.tree import export_graphviz
    +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("rideclass.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)
    +
    +# Features and targets
    +X = ridedata.loc[:, ridedata.columns != 'Ride'].values
    +y = ridedata.loc[:, ridedata.columns == 'Ride'].values
    +
    +# Create the encoder.
    +encoder = OneHotEncoder(handle_unknown="ignore")
    +# Assume for simplicity all features are categorical.
    +encoder.fit(X)    
    +# Apply the encoder.
    +X = encoder.transform(X)
    +print(X)
    +# Then do a Classification tree
    +tree_clf = DecisionTreeClassifier(max_depth=2)
    +tree_clf.fit(X, y)
    +print("Train set accuracy with Decision Tree: {:.2f}".format(tree_clf.score(X,y)))
    +#transfer to a decision tree graph
    +export_graphviz(
    +    tree_clf,
    +    out_file="DataFiles/ride.dot",
    +    rounded=True,
    +    filled=True
    +)
    +cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'
    +os.system(cmd)
    +
    +

    +









    + +

    Computing the Gini Factor

    + +

    +The above functions (gini, entropy and misclassification error) are +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:
    +		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)
    +			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]]
    +
    +split = get_split(dataset)
    +print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))
    +
    +

    +









    + +

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

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

    +









    + +

    Implementing the ID3 Algorithm

    + +

    + + +

    import re
    +import math
    +from collections import deque
    +
    +# x is examples in training set
    +# y is set of targets
    +# 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()
    +
    +

    +









    + +

    Cancer Data again now with Decision Trees and other Methods

    +

    + + +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
    +

    +









    + +

    Another example, the moons again

    +

    + + +

    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()
    +
    +

    +









    + +

    Playing around with regions

    +

    + + +

    np.random.seed(6)
    +Xs = np.random.rand(100, 2) - 0.5
    +ys = (Xs[:, 0] > 0).astype(np.float32) * 2
    +
    +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()
    +
    +

    +









    + +

    Regression trees

    +

    + + +

    # 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
    +
    +tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg.fit(X, y)
    +
    +

    +









    + +

    Final regressor code

    +

    + + +

    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()
    +
    +

    +









    + +

    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)
    • +
    • 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)
    • +
    + +









    + +

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

    +









    + +

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

    + +

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

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

      +
    1. Voting classifiers
    2. +
    3. Bagging and Pasting
    4. +
    5. Random forests
    6. +
    7. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)
    8. +
    + +We discuss these methods here. + +

    +









    + +

    An Overview of Ensemble Methods

    + +

    +



    + +

    +









    + +

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

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

    +









    + +

    Simple Voting Example, head or tail

    +

    + + +

    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])
    +plt.show()
    +
    +

    +









    + +

    Using the Voting Classifier

    +

    + + +

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

    +









    + +

    Please, not the moons again! Voting and Bagging

    +

    + + +

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

    + + +

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

    +









    + +

    Now Bagging

    + +

    + + +

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

    + + +

    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()
    +
    +

    +









    + +

    Making our own Bagging with Bootstrap

    +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.tree import DecisionTreeRegressor
    +
    +
    +np.random.seed(2018)
    +
    +n = 40
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = DecisionTreeRegressor(max_depth=5) 
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_)
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Changing the Level of the Decision Tree

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.tree import DecisionTreeRegressor
    +
    +n = 100
    +n_boostraps = 100
    +maxdepth = 8
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdepth)
    +bias = np.zeros(maxdepth)
    +variance = np.zeros(maxdepth)
    +polydegree = np.zeros(maxdepth)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(1,maxdepth):
    +    model = DecisionTreeRegressor(max_depth=degree) 
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_)
    +        y_pred[:, i] = model.predict(X_test_scaled)#.ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.xlim(1,maxdepth)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Random forests

    + +

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

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

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

    +









    + +

    Random Forest Algorithm

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

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

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









    + +

    Bootstrap with Random Forests Instead of a Single Tree, own Bagging

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +from sklearn.pipeline import make_pipeline
    +from sklearn.utils import resample
    +from sklearn.ensemble import RandomForestRegressor
    +
    +np.random.seed(2018)
    +
    +n = 100
    +n_boostraps = 100
    +maxdegree = 14
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +
    +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)
    +
    +for degree in range(maxdegree):
    +    model = RandomForestRegressor()
    +    y_pred = np.empty((y_test.shape[0], n_boostraps))
    +    for i in range(n_boostraps):
    +        x_, y_ = resample(X_train_scaled, y_train)
    +        model.fit(x_, y_.ravel())
    +        y_pred[:, i] = model.predict(X_test_scaled).ravel()
    +
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
    +    variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
    +    print('Polynomial degree:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Random Forests Compared with other Methods on the Cancer Data

    +

    + + +

    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
    +
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)))
    +
    +
    +from sklearn.ensemble import RandomForestClassifier
    +from sklearn.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +# Data set not specificied
    +#Instantiate the model with 500 trees and entropy as splitting criteria
    +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy")
    +Random_Forest_model.fit(X_train_scaled, y_train)
    +#Cross validation
    +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']
    +print(accuracy)
    +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test)))
    +
    +
    +import scikitplot as skplt
    +y_pred = Random_Forest_model.predict(X_test_scaled)
    +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)
    +plt.show()
    +y_probas = Random_Forest_model.predict_proba(X_test_scaled)
    +skplt.metrics.plot_roc(y_test, y_probas)
    +plt.show()
    +skplt.metrics.plot_cumulative_gain(y_test, y_probas)
    +plt.show()
    +
    +

    +









    + +

    Compare Bagging on Trees with Random Forests

    +

    + + +

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

    + + +

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

    +









    + +

    Boosting, a Bird'e Eye

    + +

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

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

    +









    + +

    Adaptive boosting: AdaBoost, Basic Algorithm

    + +

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

    +We can then define the misclassification error \( \mathrm{err} \) as +$$ +\mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(\boldsymbol{X}_{i*}), +$$ + +where the function \( I() \) is one if we misclassify and zero if we classify correctly. + +

    +









    + +

    Basic Steps of AdaBoost

    + +

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

      +
    1. We start by initializing all weights to \( w_i = 1/n \), with \( i=0,1,2,\dots n-1 \). It is to see then that \( \sum_{i=0}^{n-1}w_i = 1 \).
    2. +
    3. We rewrite the misclassification error as
    4. +
    + +$$ +\mathrm{err}=\frac{\sum_{i=0}^{n-1}w_iI(y_i\ne G(\boldsymbol{X}_{i*})}{\sum_{i=0}^{n-1}w_i}, +$$ + + +
      +
    1. Then we start looping over all attempts at classifying, namely we start an iterative process for \( m=1:M \), where \( M \) is the final number of classifications. Our given classifier could for example be a plain decision tree. + +
        +
      1. Fit then a given classifier to the training using the weights \( w_i \).
      2. +
      3. Compute then \( \mathrm{err} \) and figure out which events are classified properly and which are classified wrongly.
      4. +
      5. Define a quantity $\alpha_{m} = \log{(1-\mathrm{err})/\mathrm{err}}
      6. +
      7. Set the new weights to $w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(\boldsymbol{X}_{i*})}.
      8. +
      + +
    2. Compute the new classifier $G(\boldsymbol{X})= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(\boldsymbol{X}_{i*}).
    3. +
    + +For the iterations with \( m \le 2 \) the weights are modified +individually at each steps. The obersvations which were misclassified +at iteration \( m-1 \) have a weight which is larger than those which were +classified properly. As this proceeds, the observations which were +difficult to classifiy correctly are given a larger influence. Each +new classification step \( m \) is then forced to concentrate on those +observations that are missed in the previous iterations. + +

    +









    + +

    AdaBoost Examples

    + +

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

    + + +

    from sklearn.ensemble import AdaBoostClassifier
    +
    +ada_clf = AdaBoostClassifier(
    +    DecisionTreeClassifier(max_depth=1), n_estimators=200,
    +    algorithm="SAMME.R", learning_rate=0.5, random_state=42)
    +ada_clf.fit(X_train, y_train)
    +
    +plot_decision_boundary(ada_clf, X, y)
    +
    +m = len(X_train)
    +
    +plt.figure(figsize=(11, 4))
    +for subplot, learning_rate in ((121, 1), (122, 0.5)):
    +    sample_weights = np.ones(m)
    +    plt.subplot(subplot)
    +    for i in range(5):
    +        svm_clf = SVC(kernel="rbf", C=0.05, gamma="auto", random_state=42)
    +        svm_clf.fit(X_train, y_train, sample_weight=sample_weights)
    +        y_pred = svm_clf.predict(X_train)
    +        sample_weights[y_pred != y_train] *= (1 + learning_rate)
    +        plot_decision_boundary(svm_clf, X, y, alpha=0.2)
    +        plt.title("learning_rate = {}".format(learning_rate), fontsize=16)
    +    if subplot == 121:
    +        plt.text(-0.7, -0.65, "1", fontsize=14)
    +        plt.text(-0.6, -0.10, "2", fontsize=14)
    +        plt.text(-0.5,  0.10, "3", fontsize=14)
    +        plt.text(-0.4,  0.55, "4", fontsize=14)
    +        plt.text(-0.3,  0.90, "5", fontsize=14)
    +
    +save_fig("boosting_plot")
    +plt.show()
    +
    +

    +









    + +

    Gradient boosting: Basics

    + +

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

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

    +









    + +

    Gradient Boosting, algorithm

    + +

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

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

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









    + +

    Gradient Boosting, Examples

    +

    + + +

    np.random.seed(42)
    +X = np.random.rand(100, 1) - 0.5
    +y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100)
    +
    +from sklearn.tree import DecisionTreeRegressor
    +
    +tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg1.fit(X, y)
    +
    +y2 = y - tree_reg1.predict(X)
    +tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg2.fit(X, y2)
    +
    +y3 = y2 - tree_reg2.predict(X)
    +tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42)
    +tree_reg3.fit(X, y3)
    +
    +X_new = np.array([[0.8]])
    +y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))
    +
    +def plot_predictions(regressors, X, y, axes, label=None, style="r-", data_style="b.", data_label=None):
    +    x1 = np.linspace(axes[0], axes[1], 500)
    +    y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors)
    +    plt.plot(X[:, 0], y, data_style, label=data_label)
    +    plt.plot(x1, y_pred, style, linewidth=2, label=label)
    +    if label or data_label:
    +        plt.legend(loc="upper center", fontsize=16)
    +    plt.axis(axes)
    +
    +plt.figure(figsize=(11,11))
    +
    +plt.subplot(321)
    +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h_1(x_1)$", style="g-", data_label="Training set")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +plt.title("Residuals and tree predictions", fontsize=16)
    +
    +plt.subplot(322)
    +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1)$", data_label="Training set")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +plt.title("Ensemble predictions", fontsize=16)
    +
    +plt.subplot(323)
    +plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_2(x_1)$", style="g-", data_style="k+", data_label="Residuals")
    +plt.ylabel("$y - h_1(x_1)$", fontsize=16)
    +
    +plt.subplot(324)
    +plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1)$")
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +
    +plt.subplot(325)
    +plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_3(x_1)$", style="g-", data_style="k+")
    +plt.ylabel("$y - h_1(x_1) - h_2(x_1)$", fontsize=16)
    +plt.xlabel("$x_1$", fontsize=16)
    +
    +plt.subplot(326)
    +plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$")
    +plt.xlabel("$x_1$", fontsize=16)
    +plt.ylabel("$y$", fontsize=16, rotation=0)
    +
    +save_fig("gradient_boosting_plot")
    +plt.show()
    +
    +from sklearn.ensemble import GradientBoostingRegressor
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42)
    +gbrt.fit(X, y)
    +
    +gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42)
    +gbrt_slow.fit(X, y)
    +
    +plt.figure(figsize=(11,4))
    +
    +plt.subplot(121)
    +plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="Ensemble predictions")
    +plt.title("learning_rate={}, n_estimators={}".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14)
    +
    +plt.subplot(122)
    +plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8])
    +plt.title("learning_rate={}, n_estimators={}".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14)
    +
    +save_fig("gbrt_learning_rate_plot")
    +plt.show()
    +
    +

    +









    + +

    Gradient Boots with Early Stopping

    +

    + + +

    from sklearn.model_selection import train_test_split
    +from sklearn.metrics import mean_squared_error
    +
    +X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49)
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42)
    +gbrt.fit(X_train, y_train)
    +
    +errors = [mean_squared_error(y_val, y_pred)
    +          for y_pred in gbrt.staged_predict(X_val)]
    +bst_n_estimators = np.argmin(errors) + 1
    +
    +gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42)
    +gbrt_best.fit(X_train, y_train)
    +
    +min_error = np.min(errors)
    +plt.figure(figsize=(11, 4))
    +
    +plt.subplot(121)
    +plt.plot(errors, "b.-")
    +plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], "k--")
    +plt.plot([0, 120], [min_error, min_error], "k--")
    +plt.plot(bst_n_estimators, min_error, "ko")
    +plt.text(bst_n_estimators, min_error*1.2, "Minimum", ha="center", fontsize=14)
    +plt.axis([0, 120, 0, 0.01])
    +plt.xlabel("Number of trees")
    +plt.title("Validation error", fontsize=14)
    +
    +plt.subplot(122)
    +plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8])
    +plt.title("Best model (%d trees)" % bst_n_estimators, fontsize=14)
    +
    +save_fig("early_stopping_gbrt_plot")
    +plt.show()
    +
    +
    +gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42)
    +
    +min_val_error = float("inf")
    +error_going_up = 0
    +for n_estimators in range(1, 120):
    +    gbrt.n_estimators = n_estimators
    +    gbrt.fit(X_train, y_train)
    +    y_pred = gbrt.predict(X_val)
    +    val_error = mean_squared_error(y_val, y_pred)
    +    if val_error < min_val_error:
    +        min_val_error = val_error
    +        error_going_up = 0
    +    else:
    +        error_going_up += 1
    +        if error_going_up == 5:
    +            break  # early stopping
    +
    +
    +print(gbrt.n_estimators)
    +print("Minimum validation MSE:", min_val_error)
    +
    +

    +









    + +

    XGBoost: Extreme Gradient Boosting

    + +

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

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

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

    +









    + +

    Regression Case

    + +

    + + +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import train_test_split
    +import xgboost as xgb
    +from sklearn.preprocessing import StandardScaler
    +import scikitplot as skplt
    +from sklearn.metrics import mean_squared_error
    +
    +n = 100
    +maxdegree = 6
    +
    +# Make data set.
    +x = np.linspace(-3, 3, n).reshape(-1, 1)
    +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
    +
    +error = np.zeros(maxdegree)
    +bias = np.zeros(maxdegree)
    +variance = np.zeros(maxdegree)
    +polydegree = np.zeros(maxdegree)
    +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    +scaler = StandardScaler()
    +scaler.fit(X_train)
    +X_train_scaled = scaler.transform(X_train)
    +X_test_scaled = scaler.transform(X_test)
    +
    +for degree in range(maxdegree):
    +    model =  xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,
    +                max_depth = degree, alpha = 10, n_estimators = 10)
    +    model.fit(X_train_scaled,y_train)
    +    y_pred = model.predict(X_test_scaled)
    +    polydegree[degree] = degree
    +    error[degree] = np.mean( np.mean((y_test - y_pred)**2) )
    +    bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 )
    +    variance[degree] = np.mean( np.var(y_pred) )
    +    print('Max depth:', degree)
    +    print('Error:', error[degree])
    +    print('Bias^2:', bias[degree])
    +    print('Var:', variance[degree])
    +    print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
    +
    +plt.xlim(1,maxdegree-1)
    +plt.plot(polydegree, error, label='Error')
    +plt.plot(polydegree, bias, label='bias')
    +plt.plot(polydegree, variance, label='Variance')
    +plt.legend()
    +plt.show()
    +
    +

    +









    + +

    Xgboost on the Cancer Data

    +

    + + +

    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.preprocessing import LabelEncoder
    +from sklearn.model_selection import cross_validate
    +import scikitplot as skplt
    +import xgboost as xgb
    +# Load the data
    +cancer = load_breast_cancer()
    +
    +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)
    +#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)
    +
    +xg_clf = xgb.XGBClassifier()
    +xg_clf.fit(X_train_scaled,y_train)
    +xgb.plot_tree(xg_clf,num_trees=0)
    +plt.rcParams['figure.figsize'] = [50, 10]
    +plt.show()
    +xgb.plot_importance(xg_clf)
    +plt.rcParams['figure.figsize'] = [5, 5]
    +plt.show()
    +
    +

    + + + + +

    + © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license +
    + + + + + + diff --git a/doc/src/DecisionTrees/DecisionTrees.ipynb b/doc/src/DecisionTrees/DecisionTrees.ipynb new file mode 100644 index 000000000..1161b80b6 --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees.ipynb @@ -0,0 +1,2602 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Data Analysis and Machine Learning: From Decision Trees to Forests and all that\n", + "\n", + " \n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", + "\n", + "Date: **Nov 7, 2019**\n", + "\n", + "Copyright 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", + "\n", + "\n", + "\n", + "\n", + "## Decision trees, overarching aims\n", + "\n", + "\n", + "Decision trees are supervised learning algorithms used for both,\n", + "classification and regression tasks.\n", + "\n", + "\n", + "The main idea of decision trees\n", + "is to find those descriptive features which contain the most\n", + "**information** regarding the target feature and then split the dataset\n", + "along the values of these features such that the target feature values\n", + "for the resulting underlying datasets are as pure as possible.\n", + "\n", + "The descriptive features which reproduce best the target/output features are normally said\n", + "to be the most informative ones. The process of finding the **most\n", + "informative** feature is done until we accomplish a stopping criteria\n", + "where we then finally end up in so called **leaf nodes**. \n", + "\n", + "A decision tree is typically divided into a **root node**, the **interior nodes**,\n", + "and the final **leaf nodes** or just **leaves**. These entities are then connected by so-called **branches**.\n", + "\n", + "The leaf nodes\n", + "contain the predictions we will make for new query instances presented\n", + "to our trained model. This is possible since the model has \n", + "learned the underlying structure of the training data and hence can,\n", + "given some assumptions, make predictions about the target feature value\n", + "(class) of unseen query instances.\n", + "\n", + "## A typical Decision Tree with its pertinent Jargon, Classification Problem\n", + "\n", + "\n", + "\n", + "\n", + "

    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using **Scikit-Learn**'s decision tree classifier. Here we have used the so-called **gini** index (see below) to split the various branches.\n", + "\n", + "\n", + "\n", + "## General Features\n", + "\n", + "The overarching approach to decision trees is a top-down approach.\n", + "\n", + "* A leaf provides the classification of a given instance.\n", + "\n", + "* A node specifies a test of some attribute of the instance.\n", + "\n", + "* A branch corresponds to a possible values of an attribute.\n", + "\n", + "* An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.\n", + "\n", + "This process is then repeated for the subtree rooted at the new\n", + "node.\n", + "\n", + "\n", + "## How do we set it up?\n", + "\n", + "\n", + "In simplified terms, the process of training a decision tree and\n", + "predicting the target features of query instances is as follows:\n", + "\n", + "1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature\n", + "\n", + "2. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process\n", + "\n", + "3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the *predictions* we want to make for new query instances\n", + "\n", + "4. Show query instances to the tree and run down the tree until we arrive at leaf nodes\n", + "\n", + "Then we are essentially done!\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Decision trees and Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.preprocessing import PolynomialFeatures\n", + "from sklearn.linear_model import LinearRegression\n", + "\n", + "steps=250\n", + "\n", + "distance=0\n", + "x=0\n", + "distance_list=[]\n", + "steps_list=[]\n", + "while x\n", + "## Pruning the tree\n", + "\n", + "The above procedure is rather straightforward, but leads often to\n", + "overfitting and unnecessarily large and complicated trees. The basic\n", + "idea is to grow a large tree $T_0$ and then prune it back in order to\n", + "obtain a subtree. A smaller tree with fewer splits (fewer regions) can\n", + "lead to smaller variance and better interpretation at the cost of a\n", + "little more bias.\n", + "\n", + "The so-called Cost complexity pruning algorithm gives us a\n", + "way to do just this. Rather than considering every possible subtree,\n", + "we consider a sequence of trees indexed by a nonnegative tuning\n", + "parameter $\\alpha$.\n", + "\n", + "## Cost complexity pruning\n", + "For each value of $\\alpha$ there corresponds a subtree $T \\in T_0$ such that" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\sum_{m=1}^{\\overline{T}}\\sum_{i:x_i\\in R_m}(y_i-\\overline{y}_{R_m})^2+\\alpha\\overline{T},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "is as small as possible. Here $\\overline{T}$ is \n", + "the number of terminal nodes of the tree $T$ , $R_m$ is the\n", + "rectangle (i.e. the subset of predictor space) corresponding to the $m$-th terminal node.\n", + "\n", + "The tuning parameter $\\alpha$ controls a trade-off between the subtree’s\n", + "com- plexity and its fit to the training data. When $\\alpha = 0$, then the\n", + "subtree $T$ will simply equal $T_0$, \n", + "because then the above equation just measures the\n", + "training error. \n", + "However, as $\\alpha$ increases, there is a price to pay for\n", + "having a tree with many terminal nodes. The above equation will\n", + "tend to be minimized for a smaller subtree. \n", + "\n", + "\n", + "It turns out that as we increase $\\alpha$ from zero\n", + "branches get pruned from the tree in a nested and predictable fashion,\n", + "so obtaining the whole sequence of subtrees as a function of $\\alpha$ is\n", + "easy. We can select a value of $\\alpha$ using a validation set or using\n", + "cross-validation. We then return to the full data set and obtain the\n", + "subtree corresponding to $\\alpha$. \n", + "\n", + "\n", + "## Schematic Regression Procedure\n", + "\n", + "**Building a Regression Tree.**\n", + "\n", + "1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.\n", + "\n", + "2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of $\\alpha$.\n", + "\n", + "3. Use for example $K$-fold cross-validation to choose $\\alpha$. Divide the training observations into $K$ folds. For each $k=1,2,\\dots,K$ we: \n", + "\n", + " * repeat steps 1 and 2 on all but the $k$-th fold of the training data. \n", + "\n", + " * Then we valuate the mean squared prediction error on the data in the left-out $k$-th fold, as a function of $\\alpha$.\n", + "\n", + " * Finally we average the results for each value of $\\alpha$, and pick $\\alpha$ to minimize the average error.\n", + "\n", + "\n", + "4. Return the subtree from Step 2 that corresponds to the chosen value of $\\alpha$.\n", + "\n", + "\n", + "\n", + "\n", + "## A Classification Tree\n", + "\n", + "A classification tree is very similar to a regression tree, except\n", + "that it is used to predict a qualitative response rather than a\n", + "quantitative one. Recall that for a regression tree, the predicted\n", + "response for an observation is given by the mean response of the\n", + "training observations that belong to the same terminal node. In\n", + "contrast, for a classification tree, we predict that each observation\n", + "belongs to the most commonly occurring class of training observations\n", + "in the region to which it belongs. In interpreting the results of a\n", + "classification tree, we are often interested not only in the class\n", + "prediction corresponding to a particular terminal node region, but\n", + "also in the class proportions among the training observations that\n", + "fall into that region. \n", + "\n", + "## Growing a classification tree\n", + "\n", + "The task of growing a\n", + "classification tree is quite similar to the task of growing a\n", + "regression tree. Just as in the regression setting, we use recursive\n", + "binary splitting to grow a classification tree. However, in the\n", + "classification setting, the MSE cannot be used as a criterion for making\n", + "the binary splits. A natural alternative to MSE is the **classification\n", + "error rate**. Since we plan to assign an observation in a given region\n", + "to the most commonly occurring error rate class of training\n", + "observations in that region, the classification error rate is simply\n", + "the fraction of the training observations in that region that do not\n", + "belong to the most common class. \n", + "\n", + "When building a classification tree, either the Gini index or the\n", + "entropy are typically used to evaluate the quality of a particular\n", + "split, since these two approaches are more sensitive to node purity\n", + "than is the classification error rate. \n", + "\n", + "\n", + "## Classification tree, how to split nodes\n", + "\n", + "If our targets are the outcome of a classification process that takes\n", + "for example $k=1,2,\\dots,K$ values, the only thing we need to think of\n", + "is to set up the splitting criteria for each node.\n", + "\n", + "We define a PDF $p_{mk}$ that represents the number of observations of\n", + "a class $k$ in a region $R_m$ with $N_m$ observations. We represent\n", + "this likelihood function in terms of the proportion $I(y_i=k)$ of\n", + "observations of this class in the region $R_m$ as" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i=k).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We let $p_{mk}$ represent the majority class of observations in region\n", + "$m$. The three most common ways of splitting a node are given by\n", + "\n", + "* Misclassification error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i\\ne k) = 1-p_{mk}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Gini index $g$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "g = \\sum_{k=1}^K p_{mk}(1-p_{mk}).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Information entropy or just entropy $s$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "s = -\\sum_{k=1}^K p_{mk}\\log{p_{mk}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing the Tree, Classification" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "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": [ + "## Algorithms for Setting up Decision Trees\n", + "\n", + "Two algorithms stand out in the set up of decision trees:\n", + "1. The CART (Classification And Regression Tree) algorithm for both classification and regression\n", + "\n", + "2. The ID3 algorithm based on the computation of the information gain for classification\n", + "\n", + "We discuss both algorithms with applications here. The popular library **Scikit-Learn** uses the CART algorithm. For classification problems you can use either the **gini** index or the **entropy** to split a tree in two branches.\n", + "\n", + "## The CART algorithm for Classification\n", + "\n", + "\n", + "## The CART algorithm for Regression\n", + "\n", + "\n", + "\n", + "## 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 and perform Classification" + ] + }, + { + "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.tree import DecisionTreeClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.tree import export_graphviz\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(\"rideclass.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", + "\n", + "# Features and targets\n", + "X = ridedata.loc[:, ridedata.columns != 'Ride'].values\n", + "y = ridedata.loc[:, ridedata.columns == 'Ride'].values\n", + "\n", + "# Create the encoder.\n", + "encoder = OneHotEncoder(handle_unknown=\"ignore\")\n", + "# Assume for simplicity all features are categorical.\n", + "encoder.fit(X) \n", + "# Apply the encoder.\n", + "X = encoder.transform(X)\n", + "print(X)\n", + "# Then do a Classification tree\n", + "tree_clf = DecisionTreeClassifier(max_depth=2)\n", + "tree_clf.fit(X, y)\n", + "print(\"Train set accuracy with Decision Tree: {:.2f}\".format(tree_clf.score(X,y)))\n", + "#transfer to a decision tree graph\n", + "export_graphviz(\n", + " tree_clf,\n", + " out_file=\"DataFiles/ride.dot\",\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": [ + "## 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", + "\tfor row in dataset:\n", + "\t\tif row[index] < value:\n", + "\t\t\tleft.append(row)\n", + "\t\telse:\n", + "\t\t\tright.append(row)\n", + "\treturn left, right\n", + " \n", + "# Calculate the Gini index for a split dataset\n", + "def gini_index(groups, classes):\n", + "\t# count all samples at split point\n", + "\tn_instances = float(sum([len(group) for group in groups]))\n", + "\t# sum weighted Gini index for each group\n", + "\tgini = 0.0\n", + "\tfor group in groups:\n", + "\t\tsize = float(len(group))\n", + "\t\t# avoid divide by zero\n", + "\t\tif size == 0:\n", + "\t\t\tcontinue\n", + "\t\tscore = 0.0\n", + "\t\t# score the group based on the score for each class\n", + "\t\tfor class_val in classes:\n", + "\t\t\tp = [row[-1] for row in group].count(class_val) / size\n", + "\t\t\tscore += p * p\n", + "\t\t# weight the group score by its relative size\n", + "\t\tgini += (1.0 - score) * (size / n_instances)\n", + "\treturn gini\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", + "\tb_index, b_value, b_score, b_groups = 999, 999, 999, None\n", + "\tfor index in range(len(dataset[0])-1):\n", + "\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", + "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']))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Entropy and the ID3 algorithm\n", + "\n", + "ID3, learns decision trees by constructing\n", + "them topdown, beginning with the question **which attribute should be tested at the root of the tree**?\n", + "\n", + "1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.\n", + "\n", + "2. The best attribute is selected and used as the test at the root node of the tree.\n", + "\n", + "3. A descendant of the root node is then created for each possible value of this attribute.\n", + "\n", + "4. Training examples are sorted to the appropriate descendant node.\n", + "\n", + "5. 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.\n", + "\n", + "6. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices. \n", + "\n", + "The ID3 algorithm selects, which attribute to test at each node in the\n", + "tree.\n", + "\n", + "We would like to select the attribute that is most useful for classifying\n", + "examples.\n", + "\n", + "What is a good quantitative measure of the worth of an attribute?\n", + "\n", + "Information gain measures how well a given attribute separates the\n", + "training examples according to their target classification.\n", + "\n", + "The ID3 algorithm uses this information gain measure to select among the candidate\n", + "attributes at each step while growing the tree.\n", + "\n", + "## Implementing the ID3 Algorithm" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import re\n", + "import math\n", + "from collections import deque\n", + "\n", + "# x is examples in training set\n", + "# y is set of targets\n", + "# label is target attributes\n", + "# Node is a class which has properties values, childs, and next\n", + "# root is top node in the decision tree\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", + "# Simple class of Decision Tree\n", + "# Aimed for who want to learn Decision Tree, so it is not optimized\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()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cancer Data again now with Decision Trees and other Methods" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split \n", + "from sklearn.datasets import load_breast_cancer\n", + "from sklearn.svm import SVC\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "\n", + "# Load the data\n", + "cancer = load_breast_cancer()\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)\n", + "print(X_train.shape)\n", + "print(X_test.shape)\n", + "# Logistic Regression\n", + "logreg = LogisticRegression(solver='lbfgs')\n", + "logreg.fit(X_train, y_train)\n", + "print(\"Test set accuracy with Logistic Regression: {:.2f}\".format(logreg.score(X_test,y_test)))\n", + "# Support vector machine\n", + "svm = SVC(gamma='auto', C=100)\n", + "svm.fit(X_train, y_train)\n", + "print(\"Test set accuracy with SVM: {:.2f}\".format(svm.score(X_test,y_test)))\n", + "# Decision Trees\n", + "deep_tree_clf = DecisionTreeClassifier(max_depth=None)\n", + "deep_tree_clf.fit(X_train, y_train)\n", + "print(\"Test set accuracy with Decision Trees: {:.2f}\".format(deep_tree_clf.score(X_test,y_test)))\n", + "#now scale the data\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "# Logistic Regression\n", + "logreg.fit(X_train_scaled, y_train)\n", + "print(\"Test set accuracy Logistic Regression with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n", + "# Support Vector Machine\n", + "svm.fit(X_train_scaled, y_train)\n", + "print(\"Test set accuracy SVM with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n", + "# Decision Trees\n", + "deep_tree_clf.fit(X_train_scaled, y_train)\n", + "print(\"Test set accuracy with Decision Trees and scaled data: {:.2f}\".format(deep_tree_clf.score(X_test_scaled,y_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Another example, the moons again" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from __future__ import division, print_function, unicode_literals\n", + "\n", + "# Common imports\n", + "import numpy as np\n", + "import os\n", + "\n", + "# to make this notebook's output stable across runs\n", + "np.random.seed(42)\n", + "\n", + "# To plot pretty figures\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap\n", + "plt.rcParams['axes.labelsize'] = 14\n", + "plt.rcParams['xtick.labelsize'] = 12\n", + "plt.rcParams['ytick.labelsize'] = 12\n", + "\n", + "\n", + "from sklearn.svm import SVC\n", + "from sklearn import datasets\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.datasets import make_moons\n", + "from sklearn.tree import export_graphviz\n", + "\n", + "Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)\n", + "\n", + "deep_tree_clf1 = DecisionTreeClassifier(random_state=42)\n", + "deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)\n", + "deep_tree_clf1.fit(Xm, ym)\n", + "deep_tree_clf2.fit(Xm, ym)\n", + "\n", + "\n", + "def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):\n", + " x1s = np.linspace(axes[0], axes[1], 100)\n", + " x2s = np.linspace(axes[2], axes[3], 100)\n", + " x1, x2 = np.meshgrid(x1s, x2s)\n", + " X_new = np.c_[x1.ravel(), x2.ravel()]\n", + " y_pred = clf.predict(X_new).reshape(x1.shape)\n", + " custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n", + " plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)\n", + " if not iris:\n", + " custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])\n", + " plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)\n", + " if plot_training:\n", + " plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", label=\"Iris-Setosa\")\n", + " plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", label=\"Iris-Versicolor\")\n", + " plt.plot(X[:, 0][y==2], X[:, 1][y==2], \"g^\", label=\"Iris-Virginica\")\n", + " plt.axis(axes)\n", + " if iris:\n", + " plt.xlabel(\"Petal length\", fontsize=14)\n", + " plt.ylabel(\"Petal width\", fontsize=14)\n", + " else:\n", + " plt.xlabel(r\"$x_1$\", fontsize=18)\n", + " plt.ylabel(r\"$x_2$\", fontsize=18, rotation=0)\n", + " if legend:\n", + " plt.legend(loc=\"lower right\", fontsize=14)\n", + "plt.figure(figsize=(11, 4))\n", + "plt.subplot(121)\n", + "plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n", + "plt.title(\"No restrictions\", fontsize=16)\n", + "plt.subplot(122)\n", + "plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n", + "plt.title(\"min_samples_leaf = {}\".format(deep_tree_clf2.min_samples_leaf), fontsize=14)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Playing around with regions" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "np.random.seed(6)\n", + "Xs = np.random.rand(100, 2) - 0.5\n", + "ys = (Xs[:, 0] > 0).astype(np.float32) * 2\n", + "\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", + "tree_clf_s = DecisionTreeClassifier(random_state=42)\n", + "tree_clf_s.fit(Xs, ys)\n", + "tree_clf_sr = DecisionTreeClassifier(random_state=42)\n", + "tree_clf_sr.fit(Xsr, ys)\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "plt.subplot(121)\n", + "plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n", + "plt.subplot(122)\n", + "plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Regression trees" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Quadratic training set + noise\n", + "np.random.seed(42)\n", + "m = 200\n", + "X = np.random.rand(m, 1)\n", + "y = 4 * (X - 0.5) ** 2\n", + "y = y + np.random.randn(m, 1) / 10" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeRegressor\n", + "\n", + "tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)\n", + "tree_reg.fit(X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final regressor code" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeRegressor\n", + "\n", + "tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)\n", + "tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)\n", + "tree_reg1.fit(X, y)\n", + "tree_reg2.fit(X, y)\n", + "\n", + "def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel=\"$y$\"):\n", + " x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)\n", + " y_pred = tree_reg.predict(x1)\n", + " plt.axis(axes)\n", + " plt.xlabel(\"$x_1$\", fontsize=18)\n", + " if ylabel:\n", + " plt.ylabel(ylabel, fontsize=18, rotation=0)\n", + " plt.plot(X, y, \"b.\")\n", + " plt.plot(x1, y_pred, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "plt.subplot(121)\n", + "plot_regression_predictions(tree_reg1, X, y)\n", + "for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n", + " plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n", + "plt.text(0.21, 0.65, \"Depth=0\", fontsize=15)\n", + "plt.text(0.01, 0.2, \"Depth=1\", fontsize=13)\n", + "plt.text(0.65, 0.8, \"Depth=1\", fontsize=13)\n", + "plt.legend(loc=\"upper center\", fontsize=18)\n", + "plt.title(\"max_depth=2\", fontsize=14)\n", + "\n", + "plt.subplot(122)\n", + "plot_regression_predictions(tree_reg2, X, y, ylabel=None)\n", + "for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n", + " plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n", + "for split in (0.0458, 0.1298, 0.2873, 0.9040):\n", + " plt.plot([split, split], [-0.2, 1], \"k:\", linewidth=1)\n", + "plt.text(0.3, 0.5, \"Depth=2\", fontsize=13)\n", + "plt.title(\"max_depth=3\", fontsize=14)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tree_reg1 = DecisionTreeRegressor(random_state=42)\n", + "tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)\n", + "tree_reg1.fit(X, y)\n", + "tree_reg2.fit(X, y)\n", + "\n", + "x1 = np.linspace(0, 1, 500).reshape(-1, 1)\n", + "y_pred1 = tree_reg1.predict(x1)\n", + "y_pred2 = tree_reg2.predict(x1)\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "\n", + "plt.subplot(121)\n", + "plt.plot(X, y, \"b.\")\n", + "plt.plot(x1, y_pred1, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n", + "plt.axis([0, 1, -0.2, 1.1])\n", + "plt.xlabel(\"$x_1$\", fontsize=18)\n", + "plt.ylabel(\"$y$\", fontsize=18, rotation=0)\n", + "plt.legend(loc=\"upper center\", fontsize=18)\n", + "plt.title(\"No restrictions\", fontsize=14)\n", + "\n", + "plt.subplot(122)\n", + "plt.plot(X, y, \"b.\")\n", + "plt.plot(x1, y_pred2, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n", + "plt.axis([0, 1, -0.2, 1.1])\n", + "plt.xlabel(\"$x_1$\", fontsize=18)\n", + "plt.title(\"min_samples_leaf={}\".format(tree_reg2.min_samples_leaf), fontsize=14)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pros and cons of trees, pros\n", + "\n", + "* 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)\n", + "\n", + "* Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression!\n", + "\n", + "* No feature normalization needed\n", + "\n", + "* Tree models can handle both continuous and categorical data (Classification and Regression Trees)\n", + "\n", + "* Can model nonlinear relationships\n", + "\n", + "* Can model interactions between the different descriptive features\n", + "\n", + "* Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)\n", + "\n", + "## Disadvantages\n", + "\n", + "* Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches\n", + "\n", + "* If continuous features are used the tree may become quite large and hence less interpretable\n", + "\n", + "* 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\n", + "\n", + "* 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\n", + "\n", + "* 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. \n", + "\n", + "* If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data\n", + "\n", + "* 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\n", + "\n", + "However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. \n", + "\n", + "\n", + "## Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods\n", + "\n", + "As stated above and seen in many of the examples discussed here about\n", + "a single decision tree, we often end up overfitting our training\n", + "data. This normally means that we have a high variance. Can we reduce\n", + "the variance of a statistical learning method?\n", + "\n", + "This leads us to a set of different methods that can combine different\n", + "machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are\n", + "1. Voting classifiers\n", + "\n", + "2. Bagging and Pasting\n", + "\n", + "3. Random forests\n", + "\n", + "4. Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost)\n", + "\n", + "We discuss these methods here.\n", + "\n", + "\n", + "## An Overview of Ensemble Methods\n", + "\n", + "\n", + "\n", + "\n", + "

    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Bagging\n", + "\n", + "The **plain** decision trees suffer from high\n", + "variance. This means that if we split the training data into two parts\n", + "at random, and fit a decision tree to both halves, the results that we\n", + "get could be quite different. In contrast, a procedure with low\n", + "variance will yield similar results if applied repeatedly to distinct\n", + "data sets; linear regression tends to have low variance, if the ratio\n", + "of $n$ to $p$ is moderately large. \n", + "\n", + "**Bootstrap aggregation**, or just **bagging**, is a\n", + "general-purpose procedure for reducing the variance of a statistical\n", + "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", + "advantages of decision trees is the attractive and easily interpreted\n", + "diagram that results.\n", + "\n", + "However, when we bag a large number of trees, it is no longer\n", + "possible to represent the resulting statistical learning procedure\n", + "using a single tree, and it is no longer clear which variables are\n", + "most important to the procedure. Thus, bagging improves prediction\n", + "accuracy at the expense of interpretability. Although the collection\n", + "of bagged trees is much more difficult to interpret than a single\n", + "tree, one can obtain an overall summary of the importance of each\n", + "predictor using the MSE (for bagging regression trees) or the Gini\n", + "index (for bagging classification trees). In the case of bagging\n", + "regression trees, we can record the total amount that the MSE is\n", + "decreased due to splits over a given predictor, averaged over all $B$ possible\n", + "trees. A large value indicates an important predictor. Similarly, in\n", + "the context of bagging classification trees, we can add up the total\n", + "amount that the Gini index is decreased by splits over a given\n", + "predictor, averaged over all $B$ trees.\n", + "\n", + "## Simple Voting Example, head or tail" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "heads_proba = 0.51\n", + "coin_tosses = (np.random.rand(10000, 10) < heads_proba).astype(np.int32)\n", + "cumulative_heads_ratio = np.cumsum(coin_tosses, axis=0) / np.arange(1, 10001).reshape(-1, 1)\n", + "plt.figure(figsize=(8,3.5))\n", + "plt.plot(cumulative_heads_ratio)\n", + "plt.plot([0, 10000], [0.51, 0.51], \"k--\", linewidth=2, label=\"51%\")\n", + "plt.plot([0, 10000], [0.5, 0.5], \"k-\", label=\"50%\")\n", + "plt.xlabel(\"Number of coin tosses\")\n", + "plt.ylabel(\"Heads ratio\")\n", + "plt.legend(loc=\"lower right\")\n", + "plt.axis([0, 10000, 0.42, 0.58])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using the Voting Classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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": {}, + "source": [ + "## Please, not the moons again! Voting and Bagging" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "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", + "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(random_state=42)\n", + "rnd_clf = RandomForestClassifier(random_state=42)\n", + "svm_clf = SVC(random_state=42)\n", + "\n", + "voting_clf = VotingClassifier(\n", + " estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],\n", + " voting='hard')\n", + "voting_clf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "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": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "log_clf = LogisticRegression(random_state=42)\n", + "rnd_clf = RandomForestClassifier(random_state=42)\n", + "svm_clf = SVC(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)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "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": {}, + "source": [ + "## Now Bagging" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.ensemble import BaggingClassifier\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "\n", + "bag_clf = BaggingClassifier(\n", + " DecisionTreeClassifier(random_state=42), n_estimators=500,\n", + " max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)\n", + "bag_clf.fit(X_train, y_train)\n", + "y_pred = bag_clf.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.metrics import accuracy_score\n", + "print(accuracy_score(y_test, y_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tree_clf = DecisionTreeClassifier(random_state=42)\n", + "tree_clf.fit(X_train, y_train)\n", + "y_pred_tree = tree_clf.predict(X_test)\n", + "print(accuracy_score(y_test, y_pred_tree))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from matplotlib.colors import ListedColormap\n", + "\n", + "def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):\n", + " x1s = np.linspace(axes[0], axes[1], 100)\n", + " x2s = np.linspace(axes[2], axes[3], 100)\n", + " x1, x2 = np.meshgrid(x1s, x2s)\n", + " X_new = np.c_[x1.ravel(), x2.ravel()]\n", + " y_pred = clf.predict(X_new).reshape(x1.shape)\n", + " custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n", + " plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)\n", + " if contour:\n", + " custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])\n", + " plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)\n", + " plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", alpha=alpha)\n", + " plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", alpha=alpha)\n", + " plt.axis(axes)\n", + " plt.xlabel(r\"$x_1$\", fontsize=18)\n", + " plt.ylabel(r\"$x_2$\", fontsize=18, rotation=0)\n", + "plt.figure(figsize=(11,4))\n", + "plt.subplot(121)\n", + "plot_decision_boundary(tree_clf, X, y)\n", + "plt.title(\"Decision Tree\", fontsize=14)\n", + "plt.subplot(122)\n", + "plot_decision_boundary(bag_clf, X, y)\n", + "plt.title(\"Decision Trees with Bagging\", fontsize=14)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making our own Bagging with Bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.utils import resample\n", + "from sklearn.tree import DecisionTreeRegressor\n", + "\n", + "\n", + "np.random.seed(2018)\n", + "\n", + "n = 40\n", + "n_boostraps = 100\n", + "maxdegree = 14\n", + "\n", + "# Make data set.\n", + "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", + "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", + "error = np.zeros(maxdegree)\n", + "bias = np.zeros(maxdegree)\n", + "variance = np.zeros(maxdegree)\n", + "polydegree = np.zeros(maxdegree)\n", + "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", + "\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "for degree in range(maxdegree):\n", + " model = DecisionTreeRegressor(max_depth=5) \n", + " y_pred = np.empty((y_test.shape[0], n_boostraps))\n", + " for i in range(n_boostraps):\n", + " x_, y_ = resample(X_train_scaled, y_train)\n", + " model.fit(x_, y_)\n", + " y_pred[:, i] = model.predict(X_test_scaled).ravel()\n", + "\n", + " polydegree[degree] = degree\n", + " error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", + " bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", + " variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", + " print('Polynomial degree:', degree)\n", + " print('Error:', error[degree])\n", + " print('Bias^2:', bias[degree])\n", + " print('Var:', variance[degree])\n", + " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", + "\n", + "plt.plot(polydegree, error, label='Error')\n", + "plt.plot(polydegree, bias, label='bias')\n", + "plt.plot(polydegree, variance, label='Variance')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Changing the Level of the Decision Tree" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.utils import resample\n", + "from sklearn.tree import DecisionTreeRegressor\n", + "\n", + "n = 100\n", + "n_boostraps = 100\n", + "maxdepth = 8\n", + "\n", + "# Make data set.\n", + "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", + "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", + "error = np.zeros(maxdepth)\n", + "bias = np.zeros(maxdepth)\n", + "variance = np.zeros(maxdepth)\n", + "polydegree = np.zeros(maxdepth)\n", + "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", + "\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "for degree in range(1,maxdepth):\n", + " model = DecisionTreeRegressor(max_depth=degree) \n", + " y_pred = np.empty((y_test.shape[0], n_boostraps))\n", + " for i in range(n_boostraps):\n", + " x_, y_ = resample(X_train_scaled, y_train)\n", + " model.fit(x_, y_)\n", + " y_pred[:, i] = model.predict(X_test_scaled)#.ravel()\n", + "\n", + " polydegree[degree] = degree\n", + " error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", + " bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", + " variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", + " print('Polynomial degree:', degree)\n", + " print('Error:', error[degree])\n", + " print('Bias^2:', bias[degree])\n", + " print('Var:', variance[degree])\n", + " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", + "\n", + "plt.xlim(1,maxdepth)\n", + "plt.plot(polydegree, error, label='Error')\n", + "plt.plot(polydegree, bias, label='bias')\n", + "plt.plot(polydegree, variance, label='Variance')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Random forests\n", + "\n", + "Random forests provide an improvement over bagged trees by way of a\n", + "small tweak that decorrelates the trees. \n", + "\n", + "As in bagging, we build a\n", + "number of decision trees on bootstrapped training samples. But when\n", + "building these decision trees, each time a split in a tree is\n", + "considered, a random sample of $m$ predictors is chosen as split\n", + "candidates from the full set of $p$ predictors. The split is allowed to\n", + "use only one of those $m$ predictors. \n", + "\n", + "A fresh sample of $m$ predictors is\n", + "taken at each split, and typically we choose" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "m\\approx \\sqrt{p}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In building a random forest, at\n", + "each split in the tree, the algorithm is not even allowed to consider\n", + "a majority of the available predictors. \n", + "\n", + "The reason for this is rather clever. Suppose that there is one very\n", + "strong predictor in the data set, along with a number of other\n", + "moderately strong predictors. Then in the collection of bagged\n", + "variable importance random forest trees, most or all of the trees will\n", + "use this strong predictor in the top split. Consequently, all of the\n", + "bagged trees will look quite similar to each other. Hence the\n", + "predictions from the bagged trees will be highly correlated.\n", + "Unfortunately, averaging many highly correlated quantities does not\n", + "lead to as large of a reduction in variance as averaging many\n", + "uncorrelated quanti- ties. In particular, this means that bagging will\n", + "not lead to a substantial reduction in variance over a single tree in\n", + "this setting.\n", + "\n", + "\n", + "## Random Forest Algorithm\n", + "The algorithm described here can be applied to both classification and regression problems.\n", + "\n", + "We will grow of forest of say $M$ trees.\n", + "1. For $m=1:M$ we\n", + "\n", + " * Draw a bootstrap sample of from the training data organized in our $\\boldsymbol{X}$ matrix.\n", + "\n", + " * We grow then a random forest tree $T_m$ based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached\n", + "\n", + "1. we select $m \\le p$ varibales at random from the $p$ predictors/features\n", + "\n", + "2. pick the best split point among the $m$ features using either the CART algorithm or the ID3 for classification and create a new node\n", + "\n", + "3. split the node into daughter nodes\n", + "\n", + "\n", + "\n", + "4. Output then the ensemble of trees $\\{T_m\\}_1^{M}$ and make predictions for either a regression type of problem or a classification type of problem. \n", + "\n", + "## Bootstrap with Random Forests Instead of a Single Tree, own Bagging" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.utils import resample\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "\n", + "np.random.seed(2018)\n", + "\n", + "n = 100\n", + "n_boostraps = 100\n", + "maxdegree = 14\n", + "\n", + "# Make data set.\n", + "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", + "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", + "error = np.zeros(maxdegree)\n", + "bias = np.zeros(maxdegree)\n", + "variance = np.zeros(maxdegree)\n", + "polydegree = np.zeros(maxdegree)\n", + "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", + "\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "for degree in range(maxdegree):\n", + " model = RandomForestRegressor()\n", + " y_pred = np.empty((y_test.shape[0], n_boostraps))\n", + " for i in range(n_boostraps):\n", + " x_, y_ = resample(X_train_scaled, y_train)\n", + " model.fit(x_, y_.ravel())\n", + " y_pred[:, i] = model.predict(X_test_scaled).ravel()\n", + "\n", + " polydegree[degree] = degree\n", + " error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", + " bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", + " variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", + " print('Polynomial degree:', degree)\n", + " print('Error:', error[degree])\n", + " print('Bias^2:', bias[degree])\n", + " print('Var:', variance[degree])\n", + " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", + "\n", + "plt.plot(polydegree, error, label='Error')\n", + "plt.plot(polydegree, bias, label='bias')\n", + "plt.plot(polydegree, variance, label='Variance')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Random Forests Compared with other Methods on the Cancer Data" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split \n", + "from sklearn.datasets import load_breast_cancer\n", + "from sklearn.svm import SVC\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "\n", + "# Load the data\n", + "cancer = load_breast_cancer()\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)\n", + "print(X_train.shape)\n", + "print(X_test.shape)\n", + "# Logistic Regression\n", + "logreg = LogisticRegression(solver='lbfgs')\n", + "logreg.fit(X_train, y_train)\n", + "print(\"Test set accuracy with Logistic Regression: {:.2f}\".format(logreg.score(X_test,y_test)))\n", + "# Support vector machine\n", + "svm = SVC(gamma='auto', C=100)\n", + "svm.fit(X_train, y_train)\n", + "print(\"Test set accuracy with SVM: {:.2f}\".format(svm.score(X_test,y_test)))\n", + "# Decision Trees\n", + "deep_tree_clf = DecisionTreeClassifier(max_depth=None)\n", + "deep_tree_clf.fit(X_train, y_train)\n", + "print(\"Test set accuracy with Decision Trees: {:.2f}\".format(deep_tree_clf.score(X_test,y_test)))\n", + "#now scale the data\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "# Logistic Regression\n", + "logreg.fit(X_train_scaled, y_train)\n", + "print(\"Test set accuracy Logistic Regression with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n", + "# Support Vector Machine\n", + "svm.fit(X_train_scaled, y_train)\n", + "print(\"Test set accuracy SVM with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n", + "# Decision Trees\n", + "deep_tree_clf.fit(X_train_scaled, y_train)\n", + "print(\"Test set accuracy with Decision Trees and scaled data: {:.2f}\".format(deep_tree_clf.score(X_test_scaled,y_test)))\n", + "\n", + "\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.model_selection import cross_validate\n", + "# Data set not specificied\n", + "#Instantiate the model with 500 trees and entropy as splitting criteria\n", + "Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion=\"entropy\")\n", + "Random_Forest_model.fit(X_train_scaled, y_train)\n", + "#Cross validation\n", + "accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score']\n", + "print(accuracy)\n", + "print(\"Test set accuracy with Random Forests and scaled data: {:.2f}\".format(Random_Forest_model.score(X_test_scaled,y_test)))\n", + "\n", + "\n", + "import scikitplot as skplt\n", + "y_pred = Random_Forest_model.predict(X_test_scaled)\n", + "skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True)\n", + "plt.show()\n", + "y_probas = Random_Forest_model.predict_proba(X_test_scaled)\n", + "skplt.metrics.plot_roc(y_test, y_probas)\n", + "plt.show()\n", + "skplt.metrics.plot_cumulative_gain(y_test, y_probas)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compare Bagging on Trees with Random Forests" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bag_clf = BaggingClassifier(\n", + " DecisionTreeClassifier(splitter=\"random\", max_leaf_nodes=16, random_state=42),\n", + " n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bag_clf.fit(X_train, y_train)\n", + "y_pred = bag_clf.predict(X_test)\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)\n", + "rnd_clf.fit(X_train, y_train)\n", + "y_pred_rf = rnd_clf.predict(X_test)\n", + "np.sum(y_pred == y_pred_rf) / len(y_pred)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Boosting, a Bird'e Eye\n", + "\n", + "The basic idea is to combine weak classifiers in order to create a good\n", + "classifier. With a weak classifier we often intend a classifier which\n", + "produces results which are only slightly better than we would get by\n", + "random guesses.\n", + "\n", + "This is done by applying in an iterative way a weak (or a standard\n", + "classifier like decision trees) to modify the data. In each iteration\n", + "we emphasize those observations which are misclassified by weighting\n", + "them with a factor.\n", + "\n", + "\n", + "## Adaptive boosting: AdaBoost, Basic Algorithm\n", + "\n", + "The algorithm here is rather straightforward. Assume that our weak\n", + "classifier is a decision tree and we consider a binary set of outputs\n", + "with $y_i \\in \\{-1,1\\}$ and $i=0,1,2,\\dots,n-1$ as our set of\n", + "observations. Our design matrix is given in terms of the\n", + "feature/predictor vectors\n", + "$\\boldsymbol{X}=[\\boldsymbol{x}_0\\boldsymbol{x}_1\\dots\\boldsymbol{x}_{p-1}$. Finally, we define also a\n", + "classifier determined by our data via a function $G(\\boldsymbol{X})$. This function tells us how well we are able to classify our outputs/targets $\\boldsymbol{y}$. \n", + "\n", + "We can then define the misclassification error $\\mathrm{err}$ as" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathrm{err}=\\frac{1}{n}\\sum_{i=0}^{n-1}I(y_i\\ne G(\\boldsymbol{X}_{i*}),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where the function $I()$ is one if we misclassify and zero if we classify correctly. \n", + "\n", + "## Basic Steps of AdaBoost\n", + "\n", + "With the above definitions we are now ready to set up the algorithm for AdaBoost.\n", + "The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases.\n", + "1. We start by initializing all weights to $w_i = 1/n$, with $i=0,1,2,\\dots n-1$. It is to see then that $\\sum_{i=0}^{n-1}w_i = 1$.\n", + "\n", + "2. We rewrite the misclassification error as" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathrm{err}=\\frac{\\sum_{i=0}^{n-1}w_iI(y_i\\ne G(\\boldsymbol{X}_{i*})}{\\sum_{i=0}^{n-1}w_i},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Then we start looping over all attempts at classifying, namely we start an iterative process for $m=1:M$, where $M$ is the final number of classifications. Our given classifier could for example be a plain decision tree.\n", + "\n", + "a. Fit then a given classifier to the training using the weights $w_i$.\n", + "\n", + "b. Compute then $\\mathrm{err}$ and figure out which events are classified properly and which are classified wrongly.\n", + "\n", + "c. Define a quantity $\\alpha_{m} = \\log{(1-\\mathrm{err})/\\mathrm{err}}\n", + "\n", + "d. Set the new weights to $w_i = w_i\\times \\exp{(\\alpha_m I(y_i\\ne G(\\boldsymbol{X}_{i*})}.\n", + "\n", + "\n", + "5. Compute the new classifier $G(\\boldsymbol{X})= \\sum_{i=0}^{n-1}\\alpha_m I(y_i\\ne G(\\boldsymbol{X}_{i*}).\n", + "\n", + "For the iterations with $m \\le 2$ the weights are modified\n", + "individually at each steps. The obersvations which were misclassified\n", + "at iteration $m-1$ have a weight which is larger than those which were\n", + "classified properly. As this proceeds, the observations which were\n", + "difficult to classifiy correctly are given a larger influence. Each\n", + "new classification step $m$ is then forced to concentrate on those\n", + "observations that are missed in the previous iterations.\n", + "\n", + "\n", + "\n", + "## AdaBoost Examples\n", + "\n", + "Using **Scikit-Learn** it is easy to appply the adaptive boosting algorithm, as done here." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from sklearn.ensemble import AdaBoostClassifier\n", + "\n", + "ada_clf = AdaBoostClassifier(\n", + " DecisionTreeClassifier(max_depth=1), n_estimators=200,\n", + " algorithm=\"SAMME.R\", learning_rate=0.5, random_state=42)\n", + "ada_clf.fit(X_train, y_train)\n", + "\n", + "plot_decision_boundary(ada_clf, X, y)\n", + "\n", + "m = len(X_train)\n", + "\n", + "plt.figure(figsize=(11, 4))\n", + "for subplot, learning_rate in ((121, 1), (122, 0.5)):\n", + " sample_weights = np.ones(m)\n", + " plt.subplot(subplot)\n", + " for i in range(5):\n", + " svm_clf = SVC(kernel=\"rbf\", C=0.05, gamma=\"auto\", random_state=42)\n", + " svm_clf.fit(X_train, y_train, sample_weight=sample_weights)\n", + " y_pred = svm_clf.predict(X_train)\n", + " sample_weights[y_pred != y_train] *= (1 + learning_rate)\n", + " plot_decision_boundary(svm_clf, X, y, alpha=0.2)\n", + " plt.title(\"learning_rate = {}\".format(learning_rate), fontsize=16)\n", + " if subplot == 121:\n", + " plt.text(-0.7, -0.65, \"1\", fontsize=14)\n", + " plt.text(-0.6, -0.10, \"2\", fontsize=14)\n", + " plt.text(-0.5, 0.10, \"3\", fontsize=14)\n", + " plt.text(-0.4, 0.55, \"4\", fontsize=14)\n", + " plt.text(-0.3, 0.90, \"5\", fontsize=14)\n", + "\n", + "save_fig(\"boosting_plot\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gradient boosting: Basics\n", + "\n", + "Gradient boosting is again a similar technique to Adapative boosting,\n", + "it combines so-called weak classifiers or regressors into a strong\n", + "method via a series of iterations.\n", + "\n", + "In order to understand the method, let us illustrate its basics by\n", + "bringing back the essential steps in linear regression, where our cost\n", + "function was the least squares function.\n", + "\n", + "## Gradient Boosting, algorithm\n", + "\n", + "Suppose we have a cost function $C(f)=\\sum_{i=0}^{n-1}L(y_i, f(x_i))$ where $y_i$ is our target and $f(x_i)$ the function which is meant to model $y_i$. The above cost function could be our standard least squares function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "C(\\boldsymbol{y},\\boldsymbol{f})=\\frac{1}{n}\\sum_{i=0}^{n-1}(y_i-f(x_i))^2.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The way we proceed in an iterative fashion is to\n", + "1. Initialize our estimate by $f_0(x)=0$.\n", + "\n", + "2. For $m=1:M$, we\n", + "\n", + "a. compute the negative gradient vector $\\boldsymbol{u}_m = -\\partial C(\\boldsymbol{y},\\boldsymbol{f})/\\partial \\boldsymbol{f}(x)$ at $f(x) = f_{m-1}(x);\n", + "\n", + "b. fit the so-called base-learner to the negative gradient $h_m(u_m,x)$;\n", + "\n", + "c. update the estimate $f_m(x) = f_{m-1}(x)+\\nu h_m(u_m,x)$;\n", + "\n", + "\n", + "4. The final estimate is then $f_M(x) = \\sum_{m=1}^M\\nu h_m(u_m,x)$.\n", + "\n", + "## Gradient Boosting, Examples" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "np.random.seed(42)\n", + "X = np.random.rand(100, 1) - 0.5\n", + "y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100)\n", + "\n", + "from sklearn.tree import DecisionTreeRegressor\n", + "\n", + "tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)\n", + "tree_reg1.fit(X, y)\n", + "\n", + "y2 = y - tree_reg1.predict(X)\n", + "tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42)\n", + "tree_reg2.fit(X, y2)\n", + "\n", + "y3 = y2 - tree_reg2.predict(X)\n", + "tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42)\n", + "tree_reg3.fit(X, y3)\n", + "\n", + "X_new = np.array([[0.8]])\n", + "y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))\n", + "\n", + "def plot_predictions(regressors, X, y, axes, label=None, style=\"r-\", data_style=\"b.\", data_label=None):\n", + " x1 = np.linspace(axes[0], axes[1], 500)\n", + " y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors)\n", + " plt.plot(X[:, 0], y, data_style, label=data_label)\n", + " plt.plot(x1, y_pred, style, linewidth=2, label=label)\n", + " if label or data_label:\n", + " plt.legend(loc=\"upper center\", fontsize=16)\n", + " plt.axis(axes)\n", + "\n", + "plt.figure(figsize=(11,11))\n", + "\n", + "plt.subplot(321)\n", + "plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label=\"$h_1(x_1)$\", style=\"g-\", data_label=\"Training set\")\n", + "plt.ylabel(\"$y$\", fontsize=16, rotation=0)\n", + "plt.title(\"Residuals and tree predictions\", fontsize=16)\n", + "\n", + "plt.subplot(322)\n", + "plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label=\"$h(x_1) = h_1(x_1)$\", data_label=\"Training set\")\n", + "plt.ylabel(\"$y$\", fontsize=16, rotation=0)\n", + "plt.title(\"Ensemble predictions\", fontsize=16)\n", + "\n", + "plt.subplot(323)\n", + "plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label=\"$h_2(x_1)$\", style=\"g-\", data_style=\"k+\", data_label=\"Residuals\")\n", + "plt.ylabel(\"$y - h_1(x_1)$\", fontsize=16)\n", + "\n", + "plt.subplot(324)\n", + "plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label=\"$h(x_1) = h_1(x_1) + h_2(x_1)$\")\n", + "plt.ylabel(\"$y$\", fontsize=16, rotation=0)\n", + "\n", + "plt.subplot(325)\n", + "plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label=\"$h_3(x_1)$\", style=\"g-\", data_style=\"k+\")\n", + "plt.ylabel(\"$y - h_1(x_1) - h_2(x_1)$\", fontsize=16)\n", + "plt.xlabel(\"$x_1$\", fontsize=16)\n", + "\n", + "plt.subplot(326)\n", + "plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label=\"$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$\")\n", + "plt.xlabel(\"$x_1$\", fontsize=16)\n", + "plt.ylabel(\"$y$\", fontsize=16, rotation=0)\n", + "\n", + "save_fig(\"gradient_boosting_plot\")\n", + "plt.show()\n", + "\n", + "from sklearn.ensemble import GradientBoostingRegressor\n", + "\n", + "gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42)\n", + "gbrt.fit(X, y)\n", + "\n", + "gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42)\n", + "gbrt_slow.fit(X, y)\n", + "\n", + "plt.figure(figsize=(11,4))\n", + "\n", + "plt.subplot(121)\n", + "plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label=\"Ensemble predictions\")\n", + "plt.title(\"learning_rate={}, n_estimators={}\".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14)\n", + "\n", + "plt.subplot(122)\n", + "plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8])\n", + "plt.title(\"learning_rate={}, n_estimators={}\".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14)\n", + "\n", + "save_fig(\"gbrt_learning_rate_plot\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gradient Boots with Early Stopping" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49)\n", + "\n", + "gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42)\n", + "gbrt.fit(X_train, y_train)\n", + "\n", + "errors = [mean_squared_error(y_val, y_pred)\n", + " for y_pred in gbrt.staged_predict(X_val)]\n", + "bst_n_estimators = np.argmin(errors) + 1\n", + "\n", + "gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42)\n", + "gbrt_best.fit(X_train, y_train)\n", + "\n", + "min_error = np.min(errors)\n", + "plt.figure(figsize=(11, 4))\n", + "\n", + "plt.subplot(121)\n", + "plt.plot(errors, \"b.-\")\n", + "plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], \"k--\")\n", + "plt.plot([0, 120], [min_error, min_error], \"k--\")\n", + "plt.plot(bst_n_estimators, min_error, \"ko\")\n", + "plt.text(bst_n_estimators, min_error*1.2, \"Minimum\", ha=\"center\", fontsize=14)\n", + "plt.axis([0, 120, 0, 0.01])\n", + "plt.xlabel(\"Number of trees\")\n", + "plt.title(\"Validation error\", fontsize=14)\n", + "\n", + "plt.subplot(122)\n", + "plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8])\n", + "plt.title(\"Best model (%d trees)\" % bst_n_estimators, fontsize=14)\n", + "\n", + "save_fig(\"early_stopping_gbrt_plot\")\n", + "plt.show()\n", + "\n", + "\n", + "gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42)\n", + "\n", + "min_val_error = float(\"inf\")\n", + "error_going_up = 0\n", + "for n_estimators in range(1, 120):\n", + " gbrt.n_estimators = n_estimators\n", + " gbrt.fit(X_train, y_train)\n", + " y_pred = gbrt.predict(X_val)\n", + " val_error = mean_squared_error(y_val, y_pred)\n", + " if val_error < min_val_error:\n", + " min_val_error = val_error\n", + " error_going_up = 0\n", + " else:\n", + " error_going_up += 1\n", + " if error_going_up == 5:\n", + " break # early stopping\n", + "\n", + "\n", + "print(gbrt.n_estimators)\n", + "print(\"Minimum validation MSE:\", min_val_error)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## XGBoost: Extreme Gradient Boosting\n", + "\n", + "\n", + "[XGBoost](https://github.com/dmlc/xgboost) or Extreme Gradient\n", + "Boosting, is an optimized distributed gradient boosting library\n", + "designed to be highly efficient, flexible and portable. It implements\n", + "machine learning algorithms under the Gradient Boosting\n", + "framework. XGBoost provides a parallel tree boosting that solve many\n", + "data science problems in a fast and accurate way. See the [article by Chen and Guestrin](https://arxiv.org/abs/1603.02754).\n", + "\n", + "The authors design and build a highly scalable end-to-end tree\n", + "boosting system. It has a theoretically justified weighted quantile\n", + "sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning.\n", + "\n", + "It is now the algorithm which wins essentially all ML competitions!!!\n", + "\n", + "## Regression Case" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "import xgboost as xgb\n", + "from sklearn.preprocessing import StandardScaler\n", + "import scikitplot as skplt\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "n = 100\n", + "maxdegree = 6\n", + "\n", + "# Make data set.\n", + "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", + "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", + "\n", + "error = np.zeros(maxdegree)\n", + "bias = np.zeros(maxdegree)\n", + "variance = np.zeros(maxdegree)\n", + "polydegree = np.zeros(maxdegree)\n", + "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "for degree in range(maxdegree):\n", + " model = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,\n", + " max_depth = degree, alpha = 10, n_estimators = 10)\n", + " model.fit(X_train_scaled,y_train)\n", + " y_pred = model.predict(X_test_scaled)\n", + " polydegree[degree] = degree\n", + " error[degree] = np.mean( np.mean((y_test - y_pred)**2) )\n", + " bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 )\n", + " variance[degree] = np.mean( np.var(y_pred) )\n", + " print('Max depth:', degree)\n", + " print('Error:', error[degree])\n", + " print('Bias^2:', bias[degree])\n", + " print('Var:', variance[degree])\n", + " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", + "\n", + "plt.xlim(1,maxdegree-1)\n", + "plt.plot(polydegree, error, label='Error')\n", + "plt.plot(polydegree, bias, label='bias')\n", + "plt.plot(polydegree, variance, label='Variance')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Xgboost on the Cancer Data" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split \n", + "from sklearn.datasets import load_breast_cancer\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.model_selection import cross_validate\n", + "import scikitplot as skplt\n", + "import xgboost as xgb\n", + "# Load the data\n", + "cancer = load_breast_cancer()\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)\n", + "print(X_train.shape)\n", + "print(X_test.shape)\n", + "#now scale the data\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "scaler.fit(X_train)\n", + "X_train_scaled = scaler.transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n", + "\n", + "xg_clf = xgb.XGBClassifier()\n", + "xg_clf.fit(X_train_scaled,y_train)\n", + "xgb.plot_tree(xg_clf,num_trees=0)\n", + "plt.rcParams['figure.figsize'] = [50, 10]\n", + "plt.show()\n", + "xgb.plot_importance(xg_clf)\n", + "plt.rcParams['figure.figsize'] = [5, 5]\n", + "plt.show()" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/src/DecisionTrees/DecisionTrees.p.tex b/doc/src/DecisionTrees/DecisionTrees.p.tex new file mode 100644 index 000000000..1005fdb09 --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees.p.tex @@ -0,0 +1,2425 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/hplgit/doconce/) +%% +%% +% #ifdef PTEX2TEX_EXPLANATION +%% +%% The file follows the ptex2tex extended LaTeX format, see +%% ptex2tex: http://code.google.com/p/ptex2tex/ +%% +%% Run +%% ptex2tex myfile +%% or +%% doconce ptex2tex myfile +%% +%% to turn myfile.p.tex into an ordinary LaTeX file myfile.tex. +%% (The ptex2tex program: http://code.google.com/p/ptex2tex) +%% Many preprocess options can be added to ptex2tex or doconce ptex2tex +%% +%% ptex2tex -DMINTED myfile +%% doconce ptex2tex myfile envir=minted +%% +%% ptex2tex will typeset code environments according to a global or local +%% .ptex2tex.cfg configure file. doconce ptex2tex will typeset code +%% according to options on the command line (just type doconce ptex2tex to +%% see examples). If doconce ptex2tex has envir=minted, it enables the +%% minted style without needing -DMINTED. +% #endif + +% #define PREAMBLE + +% #ifdef PREAMBLE +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{ptex2tex} +% #ifdef MINTED +\usepackage{minted} +\usemintedstyle{default} +% #endif + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% Tricks for having figures close to where they are defined: +% 1. define less restrictive rules for where to put figures +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} +\renewcommand{\topfraction}{0.95} +\renewcommand{\bottomfraction}{0.95} +\renewcommand{\textfraction}{0} +\renewcommand{\floatpagefraction}{0.75} +% floatpagefraction must always be less than topfraction! +% 2. ensure all figures are flushed before next section +\usepackage[section]{placeins} +% 3. enable begin{figure}[H] (often leads to ugly pagebreaks) +%\usepackage{float}\restylefloat{figure} + +% --- fancyhdr package for fancy headers --- +\usepackage{fancyhdr} +\fancyhf{} % sets both header and footer to nothing +\renewcommand{\headrulewidth}{0pt} +\fancyfoot[LE,RO]{\thepage} +% Ensure copyright on titlepage (article style) and chapter pages (book style) +\fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} +% \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} +% Ensure copyright on titlepages with \thispagestyle{empty} +\fancypagestyle{empty}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} + \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} + +\pagestyle{fancy} + + +\usepackage[framemethod=TikZ]{mdframed} + +% --- begin definitions of admonition environments --- + +% --- end of definitions of admonition environments --- + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE +% #endif + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Data Analysis and Machine Learning: From Decision Trees to Forests and all that +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf Morten Hjorth-Jensen${}^{1, 2}$} \\ [0mm] +\end{center} + +\begin{center} +% List of all institutions: +\centerline{{\small ${}^1$Department of Physics, University of Oslo}} +\centerline{{\small ${}^2$Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +Nov 7, 2019 +\end{center} +% --- end date --- + +\vspace{1cm} + + +% !split +\subsection{Decision trees, overarching aims} + + +Decision trees are supervised learning algorithms used for both, +classification and regression tasks. + + +The main idea of decision trees +is to find those descriptive features which contain the most +\textbf{information} regarding the target feature and then split the dataset +along the values of these features such that the target feature values +for the resulting underlying datasets are as pure as possible. + +The descriptive features which reproduce best the target/output features are normally said +to be the most informative ones. The process of finding the \textbf{most +informative} feature is done until we accomplish a stopping criteria +where we then finally end up in so called \textbf{leaf nodes}. + +A decision tree is typically divided into a \textbf{root node}, the \textbf{interior nodes}, +and the final \textbf{leaf nodes} or just \textbf{leaves}. These entities are then connected by so-called \textbf{branches}. + +The leaf nodes +contain the predictions we will make for new query instances presented +to our trained model. This is possible since the model has +learned the underlying structure of the training data and hence can, +given some assumptions, make predictions about the target feature value +(class) of unseen query instances. + +% !split +\subsection{A typical Decision Tree with its pertinent Jargon, Classification Problem} + + + +\vspace{6mm} + +% inline figure +\centerline{\includegraphics[width=0.8\linewidth]{DataFiles/cancer.png}} + +\vspace{6mm} + + + +This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using \textbf{Scikit-Learn}'s decision tree classifier. Here we have used the so-called \textbf{gini} index (see below) to split the various branches. + + + +% !split +\subsection{General Features} + +The overarching approach to decision trees is a top-down approach. + +\begin{itemize} +\item A leaf provides the classification of a given instance. + +\item A node specifies a test of some attribute of the instance. + +\item A branch corresponds to a possible values of an attribute. + +\item An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example. +\end{itemize} + +\noindent +This process is then repeated for the subtree rooted at the new +node. + + +% !split +\subsection{How do we set it up?} + + +In simplified terms, the process of training a decision tree and +predicting the target features of query instances is as follows: + +\begin{enumerate} +\item Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature + +\item Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process + +\item Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the \emph{predictions} we want to make for new query instances + +\item Show query instances to the tree and run down the tree until we arrive at leaf nodes +\end{enumerate} + +\noindent +Then we are essentially done! + + + + + +% !split +\subsection{Decision trees and Regression} +\bpycod +import numpy as np +import matplotlib.pyplot as plt +from sklearn.preprocessing import PolynomialFeatures +from sklearn.linear_model import LinearRegression + +steps=250 + +distance=0 +x=0 +distance_list=[] +steps_list=[] +while x 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() +\epycod + +% !split +\subsection{Cancer Data again now with Decision Trees and other Methods} +\bpycod +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 + +# Load the data +cancer = load_breast_cancer() + +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))) + +\epycod + + +% !split +\subsection{Another example, the moons again} +\bpycod +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() + +\epycod + +% !split +\subsection{Playing around with regions} +\bpycod +np.random.seed(6) +Xs = np.random.rand(100, 2) - 0.5 +ys = (Xs[:, 0] > 0).astype(np.float32) * 2 + +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() +\epycod + +% !split +\subsection{Regression trees} +\bpycod +# 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 +\epycod + +\bpycod +from sklearn.tree import DecisionTreeRegressor + +tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg.fit(X, y) +\epycod + +% !split +\subsection{Final regressor code} +\bpycod +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() +\epycod + +\bpycod +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() +\epycod + + + +% !split +\subsection{Pros and cons of trees, pros} + +\begin{itemize} +\item 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) + +\item Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression! + +\item No feature normalization needed + +\item Tree models can handle both continuous and categorical data (Classification and Regression Trees) + +\item Can model nonlinear relationships + +\item Can model interactions between the different descriptive features + +\item Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small) +\end{itemize} + +\noindent +% !split +\subsection{Disadvantages} + +\begin{itemize} +\item Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches + +\item If continuous features are used the tree may become quite large and hence less interpretable + +\item 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 + +\item 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 + +\item 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. + +\item If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data + +\item Features with many levels may be preferred over features with less levels since for them it is \emph{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 +\end{itemize} + +\noindent +However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. + + +% !split +\subsection{Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods} + +As stated above and seen in many of the examples discussed here about +a single decision tree, we often end up overfitting our training +data. This normally means that we have a high variance. Can we reduce +the variance of a statistical learning method? + +This leads us to a set of different methods that can combine different +machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are +\begin{enumerate} +\item Voting classifiers + +\item Bagging and Pasting + +\item Random forests + +\item Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost) +\end{enumerate} + +\noindent +We discuss these methods here. + + +% !split +\subsection{An Overview of Ensemble Methods} + + + +\vspace{6mm} + +% inline figure +\centerline{\includegraphics[width=0.8\linewidth]{DataFiles/ensembleoverview.png}} + +\vspace{6mm} + + + + + +% !split +\subsection{Bagging} + +The \textbf{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. + +\textbf{Bootstrap aggregation}, or just \textbf{bagging}, is a +general-purpose procedure for reducing the variance of a statistical +learning method. + + +% !split +\subsection{More bagging} + +Bagging typically results in improved accuracy +over prediction using a single tree. Unfortunately, however, it can be +difficult to interpret the resulting model. Recall that one of the +advantages of decision trees is the attractive and easily interpreted +diagram that results. + +However, when we bag a large number of trees, it is no longer +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. + +% !split +\subsection{Simple Voting Example, head or tail} +\bpycod +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]) +plt.show() + +\epycod + +% !split +\subsection{Using the Voting Classifier} +\bpycod +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)) + +\epycod + +% !split +\subsection{Please, not the moons again! Voting and Bagging} +\bpycod +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) +\epycod + +\bpycod +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)) +\epycod + +\bpycod +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) +\epycod + +\bpycod +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)) +\epycod + +% !split +\subsection{Now Bagging} + +\bpycod +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) +\epycod + + +\bpycod +from sklearn.metrics import accuracy_score +print(accuracy_score(y_test, y_pred)) +\epycod + +\bpycod +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)) +\epycod + +\bpycod +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() +\epycod + + +% !split +\subsection{Making our own Bagging with Bootstrap} +\bpycod +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.tree import DecisionTreeRegressor + + +np.random.seed(2018) + +n = 40 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = DecisionTreeRegressor(max_depth=5) + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + +\epycod + + +% !split +\subsection{Changing the Level of the Decision Tree} + +\bpycod + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.tree import DecisionTreeRegressor + +n = 100 +n_boostraps = 100 +maxdepth = 8 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdepth) +bias = np.zeros(maxdepth) +variance = np.zeros(maxdepth) +polydegree = np.zeros(maxdepth) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(1,maxdepth): + model = DecisionTreeRegressor(max_depth=degree) + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_) + y_pred[:, i] = model.predict(X_test_scaled)#.ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.xlim(1,maxdepth) +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + + +\epycod + + + + +% !split +\subsection{Random forests} + +Random forests provide an improvement over bagged trees by way of a +small tweak that decorrelates the trees. + +As in bagging, we build a +number of decision trees on bootstrapped training samples. But when +building these decision trees, each time a split in a tree is +considered, a random sample of $m$ predictors is chosen as split +candidates from the full set of $p$ predictors. The split is allowed to +use only one of those $m$ predictors. + +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. + + +% !split +\subsection{Random Forest Algorithm} +The algorithm described here can be applied to both classification and regression problems. + +We will grow of forest of say $M$ trees. +\begin{enumerate} +\item For $m=1:M$ we +\begin{itemize} + + \item Draw a bootstrap sample of from the training data organized in our $\bm{X}$ matrix. + + \item We grow then a random forest tree $T_m$ based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached +\begin{enumerate} + + \item we select $m \le p$ varibales at random from the $p$ predictors/features + + \item pick the best split point among the $m$ features using either the CART algorithm or the ID3 for classification and create a new node + + \item split the node into daughter nodes + +\end{enumerate} + +\noindent +\end{itemize} + +\noindent +\item Output then the ensemble of trees $\{T_m\}_1^{M}$ and make predictions for either a regression type of problem or a classification type of problem. +\end{enumerate} + +\noindent +% !split +\subsection{Bootstrap with Random Forests Instead of a Single Tree, own Bagging} + +\bpycod + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.ensemble import RandomForestRegressor + +np.random.seed(2018) + +n = 100 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = RandomForestRegressor() + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_.ravel()) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + +\epycod + + + + +% !split +\subsection{Random Forests Compared with other Methods on the Cancer Data} +\bpycod +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 + +# Load the data +cancer = load_breast_cancer() + +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))) + + +from sklearn.ensemble import RandomForestClassifier +from sklearn.preprocessing import LabelEncoder +from sklearn.model_selection import cross_validate +# Data set not specificied +#Instantiate the model with 500 trees and entropy as splitting criteria +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy") +Random_Forest_model.fit(X_train_scaled, y_train) +#Cross validation +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score'] +print(accuracy) +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test))) + + +import scikitplot as skplt +y_pred = Random_Forest_model.predict(X_test_scaled) +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True) +plt.show() +y_probas = Random_Forest_model.predict_proba(X_test_scaled) +skplt.metrics.plot_roc(y_test, y_probas) +plt.show() +skplt.metrics.plot_cumulative_gain(y_test, y_probas) +plt.show() + +\epycod + + +% !split +\subsection{Compare Bagging on Trees with Random Forests} +\bpycod +bag_clf = BaggingClassifier( + DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42), + n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42) +\epycod + + + +\bpycod +bag_clf.fit(X_train, y_train) +y_pred = bag_clf.predict(X_test) +from sklearn.ensemble import RandomForestClassifier +rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42) +rnd_clf.fit(X_train, y_train) +y_pred_rf = rnd_clf.predict(X_test) +np.sum(y_pred == y_pred_rf) / len(y_pred) +\epycod + + + + + +% !split +\subsection{Boosting, a Bird'e Eye} + +The basic idea is to combine weak classifiers in order to create a good +classifier. With a weak classifier we often intend a classifier which +produces results which are only slightly better than we would get by +random guesses. + +This is done by applying in an iterative way a weak (or a standard +classifier like decision trees) to modify the data. In each iteration +we emphasize those observations which are misclassified by weighting +them with a factor. + + +% !split +\subsection{Adaptive boosting: AdaBoost, Basic Algorithm} + +The algorithm here is rather straightforward. Assume that our weak +classifier is a decision tree and we consider a binary set of outputs +with $y_i \in \{-1,1\}$ and $i=0,1,2,\dots,n-1$ as our set of +observations. Our design matrix is given in terms of the +feature/predictor vectors +$\bm{X}=[\bm{x}_0\bm{x}_1\dots\bm{x}_{p-1}$. Finally, we define also a +classifier determined by our data via a function $G(\bm{X})$. This function tells us how well we are able to classify our outputs/targets $\bm{y}$. + +We can then define the misclassification error $\mathrm{err}$ as +\[ +\mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(\bm{X}_{i*}), +\] +where the function $I()$ is one if we misclassify and zero if we classify correctly. + +% !split +\subsection{Basic Steps of AdaBoost} + +With the above definitions we are now ready to set up the algorithm for AdaBoost. +The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases. +\begin{enumerate} +\item We start by initializing all weights to $w_i = 1/n$, with $i=0,1,2,\dots n-1$. It is to see then that $\sum_{i=0}^{n-1}w_i = 1$. + +\item We rewrite the misclassification error as +\end{enumerate} + +\noindent +\[ +\mathrm{err}=\frac{\sum_{i=0}^{n-1}w_iI(y_i\ne G(\bm{X}_{i*})}{\sum_{i=0}^{n-1}w_i}, +\] +\begin{enumerate} +\item Then we start looping over all attempts at classifying, namely we start an iterative process for $m=1:M$, where $M$ is the final number of classifications. Our given classifier could for example be a plain decision tree. +\begin{enumerate} + + \item Fit then a given classifier to the training using the weights $w_i$. + + \item Compute then $\mathrm{err}$ and figure out which events are classified properly and which are classified wrongly. + + \item Define a quantity $\alpha_{m} = \log{(1-\mathrm{err})/\mathrm{err}} + + \item Set the new weights to $w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(\bm{X}_{i*})}. + +\end{enumerate} + +\noindent +\item Compute the new classifier $G(\bm{X})= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(\bm{X}_{i*}). +\end{enumerate} + +\noindent +For the iterations with $m \le 2$ the weights are modified +individually at each steps. The obersvations which were misclassified +at iteration $m-1$ have a weight which is larger than those which were +classified properly. As this proceeds, the observations which were +difficult to classifiy correctly are given a larger influence. Each +new classification step $m$ is then forced to concentrate on those +observations that are missed in the previous iterations. + + + +% !split +\subsection{AdaBoost Examples} + +Using \textbf{Scikit-Learn} it is easy to appply the adaptive boosting algorithm, as done here. + +\bpycod +from sklearn.ensemble import AdaBoostClassifier + +ada_clf = AdaBoostClassifier( + DecisionTreeClassifier(max_depth=1), n_estimators=200, + algorithm="SAMME.R", learning_rate=0.5, random_state=42) +ada_clf.fit(X_train, y_train) + +plot_decision_boundary(ada_clf, X, y) + +m = len(X_train) + +plt.figure(figsize=(11, 4)) +for subplot, learning_rate in ((121, 1), (122, 0.5)): + sample_weights = np.ones(m) + plt.subplot(subplot) + for i in range(5): + svm_clf = SVC(kernel="rbf", C=0.05, gamma="auto", random_state=42) + svm_clf.fit(X_train, y_train, sample_weight=sample_weights) + y_pred = svm_clf.predict(X_train) + sample_weights[y_pred != y_train] *= (1 + learning_rate) + plot_decision_boundary(svm_clf, X, y, alpha=0.2) + plt.title("learning_rate = {}".format(learning_rate), fontsize=16) + if subplot == 121: + plt.text(-0.7, -0.65, "1", fontsize=14) + plt.text(-0.6, -0.10, "2", fontsize=14) + plt.text(-0.5, 0.10, "3", fontsize=14) + plt.text(-0.4, 0.55, "4", fontsize=14) + plt.text(-0.3, 0.90, "5", fontsize=14) + +save_fig("boosting_plot") +plt.show() +\epycod + + +% !split +\subsection{Gradient boosting: Basics} + +Gradient boosting is again a similar technique to Adapative boosting, +it combines so-called weak classifiers or regressors into a strong +method via a series of iterations. + +In order to understand the method, let us illustrate its basics by +bringing back the essential steps in linear regression, where our cost +function was the least squares function. + +% !split +\subsection{Gradient Boosting, algorithm} + +Suppose we have a cost function $C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i))$ where $y_i$ is our target and $f(x_i)$ the function which is meant to model $y_i$. The above cost function could be our standard least squares function +\[ +C(\bm{y},\bm{f})=\frac{1}{n}\sum_{i=0}^{n-1}(y_i-f(x_i))^2. +\] + +The way we proceed in an iterative fashion is to +\begin{enumerate} +\item Initialize our estimate by $f_0(x)=0$. + +\item For $m=1:M$, we +\begin{enumerate} + + \item compute the negative gradient vector $\bm{u}_m = -\partial C(\bm{y},\bm{f})/\partial \bm{f}(x)$ at $f(x) = f_{m-1}(x); + + \item fit the so-called base-learner to the negative gradient $h_m(u_m,x)$; + + \item update the estimate $f_m(x) = f_{m-1}(x)+\nu h_m(u_m,x)$; + +\end{enumerate} + +\noindent +\item The final estimate is then $f_M(x) = \sum_{m=1}^M\nu h_m(u_m,x)$. +\end{enumerate} + +\noindent +% !split +\subsection{Gradient Boosting, Examples} +\bpycod +np.random.seed(42) +X = np.random.rand(100, 1) - 0.5 +y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100) + +from sklearn.tree import DecisionTreeRegressor + +tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg1.fit(X, y) + +y2 = y - tree_reg1.predict(X) +tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg2.fit(X, y2) + +y3 = y2 - tree_reg2.predict(X) +tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg3.fit(X, y3) + +X_new = np.array([[0.8]]) +y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3)) + +def plot_predictions(regressors, X, y, axes, label=None, style="r-", data_style="b.", data_label=None): + x1 = np.linspace(axes[0], axes[1], 500) + y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors) + plt.plot(X[:, 0], y, data_style, label=data_label) + plt.plot(x1, y_pred, style, linewidth=2, label=label) + if label or data_label: + plt.legend(loc="upper center", fontsize=16) + plt.axis(axes) + +plt.figure(figsize=(11,11)) + +plt.subplot(321) +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h_1(x_1)$", style="g-", data_label="Training set") +plt.ylabel("$y$", fontsize=16, rotation=0) +plt.title("Residuals and tree predictions", fontsize=16) + +plt.subplot(322) +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1)$", data_label="Training set") +plt.ylabel("$y$", fontsize=16, rotation=0) +plt.title("Ensemble predictions", fontsize=16) + +plt.subplot(323) +plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_2(x_1)$", style="g-", data_style="k+", data_label="Residuals") +plt.ylabel("$y - h_1(x_1)$", fontsize=16) + +plt.subplot(324) +plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1)$") +plt.ylabel("$y$", fontsize=16, rotation=0) + +plt.subplot(325) +plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_3(x_1)$", style="g-", data_style="k+") +plt.ylabel("$y - h_1(x_1) - h_2(x_1)$", fontsize=16) +plt.xlabel("$x_1$", fontsize=16) + +plt.subplot(326) +plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$") +plt.xlabel("$x_1$", fontsize=16) +plt.ylabel("$y$", fontsize=16, rotation=0) + +save_fig("gradient_boosting_plot") +plt.show() + +from sklearn.ensemble import GradientBoostingRegressor + +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42) +gbrt.fit(X, y) + +gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42) +gbrt_slow.fit(X, y) + +plt.figure(figsize=(11,4)) + +plt.subplot(121) +plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="Ensemble predictions") +plt.title("learning_rate={}, n_estimators={}".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14) + +plt.subplot(122) +plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8]) +plt.title("learning_rate={}, n_estimators={}".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14) + +save_fig("gbrt_learning_rate_plot") +plt.show() + +\epycod + + +% !split +\subsection{Gradient Boots with Early Stopping} +\bpycod + +from sklearn.model_selection import train_test_split +from sklearn.metrics import mean_squared_error + +X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49) + +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42) +gbrt.fit(X_train, y_train) + +errors = [mean_squared_error(y_val, y_pred) + for y_pred in gbrt.staged_predict(X_val)] +bst_n_estimators = np.argmin(errors) + 1 + +gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42) +gbrt_best.fit(X_train, y_train) + +min_error = np.min(errors) +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plt.plot(errors, "b.-") +plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], "k--") +plt.plot([0, 120], [min_error, min_error], "k--") +plt.plot(bst_n_estimators, min_error, "ko") +plt.text(bst_n_estimators, min_error*1.2, "Minimum", ha="center", fontsize=14) +plt.axis([0, 120, 0, 0.01]) +plt.xlabel("Number of trees") +plt.title("Validation error", fontsize=14) + +plt.subplot(122) +plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8]) +plt.title("Best model (%d trees)" % bst_n_estimators, fontsize=14) + +save_fig("early_stopping_gbrt_plot") +plt.show() + + +gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42) + +min_val_error = float("inf") +error_going_up = 0 +for n_estimators in range(1, 120): + gbrt.n_estimators = n_estimators + gbrt.fit(X_train, y_train) + y_pred = gbrt.predict(X_val) + val_error = mean_squared_error(y_val, y_pred) + if val_error < min_val_error: + min_val_error = val_error + error_going_up = 0 + else: + error_going_up += 1 + if error_going_up == 5: + break # early stopping + + +print(gbrt.n_estimators) +print("Minimum validation MSE:", min_val_error) +\epycod + +% !split +\subsection{XGBoost: Extreme Gradient Boosting} + + +\href{{https://github.com/dmlc/xgboost}}{XGBoost} or Extreme Gradient +Boosting, is an optimized distributed gradient boosting library +designed to be highly efficient, flexible and portable. It implements +machine learning algorithms under the Gradient Boosting +framework. XGBoost provides a parallel tree boosting that solve many +data science problems in a fast and accurate way. See the \href{{https://arxiv.org/abs/1603.02754}}{article by Chen and Guestrin}. + +The authors design and build a highly scalable end-to-end tree +boosting system. It has a theoretically justified weighted quantile +sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning. + +It is now the algorithm which wins essentially all ML competitions!!! + +% !split +\subsection{Regression Case} + +\bpycod +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +import xgboost as xgb +from sklearn.preprocessing import StandardScaler +import scikitplot as skplt +from sklearn.metrics import mean_squared_error + +n = 100 +maxdegree = 6 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) + +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) +scaler = StandardScaler() +scaler.fit(X_train) +X_train_scaled = scaler.transform(X_train) +X_test_scaled = scaler.transform(X_test) + +for degree in range(maxdegree): + model = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1, + max_depth = degree, alpha = 10, n_estimators = 10) + model.fit(X_train_scaled,y_train) + y_pred = model.predict(X_test_scaled) + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 ) + variance[degree] = np.mean( np.var(y_pred) ) + print('Max depth:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.xlim(1,maxdegree-1) +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + +\epycod + + + +% !split +\subsection{Xgboost on the Cancer Data} +\bpycod +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.preprocessing import LabelEncoder +from sklearn.model_selection import cross_validate +import scikitplot as skplt +import xgboost as xgb +# Load the data +cancer = load_breast_cancer() + +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) +#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) + +xg_clf = xgb.XGBClassifier() +xg_clf.fit(X_train_scaled,y_train) +xgb.plot_tree(xg_clf,num_trees=0) +plt.rcParams['figure.figsize'] = [50, 10] +plt.show() +xgb.plot_importance(xg_clf) +plt.rcParams['figure.figsize'] = [5, 5] +plt.show() +\epycod + +% ------------------- end of main content --------------- + +% #ifdef PREAMBLE +\end{document} +% #endif + diff --git a/doc/src/DecisionTrees/DecisionTrees.tex b/doc/src/DecisionTrees/DecisionTrees.tex new file mode 100644 index 000000000..5ab09d845 --- /dev/null +++ b/doc/src/DecisionTrees/DecisionTrees.tex @@ -0,0 +1,2395 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/hplgit/doconce/) +%% +%% + + +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{fancyvrb} % packages needed for verbatim environments +\usepackage{minted} +\usemintedstyle{default} + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% Tricks for having figures close to where they are defined: +% 1. define less restrictive rules for where to put figures +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} +\renewcommand{\topfraction}{0.95} +\renewcommand{\bottomfraction}{0.95} +\renewcommand{\textfraction}{0} +\renewcommand{\floatpagefraction}{0.75} +% floatpagefraction must always be less than topfraction! +% 2. ensure all figures are flushed before next section +\usepackage[section]{placeins} +% 3. enable begin{figure}[H] (often leads to ugly pagebreaks) +%\usepackage{float}\restylefloat{figure} + +% --- fancyhdr package for fancy headers --- +\usepackage{fancyhdr} +\fancyhf{} % sets both header and footer to nothing +\renewcommand{\headrulewidth}{0pt} +\fancyfoot[LE,RO]{\thepage} +% Ensure copyright on titlepage (article style) and chapter pages (book style) +\fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} +% \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} +% Ensure copyright on titlepages with \thispagestyle{empty} +\fancypagestyle{empty}{ + \fancyhf{} + \fancyfoot[C]{{\footnotesize \copyright\ 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license}} + \renewcommand{\footrulewidth}{0mm} + \renewcommand{\headrulewidth}{0mm} +} + +\pagestyle{fancy} + + +\usepackage[framemethod=TikZ]{mdframed} + +% --- begin definitions of admonition environments --- + +% --- end of definitions of admonition environments --- + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Data Analysis and Machine Learning: From Decision Trees to Forests and all that +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf Morten Hjorth-Jensen${}^{1, 2}$} \\ [0mm] +\end{center} + +\begin{center} +% List of all institutions: +\centerline{{\small ${}^1$Department of Physics, University of Oslo}} +\centerline{{\small ${}^2$Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +Nov 7, 2019 +\end{center} +% --- end date --- + +\vspace{1cm} + + +% !split +\subsection*{Decision trees, overarching aims} + + +Decision trees are supervised learning algorithms used for both, +classification and regression tasks. + + +The main idea of decision trees +is to find those descriptive features which contain the most +\textbf{information} regarding the target feature and then split the dataset +along the values of these features such that the target feature values +for the resulting underlying datasets are as pure as possible. + +The descriptive features which reproduce best the target/output features are normally said +to be the most informative ones. The process of finding the \textbf{most +informative} feature is done until we accomplish a stopping criteria +where we then finally end up in so called \textbf{leaf nodes}. + +A decision tree is typically divided into a \textbf{root node}, the \textbf{interior nodes}, +and the final \textbf{leaf nodes} or just \textbf{leaves}. These entities are then connected by so-called \textbf{branches}. + +The leaf nodes +contain the predictions we will make for new query instances presented +to our trained model. This is possible since the model has +learned the underlying structure of the training data and hence can, +given some assumptions, make predictions about the target feature value +(class) of unseen query instances. + +% !split +\subsection*{A typical Decision Tree with its pertinent Jargon, Classification Problem} + + + +\vspace{6mm} + +% inline figure +\centerline{\includegraphics[width=0.8\linewidth]{DataFiles/cancer.png}} + +\vspace{6mm} + + + +This tree was produced using the Wisconsin cancer data (discussed here as well, see code examples below) using \textbf{Scikit-Learn}'s decision tree classifier. Here we have used the so-called \textbf{gini} index (see below) to split the various branches. + + + +% !split +\subsection*{General Features} + +The overarching approach to decision trees is a top-down approach. + +\begin{itemize} +\item A leaf provides the classification of a given instance. + +\item A node specifies a test of some attribute of the instance. + +\item A branch corresponds to a possible values of an attribute. + +\item An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example. +\end{itemize} + +\noindent +This process is then repeated for the subtree rooted at the new +node. + + +% !split +\subsection*{How do we set it up?} + + +In simplified terms, the process of training a decision tree and +predicting the target features of query instances is as follows: + +\begin{enumerate} +\item Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature + +\item Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process + +\item Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the \emph{predictions} we want to make for new query instances + +\item Show query instances to the tree and run down the tree until we arrive at leaf nodes +\end{enumerate} + +\noindent +Then we are essentially done! + + + + + +% !split +\subsection*{Decision trees and Regression} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +import numpy as np +import matplotlib.pyplot as plt +from sklearn.preprocessing import PolynomialFeatures +from sklearn.linear_model import LinearRegression + +steps=250 + +distance=0 +x=0 +distance_list=[] +steps_list=[] +while x 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() +\end{minted} + +% !split +\subsection*{Cancer Data again now with Decision Trees and other Methods} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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 + +# Load the data +cancer = load_breast_cancer() + +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))) + +\end{minted} + + +% !split +\subsection*{Another example, the moons again} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() + +\end{minted} + +% !split +\subsection*{Playing around with regions} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +np.random.seed(6) +Xs = np.random.rand(100, 2) - 0.5 +ys = (Xs[:, 0] > 0).astype(np.float32) * 2 + +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() +\end{minted} + +% !split +\subsection*{Regression trees} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +# 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 +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from sklearn.tree import DecisionTreeRegressor + +tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg.fit(X, y) +\end{minted} + +% !split +\subsection*{Final regressor code} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() +\end{minted} + + + +% !split +\subsection*{Pros and cons of trees, pros} + +\begin{itemize} +\item 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) + +\item Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression! + +\item No feature normalization needed + +\item Tree models can handle both continuous and categorical data (Classification and Regression Trees) + +\item Can model nonlinear relationships + +\item Can model interactions between the different descriptive features + +\item Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small) +\end{itemize} + +\noindent +% !split +\subsection*{Disadvantages} + +\begin{itemize} +\item Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches + +\item If continuous features are used the tree may become quite large and hence less interpretable + +\item 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 + +\item 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 + +\item 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. + +\item If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data + +\item Features with many levels may be preferred over features with less levels since for them it is \emph{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 +\end{itemize} + +\noindent +However, by aggregating many decision trees, using methods like bagging, random forests, and boosting, the predictive performance of trees can be substantially improved. + + +% !split +\subsection*{Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods} + +As stated above and seen in many of the examples discussed here about +a single decision tree, we often end up overfitting our training +data. This normally means that we have a high variance. Can we reduce +the variance of a statistical learning method? + +This leads us to a set of different methods that can combine different +machine learning algorithms or just use one of them to construct forests and jungles of trees, homogeneous ones or heterogenous ones. These methods are recognized by different names which we will try to explain here. These are +\begin{enumerate} +\item Voting classifiers + +\item Bagging and Pasting + +\item Random forests + +\item Boosting methods, from adaptive to Extreme Gradient Boosting (XGBoost) +\end{enumerate} + +\noindent +We discuss these methods here. + + +% !split +\subsection*{An Overview of Ensemble Methods} + + + +\vspace{6mm} + +% inline figure +\centerline{\includegraphics[width=0.8\linewidth]{DataFiles/ensembleoverview.png}} + +\vspace{6mm} + + + + + +% !split +\subsection*{Bagging} + +The \textbf{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. + +\textbf{Bootstrap aggregation}, or just \textbf{bagging}, is a +general-purpose procedure for reducing the variance of a statistical +learning method. + + +% !split +\subsection*{More bagging} + +Bagging typically results in improved accuracy +over prediction using a single tree. Unfortunately, however, it can be +difficult to interpret the resulting model. Recall that one of the +advantages of decision trees is the attractive and easily interpreted +diagram that results. + +However, when we bag a large number of trees, it is no longer +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. + +% !split +\subsection*{Simple Voting Example, head or tail} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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]) +plt.show() + +\end{minted} + +% !split +\subsection*{Using the Voting Classifier} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) + +\end{minted} + +% !split +\subsection*{Please, not the moons again! Voting and Bagging} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) +\end{minted} + +% !split +\subsection*{Now Bagging} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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) +\end{minted} + + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from sklearn.metrics import accuracy_score +print(accuracy_score(y_test, y_pred)) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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)) +\end{minted} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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() +\end{minted} + + +% !split +\subsection*{Making our own Bagging with Bootstrap} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.tree import DecisionTreeRegressor + + +np.random.seed(2018) + +n = 40 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = DecisionTreeRegressor(max_depth=5) + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + +\end{minted} + + +% !split +\subsection*{Changing the Level of the Decision Tree} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.tree import DecisionTreeRegressor + +n = 100 +n_boostraps = 100 +maxdepth = 8 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdepth) +bias = np.zeros(maxdepth) +variance = np.zeros(maxdepth) +polydegree = np.zeros(maxdepth) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(1,maxdepth): + model = DecisionTreeRegressor(max_depth=degree) + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_) + y_pred[:, i] = model.predict(X_test_scaled)#.ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.xlim(1,maxdepth) +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + + +\end{minted} + + + + +% !split +\subsection*{Random forests} + +Random forests provide an improvement over bagged trees by way of a +small tweak that decorrelates the trees. + +As in bagging, we build a +number of decision trees on bootstrapped training samples. But when +building these decision trees, each time a split in a tree is +considered, a random sample of $m$ predictors is chosen as split +candidates from the full set of $p$ predictors. The split is allowed to +use only one of those $m$ predictors. + +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. + + +% !split +\subsection*{Random Forest Algorithm} +The algorithm described here can be applied to both classification and regression problems. + +We will grow of forest of say $M$ trees. +\begin{enumerate} +\item For $m=1:M$ we +\begin{itemize} + + \item Draw a bootstrap sample of from the training data organized in our $\bm{X}$ matrix. + + \item We grow then a random forest tree $T_m$ based on the bootstrapped data by repeating the steps outlined till we reach the maximum node size is reached +\begin{enumerate} + + \item we select $m \le p$ varibales at random from the $p$ predictors/features + + \item pick the best split point among the $m$ features using either the CART algorithm or the ID3 for classification and create a new node + + \item split the node into daughter nodes + +\end{enumerate} + +\noindent +\end{itemize} + +\noindent +\item Output then the ensemble of trees $\{T_m\}_1^{M}$ and make predictions for either a regression type of problem or a classification type of problem. +\end{enumerate} + +\noindent +% !split +\subsection*{Bootstrap with Random Forests Instead of a Single Tree, own Bagging} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.utils import resample +from sklearn.ensemble import RandomForestRegressor + +np.random.seed(2018) + +n = 100 +n_boostraps = 100 +maxdegree = 14 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + +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) + +for degree in range(maxdegree): + model = RandomForestRegressor() + y_pred = np.empty((y_test.shape[0], n_boostraps)) + for i in range(n_boostraps): + x_, y_ = resample(X_train_scaled, y_train) + model.fit(x_, y_.ravel()) + y_pred[:, i] = model.predict(X_test_scaled).ravel() + + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 ) + variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) ) + print('Polynomial degree:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + + +\end{minted} + + + + +% !split +\subsection*{Random Forests Compared with other Methods on the Cancer Data} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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 + +# Load the data +cancer = load_breast_cancer() + +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))) + + +from sklearn.ensemble import RandomForestClassifier +from sklearn.preprocessing import LabelEncoder +from sklearn.model_selection import cross_validate +# Data set not specificied +#Instantiate the model with 500 trees and entropy as splitting criteria +Random_Forest_model = RandomForestClassifier(n_estimators=500,criterion="entropy") +Random_Forest_model.fit(X_train_scaled, y_train) +#Cross validation +accuracy = cross_validate(Random_Forest_model,X_test_scaled,y_test,cv=10)['test_score'] +print(accuracy) +print("Test set accuracy with Random Forests and scaled data: {:.2f}".format(Random_Forest_model.score(X_test_scaled,y_test))) + + +import scikitplot as skplt +y_pred = Random_Forest_model.predict(X_test_scaled) +skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=True) +plt.show() +y_probas = Random_Forest_model.predict_proba(X_test_scaled) +skplt.metrics.plot_roc(y_test, y_probas) +plt.show() +skplt.metrics.plot_cumulative_gain(y_test, y_probas) +plt.show() + +\end{minted} + + +% !split +\subsection*{Compare Bagging on Trees with Random Forests} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +bag_clf = BaggingClassifier( + DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42), + n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42) +\end{minted} + + + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +bag_clf.fit(X_train, y_train) +y_pred = bag_clf.predict(X_test) +from sklearn.ensemble import RandomForestClassifier +rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42) +rnd_clf.fit(X_train, y_train) +y_pred_rf = rnd_clf.predict(X_test) +np.sum(y_pred == y_pred_rf) / len(y_pred) +\end{minted} + + + + + +% !split +\subsection*{Boosting, a Bird'e Eye} + +The basic idea is to combine weak classifiers in order to create a good +classifier. With a weak classifier we often intend a classifier which +produces results which are only slightly better than we would get by +random guesses. + +This is done by applying in an iterative way a weak (or a standard +classifier like decision trees) to modify the data. In each iteration +we emphasize those observations which are misclassified by weighting +them with a factor. + + +% !split +\subsection*{Adaptive boosting: AdaBoost, Basic Algorithm} + +The algorithm here is rather straightforward. Assume that our weak +classifier is a decision tree and we consider a binary set of outputs +with $y_i \in \{-1,1\}$ and $i=0,1,2,\dots,n-1$ as our set of +observations. Our design matrix is given in terms of the +feature/predictor vectors +$\bm{X}=[\bm{x}_0\bm{x}_1\dots\bm{x}_{p-1}$. Finally, we define also a +classifier determined by our data via a function $G(\bm{X})$. This function tells us how well we are able to classify our outputs/targets $\bm{y}$. + +We can then define the misclassification error $\mathrm{err}$ as +\[ +\mathrm{err}=\frac{1}{n}\sum_{i=0}^{n-1}I(y_i\ne G(\bm{X}_{i*}), +\] +where the function $I()$ is one if we misclassify and zero if we classify correctly. + +% !split +\subsection*{Basic Steps of AdaBoost} + +With the above definitions we are now ready to set up the algorithm for AdaBoost. +The basic idea is to set up weights which will be used to scale the correctly classified and the misclassified cases. +\begin{enumerate} +\item We start by initializing all weights to $w_i = 1/n$, with $i=0,1,2,\dots n-1$. It is to see then that $\sum_{i=0}^{n-1}w_i = 1$. + +\item We rewrite the misclassification error as +\end{enumerate} + +\noindent +\[ +\mathrm{err}=\frac{\sum_{i=0}^{n-1}w_iI(y_i\ne G(\bm{X}_{i*})}{\sum_{i=0}^{n-1}w_i}, +\] +\begin{enumerate} +\item Then we start looping over all attempts at classifying, namely we start an iterative process for $m=1:M$, where $M$ is the final number of classifications. Our given classifier could for example be a plain decision tree. +\begin{enumerate} + + \item Fit then a given classifier to the training using the weights $w_i$. + + \item Compute then $\mathrm{err}$ and figure out which events are classified properly and which are classified wrongly. + + \item Define a quantity $\alpha_{m} = \log{(1-\mathrm{err})/\mathrm{err}} + + \item Set the new weights to $w_i = w_i\times \exp{(\alpha_m I(y_i\ne G(\bm{X}_{i*})}. + +\end{enumerate} + +\noindent +\item Compute the new classifier $G(\bm{X})= \sum_{i=0}^{n-1}\alpha_m I(y_i\ne G(\bm{X}_{i*}). +\end{enumerate} + +\noindent +For the iterations with $m \le 2$ the weights are modified +individually at each steps. The obersvations which were misclassified +at iteration $m-1$ have a weight which is larger than those which were +classified properly. As this proceeds, the observations which were +difficult to classifiy correctly are given a larger influence. Each +new classification step $m$ is then forced to concentrate on those +observations that are missed in the previous iterations. + + + +% !split +\subsection*{AdaBoost Examples} + +Using \textbf{Scikit-Learn} it is easy to appply the adaptive boosting algorithm, as done here. + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +from sklearn.ensemble import AdaBoostClassifier + +ada_clf = AdaBoostClassifier( + DecisionTreeClassifier(max_depth=1), n_estimators=200, + algorithm="SAMME.R", learning_rate=0.5, random_state=42) +ada_clf.fit(X_train, y_train) + +plot_decision_boundary(ada_clf, X, y) + +m = len(X_train) + +plt.figure(figsize=(11, 4)) +for subplot, learning_rate in ((121, 1), (122, 0.5)): + sample_weights = np.ones(m) + plt.subplot(subplot) + for i in range(5): + svm_clf = SVC(kernel="rbf", C=0.05, gamma="auto", random_state=42) + svm_clf.fit(X_train, y_train, sample_weight=sample_weights) + y_pred = svm_clf.predict(X_train) + sample_weights[y_pred != y_train] *= (1 + learning_rate) + plot_decision_boundary(svm_clf, X, y, alpha=0.2) + plt.title("learning_rate = {}".format(learning_rate), fontsize=16) + if subplot == 121: + plt.text(-0.7, -0.65, "1", fontsize=14) + plt.text(-0.6, -0.10, "2", fontsize=14) + plt.text(-0.5, 0.10, "3", fontsize=14) + plt.text(-0.4, 0.55, "4", fontsize=14) + plt.text(-0.3, 0.90, "5", fontsize=14) + +save_fig("boosting_plot") +plt.show() +\end{minted} + + +% !split +\subsection*{Gradient boosting: Basics} + +Gradient boosting is again a similar technique to Adapative boosting, +it combines so-called weak classifiers or regressors into a strong +method via a series of iterations. + +In order to understand the method, let us illustrate its basics by +bringing back the essential steps in linear regression, where our cost +function was the least squares function. + +% !split +\subsection*{Gradient Boosting, algorithm} + +Suppose we have a cost function $C(f)=\sum_{i=0}^{n-1}L(y_i, f(x_i))$ where $y_i$ is our target and $f(x_i)$ the function which is meant to model $y_i$. The above cost function could be our standard least squares function +\[ +C(\bm{y},\bm{f})=\frac{1}{n}\sum_{i=0}^{n-1}(y_i-f(x_i))^2. +\] + +The way we proceed in an iterative fashion is to +\begin{enumerate} +\item Initialize our estimate by $f_0(x)=0$. + +\item For $m=1:M$, we +\begin{enumerate} + + \item compute the negative gradient vector $\bm{u}_m = -\partial C(\bm{y},\bm{f})/\partial \bm{f}(x)$ at $f(x) = f_{m-1}(x); + + \item fit the so-called base-learner to the negative gradient $h_m(u_m,x)$; + + \item update the estimate $f_m(x) = f_{m-1}(x)+\nu h_m(u_m,x)$; + +\end{enumerate} + +\noindent +\item The final estimate is then $f_M(x) = \sum_{m=1}^M\nu h_m(u_m,x)$. +\end{enumerate} + +\noindent +% !split +\subsection*{Gradient Boosting, Examples} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +np.random.seed(42) +X = np.random.rand(100, 1) - 0.5 +y = 3*X[:, 0]**2 + 0.05 * np.random.randn(100) + +from sklearn.tree import DecisionTreeRegressor + +tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg1.fit(X, y) + +y2 = y - tree_reg1.predict(X) +tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg2.fit(X, y2) + +y3 = y2 - tree_reg2.predict(X) +tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42) +tree_reg3.fit(X, y3) + +X_new = np.array([[0.8]]) +y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3)) + +def plot_predictions(regressors, X, y, axes, label=None, style="r-", data_style="b.", data_label=None): + x1 = np.linspace(axes[0], axes[1], 500) + y_pred = sum(regressor.predict(x1.reshape(-1, 1)) for regressor in regressors) + plt.plot(X[:, 0], y, data_style, label=data_label) + plt.plot(x1, y_pred, style, linewidth=2, label=label) + if label or data_label: + plt.legend(loc="upper center", fontsize=16) + plt.axis(axes) + +plt.figure(figsize=(11,11)) + +plt.subplot(321) +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h_1(x_1)$", style="g-", data_label="Training set") +plt.ylabel("$y$", fontsize=16, rotation=0) +plt.title("Residuals and tree predictions", fontsize=16) + +plt.subplot(322) +plot_predictions([tree_reg1], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1)$", data_label="Training set") +plt.ylabel("$y$", fontsize=16, rotation=0) +plt.title("Ensemble predictions", fontsize=16) + +plt.subplot(323) +plot_predictions([tree_reg2], X, y2, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_2(x_1)$", style="g-", data_style="k+", data_label="Residuals") +plt.ylabel("$y - h_1(x_1)$", fontsize=16) + +plt.subplot(324) +plot_predictions([tree_reg1, tree_reg2], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1)$") +plt.ylabel("$y$", fontsize=16, rotation=0) + +plt.subplot(325) +plot_predictions([tree_reg3], X, y3, axes=[-0.5, 0.5, -0.5, 0.5], label="$h_3(x_1)$", style="g-", data_style="k+") +plt.ylabel("$y - h_1(x_1) - h_2(x_1)$", fontsize=16) +plt.xlabel("$x_1$", fontsize=16) + +plt.subplot(326) +plot_predictions([tree_reg1, tree_reg2, tree_reg3], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="$h(x_1) = h_1(x_1) + h_2(x_1) + h_3(x_1)$") +plt.xlabel("$x_1$", fontsize=16) +plt.ylabel("$y$", fontsize=16, rotation=0) + +save_fig("gradient_boosting_plot") +plt.show() + +from sklearn.ensemble import GradientBoostingRegressor + +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42) +gbrt.fit(X, y) + +gbrt_slow = GradientBoostingRegressor(max_depth=2, n_estimators=200, learning_rate=0.1, random_state=42) +gbrt_slow.fit(X, y) + +plt.figure(figsize=(11,4)) + +plt.subplot(121) +plot_predictions([gbrt], X, y, axes=[-0.5, 0.5, -0.1, 0.8], label="Ensemble predictions") +plt.title("learning_rate={}, n_estimators={}".format(gbrt.learning_rate, gbrt.n_estimators), fontsize=14) + +plt.subplot(122) +plot_predictions([gbrt_slow], X, y, axes=[-0.5, 0.5, -0.1, 0.8]) +plt.title("learning_rate={}, n_estimators={}".format(gbrt_slow.learning_rate, gbrt_slow.n_estimators), fontsize=14) + +save_fig("gbrt_learning_rate_plot") +plt.show() + +\end{minted} + + +% !split +\subsection*{Gradient Boots with Early Stopping} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} + +from sklearn.model_selection import train_test_split +from sklearn.metrics import mean_squared_error + +X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49) + +gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42) +gbrt.fit(X_train, y_train) + +errors = [mean_squared_error(y_val, y_pred) + for y_pred in gbrt.staged_predict(X_val)] +bst_n_estimators = np.argmin(errors) + 1 + +gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators, random_state=42) +gbrt_best.fit(X_train, y_train) + +min_error = np.min(errors) +plt.figure(figsize=(11, 4)) + +plt.subplot(121) +plt.plot(errors, "b.-") +plt.plot([bst_n_estimators, bst_n_estimators], [0, min_error], "k--") +plt.plot([0, 120], [min_error, min_error], "k--") +plt.plot(bst_n_estimators, min_error, "ko") +plt.text(bst_n_estimators, min_error*1.2, "Minimum", ha="center", fontsize=14) +plt.axis([0, 120, 0, 0.01]) +plt.xlabel("Number of trees") +plt.title("Validation error", fontsize=14) + +plt.subplot(122) +plot_predictions([gbrt_best], X, y, axes=[-0.5, 0.5, -0.1, 0.8]) +plt.title("Best model (%d trees)" % bst_n_estimators, fontsize=14) + +save_fig("early_stopping_gbrt_plot") +plt.show() + + +gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True, random_state=42) + +min_val_error = float("inf") +error_going_up = 0 +for n_estimators in range(1, 120): + gbrt.n_estimators = n_estimators + gbrt.fit(X_train, y_train) + y_pred = gbrt.predict(X_val) + val_error = mean_squared_error(y_val, y_pred) + if val_error < min_val_error: + min_val_error = val_error + error_going_up = 0 + else: + error_going_up += 1 + if error_going_up == 5: + break # early stopping + + +print(gbrt.n_estimators) +print("Minimum validation MSE:", min_val_error) +\end{minted} + +% !split +\subsection*{XGBoost: Extreme Gradient Boosting} + + +\href{{https://github.com/dmlc/xgboost}}{XGBoost} or Extreme Gradient +Boosting, is an optimized distributed gradient boosting library +designed to be highly efficient, flexible and portable. It implements +machine learning algorithms under the Gradient Boosting +framework. XGBoost provides a parallel tree boosting that solve many +data science problems in a fast and accurate way. See the \href{{https://arxiv.org/abs/1603.02754}}{article by Chen and Guestrin}. + +The authors design and build a highly scalable end-to-end tree +boosting system. It has a theoretically justified weighted quantile +sketch for efficient proposal calculation. It introduces a novel sparsity-aware algorithm for parallel tree learning and an effective cache-aware block structure for out-of-core tree learning. + +It is now the algorithm which wins essentially all ML competitions!!! + +% !split +\subsection*{Regression Case} + +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +import matplotlib.pyplot as plt +import numpy as np +from sklearn.model_selection import train_test_split +import xgboost as xgb +from sklearn.preprocessing import StandardScaler +import scikitplot as skplt +from sklearn.metrics import mean_squared_error + +n = 100 +maxdegree = 6 + +# Make data set. +x = np.linspace(-3, 3, n).reshape(-1, 1) +y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape) + +error = np.zeros(maxdegree) +bias = np.zeros(maxdegree) +variance = np.zeros(maxdegree) +polydegree = np.zeros(maxdegree) +X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2) +scaler = StandardScaler() +scaler.fit(X_train) +X_train_scaled = scaler.transform(X_train) +X_test_scaled = scaler.transform(X_test) + +for degree in range(maxdegree): + model = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1, + max_depth = degree, alpha = 10, n_estimators = 10) + model.fit(X_train_scaled,y_train) + y_pred = model.predict(X_test_scaled) + polydegree[degree] = degree + error[degree] = np.mean( np.mean((y_test - y_pred)**2) ) + bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 ) + variance[degree] = np.mean( np.var(y_pred) ) + print('Max depth:', degree) + print('Error:', error[degree]) + print('Bias^2:', bias[degree]) + print('Var:', variance[degree]) + print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree])) + +plt.xlim(1,maxdegree-1) +plt.plot(polydegree, error, label='Error') +plt.plot(polydegree, bias, label='bias') +plt.plot(polydegree, variance, label='Variance') +plt.legend() +plt.show() + + +\end{minted} + + + +% !split +\subsection*{Xgboost on the Cancer Data} +\begin{minted}[fontsize=\fontsize{9pt}{9pt},linenos=false,mathescape,baselinestretch=1.0,fontfamily=tt,xleftmargin=7mm]{python} +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.preprocessing import LabelEncoder +from sklearn.model_selection import cross_validate +import scikitplot as skplt +import xgboost as xgb +# Load the data +cancer = load_breast_cancer() + +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) +#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) + +xg_clf = xgb.XGBClassifier() +xg_clf.fit(X_train_scaled,y_train) +xgb.plot_tree(xg_clf,num_trees=0) +plt.rcParams['figure.figsize'] = [50, 10] +plt.show() +xgb.plot_importance(xg_clf) +plt.rcParams['figure.figsize'] = [5, 5] +plt.show() +\end{minted} + +% ------------------- end of main content --------------- + +\end{document} + diff --git a/doc/src/DecisionTrees/_minted-DecisionTrees/default.pygstyle b/doc/src/DecisionTrees/_minted-DecisionTrees/default.pygstyle new file mode 100644 index 000000000..e69de29bb diff --git a/doc/src/DecisionTrees/ipynb-DecisionTrees-src.tar.gz b/doc/src/DecisionTrees/ipynb-DecisionTrees-src.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..0ff487d36292b6af24323c88adb0fa4b5eb3d383 GIT binary patch literal 294061 zcmV(?K-a$?iwFSK7sOov1Js;lR9s!N=W&7)f&_;^LPBs4*0=-+?(PI@B)A7la0%{# z;KAK3KyZR<9tth9J){Mb9U{j-@mFhVuqg#B|ci4Ix-s@ z+8UcWFxlCf!~H*gu&}Ujad1#QK67(%{_B~A?LU48{=&t=$<0c|%FfBj1-xKo;i6(; z<>X{xfumyie?5@@>EYz~$!|M7jm+sw@VFX#E!#jsHQ*Yp1;kFN?J zB(cy*(1Dj&(o$kdaB#?HaBv8ppP&Fo5>hp!fhTxJB}oyuk|DBf;1@Ad4QVquIXHUY z^%FSw;E!-fk8c5fNd9#~#7uZN#D5(Dj%6bJ`>)7nnTY>>jqv&LjbUxxl5lWBaMEJJ zDz5N*3&^hc(j+KLI4(HxnSQvR8=uXS6S~ymJ~=oD^{@*@CUnsy``n1+qKOxS{CN|~ zT(kL#BEHw;WI`Zzy99W+dmPx-Hb6^XFKQt?Lw+p;kFMa0fS(EXKfHX!h&z#^-P5i3 ze|p2eUS=ZkWDZjz{NGMRh44fy63)it*&CQY;Fcf&!{Kq)MjHDkz zT4^lDDNjw#Y_22lUZT@Bmfg!LoQ>GvUh`d~pG>wezS zS96FzxsR652w&Y<*JMw;YSSEc&*(K?>*ce%N$exzc6UiLcQWU8bHS*T_aU6)NrtZm;py?P@x-dNv<>wmni=oKGN%@_4UB((@o>W`FhufWyBBy#*k0je^$ow z9Fw}%YOK}^5>x!UX$f5el`;b6TFA6_fv z*s%;5Jw*>FY1Xa;Wj2_coZmvQU=}fPiTAlGC}6bt~TgbZ|!cc&^T;Hl?KNtdF(Ppi)7epPyHlZ{eU<$@fiSHxJsW)_C{VmVCFL*eU9a z)e~8x{XHnegD#uSPb`zb^lOg0G@8Y*!_FFwSciLJae4IzdjsTgfmy2m5I$e;ct=k+j6>sh zb-cQI9%|mJor&wPG4QoewJ2yb&W-r5z55;EeId~!+Hit3b^~+-{T5H*DJI=A*HMI6 z^h(Fe16|DL9M8dvO=!<@>xWJif4GM$)K6|OYO{C@%_|h}<-FaW$Ya*3vfR&`UGTWb zl=#V8CYwS*K(E?fve4-DO|!-5WnX;hmpU}Og2S{%=W8C@rqioqe9q4!NWru+@tFMyOhKYkC0A$LvB%W5Fb1EP1&4Yz zc$8Zq1G6^Ti8RWMkl9R!0?^m{Q6F+xUb{WCBg!UT@h!G^k)o(0@>W@e?rU=e_flhqdkgO(R(h*yLkWh(-tZ6j3QdgK&ix18^ z9ZxNH7N%k@*4jYe)zspr>kP^N{E!LNa@twm9?KKli6$rhRI1$y|DmzYpu6hLRxVbT zd@`G=u6D%3=`d)z)(1qdUKmjGQ=3$fD~Y||&_{V&=|_}+q%#3q9|U0_=dW90AqA#B zW$>qoB#fiF5A{85aiE?fs6Wd#%)jbU$DBl;Ewpc!u}g#L~gE{c3cn0d-Er`%vEV z9Z?ZTDxV7lc7(vV+c^nGSGjQy*3=lcNlo2=J9xV8D{rmE*BBnRlW*P{Uc*UzIM)~i z5)ENVD)o|)6a}6SvlS0*!eQhfVRHR4yQeuB?B;_KL;P;4F9u#?Z)TYuP=mZEWtU`gyX=BMs`SOV~8N? zqmy-+y2W~b2h)BOS2e&NjtiCJyWT;oxpjV+ zXxl_Nchr@;=3`|h&}-`rR$QK(d=Bj=wlQdaV{+l;cY9rKH)<3%igKpSVHH%8#<#pz z?>H;uLX`794$rjzo0^l_*vfZptz5OaZl4GWz98ELkG46|El4d6;4*^IvvO;QPcK z#h_M|%K1zJ!`IvE6T{npuRL}~22oRh8>C`0tx!W;Ip3Wao81k6uUcfd0L98zZj8Su z2#3(gsZm?xuszJ?GU2sl+-NnL3JJ(T!z^Z-kaPAO!hHqrRb#1y5p4WsVs~QSs(%29 z+cq|Iw3wh#UUP9J*`LokIi)qa9DeMP5uq63_&BMvpiCTg2^K&gE{h~)e}zuOWRlMu z8XitE(CYKx2NmcJA&{9+tag`McQ{^oDLUiJwFZ^14wkrYCcqteH<0&tfqn5sm<4UI z!EytY68he3b$_Es;K?GS)f4@w(qvS`rk8AyIbHDL-tmrd5m*lw5rmA%wS-!~=Em;A zXZ0#AfABJ0d)=IIjXUi^RhC>MJn(%II@fvRlo`WooW=meC zbJ&YSO~vfif~O|=j+C(VvLto(0wxG$#s?!0&Y3{SNdsr_7OcG{hkx`voKC;yFxgnnDI zpr!vlWm2xBZ)N(0ZuH7KBB!A}@~I;t6{$kk4(mskDXsQvTdWrTb(XASKtx#Xiz~Xi z*e89TP{BQJo;}zUufSMq3z3NHi&OEA?Z$e_xf4lb>hb9iMH7y**~v_$R82JnOJ8$v zk6Q(|OX7`(hlT%Dp-K=YaTKeu1ZU?Bu&9oXj@pW*N~yqDThbm&nX^hw8j5kI^MnA~ z{S?6UO-oCgm9vf3@lr3*Q1t2#yQs5Y?NAQAq!_P0gPt9pZZhW&-l1aW<8oJ=F13pi zI7pi1?}GV|#<|@1zDo`-MwJPlm<3+2AXi&Ws8lYVTVay2O+)Os9r#^Jbll4gd}O33 z(DF=Dt58Yk_l8b4L5p9?#=RwphSU7G@=H7DrJv_sV-Ok%J$QHL6>#I89f?5U3uIz0 zeBsI6s@$%d?B|XY|N51ApKnpZ?H;h zzh*kB>T>zOobxuz^=!OJQ+aJ5S`-p!uZ@}XU~2(}yBhlJ%srb3Nkm^Y?<-*&S6?b86`r?6aNDYysYz*5I_04+#j^IZn%ALYty(ZFW6gDd<#6z}zwaZG>nO)Oul;m%Pm3 zrl2705w+s55k}3NiRD&Da}H~uiKTGHTPcUlro%8{{4;Kp#s*#~e?Bc@p~uC+uRshU z)#5X@A2J2|Hghid?P~8pqEO625={+Nd6%lI+k@F9pAFfhGX_dXc2AgUWtnODL=VnE z!OS(E^T9Zw#5o`C-fEYRi|t~AX>WYe37eIGM~!t^%~1Y{3_de9V^;)pAcb8!bT9*b zd+Y~$>N7l2kO!mHJ|lwkLZcIV)lcoIl97(t{0roX-12NmVGOSTl{d;+YH9A4?GWnD zAS=WJ9L&7VJuU1o~McgcFI&RNI4;+WcW~gyIO@4yb7e8vm=m9E(r zb@5-G@kQ`%cKue4iekS15m%&U+&}q~eqO%z-~;`)NIyg%1g(_@hb6h%IuHQgkL+j9 zkY+fD%i;q+tq%tA)!GUz^4g`h!cB73(0h(X(@2ii$XQ`h@^(Sw4KS!sKOGYerWC?^ z5L>i*Trxo~C^HXAo6x9Q{he**EJB}v+xOl%Qe#Xz+i&Hf+?hT#klyG0)RjMKJnkI6 zGchjUytAOaP&=qylYc{dDJSocp;oF{*m ztsy^m=vf0lC6$7aX^RMKW4b6mLW$nyqS(Fk_RJDNo)9YXl!@_MAdpGO)bkJOHA>K3 zmzIiCeH&kpH0!=aDzMRvzqP#eMM5qmOJ&BP&~vux;{=1(J7%AI&k@1_@%~AhDg|z| zD!-%T!m#5EK)PfZuI5H5@V!yWX)7ikQ+1_!Q`zQLVku+%(_30;^Q=HQN;E~435Sf9 zxK_O8-0OOB^|t8q{cZHBVzomILSsBx!a1VJh=6&z=hfLVc|4ptR#$U&N0R$TcLoFBIGD)oBdAuYi{VB}O{+Xe!kNj4kD0Upa_dt$ z7ZTCldX8r+9i#Jbu;8&Z*&IBZKzvhaKBR!-Lu(AVM+{PsJeixRaeG!cQ5-mbeNuFS zXC}Q9#bG>)?|F43EZ{r3dSMlc-kD`ZwJfEod(Q(bpY|P2_1jyzmXN4gJZ;qqqOFI{Q=Kea%EYD!Bar6<&X{9q9HY%#__Ru zoRq-5<$iyAyI_G&eR|pi`$C&wAUw8b>Ni{b`T_=NUS)d#?%hvJV{dj>;CAr4Qr zYXTH@uY!H+6)qRlzGi-O|u7s{<}@M_j`#052+--o5wxlL-rI3!9%>mwy%$ zE(tg_z&+ayCgHE9#0FzND}^5&}F-Hk>YiF;uWMKLIbzpmg=xw$&l8)qMTqiJrKmE}@7h|~C-RHowk@LtLy-LRRKd-Y)7s+FdQ7Ub4-O)%5}03j-(Jy!oOZ^8f;mcD4yfc0=C?*#(w4~_7Y#7I99tUqNdL=h zuBZ*tA1*o?Wnitr;7Mhyp8aN!bk6XK`;;#R^s4j8-_2?k!fLg69|W57K$} zKWo>5i}phkn6kAmDe4?AnRs3HG6UP(B60_{m+o#ZT`vy=uqoett_4G&{W-(vmxptg zXu}yGb*I?`216bb<5*1_{Rt!JO~P8cm@y-R{Hd9oVu>{|rMO93%eQ6$=Y!dBuKn50 z_HsV99QjBfa27h$f*U(J#}ENH5vnGsW-*zzb9HsS%I{2del7}0J$Q8^@?TeSOSI(M z^1w9k14d~fA#CtwU$6HkXjFV6M!_NT-B!*sm>B8Z0VSTmR=8Z`#0Q5MkAGrp4os0-KCKe~~5Xh!-y=Pea%~kn(TBPU;EE+6SrE71%KI^W=>|341blq2VXWT7SY@^EzgN zzJ#7HirH8eOlUDmdEe1GS`ThSL0+WMq- z3?{?(qQtj;$ReJFJqC|f%AoFDg`Ks*8{7H1piXF83pI@|79Ss9FJ0Xm@e};Qtvgg4 zg~D&mv+>;Uw5jsg`&jUhkF#e8A9Zt%jN%7L9Z9iL${r`YMg$;hKn1kC!=P+$Hu z7-zeJp12#faklL}PzG|oty|uxOMPcGja?9~S-DB2sD$AI3Jf7UbtL|pK*{H9E#*ok zupK(T(R<+1z7T}9(^;PKm;f&nOe+34p^a3LL2pV=z^vba;RQXDF2%;76jTCZ=`_1z znf9x9l`J%3^_ZZv@(V?Ye;#B_+C7{hJ0!Rf`Qp;2y>)u=p-3;u~&jPnR`?y)arHt0ZlO|JRswb-<0;S6>utfCTU2Xpe( z6W!esap0*enm>6m!PHs<50gK&p!vq#1DZT;JNN*fWS{UkTSS5;f2tdPA|ofWI~t)r z-<}vlBWBA9?oVRh8Y#fIIGhRGWY#m7{t|5|@c=&Gf#xUh!In0@yhb1!iG1x6vJVrp zp4h{qDZZd|l)=k2+b@i>SSTUi;kGUoIqVf`=!%F0NO-5jzBRmdJ+r0MhjgT1!0!T`GTAhNTccrBwzeG1eXD2a$N~`4)8k=cf&c)z<KlONCE0U5D5qcijHAgAnOr}+3>#y7sxjdM{ zov+x49Ya^!2H5M-*|zdyCb`_WCrEUP>D9b8S2)Zpu%X)pd7Cut?yP^1>R!xn4x=5|`t9q$k0rZu85_%8Chv#h8JQdTX!E%$|CwmWpRcigd3N zg>_!axImPCGml*32U`nm$9KKCU?kz5=;*Xy@9PO8`C4bcTG;LdEFRB0D8XYvpkRz? zYhet{$!e+_P@t?n?INl-!8m%BRE@g95oJ}f;r#WE#v8>my>Z+iqwcV;TtBs!m$F1H z;q(D%vP)<-nC>r^!ksOX7tx!*jRQT~jT8?}xcc}L^Nf$jS(2oP!*1u`i_ENl;EP`} z9b;q4ar-0n7?0JIuClDxx_uO@bh2HA6IQq5G{kH?lp{TmXH^4eT3Z<&mxsoGx{d`y zXy1RsRi={{i6EQ7x&}Zje?O7cSg1y3X3luCWWi#rq{g;%5^MFY&EAuB$*!q@=4Kb1O;CS zRxjAkm>X4eUlbLmV}#m&BGauY;A?fem(1RLiz<1m`*||gbDtRnHA1b0+f5Xcp;XO5 zJD;;FR&>9;p(mv1oTg|}o0`*#^$%kX(s22C?!m`15L{e@WiRK0;J6S8qgrT%? zH-{3Nc!vA#iv(1}laaR8Z=6`AAe z{KHMjXG)w~N~Q5~_5pq>gn&Nt{rdaoY!*~XKi>bK*Qhokj%U<|-$cf+)7Hkk02sfl zmU%n-#OPN@p%-y+ZCRPn`g;Pb9_3uwER_25uut263fetq5>8CtC#Y3I&sR^ph&`hmV<;lF-;x;Yj~(gNUC*ta*z zBp2b_CN<56w95`8Rv5GI^U1ao>=P+hEBQcL|I_Ijc*)N$wjVylpkBIkxX1G+g??4hn?KW)_$TTrrW{#vtapY3F5_J0BBa5Mrck}eEMJ@f!;8WUHfM%riR54-SlU$nt{Dc3)>R@@zV21x7~iIPcFq3)4bma@ZWwJy)Qz9H;CD-#J~eRG1HMtRh+M zhFP|X9j_GXR?rx_(qevaw+VXiN5x^8aubA}Z-+;a&#nTpC10(QFn2I<*<489>==iH zZCvsW8u8PHur8H9>#*=p=bhvCQb2>_A6ca+Id{Gxy_jA{Zx&fG7TPwOvS|v6D!p{kr@hEHYV-!4>7dgJ`68jh(2rp5ML@ywH2dQY zw}B*1cAb)kw?uK`dXyk<1mfqBjjfeFYqFPq)Z-^WQOj+pOxQqo;ljD0Ru&_$B}ssonB_;95PAR?sYSXI8!mxetAwy76CwbubFus;RRNH z`VkP!p4u)p{Yd)3Szm)Zl?_0EN%b@Kz>|~tcFJXF}HkIxXz~BZ8k_jB|_aSh3 zO-+#JtxU_Qa*oupe!0QsZ&^>TTrUH<-^EwOnw2OTVuTPz^%`s6p3YOD?_yuaJEM=R zJ4^Mnz5DMOKi?LepLoK2)!5Uk@`||as$j;ffAl)ZiV2}C#lDiZeDTwe{hvKhLnE8u zfAmH@RS_a=Z}z+n;d;ABc)Z$!bF3$ubmmdE%kR9$(GO?`h zzw8d?uUVQ39}+AV3ptayz+dnEQ3?=REBjt`n^UWUWFi0K+H)YJyPj!7;IiE!dju6@3xqjp3~mR9wQmaXk^#FsMoJwYJu z?`mo8k2w;2dX*8oW?wD}0r!CBn~Ng9+Z1l_%4$!fV2ECWCvhZ&K=&6zQLnY0Fyd#| zCmVs7-$?WJ`J7kAx5q5)At_TOnQr}RM`yP^by9WKrOHm_S*iV0p?1oZO$h=554Cv6S{bt@-fDN4#NKo{*1D-E zN}+bOP4F*_4I1ql>z(Q18ArRbY1Z3vv+7xp&ppCp#Il+y?c|anJlk5tssCIQN0_`wp@p9dJQJenxMARy^-`GYZvOhzPOl6O5Fp33#k*;Iy|H}Uyj9@M zP1gdYi>S!-5}o=GKmT9@zf=CT;SBlVjenp|hnO$5OGiKw5zGQ&5rcdx~D1s zVQR@UtZ$IW$z-Uv@oreMJB*l`+GvNzrT_$Mgv&-O;i0d=ODWmI!Goketc{B!u?;&4u~-C$1& zlyfIX%FXqy#c@-TCoPfHNC;*8<&X0Bh;E6aA{Y?Ii}`ntxidDI#f3Y@Von@^-<@Hu z$1BT07q~P$1rZz08{^V@^EDHYm4D~)s<{zpQ-=X(y9_+?_AU=0qb1 znZ412l!M;frgs+XHZlCoCU77u-+-B;gObR9{Ns)g7sm_F9?7z?F!*1&%U-25It#D- z<{mpSRd@&Bu^N+h$U(#ci^US$H%4WY6fW@f_Nz#85d7$OasU3`t6K|2bX>*Sp@6zK z9MUldISII(AdMPzV;?!{rYt|Ozi~g?D!iMid~kJKin)jqUVIfLe67Z)ZBc%5Sg=E{ zQu5tw@o=UQXP@_zSpTGrig!usyYh!NVSX>D%KqVW{WBoWo*W;on9r^@7Vna)r}8>! z1uob-x^yO%uU1u~g#h&N03wTa}R4paonszE~DR5dtO&&`kd>jqOMFORqdy=@^6SKfaZVd21r>Jw}Gbo1jn-nIbJ?}m$zY^{H{k`t3T1f|h4&!+$GY(SVG~y&S)6Yd4 zxO5-LOva54gT*ZWW)4-HPJ+aUf^F$B6{eWduo4n;sv9li=-Wf)z&vj-xp_oEnB{J7 z{$>+CAdrpV(7Ect7C~;2O`KZ>EU|}aaR^8_tus;fO(m`((i&MTyX+=%0D9=)(#EdV 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

    x`(*7{pvA}h?Mc~oh1{O$;=o=4j` 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ʞ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ËFKSn6I$z?xshpRDJ zI(gkJ76*owOD?yhJrXyiXhH$4wqU8uT2qR;ZK#7rPm&H)Ygesc zwh6xI_ZT!1(Zx1*a^lk=EO|aNq;dP$4lgV`E(mA5PoF(U+&CUT#==K%TTD58{FGEC zlYhTmPr)ZCb`Fpmf5Wz&=q;Sha$$fU6)igTl+;30;!m5m2t&qBMh)Qvx3XwAf>>yK zAgE)=51%?kGNenB5~QywQKTSf9Y~rUYhtZ!({kJ$z&81xj%!I>G-vU0jF>oGw%1!& z(>E0g{<0;CniiGkrVfG`$%PRvup|_gIm_3qcP|%FSn*X7T>qD@UPt?018{VQ3;x}I zSdRUVM)lmOmRff11*gP`Kz{zl!k>Xrrp{d`eGV8E_+zKd2K^4?%AOgV?~7Ni38%cj zJ}SIQH`Z?qd*@m-=C>5471@vh{ji{_=NC0gWo!}8t)VW>Ga{Y1&w3?3$?H{J+)CPf z#Z|fGb7)y-@v-t91B7FB-cyE_P3EcidEpqn`HE|(oGBJ2RY{5MS6`v=vMX58Fuip8 z<*9%lBKjANg9d{K3O?8t;$GnPoAqsVdR~L)yz+V=AM&2vyKtnvo5IJp*N9)r`Q$h0 zle}K_$)10|#=f`88yESe?~`;HR2unJY<0g^{fHMkCW_?Ailr{wkxB5|)AD?@aPqo( z%O2D!C+Pj+#FANW-F+yz>ldxrg2SgSfR1(PFxRINLEO(CK7B47x2AGVVzq5rhm${_ z6gTrm^g_W}tJqiAvUDw`x3chV6SjmdqOzLO_|iA zfr#p_SL0Us)RBDlbPC*|aSiM_dK&XqZa}-i6VQFsbcs{PCNjv_imitehzd|Xoi^3@3 z!-d7LE-j2vICSbfQaB}&@$Wx;l32AHI02jHkHh0<;(KP=Lb>a(N~t0q%9)U#7} zJ>;dQ!kPT%q;w${I<2Hh-BPPoEy=%5>YI`!OG=A+DqP9e?v?O&Nh%&L4A8M^)TmK0 zWXKStNs~tI2%yFJ)2C1IfA+2dAd2mKpWl1NQ%pcCBqUT+MC?}Vcy>R#ySqD{T|B!x zpWWTvVj&)4IO?_QN!$1ykb(>&F!KEQ^Tm0_wShJU4<0PQebD^qlA=Y6MoI?%J}8n9To?3B zh{*s8eaX^)$&w|4RtcUOxE|`%sU!Lf${#3%Fn-|fmxAL)+JTV?#@q)+Hbvni0tSnN zR~_InV%{ORDBi08ZV{xk41@iUKXchJ6>cz1X1ruz1!sE9hA=D6Jr+Fs677t9C%`&Z zF&+SmYXHQs?0?QwJ}@4H0Q3b;0wn@?)#VaZU3uB4)}!iob>{m=U|IwN2K~^E8_ziC zE@LS*-9^)e`We-}weu0*aLk?uG?qbjj3JCkNAorh4GrNy!{DmldGi^KX3vJ)8B>b! zQQ=5Q4d!X@2k{9e)Ntq61}?PaYM8)fU;z)q%Vx~a--u%xlw(RCT>_&?ZGnY60wts0 z%~(0Jl$8ZwsF1D=oWoJOA5dG4w^p3vE>y{BOUwD%z&Z?Pk>|?T4)%}h>Q2~48WeDk z_H_2nK9EHn@G%L1LTJg^`H7CAw9ZCmO zscb1h*Mgw3_<@24;J8HD(x6r~nmK=|m_#l2ohDTi%Y2@>8HCP6ExYs)-1%*qHl(XJ z{n%?@miVDiO{V+k->riH@XuVhOv~nQ@GkzCMcT$~yQp*jp@PRA{g}UeHF=e)OdlWJ zre2-eQjNdb2y1j}rq+Q%0>C@^FCBxl#C{Cz8~OSKv^W6DNA&MOTXycH`E0encJnsD zf3L5Ou5<*@g(pPw&b>6U)3Xu;fIc|+p*XR2$s_U+ycTf}Bsp;OB;{g-j4?8O+;HLb z(7Jm+HBTpwzjJHVhj>)^#_Yq~G6;6&Y@L*ql2+z66{$YFXC@qYC_r#L8^F!K<=S(; zmmS211oFl(h>m-?%SKkDl*~*EPKWYG#V7IHm|Vj}C^((v%m4rkN{+n%J`1#O^tetpk{r>h$>c0p)+}4X94a5JO*EWlU}1l z9zg&8?f+uxmo+qS(p*;FCs(&)Xn#^(g%SnX%6&WKui1v)T-i&8_U+T88v%@-*sr4i zmwiX|p^^QBLXy zmWK8%FDGBe*p?~mEq+g)y<{qzU9@<^PO4S0Bz0?U-m_XhKY|B9BMvG&Z2Cg+LmvRZ zFP=D1&5eKX^hKsca#nZm*!insy^xn_3ceIp$!PiHAv9vfV)CliLbL(y{zW{-SsgN| z+yB)oef#z$@aT_VAQ(SbLoZ#rR9L$MGzT|3fL=*DcI+tVZLlrw37(Vd63o?Cty(2` z*r6zZb+eC;56zxEo9Px)09-+%z6dMzF=NJveF5wTzz#sVbm`Iru5t*h^kJdjw5e)N zhqNqNvIr_31kja&zXI?DD6CJwTfcSdR+=$mhEV1M{FbcbjX6fCUHP?yG-+E}f+ru! z4k$7Z5Eq^fEn2jo=FOW6z#3i#;Op0xsE$e3I7|DK+Jd*jv}w~sU}6C05b)Xqn1@K^ zrKL#J^9LRSI2TaBfLkAmfz_*5i>00_I+GDN8RriQ2E5tiSeXaRjK09W7^dD+_!z-wN%_=dou zd?a(4k7jTdmiG`~DwArti*@mAmA!5-kMGTfk`vkZ5tstRo9EaaimMcnpnX|!{xSK? zyg)&tRNum)5dVp)u534=3IK8GJtnmwEu-pp7q&?E<2irpRX3$70$gqwP79>nPhI;~ zSJbhBalt=GW@cfSQ8zpF-g1X3`KquB7(6a$>>=_2h<9A;N3|EIp5d8+BQemA^I<4Y zRMznabT&;GfXD9&dmSu47fSO^1k=U-MRb(bpHwl2Eh}XlXy(y}H21_Kp^O<-)s^54 z00F)Aex_CWGu)eFe04Vw+_w3O8zNs|L9Ozrv7lZ)jtuhqll!QXA|HW;hgEhF>jE2U z;KA6?E&7W+Iv~J?7BTerl^Z(?s#ZG8wf!Fm_RNAa7Y&bFA9bKfqQpyeo<+2k|7(H`XzQjL)-GeG4lG- z`hRSZ4s9$r=H1!NNa~A}Z|oA(Kabyj71~Q(eKNKkc{%hA+<0;>Jb8Xp>lkmiRY?j8 zL*?Nq0V@C~Q}ANLWWrea@a2a(fH5?`czH!7;0T;{BMBWlb0Mmt2J>OHk)17fLT{Zj zSk9D8OcMR>a)8|bevpT|t5H_Duv7J6o1 z%RGF@K*C@#7Z6AenKKE%U%QUJZR`i!m+(Y@VBMel<-(vltZ0mp=cblXy!Yk`Vkf|(0fCR@aSEh%qso`c$(Ig!iqfUaSM<7Y%gY*CZ{55pxxP3_ z%?oBQR4iI~eYg43`peI#S%LH%km);ZX`G$>!aj(6ee^trrX1QIREy4p(wKcg_t5WQD(`VmBc8u?YN{g)PJ(u!;xRu3gTUUB2Ocd}m4vSiM7{+P9%L z(UzF&gwKJ%7yt70TQ#MQp}OYoTWTBqhqr>n&o8B0Vj0TT@1`HS#uNSrw8Ioy_g$7sv(YqVk0W^;Bcz+=#x0BDX%K-B_{aA#-dNJU{? zj$o;^i@>O`*hdi4s04sH6cO;Y1As2g zyS3}JZQGWvU%yVLPoE|L$N-69HLoq^9HYFgHyl$;%-?Ooy>R&WU@c#$P$B-Ni2Us! zuWRfv$?IsZWB)i#Q06!}IjMns?Q*7Wqi@lrtwEm~ZBN&JKjMux$Mbm6tD}G1Vt{vE|F6(pc&%Bc_hs2?8Y`d^jmj`i`*V6?S zOZnJWdOKTbQ!KHqou*Mh&xZDX0ODtJ&8nxg?&Rq1TizPH6k;r+C)-lakk5cy3tF+2O2OdsSnY&(}fXBX% zkE$%xe21A1Eh?FN@-dBOfL@ot<@0D)P0;-TdlaQfmPlhl4N4FQf<9>r_`maH)_h*! zI6%D<6XI>3f|eaHUumeESEBfMUO~<9^5rWA^POVi@>92|+`sCfi1rHT1V1p){QUWI zy+J*VZ5-gS1s?a2b_b9#TULii=~4oeM{=>VQ7Q4|X~wRDyIn3(?OR?}dtJLNC>Tsp zGMKY(sV`_FNs_2R4yn8;OHdw3v`41Yi*8vdwt%tq#eA5rNpnSYT^l!#0q?rRy{^4q z2L}hjFFJznIDM2U2x1G6R}z4|#(?=K4{%xH=9lUlTB09@0Ah2FQNCYor3I|rC60V~ zIbG|f9+R#%uzy|jH@eE2k``SsANxR`pwKW@j2$my+q3BXWb96jEQeTj1=ynBSU~{U z5=_0KOVE}fF;v%3JzaTG^&2q^^~Euas-L>{XDCg0K7veJZWS z!x8xHf4_x0EycrwQx55;jR4P)HNd;*?ieptT$73@BM=)#07^Jqljcfj*i*`o($(B% zBGvbQ{+T^bh)QsL4M|Ee)t4bazld{$auh+dbph;BThg+udm2iYBC)iov4rKnwtQx5 z6<7$#Me-8TWi|BWJ9{s&SCL#$URPOpndq)(U@NF6PoG7%y1JfnUPMUSnqNUm~a(A(^7?cL4dKJXV15r8^?GaEt-_4)Ti*};j3#Fnm0&!~uRQQg9%f!@K zQvmrcNat~nO^zjCPHRs}j8T|r~y{rb#qNq5-&2vNSHqWzKAQ`Suz0hI<<6Oc2l z1y$*ou+WcAKVqT|0=2^G-ab=CgUx?tm+Tw2?@$gmSLWL^-`m9C&Xi1pBVZ{D{TFZE z8Rbf8uroR`-?G~+Bt_DQ$(D_k;pqXW%_K1vyu$MnKVu~wduM_E2QIMEbN3Z*Ct{FZ z9wS9+59Nbje~~uD66MY1^4Dlkwvmi2K3~3hFH4Eus&Zb5;^TS!^5qLF%3|IkNx6Tc zci(B(!gKo5r%&3+CU3`-g}%uhiQx*LzkH>e_W~$8dkt7c;elsL*%2f zP-CuOVm#~EBih9Q8(%SX1R~21tK>|&xXQ3E#0Hpl_#qwVz_o~~j%e&XnHodlb~}9U zm56M9E#y7(N?UQj+)Nx8*jjWGJa?;@>v=mzhYw>uf7ETl0ebcErkQ(e=F|r;XbDSZ z)%6$`ugIuJ55ajWlqpHm#tt)B_}+s+DpIi)9p1K%iWkanu&gnexMnBJ_=o=GAh$1G zy`sYTz3J}}1NHLOA3Xq&KySZ!hDJ@ENjLoNh?oNv%a*1NE&dW*_h@V8{3Wzx^#)<# zTp({A>fWv;l`CDGuHU*t?R!N8ww3n{R5&vyjFczEiFHd|*C`n^!KBF2VjoUbb}s0h z;EY83S00%URBQJW{PzPQOGeUk%>7jQ@^%AE;%OD?v5a9ocF zg@V)|%3po_or*ceh@Oj#=Dl_)-*SGD1s&p`vuRSLpg(; zx8orFvuX?7x*y0~_^GLSx#BdUTPsRtf#GYL0YPvUo;FqWw-b4-4j7t zj~_oy#fuj=xKC5c8f+*$6Wsa;JPVF@@cP%RSyS*;NA*ktCw>0>`Kfg2(zIZ~0`;!` z{r6uHi1^5nBUGY92@zDdPMtdH{Dit$uyjzDcFstZ8&L!yd>1FFsP` ze=gCMwq8_-gSDC~;#-u1$?m@STzDDhXF44OfYpn|Fqi+d!$EZH{wqq&bfA?uAZ^bw zj%qAM>d%N>{`BI*SDIBXhm=IuLf+AUZTHmM(#poxdDI3=Qd)dmTIxGEK8}qgj!6OZ zEisBp8-gD?25_brA6eh}*#tly)sCDPY}(q^Qw?@SRX(cx=|_SY&<|!1KdT7h2(Z59 zf@^f7TfRsZxCoNcX0;!EWloIIRkQL-;u{Uy^?+V~`o`NXbe#b#Ww6;YqD(akuX0ze|QS1kncM{$Rh=P8EUq*+!dg}zmqUw80<^!z63)Wmg8~7I= zW!3zd`~e$5ccSkYU7a22*p3a9+asI4A||DeojRKVeP5b1axgjCXQnYzW>Tp?>(lk) z`yvJW4Gwusl^e9+V8D53>gb{LmV=}99y*4u-Snf?-2WN#mQdf}W2tAy)~swOK$~{# zrdrM0(ZMZi*z+I*HK_HcM&Cl8Jf$hV3#f9rG8*Y|Wy4a}H6}zcAqa>CkbK^$$7IWt zI7t{RAGSNt;=9Vvip$=m?RB=BHhJXfNQG=^`T6`ijo1@NlWSz9pqF20{gr3brm)I8 z1%WI_?+v0hMKV(Htf{H4S326|_mal#52B{5v|M)X2?xaeMrGV0sDyOx+>As^oD)m5 zq3aNo^Qvo9j7y8Db7I`yO)I6GXVb>ZP-%cH=8Bkq#Lwx6#?ZJpWTwNbW>QYKtQzUM zHcTn2tG+z#%h#{eu={ZO^7R`{8PtWIzj{M`#?Pi#?7=pfx3vX8{TSb6)TmlH8q%dG z?L2gfTJ#%B2q;^tLP^?x;yktNKaNTl%1d*{^yR?A!8CH_63WbRi@LR_r`=qf+g4qV z=3kJOYA4POpa~szb#Fn9FCdC?1HyDprEOj4< zcH+^vm~$xqH1H4rc~osU*(9TF?Y$U_F^#`nU%S&8dzpDOh=wzW503t+4A$3}e}#^A zFQ5~PY0ZjO}N@?FWL*G*f zD+KzMb&`_A65m@1K`iwhoDjw;I>#9K3pzTjD0LG22;d{gj5w_^Hhy@(PGE3n-|ZKa zkt4V_@J>%#u05l{6`Vw{*M$sVdD*9=7KJiW$91=iLIK)i z$j#6XwB}+M4Puaf$(hI8*F-d>mYc{c<(igu@=IkogINIdH(hy3B{{8eewCH#S5^>o z+jN)iKK)2JGg{`QD0XatKe&c0@jXq^4qs>G-T{#+P?PyWoBBP77gptn$6p2 z{LuaaoS(^HcmW2=JGN{>joWpj;)M&)rK>mSz|j+IS(b(d^yozOYE%`L??c8-rWxag zQ?4B5gZh(a&leW<*e@g%)BcpH-hg)QKSXu@tgLbN4;?>6KYsk69cz}T>3%lv*dwg< zQE=t@%~T+-CtLUr67|ZJDo$H>?I+(w%W3JHDb&4vD|LI{zkjC^RqN89mCDi3KHb#m zacRX;9Qqc}b?F>71UUMqo;&s0a-Z6*yUWx&zf)BYYYvqAOk+}O2Ig;vgeam=9qiVS>l{nq77XqRynV_M#Z?am^vrM?cKCe%6T?zybP5F$YQRj zIF`+AC3e*R_U$_jo4$~C9zIQ(GuTqIT9s(sjzcu2cUwxq9%I9%FQTb~yE3TnOig=_ zrebWVfBDv3I&|tHS*J-w{o4ISbt;vnu;(u|%9?X@N6ucROE>QdWkMmZoT8~~x9`)^ z&AVw-&o-1inJRF)w2ytq&r$he1q4`+w4&a*X!({sbc^YN0O%h$b%C6-WTah-Cref6 z@R`fBVBPk30qBeQumwC%RM)lkn_fL+31$Uz^g)9L36R^~-kw^vY)PwEucnC;CsK+O zDMa3^S+hjY+=dMs3hVZZ7cbKO{rkzr#zy4VuV0^@Jb9u~)|>%6bm$OWxNt!z6N(fm zBAU8#S}-f{P}e5+&MuJB+p;5Vg)5jmQ2)5lqiv~-e0(IA#L5d zHNgY=mb#zNj;?vK{5-^$bzm{$_XW^CKgMF%Be-F{47B;`QyNmynX#A@wBXbu$_p%} zaAxYT_Li`|hebOq;eo|;EA7Boj2%6D_f@nr_D?s9U@>!!KV&Q>lh`lD8Wha67F=O0 z<^^Lh=`@D_r2i|nvVSiW3i%yW-T?sVS6>LFffbzTKb|}Mb3)~T{D+K^RB8lF55QcS z@ct5_SPI`sh+}8WF)M(+F{7lEiE;$+5u_EnFv>bVqrjl;{wi>OM&0AgT4xA&`m2#9pdaw!Gh595kG%P1Cy9$~GWx{4{tsV$ zCVzfOXuF=Fz1z$)2LYJBosVnxt>+>N`XW{U*fQ6&M+U?Ej?%t<<`UPCp|Lc!FRJS? z=DCZF?T;ztx(*ml%hqlZ;Q8~Huc&3$K4MJzc4;S?IeYQ4;Lyj$)f=~H!`7XGQl~xB z*?`8TX~&*ag)Q0NfA~npPMxLKZ{O+My`gc|zGe}$^TWrFRHAS}bz5%EPGTLL{@Q?k zwF+hF#>ssG%*TF?pE*yU;OX4DnW*!MU3@{=Bgr4^)^26R*X%uiDM`JY!N+u+X?xZ$ z_Eo3FwG~To=xaSnEH(@XB>RS~Ojb6{LCF*U&hDST391?Z`mp{5z#lSF^^u63%Ga^o zsd#4b!+MVNR*~|N9$hKGO3WMm3(zfoo@GpxgoElPQ8$HWqIO^Um35#FOgVO+t@k~+ zFS;hy>IN*ZVu^ENi8gc{igI3cjf!z;mO3YvYR6EomGf+9bWF?Be)pMHTU9zfap?CL zGlN$AyO-KEs7}vczo9k*CyMzkhbaSp87Q!$th0Z6{>`ZFrT7)diOzu;sDbzbksSd0yQ;CNc61Kx=56hms( zrTh;(ir;k7~9Fqd*TVfQIHrP7t!!$QTkxTIGd)CuB{zg6ds4Ra)F+^@ z8ND}9XSQp)WOS5ibmRgpEyRXFbx8nHS+O-LT)4CaFOf9N)h6-fBOh*O5Cn__;GZXR z1lW&s9Ou4gAF)cEOV|rdc$+o1#WwzosO)SJOL%pI7Fw~C1{WXYxF+M8ggt#uOV@0q z!M(butp82Z0*QkL~%UTpzO|F}GsVPRpkWXTc%bPpRgOdJY;^ARIP=sm1l zxpE2M9_OKO;lfn5Y+1T>>lRa0YI>5$8vvLNx*J`BfV-$K7XbR!*47&L1SowVP&#PK zM>f!D(4YaeZ{MCumMp2AEr9!?MT^pe2@}K*1rQSeT>1%JEOj4<`!WFxCa{>bm!1f& z`CdLw;)ns9PdOB%_vi%{(d?3SE49Aez{Xl1%u56fetVaQj zJX5h4luyIn0&*-yGRAz#u@IvY)Q6$~22)T>%sBFpwzJ}5UzdCdf zKtG|Lc?%!+fB*MitYa*PHk7@*sDw*|_O+yI8iRm-A-2w!9@bfyPYv>lEmt$7)c-M3 zmU+_TR-^Kvm8}2eY2d_%eAfbk67kbc4)RNNKC>mhcG=(YWMr{ssvWfV9S15CP@FAh;?_;^)7+uAgM(qux`pa(7 z@4O#x`xG>*j+^Cn5D#0zxxhIwSCsQ=?g(18zNOBqWqW0~HRb*_JU+(c;^}IM`#HW? z=-&%`#PgB=$frnzQA*jO`3(a40Ls<#k<97Eu)lo$mNKQ+J>NiqifqAeXPZ{%DN4n2 z2yOZF`3ui^BhN)p4gqcT3HCEGtWu>4rBAQAf8^;{PpxJ6g0xScK8b!|T@p~`Kx}Oz-+SGUC($yyhu^9F;)|SuVSj-Pouo(7cmP-T{6Jek!&zG;)^t2-wc~;4( zqVidO_OS?(yN;C|EtzU4zKf;so%lXZ(LFu|(2wrODfKi)AU0a)OY}G?*z#Qx8`iEG z5^y$45{{Wmn|haSY}JpSu_A%?pvx)Ztor!C3k7`8+3X^JyrknGm9WJB$Qs?`;r)BX z+F&REpyft>@M{&|D)j;R*|{z7 zFL87Fg^%*MXrcc$oE|5oRSNatr?ZK$idQGfR+1-=u=0^U8f4izS97?#5`M;t1lk8a z45m^=RW7}7zkU7YEx|)TTP|L`F0A14dwEj*n$^S)ytWf&{6l{1J>cz`i!L4BNgKB9 zV%Ow1RH|4Z8aH(g_sK=w6h4|}Em%s`E0rf}jtvl(1=qACfFcWE$9jhmJoB4d)wp_w_T|vcx&DL>u~!SvjxzM#gZuCC-WJJ!IMY zNMEmG;ylAG{26-<=8T2(eEP=0oODZ^bL=1QVN11T&heOA_szTaqKOnthbM`xwSK@H zWuTas#Mt>rb{9v&&seduNh<>3eqb6OE9UWsKxqI219%X~1@n|cr!P?sS0}R1kd9i_ zt4b~FR-rsqThPA@>PvwB%%vM>z@)iUxm01AJg_r!>c?G=K>6`wT|9@vjXt#VOxd!~u{?9k28>c*i})XjE(p^1S%Cj?-xD^DjOge@q{f0_ex| z2q%#CW21#WB9=qWJ$x$y;9~s>2U)SSASmsG13@~Q1=szq4qh60pu<71##_wUFUc9^ z=Z9oZA2IQh@^XZKOoQVeeA19J%pr%i6LWNQa8_UCKrMI?L0gRFxuCZq;4XNvA@Y|e z`17HxFvdkpRQ`#7V8m<*3X8aEq3>X?Qm~vncR>We#n7L>bj{*tU=9bL9Xf7`&UUl8 zI@9UB|7zs9IXkg?a8kN@*cE3m#*KS7LDtv%b&h*nSw(e)11FYsng=>ilr>{V~UzZKCbeKv^?G1^+#{M zP?h=DX=6(dD#F$`u|W_QrNjDrbhf8=w7B+Rt7D1hm2zG!b2a#$2%(*~UTQR!FG~s< z#T0XOF+kex6wJ{$0!QhZdX;rRyBSBDToLJ%RLsKdNWecGKt*;s})Wy-K~y z*i&`(K8%has2$Fkxe{M2^c^y(EQC*8x1(-j!cRT9Ys)5G7;=_ieEQ&4FPFx;SM@L7|{SzlnQ10Bh#X5q@ zT3Tk$o=t-X57yaiwrtr1xGvB1^z;;)SFc_rP~||59z9AZ3s7G!Ns=U?{{8#QlLVNb zCQTYq7ogkAmoG(7UwNU788cE)knV3?dAaz$ZmIhqp;+kKhg;YKmp}kq$YqXSXlYq| zI)o4i4JQp&i(oc^oZzHa+tMHxw;`(94+Wu?Kd}3`km5wPR zVEPCkm?J>%dHj(N5IYHj-@|r3FukEDYUF2-y>~cAzjo2IOo^i{u(Gd`(}q@@52fN+ z(~v{jq=EtmeUj4*ENfgUY}=0WYwBnDZa5PoN)CBzBE} zM>bc==9-nJF~_|fQ`sctiFeN-mIt(p6z~?bH@c4A#yawKVP%z^YFDd7^Omh5pAtox z8podcjTkTb3XXqByPg9G3W*`TyHc&Hm1x>Oi)iA^xzwn3b*9|8EI@q6ESW`}14mEN zkg=1fSfTs`4}{)B$4~~lbZp6ARkVdahmW5UA0nlT6;Y=p^c4URtcz2`%n`tc#f9K^ zwB+0qdd?Qe;LeVY;9TIGm@CS8HFpG6^-l)8<@a17s*pXxt0_}zl@*pLd$8^Jt;-^GfWOOM{uVxHfWkEm0aqXB;d=xf7jz$HqE2 zT$~7i`i!OPDIL!Xk|s$^ea6qRcvk_+50+8i$ai3qMrFhzPpeY82&GAtg8EJLCEroK zMF88CTlZ1trnS|@Iu4yoP)H2y*i?Y|Yj+%=N~H>sQ|62!aPQeGx2Q|gI->l}!>2fY zPfE&|&W6_QIH+zTS+b;5y=-yywz8s(fQN?%WzU{n1dO$_vlD@6yLazy@qqy-KVrlP zo$cD#r~pBE=AVE5NomujrJg-|(!zxc$=~0fmMvRG^1iic(}tjs7&>&QnipSc0}2Xo z?t?QQQmRxbTEBk12;y6=+$7bci~1=pa>5mdXeiH3IJGtb}Lo+!MhnEQSpl zhwZp;R9#aF0gLHV)=6iTv>b;}TU1z#EiFIyn2NikWh~|o!NCtNVi;aRdUF6<7>D-s zaisFuZ3GrGe3w5>spU?AjKyr=IE`(JM$L2p3g^p@-csLx@6x(fc|=g$Ne2T3(}H&J zUG07<+sX(SGXjyXaARsIWt0)n8iCjdNPsfppZeLT7lY&N*4`F8@>M-}!p>G_f3RzA zR3hOt^3QQya2g_&<7bMDtL8$19L%=GDpg>kjLZwSwnZ*sVUKo>@ds*-aBF?g04;0c zK}}cOq;hjEi`|sVmX`YR3kFg#hYfWvm4#*=3#PdY+(Y9$vPxF+Vrm`8yoNbw>Y<0! zX04xyD$jZi>f_@;MP-rQMZs9`2V-tIfJ}boV!^=~(FJf`u9`oS+H~tj4O(}mlqpgO zAbr`|jp_he^6`b==ul<+c{Y1dqrE{i;AiJV4|2f7U z0C{p|*KpyN^5WXkQr9&sgQ5dH@4fw!)?9o_=NZI?0#cE4E0%8Tc)J_ z%XDLx*{jK1V_cjIoD*|JIj@nGh|w8S1d#7m(w-W5+eN3kx{hVftLfJVK9@Ea7 zFX+iT+#4xqT-B^<{@Be|pV3DC-Qar{bT~EGBE4bwF?ZZ>SEL2-$L3MKcXM%m|8iMq z`S~z9aOahXyEB0AZz%k)J$}z|GlIl;t>k@vEw_UE4hwyA1y5H?+|PLb zO7ll^`}8a8gTiL{<>oB5J2d9`2J_}uYtv7i51@W% z*A`;?+|^rxH^0?@@#=i6q-S3L_yFjuu1E9d!KHIl%r>a$}60G&n zKGsK#8l|qbfB$~9SAjZF&&tf1GsUwIfq$VSfFPLfm@#AY)JQnV7+d-Ii|&z&cA{H3 z4%HJ_OhXUqx#E}iH6r47*UUqT{R~|&!NE|PKIgusqn>aoUG1mS6@#NL~S#XSXPiZ)=jDSz^ zLe$RfBbAf|p#9Z-#|PfIhi}M@E%lQ#9~&Zz!!on>qU&^LNMQ!}f4x2n*7o46*2UMR zJ$^VIfNvSu;!sx*Uhvd`FW-Y-KH49>XbXI}cyS@xyS0vwb?yEAitW=(B{cm;Vmf|S z^|Fj^AD%yd&aS5J6y|p!x=s9&df<&edG-QjcXMSPOy(NrN%{%i_Nmd3Uix1Z0RJ!P zm~5vH0w2;x4!|XW_p+==tD#{}DS&zRZLO^-t0MzH{4pe#7cXB?@Z(VO%H<(Xj(6+! zxr@-{D_00E%jQU$lvZ@AOHN9o!`eh&yP)0jo^p|D=CYwY%##l=8V}1NQ*g0Td=@P_3RF5JrM~GWd&OHrZr>2AZmO8Ij_?~Z4vjXjFV2Qtz z002M$Nkl*$P`;MwFyg}vN(+W=n zDF0!-j(ZHsu#z(`lRpFVxc|KP;}&%RwmY)*S#^E}>|k%c7azXU%>e}j;NN(KAA2wU zk2)34#8iC$BVWER3pu2u)y+KENZ^s0atHSq_Ir=#7>)DU3Bv)Dt(DuBrqyyKLw(jh z_~_oRXs5=)>%vM7VL|0@p){kwL@pE7g6-SoB* zUOBq@1ggIW!H)&aj-!1BVU4e=TzpL1y!R+=K6aHhZTZ)%!$Y7}@TX&$Pz7^zShIuQ z9$fYKVH+0h;MbRP>;H-|LjOR!V{dP-H>j>D{rd9d3!OiIUd&xxTwF}48gI)&G4l7{ ze-oDG$hdLi=*j;1G_bsrInBiSx&n&{Vl0MZ4N6$dS>CR_;40l6RxFlaF`pQV`OgF_ z<~?IENp)f|QJs*7jKd%xFBlm>o19Q&(t$uqU8*GwA3i*x9P&>+&d6WJKXv!Y&Xf^| zxe0P}I=j@Bxke`7`g$K%O>oIU{{;;qLL7Io}W zCJ{e<^_BErKLP-}2eU;xsCGsU?9JM2qF#eX32S;->&FJk>ZBRi$55X#rne*f^ofmi zTEb5e<3=Dl7ClGUO7}BQR2$^Aqk?RGUy}j22?rjsg6|tyTm2sceJYE6fc+3y*8`*n zpfAZf2JE32E$En%TCToBEtuMCP5r94f!8zyFa}$;rm6-aZ$c)Rv zE2=7k{E`5CoxxyXRS#>L-$3Qn0k0zf{=0bJu>RH8XKmnDQVd9K%a?GSJ<1A#m=eA{ zEn;z^oY!xW0DV)>>qDkq0hJt-PDMFJ!=;DsXa`%k-w6FkBP%k&Co%VdD|z=V_bG&9T1e8@Ckq4mDz|YfwnBrVEr7ipQ5zI^#~_B}d@Ns}g};>8u(spyQIQb#ocz%It^dmw0!`>7Wbg(vlU-Ej&x-tTWMnD1d4ULYH7w1P{G`p#f+7m$a zm)u}0)c*;ZH<)!6JRilV90+8s#{g9Bhb1aUYZ zW!zL0DR3E0#-JX6eMw+#FM(oN*eck8t%hOMFBe$tzy16}@YfI76`;<7v5NomPXtiU zP@mNmc%>{`VW&%>>X$qn>nXYKF)26~hOCW^-M4aHRo9|?yi7f>N%^C(Gh3NA&X=B? zSW%AP@PD!O`NA`yB3-)P<@?aLZrSr{>K#kewn#>5wA_yhPQ64>bd}}%ZE$&&BDFG8 z>}6)lut|r4De%>2x)$<59ERN2)|;*KrF#(ZgKVr4sc8Z2_*npf7lS0loK?y=Y!?ex z%z+E*}o+R0+uBZKN$qcbyx z6D>u#6T{v7sm)Iw)P)94noE^i_hA|WRxai7pv4mh{?tAwJ5xp=HjM!2X!`W&BPeK~ zC@NgIFs)p5DP~v1$ayRCA?~yB|>f#aF|zm{c^oe)d?^N2N2$2*l+PPyqe7 zeD-2d-+%kxZ#sF-esveYBfq(gr=Yb-%pW7rtXf*`J^e`FN6W+?*@~Dq0?^!pD#2U< zn1O3DE=qyCo^)vITKe?qGxN?pEqL`|JMkK)) z;Ccc84Q_Z-0DY;AU$q2v;hJVSXe-lW9bwD(wM<9QA(7v+2tW(@s>MnFCj6d-`}~jpRQIekD+(IqO(*6*u>RNA zXYGB1zdt_9Z#>t;TqZt9{@mGV|MKbdiD|_Wv-K~m;$u?2e*H$*?>?Yx&JG+?N3mqI z#8|7YNAoX8OSNN(WBQeCfRgLz(W5*^|0H5UX;VpBqHlhFe!}7()H#a8t`QL5m;8)3 zSI|y;c~3+&7GCzLXiHnK7{+2g@LVL3g2hC2GJa7$pq*d!9sG+9`KRty0rY?BaL3=B z{r7+WnQS@wGe;vj{K&@kuk(gGRDh$akNwld*eWqn4m`PI_XRQl@QOm;ej#Ue>*~S* z0;}gv7ioV3w%up2;2HT1E~3uca`h=KW^2Yftf0ULeq|0I+^?Ktw78|!jheUuE5rY^ z5k(W*Kyg^S;+l-hl8ght{VZ9sdIQazzl1_>se<+Vto<6=Pv7BV>Dlv_B3Q1x95_Pr zmaam>`gW&!HLA+9V(mJvX-imgN9O=RLGp;{NDv4UzkAObv8RqUY~*`I#n{ zC1*ov!ogs9l6u|6<`3G{-c!9DpH>WwQ9?YgxDF27eNDdXagsVb#>B(dDl2mYI*Us( z{pcgUH&W7+ny%ux@egy=kKO-}6%(HXr#(Cn4t7!nZUY5R|Lx`--F?1ip%8(b4tOh; z?yNAtTtE`(o&^0p;42^s1$Xny3U*+3evZM)!_Y7)(V!FUT{@LY6v!j({+BGLE?P_f?mw=v??UXMFlk_C zjkMUlp}HP5mFm&yv!&XJ&c0(~9eEI3OZTsFE4#t%NTE>NGcj*P=ZP|u!v@S3I^3Z&Z{6VctyipscKQ}aTZ)brL`Pu|n) zqYnuId7+?a!FeqUXVw`TF*Y2hv3&rv^Q*ptjqPJxE~fzcarx{ieOE?6HUfj0lWxn^ zXVk#kj)N1YrS(_Bs1qw2^0JqL^s$cO+iyIl73ZI5yd0ne=(6!H6=!$*DYe|_0e|5C zeK3eJq)JNdi>bJEWxG;Vl@W-M5%~7)8*SOSm(E_iLbDexql!MI)cbk(=rQd-a-247 z+ex?Y`O{|()|JpiSoD~9&bgun64w_%~xT4>&`seu%3qic+bcbJZmn6 z(RrrR@XTaIn2bh8HZfm!1?Kp6V9Yhe(3G9ydA9P=eQxgnZiStq}B2k&{f8qG}t^^!s0|ZuaRk1Og*nQ?70CC6i_$~ zWF-+4Q_IeUk+*#clVa82da&$yMQf%>0DBbdVoUtdRh%go2e}VrrC4gde>3nsir-`A zzegIpTSoG|4SE0NyPz2|ZBMGwxKBaj15bu!JU0NCkAQ7*!96`@-$Pa`1koTK->~=J zgr^Vg?;#Z&nR8!%pXKdfy^(i%rpo%Noh-KVvm)bH3EN9rFxP!Xg23hYug7bm`Jj_3G8tN1i21 z7WKNaqKrU78-Yh`NOF`hmF;Xad7llazHkgPNkTZU(b8)?FHJ?Gn1<*bdp-`|<F_hrK8?H4ubl^++hbO-=-+L z-}7-o3NR1$Uca-n>cSHm5T5psxo-Pyy(g$O&T#NcNsh86*pbI@UCZ23k{G)c=R*}h zUp*q0U-`nI^wfVA(dO;D=`l~13+MNySrbN5rVQ!D&Q@>SN-H;Pp({6T2|AnxwW?8z zM)gEq<96LBPc9Gg4+x}vhmVt2ZVwtgun)~!x{7x0KSZ`1Y(AkM8ZeccT2EZ0`oJ$bBK1XDn%V|b9+t2; zQO>KT!UyNU)bol!t*{thcloIZ0*f|sG9UYl+OAkNNi2I_O;?PyVGjLH8}3r=#WzL2 zGo?<#9Quv~&x>|NGxGiVjtWh?B$Q?KIoNd>*EGUQr7*{@(B?kG{TbCgjC-%loU3AA zu)d#GQ{`=lJ5{O+z<)ZAWuLA7RB7IIQP!C~1?F>bUWlPSivqGgH9c)*Tb5mo?!Am& zBy3D8YJijN6>e+_= zNScHeZ`euuPn=_mdM{qzK}ixPrXDTp(>L~}o4#Z{y?y_I8dNJwqk6OvZPn>CShRcM z!ZpIrDRTyz*uNtc^2#alwg1dpvz3-@+D*@1y(U=5kMGl-vSd=tkqq@&yB$-v?*%@h z{_X#w=Cv!ET2(0@M@L}Wwr#X<;X*oj@+4)=nw1dvwqnJK;%Kg2yGB!|PNjnf50af7 z8%~uhN#nXs3X5Tn!_I6~->hIJ#$uk*{pTO4QVv^cS}-FG*?ym~m=BaY zb4r>~CtElc6U=dYK67j=#$p&O$Go{2Td#L0u3Le$^h}7rVqO4?$--Dn<*e)hEMYMp zX~D@yjK#bVECgUO=u_6oB3R6|kauh}`B)CvFB!ti2Mi`-&9hcViD^Evr3W(8S( z_AwhYeWxSc3kWJhq=7CnzIpuNxD>JM2qdy>b4qK<2>hH8c*74oSfAJAhj4$Ug#j?% zV%06WHlPqCPy9QzUE?Pn%pKUe{KMD(XzJmI0`zZPBolq&?aPne)76lBRM*Q+yjVar z10cSXYg%f^LG_>v`1{~P`n!fJzhpiM#Q`i@oAZn2V(>c}y*E&}M>WcqLF0e{{v!|8 zY<2S3(Mo>FRhxH}j&;u`UP1uV5kRs}SqHkr?aV$N%$9I}P`$jWj}v)ghJYe%t58_e z;#f;C_pT%X{IY~3Mx;p=aN~Abe_Qk`Gt*kg0e!q=3pqvv#zR0s1jV!B4}C>qZUh#s zT2JGr&tV|GH@)MJ-i0gHQitAyY1^uW!b-hGm)=yhf)9-y+*eqqckDAn0Pzm?ndmBm z{2R9Jq#~>YsPkuKTDWp8MGU(v30OEnG<*IktcEy(Y#KecXBUjX`(X3wV(c7Q!=83SFlk%0N?hyc&IJmb}^fzB9 zFHex6*n}YR$);90MP4E*m+-26-c_pyHnEPmy69eLuvhv{%&6%2lESOsIE4l&ecQNTif07Bvy7sb#RCDii@ z(0d@iTW|8m5fu4xHLeZlua0%~qDwqaNt)<4HN_3CQ*ZXTJKMvXZn5D3sCT3o7f{v% zbU)TLug2vJgEXCGP+U#8t#NlJxVvj`2_9f@cL?qTcPF^J1$TG%0KuK$?(TZ`ch0#} zHUH*EPu1+6?su*AEQmKsaN!;olKwH09i1h;LEONho;7xoJ9VdD6~fM|ps(s^8$alC zDA#HT1!xkCH}Fmx8tvs6Tbd(S`Qlnq11ysZcN0n&PKTp=Pg^d_JT}=>Yn<@E%yeN_ zZF+>CxZ;bU#@drtn2wez#iGCIenhu(fIhc(X}+9xWD%ZofDWmf=+X{hbWpSMoHgD{ zw{!O`Ui%W~>pyv`A7S6s3LpeM9s;RZG{wyjydpP8BbO{6XE;GB(QR3@d$MJ@PQ)}^nX&JpUS6{J%uK0j=x)&+o`t;$sj*PJ zVzc*8-+0P(%WHXaq_b5qc81_Oecv;_a9MprCg3itGa13?wb9HG_IXLFtgI{r;!(k* zt#IM5AMajYzB*BYhhHvM5digfaoqMB-+|tnd}{fOX`q6SA*B=uU2z~FBV%v*t<;-I zu&x8U;T*8Jl>)|9PQzX>@I`>9mvgb%qlnLL;j01A`a)hF&gDQ5dFLLt2N5EjE%uu@ zA|2gAfWB}oPm@imasfV{&S4%?ihz&}sE)D|;roD-mX4NInwAO(u25aX0~NIqy9>0X zHiQ4r(KP?^372nMj)VqHHiiT|<1pAy--}8BPQ4!s@@%=6AaX<>(=(H?e9}I=>EhC^ zt+}4JBO((vw^C*kAcd~w!WW#vie@l2k@01JiZlt_j|8r;$GRQS+KmM=- z7fvHTQb98zEhu>?O{hF!)F6$xhRUxS6U=8|cT~q(!vUVxsHkd7N&uhET2zBuMGJ0y zJJ!r1g(@KaWM}y6;D{XoGf98eJO~Wfs2oJ5c)xsCdoFPE9U%N|)n>D(YCJ5lEfjm_ zY=ezj1a`80Xq*`ZR%jVnh&Qb;(#!x%*E{y-{)p9Xa!aVOK$)%~`6vqVZ0@HH+Z#v4 zabJs|b-lj@!Q74rzA&f$dP|6hs(yWM-oUkc$6WrU9-l@Kunrpo;v=v=nciWM&ETZN zW=YCzz7(W&#T)DW89jz=@xJpl5GK#HNfx3v?A~W2MgCj5?$`R68KP5(kK0rhc%1i& zgDFz`Dc!w;o$mnoCx0t$KJzgfB?O;H@ToTtvNx*@m@HZ#-ZU4r<&K>e&OH1!3 zQjrk`z2gl5JuEBQ6o-#->D0>!WuuF@NfO!=Lv`7ar_EroHLR=`?X(MgjM7eB>dkhM zMU3HxNfap_hsB#qM841|eNEv|4mz*HO(&f9ze;r~`V1DHg_<4lff5#D)(ob*QrFWC_r7=L4D{sOlG0(E(iEORxt+nR-YvyPaH@uRn zU)D<+-YXH01tXnz-KtsnsZzZt)=Rj!0S-{IXCkbfqHwg^U~(30Y>Xr6ypH*~AqI zKZh(ppn(|$mQ3S4nb&We!=aDf=P*4!67TuU3(q)gHV7{}HTJAFq4vv*l^Sd+4odTH z0(Bb{&aIyWeq{P%dP(7C|5vGr5Ajf+bR8=1qL zIJ$qX93QukF`hz18U9FnW z7y5zKHR2+oU~7yRN7pW!#sIy`K5SH>rv{`#L^qceuszfz_ZQN!`zx%)ggFecEg zG{iX1s1x#jB>U2vv2Vm5XdEZ7zquSOXJ`ivsZcOCd8;ygeez$}-53KO1E~Lm(Xr4s zc%_>k{7Ly{wq6AVLnH!kyDUbjCV&&B%M7_F;Q!$@+)M zB5K+VYAj20JvoE5DUO_t2V(tSQ{fnLhRUKhRjHK+Nx5z{XEe#G;u#vwvDPw%-{7F- z9?4T2v%b;{;h!pKg#B9#639|Rb8GSACsvv2cABki`Ez@YbAz1mdqQ1&1v9mOy-ZDvQ1-b@DqEn?ej& zPC>%GUzPw^(Hx(Y$k!UaFsex!Y9kiH!F0o26A6qbI8{2mVD{pM{IRN6P}}e4GO>t2 z&OC9I94XDnc&(d9QtkUoA?-$A*mXoCYOt5Q^?1skvJBt{CjS<-_vy6rTgSW@iqxEB zCndq{@t0GfezK*8^0M#8VCua7m+cwD8TXgUzdKlm^&E2!-`M?8cI$g6bFX(XAaaqL zFI2&BB|DT5;vR#QzKUq3TvVHYi+w7SNQtun$#kk(REd%f<)BsYE&{-?Fz>C_L4wTj z^z`tKu26>HxpXSj;H?^^pa394@?AU(MNQ{#jds&7K;frm+!N)3Y|jEZVasB9+ zYDTqd9BW{z8!4iUp>#3@40H*U##!{R99*46P2XqMqC9S6>z%gX8N`G*Vj9|PiHT_* zicKfqGj409IUj6*G0RbmYkw&)u!G+f80jboPR8rCY&9T5BZlaYSs@TP^u$HG(4#6b zz#7p_=<~fgp=fVz_9xM1R@eS_BVeJr4}pBObeRzy`1l>8wOUR&m1`011rA@0s{-um zkt6KG8)n&@*k`b_(Jr3WZEZQ3NLU5x)uw4o(VfDDDLsTQwN@j@8ZoVfBnJ#|?1xjM ztD+L4G~wtM#0+t8NW?{hAV_-%VQUH1h9qjZYUq5F$G#8;I2A?CUHlxkSnv5~d6{nl zRw$y=^B;MjT)7*`RfE3% z9KmQ9e48ax%lEKU0yM=$OF-w}qTY?%@|4Sj zM-rip=FDqb6Pml8yWH8c_dV9xVIN7m-VwJ?yXP=1ozs2HyS>YgYmV(*!K1tpZJkAj zF?XxyGgeS-Kd>#Jx$t|wA4(=O;a%#9_x|&6>ebhXq=%QP6C(ff$M3fkGP@`Hbg4S( zz?BH9AsJBs_KHJ2&(z;7fHF_J&lfejTN*$i(D`?BvR+%j_Y#R3_T{5m`)Dpbo-V}# zb7puj&t@C?ODzBQt%aq7WW{89cBas3fd51}ZLk{3C1k8Ry1!5X7lb$cCOz9|sWO(G z>CuXOx3Z`{_ZwIJ=}AjAFIWT#T*e_b&*1g(l7?2Gu`H<2X^j0N3T)@a#`dtN-*{Qu z56yWqcH`E6@}7y2H4H;#Dk6w!h!?3AuT3|>Kg^^{&=dPVca||r^{p#jGm4KMA1K5BL|_@&jFg| zWbhZ5gzqF=R5qW^^ciECkkWUT;wR?3fCB2-E?96*=M4-eN2kJZDOdQ7$?4jX`Lav2 z20qurZsD(AOD8X9ROs!5W6$hdZWV&DgE*Y8#M_&#MfC|?aGjoCUbM6%q`*zxAXpg zHg15i^k)c^)0y?q-fay-ax3l%1ESUG!Zz1mrHXE_)=+C6kOJ#73nCWIj~CRA+_e29 zrPnPHWZL#`8BP2YW!da3QXx1@&_G#mcD;1O24Sv)ciwL0w_Ax^nIL%FL;>{1c}q>l zo!-tkAXP1qTZOfA-4Pm!_oJSj-*3h7)vfhyH*;^ zBf*+AmvCqq(B2lYM7{XkF0krgwz9#%kx>UXgp6aTF_MI@ouB~p;_|RR!sHGtsQv9M zvhl>bH17=>r=g{R$ApbOL+GkMlcIJp)r74i-A_oTwXbl#x}a%n3)T^Qh6R|np+HL- zvVAw1OGhTjbP~}wWRp+PGsg*vlO}wLOrP`X|M=r9+jwl8ndR!nJ`rv?zEIM5|Dw`9 z-vgI{W;{SD6kHq++wA`&6DMU;L_&fTIoL=0A7T(VKn{nhTk=v%ZSlA+ zgm8J#7v~04sKWUz`|g*J1r~V^sKi5yl5((%G#nVG<+Wb_O%gMocQko{r_V<3>}men zhk8XI`sm3%6svpH%QQ?9o%b@@=l@?SI8cRTX4#r;MEC{>c~d~eAM5iWZsX-pytJbT zX@i}2rEeOf_DbmMTwO`&f}edVEW=(Wj%^h|mXowG8dLQ{ql^Jt)6RIG_Z+1hB^Xnu z17*NLYeHCbV;Lip0K_8+)GSW(U@o^E@BYNODA}86HuX>Xu|c~!e2!(n>Nav0J}1Ol zW4^h)JGimg?ZvXzQ!tk-TJTxSn9eaH_z9NL;)3mA>P(?wP7_^Ru0byaDJhTkE2K{R zWj3+a+?YUgdl>apG4!Q!2FN9Q=~Il+g}2DTr~h=rFQu2c?4_K@W2e)(UO1Mq-(jEtub$WZ>#<9Z_uxs z4kr4x=e>e7#5=k~i2_=Pf!(Z+jN1%{i)CGb%as|0As<8$gYM{7ajAEMxn=^EU|6IB z#ss{v#IYkC$)6L1rzxrJcI{GEFA=g=E=_~)gbTjLCPGna|CuQ)mrrXX+b{@^9_W1D zAEKRD|HM%3^$m<9jZUgV)d~6>!+0FJXn0+xdw#ceCCn=qk{C@Fea%l`xB{dyDrt%U{;i6H_7SvLBHDi3ddEdouXd{-P8R)*X`}jua*vn2md)csO3$^ zt@tw=8$Sm&Q17!UusChH}f06Xv;NYfFF zoy$u_U`~W1YNMDVAOn;`VY(#E;72DjX#C3S06Q1egG6+j{`dop^;JknDDY%tZcasW zA95M?(RX(^8Xo8E<%Q86_EaJg2m2S;xr@!e<+P7%b8~YkuZOdIV91Xk=L0o-e}9h+ z?nNaLT;23|T3O6zR zP$Xapn?XKUx*Wn1b^;EqD%X`gZ{I?Ot~yO&2-G2@Ym#ZYdX4iO{HgpNXJh(7Du!%) z#yH@SqFcIp2`OxtD$sB5x62fUI68Yv#t$%{i@)Y?(3@nei@||L3?`D0E$h2!vFXQq zK}$P;F87<1<7XwNw#Qt}a4@&n*!A!jI@qVTW%KG;-E+T*MNa-%kVlNFpjsUs0teH-%~HR z6f|4E!7bjPK@~wyD7eBrl6CnIesfq|s5JF==SbV^*8EY&{27$zTMYFej)vVSASxW3 ztBVGwiL2Pt`IidjQ51jv=dPYdy~C$6m`^lW-H~L=1JiMh>-wJ(N%0xx-iK@P*9I<- z)5%Oe7njw)WZm0TERv21f<-dWG7=F_I-NVhHwa>1z>)JiD<4I>&dV+*fnH&%v(0(7 zAKx!>2aJvK67$Yzv~qO5`cQ;kwLA0=>`{;13}KyJ>C|ukGsS_`h5uA2`EcN-F^()B z1a61C_Tj%9v8?jdS5nN-XV&7G$>?~4*T8et`yStRZxdNv_F&K41lc!*Yj1036@uZo z;Egd}r>R-rSxR&KGufbs^jkVtYR;@2Ewu-`Kx1G5*jCfO`aAA5n?rUpd`iBo_ijRy zLi`a}OC=CC1;AvfTF~}RM5(3G;6l;2tK8B(aw6ky?p9U!T2me`;*C#RSu*c}4Iduc zkQlVWB24lFD-U%QS9eanzeds0TV7B5q4P_-NyI^p_xBDDySmV1oGa#F!o5>8S?Wzs zyB#8d1z@uc)TFJcFlFY`ss2Ts(&uNDG3>rvh_8Y2wSq08^J$6_{+3jze&gyK&m z9{3#68D-9mYqe_K2*Lpq$mK3%*ms(e{SYPljeq=p!C%kAb;1^yagR?iTeYlXc+)!x zu{Jf?XLApzb1Z<*9bVX^NTF!f<#|yMz0{3~frK{Zx8&&nLJTQ(FVvZ zVw}sonE>e};l*t-|GZXYg7R)m#+F)CV@yL{g&)##jY>Vf zKHGKvBHbVbkfu0!fJ)1=?Hh1(fr1AORsTA?SO{BmK ze{Uam)-mC0T)2JkYA#Zi)b_*v{H_l(Ol1fwxH7-0ve#zRfuTbxuWgMzQ8 zYa(^{iZj0q!^(ndq1e(gF7B4L3beu%CTSO^um7W~X{WVt6S=?j4+!CTyFQy#nywR; z0juUQygFmoN$Jl7>oa8}n0@6*a(*rBt z6!_`?pO3}wEnZdLG02x<>--&2>Ug#4-}kQF-nV=DmP`LUL#HjnHXenGCEm^m3K$IE z1pnMmowS~1BzPb46o$izyuk=e_((thy9A`8jrgm?Lc4qV{`!yM^Nu7=ON_B>ip&@B zK~QedONu7(zcx{Gj&$}y4U*JJh&opErABXMTot{)c8{NDdeH7zqZri#L2_|heem!X z7Zw!>;Vi0|S9qU~hek={?>yJic*YCr%*l zolH*6>jk>Z(z@{Gdz__zN&ceK_h>& z=`u&EZTt!^%ipHl|05K=7i_UF^B{(*cT>RhDU;kLf;cw!oixgP^Tv`K)%^t@?*eAN z$qZ5nM#1d!Y(>9t+n~;y_-^Jgk2|KfVD6vGPPCR0N=^%8;GanBXA6=fE)~A)_S#V4 zCL;k{Cioussua0q2XHr0+L|2@tquzdvp{_=eqmhD z*jepxv+tM6rT(5K0-R(hNJvNmhkRZ9SJ5w1y@i)$w{~r&;NRKAaT|U|byB97qM2_IN3i@#ES~*1T2)Z>OLvKF6!&l_Gypy}#YWA&q9> z9StoyWTBI9-|Sb=AYO3Vn2SwD@8+Y3cJ&Y3$d4?Q8}y|tWd{WAN5a15E>Q9ySEYmm z;+4Y*fwNON&#;yI-*o$2yST*qWc0z;3ceKIX)e^^P?B)CEay<+#A~`>1s~92LiPPPs?KIh+-_JbpK-f-4k|tF|i}&^93`#})2I z#AZsH0;Raq5}Y>lApr-J{b_Lq2ZEF_CO=(rMp?h48Mp`GJk|qUS*YahL7K z4@L%6;SI9UH@N$E!J;q}4u$w>WP*yOcDsCH&|e*fJ~%&sYUzIe7s5$#vixG_^miw) zvQK?x!TSn}f6mf7W~U2_Uc-wI$O~Z&-z&|s;`2m!VCV{RQN}%W{y{nU1Xc6GKKJVL6a$ z_V@3Y+~mW$#c{n*aJ1=q`}-UPqQF%QCL}%?Zt*UPZPnV60$6^;4e<11c#&h!T;pBVnY)M&G|HcY&*Gan=V~ zr+Gl;qJ5lfzB_GucRln#Va0>X$IsCFr=ZF-b!cDzGHS!l`&`Rs<7C>WDISB3>{}a+ zf1ti^{#=wO;%tWxGO{?$`4@hC7$Wo5Y-iESZ%<@?vDbqBDjkK)8JLFTL7(?V%hjnQ zJ#tFf6;fYzVG#MCDM*b^1t~7cW6l_^eNt{!2aKrV$nkX?>)8#c)F5WmAgZgYq0G8v z%b`@^HK_xjY)a$j`p74_0k@Q;OIC*4 z+uLrVZ3ImKp4La3ClW7-K`Sa}toaFk{|a4=ofQeB?YhShd-%6_%}uJu z0F^|rSjUYsPE4P;jh2i5H1dR!(ep1-z4Y+6%Es6MoSvE^4xQOumE7bv(yjQ<_6rm< z^GF|&Nw65xX$3zHLh%NJ>lwAuJ_C-*h;O||sikcE#1j)}+7>-H5Zf?t>cYYwnp^4%1!7PWN1YE9D_PNWXdo`!rQ8}89|)^ zkqz%UN9`zOGMkH82?H4dc0VX&;;CK1svv+a2x*6vYFgf3IgT|dT^Lj{MT38 z;(>%B{%C;)V9BcR(ipXBxE%HB+!4tWOAU`&xVP^HzsA+2bIuyB$oWg4i{vn->VC2z zq2IkU98fy0RF10ZMNPPg%^T&>-xW;iN}fnF*0DxaqEvU?CE;Wv6k7+m)UA*g2s`j0 zLgQuSMg91GdNA%o2Wg`5`8USXuO=@3P3xL<_Ft~|lf|2#Hx7&ND@<=FL}%{!F;h?0 zQre+7)mq{-mSCq}62YkcAvg(JL*0EOPv@0JhI7P=li!J_C961Y9pspb%{Ahi<>xjP z{^w-lLVjn>VzAL!`QVQLV2e^Dslt!#8f(6|AxLJ_4*#KmXIVqdxa0MjBfRj`#$+~` zmb1!j{T;x!%tfG{|4VE>-;k={u`MVlnN&XBktmfY@SLx8{TcZr?022uOTw3-kkcjN z_?!g()MC4#*^5Rb=#erkpDFM524S&sRyJQR;}hvFDM?mzVJ-I(Q3Kzy1&QOt2=>aEsu(yU0#V7ofq z6qo1#J5y9+xsRV))4^{C!P-e~E6+~wowjzrBSm36CX;LINXov46?KDE(S~3xXEZ{I z6jR9GKei`1zaE9Pa~jk<1}k{*VQ+r=#*EZLQN;B1cG)m84)-YNjNj{3>&O!SnEzjZ z4}4!57!=Lwzt#y=m@POz{R256;mQ{Yqm`Zu#$A20xp8H37K?E~lN$ZVd#QOnUr-0Q zN!d4WMOV{*$w5+O!$%J2isB3M9Sq?q| z3{Lk)GvcQ#y{d@7$qY@wAC*`@`icrns&5N=U(g!~fO|+9z7Me3Rj5~euX9=zDC&j{ zjGdG1dx@!OdrHH}Mk+oPm(@1V+WsQQvxaraF+CJzWZpKBs$YO~)=;X|$9d-^G4X;Z zpM&BqpS@Cc+4eEi)D2#FJQlw0TN(LG?{Hh>IX&^#c1zsXi#eR_!1%_|5*ZCWt;U`A zX7Z|6*80$1CoZ&TCRmvGQ8Uz`)BA_rb#BOlK#dhG{<06j^`E6?8G=tqI{nB+DHTp= zj9_5+soo>|@k*wrXW#e=s}VLgXUvrjEC%~rk$0Ny)?q1q zr;ol5nJ=Ez*n+1wzqZ<7S3drb((r|CsYH+QWO>rXCXd_E@U~apeb6gYT#A{uQ#Vd_6A_dAySID>jxYG#64{Mh}-kRM;N`<+)&5)45i`v!&YG+x1L zs#*5BI*aQMqhHPW>dtE0@ex?OI9{GC^To9vnPw+;g^h|EN9qC@%j2@g8+S~_Rul!y z?UPIANr4Y<5F|Ki`4&KG%guTy*G5x}eAbDHz~$|)5wnTXSfvPT-M_n$wvECQhBSQf zAr6~&A7Pb7Fzi$_*v9suyzeuj-an^8XvkS8>=mMnzncDx9wDf@-jkRJ%_r~6T9!TO zw4z+*^^@HWGFtl(vC^YN2JjWZ*#o}2=D>x#cfQlugiyfox|S}C1dY4c zs?Gr3T6)E!>FlHT@yF^+7#9D5qUxcPA7(>O_EVH|EN-s`Nl!fBC&clq5v^@a-Sk|> z3sUf-er*n)`XE(cZ$ue0fkaeI_A!rI!Tn~U)g0u3c|pgI96F#kAJ2{Wt&ik0qaj|j zh|pkPX4Sz+2pTJX-uhP0HRepLhu{gB&236^PO*s8ZO~Iw&sUSeGjr@h=ONW$-s}3s zwomGp-|ItmGZF8k`YVs+MLCmdlS{lq)9u}}oYjIkRshM{wtrsl2#uxhcob&;LakUb z=VQS+Poc6m)|ZsA;b5pd-LR045X6kcHf2JDXTF~&AfUzEax&{H79rt(1_bOeZ`yl# z^n)J2D2RoJCk+XMlm{4}XOrkuNR2cp3Hiu^lln31TwlNjQ2=DPy$bZ5~!eddSHsz^Xv2FOQe) zS{Z~YzJ0U(Ra{i*?dkEdEu!sq46jG5DVCLT2e9$;Vvh~z8alrWZO=h9WF8dz@Z_p= zBzFVxKQyHi!Dam6FZe#HAM$+clKIW}`&83bAvOLHc+5dP0oZ(u-w(Mbh89yuEXXe3 za<;PNMCh>&caMY0O;H*O+M}2xVmG`b9#cgL@p4ug>iXps zK)qAK`5r4_4gA*d=brUPUwLQD3bZh^MrLzt#Ay<2Ldv?-nTga?wZ3Yn=a(+8pv`d!9fPnO%$ zrNz^WDi&4XbUFvp&j+`If+6&E`V<1x*8B|jV~AD_OeR$7d6~4@VqD!Xc`By;#-+j( zb2_BueklA_m;Vw@-0lAStG!_@kXVR3Hf!a4-g?B$`WO+6R5s5vED^+8oqV*EU^nma z&QH&Mo&eh8Vv74kZz@M$c^J^bq9NEnYWv{=AM)FGGD6DcK1;QN5UOYNXM=JH!1ewo z8BGPB6kcG}N)Rm7cbR^dNqs+*qd_aOeT4hVOPsShrDGY*w&f+|kE;pdMU$;Suv%;W z&G2mP;K=_yvzpP#lU?J*1?iQIIesT~x2#z*{~rjzE5lab-qDJx)IZ+|!Tm!&k&rW< zCvR+Gw%5P!b0R8qrSXa@Wiqk;)@tP)T$7RZ?pjdp0g?vCKQtLuz0jK^Y4P0Xcwgc-gieLWbwfwz$EZG8NsI!-y_l(qj(M*=mzN-> zW$UE5EZz63Ys`fUP7%%a7JJ>u#S31M3b(To2A)f$4PC7=ndo2h#YUR@_kmphj73TlFk@uqATd<~2nF<wrOVxVtIA={(mKXm}Nrd1|T{YX?&X(hW zoPxyX+bwFo4G@bc(`xw9kD%Xk>3ld@1Qg}X07ktgEx?0}wRn@w_Y=dCwgKRMBEZAv zV^GOX?~Nvg{O|7#@CwfWXzV{rOQ{&t^O{f{ZEaeOG1s@Z1&K6@zq%jJR#fg-ecztu zTOCdK9Jc(IX=_zl)S6Mq15(Co;Gh1YbBQB|7>0Z#DPm4qAM~}SJvMF)it}wh{@Qv| zKQb==0bdbmB+)iK)Oa%=Q#n9ykpE_it(&0kkEzJnH^jHKKmQ z>v_*`+x}jOHL@>g=Qfz+ZwPg6OKVO7w2>noBy|ushH0$VtkNil z21+~7)mFi6w?KdQNGKpy!lL^dA5(IAB~oa?(tuk|5xmw(_}ORC-lSviUOMnItfjgUwc1&Yx4tGj3R(8n+XiC{aB2x1^K{-NN0 zd;6tnzKG}G>1u;6_xNWCO?Ww3$p~}m>dOhx*N;w1Fl!^tyIobKZ*$Et`bHUyqaf2> zDxM#XvA!2adlCUG!icbiDaMVbJi!L^RK7Ly9>~dO{<8QX_OM$UUWE#Ix8xRf`W3Yh z1SD%yS874evG2Pp_^W}>amu&l9w=H50^`HAo_!Q@!N-IOr%fyek^utLB4Xg$uxQ_S z1rtMge((JR^MmFkG(0qUFHo#~tNBX+)A9t3FV*GDAxw2)@b3D3=>Ce{A7W~as*_ev;;uV`)&>+ME6*bvb z!BaMn2d~=T?fB*1ONy@-;gy);^Ebi}VzAO6EQ~N&uFj*&i}&*|(O5Q9qI6~-!o8>p z4yX!&s#Gg`tkLuxg?_0M_W4X(GGYZaPKd7ULwb<+lV))WQ(o1gOiARV#hh8_=e0J1 zA!J~5!w7Gcn86#$P_2((B^HS@du)`qqM{;1_4`;dLleR~;Ko24zXePdbHKYyK9gIu z!`1eSux}@5+3jL2onEaROA;L*o%rP6rN-{g7Re>iC=$nW{yb4V+3e{7`49Z|=?jEb z?R0nij}J_xK2wsW!G0YMFGa{KT=O}jS(+h`wCiw-uH!KIpxc-T#9csOt) z%onG;8HD$i?Xooz+*dY8x9K-2_*=NVHL?j`;e~vo&Xg}d^7xOeN2OAG(x?bY&zqbI zDl~$Rtd#oj_%XN(Tcub0+=A4lW`5Om>fYlU#e$A|`e{4pQ2F>6LTB8~aQwln6C6aP zp$RER)kASK_tgF+s4j$t1cRHglI+O1vjZDL?S#3tQUz#27w_=W%A+NoPy{@)b`(P9PvzY2`WS_)>-SvKxou~Un^DE}QT!|7WXP;ep%BA#v-do#=nXI?1lZ&T#k*&FEq zFtgsN*>VNP4+taVW^1qPpvr@*Jte}1AFiH_|DiJ+<}o06T#Ci-YGb9_LS41enB85E zt(C>=XfYQf*niULuR*-pZq2e#p_IJ%DJVsY=l`|G=pXZH(Y4&esU7YI`W@9s%6B{NO6CW%fbzg>SL#DfmTDBGgTz{t3M3nS z-#u5`oN2&=HkA7_2zhTydyEEPl#nx_fV@E7L?(|)hwHhErs(r#je&4BCtU)+n_au3 z_)?nG7>8>}vLH7u5Dk*R!@at5)CRLP@h*l#`3Z<4asb2(y9D`aqu!buXt^s@m8*q;sQp$MZ-{d&SNq7AorC(lckCkRa^#D6 zL8Qkdf}dVUcbn0a00yNCn^!x|{E2aSoqdm)IZ24pkvOi3`z(F|W9%I>BjaW?PIxa8 zURo~#$^0)xei7fix}Wuyo7P5u;CJP-JU@CpbMYA?iI&7H3}VHya8#1qhW#`#w{tW` zg)l(aFAwq7jk{L%i0>Gcy~C4N8<}rtMj;=}!!$w4va1u&!>=%|5bzAXyeT1KFlZQy z7>4E;*WwAE;f3Ze*y}b>nwgy42&!&q3~C4lW9hO)V&ki>vtX?M<#JL zHy=p29x?m%p_E|#rmyn_y@DFdqWS~-1DNjEnh(whUAJ!*T%HCk>2-eNoeMdnk-2l? zrQBPq6(AkY&4x$J{kil-)4Q7yq13Fvg86vMY`KJ6Jnum!F2lC`o5prL*#%~+ivT31 zbCgS5l7I6pQASj0Kt$)Tt7P$k1%vjTinQqblGv_z5aa;D{p!&b5BBqJOLaf|Rj4h0 z*<~%;e}3ft;jjj@q^edLTdKdpH4(oBz^w{3i@)vgu#&MDjyI^)3D_y*qe^@%qU3BR zcz~Jc*qIoBN#N566yZ~m9`vtX7Uqwt9Nu#or-K^IRc()}Sa^04%AyYDbra&K5owqVm4C;94?K87_a zwJ|a|o5%dcB)~Iy90b!c&uO)&eB*Z&&aBr%@nU>#uh%;;@;~-{0CavRR_lU6z3 z>iikN%?w?h%p_T+%Y{-^#CdG>C&OT@VdQ=x(`~+Z6YpfD86BG?E{s^f(<=4{d2q@9 z$}3~+U&UaEVkG~I*W4aXl>oP9cm`M6F7Q4`tLeM|fSG+eB@8d?XgC*n*qqGo_VMv? z_i}IjUx*lh56JzK<4p?@*YPRWYAAN#t;mgWPoP{Ra252t3m5Wv`3A_81?*;H(?FKE z6yOzbTFuioAoyev`wRHDp@y}CF8l!Bx68!(`Z@@=z%)a76VkkKnkD{g887~k&us|k z=(3ZTe2bHcii>rFhn4tE_>cs?3%>Sfz{DS}l?abIYO`d(sZ%*oRXdC%j9C{lR_s^5hFA!AC8^N~`M%Tx9pIJ}8&&EF zV4riw&p)^E-0*kbf zQGMTnz3tcY5sKu1u!H7<$w0nz5nrS8rD%!r5rbJi3pY&vU+qDftX*W4r$;a>O?PgE ziF>>&icG)j!kV>Vd^-|)`X)F$fpItPqhjSf`A3LOnb z+j@pdrN?q#{f^y4mxEt^2h}gj#@OY@UMJHYjmo~NHttT#ybQ{=DdzS}Pc_j;f zMQMKsB{Mqam?gas^A?13PY<~l8AFcIRMLz}!rJxZf!oBR27VO&H8}j%N_c9N7a35=NM$%G zS5&7EK4ERGSt_R*j=d3TXwKP=hfLh1x~NnW`>Y4E_*m3HZ3dY_xuZfSg;36SNPgaP zFGhQpf0T-;AdIx)k$Qo@{5LMu`L0&^g-D9T-1J^i?MNzRuRyaS16Sh}r5v2$4!3sq zUj!@!^qPWCOc3{r0A^aA~+nFe&zN;vr^N$7A zFmB{bxZ2sJl94Db1K$IxcT-z$jYIFw@h=7hJh<*39}Ha2uNim)vng%(n|ybt5hmK} zV@JeVUcF=90&BGu75>*XZ5I;KLM|r5`X^P#{{QW1Lu(n_RZNjWVgWri6Ou*}2F<2y zV{r<*w?+qnMM+%F)B$9u)-NN9xk@b`;>g?qySJCXm;B~{_qtsm>5)s7_`?WPu4(i| zP}A84SISpPK1URv!(uhzWSh@?6yXcEUAce^!Q^ObN6BL--}CH`G`LPv8g~z;FyB-V zr~FA0)}XrI!O?aBjcSFK7hk)xU^1h!G?trub=}76!|whnA*$3UE`knpccFS^^f}*M zPUdCArV{VM+N9>4X5*BxRB?xWCsxl;2s>q=aK#Ut6oEw-)51p|&%Vf)bY!llWS~G{ z9a|*!nWv3&cW3Db(iQ$0?|iJ|t9gBpVwT}A8)ajKq^`u*D-H5T~dwIYs)!dwnxy72}#zsEbp2xC}Vc#W35hvdiNIGNx7#?<<;$p=;Aw0j&T|rhdb}Q#~CybJ&`ixP|ASLxFYQR#`rsZ&N_=Ah4Dy&!ta!H7ErE! zTsV!TaaTh8*eGY>G#=i>V92&cc|>yYUf0d$^pX^CHq93z%COAz7aa_-Zh?Eh`ctiB zXvsk&K)N`9V53TBc6?d76PN`6wxa%K^4JF_3t?^K9nX~@p1F(6hhGlvjzA&#h(kRQ zx77;)!El191c`=t=!z#G$NuX?GcgvAP0WV+=oZpfIO!-94vqJ4(h{pQ^ai=eY%)u$ z_pY~|80R6cw^yW~1Z+>Bwl6>hTKMy=;flh)6UemdbT-hn9h2J6p%2LV(#Un5JgLyn0L1Xi_&w7M0rn-aIFYxQ?g)&8V{J&hN5!m4u@Fe^C%EW*1 z!iN)CTUswDOo(Zrb{-6skSIZ`BSBY?S*|lpj;fRh7sN)I1cAts`xEu?%-E9+KXg{q&i8^lU6~Kk0e40dtE+{ zIUnyl^Tyy2ZO*1NnmeeuSGWrmTFId?*}wM_`H~ru%@H55Pq`CQrI?M9g?(RiXNXr9 zX+&1uR(e`|>%&W=bLI`({~rK+K!d-jL~K$3`+vrQzlDR}VpI`XoOUJdh z`2@`WXmriY?3nF4{kbPVtc^z3G_R}-e*J}x@+q0^*I$SeGvFr?PVZcJ@Q#-9M$U7_ z)R#^_B7b(H?0g@*r1q;d&=UG_iAQ8!p=7a@oWVjLV}wQiltpW3=MgpWjzc~fKI+U?Y)VGXS#VJXkiuVOu{fMvZ>mi~?`FDUfk^cFbrP*zKnHf>q~ zPxJ8ML;Ao5G=2N_6(*&c1856#02c62_8X!UDKrW{LwUy1unB>&;dB9%^MDt^M;ec>uP+T6G>Crt z?KeU{<>cbxLdfsly}N)MLOt}YOP4MNo%zb^My0S)-zV^Kgbjad=LWDaFjic2Dwrzd zNUqhzr1_z6*63p5(&`IO2B8z_;4cum7;FmE@NlIGe3cV62>>%Q`M`bpnRPLH z*?N7fw?FAyucJ;PHc04KDYLw~PB_I6g}F|m4UyZdbRV}bfI6`w;L=$&MrM|>ga0Dv zsiqvf&$#*7Sq9$-z8gUmS(X`+#-qy*-%|grcWB)&`GkS#WG)M1)Y_hrZ@^^fI1QCk zO21=>x0*(zD)iO6KoJRuon}QinP$?EvBf5_vc0hk>ZTeyU<2$!XLcA1^5CQ1y;%W2 z>(~PtwKsrL@{c(j-GVCTOiuav;WC4NK<6BP$UmUTC`*cXA`kys7EVLHtcaL)gq^VQ z2L#1`4?XL6q{D*#*HY;aRD`4>@fe>zZRzMmMH6UtbM^Bqjo)TxkNbF|;5+}S#*S&e zmJ%P>cy<9*XJvQxESV)%w1DAmn*P#_T6Web z>J!9|Pt(T!X%KR!U|vtcM=6@l?O@S5V&Zh__ov1h35xqsgETKg&tJTxUHcB{j9qFQ zb2xt3KoD0w?tqO;=rZv~zQr?_N#t=zU z>t_>1%kf6dE_PJE;`~#g&^K2sO{-ZKf?!g7j0`B{1GVNk%RDwD0Dh2vVO%|3nlP}8PODRbt`!a^U;Yirb~ zA(Zui;DKx;f|Fao(!lxc#EBC{IXJzQXwjlYf_JlKniC)i6Y@Lhj2VQs^{HUNf`pG! zRK9$9aWY`|@Zs7G3pnVNP6333gwT#1J9Ne_ZyWXCq*uc4$Ji%No-8jC<-hUFUViw8MeogLEkVdz1}pM5)omgg$d59!gxLueJP{_ks-- z0FP5EkM5~NOWMPn52>Do`fs_zP|=!G1up#FGoofz0lxzt^P73l1l}-^@)Pp=)J*mf z0EffQOpvAgchZ^1;)s1$75a`iD^A!avC|v@{q9{p1K}elSPO3Ike9G49E3D|| z^h7@vPcVF4;9U@uRsmyLIOGZK^;=@@TT;wLX>kMM{Z zSqL9XXW}7cQR5UUhsng0v`z6{qqNRXv@M`?J4gq^dR^Vzbwb6 zw2xE^J74^5NuaBbeGF4d`CN%S4@99i8dVS)q*Iu$8(U%z8$18ITjC<1uOa5y+B zTb!LcN#y=xlN5eF0Fz^iuvp#0PA@_A7GE<})FJaeGWN8st8 zWa9>jvhsHp$Jv9}`X2B|rbzNL@#O7SDm3+?PSJ6-HEWnfe3Ej6cc4z5qenh691N_G zZ6&e(aE|2%onu%XeJYwaH{IH|imu)E7tlM25@_y+`|RWvxcjF!Eznj;k|-e^TRTTs z^vCB7_vCt(^zIDpcWT3Yx_kd2z2*~!x!IyWq8;3#vxisB()L*jlr5T{n$@mMSu>h9 z%)x1ckG=<`s!ny)+>f^3kV^4!bm3jOawSX`ixn$I0RaI7$epZNvl8&*K}gG(F(X~N zbV*wW%I>pg&kBqF1iW5No;5C~4B9gp&)=jgP2SN;(O$-jYR)DMRKQ zy8y-J{g<$sC4WWK5wwos)o*cjL#0}!9R>PHo+z%fm*TFSYC(V>6GE64f&+>yKR9^f zSWDz8=wmTl1ESC{Z;N2<1<(s)N*%X`cn9r;hVW7hJT2C{1i-+A!C+|a3YP|nR5J4O z5IC)tmq#W=2VT&%dIxpCQPU;W`1LR{pGlihZYJ&D-%R5D^rBoFqxUEZ>||0*=-Eu7 z^U|Oxd$`TH&43$zba!Ci;HJ?}uYDHoI!^4l8ko?($@6dI$Lf& zjjcFu|NZ0$&F2GTzELHYCTFI@IC-0u&JRzdOAN@xgcC`@csP|qrGggq;L850Dor8` zp3Wy-qQchJM(Ci=f<4NBdEveVv3?Y3++E*$|LOEJexU;64h(=dl%n8vja0k^*1mIC zINP@E#zgsk$AfQF0F7+CH?ce_IIqaG6e8|Sp=AWA(WBuA@osb#D<5Vfydd>Ky#d1r2FHD;0iB-MUa{-UP};Wm;pP;E^U*N7 zL%a|X=Yr?fi+<0MO(xd>=SJjZ(}8c!yxkHB2fRvg{o7#yOUIp*CcNkdgA1)^5B6oW z7&?F>w`~_{R1#QAxA#Iw64@-3Fzl);E19YJ2j}5F0x&LYwcn~kh9-W{dbLwjO9QhisaDFjMCH8{587hwcaiPYH*h2>SbByC$Oe!}#B( zt6EYb1)Ci(bkd(kfg9z-Eve+LbN!3PTKKQgWhu2G*4?bLh2#1RCEf)=Pz2o~8ydop z-w(jgTYmbT29p`d%&Zo*VB=-*;y221%-@mS9RgyKPI6Zx?Ovh?--mYw6tMqPUPfMW zBnuQZyjHaC*@zV92JQvakUKge_%!SGd=CEfe4vO}-IZ)*B8!Q{^ts^H(R4&4q@fa6 zZO}Pgt9oz!*jV4yh-(D%thPh)R?N=bUQ6L>G@589>nQEwr(-_>afJ>8)D$aI<6 zx3z+Ss6~sH$u;mEv@-5*J#J%=!FF*obnBzzNy}`R5pCW-f|AlTh0w_lHhOryhe<;4 za5F*)==S$1Ci*1>T>NKnzKkMqZ0!mJk^WMQTT3P;K2eNi25)Y`2WWho5sdm&%+8)~ zx}<8|{dP2h6FxF5Y5*ZO|lwLL_M7{YI2X`VGD1l$aXx^#Tp7 zi9qzn$Wwv--q*kw)>xI~TbXZ^yaA(s=On2|1bv>!6)Ht8tJwBN(-NYI_-W^No1i~^ zg7XHvRIRmns8T;|MJ}ZFtRa1Frd$xW6k=9~K8gq`L`qz!W2 zIxhDp2`9(@cmdNJT|z9 zh!Pa7e7`gqWg8Qf(LZA_#!N|f^?$Nyr&F8{mOL|>IQwj8wNt#5NBFep-CSLBwh&{5 zz+(i)(c#Jmwi$?CTRC#ta-TQ91}G*mri7EQ7g=dJIZp%{;tlJyp}z|JzH_> z3=WO-n`Qm|!xFQ{K035Qx+Gz0quBXUqg+mHUCFoeEjH8fuRMTt$-Wb3d?|BD3U!ER zQvdl%9o3O!hNBq4H&i{(%k59U?KbocmmqbBw~7^Wv{&^EpBl}leySA7(bPN^%cY6r z2>KS?pKqv6Wb>CA^#(&pHb_PjpgC-A^m-Zq|D=E^jEnJTIP6A{$f0Ot`-<6U=oaVk zp4Adj+_Xcq;Btkp0Z!8t2!*^{4crpK<#<4<&k1sJq4UUwP+S zV{0Zu>XPRwcJ2DZAG}C%q<$vX{D|DpI#G6;!uqKKr4cP!-kd;ueb`Q;#=>-oS940V zW){-n=ngTvG4L6-*X?=cyDQ`UlPa}>S;0%G81dFDav^cb1J8+i>9Z7la;7>g{9UVW z%(%1nf<$-i5!2e?!;#Z$tqUtYYay}DTn;e&Hhtz9W#5RT>R}xd{&^H{dS?1t0u2^# zTae@XDv+)Rt@^waQmxt)Yf52+@)qv$f?!46{t&rWrqrv}bSxe7;tD~}*Ba14YI#v} zQF#=X`L?w&{2Cd9OmSAy?hmz>yGzixu;0pd`lmPaSS7ID>G}w!1)~T4mB+=}b^`5y z9g>%%byUe7vf&va;zhMBj?X@%vu3;Mws)$w)WarIkb*boU1sMFCj4L})yLnv@A0$x zpX^yvkEI0v`0H?h>)Cu(vVptp+*5b<4&-?mcY<=fJIj*AsZWo4yIn`&tpJG{Me#s9 z-o}<|x$P93@8EK1O^R;ESE#995fdI&p48KUDxLS?&XnZ=4(G~M9QqTX6K^xon zHsXFqGvPermV=}m1#-Vz7irpwg!x02SN#Jfuj|58e<8LH;#~jXz@Cprk6~sDb_EQ79bWekV!EAm3?hx( zq|x`QUbjRBU=;?QHPNUb8vSrz1fkE}TB6v2CPa&*oDk;Y{oNWbkH;A)LmGFOHv1Go zgwN#_mJ2a+4vpqo&1K+I`-8zJKe~_>>G!@ZU!?a&UqQ} zTjo7mWsw2|BBH@Dn34xJr_fsBDA3By-vqvg!g1S3^jed1E3vaz&pA>Q zuba$FjqY@_z0Vpugd6{GadRav^0-@~W%ZiVbkv`cypEJf zW|Z~ISNfUw)UKJ&6g>dRbVK--DkOgGIoW}6K!3Jw7JQr0;oMGrjy~}MM-qW28SqnP zEk@=t44SmjJQM%`IA85br}KIIQW_{wd3m@jb=VmY8L}JKGF)%-xH+DqySlvv2L7FZ zha&z`HZ2$0WBZQzN<{rQZPkb-$+%PAeXfObEj4(kd_2V~!No=V5M0DLEFOhm{=(7r z^biGY+d2YGk%M>4>@OsHs3$}bS zM36v4wLCDXOHyF_K1Zc!&S*(eMg|E*v*!S=7ZEevd%aA6Jo`z=F_~qUwBRZ3 zmxotzYrEOX1@&+qZ$I}L^rY?or145NO#YM*Ng7Vhx42H8ynvf25k9r7|9(o@Q1u)` zo8pE{@QtiDJoX30c|S5C&-8QqR714>emIxd+qM(QjX)LM>ywpP|I<$BwRR9g^CjH(jjuT#`VQNqcQFSz(6+Yv zFlxh6dNM#P>^GuPjM#!s)Fos6pv7wXh1OwWLPzm-B(-)! zo8alrWHA|~5=_T%h}9U?>zR{i^u;ce-|dB3*sYw(TTB<`?Op=% zHG55K;^Xw zraa7k;c&RZ`;(AT$I*5_FMBt1p{*k?STz=!3zmu1sCS@f#c4z4=C-H6N3nH#!TENo zBCQEw=HrdG1K{>x%94TGImwopV<;U+OzhIsAm|Zptb`&e6B*E;37!vu)TuyNsM3>V zx12?_=aNlf#QNmtZx?O2<$E+uvHaT#2a8(C&#zd}?M!#M&7%(6a*zOpeZv!OlQ)(= z%_NqgsA)&7{~Zu+Q5KqRCIP|B?2jb?8_O4>Wr2dPLzUrP9pt3f#`w4WF;m7wS^|ft zEiY?96iTJ%kM=&&5)|ug4k`LW%6FA~v6gd)aAu7(SU53adK8zQQ(Av#ysy(UZpY&p z9kE8W%ic>a_)V`wbK^TQ5g7;A;+wPBY&DLi4(jg~2!K0_m9RJVj2!HfpiNIFtXCO3&`&QCoQ$CJlq+I8mGzisAINxT_h>3rMs zE!8OfQT{UHK6J{oDal%^7Ar6i6eC?D=VReG6N*Wj{Pkc+6v*p}U+rC7Nse_pXwyDq zksX#b>F|ChwrPFK+#Yz6)_R3$dm-NzXQlie@qI7xNX2Wv%J?2exq9q=@#q@Qp?*!* z!|Hm@BP#tm{244c(aZHbpC`g@x*rDZSr@`vrB*KNFm=PK<>^n`I}-I(qw7T>*WbU| z(mdm-FK(g&Dh>ib)P$UgCkKj^uY)H9c8D6OPC?0)y7Ec1>R&Zi%UbDEL0bRey`Hv zd}RK7cluo_*_!z~qy5$P;Z%Y1<+k|M{XI^`V1Y!GqiHRd_XdgEXbPy5{+cRM1d&fh z7`Z@e4ACP}evF7&#jIbpiXt8>a|G1x4r zwuP4;??axOUbFlUB;FS`k4#x*Jd5;$DlORB( zqw!2BXqqC>gumj%N{vxboOUiR%L_#XoN0z>DZ|ZEwS%wO;%(MJBs1z{zVJGwdUAPe zrPM2gqbxK^3he9f$)3p+4J;Yx{)%Oi!fjXE#OLTV$vZW>*-F}U0)^8@O{`t4V3WJH z@;*j7ubHxW)U9?E@-SjTVK+@F34KIhh+f3HySu~NM)6J>d8!A<3%otW#_2o_+9l+d z>s>zowwQ{9PL>sCfG<)5C_!_XI=R4I^M6&6%OHR3n53k}#8p*YfY%qSQerh-s<`%0 z*g+P|O4@;Os`bEUUA*z;&*?EjLy2v8?N*v(~1fRR?w4@9M{bc zgKXu#eIRJQKB(HrGd;Bq387OfLH+pZx982_)}LONvJND?uYuv%479uOqJ{AkvMNFF zSb^tQPLTfKU0zT<7iOh)XW=Ja^XM+2E$%MIqX4gIPPcJc(c^AU3;zo7VFHW<+pnFng;OsH6CNrHm5+v4+ly7`q}`|q+R4z4ay2{%IebFY30$&g(4KY+URmV7kD>^#AGW~nw}oD#SFlaLjO(Ib+X3PirzomD___>E?Y{BA1;#4iqGzx z-1L*NI9At$Xo5MJFE7q0Q9@iSUu1rW&x1w=?;0N9tsFlD3^~n-zC69b70v@dA z-djZcs;FL8Ph+~($D{a z-8&!ltAW!-5Hhi#366;Xxo)$g36IAXe7lDk5eHezXsB5<{cN!)E3GP9XU!y2s$?Ba zW-mXa$B%`z!!X9LVWAEkI~YF)$MuUW=gO8=b;r`#`zaUA?$V0lPtpBce2Nva0&52! zE_W<0HoJRcN7MSH$CwN{%p*QQL!)E9(k@9txNAc6DW5L?wz2&J za@&|pMx-r0sBW}DiV!h)nw=D)rw@OAr1JUi-<)Xz_TPPYQnl$@W$Xle7C69giDEy0 zRxiV3LGQAF3&&c>j~Wg=Ql7OE|2-Mw>4Z;1_R~b@<8y8SDDUpr;Y1N|hTFs)&*9h{ zBfuSMR1EuYLZJ?06Qz#_#22w2kx5RXNxXq>U8lywuKLp1+?VHNaAS!{?frGLnZC7}+(n;#I(Z+K#mR`q z03gmUnXY*=*xMVRkku-s(`XCCQ>9eeAQVs|^^zHmCx>1Gyae-2ljm{?D*XP_Szba% z{P}9vqNrzn_b5eNH>VJASWH%xV@7Lhk=>S=SCbe_cZk5-+dAY9%{@a-`Of)XzzQJo zRvAtRmLrly`pmH_@J3xiQ+4QTc(|}5zZzuaru42bhP8KEF$(XsN9s)uK|a;4W$0y1#xWN&!eCb~;L;W^|d)9jg z5BE+up+mTQ{^nHRJ`+c!a%DZea%&`(DisxWZF6b~%NGh#$rW%^uE4@H++o9Dj-PPY z=AjS^Ob#Vb9SuZ%zPTI4lNpU(AcvWHf4wK}4@C>G?|=1sOx!-q;iKOpTZ^wLefl#) z<)QQBadmeyGIUK3H*z9tRGN)Bhy~S5ZrJQ`ReL|s?5JF-0)&koAx)U|m|HDQg|t{l zP2N`^O1=W}NoH%_{1y&?-oF03#LDAxj0s9`%+F|oJaR-Fn8C9z-jYBE62>4P%kYd` zQ034JQ$!P}FE~?*4K(l}kJE-(HO7@%`d~aBx*YOG_C^wc-X3K=RB6fAZakz6njx>; znc+BeGN<@+xrswIZc=4T#%3{to7@onhOkg!cR5^&UCWx%cyN5ax501PE!ojIT&0Mj z`w&5_hGih?0IKuQ4e;TA#TW4Ax;U(?+B!%|jawV^P#@8@Le)ka>(=p0ubnk+%D0~|f zBJNVR^s~MrgtWY`ZBnjbgaHz>qqLiDv0x87zj1OV_vy^U07Q*YY<0D!PLKT|b`a^s z*w0*QLjvec_%G24P;CXBUcu~`^@iJYwI%k=zOPOXqF92KwllxbTY7Z1#{r7JV z3+_DL+w~lbD22}Q!sR&QDKY9{7gatX=J(xXyE{(eaIVcZ)$=}IsguZJ zEHQUf$RfOy8Xa{TO~@O5P#<5+UR#yHVa0fRIG1+!mL7uMuR7;APz2wSDrr0tG-R8~ z#I8QFCj*EKLm58CHyA8&hBZD!Dce?9Anv5n4CV-a7YUR38ZOf7T}tf)k3%zb=;Cz% zA#pv6*ozL;{WAtN=`R&{)VK84hw{vVG^qVi11XYPRn@cF^eiQ_&wxMA zc9Cf>i=^iVbus*f9O7%F-l6tj0Rn)X1n@7f?tyN92B6<>kP8hRfgT7rD}QLLUFc)o z&eui9cy9|u2NUa5;8)^ziZc1!{52|83QxaaK76|N43E)Gi-G8+dK0fq=a@`p#|-_< z$(Y2bp(UC2el%m2-f4}s_FAiK|GIC3)(Dlcq4aq?+x71a_wmJw&~mMDF{$KQmL8Gi zyE-`885cED@;c7H@M*ZE=BMPC?3 zz4xPIRvtvKyunA*!AKZ2ygWg-q%~(Sh>;mOhtJd(j|XEJl5S_KXdh4C7`LZf{ppOH*-KgJXWq|WKyTgy+Fj1hwZy--eF@&O~s^H!?HoA2~5ASNvGynrt`#m zN2us!4v)zV&v29JjBA-%XS33NZ@N5%I>g5rVkPLI0CX^du6di4r8IAN%Q?45zngFc z73%bf0R0XR*%g$`8uP_sj?rQWB7C!EZ1o4_Ly!ZiH@YVY|4hZPHFj##MDqvOzPYim0^TWclN2YF4{Afkl(A-vwE#=5URR$d;jEe^)B zpa?_w&Hp}x%@!K@Shl@jx4)zNaFUX&j7HkzFk0{}4+Cy<7aOVejK$v?4Dhy@lW&ie zd{q;G_w_=vcAu&~E5Fe^$ zAAhz~oWH83AUc6?1BI#kpCG)JQO&wRA+`)-6Y`h4rISQ zSr7X@Fze)vng*e~;_3;vDgIRLA!|O+1FScT;oLJLuuf9@r*Cp)zIe)lF}pD6uocH{ z3Tbl{5u38z<4UaS@1|NW2)_QBI#Uu4#tK7Poc_21@m@xdT(sfMIz;L5u8okukb3o8K#1L9au>Lq;9wJ8y^WelaEabS!mB z0?uWi+iZm3kyNSxa+igyX5(eU-d?cUd!;f$Nq)58REc1Q#~jwHV!!d(fYW21lf(%) zN`@C0R0LtmCX$IlsB~8_ih5EM>8=IGE}y59D_8zjjfN2Ty|-H}Fm655ehmNOo%Dv_ zFOo?nCM;8_LnKRWP8CS9CB9Z~{eV=E{JY-HE0Xwl_?iB8P(DYJkmHj|b>;n1UimTk zYCN~$UbB#T7t@dQ!g~CF14b2N$vID!dP}=33yEr(FXC*qcpGIFQ*jbwP?%35~NZ_ zu=j3Ja{M@lM~1HIYhJnrm3+8;Uu)R+qLSDXZQa|9o~>>4O56H~9Y#|m-tsiZxI_$%ollR<;9)%!K~AjzJRn#JwctU&r=Ls|z60jK!DF+F6VPAM}DT9c8n^ZP#xLW)7HC!oK&H+P%N2ft+S(sHZxp zWdF&XIs^~8`^y81{IgYA*Q7$i*H2hiqryYz6o%%BIn>canUKjk@0UC>o*Mm|pKz0F zrmv*{;$(j$J&tJSM6)rItE3VRkFHY!JN$A4@MvSc$^bLAO=u^yo{Ns99EI_?@pepX zTKWuH@{z(o_n;R?6$Jd+B;&-mw*?<>3SB#4E#~I|cs(Q2>u`wqnZs8w53&V00zNc) zEzbGgV((rTo8a<$?6<>7bTqQb^de~Ry^OejrHYM!&saNsVG_E+QZZ;`!PxOK@UohT zaXr&m7V)dQkI6+R3&Oezj_X&>f%1DaaZJPofR+7+6&0K|n^HR&#wYJR2iYFSbrr3a z;b)sroMHdnd%R(3i}$x@rtSkUg-qQR=dhQT7pQ%=jSe3g)grlkU9oq_;qEqWrw7&q zz|&h0ys4C&#rE~}X6HGkV8gyM_v+!L@y;NtFouL6&{>zo`N)jWWY2@ziWced>S>_I zQ2=&Cdi!I}%n_iH{$feHp+@AMYKik$beu69QPSe4Cxc2=^iVlP9MR@G&~wG3vZ(Zp zMp1yVl;BEe+9$BY`F+y^D)Qz16*C|k@bd9VLk!Ps#x+ls`)q!7m?l(Rs05IjH1wA| z*tfSnU2S%9K3!&S@qO>;%1_vt+A{i#iYk=BX;<`Nvb>MBB4NG?Op_|TcSkyN4-wy} zwDie_?^s%-lK=*eM;=c?rq=IHS4ySgNKG9Ok#5JdGJ>DXsK-zhMfVEXO56C5mv+d2 zTkt*V>BMne?;UljUk$liT3ZpULh{8UBvOF^voNZfTz5YMXt|ujk zRU@<-{K)}kT;qQE-EyU&vIaBZqu#M>K*q&)f15f41$IZ$Bg{_{UMlPFQXK}fbOJ?$ zK397@!EE_QjsJ7PCKEVyoL>ymyMUi-7mqYR8|?%Ewd%?YD_i=XqW*TYM5zb#{FCre zL|<@M2?PPUTz^@mh|V?5fo!Q4`R8fHMML&=kEX1`JxiPs0B4j z{F&gYDm6?G);&ESW~Nw?XxYn%fqD$fQlK~!uqg` zO+c688;M?glrwuuu(yYght|00IE)eZQA)zW(Bseyu%^^o)uY6&WR2ZwUa8&l7WRr& z{iC=uhB=eWg6h( zfLB;e5DjycL9MQ?_K~7%N&?ZyBqm#2P7eRXk(qM-A#g#o?EH_Xg_4BCWWmC{sn0;= zjl(#Yfi}0XH9%G9Hm z#eW-=K~*G!bvRAr2)Z4fXR}dTGlTvjdxJGz34$atlTuA}2xtmaOGk5N9eFhhLti+< zd%WZot=%q9L0Y2B> ze31s5-{lJ1I^5td?W`FNAv4t)0qL;}0l*9Ozv1Q5-XMjG%STefji$3lfZ$cK^Y!lY zRzE3^kmhFS^z;2WnM|K0Zy8h%1-O~gp|Rn|*R7EWd6d$=n!t`%sHyxPfs{cZ%64sR z7-;PqkLl%!eCiD%pk{a2?)&({Hq3F{GL|~Tyfj$xWD5N^k+l|=x~lKwiNVuO-9JCg zHanTA$Kk?VX=bSDL-;Lx@~&V-`%>z!4NhG`t6o+zA!L@`CUyAXlA-d-<SNtfdWHlUNFe#FdkWdbmno1bJmB7Cq^4`aBI1-QzXK+^gEp^v+(0}_S zrfoo4V5FW$jHjZxQZE6)wSGV^i2-zYeS1FNE=0lRw{NM8{|}k|i7*b#(AD1C7nCM8 z>qX{bvue~U4mjN=dw-B@q*MU%s&44%=~)aX(m+h3QyuxAeB7QHXyxc`C_HxR<>JYu16AHP zy8{%QmL-onJ%3k2sUi404{Pqdi9)0>>iyGgm_eG=`cVzT-l34m6J-HRx8+-Z(CsyX z1b)CrPJ=oW9@vqSlS3Bq?KI>6)~==;>h1A>xVUF@0VmipubK&s{Y(x$mEWsDD+NNJ zcd5i?r9mW&%V}TE?4)JcKpjFGPV7^V05qg;g3{j<2A$+8gU%|#9DGm?v=7Vg{q!in z=xzUA>;#C*&lJg@E@!hcYm&HS8YSnu5exdh$u%ivCGof%i`9PbM^6oaK_5hA!?R<0ME`K_U2LUZ_ha`PE5p&XsG{`#ig*bJ(QU zx#+EI^he;Rg05JiTp;nWiDA)Il^`H*cF^!wQbo$v@{UlYjcs~nH zxg54b#ZeNUnw<_fG}Pq(Kgm^=f$&?hSg0c0Don3?F6$YZZ?xNhhiO)}jGyfmvw)-5 zZHoOkA!aC^!fDxIyRpD-qvNB0m+Q=8W}-z;-EWe>IOc0u2-HiY6DSjzjYPIEV2~TP zcol$$4B!X6?^x{zBNh@Mxb~z~D?wE+*NF1F1=3!N79$JxoNsiZ$SaA0AW;rt9I=@U z2P795EUtEkphgXE-Sc(7T5A1=HTh*wyQz=kRilFhrCd+Sw+c}$J3Vl>pc_(&A>z*j z#J)b=VvKWv`sn1wSQ!TOl^j+5i`y=%W`P9Ka+3oYyX|VKJ-XsYP;(-Jo)ewh1uz_Z z*i2^QnIv|0cC=bGx!X2eyrOd=8%t))$M=F|)Hf`u9|zbj)*7nxn6mj9~U(lq+attoCGh*ZzkZd zS#lq-%=9b`2LB4`=#^^!_c}MM3uOYmm#x4}Y~6s?)>h2o#D>EVEV@aE{wL|NBXO6$znswKAa9mxz-|TE%@5eIkNlW%WhCmu@RtkGh zOI3?iuJ^~tN~l(?#mKtwpU}p@IW6Bo%$O+X3%I(t$OYNCrheH-vPH-hGi#Jtv_Fnn z+9ZCDVPt1#B3#*AR`c{_`t3a3!kidnU9ij$kziz-wy;eF%*1@(2b<0~RM&j@d|xhM zT#lyuZJ@Q=+#Ns&oyOL=!x6CUF9rv-sw`??L{MP_l4T+G;ih+gmt@!s3UDDR@`(F! z&qB8VPd8z~D8!7POzpF;$2d2*^6?r=F@CCK{xJLwrHcjbHa)4yY`a)P^0Ac-y7W+V zAg0p8@V}8@!#0&O6OS4p`81~HE1RNrbabfH+JO4jmVF=8O3LGz+!mmG#mx^j=&%IB z7^6X)(NDsFfvTklL}n6q&N`tlQFt4j-~4&%o@LbNLv)(-(9u0wdt1mRxRT-#%hf@Vt+;hQ zK*gN(y{97ekRrt#M)q4Ky_Q1tBwZA;O=c*=ecXxI5+M*AB~aFmXYNFOCB$;H8 zk>n%GFCoEUMeq|aznv)W$EzWnBn&DArEETrigG_E41^mG^d=q%`|!_H3Iv+xMS8F0 z+P`TlwSR}>bK25#Ql6GYBCtaIyMPK}oBLxKYGrCP_^hUpItbU`H0v3VkdRrSjGX>8FpuJI()i~IXxu`u*zl@x+yoYaz)4j*2Az)LDL z3XvSKfVaK5m##-2Sr^1>=z(zIAvkux$D5WQ*aIS2njf^bc1g`D zC!);Fv>_yZ7&+bD-5>rxC&{wyqL@^l25(k1x7)+BfMJUCbk zlKR2;wz*#ttb|6)>R0JJR zM1$1-K=Ep%|1PBiC^8HQ9!uOs4-hc7c?OaDAh87q7C}(-znz;REW|MCW|r|7>{l1uK|<<%ZVCJF_$bYa1F8(i-&Ncd zg4|B~iQ}9F!<50je!Jm>!9r@-hmdO4ZDTotIUr9Wfkms9TdbJFgJ@O7wT)`%59l*G zpJovBxC%U;Efqz;VJz$oLBWWgXR!zYL%8|f8*epDSRqS>Yf2M@VIcnx*fk`&pZ*S|m21bMrcAYy%%D>uzwnI^5%JI6>(~ z>Iv=mypQUabp~1#F+3+;OZxAF(ej`*EvV9Kod${IIcWk@C{hA&?8A^>hKG}RA7X)K z_JjY;Awo#`Ay~*>Vco&fNx(?-&)3_JHhkZKzHg5q!^sTg-_~^F1V9W?9Rst`j18fz zo{PeW$*8MElu@Nz0PO=}43KU*)*jtj|F`nR@SyTrn294zkzT1;*U0vS^1vXjSwSct zo%q_=I1`KG4WgFWMmvM2>j}Zr%IFbRh;))J2p=D6ubV@XoMPr;q)vy&tG$_tF1I*z z@cGG@MC+N38MBFOAgOq`l8_J>sMVr_9+yQcG|8+EPrAD~8H2k(CaEA&Ro8fOCvbW^ zix+4!+4=S~qJw+Z{okJTcCRClqPQx6;vJ|n9m}VXO_r+O!J^YB1OagC zL6?VG95T2!*I?9V&gom75#)ohj1&+hi>jBYnS}y$pCeJzP{YM^t(okBd#PCQ^ zPfA?hL3E7dAA!R(eY(;J^s&@D$zXj>pjIY*+KCY?oZzR19*7(wr8L`~u)&iA`N14! z&a@k}t|KSvltvyN?>ioy20aZypG0^%$YKmY_^^K=h*pC7`SWLfeQ*Z^ph~wH_OnA0o#qGX ztAgBf5_!kh|4Zf9d!U$#wyF$vG#AvAveS}t4%i@5Yf-1arXn!Hj86q>joXN zbm~l_>an7BIG*oLjg2~Xa+BGOaq2;ie44T`kD1t_#$uokwh10Wc?kq1D8I}m7=xZf zgAwyUC5caY&Hta0%Eg129JQOw^`A`#T?JVK1qG$lJ8;HPF4C|33z!qpr0wZsUO>4s zP0uq6$iSrYxX|jgx-#@U_YfL>G&BIYEBS4{QfF@{9kdYX6QiY!5g#gs-ily`#XQ{Y zd_C);yT;?%)Pi$^g~6dR7*@!<(_v?T*;UA>I@3)YX=?j9R18GxPlsM!UL#Qx@L04` zc_JX|a?5%__+ONUR1nstgKU1x8DQX+zkUqKnQdcAbcMl!EP)cB6DXH99ah=ms(LgH zEC87_70{9Zzsl8{PwBSyuJSfYfG)pPha=MLsBjd;iJiPUw)N0+IxeW z#jt$u`_d0rrHAEcRE|om-^K+J+O%?M1l*1nFfzDmT%@FEAUM^!VKo^h4|)QTIXOYC z>G%KItX>36+Y#wAN8ty6oG#&mCykxqf(I3lB7$c&1dly{5J^IdSoil9qh8A-NO+mQ zy*ySei=Sy?3WI`6X2GX41*s--A4`Q)=I&o2nIk43@a`C?>2V-@yg9;%!e#k+JXcOd zxY=VJSX^AZgTI?DPdZty$;AJ6r!TBGI#fQt9}X=Dgy~UaD0y%CMykFbBYZXC&KPa- zUySsUn;?jzSgbQK>aZBy#J%4eNhxBrhbP+`w^Tlc4fuVEV&N_5rYxTnGd!{=9BysDF)5 zH#!Y0_j(zrRQpIK^TiR4Fg1_B6=Y|t4Gfz1=*TwFVQYjo*gkLa5tyQxj-`w5490L~ z#i{-qC9c0cYL~Jb_3CPiO9cD%m|;JJ59_9Vd@q`xp^`kS>8RnUH~SapEs&^^uH$9C z9_fP>!vqO~M&w5}i)pF6HxLv_uC=(3iFU@!&kZzZ1qrcrmoSZ6My@z8Ldd2t0u2C< z;%BkF0N#~aC&srT?dPo!V%TU&0g$tYV74>CmBS& zG^V4eH!qJ)7Oj~!ujzv^s=r0SAdXRp1*FF2KyF$YRJlhW}^JycLu*-H| zSSd(SPv6wbI?o63ULMcU_1JNMte=W8F?@+!RRpL+^inuE?h#w#vUptbL1-$|?XceF zVN(@>U>VaDhCx+`ja{G1>wG8#s^#LlDEp{LKP*^!gAQHKrooX$5qI~UUOa`2g-RVs z?-og6%A4@9CQz#=gTUVWPb|q-@aVzog9*jg=lhh@;Qf8ne@%dzSl7gaB0T1o#9$7A z(4fbCv!0n^Mc_1oTwsqgbzrGdpfYT6%>C&~@#<9)nmsjylDq#96?Hol42HGP>(~D1b1Qri7B=7P@>dzU7|Y2s1K2br6U=I zPr*JhcSOJu4YsRxae~35&qt#e39>??ut8fO^)mCzWW-%`hRazY=0kmi=w?7)I!2^K z3`BiCQ4dYgflc^$e!M%B(AVS5@2*}2Q&a+XkGd}^ z+X<@XV{&9)aj+BmdEG^RA~y3_J{!nE5fJVGrwSymmBq7Z{-uXN6hl7Q+D8P*IL&H( z6PTv0Q3P{MjY{pLFJOVc{IyeK5(4bohWcQ+5d3p4k%GN8fXWOTp&_Ew+|(p=>oYSIeS|KR-VbK*ZmB;-Lw1c z{)oMpN{J}^Xp2R;N-l_qtSJyV&VYDi*MWx~0u?boCwz#wEs=~!vu|swYL!ltLcclx zTQ6H*>CBu_p?~7n7T(wQs69z!)k~>5pn$Q^}Zc z)#KXg|A7zAMHKW1MeweP!S=~P1ep>u6&GBR?Ba4ql7^h^t`homuEXc~7lt&M9Ik*j zR}>y=uwRb01?d13g5vAHVbo%>F zFXTUK63+l9`H^o3fYA6r`kF6xcQ)ni>7EwCSajMzb8eA|s8#{!I-WP{o-~-;~ko`y7iPK)O_k>=6 zErW;(q=jTbNx+4>wnYO|F9rXW$tddYs?VzdGe*>tFuN2U(ujoIYFF$lnS#9-xf^Oa zV^`pML^tsr(*KN2;Dg4!e2S9nOooEtmQ3{LEH!fZj-CTSi@*F*+L>S%Gy&GyLa^>i zVrY}XymJ8Yx}_yMF)_ax)m9M-VF<^q^T8B3HKg(;foE^zMp)Np5B}eLFSE_qY*zAe zi_1<9%|H1_KUjt%CbNSYBoupv7Nd9nf@tnL^s5NG!BieyUthmEsarw|Hpu5Chr^bG<@xMOZE9uAv?zAUj{5xC7Cx4 zQiGiL_v+cSc0A&HKL1lgS;+7g`7=y3g=|Ven3KsDt|PDvXHy^^O(yC?7pg~#(v3J% zZT@To=TN=rRKdqoj+*#3>senKr2>AAq)`Jd2yjs&t+i)_$#%azHg)#{bz1W{~Twvh+&w`6LL@7<2|q!Xj^kVlOkdSD8JKEZJZp ztww=CK#17|#NJjELVo1KV7Ez1803K9d$~pj=bBVnUgw#LOa*%fST-R(dJK0#2MaQJ z58-vd;m&GVuQZ7;*;_~_geOI`84hC|(d;ZIk%F0Kl*I9;pG^)FbjaZrgQPhM{>=fX zpSs!LTn$mBMp7$qK4l`#@lfG-q|$BDX8a!lv(bkn_B~x|Z%D}9KdL>-g%Sq2A#$bS^WI;pa=P4@ zt8YVo2Nrx-JaX`PAw~K9=z z6|1tPCo1B6q$H7VGJxf*G3HV()lgnEbWo_anv>q@3xy@33c4aLp_kquov1NYG)*!Y zO=453F#(ts111;s=wHBkivOSf5FP|mZ)V*~7~&e4MAXFoWOnYAg9!o+-u@}OQ)&O7 zXe%aLpFJA$J@Zh8Ic!1*lzkx`sE@i};x~DFeKC;sCT(%cGIIk1)d9FBD-^(K?h-$z zktpiuLE?LVfPB0U-Au;HZy^pbszUUBZ@aA>z5~s;Y)ie4z7`1|A79rUBN$8HdtTkE zn{k=c@M0K4m0EO?E+}rUt^lxcFa?`kyLi0C!7z``4lB2Ae?-%pAabP~8-d`baU7hF z#>Da!{9cQ-j_3kZh@~bJN2mkoeC;<%@BU+TPM47=40K^(xZ&e?^})+*J@~^KuS>ta9%M@3 z2i8GbPC`oabqhtyvF^l|zay3c6>!iSz~_sAXM%RG7Y)wokP-dOwq^zhFwDnGR?I`5 zPG$!jIkBSMAW&}U7$NY&t>b;lN4$XUWlPvsPVNg9?zRgq(>TGv=9+%LTuw1xb`V?f zc!*3kMa{=M)ja1=By_eJ)b~Gu68Hp^f1alimbC_BV48N=)()jeQb#65)|kvhjD zvr?zadjmePg%zCbXeyU9cMU#26U+U-T)g{o->*7WEB3j2iB-G4x7@5bB~pLCjpVnf z?y+F1?1|ljqwBI8JAc{6jtTrtZsSh__uRoIZJVvIZBa4Ni2LE+6t2Wav4wbxuM**k zhiP@m%k9Ex|E3#rwhKgV@ThL28l-dr;ee>6+fPqt?K@m1{b2+13b%I28TAAhBeE2*Vw z!-CPx{ii_Li0Xm>?HkCAA;T4l%U(B!dLDPTyOo55Q98>9q1|}qr0_`i*Z)0qSB4Dh z*&$~>uV<>AXpTx>&|i68e`{2cit=@0XvSB?bNSN~8P!98HsTVvI9McDSrbj~%s3Wz zOA_8-dVbs;2teEd*UcegsmQM)FqB_WtP$1eCV&r@Ad+;#$kSwoZWiq>{3WUXE^Czr;q65k}(mYp{e{}W0+0)W$c#Ly%fAigJ=};_*(-uFK3+N3OPbb#?yc|lSLM4{WZk_q#3VX1sHyHEV5G{w* zU<_$GM%vy$WVZ>Sv8djaearm$e3K&{=14+}9a*qM__KDjvmJ5}s#d*~UZ~P6#Liv$ za&|eG2g6*Xx^{<1M!aq!1EtiX;F7E5Z5|&(#E5>{uIRTN zwyAd#v9)9V`uYo&_Tb-LA19!{Zar+JUG+zLcw#>XrnNkZ<3#n$JdIMfGa4?^w6iSZ zSlGs z^M9B&jq{z^iLFqOZS2R~4zd@ZeK-v@w(k9IWf4SxKD5HwgNg6p{P--C(t04-dRXk! z$SF&}E?r-bd{Xs-MZb}YLaj-% z7_QiSTs$N(6bRn%KPIn*9~K>7$U~D^V>N2cb}G`u&(=H7Ok-eAp4Z+IM9k-`b5@pK zW4TI!BS})jDkT_U_Qrs)wviH;)#ZI79a^GO0yEFKT?ha$Y>(T5pO?peuhywi(@o_Ir5p1Cy!{U zCfmGijvCn3!s}sp@GHW{ zo07(>gEji4oDc5P6`dqr&=V?WUVlvH(mXf!b$^->*GvT<98*HhV|Rxf?3OOoJhWR@ z9lLZIn^c_fx%{mw(I%*htkwk?;d0qBm;P*$hgo3R*VQ@h8$UxG)ozJtE7XdH+a5Qj z3m$CnrJhoFsw*{_YM5jm@9Y*U5S-DdFj4bW8&>z z%ENSRKcmCpfY)Gm6Jqj|fbJWi2h_{66p==S3l2}4d#XPIkqpb;NOlM1T`q-~ygUlI zWMbIk>(n1nIBuEAh>h%ht#j-oCS9LGI;8M`(b3aXuF2cd|X{unf zoI|bDEb3?qT`Q7&J6&pQO`}~`b4|kJw246yu|_+bj+wOm=`(UREw5@}AQN=8`{V~3E@u8XDecBuM59;hcGG*#{DF4gS3 z4vZbbJV;GIXUev}oW?oi(y8DcQZ6;yiFodVn9o_D+O-fyJ>JHmk4fKL<`N8O-p*w2 zZB04?GvZUd@&Ojd1bwfHBHBe9%=8r(;Rm- zxbVX=@+=8sU#Ma3CI6Pybcl6vxi9%LVHm}PqE)aChzSXA4%(OEhsoOOAEjD55mS2t!P_*wD_#CIZNEHc zbB(ugINhq9L=?#YxH-JpH-C?@^eiJ8+)3b4onp}T;6XmpTXfwF_IR?$LQA#6VvT8m zu4k%~XR-?Ywvo4m^i6tURfUXSQ~lX8yq= zXB|4_M~bPgA1t|j_l@w_u_X#7o;r8z)E)jAgzP;kbn5)w0SGx>o?e;1e`7u8Xc;XhP&7zq*RI#LugJ zEZ1e|kFeVrA(1)hz(IrAwaduVZq$PsN~O);A4Zf+Vh!Y;$&7(Q<{wYv%RkiP6|yIy zl$VSt7G^OX&t}e*JhY^u+L=~OnRhu~_g?-B=;tCufG)6ERUscW##N!G?+rDyOLP=< zUT#9v;c76$JyaU_bGbc6&wlWX&;Dz-xH|(;v6AHhH_tZgy{C@?>9PXv-L>)2xXgV- zHK3X$=cDl@TMhsk+U1qwi;nWmSPI{WD&{#75@&RI9fIGU4}HOcN?+o8WiVp8OvZ|t9t#mg#3=zn zOXh;zbt<7|%xw?#GJ?J>U*txueNni?eidmJ=Z&y9ZC6BG?n3MidEHs+Cvn_3FE)8n z&S2rbzQH2Cq^)oUD8*9&zWVUv`XWNfhaM{LunG7;D%`(HCaeMq3@-G#2-R3!lbJ=} z0&!{%1PWVPwr^&N=Nul7f8eZ=*W4k)+OuUWIiD)n*i>-D+Gwugz3y#n2!!@f1PG2M zv0@mB?uwr{!d#I|ThG>1M&a9?tQLPC)vi&p;{5>1h2K>G*d7XyaFA(m1MBSYc9SR^ zX<8ec&sK-sua#vA#5%NwhR-E?vRIQjRX_$>L6NS=y#KT6T-Vs^fbs18?7G3RGL6d7ta zGKhAppsYJG>Tw+IJBB|Trg=Ed7Jvf+-t@)EMQftJTk8~mR8`YvbFBd!4%&S<@8NKJ zHJHezMzh9N#Mxvph_-k=uAp%vq!N#^+x~Q)IL6~5BS6IK7o5rF+FeQ)W%w79lv9gH zEv2qho4mE(e8v+dxH21?P`O-1#B864!$Zxa5j)~`fe6O_+k{8J=soUNg2hc@A%V(G zR87-Q8cT4>e~6tyoJES&pDkA^qm#VWqLNsxGs%)$lW5_SPZz3P(T~TwS&^g%Jt%!w z;m9!r-G!L3^0&W9OA*)1hN4QtdsiG>Jl^0vKyNr6Vez4`!-YiV8*`f`iAo6Z>BxwJQ&a$eRagcQIt+If5$&0owOuCYn^4Am4}C66e`%M=T?a zx~tTAejItyU^Qp6fwedlM;7f`!Kpeo{9e^1x9;38-UZ$t%H2_ijm1jAiG8th`A^5)^^rfGlHQPM(d*uiq?)}n zrd&OZhSvV?zcuLF1^p;ea?Y@{^Hw%j6Ma)t5`CQ8UltW%#%oQv+^+W(&hb_`%#=z6 z@B9*@+f`nLFo)t|edfs|&_I8`ZRK_^Asm3D0vZaS^IS1}V86gTRvS$wY5+E4j|M8y zsZ>f5SgmIfnvUGnlRCVk)#kO4!@FpoQYXybRHtvkD~yp@=z~PPTy7Sl(|#yYsJFPs z%PR0AlCb%nOxOfye~=PCI5OK%a{!Wh1#0n_zOWb}e+mD7h~~_HgWmNLyMoa>mp7!u8r* zg$blI`h@5gYm8c}Day$`?R#r0?M*j|*I!tYSo*IE(WUzG#=1R1?~T()?~8W71>k%X zu%W|?4_D0wQqo}Va@+or-1jotu-WHZ(L7%&(Fv9&#E!H`*-qh4BQV^U%X#K z*75mfpSot4N^sFlXk{^rRfmZ+o0nd}SE z66M(wAJc1>g|PA|X8u$^pu%2!AU28I8;R7K2c%P4Hu3>a<%Imhvp8%wQKY-RWFHCI ztQE@vsbl;p>M;c2M{P|W++BKNMUaSijFj+}eyU^mCgPgJGip{2<;X9qr5^_tzsXqo z$UoP63+-PgR{M?yVp(!cU~SNTzsd zWHNa^tM@0wTar&+EDy#eqR_Z6p?=*9>h{{@@ z9S`*imqLf*;Arf)2=c4hD7UWRKOn4bXylyE*c8eUvGfx4vywr)RTnK+OME42s8C#X z-_`cH!~i&Jy4|V7^0KQDP*nM@%a~~hzmnMRIi9y0z zf#=3vc4nyX_1B^-I#X?`qLzbWcPoFKRd30X=I#mS z(P@%g!~T@|rQsS*%k|kmt?gA@-+49HopBXp`R1&oYI07?n7WEvOBJb)v! z;*?9J$zWjrtyAyeV2&`o3a|$viS_vGOB0$x%3>@#Gn~7#jKbE-@wFCR;O)w zSF;bdkC_i^O;&G8+7kNNH=9@)B7&q_)YNk>4!xSo|qFl0s)^*^M>-} z;=`~;lSRNLBuCGXMxnKDH0K=e%Ws5!gCa%_tq(M+c{PB54(5v^U_rKIZqW7JWv|2D zBKaY`?8bAwCFM$+d%T;|ncgKb9)v%u{-N*zaidrC85M9+;d=W(QKQ++^>4V}aJ;7p zX!mV9A&h{JBp8{HJxZg-wES+*{v_#IsKRzsvdQg)6O-dqXb8nf{4Jkjwj|~d=r741gl5dlJIy+a%n^w#jviNz^3d5z_V{>8LpjuVcFRQr zEdkQT{|1ey+9)981L-;D|L8<&tWZ0uEkD$n_rWyCtI?^3$jpr^Zybhd;M}wz5NLk_$bhMEebOpzU(EzxCRAU z3Qyk;smNb*>Q$bULoQ0Br6$1exf9T|8vIpsg?q$KQCrB@{al~co<0993$Rg>SvOHl z5ls7do_OlD!Y?1+cyUY+J5W%KSk_~Vl@ITc21#8n+w7Kqp5a@WJ$V4iXEO!K>sS^| z?F8>Bo+p3s5mJ}0A0s$WoPamw)8=gfUH(HUdpf7p$p2oFa74b`M^Xr^QV? z|Fl#aMLrC}k6QTY9K8-TMmv~{BXK$!@U65tMK0D`(nn_=gf$VaHi@oH7v^HXHYU*) z8~B{KC-_K2Q`Dl7Lk)fR91B>Ervpge!rxF|KW|v#F1MGrw0hh^%6#Eckccv}D*FY~ zONhJE@$q&|paS~sd{&vW${IVB*Ns06*~o$4U;mIY1^#K}HrDj;Z4=(o^*mRonf-9z zrrQRKE90!(VQc6|BMyqy$3F-aK%mQ+>}9J%+*m3H-6*lHzA(x9@5;Vl>~M-uJo@g2 z@6WWFO)+!|c}fyLpu>okX&)MFM~hJU8*KVo^bQ2w?9M))EIp*J-{34(8h+}GQFJjl zNI@(ol$!cprX}N8)mKSYJmczOS%b@5l&TDKJy%-SmLUMUOB+ecb5*lh{4x0<4pj$I z>Af|P_8(hW^mxF@I&js`vxoft(QH_+!@iSe4`SH)28eh{wH8`PxS7aeTwuewm%Qlu z`1q-m^UBvvNnEUzCNExV=qu!2^xdkevmE2H;`U2z6@xWvB*X^Lh4pAc2)FVjY|>)2 zi+ili3hHLc3eMY0FFZjIgiF5)_gDT*0oOt8QzL_R(qXXz?$s7w8*5`C{l(2K$n?#K#kf#^K46TELrSytTS#aOTx1Y%3#98d zaZM+-3Sqi9^F@5o`2^kYtqtx@SF%516&jeiF82r_y!}0HuA+qWv~|<#eFoQD?9acP zxH#tIJl_Sk%cvoE4s*+145Xk(XDHQ;TIInX z`qkp#2lnXeT0NH3yS8&dPm{~#L4{~(%k%-NyDsP62h zVu-vz<8LXmVJnW~Od6}*vgdJO4>wbGo|rw_ zZWzM7%w!R!VrMNmC4*ZEbfg?4Z;b)vy{3N{6^c>kww$#AN1KJ$hmNx{bmG@gawp`@ zGZWwaq@s7}b4K3^(fbpJzHWJzuVtX^&`2zu&L;i&rt%GP;@^4T2wwoJhOWK zM{Jt@D>f_IZN-!m;Z)T$3x2cQzT4Hvd^y`)WU>|{bVScWkS zqFmhM2e@bK$ufnzFvcfJ>rM4u=p6drcwRhjscUHq?bF=07Bq1yPmpS9W0QuAB!p$) z@-paEpG~jBxTdqzXf!;YQK4F1#AB=clF*nJ8$OZNt`|0&?I-(q_C`U)a8!;JmKSpW z4fwS7$Gz_TQIeyE)f|@F^RWMSjVCU&`I<#=p?JWQh>;iFSCf`3D)=g8##?R5N}U;JNdl zPe3%?Si2sGHC&>Ma3wprlh%HSK&a^L{o*pF_)0a+%WX-!67-#Umy z?j~m*<+liAFGkWfkbP9Pbyh1MskjXA%<-*2_B5vpaH`0|g0)Lgn>jRrKYSK(C$p0%Cg$w+*z}w@nL2(S~_oLATh>^AwABE@BFtB z!EJWKw`@>FQevTw#_&>2jdk2E$R|I6b*xIn>Y(9x5PIY0cW1XL_+-T}SZbK9TtXk{ zI2{k@#xPnFCb4hH(WunGIG)ajCDoe<84kzffsDtd!dBd=)TeT$%f}h7Ew}uy_b>F- z$Iqhs6@MZ6KB7~|Wv6pK%hd&6ywCG!luAWxelO(!K4lBFIX3L$Wu%>%d4#X-W!oWDJ=XK12_=Td40S7 z^$^h6fYsa@noNT%R@HyjhH-nsL-niVOV=+?2h*awNgpYPTA(fU`gi47oQwUnoqlU7 z$FBLVLaSq&WDjb{mpQ*%FDqT%0aT~j?vsu=1eTsY!5Y0aP{E`=9laiFdU!bUOu2S= zSqhIXD^Hb(;Dyz66Pul*`IF?hn^?W5um@&GX#4?4=gZ0Xk$vy3o#3pV--Nwd3`W1y|Li#RE<9 z)`=o=+?E}z9jOzXjV=!a?3ZC{KOAL7DWxgAv6FEeh|?mp?eDHYTw>?C2mN-R}+N?;7;s zGa6T>1jx&ycv8w@J3MRS(P-C&{KB<*Z$x&BhD9cSx!5{-R`DIg7$i;kVa*2*#3A9z z#@*}#V~~yy_IeN z*TE*}x^LlY7OfR1ZyKWi^l$35x&>SUh`qkrEg!4>@JK41*E6dqme#*Uvs9A28sf#y zP|_~}e<DPdxZ3U`A43k2x}O>sGjX>6bnfs~MT;9VwrI`lc`xeAZWI2b zD?Di_*QW6kUEmG?m1i^weN!K5Ew84)){H8y!ZTD0-F)!Q6vY*;`OXwAaW8}CH>;1UV;h#V3QC{hCW3<_>tXJBE zFo$Aedn+!^H+$i`U_T1^91y`gx!>VYMW3z!`K{O5V%hI>pMag4xiP$2oJD~8OzC!q zg#d$*EePwkWQYcf@iV?LAuJ@M$K10BY{U^1O&|L}%h@3D${oK9&4#fmNHMC zyBW6#d|S20ce*-%aMpTz2@?#;JA;JgC+cIHN^W!YaL^_SIMppm1*7fG{C-1 zJ;GnQKX@}!hDvD-=jOV(Iws8qSVK*1x84nk!A!1y&#3C>_7!`{T>{2Xxb0b2&2&sFj& z&gl6^z-J@^-I`VWh1P?4Zyq<(g_deKbY9zoXTM;Qizj5lC|!Ld=XT4fzi_+bL{WF! z2P_U}ubzdr>FhEZhoE9Haa@S{)8)*bK(xVY4_Eu6+;+E@AX%9H#vfJ2EKRN%ssOSk z+uat&>2D%z%eN(=hi(Yncc0c2PkvyVI3_PE(I|fHHppMqc1IH)mgC8!k57jOl2_(* z+m?jd#8@GkIvT`2m?0kKT_w5iCNf~Mi_o_DmnQ1}b5Suk^PylZ%fzgp74q9X57frH z*dJ!5%)n@D)-C5q-)`9?fycm`P5Tm5oJ|jB-m4mn3nE4zCqm@MP)=#N3+g*=kW%e^ zvhpXhEl?@TnJ#U)X@jp#0(%I{dpN&o*ygjzG4qet;sai|+fuTr!+E*Vf}af#O?y?% z7nLqAf67Np>>kpLdr>0?euzFa!#Ii5Z3yyE#X+_>Q%!UY^D2yC5UvZZId5}JW^9yZ zT=P^Yid4NXEsY}${Pol2d*61m8-%C$6Y0>ltV?RR^uZ_gwJgWIbU?Krbq?|CS+!h2 z^}NMz8$#UGHOAJj-Q8w}S*mAzlVIfZ1FaB0R+~B{x%Y(oTQ&<3Nag3D;h;~o$EPVK zx0gxkYLd{NTn?`!|6Po-2l(%d#VW#;QNrWhO$3FbQzG5mD;uYY4l~3vsHgZN+>e^X z4n~n9qMsccNQB}|XRF&|%kKnXQrYK)2tIj59Mk%~WW4u_5cGufA}Ze2@^-@A9G_qN z=}fVKBLkVtZ5D}9ZU@lFL?mY=>Qt<)4&t2nm#;sJ+e$#GDVzQX6R;mw77u*=mm6SP z#OpL&V-+a=%5Y@u-Ced`mu?baNPj9et})x@5YumPw^WAGW?|8`6p(2j`BbTEaGIE( zzVw``;=#5Cm(L6VzyrIVnvJ&$F2>w*tBnh>>*Gs7V)oMsN)3x6?Lb$g9VqHmHG0rls9TQkUPem%?aS>wutnQylHT#P$m z_R6GP>a${CG~iXIjhKNX2+LB;alx%jWp%3o)Y3?2QXdfa0sj&O#|8ixn*0W`5Xv5o z`$zPupuM3PS3zxfj3!&Xdk!xPnm!Qqf*YPkZCID9FW(^w^HJ9GCBJA=izY^^*KY*) z+^6Caj!&WQO9i$gGNvqfJe&GW6mgR{rB*I2*Gqmb+AjrBwLkA8j-m=4{`vliI?KXf+b(aF#N^16B36Pn0NRV3-a&zFwdq$~XfrzG{(qLg1453YwxHja+2Vn{-*< z!4ik7P4*&5F;{}3()83!6hv0SbiX7$ob>pF+4|U+=`7txD_miOJdr`F4r^{_xpZ-( zz$_Lpxqj5}Jf+@n8Cu6p-1dB+3p6S2z$Sv6g}d&Q(|!Imt3M93^LCC7{g_awUTN^L z_GI3#?IjbFTs(pwZVH=TOP0`*e(~_Lv7SlHXU$i4DvIVxG$1Kq;qO4M&a2etOfQccBX#6W zgTEbzT0ck{_bT}^8`*gFQb4uFb9Sd;wJ9XD7SZ)I+iS!C!)$I|iu9$?}6ICqCO zMAuUL?9NX_|z~I2n{bq<_;P#k6f_2ik2if-Wev1DE!_w z+^~$z?N$u}g}y3AX-a7|>+__pAs>-z&*1WNgu1v#?^m1+z339)MIM2I9iXCyc#PZd zc`q>wiv7dr#I{%H4L&C+&|fW-gp$slVy-)gR*)?p-;4QRVX388KXrhV5 zE4lW#+4cb_+26*;Md{Jo3EyT#AA|@JSJCjWGt{~mKZGeCAF0U0T>;hrBtN<6UWZ^i zdG`G}ShD9a090WvFg@r-e?8Iee0D`R8-js=U~scpK$DhMy`N z#qka7+U-p(w6wqXWK%h0`$)KTj|U=74Mrlod7)Y}aA%6dqj_NBsdLK_iJ}&U_ysrU z?#@?Jx7`ouQn_psP9J~erTnN0n6`Ub6j`jfJ&SO6%y5sFy?$&==agjh(79vR;JA}( z<=E*Prp?7yEXAFPp{j3adTgmRKIxHVniVL~jIAcm%s@^rIMUE=+>ITH`F)umD93`t zo$*O90glsY4-*k1ImZRkkv`sk_3!fn;#BRRHWVt@QI*`()z;YdqS?eb3{k%-MCWJ z-J?0&AEz!1zB`Iaz}x0*5A2_1v9yUE`I?XVWlYk@XPS3;YNVSzA)=t$wR|GKT&#gM z#>ZAz#qd&8H{3^sY-K`-nifuz?DnU7^@Ml{iC({39t;1_6<1Z5AYKK9aYh9W#LyQA z!6SS~L;y_It17djI4KWpUiL3ckd$}h-N4p%EHM^6I__~sv7r6SC28s{=V>NYTZSu= zt#Id`#n@*-l;1kh8Lp^|WKvyLR3D0?xeDj$XJAc>;RM_o*T$!?CfS|j!r{FE#hZl& zKVn8{4uegFxrn;xEpWe(azy&t{F1TRg+KA|V+aiOO*<-s|LElq2$*uIgaM)~?-2n7 zO&FrMOD9fg2^(9vP1{krI+ukHeQizht$%YDB@YPY=ax>J4=S5cHULFHy1xe+wUTeu zk|DERgBeZKROIQ0+EvPs;yaE=%Ayi=u8S#n#9We1!-mdhDKu&B=a^c6sMH6Xi5oIHq=)+s7S`UqZjBu=P9hEP0#UF&E zNiw__QdW9hV~Wc+w~91)pl(GEabl7EDTGX~LYj-YUf;%7bZYoW`sn z{hmGzd49(g#gP5=)yRA?NPyYeQ9QdAB*QIudoB>3VRSwuv64BtEZgykhCHX5NzFML zX1a$)TsP!jT4@MFaf{Ya@^jF+_~*s2LsrX87u|F(V&zh0xuj}p^_DO6T1=Eh-CbMt zpTKlxss(jhmI~YZ_(_+SDsi3+lG>bdmLmb}kB)Yx!lpL~5yaQ8o>2{YGJ!%v2PEWj zF6NXL?TMOav2HfCPA4tIPDKIM?J|C#-h7oVR0ei)TZ9Mf%HUR&lJwaKwTJD`m28F~ zJBDqCX_5%vToIb(@EHGsw*pJO}^vwj7*FEpLGR*T~TXe1{;gs(Bgq0VJ+EuBFddDpT z+VBW{^4c7);AkP+VWrra8b8sp+N5aN9h#c@^_k%WpgxqP@$BlepU#<5c^pbzz=oAVa5+ z^){41!R1DdDA0-+aBQf}8;vav5KMFp4^RzUzMd@e_ivtWpOO}tXxZo!6b2c}Q4**H zSy~}kzME8^1QlPh3Vyd;E($)kL(1gde-=vRkx5Z2V3cK9NA{^d=;HQ20}&5VvST{E zD)FDL3I(^Gjs!ev)IQL_@J>Amx24Mzg)SgK{o^O0g zZMTs~01b*>Yz3?c+ZkyuH`0%&?}#j5_M4t9nvQ(deCEj8tJ+w603--^OXVkZX>yI; z{3x7|1Vq=G?>SYPhoVb?a9tI#D%}y`u#gcfLIfMaN0$fqcbR;`NZbO+36!GGaQO zxxDUQ5&GZ{NN4QBuym>WYV(*JF#fohw`v}Gr2lan_D~dVeObQ7Cy&+ZY`m;CSs>Ag zp^$-WsA3NJ_{i4$N-z#Jw--szQxjiq0$SN_-nBtE)5NB5Jn-u!eSn~ta?9tULe34rpu#4zD4`$z{r}M!iK)}Zf-1yw0P8_BxRs<)T`|Z zUG)SfW%2_vCtitY!&GszOEv{sMCSWh$>vpjt$&XaT%v}}6~cxwv;TCF&G({5Lo4Nm zAs$I0Wqss>5zthvME&5#AdACqf5TOIga`0VZ5{7g$ZL)a2zYI=oxML@ZWSXRQqEdg zdd-E~8R9Hf&ptU`0si(6#}&h7(8^l=VXq*gEB2OuYe{XpIibib3NPv-KB7LNrAlsG zp30G$gAx|7DKx!U3;LPf94nWv#8^ICmg=oXiZ$$}7kfZhUQXEx;p0OZ%D;v$8scZT_c}6~ zFB6rYcU5$VL-v~s!~Qswvu#YKmRjIRWVtDuyL{#=qgPkEe+puyd zC;H32zN!mNir|>gbUX`LZqTg@tV2^rjHNLX3VgzV+yI!7B&gdyR@yk-OLACT$BgNh znu-lRU9M2#Hl487Vzck5!ao^IiMBF*%FM&q%q>;$9=d@reHn){>wuY(NC0n z>J2T-frS529VU}l*vB>P>p{1f)KL*#1#BccEI1JljCKz}7MXeAXXLUQ97wE^Y4FZ<6A@HKh|g8CvHV~`L{wIJcF zKojt?nvd~iA9gu;eco_zzYc4*TTwj2%1#E?c*a#P=EhY#B+z0ldfxmlk*Dw{-^7~q zp2!;2uAeAj6y3URPPB4Vx--#7>ALwPEyit!vNeUe)p6w;JXh0>0ob!a*X%)xFKxYYl|)5yDct^~g3pi|1I!m%`S1TIJo zU}3?4+Mj$!bPR`=RjMV6AG$qi)61284~#f^QprZBdQo3Hcwu`%e8@ZzcBwyqW#avg zV^aU8Jm?bs<8_3jPa5aU820aj7U?LBhpB#QftB4Z&f{o|`#!=BK9SV}SFrN=FuI<# zLA2mEUkiJT!?_~Nj~GqY8T9=nJ^jL}3TJIV0_dRf)c^Uogs%&j*gY;NPTNx6IL+dNp2%q%%u8)>H8xyETmi&jA zG6nImi@_@qW5u3^xG7Ue<*|u&LA<|pKo-ko%~MJ!r@Hlx`Uk8qhp5u)>*ESO>^$tu zI$kh9vq$YgCDsxniVYabMvO%v8{{E6CyTuAw{h&TI#?!eq5Nh|`&F#pBPjqDrsiv) z4!X#uUy8bgsmEQoLwS!U1NWhCR+$gMaTA%OV$@Q*(yV#|#6^J8AdAaqzhKs#J3f=S zRnHh^5jYy{I@VA^Uf<2WP$_$Cx-3gBCy7uuU;X|tnfB{_Q6fIC90|pIDc$?K(WD8g zNFt?jTNZ$|GN;Ws$_Y9!k;O1aVoOx95Utm+X#@CvjX6|s{1hmETsTdS)oTQ1D1x_j z#HeiC|3=Ne-F%$)@%jMWa-kxLo5zt6-+ay*WAQP*w9x{DMbVw+n+8 zdq}4SkOX%ikE}Pa^ZeCeV7~AV&6DoH&DY(siF(C+xTAKFlm(2V9IsMM%Qr=FdKD{~7 z%d#hLV&!Wv(5cydQ@-Cw3&H-F)n#5Bm(A*Hu54Do1;R=cfYocTky^Y-2T zx6-AGz&h(+a>_KyIsXq6Zyne4`-Kln2qGfV(kR{12vQ>5A|S1Fcf**9(jn5_-5p~a z(%oG{IyZX27<=^d`~IHi`TM>1UiZCo&ULP9*L@$BGQmeLFlztqXOVBne*_+0(Vv0+ zLe0Rz8n4f(2n5=M?3cU_rd^)_bW4&~UZn~FUx0%yRX2zl1d4AnIdm4NWM{`;KUq15 z5oD1D!nN+Puo6clE69Tx#Jy6v=1bK~fd{g>>`P*{UBV1lB!6qEn1b8jJtXLcZY^K~ zH`}Y#G5aTTkXoBWeNcri!EzwW6qYp?M})9laScOu*l z4r8@f1yiO8Dd#$NyDUrQtZ_Rs2G|EmAFTZRQ2 zHwE-lzu(sFqART)xOl@^G^z@7n^+smvs$N1J@6dIann zcqQF7QQs2Al=?yVcyty=61Dc0$tu!qt16QSv{8J}z{WuPXh)RfS6>wCcl6aCD-B@& z+cjrNUp1xHD&u=uYqga89hhh_mVBt%=b*@~K~Bfyk@uERyZE=Hu_13e!NHr*_qjFe z4VLG4LrFsTNt~v?XoQ_LO(mKOCYeL0xL)h)9p@9VF-;aB4}9+bbj*LuA$oW_)F-RF zT`oIDx41u*wpso>-)ivJ5cJCzs;#6K6*F^6fvcdq!jw2yx~MNg^O`~8TMeHQUi}xc zCRw#QxiSS)61}k3(T%}uig=JvTtwJ@ zy%Ev+-X2mq_+MSW=hD$!={e389O!ZDjvma~t-As^^tkv5y6S(N+nt_4AJLr62i1@X z&kd*Wl3_o?-FvnZQj7JVTnAjcm;K&d3K7b31~sPvY00^I}+}Od}6CFK#bsS(SMqnAo$OQD!j$ z^~=}(9_ZV;#at)x?;ot#+zu`b?H%yhNz+B_Suh&}L}&prwrPr-3jJB@VrtE)2UxHY zxh-nRP?H>|GPqk@S2H=GE}qTMj3X=ETseZi%}4r45dX--{UdbuKmKWf`+q|KRSt zg;^9UZ51ZEIM$Fk>HdDfOGhDW?(t)akQOugxTr9@>-X{`G1Kxsp@9 z0qHs3xY2dEyAp(^`^)A(3o}gC$_PoG{U>m}?Zo*qu)s<6L#sh>_7B2%dBKlo*%ssH z>Z|)`F*EJqZRy5b|ED)^wszBK=nuQ%?M-WK?>m*&!kvBh)<^^XTXB$%Eb zV1WUc5(kQpz*_h{w;3ERPs(3xwYaH2)$N}9S?B*5ZcOE!1H4YZMF(=L3so5JHXB1K zY(ub?)*Rx%pN+g4!uhPHr~0n)o(j!34l@6^VUz(B2b}Z$8c%4MqD6NeP!sTn%S35B znCP+$7FJOYy|aH~Z-K6~n2ggjox7ge86LNm5akVZ0n1Z>$);K2p9;x2-?yvULb9=c zrj6W*dBbqhxo{0&6q=m4erfx$m_UbDn3rI(wRl_MF-1#goq8$z4X58wp*&N&+xuw{ zOxCDA=pmRg)*i72;{UPh@3CDd+(k~j*EecBbw|`VLrni#)%Dw&wp%Uy-S=wBVT^gR z1%>lMV;Y}H$Gg?QOUft(uWyTtBL4nGg{l-ogt{`^cC!afUN@1%O~(^yeOlRyuM#Y) z#}5LY@tM|(6H%XJOhWmxB%a%pC=wk`c83KE`)rVZ?UlL>9F<5vLor$~zrfiZaJf-( zOpPq~^xfq+S^~#lPSv_+NGfyj-gR5A?X^Tzp4e}5)iAwzVM7#CCkzJuDXvFxpB_qQ zlxb!GImnKnx?9r*CCziR+47`wT}Q?o&jD`+My;)%rh=M{y^~@iblqhrPxE2rHn{~B zp2eqKY8Q%`*Wr&K>4)6^*ME8oeJE<;rzqcJ!;9!bSsTOUcR#WXKh=p|m*OTl==909Tz7BEeG=w_RJ{HEaxT`o+{* z`Y!~8D%o&}fVwvgRr5p8m(4-tKqMUfpn6sltP=G*J(w*otF_q)=a1?a{{psjF9X$>qeGJ1QqB6eHj(IV_@~l*^fM)htvDZ=~M&xZot?%z0JdiSE-dBx1MA(H?OR4|EF)O`hS^;r799iYgL5V)B^M=<#u{{C=a~M{lmIP={SruDCsZDr|cBcFYEt+@x%i{~DakcpV<17zD^m zf+NpD#Fugu9opp2J^N=Lc*p;&HTmAN9&IWwX!u;2Blgo1GFr;lx&hx4TUi;pnC!yd zItIT5WF^1BMGFy2C)(HA69>FtctoA>{qgw5BP@fCj{*b8va$Py5vvUur)XTjHILZa zM4q&S-Xu9Er+2t=Cv@4bBwyZIJ7>5FgWN~C{#``zaYdzMuR&FYDMu45LmmW*2q3mVxx=!_bv3 z*C>&maiMdVAIZ&sv>^=#7>~AeH18hdWsroUCW@2D{Cwjq{?4vV7!a{ zt6%Q=Ui9J5B^JvM}!GM`bh#(9W{@$=lwfjO7Lcy_4jAdMe=e)J*Q)%Z0A zY!XFz!GH1E_p5tMjk0lA_46ONcwM7+=>x6=bt^uR9@Zlad zpJk`EB+IbyGmh`OyRpPpf@IONSF@Sk*_4E%(+;mMj<34P%<2Y9H1xqGYFHJG4;qTX z*>Q>T_z}ZBp}oJz;!2%%z6V?~-M0W;hcteXQj;mu&hNc*;n(`AmAeq_r&UJQmzTBi z=S2OH0I7c}>_*N|T~u3eTzjtbrl4fucNi1P%SQ{e65%o7!FIE3xO>+^ilL_yl`Ua! zz9$&=vO(Jdn1aUAm_dU)7+b`f^#ZPT=^&<`nkru=0udV8k&nK8DSZ?fNmR$pbp@}; zw@`X`qpf2u`IxJtlb?gF(<|@8Iry` zuM^rpwl-t#`Zi%=ZT@+pAlhGAwGoYm_8^;QhMKGujy9)f=myg03?igwGeZew$5NRT ziUb2dxzmhP#7Tqmet1xLDrERk6j)-_3{C1EwCWNM2EOb^{zR3mO}t+f{DK;eVt3AM zTOp2ud4LDv4h%30B{F)A{8%n2Z?^6uiQ7&|&Dy-M`tN=+g3d_dDbzRAU`eTU2v5Bo z?MX+E08!|)Wu=?&AAUKY`14Qm?Bt3|JV7_u%-k#Q%r+N9mbh2}0Y@PZ9;If;mRhG%1bqy5BX8iL+8&_#fbb4OXH4g+|4%uZNMR=GHhb;aDZ2~* z1$Y#YJw9mk#pVqzh4{yi)>mim66<+lvSH)j2|c60dPc-zoCL;QJ5c*!OSO31^%u|<}M z3GzzJaQg-3G*GcBfJ?$XxC9tgP8U8L41FJAz~#?1g+EjtlF`mq%Ct@@t{z+&)Qgk9 zQ8AYGdvOITSrn0UDQ=c=kvEdk@($FR^ADOPzd)BzIl2t;Y@=iBoa7EKt|4ZHb(6AFZmv zT|zxUe^UUiHRhbv}Q z=$&UHKe!Wco)W^$gF1`kV9{tWq^cDZ*SyZh*}p%sK*yCVb-J zi7R@QgGKrUBoz1L#{&DOeaU0<>9L_WXuDq5>ukl)+bIryN@vcJC()6_8vD#F@BsiF z&!HiMx|cyC_Zw~LD9MN8WWd~pdZV;o$l&a#FfA#cQO;s;T8>K~E#x>Y zkb(!0M@a{_lT--h8blR4o_spP%GeGkwJlD{6183ywJKVA`t%hn3Kp{JR}>n==ggoK z;@7+Sjeehj`eGaPl_a2vmpNAM0d6EgE{xkoXGyAKT=kdG@PAnZJ@?H_9BH6?cF#g& zYYAIC$64L&Z*?l!-+0UZT zk@hRZnR+%jcm6zJdr(8r|Gg(aXF}x`sJsWylhx)3VVbnK=H2)(@WUHP+rH*clNC0f zo6K{xYZ0ojtTCu*uk_1iOOhL2ZXmM$V1?Fww*@W_;7Jf~+BI3u!yDWhHa)UgBO?JU zja~ED)B7^_|1tTZrC&H@3}n!T`-C>tRKtILi9P$_%)n1SVY6yKeCXUj;kUtUMwYgn zE925By%(1`R)8GC&rb3Znq$-nj%^HVtdc#F^e^!FXd$@^znU2#vTXO+6bOcUzv(tR zV3G^m{!tMTz4hj1*d>-&JEqTcO*tz$p7iu9d(1m4E+zG3et%*!Cjq>u3OZ`0=k}ZM zx2(-KS~Q8cNh^KvKSgfBRw*MI&n9wfRuRYgF-MEhxc(U>iwLOyh3QO1{|~O8&W6d} zN>h9^L9=cSGqo>b7`%l{rB4JaHZgBdM7OT+&IY5to_2nDgxj06?&j(t zEk{`aISTX8+pot z1i**nA~BUK*h`(K-_q-&-Yz4g6(Zi+v6J6EbY0T&F~dUJ!p&%ws%fNr4drJAS(plx zJzeB&lC&or0rxS9J?>AeLYsPo$l_sqvHAjs-V~*O!Rsj;9`@GQE#(K;>+1^Tw^c}m zhSSQBsD7Fi=S$JK;#p=DlN~?i>fl4R;;cUqnKbw=f>=`b$Rs)Q zdu7wMm3aKfJmWiV;FT5^>I+#4QSvvtYUdt34QJ7fAShqV{Wc?-{-7uEV>Q3fO7Ar@ z78ai^%*vIA$ES*U{P`H1(~7za)WLInJ0`M6oINX%jl(0|qju%2U~??9HXkq}pTlOh z8)pVwo4k(%r+Gy}3omyb#0iFI^KUR4Mc)XC(X+Z6OnwQ$!nALvdI-6v@M(UTDUlRQ z_G2IlxIuy=CntQ8zY-f-)Py|f=)x;*e-I=y=coT_SpX{20%ze}V1 z>IETCakxmiZi}dt=#^ZG^)hh%0lMyl|Mqm(Fma&a)YF4UfNo0>^eOt!|D6ROus+OQ z?(k`B1ZfLuy2#>lpLS!o%N#kCvuPNPConL!sT(%k=u@}&IzT9=7~6je>lm<)ReRZ| z3l=|=EaFd2o7lKgH#0dSVRVMNF|v*~Q>0OEl_H`g8B2$+7;O7VwGXJS@R9pN^1`_a zbWjehNkJb0;e()ez63|;zHewRD*VHwdky~3D?n!50p^03qgVRE;j3uAE)hk@AMap% z*iuz;q;*1kmJ)j5I5S)b?6c!1(R4E$c}*7_gEKT72o!8lA#pd}jTpd|XTCTX6pE+B zeH-)ORthN$uY`4@MowKj>hH5RMp2by(DAK;2zAKy0Zf=?kyQ?`J2?hwAZkQX-#(1e z2iwc&P;_%dK=EZ{!Zr!dzEivZzF`20(act{MMyGe^^{)WfQ?FFT~OVvmPOAFiQA{m zyF9xTV);3Nfkt>I*i}$uA+NptB&9IvSj*SB|I>@xa6tfHrhf9uF8KG}?L&}(SRP=% zZD=#v2I^gGu)7s*f}Tsl>b`t)jhW#O+zVS?njpD{pYS2kf-2{auWZ&M!lj*$LHe%5 zzR6a0#N@z<4IE9A*LH%XdYK+n?uaK*8L^^H>H(=lC#36FNiqwiqkYZ66JQZHQs|YFemFlfNWuW&298sP`ZsJb7g18r}<|ePQ#$2EPH@c=oSI)wQcnLE!Hl zV~WHCV}b!j`R#0dKN%I9bcC4ISbRLX)_y%<9}M}+ABbq}N4n!C3CG_k7??;a&+>9} zN8y>iHW~GT9$qc)ff#KjTBd_@FKNYeN}e9?haOfJEi0|Q|JI$TC0+0kc(2f4qt4y# zb39;dchZUFg`_W-eXVj1tAXSdD8=c-5rQU{T|3I3oG6H0+u35#Ze|F(yd&Hh;|u6A zk4m0k&$*xH4Y^V$ zItU6Pg$~Q?%=*_yI<2htDTET)1|;z_jGNDWF=#%{Q(F+p3hznu_ji-u4(>n0Mc$`0 zTYooO4WxPhRo0GF7P_0gmUS8U3+FH01a2m6|Hl-XdF3HB5q8GI@qrlp|3fru)|zwr z7eo-;=g9ZN^9B`9dPjGFc%oi4lY8&~aRLLvne3Q~iD~p9H}f*_E)E6pXHY^Al7gV| ze(gQ?_`Q;`Tbw~|)59pUqJB5t-%hZY4V7v0)s;vWv}in@`eNayC+mZYS{^w(8>%&2 z@gbO%n<~_#H}3*y^gbWfWdY3|5ct&8+3~cV&)w)^e`Y(DTv4bsrFD7d`}LQEI5Vr} zn{lU;Wa?YN4Q*scRG1`R<>+wAP}!vIC{Wv)AtKvTEAUDoRc-QaQ+kZ8HJj%Ucv#MM zfs3C?v6<3ZJaINHGfjosz?n>9eCHnXLebZ~fw^I?X_nwULs}B%xT;F8XG{LbQRf@p z;r1dHkzVa5>arGgK~)Slh=4S9(f@}Jk^2?AL5lsB$6yV_%JQqkfeLTS(pcJ@p~Z1I z)aQ6j9tMyB59G@D-eViJIf#HJ{loO@%x{3It9*q2>UJ!QF|x59P4RrqS6> z=?hyB1M^M*95lbiU0pX;WJ$DER`N>s2CvH9(=U?I?m zm{;neJf2B}gSn2rXWl#`U0{f##?-sWz_9Oit@WE0m8hIfw%Pnhyw;{SD~m(0RFVMi zT|;FY>^#*6Xfu`3aYzLqBBAi=+yVFYKsa+;O)5;6_)V!$CJ(Y+V;`*Pmo_`j5W zTc`LJkx9*KT^lqViXlNcHF~PPgo;g!drco}EEoHmT7M-X+Rm2MT$lgmD5O;%j>zLp zw4!)|2(~76pN5c+T$xT*_qZ>gd5JZ*Se4Cgrl(N1?Hst8Oxan~n6}*~nxF)?vTj_rNiQY{I@vm{p7@v25R z8Ze3xKXw%Pm99n*&7YjNcAj{}~Yw)4W3X z0f(dd{`P&qiiBNaqb4Ug<9TBnrv;D;Vr7Cmj65s(LAxM_`}(?Ey5K%K|2(gKbKJ-A z9hB3&&jv;&rxW5H3ds)0=_+4mlbIKW_)w~gFX6eWF4Lr+aooBFow)q@aHaGQO zTMi~{okkGob&N+YCkNM5LQDM4rKjiRp^PI4p$oz}^tYDdk{?;Ee%6zJQOWYsA^F}6 z#^3f=<9=GDq;n^1^o7oJKU!UCK9+4l=s)7_hp(#zu)7)5#4i2F^t~`P0LDoz$F^LV za)&^kcW#+;C>zAS0;Zy=&=9Gt_FBe$LRx(bvDfSz$tji#Lhq;tw>W)9na!=#n1Kyi zEm=zA9P^5w`4pEE1z=yG>t}By|5nImQCY?$a;2wXTju77@YeD4efxLY`tdX*KDblP zO2JCM{kjmipLFV=h)VZ9ob~TjKW;<9vbVsAX=y4-v2;aYj4fNdzM((ra(Y;zhRFb$ z@_0mr=>%7RDT6wp40B*j19}lUmRA=irLa#;eK8rvI3eX5>y!M3rTV5})#!F?y`PJp z3t+yOVp_BxXL^}sF_5xeTC}hAYr0_(x-CGF(WCd13&^kV)N3>>-3-UnoI~c(^{)qO zws16MCu$_6s`kQv6QCd9GX{SL{Sy4!5cLWrazR)v@*R5m>7F(WFrOm&cphjvrt9Yj zYZBZGtY_)=uj>G%j|`s?yIHxDoHp^ZGqyMJ%kfwnCWl}5j&Y0I zdLP+Y%h|`=oMp~0C^dmBTvb9r$b;#@qoDmQ9F2g>R%PmATg)x3wXJQ%xQ1A?_UyI) zoKyS#&T^@DMe8#TKo`KrgQm;U5^l~_!n&+!r^y`$vW zo15pH2#s`gE$Q=b9=sR7L9U!Rw~9NArT%|^s3Dlwe&}9w5h&fZcDELk;pPKmgCJul z2}1b*+lIlR??O|gweQaRJs+6v6IyG3xP7Yx$f&!bxU+H+tx@ zd~`Bz`eZqjih>^0a887ONnv@PvDrVF5GQ>!#`_|n4=Qvq`t>p|4YW71i0v@qG9LU# zobC+CFE^;R>^rteq5fA)6;Z6rn+^o;R_}kz3c1lQ;0f*{^!&w{gc?~}u{9ecSsI;3 z`qz*Nbr2U(HV0_zu6JQ>0Q?clt&bQw_WQY6UDjoXn)x#5NIo_Sg+NRIsiO2lFWq0W z%cb!9gdpzeDEK$207OgO_8Zw zc-jrhAR~cBFDF~;Aj~I~$AHez^LSHIyE}@Q*B_nuh)_XMk2%)MJNzI15WZ;OP4r{Q zU}$gU19!%6`JSs!g)N@2p7oZ0NUyzSLcNd7^R00i$_n-mSl`WBk&Uf5%&Ar{O4&W$ zd?2c4k8NHtBYKP7EMI#fX_G+1o4G z-D(N#Cug`!XzFGyHF5Cs=R7SgoM=9d@Y)3smpZa95`%G*XVo09KsoX5-^}QcG*!mX zuW&%_f}2@`4fZ9dkQi{eiaenHHBXO>&TD~XC|{ZEU38R6f-mlbd}N4MeB%xJhyj<6xa;fxW&1oLMhs+MP6-Xh(DF|#xoQW(XJVg>uYK~LS-5- z?d!75-|c%}8**^odC>D`R5@sSRY*$Z5&TE{xiYHES*~!Y>zl8MMZnY;W zr1-?~v6()-_%s(ho`Foeqf7GS0sT|k{gwXmL~fJ22cXDW_n@C zx5{R3IBGIl(7FvbzN+YDoZ1an1LN)=%&ID3g5b=EwykwCbvX51FB+xeTnadTp7h}* zp-g{+T1)L`dF+v^?ZqpyP(zyqUq|hT;E%vWmRB(&@6ZuA+e440qC#lO0#U+cZ_mYF z9aFsl)iq?Te;FHkPdOhwQ6@~Y9I8v{%{eNx+++=IILycb`6S>%X16Bmh^L5JqKnz8 zBx)UF&$#@K*T3TI{YWv>;q$w=1fQMB%^ZK@6TYwV-LE2GoY)TGE7%#0?0%t@B^aT& z;>W!zeDE|0psxNT;*i$AxyoyQC1T4m@vh<4Tx8+Z!PCRv52)>a=0cU?=r?7d=X*4! zt65UU=B~E;*niSxma9}inrFp`yEGI;`Kb%)=u0RImKDpV)(*d2b{kw}*e-xuq`*vT zdutks(waowjnPb&g_c|4Vf_4eTC7w*Qz>6zSM93|F!|5{v8LAiQ%+JCsXOm)VZu#s zHFD;nQ8qIX)UWf@nY4|tZP2vmJAmX2V63#6yYh>ON;{F1vc}ZAfE*GDftSSQdPcz& zZ!XUHD7*lZ)nqO*cnF~u9sjI}=wn;gfTvZj-BdN^K%4nX<*_<%1hm+4!sCIT)P@Vm zl#-NC0{tVVfw!l{&=f>N+R^0aQ=F_1KUD{1^4^OZ%&jGi_*Pfm&kY^4RSU0c7(Tmf_S zm+RXA8jzQ`XS4Rhud~^+twx1QtL|ITY9Ybf1FvZM;oe59A6E_sVg~OX%D%Ii8;-`5 zo}0saCuFSCwh1x4POVh0fAfDQ6t}BpBXL@ftbX42)t(n}-gIuW5~+pxMyF;9=FIWJ zwK;yWQZ^qtJFLb6szp6)WOpZXUg}V2TPyo8n7_FN4orffo48XbS9Ob2DQ<1|&At9o z;>d{DyzA@Me8>9fLU(4P1`7h#;}r#VO{@1AbG&8sR9G%mg1+vxz+KT2&fBZDRF|Fg z&e3#H_w;JbtfdcbeP~7wOP}4)mgRfU*0^mzys?5XCm2viJ>3bVgMv%KT$C zkeLMs$2-(&RHBWsHB5Zzq&EPXM;71BaPqP_m>(rlU{RAMe;;-wZ>0zhScb7Ta9g>9FW5mTCL=iCEq2?A<%xV2O`OKv7dX`2euv*f zgl8Z1HGlDyiKjjWO-VN`_=Ra@7gdwZ8HpGgK)qR$VRG4jpplz5=w7l8*8A=+lzRK^ zngsec;u4RxAh2w}{7|lWn+Ju2W#mL`?{$$bWf`Te$p?bg=iSUF76WdqqmJ(y;+fky z7F*tsUR*-M77?D-6=~5P_i3;z4n|!n(aLv%y5@x%8b0Xmg1a(y&oZCwM@9quVU~9* zTsof>{L{U|j&D8`l{cNX30q(8s_#xE)-)mqM(#A}d1X!--_VFT6dorpINT%EOxDSM z8B`?m9+?Vmt<1yFvH;XY@xY_uPsu(jAY0;+n;Ii<=oJg1$i);Su3?MVNUmDmLu_*| zio_p6g#wW&m#^(x@~MEzOqQ z-{Ko_TJzqGjPZ>6be$TCMO%m{Ax7V6*(|ox#3x633n%!fDrTgYcq{y~_ zt1;G~8q<6!j#5;=!oRf)E!D8@>nQo~cq*$K73Da^r0sA4~Q_7R4zNu_J-6E6C*rgpnaa z(ig6N_|(R~Yhl-3qyT*%ZGj|s=(Lhz?ZZnJX}c!L9gZvAdNw`EA{1oxdbiLqJt2tT zXOI==+>0wolM+?j)gU>I+wVjMg2p<8k;@QG9^MWpGpz>A1k=+8H>12&rKY@Tmx!gN zuML7Xn@hKeP6ta(74vatyXv+zgonFNlB+(d5H2i0ybM)Zq!r1FtfO`s{eGL=T8?2B zlC-#&fa^@CU0?zPy`k&PGoG9ajb-8C8L2V^UBMZHFZB)<&+dkAkqs$5GrLwk5J{or zn9_IiE>s@13)6~L)*l%FH$ce0)~>Rq@SC?G@T@$I{qpA7J*lh3wQne}VMZ*qzM{Ex zW30EkTnpUH)>RQa<+~f%TpohdI@tLYKtK5n7|^VP&ZfS+l?09}555_eThy958E=`8q9Zr3 zx?@DmFg0=e_~o>{v|8~NYGy23?RJ{L1b=XB{{ie)JJEISG9%2YFjXR-2oC>?@vbNo zO&x`biHZZ9^{_r>cWTGI5!Eq|uXOzT$!^R6LQOa2lM`XlpHInw(GG+*jfi%Oqk|R~ zbgOazygqa$95be1Ww8_a& zt=jjEH&l*+BvM7uN(YO+5A;+@l{Acf3)!=Sv+Elg_AmB%Xiy6YUdIE*d)xDCxxGMs z-Tsgo8co7`qb)9D6Qsb`y!q(d*PyDHLh0bb;Un;|r1ehbapiG3-3P9$7^qE38_097 z{10;nUorJ%`Va)q_1;F(S(%d|Xg;XV0l{lak+OJq7Mp_QOtM(LQxpmB(8}6AjC1@O zRYvPxAz3Ev|3#IuwEd?C?JOcqr>4rWcj9@r^?b-`u30A^T4JuQHN??KYN$%Z*e~a% z#yX=8ZM91=LDt~Q{m5b^p5Q5JOzVNunDanVF8bNu_t&nFmlcW=IzDlgqZcVYO!v*b z6Rti2LlbavaSNwPCBC>OsIC^sL?|dr+hqA4StX707DEw z9IYp)EU&;w8ChM7x74s!$nK%DFiMxM%f$_1=$UHEXu~1j!+nm_nLdaweArKsbKRn) z)<`?y+qr1}Qn zLk~7U``NR<>b4j$Pp{JtNKcpKsJE++f_x@HW9 zw^-?kxzn?6sMjz{%xVk0G&ir+0-u|0rv0Q|^q)c8fw^$V?rjUrG(Jj^6X2@LcSfVL zTM$CiotL#tidTVuzmPpRM`}Fu<1uqXm4c#=N-pgU^EYH#m-Y@Otq%Q8?@0kmcJ9et zrj^7f^s+bSEbwmC?n6tu1FQ5>+@X!-fBb9MfykbC+})|CDy(5y4#7 z1gSlBzg!dh*IVO-ctDHz)X~k7wD{F$hu5coS*+&mG%}l?^EGyrPlyW^?f73Z^UFj# z6eJrA)NyEF-$o2$1-BSS@EDNzqiTKyPutYFHZA-6uaS!Gz^*T^@=)Jy9|KSgHok1v;~a{cbfu|QhdBpXoC7wwwU zD3Oqmm{Cnf2PBE2@2rXZycZeTx4MbSV@c|E|w znAhz$@zijE_J0-cINU~;g~9HmTDhs>X3#CJk?A69;I01Bt8vofm|o@- zcV2k>P=(szee1F3miRLup=1Lh`PH65+4~=B!LBc*PL7y`kykq`1%=kU8;JXP&~gH9 zb5i(tGbA{NenR_UeNudYvA@3?v#6JFy_B=}9Xn_ve(`2QHDAsIH^P`eW5XYJZ`s)R zyy*=CmPAEmVGYtnX@r43`Q7z~iJu@PxN?We1swjXrc*mf5ZsLN=+#vQ!7?YXDT zHS0RJRG@U()=G5=pDozS{`L)f3Cx~mVL2*LtN)?)!Q!Aq!gfn;>$j~jNkl$>aq!!O zWcuPduw&Y{Ulow^)ryQ?BSv-Xg16{NZ{C?-voV|{oL^B2qXt>v3mb9d;z5CzM83qT z=Quc&qCYx-ek~7=$cb7j&~N*@a)N`7e#pq!1=qf{_723%d*%s7RK!vl4|jwIGEtFs z7*+pO){yL#C3JTbr9SR?WqN!WR=kQ-fZ8g84=9+pb9MVDfW*m;emVODNyiZCWi6PE zUfF*pRj_q4)l9v6%a^Oo_R-Y;@OvZJ-V14T5LkUZF~96%LUsy#Y<__(DpPpX{4hqI z1Bx28gUw#N1T-H9npd~oR&jHqvbSLk^^cXDC`pO+$f##P#qyUgUHO*$(V{fjOwOhtKo? zTOW6138C@=?4M((cXlVoaT#bcS0S}J@VaB1F8&nbFVvDl`E=tT58dj*{`ZL(S_-n; zJ_mM={Nzm7e3`hZ9e`8=j5@%Q>R*%ELcO=M&z!oOkj8$izjYgBn8P;D7BE?rQsZWf zpB<-brRLz5^Kux9yX~8-+cR0{E~C^f2o_=%qFZxcMnSR^2UIRFKOwdS%Jjklcs0-`VrDcB z*|1GS^8-}%t^`+<_KO2ung3xBT;_Vm{~)6mqAFFaWO9xjhp z1ubQyB=4nisLzX<4T$Jfg)jzmm9uoX-zvyq>L@wta~PdWZ19bL0D)z&+w5FR)6G9K z?e?GofO^K>Cg!}9cy9`g_c%o6W@B2CAnOB%C7y(tD__;JpAA?fla4}=iOyc_n!YyR z!QH+fPR5Iah~zg~#`*!59fhqpxNpNA+)BX?+ADAWGrkU%jVN|wuXIPcr~>z>g5;Wx z&Uv`O$;CU@wERRONCaoazx|>9?k}u7s=r9g#^f34 z>~f%-81z1ycf54Mu%{vT8J*3S4{9WrTfjCwbz7ggZ#@>x5-gVw6&ViC>sxBF5~|EJ z>qxlsEgq^4^C{83ujfFTJYV(1;9PXdTbBI=oZG@s#9yfx6>za9HyDw@@&B;*9#Bzy z&Auo}0R>SINg{}nCFh)T&UpZloHGmzK|~~rB*~I9BN+w;FaS!HzS*%>nn92$;w?T@GrtoLNjR>U{-dw2prhGsVYl_FAc@5&sbOcA z$R1XaUq9y)z0#YeMoIBqt8{~S%>`i_GxepCvF|EwYLlxrK)h?Sx25`gyK+FR`xtVW z8ZbA(1z$Jbwuc=V{WLm#PT5;9xnG%(kf}y-oIl*weS3h5ty$Wn$*Y#7z%(XXFA{)N zSHLEBKIw_n9ZJ;zYqH|t1OG5E0u~oDW5Sf_l9|sa&S?~IEwQNl_T+SE$qQt28wo38& zEt7Rv3Rgs*tq^`{eRe{E)TH@fomDTEV1k1yC1yy#gGXUPY%zY($N70fd~^Pr>?#Jv zKf1bdmb;UO>l~-nvH~wPLhuRw<)snw7DSO1~ zM8UAByR~UxYaMu|kg{7>`V^-=Q^ZfRRJXiH4-9xnu_-(d?KlDQ#Df~vOR0E&HJT!j zh9XL!)TZ}wZvTUvFE`x(ac1}KUo*S47d$qtMzyW@+b5-7TU*y%Y}zf=I=V|?K6f@iHSoN57BuFZW<-n)#8ifcv9FIvhbkSn26J_K)x(ZlvV~ zO|wCdL!L!0Ghb$dTQXL3Edl`*Q=(6A1no$^JAM7o2GR1;(h!^~u;9l#dAqqf{O##lBg&JVi4eOg ziURfI&_I@g3K7IWjqPxe_wH%xR>HbB z3xezXRcY*%1e;d-O_M1iht~Q9#$hD|Gr5$T^@eY3kpdIm9sm;|Q`IRyyfIe=+Mvg;ZU)`#Kuu7CO-Z|Q!<+Tv78wn%b6dU z$v`c0H0ad)+A*-K?~CCCq5bO}O8}h|9%B6EvTSyLvD0><%Cg3NRduq)mWaoGEUK&8 zwJr!BQANC1_KtHXlW(@`Op;^IzQZ`J+{}@HLH8 zu|U!2#{xsYn6Ug#Y)_I`QgaU!GW!mQX2mY{F!4#*gY3r2iiss0DQ8x<42~<-4+nSc zZEMS0$_xd!Q@3>kO?Kiphj_n!{W{`xvNJQ%0`eQJ03L0~@QgS7jmfCfT=$7Bg(nM7 zuqX&I;8;H+>pe?Gx{uLviLghk<;L19cO~Xma5-V!L<9XkJ4x_i3rmjA!r9`|^m1u$HMzIEox7}~ULk4LO-!XiI)t4!vm)W)RTiT< zydRKjN6HFWqnT_03BCStJMXrJ&5eW@t~H-#9&{;jwn!9ZGE6$WAngqwmGFE24#)b2!w=1M^tu(koVB*TX+4D3`+zzb`SOZ zGZdL~oEKI2${3-cq0dEE=K{_h?+_3W^eB!qdbURpuV;AAYIw#AO5P|FG%So*G(1Fb zAy>k97*-2ngE=BRJo~{j+0#8n%lMkwkQv-8nf>rNub`k|xvUR-P;Q&^i^AV@!Qq1-i8+5kiSP?~v*WD^kF9YI$YGxl z@>JVhc%yF0DYvZb1xj7BdNimLZt};dy^RsQVcInUnIA|gg%;c0V0!dL=`Oypjp3nh@hm)S3e~$@A<}P zDT(7;OGb$vc<0xQ{Jp=S#dd8nk=&UUOc;cCynK9mjZ+*tU%HCe3B)egi61^3So#^? zU4-TH;%1l)Vn)$uqIt6^A!i1wF!30aAt@$X=dl~XfglnKB-hv1yO0A1%iW`0p+if- zet%e?R-UI;L)faBRzds5(@V>VPJY!4$Mlrz4;J=5}mt& zmuH1;a&W{ZnAwYwk#P*y73*fXsncQ2yA>*bUd+CvVRxM5hHO?e6&W|WJ*1>madmZt zcThMF)WQIpU>d9u_kgoy65z#t=Q_$mc&zl033~6OM{u#DvZkOC>^nF2^cQ)Q(S~T0 z7HK^Q_S_sRPC0v-F6y;KN-5~^4gg%IHEeXFU0z)!$-jG)(cCPIKt+~oC}1ia8PRT6 z{Ag)y9nb#eZ!jT21ZC6R0BnX}0^E0ThE^%|9}*K~jOv~81CWTpBbX^T>U&`GJq{m>5=_^PJO(1S+X0L?s22&_@yUe(<&I zX~Kz8zn3p_pu^WMX5FZn*4LUz#{Xnh3?n5a#p7Vjz;&3cQMmPWR7?_M5fv7s?KCXjL)va} z1y4COMF*U3*Aw>SFd=2T*3A1A5LTcVd5H2dlN1h`>qy{#|-wFc-VlX(shL=0thO z4MT&gRc7cta&Gxsk5m;EbCLl-1s$!$+);zY=bd%18tzHmEM1{O$D@#Eo<+1@FTf- zN}tG>FSESumE>5ej?=1pxtWlZO?mezvc=1!uc>->E1=Pe8DTwvVy+*>++<7CV>@*o zN&M$){hKF8C-x{AZ0pz2e6{S1b0{%lNg|A09exX1=iaMAhxgoN(?H>-W8`|WMc}%Q zK5tZ{w&&2P4e<#7&&q8cmgu_C!qGlkBP6tL9S)nGfX#uo?N4kwtB5&r0X%fq?@8YP z%$X=11(HiN1TK8XB^O!|MOe%}1{PUkn7}Fp+hyO}GFL&G=9f)lAZ!;o5H8Ca5O~!W z_%FFEbz|dn(>oYY#65R|jZyDf$-WyQN*tBlnGNKG2~ zI)3rx(e?CZNub|PbHmSUSt~5Y(kNp&VG`5hlLA-Zkh#yy0eK2We%!h#8UBdd_LU-U zQbkp@02Ov=TnUD9?^Hq9SI*V@In@sqf&@KGR~hW43h?s_3J_bi1Eu`~Nk7K3fGqni z={LJ!A*}lkVfPZm#b~)2&f(4PXDP-KoYvCsuZ`k3o{ z;55b?8clYp1C|a?KaQN|Ee@RDvIw+g^c@2&D zQKq}kW=;l~$CUR}@u85t&63{K8k;DuVF$cSp|Y{lW@AJRubcdOsEd3|{QZNQ5-a)Z z#EM$e9Tg4nl<1|kG!(GbmQpU(r&_KO4~%`YF7lM*ZkOiI%HCBl)Fb}U%a&)J<(yr8 zwz{^CezfkRD+)dJnPbbrUSzcSE@>0-D4t z&O>@gPO*3O7s_8gPO6-s<9_pv?zem7mA~M7WhON?Fx)Qwcr^nDVbjKw=NUae=~IGR zMVGl}_L2AOQtr!y7YY2|q5cKu@Jot0V%))Bx7_P{Lce0H_n`kDL4> z^%9OYP9r(CYbflpDWYOi%VCK~PQ1(PwqAKKQ-BCAJV(4=a<0)S9}-+Jc5{0W8O4W@%|YqiN0Sf%(IO% zS~AkJNB*$pLRgs<2z!8@x!CxaaB$IY6FYuak}#st$(!)nzVQU8A8ir7)DbWt&m z7Ie7!nE>gZhSp%d8hyT?*s1F_0SgES_G~j&aAqsthUN=Y=rE?=qY^MoH7ef;286%X z0P8Atpx+pgHAtW$RzB)miXRqJ3K^<$_5lg1D=W-cl@Ho|^&(woJ#svk8T5pMXBoRz zcybg(cNC*PMhL6FSF;{pR`Y0RpJ!tYV)`5hu$rBU$RiQE0>;71?I2gmNNB}z?$>TD z;EJu@Ph&tBK%vp=4lfjsC&y$xSyIF(~ToywCY2OPkw!&T_ws%sdjLhs28XC3S^;!TY%4#{|@7N(ZD#F-ZB6iCQohfm{ zW1BJ1n(fW+AN;2i8N8|wM|;cH#+-?4+Y(eZ>d?2su6_n2nKh>foYhb>hEzBhshCiV zFl9d3(MqO6W=K+j<@0~sS+<>??-(hrIPdqUcQ6$E{hgqpFWhKNN9|iR$aMXCwI(&s zO(0tIfWbS4c7%zt>?j&csMOtAlg*^j5i=}LJ%Q@Is=#xG>sP=pH@cbicwiUa%-cQ{ zO`Lnlv|5aFbu}+aOa#(HHr_V9=u+T??=DQ7JC1|iv%S1$bL)rI+$H7Qlzd_Tl1-sv zZRj-?=G);l;NFBNdAOwZXZW@WmZoQt$GE$ZgJdZ`ksV)=U88-&$j$hkia=K<&RQ^~ z)=GzeHtX`{{Fk1~t~lZ%C6UN}kg1)D$5X+5-A{TaIJZ*)Go{3u!8eW?as+>flZphJ zv$f$QSSU4>+f(G0>}|a75Y~5zskpMEh`z8B3g3r!rx}tZg49=@LGEYxFb|a0V?{&f z7@*`vOn;}l>{4RyY8-;L$DiWwbBP_scqL@$i4%7x>s2pM(y_LOR-c8|h-~9s$D15m zxnla?aWY8b!k%Rgls@C^>p$0|@5_oRy(t>YR=!Rc<Gjm&;~dQ?`7a zntR$&L#2iNGQb;CmTM1dhuPxMODO%(Sl9BXCB9~*jS=zk$XqZfvCtU5vH7PeMy_$S zIM{0*=)(m5^!{x?UFgfN-`27tH#PHru%|XGQHuz>lOVm+{9@g>6v0nK9)?TY$Ti%4EoJ!q0J#uAxnML%-X)rp(%;*Tt-P|mmX<198*mVp$R zTLQhrF(bZK4nHT4cFTb7roT?g|u2zb}_%mi%l*ZDxUTypUr-&$d>YR zYptbs!G@TkM{h@@IP+*|Ue-ebbdGM<`YHr*vKgZ;NHN;vmU@NfAn#c!TjVCdT&+0Y z9(Xn7A2n8(PS>%X_+vYV$oUqqwnoO8-$^h*hRph4{anLQo89`Sk}g1)k3OX?&q_n+ z-riOPX}+F!R+z_)>B*-DLEV(m((jzOst;{@)PyGVO@r~zju<2Gk8%rXhkmB}cd_xy zd8?`Acsi`L#^N7I8Ft2#PPAGqLgnu?{X7Ht390~+B$Ih#bGfYVu6;=nTKDDs02nDE z^eiG$ioa6LZuMmse>K{o1^+tzDsx{IKHu)i5IG#XMBOB(nxO+bx&k#{yzeShU3P&q z$vJ)q4rLabQ7&vS?&~V+mzvVM?Mk-w`EYP(tsZPT@g|_P9&=`@y6)0Ld|SxkVFa+e zhwGqoe_o^XO%aU*gUh@#_&!>Yl2;67C9vM~8TRDaHO$t5_R- z)w^M}U{z<<>3-Q`;fPoPIsE?q@!cO1t}?H@prre|%|+wmBFH-4k!D%$In(g#ujORD z!7}|OWA9a09}T>wykfGrXjdsII;X|i?1b^qGj7i7?vGe308?8oaZCp5QX#BY3PIE1 zN(4j1jtjOM_$;Gm=q!tC3knoAtYSh{lD=V<6_0Ia@+{5fN5zhbm&@nk(3+K=Y~+bq zuC-`X7<_^WALxRIM3-}a);B|zHUkN?b~_S_WhD1~w;|Q#8bHruJY&oolM_Fzvhu8B z&3WUt`wY?cNx=>bV1r^BlYXvcHe16`#J=*m9BZ*0ZsJ!RD1EGrs+beM;@oF+?bi`q zFZ^7aa>IN4$MEt;bC^qpk*P+;dEaH<6q8-O9Eas$H?2Ovtd&PL$lJBCdeo#08Kxr1 z8k;3QiJyU!$&jg^<*10i!!=m5syXe~EvH&#bV?rBGbUd)Z$(mhnnql6rl({yvRP6C zoawAS$U1W*V42BKfO(avE{1WBS#OTDpm^Ifm%n-3Ob~;8ZPV<{g4086T;yEFwhj6D zK=K4)fpwK9bFc+5$of#XKAvQ7+|hwLS(%>kfuJh4I*o+d*eTkAzE<{G+ zS+?lWbKf}sN~Xlwi$n3j%78-KTKUxOmV*$DbdEbR&?kSr#a+9|HvZAsnVN}o3Vq`y zLEbn19Rq=qI$%IwufW5u3(!`sa8$^w?xJ|T_437K0BrKfvEJ3!W%En0Tki82g2sa$!i75n{c<V1}Sn z{isIdsmRTvs}>g7wV3YgxcV46%$9FLs>Wirr@vAO4gDL4VZVaYzAo z?>I?+2PsI0x;@q&t6r@Ef@<$H_!*s~)@T}PsN)7qQ;d?zO zvzk+=YdCAQ{VFibn{OZ`-5C7jE)*Erzn2z0RQl_d)Z3eEP(rPZE7DSFZ?%_ftwj;$GNNbOCa}IlYl}cG-X$SIYfCQ=wW18~4phQjI~IhvY3u__ z5Ph?FJQzTcFgJp=Fkubd-U`$rAq{npM1yZUqI-Vx^dA`4>}?ASM~XfqL#|(4*@twr z_@yg!(Y9Alc&L5YXsbZ1_lpXQQaHat!NAV74S;m5-iWb2n(7@0i4Ws+pD=mfKG%x1 znTXaB%sRlV!M?#WFh$#S(=ev`2Q)kcZOVKUCI*2^(4-SSlPmQU-963IRk#yx(cI~g zS4qDp(s?aioN!z(@WN&eSYu;-8`OwkcSLz{7NVT>%*`ElON)>PmSPw(1f3{Se{gZnTH1#mSlW&Tx#pt4X*diLpBgop2@ z53nQTd5S?OgnOj>9*JypgV`CfX|f@ui*TbhPeW~CU=kfvO|Z{&mE zOhNjOd|UhBwIt{I(uvc?vrw7!_Mlb|2kSco?ka|w?^K(K*G6+z+nZDeLd14+Z0=18 zUyo{3Dq*OYq$rwRrL8<#AV|s^z!oOu`mjq8C}T01oT>CpbWT#hH`LCoV-Dz9I`E&m z0xU#DkGSY+9^uQi7Pk#6!;c9X2^&2V7!X8tZ&wfty|t6DA_~Hz1)Gs<{lGa{u`(ge z1l`tW)pO3)&l&+c7XjFy`hxKWCfnPf=5UCL{`J?}G#m-%QZ4$4imqE=)2NnY?$VN| zdd{>dlW)5PBg1ff*rJbard~U-$sZ;qU2rMj6df`H@IlAlUmX2X+R*5iOEXNuSA1*ZQb-_oaZ~$E2*`lZw7|Ec1@5In{`)=xwUxm<7eXqo}SI;`u9x6 zKUe8gb?nC_{BSayj_Wqk%bnZZ7N46Qn#@?T%%szX10PWAnm!&Wdgm?iOJFiBPKtP1 zpC!&~<3)ymkvz%zq|BmS921-C9OljMd5BY^Q6Yjq(S~&CbCe02{Nzfrb`+Jho`_cF zr`TC_5K(2Zlh!z& zY*Xw+F~E8KIbraMlbT+@?vZc!{uL^|T2~|9RtlP;CGcbt^s=TG5J?jpi>_3hd=p(C zxWxcSG4teTBaoBa18L}`?fk~lhHR$jh_mI$@be$5_ZpU*JnKV)u323?s_@LGVwUdkj+$s~Ru; z8b`ph)GUJoe+>)*Z@bUIy8gMFw2R83wN-}>AoARk(9pH-M!|qc+<>Zu`%un6s`ECm zBG`ELBY71wt+zDSWVe}CtZb6dcS|)o0^wTay|QgGRLav8&3$vqLys2Hk|~R`)&1h~ z7p2_*{75cA?EHyCL$bjc&GniXvJTWpcV)Q`WZMhg7we|mQgJE03-QK8xIU$nO7og= zJNQh)T$toV{}zSmjk>912w!DkRbG!)A+%)9RVH-$jE}8%!+(7G(jir-fLEtUFi|lZ z*!8SlB2%~@&sItTEau2x5_NXH7+eRuV)KEQYvaS8tOa$HtjEb${VnlKvAR#l;UYkG z!kaKUC@2`!8+`Yz46K)9x+xhK_l`$x59S!T(~yg54G>$6N_(9<)>%u92|!JZcaH}6 zGjUnm1o=$K+9L@MVoqnozHlAPUAl`kZG;!{J=$S|ylDC9$5Wv!R)ww`wRw=zz#WR* zr_$Livy`<5)qN8(6h;wKN{-q=)=0`Zg_xtBwN{Ua3Me-QJ^D;4h@QnhvzG|VeR1q9q5r#^8(Wy8V-@5ij~ z^`?GPT*dbpP_RPql|NB1beYb(ZM8zykZfO zPOhpnwvwLXK< znj+%lVxa@@?QlKbW(y8zZ`+JXs4i&~^41?BT~0-%=zGSf_>No}XtTn~Oe=qJi({>6 zXmeAKy8yZ_zG1M9^r}sk5b#N?L zroH}5*ekI*3>%+wqOhfB4gCG&R4H>~PP`p$yj{X)Y9uOKo;8D~@Qc4S*mfNoFT)XA0d%-J#bH~k(BcDRZC=NihVkmDd;=3%4 zbuLRX7}Ml#jP`)ckAr((yN_Ut8OCw5aGAO#4xn155O@i@Vq^k9f| zh^3s?^)SRcyK1VY49%j#VSvncsJa1pJD>1(pa(L?H2_`dWE-u50W3hT4#SFDsQ{Bv zY}k#XPHjoz0=$nPe52#Xs*lrR#QhWX4Mhv^b;6mZLP<(}Z~LhRJPi#?q~C|`G7EI~ zpN3`8685tOE(iowG>kupBSj}nuYWCOKPG|Ck6c=F)9FL-!qM8b6I&R%acXn&F=qe!^?$Zk7t}*f4uIb*+$smI-Z+x@k z4d{Mj^I;x(J=*ivs!c~D1{=Kr`(Ov7XgXE_`KAfyt33PE!CFfDhMp-HZqz{d17A`N zH6v)3{(RVDAD^8%kFFnmg%w8@>+QkO@-GP*p8Z4gs)5Ow>~1zyh=3J7K6a+M1N01g zFm&@YLMEE=&YCUOX@J1)BA8ruK6utMGU|+x-pzJ$k{hx-wQYAB#M)oxt;btvHE1IC zT;u3t1pLdM)kqESVf0_?_)yR0TL=x$>+UlNam;tS`h4^iC(R~$cHoj+U+Mvb27G=V zDmssz@Ndg5jsID8iStKOm-T)H5q!SCNn3mw_gm^y-Cwl8|JeglDAs(V=^sMw8V72MVJfzLEBq0l_^Y12zl*Qw zccb=h6*6{f*=W}razp%B5qQU`lnUN1Q5Obg4`UB;qcmYv7Xd z^Sajn@U75Q8)w;j?Qg;antHimQ3Iv6Od+pte5nNQI`JUYX=JsjWlEfO^Ij07Kg^R? z?Juz77+X|T8F%p)X6_db^-%xdaD0mm-4RO6wZW6J`0(AD=QD|S7GJxY^3x=?=xo`~ zdq@N_jKm3grxn6D`-d_}46V*f@6sXr8K9{(K!!&*DOEVGzLBDevHHVap5RFyqBZvZ zbk(9IfVw73APE#Pec?`PeDo%ft?+eG5@W|`OA4*v(-rHBkZSH)?=Ib7@Gy; zokA{pEA$1WXbptgC*`H711uyX9w%d*O4bR0?lKG?_M2u1+OB7ogLF)OzV_bsdRi{# z16c}16V(cd{)Ww8Q~}`ZThb~`9YkmqOq+H>8a^3$gS)L{p?0$8NV0awgL;7!fmp~g?1Zsxb}7P10EUYn-9b8 zwn}zMFyAw-kjgDFB(fcQThvXukUZgQ%jk9Baa^!EU>~@Z8?`080c$Rqfm;bQim*g} zh^dmeDk*Jd{XlkvxZ0j^v@z0o+_`URXSb*vmH?r1)MM}+)ZDA&)E9cSmXOT`Ph|7w zc(Y!|H%#)HAtKkEN!gs;h5x}@92(5Tr#7AoE)}_(hQ~o;jwY0)4=FgSOUg|g(|pxd z91jQb%zYsWtt69vPj;ZI>HT70Ri{1!b4S3rzEQO34%P6lL%m#6$VXg+c)8s1O2hgB zV*Bj#PD3wCR;};|iM7;W;7seA>f^3eOgA!^|8czavmi7K9P0mgNGL?JUrW|7W@ctS zLiCwTHWn&jXE}Lo{V;ZGKid8=(9l6)wb->4H6eTyicL{-(y0Lryf|4i`ej0q=IJbT zoYp((xU_iD5%(T2GnijeQc^~>JJQf{y zJ`kKsrWTcqCb1Z8KYa!AdTCrL;siRIHi0-G-Co+!eW(FTKpKu)$1`gcvZ>z3Har62 z)r9@e5~Eh1#86&K_PY20-1TbmTq|`t^A{cUF_xLKsc~Ln8!dC$EI!wzJ>saG&)5wd z&ZNf-Z+AUQ99!B)MvuB$YH_&>`Y`30UNscxjHS)2zP?&}QyX*MbG5nMX=41T$J$zQ zGVq`Tp+=SHTP>;=7QdKkhdftafPCzCi`aa*Scr#?bzdCqpANy=s5TXTVElCefe79T zktla^Q2%Z?Yc-6iq*k)(*03E7h(;p8Ep=m3{jVfj{WfRZ<_KHy)aZ~Yna~O;F%yl% zDPoY&g{BWvs_C#cOSOkmb}S!3tj%1d20lLi&)t*NX5R(FOxNBs>`-i)f2By}L7NcI zgzdGYv$nTkVYRN`qzva6pjETGr}=h@JjSrHWh<{M_JUp66%Y6+?kEhl>dEk(2i$x} zz~*7RNTKQ~^#Z09Leb?5pQ#M`Rw&*LL4A6VI%nTa>e z&F1gyID4pRMH|}Bkl$5fP~X%D-RyAVTd60fYaE|opYY_1SM`o9RuXwJ@bbHE88yKxe^0itJBv2+tHSsCgbSnG!c){U7(b)NW`}fWmy^Er*oHK@b$JM7t644NxvKYuD5!QnP8F6vMy)Xvs6Zo*~sah$v~F){IAb$99! zcPYn&uNGBW-KL5!-MYs~8sz)4y7KRk@nb@8WO?^R;Uab1;(# z;(?RAkbn9wnE7*<*GH#=Q&Nx%zP+hLP}}Raz@FX>(xuv;JZPv*K}J=&LelIt+W$K? zX>$*ASz8B7cQ#g2ODA_r$CnP4&R&*oUbdFrtS(O0|10WXXJ_Z-=BBTpt?H z&}jd?oTH_OIjW4gpuLK;f`_G}o{goOrL3E?qx*GvR9Q4(G&JIWFYoGU?q=@fVe4dx zRwMS!wtW zY@9qioNOFS{My{|GIl_D4`)+deswn)S!MfI0utAzVtQZhe?0#Wk2<(nUKLV{nKg;Rn@nuAwT zl2cYv@;?yzcl%d2_mQ_We`V>$_P-hj{xkb$=i>b*`{&@{;XtGI`M*=?e|7u+x&3po zQ#*RtI$DZw@bGc5^YO8B3b69>adL8SaF0zzYG%^TF~!*iRCl7 zHRG*stn;;VACs#MO==fP|3(}L{{Fn~qy9o_kp>J>XX3rRxoHUV^zG^3kG*A=1# z{rV9{_q$>DfxmqpHT?H=@wHpOZx7u4eKVWn_eqlN#*1ig0KZQ-(0`=%FE9SfD*g-g z{u8yotM@-r`)^_GFKYh<*8ZaQznQgvqxQd8x8W;YcSu+>e>R$kHT?U^;2K}77$)2{3|qlJSsau zqak@({q$3kI(#Q2!A&X-j1?9oiOFA>Z$S`7I0Zx+jCsJ8mTf zA^$Y9jr|vm=b?vdE~Qya=5?2twG9pn6@3L8ANT(}sC%L10dFTE*yhB`5IjsI<_K`y zH9WpNOj|9rq5rKGK@W(0k#rqwcwU}FB@y2Q#2(uFrL(@+`sxZ0l`QI341d7iU2NY^j$MVbo1eD3gQM+RaWpA% z#2S9NpF5aF??=~#jp=^ymG~_KS>=`5Pou}WQlW-8$;Z=0T3M7oHJr;we>VT=)R3gF za4%C4D2p#Ls_b3JHb;HE;zl_1&&_ANNd(i{)&)-14Ilnod86o8@jif5MiE*o@y7g* zx^w!rYE>9{oC+|a54P+C?DT17k8<;otUTPF03?}v+L81da7jJOm((#l7>;}U=&7{F zspT+@=7mYVq|Jt1Y~gZ%HK|jElH11G2!9qeN%;NAj;|j?(yIA*aG*=tFk!*d90d)9 z%bh2V67o}qx}K-vm(FLsBD!tupo5-7Uo zq!zD0nAF?ssjHo!1QYns8QWskc(9aex-&60;5psHSkH1d4)Yo$!QKp1@eeqvpLYxNgjeHSac)^4p(_9;@5IzE7oueM=T`8=SdJs(t~0zpVd0 z^`$qk4~wtqJYr%SD5-W0E9?U)uomY0!LeiGZ+6i#UVQueyvrt@Ak|;9&z5~z$XEA1 zPYl0YjJEj7`k0Rv+19cXY8U#RAJVjrm*Es~5s!UGr{d=z5h#k0`}z7tICdQsd;UN} z7~8#*jdUpEmDv}LU!ruhOq1}S&@X$h!fD{dVz|>=h1Ya4XH@*Q{FdX$=B4lqvZL>Q zvAd@gi{JW+`B)m+CZz17?7i<9i#{9mz;{`>lrt4ea`MU2tM*>p@1}ynnW&_ORP`TK zdm91H{Rjw57a#YwmNjjMA&%>L!iLoX78d;aE~r;cdS3y4BfI!otr9D106HtuBrZY? z1~@AoRbZMOH?EyGzB&%jNC^uY;L}elVc8#Z0A7S8_jEi7@a{jh*0lD{o1K5?>LxWM zG{>wZ92L(%&;nVU>J#Ahn?)RF>L_JpEzs8Tz;90r_tsmyv^+}&Qwce6=p2$z<@H0D zX(1wqo&B)~{ajei!_F9xu4!Q8K_U-DK(YBBg8C;=p?DX;WHvJ|ZxQnCpoK5gpMF!SR?B8%~Fl?L?M$C;5KVeTS7;ipb z+({I3T_VxCmn?MdftO6G*6bD4;n69-+e@kXku0Hq9zW zqTlE>UVrd97M8KL9xQ~O9lnwc`|xU-b{L%T_`&x2^KI`7@0z2NVD_w_K7z^1ixM-> zPZMsKIgi*rS5D$nwR-z3Y%eZEXF&-&0g3#_C6fo+Vmkqz-cnpf5B`95Oibo7NY&VX=IjaTWW8K434gApJ+{Q+Ui7Z7ggQS*j z@!o98eh0gUeIn(Mx);@uHh*!Aox8CsE$>NB!rVLiB2PF)$o1dEA{V!h48SXoTo_q? zGe~`uIm*KgAQJ*s#=5FY{UT9wLJZJE%L0-}mo24!0*xNQa%>2{zGpWPo|%@J>SQ%^ zWEkUDwFadm=miS!?7+Cm$+~QcOWAii(trSqP@?Fd6X zd|%RFW?;V}ztTPW6*{_wW)6J{J;1S-jV+(@RT|Bo7$yvRayaFDco!9Au&>Gg`Uj3^-j`N5rgm&t2{B z8r?ZeoGBa|qZB$oV9vGXeQpJRoT;F{2Q8L zwBBd&jJQ*3@eHF-y1^Ic=?II=Ix#jrvX#^JQ=u|9w~j~P^Y_Y+))=KjawG?*7D_hC zgj0Vs@Dqq->lEwAtkYtvg!**nH1&_dswVHkmF^wmxY(&R^|B=9^I$Ur9q#*nGIe{G zR@n4i2FKFZQP&C7GUMb4Hg1YBiTx9EtE@ra%eK7_o29bBDs6}(zIF(0@aYAd&lJYL z5gU!P?ynH~u?Y09=(Hj(x##XU{+|FH4bKSvCozbr0JH%H{^_Zq6^psUA2e+Ne>s4U zRgkYdO>;Sve^MUyX&aB!dOp$IAqJZ}Z2>MouIr2JEi)$ob5GSEYa1D*r{(D5f2kI_ zOY_nII1I)wsOTgQ%^E}7!WQ{$4(oQhye&;<0#D&ebO1`CkMbe#c)9m_d4<{x#G}N$ zmg$uDephE^Dmr8}dKFZqsMv zX+QR1-OuzHRBdyE*+_&$rv9t=d3&}1%R1*|d78+(F-G&C?tIq=gijNqZJoiOy?0hY zB+X{W6d{J9e_|MRjS2OGvkF+~eZ5}DaR0L(?C)3MlV5ob9-%N>n;VzDF;ZHd7Jc#M zOXKI;uI+vvHOg6o+@FVAzQOPKUs&($RjS_o{ZDBC^WUF+yW_Jf0Ot2<@2J2w#0^mQfGgn zdv-&=`EM6pi!BGAQ0bj5$LpBcmRqsMao){3Tc)5Mmj})kUi*SiUw1NcOIp2SQt7oj zJjP2G^^%qJ14PHYI7Q@*4ot0b_tuIe5&RZyke7fZnOHt(XKmg`Y6Dr(xAST?z%AbU zyXv4ZD6i+G_Jp5l##OoSgw~{{hIh{B!75g0WxQ^&&e1?0NOf50uXf$f(HXtyD+pXa zg50G85K{@)`R(L{BZhJY$>;2JW{k?}7@=d6#yPM?hs=V)za&Kcoqo!+!j>ua9w}(> zdue&pldYajvwg<#-5i5Tt*^}&uLz&MksZ`dG^z5_n?(p#+cqOvQy)BDc&_bPdtRUP zN}o-a*VEkNL)!Po{QZHquc0QgbZ-CxEOY|uI}?wd)|AsGVxKHkbUWFtwTyA@$`t?N zP?gj%h93nZZa+1xd3n(o=cbqK$iOgp=C0xUQd~Wr^ZDes5UXcw#si4Fyrm>fDpUO{ zZr&flD}DFWJmN|1OG!9mi-|B^YwNDs8Lb~k(fWlp@7g{@)Q!deY)W#5u1G$Y2Ji_1 zC4)+}aa0_82Qdw@$liLFftN|*?)xs+47@UJOw%saE!v1=iqT=xv0B_DAa>B%^ZW7M zePGkp6D5^TR9?#tKF-6f#_7gXE$~FN{(&8$>5Jp9*~Q`Bdz66&4KK8;RB^? zTc*~hE|(v&lCiyw+aW8}k%3iStqa{rm;MrF=iD1Ltss~B^@PRwBC#vi%OP=k=4$PS z{zqU_)8gvKK9^^kNny3i%9dY@0{h94YdMWpN5grEwjJ2rK;wK!)>XsGgti5)q#t~D z7rCEjkRqb)e=}~o$0Be!mOG{EjclYoU1`m1 z;vD(ExcKU*wx1_jYF{c8YC!QCZY}P#P)hOQZp8@@+=8@)LUAi@#X^zb2^y?OaVJ0^ zxD$dzu)r(r@11wf`#b0CPIhN!?##XODI%1YR9_8R9H0}f02-{me|Q;WU?omm7w+Ah zGT$iqfz@f=p`V(Gl%i|Xf!y__p&dx7j(CT zf(9?;is<{5mNI)|d+qMq5G1%(%vJAA#s z|9LF^GME@{VjH}KBuhR(mBUlT0ps=Xj^a1#7wav9X|u=b#va&?L5m4!7Ami+d+??J z-plu0nV;=hPGCM-GPW5mYFDsWGd~=B=#K}YUF87I{q3)pPrvK{#kx-By$Dzru$_H) z?YW=3ta-$@2sk$P`#w*|+eJx&8b7sUjT^k#kR(y8r@$a8_Wjpk0f9+{*|Rz3gS90% z^Wfrbh`?{&cH>d?<1bt97TJQ|8YC06Q}1O`D=1+@@LXKIY;iaAvrD)qzGr{9Y5q&V zxP{i@*ciYQ*9iD(%lX#j84&on*U@Ol($u2#u1bACR~D{OOp5u!Zp4QN%))^@A?A2k zrL|5!EYDaHg-?RyeT1=q_^U^=YQO-bE>mR5JR zc_SFU5@Y)E>(r3vw?pcH03T)frErEo$MGCVRyt|P@j6$S{OJ?INlo>( z^+3k#yb7+?cB4v7a&;#JU8v4mcxP+ZuXg9P1bTKto6$_y9%rpIdd$q}p7R$i+b=HIRkk&{BE^S@yzlwWJBDKkYeYIRs$|?U!LAzB zBFUahOjtVl+~TLxN$zg_FX5RbG==vwk^3(#EO`5G`8)9(@at1v(AoIXjs5(1F=icx zSSY;f#b7HC;H+ryfcn|nU%>9_sGt@8E-qNVPai8CC{%EwQRp$_^24*_)Bpx0^(23L z#U=*YdC<0*NjFHLJr^dYr;Tq*4(UK9-R`4xi;TH>dne=V(#OLzBp;$E(P5hLK~B** zx{Ws~taczv*ULfB|0X$l!==8{cs&WPK}<`n-B7hWmH$se@L zFP7=)(t9xSba}|Z>fKk?^!C}X8j9XhWsQ@G#XK;@BKj8EvWr&`Z1mW}sbYG(?baQ? zC`>gU!kr8oDZnFFX^y0uOO8v#2W_GTTx|kNv?ceD^Dws3Xi?~(Gm%7PjM@pCQ6F-(``ud_(q6D~^L&xI9;#S@TLSEhZ=T$$DOX*|3Q(P(aJ>rCISk?8{H3%t z{!HVeXmZCChiYXHYN@W%EjPC*#JS`jXcCb-Rdbk5groF18lU2>6y<4UY>t;qJ_g-` zCU!0eWayt><}|t82utB+cF*p^+xc?LV@*bN2cnphb=ElKG(gF9JF_<^fEQbsu4qD? zA(gSi4hQ1<_)3EBtxIh3NwV0n?93J!7<{iK-9@RwE7+0$u6DCJ;t`>ybTUH>vge3N z8n@RD;Yeh-D6m9X{&GvYnn(Q~(AbdWt=7l&`T?5F`D}w#!5OL%n`VhlsntX=Ubuv>QSsq?C2E0*%*Qlp9f>01bfM=}c^fgwp|$g0m4w75O#KX)*O(s< zIZj$br1d`vj_%H%t(^R~IBT)O-Se}TrU?1F=Dl#W+JlSy4mU1VHbWvY0kWg?w`15! zPV_rE+!_6qRo09cBq~Yg9y~$xDtr`+B#_76@z0zX=1flID^j#79__*gC5H|PD!=mS zuP>?fRTaoW8U-F8me-hVRWNA>w_)_U8Cw*jg^~j_bzsDr!9WJcw6vqN^97akf8*bs zd@c%E#{_p2{%w2yNXx2x?jq+Nc}sR+jL{nV4hxQIa{RU|5E85MSQ67`Y}la2FKPwb zBp+HW04ZzRbDv2mNqT9Wrq(v!kFa48r2)e7MN{wvJ_G!>)x!0FvNc)XQx1N$VKwzn zcU2b69DkrbUWIc<6+v?{K`DRm5srBB0Lgk&;2ieB<>)i17dnhQg?fo{f$OcN+hSO; zB-GwBk3UA9>M}*?unC6O3Q6Tn*io^V#y^spF561V0=>8MV-mxIQ&s1{&hV|?w`2Ta zy`I*o*`OvHw*c*KLjt?-kdV}$o83StM(`=p-Bwl#%XHq}_*@KcF8@$e%dXz|+h5Hl zZLFkG!LLrO`(gSu`8jX%_kKRBNtvPmq4m;fQ^h4H^}ixQ$FKPi7k-laay~_=5cQH| z(bi16OlrKsy&(sq|G?!i@xtwV7d7C)P^)-wtNA?ZP8ojz{Ny1(xP*JFn%{pNdP~We zE28u_v7kl?s+2vi;otW0SI>~D0-^K_anao3)zX<~E6W2}Ge{b~YyID(a?i`eu0>;p8oo>Vk`SnYgObATRIY(iC z_9Zv_)SE}@$XJ=jM3!f8_=*dFE^-@kmYe!8#qa#FIo3ocICx z$w0aiY93~O@b!*(^qN&(S>sY;;(*oafPKBqr*h><(HtR6rm6I+B>mvl|e?{8^I;7U6X{1b1b}KdCz+wccD=Z;kH(n z8H_ss=d;PK7ZbiF`wKSa^uQss;XrB8i}ZKMLeb7~Bz&;N>1Zf&n=w35FFN6Ufec6D zO={Nq#>PO)qkcI`x~!9v9t}^(|HUwOJh&&Aocz^qx=h#5$@=G_tK%VG)uf<~*~fR| zjb?+MUwh8=pj-?y5K~?|`75P*(L1N}Q^+-GLw^)-^)LoFl`BBEuuJob!`@Hh=;sH` zB}y5#;w{k6LZzV+vt{5dW5pwL!jLsC&euarHfL*Hz<+YMvr9}#av)IhLop>SS{UFx%-&C!80pY)Nx9xi@78B3xz~ zN-gG_n~8HXjB6@tr$ryn20nMi$WsJPkMVmbx-r&6{Wdf2lrb_rn3a@ZqtvcHPH#b; zR~>)RGO&1zC{Bd0cxv*Ed#dEY6F;0DEYmeHy*J*lLe&?S{j^1Q3rHr;+YG39O#USE zASeD}_6qUjlB-0oi_Z^Yn*3%aJZ8Tr)S9GaSlSAge=8bUn)Aa~K3)HT*tWX_K&=Z1 ztRTR%g+19vvg*u3O*dPUbLHe>fN4}wNml-}@Os}}#1ThdaSTKG0L)y7mnjtl`oviT z-AolT8M*RMrs*m&d$PpAo`bh&#(3seWLeb*;M1)~%n*OACm+788OSMIDA|@rHtHIx zY^miNn$DxZn?+|*$w-s+a05Beyl1QFeAAAfESOtl?{^+Z*eiRn-Aej`r(>ALh|tMO zeK9PeXV}&lIMsg+@W1$*UrB;;(;m+6g4Axh%r!NtiSCp42*Q)bnNtgxQ;AuSW-zqb zbZlMQVX&maZZv5!K54AvwJCFrZdcN6LiL}m0VeCQt?w;<6eB&It8o~3wQOT<#hc+( z5o{g!GFjTHMbl0o>9R*`Ck_*mz;9Ix-wX>!Z5F*nMXVXm`THp^CG@pNAa`zg+SAoXOc)j}&>YN%}n(LZ z$4zhL*dA|j;s2CB{lDk`$kNxc05qxLId^cK3iPSLtz>&+%F+K zYHaQCWo;&}#VPQ7Tjl}pKS&@eHFY3k0Wki!(ILm4JVLus-n6rRoK-uFRWwX9p>B#Ppu_)=<(IyH4_$r(_FULMk<%C(eX9Mi6{b%_I^ZY2~~V` zb9@={IGz6Qf7%$&xAg`dy2)%Lt2VRrN}IR#dAYb2#J&1Hwc^{hc}WpJc9EJrk?~hj zk#X+zSuT4Vd2mfqR!wJhcW7*+&_w5eFt|GjNX*Y`OE1( z|Eg2y^9QPOM16eMp37c&ND6%8^2S2r8Mu&o2R!iVy2i7@?i*1#4F6-z-h~4RaMKTo zXw3a8*GYyTcxlPn>?W5-&cLgwi~=6rf%*i`zby;1{5}rJGr$S0JZU!_)hsXFnc-Z> zY1eGk#v5_2DM9mZO4|pJm;jZD5aX zES<5Q*PgQ{zH8I{bY-0@k!U`00d=(gw@>itAE>sKR`M|@o+rb5^#hNW@0qB1^Q&wJ z(D9x^8K(0!Ewv!ASTry{20=yc3(wN|+kb*R-%h50of)pJ;Pyg--uZUND;)-K@bl_`WN0%6yP4_B`O}-K+m-@WtiRAf|O~%ah(~ zh9c zf7m?!zc!i66e8e_o6|blhaDT!)$-Z$LI3m`W=BW+!-b+&G^pM4lC|^H$$$Ed*1b60 zxcc3NZW)oYfOGgR52L`%f7XWFDrmrEstj$p&vY&)v4*Jrcti5|z1>w3d{J&a&dd%M zHWSjDr1SM%31aL;MPg7;tOD~Dr?N_^tcS8^SLclF5=^AeZ1TQHnUL{Nq#jo5_G9VJ4l@E(PtUgD z81IIYbH`%Fl@*|VtGPW)*5K!*2Ib$=mEJ!xNE zG<6W*W5s;$O5J_bP2O^~`FQR2u1`;20<|`ns0+xpp4~2X%{ty4GRVZotV@du`Gxz# zWPSYiDMF?CI0noTT1jXr?(hT&6@C$>(^`yX%8bCsCfdq^wr1+#9X zg{)yN31(_~B>=NbG!hfF-rHR-9c7zG9jQT7tIc+pJ=49%?hpbhx4EH7Zk#V$s}#o$ zIifF|x>VTjYuZJj6c|B~oJ=GcKFHg>2U}^jq-0lgi(a4*fR3{BnVJN7CBQVAT>i9g0Lcg^w|atz-msVCA+7 z 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 z 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 Y@!#>^@!#>^@qcFg4}^t9{Q$HC0I&TR?f?J) literal 0 HcmV?d00001 diff --git a/doc/src/DecisionTrees/reveal.js/.gitignore b/doc/src/DecisionTrees/reveal.js/.gitignore new file mode 100644 index 000000000..a5df3133d --- /dev/null +++ b/doc/src/DecisionTrees/reveal.js/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +.svn +log/*.log +tmp/** +node_modules/ +.sass-cache +css/reveal.min.css +js/reveal.min.js diff --git a/doc/src/DecisionTrees/reveal.js/.travis.yml b/doc/src/DecisionTrees/reveal.js/.travis.yml new file mode 100644 index 000000000..165d9ae9f --- /dev/null +++ b/doc/src/DecisionTrees/reveal.js/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.10 +before_script: + - npm install -g grunt-cli \ No newline at end of file diff --git a/doc/src/DecisionTrees/reveal.js/CONTRIBUTING.md b/doc/src/DecisionTrees/reveal.js/CONTRIBUTING.md new file mode 100644 index 000000000..c2091e88f --- /dev/null +++ b/doc/src/DecisionTrees/reveal.js/CONTRIBUTING.md @@ -0,0 +1,23 @@ +## Contributing + +Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. + + +### Personal Support +If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). + + +### Bug Reports +When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. + + +### Pull Requests +- Should follow the coding style of the file you work in, most importantly: + - Tabs to indent + - Single-quoted strings +- Should be made towards the **dev branch** +- Should be submitted from a feature/topic branch (not your master) + + +### Plugins +Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines diff --git a/doc/src/DecisionTrees/reveal.js/Gruntfile.js b/doc/src/DecisionTrees/reveal.js/Gruntfile.js new file mode 100644 index 000000000..b257e8f32 --- /dev/null +++ b/doc/src/DecisionTrees/reveal.js/Gruntfile.js @@ -0,0 +1,140 @@ +/* global module:false */ +module.exports = function(grunt) { + var port = grunt.option('port') || 8000; + // Project configuration + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + meta: { + banner: + '/*!\n' + + ' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + + ' * http://lab.hakim.se/reveal-js\n' + + ' * MIT licensed\n' + + ' *\n' + + ' * Copyright (C) 2014 Hakim El Hattab, http://hakim.se\n' + + ' */' + }, + + qunit: { + files: [ 'test/*.html' ] + }, + + uglify: { + options: { + banner: '<%= meta.banner %>\n' + }, + build: { + src: 'js/reveal.js', + dest: 'js/reveal.min.js' + } + }, + + cssmin: { + compress: { + files: { + 'css/reveal.min.css': [ 'css/reveal.css' ] + } + } + }, + + sass: { + main: { + files: { + 'css/theme/darkgray.css': 'css/theme/source/darkgray.scss', + 'css/theme/beigesmall.css': 'css/theme/source/beigesmall.scss', + 'css/theme/cbc.css': 'css/theme/source/cbc.scss', + 'css/theme/default.css': 'css/theme/source/default.scss', + 'css/theme/beige.css': 'css/theme/source/beige.scss', + 'css/theme/night.css': 'css/theme/source/night.scss', + 'css/theme/serif.css': 'css/theme/source/serif.scss', + 'css/theme/simple.css': 'css/theme/source/simple.scss', + 'css/theme/sky.css': 'css/theme/source/sky.scss', + 'css/theme/moon.css': 'css/theme/source/moon.scss', + 'css/theme/solarized.css': 'css/theme/source/solarized.scss', + 'css/theme/blood.css': 'css/theme/source/blood.scss' + } + } + }, + + jshint: { + options: { + curly: false, + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + undef: true, + eqnull: true, + browser: true, + expr: true, + globals: { + head: false, + module: false, + console: false, + unescape: false + } + }, + files: [ 'Gruntfile.js', 'js/reveal.js' ] + }, + + connect: { + server: { + options: { + port: port, + base: '.' + } + } + }, + + zip: { + 'reveal-js-presentation.zip': [ + 'index.html', + 'css/**', + 'js/**', + 'lib/**', + 'images/**', + 'plugin/**' + ] + }, + + watch: { + main: { + files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ], + tasks: 'default' + }, + theme: { + files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ], + tasks: 'themes' + } + } + + }); + + // Dependencies + grunt.loadNpmTasks( 'grunt-contrib-qunit' ); + grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); + grunt.loadNpmTasks( 'grunt-contrib-uglify' ); + grunt.loadNpmTasks( 'grunt-contrib-watch' ); + grunt.loadNpmTasks( 'grunt-contrib-sass' ); + grunt.loadNpmTasks( 'grunt-contrib-connect' ); + grunt.loadNpmTasks( 'grunt-zip' ); + + // Default task + grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] ); + + // Theme task + grunt.registerTask( 'themes', [ 'sass' ] ); + + // Package presentation to archive + grunt.registerTask( 'package', [ 'default', 'zip' ] ); + + // Serve presentation locally + grunt.registerTask( 'serve', [ 'connect', 'watch' ] ); + + // Run tests + grunt.registerTask( 'test', [ 'jshint', 'qunit' ] ); + +}; diff --git a/doc/src/DecisionTrees/reveal.js/LICENSE b/doc/src/DecisionTrees/reveal.js/LICENSE new file mode 100644 index 000000000..09623076f --- /dev/null +++ b/doc/src/DecisionTrees/reveal.js/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2015 Hakim El Hattab, http://hakim.se + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/doc/src/DecisionTrees/reveal.js/README.md b/doc/src/DecisionTrees/reveal.js/README.md new file mode 100644 index 000000000..573b19597 --- /dev/null +++ b/doc/src/DecisionTrees/reveal.js/README.md @@ -0,0 +1,1052 @@ +# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.svg?branch=master)](https://travis-ci.org/hakimel/reveal.js) + +A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/). + +reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [Markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a modern browser but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere. + + +#### More reading: +- [Installation](#installation): Step-by-step instructions for getting reveal.js running on your computer. +- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history. +- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own! +- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks. +- [Plugins](https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware): A list of plugins that can be used to extend reveal.js. + +## Online Editor + +Presentations are written using HTML or Markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slides.com](http://slides.com). + + +## Instructions + +### Markup + +Markup hierarchy needs to be ``

    `` where the ``
    `` represents one slide and can be repeated indefinitely. If you place multiple ``
    ``'s inside of another ``
    `` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example: + +```html +
    +
    +
    Single Horizontal Slide
    +
    +
    Vertical Slide 1
    +
    Vertical Slide 2
    +
    +
    +
    +``` + +### Markdown + +It's possible to write your slides using Markdown. To enable Markdown, add the ```data-markdown``` attribute to your ```
    ``` elements and wrap the contents in a ``` +
    +``` + +#### External Markdown + +You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file. The ```data-charset``` attribute is optional and specifies which charset to use when loading the external file. + +When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup). + +```html +
    +
    +``` + +#### Element Attributes + +Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things. + +```html +
    + +
    +``` + +#### Slide Attributes + +Special syntax (in html comment) is available for adding attributes to the slide `
    ` elements generated by your Markdown. + +```html +
    + +
    +``` + + +### Configuration + +At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below. + +```javascript +Reveal.initialize({ + + // Display controls in the bottom right corner + controls: true, + + // Display a presentation progress bar + progress: true, + + // Display the page number of the current slide + slideNumber: false, + + // Push each slide change to the browser history + history: false, + + // Enable keyboard shortcuts for navigation + keyboard: true, + + // Enable the slide overview mode + overview: true, + + // Vertical centering of slides + center: true, + + // Enables touch navigation on devices with touch input + touch: true, + + // Loop the presentation + loop: false, + + // Change the presentation direction to be RTL + rtl: false, + + // Turns fragments on and off globally + fragments: true, + + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + + // Flags if we should show a help overlay when the questionmark + // key is pressed + help: true, + + // Number of milliseconds between automatically proceeding to the + // next slide, disabled when set to 0, this value can be overwritten + // by using a data-autoslide attribute on your slides + autoSlide: 0, + + // Stop auto-sliding after user input + autoSlideStoppable: true, + + // Enable slide navigation via mouse wheel + mouseWheel: false, + + // Hides the address bar on mobile devices + hideAddressBar: true, + + // Opens links in an iframe preview overlay + previewLinks: false, + + // Transition style + transition: 'default', // none/fade/slide/convex/concave/zoom + + // Transition speed + transitionSpeed: 'default', // default/fast/slow + + // Transition style for full page slide backgrounds + backgroundTransition: 'default', // none/fade/slide/convex/concave/zoom + + // Number of slides away from the current that are visible + viewDistance: 3, + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" + + // Amount to move parallax background (horizontal and vertical) on slide change + // Number, e.g. 100 + parallaxBackgroundHorizontal: '', + parallaxBackgroundVertical: '' + +}); +``` + + +The configuration can be updated after initialization using the ```configure``` method: + +```javascript +// Turn autoSlide off +Reveal.configure({ autoSlide: 0 }); + +// Start auto-sliding every 5s +Reveal.configure({ autoSlide: 5000 }); +``` + + +### Dependencies + +Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example: + +```javascript +Reveal.initialize({ + dependencies: [ + // Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/ + { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, + + // Interpret Markdown in
    elements + { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + + // Syntax highlight for elements + { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, + + // Zoom in and out with Alt+click + { src: 'plugin/zoom-js/zoom.js', async: true }, + + // Speaker notes + { src: 'plugin/notes/notes.js', async: true }, + + // Remote control your reveal.js presentation using a touch device + { src: 'plugin/remotes/remotes.js', async: true }, + + // MathJax + { src: 'plugin/math/math.js', async: true } + ] +}); +``` + +You can add your own extensions using the same syntax. The following properties are available for each dependency object: +- **src**: Path to the script to load +- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false +- **callback**: [optional] Function to execute when the script has loaded +- **condition**: [optional] Function which must return true for the script to be loaded + + +### Ready Event + +A 'ready' event is fired when reveal.js has loaded all non-async dependencies and is ready to start navigating. To check if reveal.js is already 'ready' you can call `Reveal.isReady()`. + +```javascript +Reveal.addEventListener( 'ready', function( event ) { + // event.currentSlide, event.indexh, event.indexv +} ); +``` + + +### Presentation Size + +All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport. + +See below for a list of configuration options related to sizing, including default values: + +```javascript +Reveal.initialize({ + + ... + + // The "normal" size of the presentation, aspect ratio will be preserved + // when the presentation is scaled to fit different resolutions. Can be + // specified using percentage units. + width: 960, + height: 700, + + // Factor of the display size that should remain empty around the content + margin: 0.1, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.5 + +}); +``` + + +### Auto-sliding + +Presentations can be configured to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides: + +```javascript +// Slide every five seconds +Reveal.configure({ + autoSlide: 5000 +}); +``` +When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Alternatively, sliding can be paused or resumed by pressing »a« on the keyboard. Sliding is paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config. + +You can also override the slide duration for individual slides and fragments by using the ```data-autoslide``` attribute: + +```html +
    +

    After 2 seconds the first fragment will be shown.

    +

    After 10 seconds the next fragment will be shown.

    +

    Now, the fragment is displayed for 2 seconds before the next slide is shown.

    +
    +``` + +Whenever the auto-slide mode is resumed or paused the ```autoslideresumed``` and ```autoslidepaused``` events are fired. + + +### Keyboard Bindings + +If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option: + +```javascript +Reveal.configure({ + keyboard: { + 13: 'next', // go to the next slide when the ENTER key is pressed + 27: function() {}, // do something custom when ESC is pressed + 32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding) + } +}); +``` + +### Lazy Loading + +When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the `viewDistance` configuration option. + +To enable lazy loading all you need to do is change your "src" attributes to "data-src" as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible. + +```html +
    + + + +
    +``` + + +### API + +The ``Reveal`` object exposes a JavaScript API for controlling navigation and reading state: + +```javascript +// Navigation +Reveal.slide( indexh, indexv, indexf ); +Reveal.left(); +Reveal.right(); +Reveal.up(); +Reveal.down(); +Reveal.prev(); +Reveal.next(); +Reveal.prevFragment(); +Reveal.nextFragment(); + +// Toggle presentation states, optionally pass true/false to force on/off +Reveal.toggleOverview(); +Reveal.togglePause(); +Reveal.toggleAutoSlide(); + +// Change a config value at runtime +Reveal.configure({ controls: true }); + +// Returns the present configuration options +Reveal.getConfig(); + +// Fetch the current scale of the presentation +Reveal.getScale(); + +// Retrieves the previous and current slide elements +Reveal.getPreviousSlide(); +Reveal.getCurrentSlide(); + +Reveal.getIndices(); // { h: 0, v: 0 } } +Reveal.getProgress(); // 0-1 +Reveal.getTotalSlides(); + +// State checks +Reveal.isFirstSlide(); +Reveal.isLastSlide(); +Reveal.isOverview(); +Reveal.isPaused(); +Reveal.isAutoSliding(); +``` + +### Slide Changed Event + +A 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes. + +Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'slidechanged', function( event ) { + // event.previousSlide, event.currentSlide, event.indexh, event.indexv +} ); +``` + +### Presentation State + +The presentation's current state can be fetched by using the `getState` method. A state object contains all of the information required to put the presentation back as it was when `getState` was first called. Sort of like a snapshot. It's a simple object that can easily be stringified and persisted or sent over the wire. + +```javascript +Reveal.slide( 1 ); +// we're on slide 1 + +var state = Reveal.getState(); + +Reveal.slide( 3 ); +// we're on slide 3 + +Reveal.setState( state ); +// we're back on slide 1 +``` + +### Slide States + +If you set ``data-state="somestate"`` on a slide ``
    ``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide. + +Furthermore you can also listen to these changes in state via JavaScript: + +```javascript +Reveal.addEventListener( 'somestate', function() { + // TODO: Sprinkle magic +}, false ); +``` + +### Slide Backgrounds + +Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page backgrounds outside of the slide area by adding a ```data-background``` attribute to your ```
    ``` elements. Four different types of backgrounds are supported: color, image, video and iframe. Below are a few examples. + +```html +
    +

    All CSS color formats are supported, like rgba() or hsl().

    +
    +
    +

    This slide will have a full-size background image.

    +
    +
    +

    This background image will be sized to 100px and repeated.

    +
    +
    +

    Video. Multiple sources can be defined using a comma separated list. Video will loop when the data-background-video-loop attribute is provided.

    +
    +
    +

    Embeds a web page as a background. Note that the page won't be interactive.

    +
    +``` + +Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition. + + +### Parallax Background + +If you want to use a parallax scrolling background, set the first two config properties below when initializing reveal.js (the other two are optional). + +```javascript +Reveal.initialize({ + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto) + + // Amount of pixels to move the parallax background per slide step, + // a value of 0 disables movement along the given axis + // These are optional, if they aren't specified they'll be calculated automatically + parallaxBackgroundHorizontal: 200, + parallaxBackgroundVertical: 50 + +}); +``` + +Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://lab.hakim.se/reveal-js/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg¶llaxBackgroundSize=2100px%20900px). + + + +### Slide Transitions +The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute: + +```html +
    +

    This slide will override the presentation transition and zoom!

    +
    + +
    +

    Choose from three transition speeds: default, fast or slow!

    +
    +``` + +You can also use different in and out transitions for the same slide: + +```html +
    + The train goes on … +
    +
    + and on … +
    +
    + and stops. +
    +
    + (Passengers entering and leaving) +
    +
    + And it starts again. +
    +``` + + +Note that this does not work with the page and cube transitions. + + +### Internal links + +It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```
    ```): + +```html +Link +Link +``` + +You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide. + +```html + + + + + + +``` + + +### Fragments +Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments + +The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment: + +```html +
    +

    grow

    +

    shrink

    +

    fade-out

    +

    visible only once

    +

    blue only once

    +

    highlight-red

    +

    highlight-green

    +

    highlight-blue

    +
    +``` + +Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second. + +```html +
    + + I'll fade in, then out + +
    +``` + +The display order of fragments can be controlled using the ```data-fragment-index``` attribute. + +```html +
    +

    Appears last

    +

    Appears first

    +

    Appears second

    +
    +``` + +### Fragment events + +When a slide fragment is either shown or hidden reveal.js will dispatch an event. + +Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback. + +```javascript +Reveal.addEventListener( 'fragmentshown', function( event ) { + // event.fragment = the fragment DOM element +} ); +Reveal.addEventListener( 'fragmenthidden', function( event ) { + // event.fragment = the fragment DOM element +} ); +``` + +### Code syntax highlighting + +By default, Reveal is configured with [highlight.js](http://softwaremaniacs.org/soft/highlight/en/) for code syntax highlighting. Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present surrounding whitespace is automatically removed. + +```html +
    +
    
    +(def lazy-fib
    +  (concat
    +   [0 1]
    +   ((fn rfib [a b]
    +        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
    +	
    +
    +``` + +### Slide number +If you would like to display the page number of the current slide you can do so using the ```slideNumber``` configuration value. + +```javascript +// Shows the slide number using default formatting +Reveal.configure({ slideNumber: true }); + +// Slide number formatting can be configured using these variables: +// h: current slide's horizontal index +// v: current slide's vertical index +// c: current slide index (flattened) +// t: total number of slides (flattened) +Reveal.configure({ slideNumber: 'c / t' }); + +``` + + +### Overview mode + +Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides, +as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks: + +```javascript +Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } ); +Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } ); + +// Toggle the overview mode programmatically +Reveal.toggleOverview(); +``` + +### Fullscreen mode +Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode. + + +### Embedded media +Embedded HTML5 `