Copy disabled (too large)
Download .txt
Showing preview only (15,789K chars total). Download the full file to get everything.
Repository: donnemartin/data-science-ipython-notebooks
Branch: master
Commit: 5b3c00d462c6
Files: 200
Total size: 20.4 MB
Directory structure:
gitextract_0i39_wbo/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── __init__.py
├── analyses/
│ ├── __init__.py
│ ├── churn.ipynb
│ └── churn_measurements.py
├── aws/
│ ├── __init__.py
│ └── aws.ipynb
├── commands/
│ ├── __init__.py
│ ├── linux.ipynb
│ ├── misc.ipynb
│ └── styles/
│ └── custom.css
├── data/
│ ├── churn.csv
│ ├── ozone.csv
│ ├── ozone_copy.csv
│ └── titanic/
│ ├── genderclassmodel.csv
│ ├── genderclassmodel.py
│ ├── gendermodel.csv
│ ├── gendermodel.py
│ ├── myfirstforest.py
│ ├── results-rf.csv
│ ├── test.csv
│ └── train.csv
├── deep-learning/
│ ├── deep-dream/
│ │ └── dream.ipynb
│ ├── keras-tutorial/
│ │ ├── 0. Preamble.ipynb
│ │ ├── 1.1 Introduction - Deep Learning and ANN.ipynb
│ │ ├── 1.2 Introduction - Theano.ipynb
│ │ ├── 1.3 Introduction - Keras.ipynb
│ │ ├── 1.4 (Extra) A Simple Implementation of ANN for MNIST.ipynb
│ │ ├── 2.1 Supervised Learning - ConvNets.ipynb
│ │ ├── 2.2.1 Supervised Learning - ConvNet HandsOn Part I.ipynb
│ │ ├── 2.2.2 Supervised Learning - ConvNet HandsOn Part II.ipynb
│ │ ├── 2.3 Supervised Learning - Famous Models with Keras.ipynb
│ │ ├── 3.1 Unsupervised Learning - AutoEncoders and Embeddings.ipynb
│ │ ├── 3.2 RNN and LSTM.ipynb
│ │ ├── 3.3 (Extra) LSTM for Sentence Generation.ipynb
│ │ ├── 4. Conclusions.ipynb
│ │ ├── LICENSE
│ │ ├── data/
│ │ │ ├── female_blog_list.txt
│ │ │ ├── intro_to_ann.csv
│ │ │ ├── male_blog_list.txt
│ │ │ ├── rt-polarity.neg
│ │ │ └── rt-polarity.pos
│ │ ├── data_helpers.py
│ │ ├── deep-learning-osx.yml
│ │ ├── deep-learning.yml
│ │ ├── deep_learning_models/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── imagenet_utils.py
│ │ │ ├── resnet50.py
│ │ │ ├── vgg16.py
│ │ │ └── vgg19.py
│ │ ├── outline.md
│ │ ├── solutions/
│ │ │ ├── sol_111.py
│ │ │ └── sol_112.py
│ │ └── w2v.py
│ ├── tensor-flow-examples/
│ │ ├── Setup_TensorFlow.md
│ │ ├── input_data.py
│ │ ├── multigpu_basics.py
│ │ └── notebooks/
│ │ ├── 1_intro/
│ │ │ └── basic_operations.ipynb
│ │ ├── 2_basic_classifiers/
│ │ │ ├── linear_regression.ipynb
│ │ │ ├── logistic_regression.ipynb
│ │ │ └── nearest_neighbor.ipynb
│ │ ├── 3_neural_networks/
│ │ │ ├── alexnet.ipynb
│ │ │ ├── convolutional_network.ipynb
│ │ │ ├── multilayer_perceptron.ipynb
│ │ │ └── recurrent_network.ipynb
│ │ ├── 4_multi_gpu/
│ │ │ └── multigpu_basics.ipynb
│ │ └── 5_ui/
│ │ ├── graph_visualization.ipynb
│ │ └── loss_visualization.ipynb
│ ├── tensor-flow-exercises/
│ │ ├── 1_notmnist.ipynb
│ │ ├── 2_fullyconnected.ipynb
│ │ ├── 3_regularization.ipynb
│ │ ├── 4_convolutions.ipynb
│ │ ├── 5_word2vec.ipynb
│ │ ├── 6_lstm.ipynb
│ │ ├── Dockerfile
│ │ └── README.md
│ └── theano-tutorial/
│ ├── intro_theano/
│ │ ├── Makefile
│ │ ├── intro_theano.ipynb
│ │ ├── logistic_regression.ipynb
│ │ └── utils.py
│ ├── rnn_tutorial/
│ │ ├── Makefile
│ │ ├── lstm_text.ipynb
│ │ ├── lstm_text.py
│ │ ├── rnn_precompile.py
│ │ ├── simple_rnn.ipynb
│ │ └── synthetic.py
│ ├── scan_tutorial/
│ │ ├── scan_ex1_solution.py
│ │ ├── scan_ex2_solution.py
│ │ └── scan_tutorial.ipynb
│ └── theano_mlp/
│ └── theano_mlp.ipynb
├── images/
│ └── README.sketch
├── kaggle/
│ ├── __init__.py
│ └── titanic.ipynb
├── mapreduce/
│ ├── __init__.py
│ ├── mapreduce-python.ipynb
│ ├── mr_s3_log_parser.py
│ └── test_mr_s3_log_parser.py
├── matplotlib/
│ ├── 04.00-Introduction-To-Matplotlib.ipynb
│ ├── 04.01-Simple-Line-Plots.ipynb
│ ├── 04.02-Simple-Scatter-Plots.ipynb
│ ├── 04.03-Errorbars.ipynb
│ ├── 04.04-Density-and-Contour-Plots.ipynb
│ ├── 04.05-Histograms-and-Binnings.ipynb
│ ├── 04.06-Customizing-Legends.ipynb
│ ├── 04.07-Customizing-Colorbars.ipynb
│ ├── 04.08-Multiple-Subplots.ipynb
│ ├── 04.09-Text-and-Annotation.ipynb
│ ├── 04.10-Customizing-Ticks.ipynb
│ ├── 04.11-Settings-and-Stylesheets.ipynb
│ ├── 04.12-Three-Dimensional-Plotting.ipynb
│ ├── 04.13-Geographic-Data-With-Basemap.ipynb
│ ├── 04.14-Visualization-With-Seaborn.ipynb
│ ├── 04.15-Further-Resources.ipynb
│ ├── __init__.py
│ ├── matplotlib-applied.ipynb
│ ├── matplotlib.ipynb
│ └── tests/
│ └── __init__.py
├── misc/
│ ├── Algorithmia.ipynb
│ └── regex.ipynb
├── numpy/
│ ├── 02.00-Introduction-to-NumPy.ipynb
│ ├── 02.01-Understanding-Data-Types.ipynb
│ ├── 02.02-The-Basics-Of-NumPy-Arrays.ipynb
│ ├── 02.03-Computation-on-arrays-ufuncs.ipynb
│ ├── 02.04-Computation-on-arrays-aggregates.ipynb
│ ├── 02.05-Computation-on-arrays-broadcasting.ipynb
│ ├── 02.06-Boolean-Arrays-and-Masks.ipynb
│ ├── 02.07-Fancy-Indexing.ipynb
│ ├── 02.08-Sorting.ipynb
│ ├── 02.09-Structured-Data-NumPy.ipynb
│ ├── __init__.py
│ ├── numpy.ipynb
│ └── tests/
│ └── __init__.py
├── pandas/
│ ├── 03.00-Introduction-to-Pandas.ipynb
│ ├── 03.01-Introducing-Pandas-Objects.ipynb
│ ├── 03.02-Data-Indexing-and-Selection.ipynb
│ ├── 03.03-Operations-in-Pandas.ipynb
│ ├── 03.04-Missing-Values.ipynb
│ ├── 03.05-Hierarchical-Indexing.ipynb
│ ├── 03.06-Concat-And-Append.ipynb
│ ├── 03.07-Merge-and-Join.ipynb
│ ├── 03.08-Aggregation-and-Grouping.ipynb
│ ├── 03.09-Pivot-Tables.ipynb
│ ├── 03.10-Working-With-Strings.ipynb
│ ├── 03.11-Working-with-Time-Series.ipynb
│ ├── 03.12-Performance-Eval-and-Query.ipynb
│ ├── 03.13-Further-Resources.ipynb
│ ├── __init__.py
│ ├── pandas.ipynb
│ └── tests/
│ └── __init__.py
├── python-data/
│ ├── __init__.py
│ ├── datetime.ipynb
│ ├── files.ipynb
│ ├── functions.ipynb
│ ├── hello_world.txt
│ ├── logs.ipynb
│ ├── pdb.ipynb
│ ├── structs.ipynb
│ ├── structs_utils.ipynb
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_transform_util.py
│ │ └── test_type_util.py
│ ├── transform_util.py
│ ├── type_util.py
│ └── unit_tests.ipynb
├── scikit-learn/
│ ├── __init__.py
│ ├── fig_code/
│ │ ├── ML_flow_chart.py
│ │ ├── __init__.py
│ │ ├── data.py
│ │ ├── figures.py
│ │ ├── helpers.py
│ │ ├── linear_regression.py
│ │ ├── scikit-learn.ipynb
│ │ ├── sgd_separator.py
│ │ └── svm_gui.py
│ ├── scikit-learn-gmm.ipynb
│ ├── scikit-learn-intro.ipynb
│ ├── scikit-learn-k-means.ipynb
│ ├── scikit-learn-linear-reg.ipynb
│ ├── scikit-learn-pca.ipynb
│ ├── scikit-learn-random-forest.ipynb
│ ├── scikit-learn-svm.ipynb
│ ├── scikit-learn-validation.ipynb
│ └── tests/
│ └── __init__.py
├── scipy/
│ ├── 2002FemPreg.dct
│ ├── __init__.py
│ ├── effect_size.ipynb
│ ├── first.py
│ ├── hypothesis.ipynb
│ ├── nsfg.py
│ ├── sampling.ipynb
│ ├── tests/
│ │ └── __init__.py
│ ├── thinkplot.py
│ └── thinkstats2.py
└── spark/
├── __init__.py
├── hdfs.ipynb
└── spark.ipynb
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.ipynb linguist-language=Python
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# IPython notebook
.ipynb_checkpoints
# Repo scratch directory
scratch/
# Misc
.DS_Store
================================================
FILE: LICENSE
================================================
This repository contains a variety of content; some developed by Donne Martin,
and some from third-parties. The third-party content is distributed under the
license provided by those parties.
The content developed by Donne Martin is distributed under the following license:
I am providing code and resources in this repository to you under an open source
license. Because this is my personal repository, the license you receive to my
code and resources is from me and not my employer (Facebook).
Copyright 2015 Donne Martin
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/README_1200x800.gif">
</p>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/coversmall_alt.png">
<br/>
</p>
# data-science-ipython-notebooks
## Index
* [deep-learning](#deep-learning)
* [tensorflow](#tensor-flow-tutorials)
* [theano](#theano-tutorials)
* [keras](#keras-tutorials)
* [caffe](#deep-learning-misc)
* [scikit-learn](#scikit-learn)
* [statistical-inference-scipy](#statistical-inference-scipy)
* [pandas](#pandas)
* [matplotlib](#matplotlib)
* [numpy](#numpy)
* [python-data](#python-data)
* [kaggle-and-business-analyses](#kaggle-and-business-analyses)
* [spark](#spark)
* [mapreduce-python](#mapreduce-python)
* [amazon web services](#aws)
* [command lines](#commands)
* [misc](#misc)
* [notebook-installation](#notebook-installation)
* [credits](#credits)
* [contributing](#contributing)
* [contact-info](#contact-info)
* [license](#license)
<br/>
<p align="center">
<img src="http://i.imgur.com/ZhKXrKZ.png">
</p>
## deep-learning
IPython Notebook(s) demonstrating deep learning functionality.
<br/>
<p align="center">
<img src="https://avatars0.githubusercontent.com/u/15658638?v=3&s=100">
</p>
### tensor-flow-tutorials
Additional TensorFlow tutorials:
* [pkmital/tensorflow_tutorials](https://github.com/pkmital/tensorflow_tutorials)
* [nlintz/TensorFlow-Tutorials](https://github.com/nlintz/TensorFlow-Tutorials)
* [alrojo/tensorflow-tutorial](https://github.com/alrojo/tensorflow-tutorial)
* [BinRoot/TensorFlow-Book](https://github.com/BinRoot/TensorFlow-Book)
* [tuanavu/tensorflow-basic-tutorials](https://github.com/tuanavu/tensorflow-basic-tutorials)
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [tsf-basics](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/1_intro/basic_operations.ipynb) | Learn basic operations in TensorFlow, a library for various kinds of perceptual and language understanding tasks from Google. |
| [tsf-linear](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/2_basic_classifiers/linear_regression.ipynb) | Implement linear regression in TensorFlow. |
| [tsf-logistic](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/2_basic_classifiers/logistic_regression.ipynb) | Implement logistic regression in TensorFlow. |
| [tsf-nn](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/2_basic_classifiers/nearest_neighbor.ipynb) | Implement nearest neighboars in TensorFlow. |
| [tsf-alex](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/3_neural_networks/alexnet.ipynb) | Implement AlexNet in TensorFlow. |
| [tsf-cnn](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/3_neural_networks/convolutional_network.ipynb) | Implement convolutional neural networks in TensorFlow. |
| [tsf-mlp](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/3_neural_networks/multilayer_perceptron.ipynb) | Implement multilayer perceptrons in TensorFlow. |
| [tsf-rnn](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/3_neural_networks/recurrent_network.ipynb) | Implement recurrent neural networks in TensorFlow. |
| [tsf-gpu](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/4_multi_gpu/multigpu_basics.ipynb) | Learn about basic multi-GPU computation in TensorFlow. |
| [tsf-gviz](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/5_ui/graph_visualization.ipynb) | Learn about graph visualization in TensorFlow. |
| [tsf-lviz](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-examples/notebooks/5_ui/loss_visualization.ipynb) | Learn about loss visualization in TensorFlow. |
### tensor-flow-exercises
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [tsf-not-mnist](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-exercises/1_notmnist.ipynb) | Learn simple data curation by creating a pickle with formatted datasets for training, development and testing in TensorFlow. |
| [tsf-fully-connected](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-exercises/2_fullyconnected.ipynb) | Progressively train deeper and more accurate models using logistic regression and neural networks in TensorFlow. |
| [tsf-regularization](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-exercises/3_regularization.ipynb) | Explore regularization techniques by training fully connected networks to classify notMNIST characters in TensorFlow. |
| [tsf-convolutions](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-exercises/4_convolutions.ipynb) | Create convolutional neural networks in TensorFlow. |
| [tsf-word2vec](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-exercises/5_word2vec.ipynb) | Train a skip-gram model over Text8 data in TensorFlow. |
| [tsf-lstm](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/tensor-flow-exercises/6_lstm.ipynb) | Train a LSTM character model over Text8 data in TensorFlow. |
<br/>
<p align="center">
<img src="http://www.deeplearning.net/software/theano/_static/theano_logo_allblue_200x46.png">
</p>
### theano-tutorials
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [theano-intro](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/theano-tutorial/intro_theano/intro_theano.ipynb) | Intro to Theano, which allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently. It can use GPUs and perform efficient symbolic differentiation. |
| [theano-scan](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/theano-tutorial/scan_tutorial/scan_tutorial.ipynb) | Learn scans, a mechanism to perform loops in a Theano graph. |
| [theano-logistic](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/theano-tutorial/intro_theano/logistic_regression.ipynb) | Implement logistic regression in Theano. |
| [theano-rnn](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/theano-tutorial/rnn_tutorial/simple_rnn.ipynb) | Implement recurrent neural networks in Theano. |
| [theano-mlp](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/theano-tutorial/theano_mlp/theano_mlp.ipynb) | Implement multilayer perceptrons in Theano. |
<br/>
<p align="center">
<img src="http://i.imgur.com/L45Q8c2.jpg">
</p>
### keras-tutorials
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| keras | Keras is an open source neural network library written in Python. It is capable of running on top of either Tensorflow or Theano. |
| [setup](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/0.%20Preamble.ipynb) | Learn about the tutorial goals and how to set up your Keras environment. |
| [intro-deep-learning-ann](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/1.1%20Introduction%20-%20Deep%20Learning%20and%20ANN.ipynb) | Get an intro to deep learning with Keras and Artificial Neural Networks (ANN). |
| [theano](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/1.2%20Introduction%20-%20Theano.ipynb) | Learn about Theano by working with weights matrices and gradients. |
| [keras-otto](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/1.3%20Introduction%20-%20Keras.ipynb) | Learn about Keras by looking at the Kaggle Otto challenge. |
| [ann-mnist](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/1.4%20%28Extra%29%20A%20Simple%20Implementation%20of%20ANN%20for%20MNIST.ipynb) | Review a simple implementation of ANN for MNIST using Keras. |
| [conv-nets](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/2.1%20Supervised%20Learning%20-%20ConvNets.ipynb) | Learn about Convolutional Neural Networks (CNNs) with Keras. |
| [conv-net-1](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/2.2.1%20Supervised%20Learning%20-%20ConvNet%20HandsOn%20Part%20I.ipynb) | Recognize handwritten digits from MNIST using Keras - Part 1. |
| [conv-net-2](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/2.2.2%20Supervised%20Learning%20-%20ConvNet%20HandsOn%20Part%20II.ipynb) | Recognize handwritten digits from MNIST using Keras - Part 2. |
| [keras-models](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/2.3%20Supervised%20Learning%20-%20Famous%20Models%20with%20Keras.ipynb) | Use pre-trained models such as VGG16, VGG19, ResNet50, and Inception v3 with Keras. |
| [auto-encoders](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/3.1%20Unsupervised%20Learning%20-%20AutoEncoders%20and%20Embeddings.ipynb) | Learn about Autoencoders with Keras. |
| [rnn-lstm](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/3.2%20RNN%20and%20LSTM.ipynb) | Learn about Recurrent Neural Networks (RNNs) with Keras. |
| [lstm-sentence-gen](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/keras-tutorial/3.3%20%28Extra%29%20LSTM%20for%20Sentence%20Generation.ipynb) | Learn about RNNs using Long Short Term Memory (LSTM) networks with Keras. |
### deep-learning-misc
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [deep-dream](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/deep-learning/deep-dream/dream.ipynb) | Caffe-based computer vision program which uses a convolutional neural network to find and enhance patterns in images. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/scikitlearn.png">
</p>
## scikit-learn
IPython Notebook(s) demonstrating scikit-learn functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [intro](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-intro.ipynb) | Intro notebook to scikit-learn. Scikit-learn adds Python support for large, multi-dimensional arrays and matrices, along with a large library of high-level mathematical functions to operate on these arrays. |
| [knn](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-intro.ipynb#K-Nearest-Neighbors-Classifier) | Implement k-nearest neighbors in scikit-learn. |
| [linear-reg](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-linear-reg.ipynb) | Implement linear regression in scikit-learn. |
| [svm](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-svm.ipynb) | Implement support vector machine classifiers with and without kernels in scikit-learn. |
| [random-forest](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-random-forest.ipynb) | Implement random forest classifiers and regressors in scikit-learn. |
| [k-means](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-k-means.ipynb) | Implement k-means clustering in scikit-learn. |
| [pca](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-pca.ipynb) | Implement principal component analysis in scikit-learn. |
| [gmm](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-gmm.ipynb) | Implement Gaussian mixture models in scikit-learn. |
| [validation](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-validation.ipynb) | Implement validation and model selection in scikit-learn. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/scipy.png">
</p>
## statistical-inference-scipy
IPython Notebook(s) demonstrating statistical inference with SciPy functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| scipy | SciPy is a collection of mathematical algorithms and convenience functions built on the Numpy extension of Python. It adds significant power to the interactive Python session by providing the user with high-level commands and classes for manipulating and visualizing data. |
| [effect-size](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scipy/effect_size.ipynb) | Explore statistics that quantify effect size by analyzing the difference in height between men and women. Uses data from the Behavioral Risk Factor Surveillance System (BRFSS) to estimate the mean and standard deviation of height for adult women and men in the United States. |
| [sampling](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scipy/sampling.ipynb) | Explore random sampling by analyzing the average weight of men and women in the United States using BRFSS data. |
| [hypothesis](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scipy/hypothesis.ipynb) | Explore hypothesis testing by analyzing the difference of first-born babies compared with others. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/pandas.png">
</p>
## pandas
IPython Notebook(s) demonstrating pandas functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [pandas](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/pandas.ipynb) | Software library written for data manipulation and analysis in Python. Offers data structures and operations for manipulating numerical tables and time series. |
| [github-data-wrangling](https://github.com/donnemartin/viz/blob/master/githubstats/data_wrangling.ipynb) | Learn how to load, clean, merge, and feature engineer by analyzing GitHub data from the [`Viz`](https://github.com/donnemartin/viz) repo. |
| [Introduction-to-Pandas](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.00-Introduction-to-Pandas.ipynb) | Introduction to Pandas. |
| [Introducing-Pandas-Objects](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.01-Introducing-Pandas-Objects.ipynb) | Learn about Pandas objects. |
| [Data Indexing and Selection](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.02-Data-Indexing-and-Selection.ipynb) | Learn about data indexing and selection in Pandas. |
| [Operations-in-Pandas](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.03-Operations-in-Pandas.ipynb) | Learn about operating on data in Pandas. |
| [Missing-Values](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.04-Missing-Values.ipynb) | Learn about handling missing data in Pandas. |
| [Hierarchical-Indexing](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.05-Hierarchical-Indexing.ipynb) | Learn about hierarchical indexing in Pandas. |
| [Concat-And-Append](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.06-Concat-And-Append.ipynb) | Learn about combining datasets: concat and append in Pandas. |
| [Merge-and-Join](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.07-Merge-and-Join.ipynb) | Learn about combining datasets: merge and join in Pandas. |
| [Aggregation-and-Grouping](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.08-Aggregation-and-Grouping.ipynb) | Learn about aggregation and grouping in Pandas. |
| [Pivot-Tables](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.09-Pivot-Tables.ipynb) | Learn about pivot tables in Pandas. |
| [Working-With-Strings](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.10-Working-With-Strings.ipynb) | Learn about vectorized string operations in Pandas. |
| [Working-with-Time-Series](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.11-Working-with-Time-Series.ipynb) | Learn about working with time series in pandas. |
| [Performance-Eval-and-Query](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.12-Performance-Eval-and-Query.ipynb) | Learn about high-performance Pandas: eval() and query() in Pandas. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/matplotlib.png">
</p>
## matplotlib
IPython Notebook(s) demonstrating matplotlib functionality.
| Notebook | Description |
|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| [matplotlib](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/matplotlib.ipynb) | Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. |
| [matplotlib-applied](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/matplotlib-applied.ipynb) | Apply matplotlib visualizations to Kaggle competitions for exploratory data analysis. Learn how to create bar plots, histograms, subplot2grid, normalized plots, scatter plots, subplots, and kernel density estimation plots. |
| [Introduction-To-Matplotlib](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.00-Introduction-To-Matplotlib.ipynb) | Introduction to Matplotlib. |
| [Simple-Line-Plots](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.01-Simple-Line-Plots.ipynb) | Learn about simple line plots in Matplotlib. |
| [Simple-Scatter-Plots](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.02-Simple-Scatter-Plots.ipynb) | Learn about simple scatter plots in Matplotlib. |
| [Errorbars.ipynb](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.03-Errorbars.ipynb) | Learn about visualizing errors in Matplotlib. |
| [Density-and-Contour-Plots](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.04-Density-and-Contour-Plots.ipynb) | Learn about density and contour plots in Matplotlib. |
| [Histograms-and-Binnings](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.05-Histograms-and-Binnings.ipynb) | Learn about histograms, binnings, and density in Matplotlib. |
| [Customizing-Legends](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.06-Customizing-Legends.ipynb) | Learn about customizing plot legends in Matplotlib. |
| [Customizing-Colorbars](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.07-Customizing-Colorbars.ipynb) | Learn about customizing colorbars in Matplotlib. |
| [Multiple-Subplots](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.08-Multiple-Subplots.ipynb) | Learn about multiple subplots in Matplotlib. |
| [Text-and-Annotation](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.09-Text-and-Annotation.ipynb) | Learn about text and annotation in Matplotlib. |
| [Customizing-Ticks](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.10-Customizing-Ticks.ipynb) | Learn about customizing ticks in Matplotlib. |
| [Settings-and-Stylesheets](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.11-Settings-and-Stylesheets.ipynb) | Learn about customizing Matplotlib: configurations and stylesheets. |
| [Three-Dimensional-Plotting](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.12-Three-Dimensional-Plotting.ipynb) | Learn about three-dimensional plotting in Matplotlib. |
| [Geographic-Data-With-Basemap](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.13-Geographic-Data-With-Basemap.ipynb) | Learn about geographic data with basemap in Matplotlib. |
| [Visualization-With-Seaborn](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.14-Visualization-With-Seaborn.ipynb) | Learn about visualization with Seaborn. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/numpy.png">
</p>
## numpy
IPython Notebook(s) demonstrating NumPy functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [numpy](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/numpy.ipynb) | Adds Python support for large, multi-dimensional arrays and matrices, along with a large library of high-level mathematical functions to operate on these arrays. |
| [Introduction-to-NumPy](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.00-Introduction-to-NumPy.ipynb) | Introduction to NumPy. |
| [Understanding-Data-Types](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.01-Understanding-Data-Types.ipynb) | Learn about data types in Python. |
| [The-Basics-Of-NumPy-Arrays](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.02-The-Basics-Of-NumPy-Arrays.ipynb) | Learn about the basics of NumPy arrays. |
| [Computation-on-arrays-ufuncs](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.03-Computation-on-arrays-ufuncs.ipynb) | Learn about computations on NumPy arrays: universal functions. |
| [Computation-on-arrays-aggregates](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.04-Computation-on-arrays-aggregates.ipynb) | Learn about aggregations: min, max, and everything in between in NumPy. |
| [Computation-on-arrays-broadcasting](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.05-Computation-on-arrays-broadcasting.ipynb) | Learn about computation on arrays: broadcasting in NumPy. |
| [Boolean-Arrays-and-Masks](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.06-Boolean-Arrays-and-Masks.ipynb) | Learn about comparisons, masks, and boolean logic in NumPy. |
| [Fancy-Indexing](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.07-Fancy-Indexing.ipynb) | Learn about fancy indexing in NumPy. |
| [Sorting](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.08-Sorting.ipynb) | Learn about sorting arrays in NumPy. |
| [Structured-Data-NumPy](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.09-Structured-Data-NumPy.ipynb) | Learn about structured data: NumPy's structured arrays. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/python.png">
</p>
## python-data
IPython Notebook(s) demonstrating Python functionality geared towards data analysis.
| Notebook | Description |
|-----------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|
| [data structures](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/structs.ipynb) | Learn Python basics with tuples, lists, dicts, sets. |
| [data structure utilities](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/structs_utils.ipynb) | Learn Python operations such as slice, range, xrange, bisect, sort, sorted, reversed, enumerate, zip, list comprehensions. |
| [functions](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/functions.ipynb) | Learn about more advanced Python features: Functions as objects, lambda functions, closures, *args, **kwargs currying, generators, generator expressions, itertools. |
| [datetime](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/datetime.ipynb) | Learn how to work with Python dates and times: datetime, strftime, strptime, timedelta. |
| [logging](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/logs.ipynb) | Learn about Python logging with RotatingFileHandler and TimedRotatingFileHandler. |
| [pdb](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/pdb.ipynb) | Learn how to debug in Python with the interactive source code debugger. |
| [unit tests](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/python-data/unit_tests.ipynb) | Learn how to test in Python with Nose unit tests. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/kaggle.png">
</p>
## kaggle-and-business-analyses
IPython Notebook(s) used in [kaggle](https://www.kaggle.com/) competitions and business analyses.
| Notebook | Description |
|-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|
| [titanic](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/kaggle/titanic.ipynb) | Predict survival on the Titanic. Learn data cleaning, exploratory data analysis, and machine learning. |
| [churn-analysis](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/analyses/churn.ipynb) | Predict customer churn. Exercise logistic regression, gradient boosting classifers, support vector machines, random forests, and k-nearest-neighbors. Includes discussions of confusion matrices, ROC plots, feature importances, prediction probabilities, and calibration/descrimination.|
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/spark.png">
</p>
## spark
IPython Notebook(s) demonstrating spark and HDFS functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
| [spark](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/spark/spark.ipynb) | In-memory cluster computing framework, up to 100 times faster for certain applications and is well suited for machine learning algorithms. |
| [hdfs](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/spark/hdfs.ipynb) | Reliably stores very large files across machines in a large cluster. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/mrjob.png">
</p>
## mapreduce-python
IPython Notebook(s) demonstrating Hadoop MapReduce with mrjob functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
| [mapreduce-python](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/mapreduce/mapreduce-python.ipynb) | Runs MapReduce jobs in Python, executing jobs locally or on Hadoop clusters. Demonstrates Hadoop Streaming in Python code with unit test and [mrjob](https://github.com/Yelp/mrjob) config file to analyze Amazon S3 bucket logs on Elastic MapReduce. [Disco](https://github.com/discoproject/disco/) is another python-based alternative.|
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/aws.png">
</p>
## aws
IPython Notebook(s) demonstrating Amazon Web Services (AWS) and AWS tools functionality.
Also check out:
* [SAWS](https://github.com/donnemartin/saws): A Supercharged AWS command line interface (CLI).
* [Awesome AWS](https://github.com/donnemartin/awesome-aws): A curated list of libraries, open source repos, guides, blogs, and other resources.
| Notebook | Description |
|------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [boto](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#Boto) | Official AWS SDK for Python. |
| [s3cmd](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#s3cmd) | Interacts with S3 through the command line. |
| [s3distcp](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#s3distcp) | Combines smaller files and aggregates them together by taking in a pattern and target file. S3DistCp can also be used to transfer large volumes of data from S3 to your Hadoop cluster. |
| [s3-parallel-put](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#s3-parallel-put) | Uploads multiple files to S3 in parallel. |
| [redshift](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#redshift) | Acts as a fast data warehouse built on top of technology from massive parallel processing (MPP). |
| [kinesis](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#kinesis) | Streams data in real time with the ability to process thousands of data streams per second. |
| [lambda](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/aws/aws.ipynb#lambda) | Runs code in response to events, automatically managing compute resources. |
<br/>
<p align="center">
<img src="https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master/images/commands.png">
</p>
## commands
IPython Notebook(s) demonstrating various command lines for Linux, Git, etc.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [linux](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/linux.ipynb) | Unix-like and mostly POSIX-compliant computer operating system. Disk usage, splitting files, grep, sed, curl, viewing running processes, terminal syntax highlighting, and Vim.|
| [anaconda](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#anaconda) | Distribution of the Python programming language for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. |
| [ipython notebook](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#ipython-notebook) | Web-based interactive computational environment where you can combine code execution, text, mathematics, plots and rich media into a single document. |
| [git](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#git) | Distributed revision control system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. |
| [ruby](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#ruby) | Used to interact with the AWS command line and for Jekyll, a blog framework that can be hosted on GitHub Pages. |
| [jekyll](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#jekyll) | Simple, blog-aware, static site generator for personal, project, or organization sites. Renders Markdown or Textile and Liquid templates, and produces a complete, static website ready to be served by Apache HTTP Server, Nginx or another web server. |
| [pelican](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#pelican) | Python-based alternative to Jekyll. |
| [django](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/commands/misc.ipynb#django) | High-level Python Web framework that encourages rapid development and clean, pragmatic design. It can be useful to share reports/analyses and for blogging. Lighter-weight alternatives include [Pyramid](https://github.com/Pylons/pyramid), [Flask](https://github.com/pallets/flask), [Tornado](https://github.com/tornadoweb/tornado), and [Bottle](https://github.com/bottlepy/bottle).
## misc
IPython Notebook(s) demonstrating miscellaneous functionality.
| Notebook | Description |
|--------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [regex](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/misc/regex.ipynb) | Regular expression cheat sheet useful in data wrangling.|
[algorithmia](http://nbviewer.ipython.org/github/donnemartin/data-science-ipython-notebooks/blob/master/misc/Algorithmia.ipynb) | Algorithmia is a marketplace for algorithms. This notebook showcases 4 different algorithms: Face Detection, Content Summarizer, Latent Dirichlet Allocation and Optical Character Recognition.|
## notebook-installation
### anaconda
Anaconda is a free distribution of the Python programming language for large-scale data processing, predictive analytics, and scientific computing that aims to simplify package management and deployment.
Follow instructions to install [Anaconda](https://docs.continuum.io/anaconda/install) or the more lightweight [miniconda](http://conda.pydata.org/miniconda.html).
### dev-setup
For detailed instructions, scripts, and tools to set up your development environment for data analysis, check out the [dev-setup](https://github.com/donnemartin/dev-setup) repo.
### running-notebooks
To view interactive content or to modify elements within the IPython notebooks, you must first clone or download the repository then run the notebook. More information on IPython Notebooks can be found [here.](http://ipython.org/notebook.html)
$ git clone https://github.com/donnemartin/data-science-ipython-notebooks.git
$ cd data-science-ipython-notebooks
$ jupyter notebook
Notebooks tested with Python 2.7.x.
## credits
* [Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython](http://www.amazon.com/Python-Data-Analysis-Wrangling-IPython/dp/1449319793) by Wes McKinney
* [PyCon 2015 Scikit-learn Tutorial](https://github.com/jakevdp/sklearn_pycon2015) by Jake VanderPlas
* [Python Data Science Handbook](https://github.com/jakevdp/PythonDataScienceHandbook) by Jake VanderPlas
* [Parallel Machine Learning with scikit-learn and IPython](https://github.com/ogrisel/parallel_ml_tutorial) by Olivier Grisel
* [Statistical Interference Using Computational Methods in Python](https://github.com/AllenDowney/CompStats) by Allen Downey
* [TensorFlow Examples](https://github.com/aymericdamien/TensorFlow-Examples) by Aymeric Damien
* [TensorFlow Tutorials](https://github.com/pkmital/tensorflow_tutorials) by Parag K Mital
* [TensorFlow Tutorials](https://github.com/nlintz/TensorFlow-Tutorials) by Nathan Lintz
* [TensorFlow Tutorials](https://github.com/alrojo/tensorflow-tutorial) by Alexander R Johansen
* [TensorFlow Book](https://github.com/BinRoot/TensorFlow-Book) by Nishant Shukla
* [Summer School 2015](https://github.com/mila-udem/summerschool2015) by mila-udem
* [Keras tutorials](https://github.com/leriomaggio/deep-learning-keras-tensorflow) by Valerio Maggio
* [Kaggle](https://www.kaggle.com/)
* [Yhat Blog](http://blog.yhat.com/)
## contributing
Contributions are welcome! For bug reports or requests please [submit an issue](https://github.com/donnemartin/data-science-ipython-notebooks/issues).
## contact-info
Feel free to contact me to discuss any issues, questions, or comments.
* Email: [donne.martin@gmail.com](mailto:donne.martin@gmail.com)
* Twitter: [@donne_martin](https://twitter.com/donne_martin)
* GitHub: [donnemartin](https://github.com/donnemartin)
* LinkedIn: [donnemartin](https://www.linkedin.com/in/donnemartin)
* Website: [donnemartin.com](http://donnemartin.com)
## license
This repository contains a variety of content; some developed by Donne Martin, and some from third-parties. The third-party content is distributed under the license provided by those parties.
The content developed by Donne Martin is distributed under the following license:
*I am providing code and resources in this repository to you under an open source license. Because this is my personal repository, the license you receive to my code and resources is from me and not my employer (Facebook).*
Copyright 2015 Donne Martin
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: __init__.py
================================================
================================================
FILE: analyses/__init__.py
================================================
================================================
FILE: analyses/churn.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Customer Churn##\n",
"\n",
"Credits: Forked from [growth-workshop](https://github.com/aprial/growth-workshop) by [aprial](https://github.com/aprial), as featured on the [yhat blog](http://blog.yhathq.com/posts/predicting-customer-churn-with-sklearn.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\"Churn Rate\" is a business term describing the rate at which customers leave or cease paying for a product or service. It's a critical figure in many businesses, as it's often the case that acquiring new customers is a lot more costly than retaining existing ones (in some cases, 5 to 20 times more expensive).\n",
"\n",
"Understanding what keeps customers engaged, therefore, is incredibly valuable, as it is a logical foundation from which to develop retention strategies and roll out operational practices aimed to keep customers from walking out the door. Consequently, there's growing interest among companies to develop better churn-detection techniques, leading many to look to data mining and machine learning for new and creative approaches.\n",
"\n",
"Predicting churn is particularly important for businesses w/ subscription models such as cell phone, cable, or merchant credit card processing plans. But modeling churn has wide reaching applications in many domains. For example, casinos have used predictive models to predict ideal room conditions for keeping patrons at the blackjack table and when to reward unlucky gamblers with front row seats to Celine Dion. Similarly, airlines may offer first class upgrades to complaining customers. The list goes on."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wait, don't go!\n",
"\n",
"So what are some of ops strategies that companies employ to prevent churn? Well, reducing churn, it turns out, often requires non-trivial resources. Specialized retention teams are common in many industries and exist expressly to call down lists of at-risk customers to plead for their continued business.\n",
"\n",
"\n",
"\n",
"Organizing and running such teams is tough. From an ops perspective, cross-geographic teams must be well organized and trained to respond to a huge spectrum of customer complaints. Customers must be accurately targeted based on churn-risk, and retention treatments must be well-conceived and correspond reasonably to match expected customer value to ensure the economics make sense. Spending $1,000 on someone who wasn't about to leave can get expensive pretty quickly.\n",
"\n",
"Within this frame of mind, efficiently dealing with turnover is an exercise of distinguishing who is likely to churn from who is not using the data at our disposal. The remainder of this post will explore a simple case study to show how Python and its scientific libraries can be used to predict churn and how you might deploy such a solution within operations to guide a retention team.\n",
"\n",
"##The Dataset##\n",
"\n",
"The data set we'll be using is a longstanding telecom customer data set.\n",
"\n",
"The data is straightforward. Each row represents a subscribing telephone customer. Each column contains customer attributes such as phone number, call minutes used during different times of day, charges incurred for services, lifetime account duration, and whether or not the customer is still a customer."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from __future__ import division\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import json\n",
"\n",
"from sklearn.cross_validation import KFold\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.cross_validation import train_test_split\n",
"from sklearn.svm import SVC\n",
"from sklearn.ensemble import RandomForestClassifier as RF\n",
"%matplotlib inline \n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Column names:\n",
"['State', 'Account Length', 'Area Code', 'Phone', \"Int'l Plan\", 'VMail Plan', 'VMail Message', 'Day Mins', 'Day Calls', 'Day Charge', 'Eve Mins', 'Eve Calls', 'Eve Charge', 'Night Mins', 'Night Calls', 'Night Charge', 'Intl Mins', 'Intl Calls', 'Intl Charge', 'CustServ Calls', 'Churn?']\n",
"\n",
"Sample data:\n"
]
},
{
"data": {
"text/html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>State</th>\n",
" <th>Account Length</th>\n",
" <th>Area Code</th>\n",
" <th>Phone</th>\n",
" <th>Int'l Plan</th>\n",
" <th>VMail Plan</th>\n",
" <th>Night Charge</th>\n",
" <th>Intl Mins</th>\n",
" <th>Intl Calls</th>\n",
" <th>Intl Charge</th>\n",
" <th>CustServ Calls</th>\n",
" <th>Churn?</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> KS</td>\n",
" <td> 128</td>\n",
" <td> 415</td>\n",
" <td> 382-4657</td>\n",
" <td> no</td>\n",
" <td> yes</td>\n",
" <td> 11.01</td>\n",
" <td> 10.0</td>\n",
" <td> 3</td>\n",
" <td> 2.70</td>\n",
" <td> 1</td>\n",
" <td> False.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> OH</td>\n",
" <td> 107</td>\n",
" <td> 415</td>\n",
" <td> 371-7191</td>\n",
" <td> no</td>\n",
" <td> yes</td>\n",
" <td> 11.45</td>\n",
" <td> 13.7</td>\n",
" <td> 3</td>\n",
" <td> 3.70</td>\n",
" <td> 1</td>\n",
" <td> False.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> NJ</td>\n",
" <td> 137</td>\n",
" <td> 415</td>\n",
" <td> 358-1921</td>\n",
" <td> no</td>\n",
" <td> no</td>\n",
" <td> 7.32</td>\n",
" <td> 12.2</td>\n",
" <td> 5</td>\n",
" <td> 3.29</td>\n",
" <td> 0</td>\n",
" <td> False.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> OH</td>\n",
" <td> 84</td>\n",
" <td> 408</td>\n",
" <td> 375-9999</td>\n",
" <td> yes</td>\n",
" <td> no</td>\n",
" <td> 8.86</td>\n",
" <td> 6.6</td>\n",
" <td> 7</td>\n",
" <td> 1.78</td>\n",
" <td> 2</td>\n",
" <td> False.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> OK</td>\n",
" <td> 75</td>\n",
" <td> 415</td>\n",
" <td> 330-6626</td>\n",
" <td> yes</td>\n",
" <td> no</td>\n",
" <td> 8.41</td>\n",
" <td> 10.1</td>\n",
" <td> 3</td>\n",
" <td> 2.73</td>\n",
" <td> 3</td>\n",
" <td> False.</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td> AL</td>\n",
" <td> 118</td>\n",
" <td> 510</td>\n",
" <td> 391-8027</td>\n",
" <td> yes</td>\n",
" <td> no</td>\n",
" <td> 9.18</td>\n",
" <td> 6.3</td>\n",
" <td> 6</td>\n",
" <td> 1.70</td>\n",
" <td> 0</td>\n",
" <td> False.</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" State Account Length Area Code Phone Int'l Plan VMail Plan \\\n",
"0 KS 128 415 382-4657 no yes \n",
"1 OH 107 415 371-7191 no yes \n",
"2 NJ 137 415 358-1921 no no \n",
"3 OH 84 408 375-9999 yes no \n",
"4 OK 75 415 330-6626 yes no \n",
"5 AL 118 510 391-8027 yes no \n",
"\n",
" Night Charge Intl Mins Intl Calls Intl Charge CustServ Calls Churn? \n",
"0 11.01 10.0 3 2.70 1 False. \n",
"1 11.45 13.7 3 3.70 1 False. \n",
"2 7.32 12.2 5 3.29 0 False. \n",
"3 8.86 6.6 7 1.78 2 False. \n",
"4 8.41 10.1 3 2.73 3 False. \n",
"5 9.18 6.3 6 1.70 0 False. "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"churn_df = pd.read_csv('../data/churn.csv')\n",
"col_names = churn_df.columns.tolist()\n",
"\n",
"print \"Column names:\"\n",
"print col_names\n",
"\n",
"to_show = col_names[:6] + col_names[-6:]\n",
"\n",
"print \"\\nSample data:\"\n",
"churn_df[to_show].head(6)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll be keeping the statistical model pretty simple for this example so the feature space is almost unchanged from what you see above. The following code simply drops irrelevant columns and converts strings to boolean values (since models don't handle \"yes\" and \"no\" very well). The rest of the numeric columns are left untouched."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Isolate target data\n",
"churn_result = churn_df['Churn?']\n",
"y = np.where(churn_result == 'True.',1,0)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# We don't need these columns\n",
"to_drop = ['State','Area Code','Phone','Churn?']\n",
"churn_feat_space = churn_df.drop(to_drop,axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 'yes'/'no' has to be converted to boolean values\n",
"# NumPy converts these from boolean to 1. and 0. later\n",
"yes_no_cols = [\"Int'l Plan\",\"VMail Plan\"]\n",
"churn_feat_space[yes_no_cols] = churn_feat_space[yes_no_cols] == 'yes'"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index([u'Account Length', u'Int'l Plan', u'VMail Plan', u'VMail Message', u'Day Mins', u'Day Calls', u'Day Charge', u'Eve Mins', u'Eve Calls', u'Eve Charge', u'Night Mins', u'Night Calls', u'Night Charge', u'Intl Mins', u'Intl Calls', u'Intl Charge', u'CustServ Calls'], dtype='object')\n"
]
}
],
"source": [
"# Pull out features for future use\n",
"features = churn_feat_space.columns\n",
"print features"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Feature space holds 3333 observations and 17 features\n",
"Unique target labels: [0 1]\n"
]
}
],
"source": [
"X = churn_feat_space.as_matrix().astype(np.float)\n",
"\n",
"# This is important\n",
"scaler = StandardScaler()\n",
"X = scaler.fit_transform(X)\n",
"print \"Feature space holds %d observations and %d features\" % X.shape\n",
"print \"Unique target labels:\", np.unique(y)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One slight side note. Many predictors care about the relative size of different features even though those scales might be arbitrary. For instance: the number of points a basketball team scores per game will naturally be a couple orders of magnitude larger than their win percentage. But this doesn't mean that the latter is 100 times less signifigant. `StandardScaler` fixes this by normalizing each feature to a range of around 1.0 to -1.0 thereby preventing models from misbehaving. Well, at least for that reason.\n",
"\n",
"Great, I now have a feature space `X` and a set of target values `y`. On to the predictions!\n",
"\n",
"##How good is your model?##\n",
"\n",
"Express, test, cycle. A machine learning pipeline should be anything but static. There are always new features to design, new data to use, new classifiers to consider each with unique parameters to tune. And for every change it's critical to be able to ask, \"Is the new version better than the last?\" So how do I do that?\n",
"\n",
"As a good start, cross validation will be used throught this example. Cross validation attempts to avoid overfitting (training on and predicting the same datapoint) while still producing a prediction for each observation dataset. This is accomplished by systematically hiding different subsets of the data while training a set of models. After training, each model predicts on the subset that had been hidden to it, emulating multiple train-test splits. When done correctly, every observation will have a 'fair' corresponding prediction.\n",
"\n",
"Here's what that looks like using `scikit-learn` libraries."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sklearn.cross_validation import KFold\n",
"\n",
"def run_cv(X,y,clf_class,**kwargs):\n",
" # Construct a kfolds object\n",
" kf = KFold(len(y),n_folds=3,shuffle=True)\n",
" y_pred = y.copy()\n",
" \n",
" # Iterate through folds\n",
" for train_index, test_index in kf:\n",
" X_train, X_test = X[train_index], X[test_index]\n",
" y_train = y[train_index]\n",
" # Initialize a classifier with key word arguments\n",
" clf = clf_class(**kwargs)\n",
" clf.fit(X_train,y_train)\n",
" y_pred[test_index] = clf.predict(X_test)\n",
" return y_pred"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's compare three fairly unique algorithms support vector machines, random forest, and k-nearest-neighbors. Nothing fancy here, just passing each to cross validation and determining how often the classifier predicted the correct class."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Logistic Regression:\n",
"0.862\n",
"Gradient Boosting Classifier\n",
"0.950\n",
"Support vector machines:\n",
"0.912\n",
"Random forest:\n",
"0.935\n",
"K-nearest-neighbors:\n",
"0.893\n"
]
}
],
"source": [
"from sklearn.svm import SVC\n",
"from sklearn.ensemble import RandomForestClassifier as RF\n",
"from sklearn.neighbors import KNeighborsClassifier as KNN\n",
"from sklearn.linear_model import LogisticRegression as LR\n",
"from sklearn.ensemble import GradientBoostingClassifier as GBC\n",
"from sklearn.metrics import average_precision_score\n",
"\n",
"def accuracy(y_true,y_pred):\n",
" # NumPy interpretes True and False as 1. and 0.\n",
" return np.mean(y_true == y_pred)\n",
"\n",
"print \"Logistic Regression:\"\n",
"print \"%.3f\" % accuracy(y, run_cv(X,y,LR))\n",
"print \"Gradient Boosting Classifier\"\n",
"print \"%.3f\" % accuracy(y, run_cv(X,y,GBC))\n",
"print \"Support vector machines:\"\n",
"print \"%.3f\" % accuracy(y, run_cv(X,y,SVC))\n",
"print \"Random forest:\"\n",
"print \"%.3f\" % accuracy(y, run_cv(X,y,RF))\n",
"print \"K-nearest-neighbors:\"\n",
"print \"%.3f\" % accuracy(y, run_cv(X,y,KNN))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Random forest won, right?\n",
"\n",
"##Precision and recall##\n",
"\n",
"Measurements aren't golden formulas which always spit out high numbers for good models and low numbers for bad ones. Inherently they convey something sentiment about a model's performance, and it's the job of the human designer to determine each number's validity. The problem with accuracy is that outcomes aren't necessarily equal. If my classifier predicted a customer would churn and they didn't, that's not the best but it's forgivable. However, if my classifier predicted a customer would return, I didn't act, and then they churned... that's really bad.\n",
"\n",
"We'll be using another built in `scikit-learn` function to construction a confusion matrix. A confusion matrix is a way of visualizing predictions made by a classifier and is just a table showing the distribution of predictions for a specific class. The x-axis indicates the true class of each observation (if a customer churned or not) while the y-axis corresponds to the class predicted by the model (if my classifier said a customer would churned or not).\n",
"\n",
"## Confusion matrix and confusion tables: \n",
"The columns represent the actual class and the rows represent the predicted class. Lets evaluate performance: \n",
"\n",
"| | condition True | condition false|\n",
"|------|----------------|---------------|\n",
"|prediction true|True Positive|False positive|\n",
"|Prediction False|False Negative|True Negative|\n",
"\n",
"Sensitivity, Recall or True Positive Rate quantify the models ability to predict our positive classes. \n",
"\n",
"$$TPR = \\frac{ TP}{TP + FN}$$ \n",
"\n",
"Specificity or True Negative Rate quantify the models ability to predict our Negative classes. \n",
"\n",
"$$TNR = \\frac{ TN}{FP + TN}$$ \n",
"\n",
"### Example:\n",
"\n",
"| | Spam | Ham|\n",
"|------|----------------|---------------|\n",
"|prediction Spam|100|50|\n",
"|Prediction Ham|75|900|\n",
"\n",
"$$TPR = \\frac{100}{100 + 75} = 57.14 \\% Sensitive $$\n",
"\n",
"$$TNR = \\frac{ 900}{50 + 900} = 94.73 \\% Specific $$\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2821 29]\n",
" [ 244 239]]\n"
]
},
{
"data": {
"image/png": "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\nH4XA7bQpdsaKAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c33edd0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2814 36]\n",
" [ 147 336]]\n"
]
},
{
"data": {
"image/png": "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\n2rdj5hsZZlZcuxsZc4dg3lDbj0XE3ZK+AlwDPA/Moyk9RkRkdXTar2ZMsSZOemZW3Ett5u8yMxsa\nvjfrVU0i4mzgbABJXyLrvS2S9NqIWChpa+CJ1LxV7dtRa9y24tNbMyuuu7u3W6X/bge8F7iArMbt\nh1KTDzFcx7Zl7dsiIbunZ2bFdfec3iWSNie71XFMRCyR9K/AxZKOAhYAfwswSu3bMXHdW+uC695W\nV2/q3vKjDvPH++S6t2Y2AFo/jlJqTnpmVlzrx1FKzUnPzIqr4G9vnfTMrLh2j6yUmJOemRVXwZ7e\nuD6nJ+lsSYsk3T6e2zGzPuniOb1+Ge+Hk88heyOCmQ2iCia9cT29jYjZkqaO5zbMrI/8yIqZ1Yof\nWSniotz4bsAb+xWI2QD7VRp6zHdvizi03wGY1cA70tBwcm9WW7LrdZ0oQdIzs8qq4DW98X5k5ULg\nRmAnSQ9L+vB4bs/M1rDib07um/G+e3vYeK7fzPrMp7dmVisVTHp+c7KZFVe8GhqSNpF0iaT5ku6S\nNMN1b82s3F7ucGjtNODKiNgF+Avgblz31sxKrXix742BvVNxICJiRUQswXVvzazUip/e7gD8SdI5\nkn4n6QxJ6+O6t2ZWau0eR/nTEDw5NNIn1wKmAcdGxM2SvkE6lW1w3VszK592d283nZkNDXe/qu7t\nI8AjEXFzmr4EOAFY6Lq3ZlZeBa/pRcRC4GFJO6VZ+wJ3AlfgurdmVlrd/QztE8APJE0G7gc+DEzE\ndW+tvFz3trp6VPd27w7zx2zXvTWzQVDBX2Q46ZlZcRV8y4qTnpkVV7I3qHTCSc/MivPprZnVipOe\nmdWKr+mZWa20f4NKaTnpmVlxPr01s1rx6a2Z1YofWTGzWvHprZnVipOemdWKr+mZWa1UsKfnl4ia\nWa046ZnZGidpHUm/lTQv1bz9cprvurdmNngi4iVgn4h4M1nN230k/Xdc99bMyq14DciIeCGNTiZ7\nTfxiXPfWzMqtYGUgQNIESfPI6tteFxF34rq3ZlZuxZ9ZiYhXgDdL2hi4WtI+Tctd99bMyubFNvNv\nAG7saA0RsUTSz4A9gUWue2tmJdbuGt504B9yw+okbdG4MytpXWA/YC5ZfVvXvTWzsir8dPLWwLnp\nDuwE4PyI+IWkubjurZWX695WV4/q3nJPh613ct1bMxsE1fsdmpOemXWhem8ccNIzsy60u3tbXk56\nZtYFn96aWa349NbMasU9PTOrFff0zKxW3NMzs1pxT8/MasWPrJhZrbinZ2a14mt6ZlYr1evp+X16\n4+qOfgdgXflVvwOogOKvi+8XJ71xdWe/A7CuOOmNrnhhoH7x6a2ZdaFcvbhOOOmZWReq98hKCd6c\nbGb90Js3J6+57fVKX5Oemdma5hsZZlYrTnpmVitOemZWK056ZlYrTnoDTtJKSXMl3S7p4lRNvui6\nvifpfWn8DEm7jND2HZLeWmAbCyRtVjRGs9E46Q2+FyJij4jYHVgG/H1+oaSxPKsZaSAi/ldEzB+h\n7T7A28YabGP9ZuPFSa9eZgNvSL2w2ZJ+AtwhaYKkr0qaI+n3ko4GUOZ0SXdLuhbYqrEiSUOS9kzj\n+0u6VdI8SddK2h74GPCp1MvcS9KWki5J25gj6W3ps5tLukbSHZLOAErxLJcNLv8ioyZSj+5A4Mo0\naw9gt4h4MCW5ZyJiuqS1gV9LugaYBuwE7AK8FrgLOCt9PoCQtCXwH8DeaV2bRMQzkr4LPBsRp6bt\nXwB8PSJukLQd8F/ArsAXgesj4mRJBwJHjfsfw2rNSW/wrStpbhq/Hjgb2AuYExEPpvnvAnaXdEia\n3gjYEdgbuCCyJ9gfl/TLpnUL+EuypPUgQEQ807S8YV9gF2nVrA0lrZ+2cXD67JWSFnf1bc1G4aQ3\n+F6MiD3yM1Lieb6p3bERcW1TuwMZ/XSz02twAmZExLIWsfiU1tYYX9MzgKuBYxo3NSTtJGk9sp7h\noema39ZkNyfyArgJeLukqemzjTuvzwIb5tpeA3yyMSHpTWn0euDwNO8AYNPefS2zV3PSG3ytemLR\nNP9Msut1v5N0O/AdYGJEXAbcm5adC9z4qhVFPAkcDVwqaR5wYVp0BXBw40YGWcL7b+lGyZ1kNzoA\nZpElzTvITnMfxGwc+YUDZlYr7umZWa046ZlZrTjpmVmtOOmZWa046ZlZrTjpmVmtOOmZWa38fz1B\nOOrbmSdSAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c60b1d0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2813 37]\n",
" [ 317 166]]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAT0AAAEWCAYAAAAU8EBoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHg5JREFUeJzt3Xm4HFW57/HvL4EAAoZZASFBARmciNdE5aDRgwper8hR\nBFRExYPnII6co4BeJQ54nXAenqOAgAJ6UDAoKIhsCahEJNEgQcRjgACJypAwCJne+8danVQ63b17\nV/dOd3X/Ps9Tz+6qWlW1uqv63atqVderiMDMbFhM6HUFzMw2Jgc9MxsqDnpmNlQc9MxsqDjomdlQ\ncdAzs6FSmaAnaQtJl0p6QNJ3O1jP6yX9tJt16xVJB0m6peSyT5U0X9JySSd2u27WPkkPSpraZtk1\nkp7cZN6bJM3pZt0GUdeDnqTXSboh78i7JV0m6cAurPo1wE7AdhFxZNmVRMR3IuJlXajPuGp1cNdE\nxJyI2KfkJt4HXBURj4+IL5dcx1qSTpN0XmF8V0m3SPp8g7Lfyu/vOYVpe0pa02k9uqmdICJpZn4v\nX6mbfq2kY9vZTkRsHRGLOqiqjUFXg56k9wKfAz5GClC7AV8BXtmF1U8Bbo2IvvpijDM1nSFt0uG6\npwA3l1lQ0sQGk6MwfwpwDXBJRLy7yWruIx0n46oLn1M7HgbekN93TVD4TKqmyT4eDBHRlQGYDDwI\nvLpFmc2AzwN35eFzwKQ8byawGHgvsBS4G3hTnjcLeAxYkbfxFuA04LzCuqcCa4AJefxNwJ+B5cD/\nAK8rTJ9TWO75wG+AB4C5wPMK80aAjwDX5vX8FNi+yXur1f8/gb/m+r8KeDlwK3AvcHKh/HTgV8D9\nueyXgE3zvGvye3kov98jCut/H3APcE6edmde5il5Gwfk8V2AvwEvaFDXnwOrgH/k97Vn3n/n5rov\nAj4AqPCZXQecAfwd+EiDdZ4GnJfrcTtwWovj4Gzgs/l9vCBP2xNYU3c8nZk/m8XARwv79in5Pfw9\nv8dvA5MLyy7Kn9Pv83ucADwX+GX+vOcDLyyU3+BYAfYBHs2f04PAfS32+53AF4CzCtPnAG8sjL+F\n9E/mPuAnwO6FeWuAJ+fX2wOXAstIx+PHWP94XQO8jXRM3Q98ue59XEs6lh4AFgIvLszfBZidj5M/\nAW+t238X5X24LNd3OnBDHl8CfLZb8aKXQzeD3iHAytqB2aTMR/KBt0Merqt9gfLBszJ/+BOBQ0n/\nQSfn+R8Gzi2s68M0CXrAlnlH7ZXnPQHYr3BgzMmvt8sHzuvzckflg3LbPH8kHxx7ApsDVwOfaHHw\nrwQ+mOv/VtKX8ju5PvsBjwBTcvlp+aCawLpW17safRHq1v8JYNNcn5nkoJfLvBX4A7AFKUB/qsW+\nuBp4S2H8XODiXNcpwB9r8/NnthJ4e67v5g3W9+G8PxdTCO5Ntn02KYi9o7Av6oPexcDX8nvZEbge\nOD7Pewrwz/lz2AH4BfC5wrKLgBuBXUn/aHfN++KQPP/gPL79KMfKsRQCTov9fmdebhmwd56+NugB\nh+Xj6Kn58/sAcF2jfQ1cCJyf9+++wB3ANXVlZwOPJ51J/RV4Wd1+ehfpGHwtKfhtk+dfA3wZmAQ8\nMy/7ojzvNFKj4pV5fHPSP+XX5/HHATN6HbC6Equ6tqIUOO4ZpcxttQMvj78U+Evh4HmEQtAktfim\nF3ZKMcjVj09l/aB3P/AvwBZ1dXgT675oxwC/rpv/S+DY/Ppq4NTCvH8HLm9x8D/CutbR1rk+zymU\nuQE4rMny7wZ+0OiLUFj/Y+SWcfELV7eeHwILSK2ZTVvsi6uB4/LriXnd+xTmHw9cXfjMbh9l355G\n+tLfV6x3k7Jnk/4BTiK1Cg+hEPRIAeRRCsEVOBr4eZP1vQq4sTD+F/JZQh5/P4V/mHnaT4A3kr7M\nox4rLd7L2n0AfBK4ML8uBr3LWf8fzATSP/Tdivs674cV5ACc532UDVt6zy+Mfxd4f6G+d9XV73rg\nDaQAuQrYsjDvdODswv4bqVv2F3n6Dq0+g6oN3bymdy+wg6RW69yFdJDX3JGnrV1HrH/N7hFgq7FW\nJCIeBo4E/g24W9KPJD21SX3uqJt2e12dlhRe/2OU+twb+WjJZSEF7uLyWwJI2jvX6x5Jy4CPk1oe\nrfwtIlaMUuabwP7AlyJi5Shla3XdgdRqqt83uxbG72xjXbNJAe3nknYHkHRq7tR6UNJX11sgvZeP\n5iEKs6bk+twj6X5J9wNfJ7X4kPQESRdKWpw/u/PY8LO7s259R9TWldd3IPDEiHiE9o4VJO1eeC/L\nGxT5FPAySc+omz4F+EJh2/fm6bvWldsR2KSu7osbbKd4TD5CPqayu+rK3g7snIf78nejpn4f12/r\nOGBvYKGkuZL+d4O6VE43g96vSK2Fw1uUuZvUIqvZPU8r4yHSf+maJxZnRsQVEfHSPP0W4BsN1nEX\n6YAsmsKGB854+BrplHbPiJhMOuUZbX9Eq5mStiJdM/0mMEvStm3W5e+k06KphWm7s/6XoOW2yZ0u\nEXES8CNS4NslIk6P1Du5dUScUF8e+BawDfDqwrw7ScfS9hGxbR4mR8TT8/zTgdXA0/JndwwbfnbF\n+t5BOivYtjBsHRGfynVudqys954j4o7Ce3l8/QcQEfeSPv/6Dpo7SKfmxe1vGRG/riv3N1JrbLfC\ntN0Ym/pAOoX0Hbsb2C4fIzUt93FE3BYRr4uIHUmt2IskbTHG+vSdrgW9iFgGfAj4iqTDJD1O0qaS\nDpX0yVzsAuCDknaQtEMuf16zdY5iPvACSbtJmgycUpshaadchy1JX+aHSV+SepcDe0s6WtImko4k\nXcD+UaFM0x7UDm1FukD+iKR9SKfORUtJ167G4gvA3Ig4HvgxqXXUSi1QrQa+B3xc0la5F/I9pA6C\nMYuIE0mnz1dJ2qnZdnPZVaTrge8vTLsHuAI4Q9LWkiZIeoqkF+QiW5H26XJJu5I6j1r5NvB/JL1U\n0kRJm+dbTXYd5VhZCjxJ0qZjePtnAM8jXY+r+TpwqqT9ACRNlnRE/YJ5P/wAOC3fl7oPKaC3+ocj\n1j9Gd5L0zvzdO4J0PF8WEYtJl24+IWmz3Bp9Cy32saQ3SNoxjy7L9aj83RNdvWUlIs4g9b5+kHSR\n9A7gBNJFaUj/AW8g9ar9Pr8u/ldstXOjOD8ifka6nvF7Uu/rpYX5E0hf2rtIpxIHsS6orF1P/s/8\nCuAkUmvnP4BXRMR9TeoUjF7HVuNF/0HqJVwO/BfpAnax/GnAOfmU6DUtth0Akg4jXSOtvc/3AtMk\nHd1mfd9B+sL/D+l61HdIp6q1cqO19OrLHE/qfbxS0najlL2A1BIpTnsj6Zpfrcfzv1nXmp9F6gha\nRtrv329Vv/yFPww4lXXH5UmkYNHqWLmK1DG0RNJfR3nvtW09SDrN3bYw7RLy9b58Or4AeFmj5YET\nST3XS0g99BeQrvM1Klsbj8LrXwN7kVqNHyXdTXF/nn80qTV/Nym4figift5gPTUvA26S9CDpTouj\nIuKxZh9CVdQuuptZH8pnSTtFxJt7XZdBUZmfoZkNA6WfBz5DyXTSKejFoy1n7XPQGweSDsk/wfqT\npPePvoT1C0lnSVoqaUGPqrA16XT9IdIlj89ExOwe1WUg+fS2y/LPd/5IugH2LtL1xqMjYmFPK2Zt\nkXQQKeCcW+gttgHill73TQdui4hF+T65C0kX0a0CImIO6WZlG1AOet23KxveXFp/75SZ9YiDXvf5\neoFZH3PQ67672PCO+kY/JTKzHnDQ674bgL0kTZU0ifS7Tve+mfUJB70uyz+rOpH0aKebge+657Y6\nJF1A+rnW3pLulOSbggeMb1kxs6Hilp6ZDRUHPTMbKg56ZjZUHPTMbKg46JnZUNkYOUGbkuSuY7Me\niYiOngo+1u9vp9vrlp4GPUjPCR9UI6RUWYNq1kDvPRjsPTirK2tpN1v7B7uyte7oedAzs+oaS/KQ\nfuGgZ2alVTGAuCNjHE3tdQWsQ1N7XYG+t0WbQ72cxfBqSX+QdJOkd+bp35U0Lw9/kTSvsMwp+Wnk\nt0h6aWH6syUtyPO+MFqdqxioK2NqrytgHZra6wr0vQ5Ob1cC74mI+TkX728lXRkRR9YKSPoM8EB+\nvR/p4R37kZ5P+TNJe0X6He3XgOMiYq6kyyQdEhE/abZht/TMrLRN2hzqRcSSiJifXz8ELAR2qc2X\nJOC1pBSYkJ4+fkFErIyIRcBtwAxJOwNbR8TcXO5c4FWj1dnMrJRudGRImgocAFxfmHwQsDQi/pzH\ndyHl9K2pPZF8Jes/r/IuRnlSuYOemZXWaQDJp7YXAe/KLb6ao4HzO1x9Qw56ZlZas5beTcAfRllW\n0qakdJffjohLCtM3AQ4HphWK1z+R/EmkFt5d+XVx+l2ttuugZ2alNQt6B+Sh5nt18/M1uzOBmyPi\n83WzDwYWRsTdhWmzgfMlnUE6fd0LmBsRIWm5pBnAXOAY4Iut6uygZ2alNbodpU0HAm8Afl+4LeWU\n3Ot6JOs6MACIiJslfY/0NPJVwAmx7gnIJwDfytW5rFXPLTjomVkHygaQiLiWJnePRETDR/RHxOnA\n6Q2m/xZoOzG7g56ZleafoZnZUKliAKlinc2sT7ilZ2ZDpYoBpIp1NrM+4ZaemQ2VDm5Z6RkHPTMr\nzS09MxsqVQwgVayzmfWJTduNIKvGtRpj4qBnZqVt4qBnZsNk04m9rsHYOeiZWWltt/T6SAWrbGb9\nYtPNel2DsXPQM7PyKhhBKlhlM+sbFYwgFayymfWNCkYQp4A0s/ImtjnUaZbsuzD/JElrJG1XmNaV\nZN8OemZWXtnEt+uSfe8PPBd4u6R9IQVE4CXA7bXCdcm+DwG+mvNswLpk33sBe0k6pFWVHfTMrLzN\n2hzqjJLs+wzgfXWLONm3mfWBLkSQYrJvSYcBiyPi9+sacoCTfZtZX2gSQUaWwcjy0RcvJvsG1gCn\nkk5t1xbptIr1HPTMrLwmP0ObuV0aamY1SL9dn+xb0tOBqcDvcivvScBvc07briX79jU9MyuvZEdG\no2TfEbEgIp4QEXtExB6koDYtIpaSkn0fJWmSpD1Yl+x7CbBc0oy8zmOAS0arsplZOeUjSKNk36dG\nxOWFMrH2hZN9m1lfKBlBWiX7LpR5ct24k32bWY/5gQNmNlQqGEEqWGUz6xt+iKiZDZUKRpAKVtnM\n+kYFI0gFq2xmfcOnt2Y2VCoYQSpYZTPrG5v3ugJj56BnZuX59NbMhkoFI0gFq2xmfaOCEaSCVTaz\nvuHTWzMbKhWMIOP6PD1Jh+TMRX+S9P7x3JaZ9UD5xEA9M27VkTQR+DJwMOlJpr+RNDsiFo7XNs1s\nI6vgU1bGs6U3HbgtIhZFxErgQlJGIzMbFOWfnNww762kI/K01ZKm1S3T93lvdwXuLIzXsheZ2aDo\nft7bBcDhwDXFwt3MezueZ9sxehEYKbyemgcz67ZFeeiykr23ObfFkvz6IUkLgV0i4iqAuvSPUMh7\nCyySVMt7ezuN8942fWT8eAa9+uxFu7F+fkoAZo5jBcysZirrNyl+0Z3VdjnvbYtilch7ewOpqTkV\nuJvUND16HLdnZhtbs7y3t8DIH0dfvJj3NiIe6mbVmhm3oBcRqySdCPyU1Ag+0z23ZgOmWd7b/dNQ\nM+vSDcvU570dZUtdy3s7rnfQ5HRul49a0MyqqeRTVhrlvW1UrPB6NnC+pDNIp6+1vLchaXlOCD6X\nlPf2i6223We3DZpZpXQ57y3pzr8vATsAP5Y0LyIOdd5bM+sP5XtvW+W9bXiq67y3ZtZ7FYwgFayy\nmfWNCkaQClbZzPqGHy1lZkPFOTLMbKi4pWdmQ6WCEaSCVTazvlHBCFLBKptZ36hgBKlglc2sb/ia\nnpkNlQpGkApW2cz6RgVzZDjomVl5FYwgFayymfWNCkaQClbZzPpGBSNIBatsZv0iKth7O54pIM1s\nwK3epL2hnqSzJC2VtKAwbbqkuZLmSfqNpOcU5nUl5y046JlZB8oGPeBsUv7aok8B/zciDgA+lMe7\nmvMWfHprZh14bLNJbZZcsd5YRMzJmRKL7gEm59fbsC7BT9dy3oKDnpl1YPXErl7UOxm4VtJnSGeh\nz8vTu5bzFhz0zKwDq5v8Du26kVVcN7J6rKs7E3hnRFws6QjgLOAlndVwQw56ZlbaqiZBb8bMicyY\nuW7807OWtbO66RFxcH59EfDN/LprOW/BHRlm1oHVbNLW0KbbJL0wv34xcGt+PRs4StIkSXuwLuft\nEmC5pBm5Y+MYmmRSK3JLz8xKa3Z6OxpJFwAvBHaQdCept/Z44CuSNgP+kcfpZs5bcNAzsw6UDXoR\ncXSTWTOalO9Kzltw0DOzDjxGu7es9A8HPTMrbQzX6/pG9WpsZn2j7OltLznomVlpDnpmNlSa3afX\nzxz0zKw0X9Mzs6Hi01szGyorfMuKmQ0TX9Mzs6Hia3pmNlR8Tc/MhoqDnpkNFV/TM7OhsoLNel2F\nMXPQM7PSqnh66ycnm1lpq5jY1lCvSd7b0yQtznlv50k6tDBv4+W9lTRB0jGSPpTHd5c0vZ2Vm9lg\n6+Bx8Y3y3gZwRkQckIfLoft5b9tp6X2VlIrtdXn8oTzNzIbcaia2NdSLiDnA/Q1WqQbT1ua9jYhF\nQC3v7c40znvbUjtBb0ZEnEB6Zj0RcR+waRvLmdmAKxv0WniHpN9JOlPSNnnaLqyf37aW97Z+etfy\n3q6QtLbWknYE1rSxnJkNuGYB7daRe/jTyD1jXd3XgI/k1x8FPgscV7pyTbQT9L4EXAzsJOl04DXA\nB7tdETOrnsea3LIyZeZUpsycunb88lnzRl1XRPy19lrSN4FL82hX896OGvQi4tuSfgv8c550WEQs\nHG05Mxt83bxlRdLOEVFrHh4O1Hp2ZwPnSzqDdPpay3sbkpZLmgHMJeW9/eJo2xk16EnaHXiYdVE3\nJO0eEXeM6R2Z2cDpYt7bDwMzJT2L1Iv7F+Bt0Ju8t5flSgBsDuwB/BHYv613Z2YDq+zP0JrkvT2r\nRfmNl/c2Ip5WHJc0DXj7WDZiZoNpKB4tFRE35nPorpjFsm6tyja6kV5XwHqsij9Da+ea3kmF0QnA\nNNroITGzwTeQQQ/YqvB6FfAj4PvjUx0zq5LHBi1HRr4p+fERcVKrcmY2nAbqmp6kTSJilaQDJanQ\nRWxmBgze6e1c0vW7+cAPJf038EieFxHxg/GunJn1t0ELerWnHWwO3Au8uG6+g57ZkBu0x8XvKOm9\nrPspiJnZegbqmh4wEdh6Y1XEzKpn0E5vl0TErI1WEzOrnBWDdsuKmVkrg3ZN7+CNVgszq6SBuqYX\nEfduzIqYWfUM2jU9M7OWqhj0nPfWzErrct7bT0tamBMD/UDS5MK8jZf31sysmS7nvb0C2D8ingnc\nCpwCvcl7a2bW0AomtTXUa5T3NiKujIhapsXrWZf0p6t5b31Nz8xKG8dbVt4CXJBf7wL8ujCvlvd2\nJeOU99bMrKFmt6wsG5nP8pH5pdYp6QPAiog4v4OqNeWgZ2alNeu93Wrms9lq5rPXji+edW5b65P0\nJuDlrEs5C13Oe+tremZW2momtjW0I3dC/Ccpt/ajhVmzgaMkTZK0B+vy3i4BlkuakTs2jgEuGW07\nbumZWWldznt7CjAJuDJ3zv4qIk7odt5b9fKByJICZ0OrsJFeV8BKO4yI0OjlmpMU+8aNbZVdqGkd\nb69b3NIzs9Kq+IsMBz0zK81Bz8yGyqA9WsrMrKWBerSUmdlofHprZkPFQc/MhspjK5wjw8yGyOpV\n1Qsh1auxmfWN1at8emtmQ8RBz8yGyqqVDnpmNkTWrK5eCKlejc2sf/j01syGyqPVCyHVq7GZ9Y9V\nva7A2PnJyWZW3qo2hwYkvSvnrL1J0rvytO0kXSnpVklXSNqmUL5h7tuxctAzs/JKBj1JTwPeCjwH\neCbwCklPAU4GroyIvYGr8niz3Lel4peDnpmVt7LNYUP7ANdHxKMRsRr4BfBq4JXAObnMOazLY9so\n9+30MlV20DOz8la3OWzoJuCgfDr7OFIGtCcBT4iIpbnMUuAJ+fUurJ/jtpb7dszckWFm5TXryJg3\nAvNHmi4WEbdI+iRwBfAwMJ+68BgRkfLoNF/NmOqaOeiZWXmPNpm+78w01Hxr1gZFIuIs4CwASR8n\ntd6WSnpiRCyRtDPw11y8Ue7bUXPcNuLTWzMrr7Pe253y392BfwHOJ+W4PTYXOZZ1eWwb5r4tU2W3\n9MysvM7u07tI0vakro4TImKZpP8HfE/SccAi4LUAo+S+HRPnvbUOjPS6AlZad/Le8v0248er5by3\nZjYAGt+O0tcc9MysvMa3o/Q1Bz0zK6+Cv7110DOz8prdstLHHPTMrLwKtvTG9T49SWdJWippwXhu\nx8x6pIP79HplvG9OPpv0RAQzG0QVDHrjenobEXMkTR3PbZhZD/mWFTMbKr5lpYxPFF7/E3BQrypi\nNsAWkJ7m1GXuvS3jlF5XwGwIPD0PNRd2Z7V9dr2uHX0Q9Myssip4TW+8b1m5APglsLekOyW9eTy3\nZ2YbWfknJ/fMePfeHj2e6zezHvPprZkNlQoGPT852czKK58NDUnbSLpI0kJJN0ua4by3ZtbfHmtz\naOwLwGURsS/wDOAWnPfWzPpa+WTfk4GDcnIgImJVRCzDeW/NrK+VP73dA/ibpLMl3SjpG5K2ZCPk\nvXXQM7Pyyt+ysgkwDfhqREwj5b49uVggJ/5x3lsz6yPNem//PgL3jrRacjGwOCJ+k8cvIv08a8l4\n5711NjTrwEivK2CldSkb2qFtxo/LN8yGJuka4K0Rcauk04DH5Vn3RsQnJZ0MbBMRJ+eOjPNJ1/F2\nBX4G7FkmDaRbemZWXmc/Q3sH8B1Jk4A/A28GJuK8t9a/RnpdASutSy29g9qMH3Oc99bMBkEFf5Hh\noGdm5VXwKSsOemZWXp89QaUdDnpmVp5Pb81sqDjomdlQ8TU9MxsqzZ+g0rcc9MysPJ/emtlQ8emt\nmQ0V37JiZkPFp7dmNlQc9MxsqPianpkNlQq29Py4eDMbKg56ZrbRSdpc0vWS5uect5/I05331swG\nT0Q8CrwoIp5Fynn7Ikn/hPPemll/K58DMiIeyS8nkR4Tfz/Oe2tm/a1ktm9A0gRJ80n5ba+OiD+w\nEfLeuvfWzDpQ/p6ViFgDPEvSZOCnkl5UNz9SHp3mqyizXQc9M+vAP5pMvw74ZVtriIhlkn4MPBtY\nOt55b316a2YdaHYNbzrw7sKwPkk71HpmJW0BvASYB8wGjs3FjgUuya9nA0dJmiRpD2AvYG6ZGrul\nZ2YdKH138s7AObkHdgJwXkRcJWkezntr/Wuk1xWw0rqU95Zb2yy9t/PemtkgqN7v0Bz0zKwD1Xvi\ngIOemXWgWe9t/3LQM7MO+PTWzIaKT2/NbKi4pWdmQ8UtPTMbKm7pmdlQcUvPzIaKb1kxs6Hilp6Z\nDRVf0zOzoVK9lp6fpzeu5vS6AtaRBb2uQAWUf1x8rzjojatre10B68hNva5ABZRPDNQrPr01sw70\nVyuuHQ56ZtaB6t2y0gdPTjazXujOk5M33va6padBz8xsY3NHhpkNFQc9MxsqDnpmNlQc9MxsqDjo\nDThJqyXNk7RA0vdyNvmy6/qWpFfn19+QtG+Lsi+U9LwS21gkabuydTQbjYPe4HskIg6IiKcDK4B/\nK86UNJZ7NSMPRMS/RsTCFmVfBDx/rJWtrd9svDjoDZc5wJ65FTZH0g+BmyRNkPRpSXMl/U7S8QBK\nvizpFklXAjvVViRpRNKz8+tDJP1W0nxJV0qaArwNeE9uZR4oaUdJF+VtzJX0/Lzs9pKukHSTpG8A\nfXEvlw0u/yJjSOQW3cuBy/KkA4D9I+L2HOQeiIjpkjYDrpV0BTAN2BvYF3gicDNwZl4+gJC0I/Bf\nwEF5XdtExAOSvg48GBFn5O2fD3wuIq6TtDvwE2A/4MPANRHxMUkvB44b9w/DhpqD3uDbQtK8/Poa\n4CzgQGBuRNyep78UeLqk1+TxxwN7AQcB50e6g/0eST+vW7eA55KC1u0AEfFA3fyag4F9pbWTtpa0\nZd7G4XnZyyTd39G7NRuFg97g+0dEHFCckAPPw3XlToyIK+vKvZzRTzfbvQYnYEZErGhQF5/S2kbj\na3oG8FPghFqnhqS9JT2O1DI8Ml/z25nUOVEUwK+BF0iampet9bw+CGxdKHsF8M7aiKRn5pfXAK/L\n0w4Ftu3e2zLbkIPe4GvUEou66d8kXa+7UdIC4GvAxIi4GPhTnncO8MsNVhTxd+B44AeS5gMX5FmX\nAofXOjJIAe9/5Y6SP5A6OgBmkYLmTaTT3NsxG0d+4ICZDRW39MxsqDjomdlQcdAzs6HioGdmQ8VB\nz8yGioOemQ0VBz0zGyr/H2DgZHYpv+O0AAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c7c6e10>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2820 30]\n",
" [ 124 359]]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAUkAAAEWCAYAAADrUmWKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHrBJREFUeJzt3Xm8HGWd7/HPNyGBsBh2JSoJKhkiw1VQiYrRMIOKXB0G\nxUFQFMWLc3G7gsOIG8RxGUbFXcaFKKCAiKKgIDBKJKgY0ERZgoAaCJBElhB2svC7fzxP59TpdFf3\n6dOnT9c53/frVa9TXetTS//OU09V108RgZmZNTZhtAtgZtbPHCTNzEo4SJqZlXCQNDMr4SBpZlbC\nQdLMrMSoBklJUyRdJOl+Sd8bxnLeKOnSbpZttEiaI+mmDuf9O0lLJD0g6V3dLttIkXSypLNy/66S\nHpSk0S5XrwznmHdh3UdJWjiCy79Y0pGFzx+XdLekuyQ9vQrHuq0gKekISdfmDborb/h+XVj/ocDO\nwPYRcVinC4mI70bEK7tQnhEl6QlJzyibJiIWRsQeHa7iBODnEfGkiPhyh8sYRNLuks6V9DdJayTd\nLOmLkp7ajeVnGx/WjYjbI2Kb6MIDvJIWSDq6ZPyMfEwezN1KSV+RtNlw192iXIPOg2Ee83bW90pJ\nV+Z/nn/L++U1I7W+oog4KCI2/gMEjgP2iIhpEbG8W8d6JLUMkpKOAz4HfJwU0J4OfAX4py6sfzpw\nc0Q80YVlVUXT/5pd+HJOB27sZEZJExsMexbwW+AO4LkRMRXYD/gz8JImyxnRADNE7X75pkbENsBe\nwIuAd45ckTbqSe1J0qHAecC3gadGxM7AR4GeBMk6uwL3RsS9w11Qo/N1xERE0w6YCjwIvK5kms2B\nzwN35u5zwOQ8bi7pC3YcsAq4Czgqj5sHPA6szet4G3AycFZh2TOAJ4AJ+fNRpC/oA8BfgCMKwxcW\n5nsxcA1wP7AIeFFh3ALgY8BVeTmXAjs02bZa+f8N+Fsu/z8DBwE3A/cCHyhMvy/wG2B1nvZLwKQ8\n7sq8LQ/l7X19YfknACuAM/Kw5XmeZ+Z17J0/TwPuBl7aoKy/ANYDj+btelY+fmfmsi8DPgSosM9+\nBZwK3AN8rMEyvwP8uMU50mgbtgV+ktd7H3AR6Qtam2c34Je5nJfl/XRWk2M+FTg97887gP+oOx+u\nAj6d1/MX4MA87hOF/fEg8MUGZR+0rjzsFOBrhc+z8jmzGrgeeE3d96PZ/n1W3sb78zE7p8V5sLyw\n3GXA8cAf8vznApsXxp9Q2B9vz8t7RoPtE3A7cHzJ8TuKwd+dL+R51gDXAi+pO7+vzeNWAp/Nw7fI\n58o9eT8tAnYqfN+OBv4ReATYkLd7fgfHuvR8HamuVZA8EFhXPIkaTPMx4NfAjrn7VW0D8sFfRwp+\nE4FXAQ+T/nMDnAScWVjWSTQJksBW+eDsnsc9GXh2/YEGts8H6o15vjeQvkDbFQ7aLaSTeAvgCuBT\nJQFgHfDhXP635wP03VyeZ+cDPz1Pv08+kSYwUKt7b2F5g07mwvI/BUzK5ZnL4C/M24EbgCmkgP5f\nJcfiCuBthc9nAhfksk4H/lQbn/fZOlKtaQKwRYPlrQDe3EaQrN+G7YFDcv/WpJrMBYV5fgN8Jk8/\nhxQsz2wSJC8ATsvbvxOpZntMYRvWkr6EAv4VuLPZ/igJkhPz52nAEgb+kU8CbgU+AGwG7J/LOrON\n/XsOcGLunwy8uMV5UDzmfwWuBp4CbJfPo3cUvpMrSMF7Cik4baBxkNwjr2v6EILkG/M6J5AqNysY\nqPT8Bnhj7t8S2Df3vwO4MB9vAXsD29QfA+Bldds51GNder6OVNcqSL4RWNFimlvJ/73z51cAfy0c\n/EcY/J96VWHnnszgoFj/eeNOzCfiauC1wJRmBxo4Eri6bvyvgbcUDtoHC+P+L3BJSQB4hIHawTa5\nPC8oTHMtcHCT+f8f8MMWX47Haydhoy9MHvZj4DrSF3hSybG4Ajg690/My96jMP4Y4IrCPrutxbFd\nB7yi8Pld+Rg8CHy92TY0WM5zgfty/655uVMK479Lg5ok6R/hY8UvBHA48IvCNtxSGLdlnnfn+v3R\npFy1da3O3ROkmmntCz6HuvMfOJv0z7zV/j0D+BqFGnSL86A+SB5R+HwKcFrunw98ojDumfXLK4zb\nL48rOzZHUQiSDcbfB+yV+39J+o7uWDfNW0mVo72anJNva7KdQz3WpefrSHWt2iTvBXaUVDbdNOC2\nwufb87CNy4jBbY6PkGoXQxIRDwOHkWoLd0n6iaS/a1Ke2+uG3VZXppWF/kdblOfeyEcpTwsp0Bfn\n3wpA0sxcrhWS1pAu+XYoWTbA3RGxtsU03wT2BL4UEetaTFsr646kmlD9sSnecFneYln3UthvEfHl\niNiO1LxSbHsctA2StpT0NUnL8n74JTA138WcBqyOiEcL8xfLWDQ9b8MKSaslrQb+m1TLqNl4LCPi\nkdxbPJ5Bazvk7dqS9A+19qTENDbdR7VzaQfK9+8JpFrVIknXS3prG+Uoqj9Ht8r9u9SV6Y6SZdTa\n/nZpd6WS3i/pxvzEyWrSJfCOefTRwExgqaRFkv53Hn4WaZ+dK+lOSad00DbdzrFudb6OiFZB8jek\n/5aHlExzF+k/Qs2ueVgnHiKdqDVPKY6MiMsi4hV5+E3ANxos407SDi+anoePtNNIl0bPinST40O0\n3selX2JJW5OC0jeBeZK2a7Ms95BqbDMKw3Zl8JeqVQD5OanmvkmxGHzjoX45x5O+TPvm/fCywjwr\ngO0kFY/z9CZlWU46/3aIiO1yNzUi9mpR7mblKp844jFSDfCFkrYnncdPr3tEpXYule7fiFgVEcdE\nxFNJl6NfbfVkQ5tWkG6e1jy92YSky//lpKdIWpI0h9T+/vqI2Db/41hDPtYRcWtEHBERO5Fqt+dL\nmhIR6yPiYxGxJ+l+wKuBNw9xu9o51kM6nt1S+gWOiDWkO2FfkXRwriFMkvQqSafkyc4BPixpR0k7\n5unP6rA8S4CX5uenpgIn1kZI2jmXYSvSyfkwqS2m3iXATEmHS9pM0mGktpmfFKYZqTuLW5MuRR+R\ntAfpUr5oFenyaCi+ACyKiGOAn5L+u5apndAbSG2Bn5C0taTpwPtIbVjtOhmYI+mzkqYB5GM8i/IT\ndmtS7WdNDjYn1UZExG2kJop5+Vx6CelLtYmIWEG6sXOqpG0kTZD0TEkvbbP87e5vAUjanNRcsyIi\n7iO1iT0CnJDLOjeX9dx8ddR0/0p6vaSn5eXfT9pftSuqTs6D2jl7HvBWSXvkfzQfaTZDvgI6DvhI\nfh7ySXkfvkTS1xrMsg3pZtc9kiZL+ijwpI0FkN4kqVazW1PbJkn7S9or33F+kPT9bPTdbKoLx3rE\ntHwEKCJOJe3oD5Pu4t0OHEtqZIX0aNC1wB9zd20etnERZYsvjo+I/wG+l5dzDemuaG38BNJJeCfp\nMmIOA0Fo43IiPV7walJt5h7g/cCr80nfqExB6zKWfS56P3AEqXH/66S7ksXpTwbOyJcTh5asOwAk\nHUxq461t53HAPpIOb7O87yb9M/kLsJDU9vetwnSl/5kj4hZgNvA04A+SHiC12d3B4C9n/XI+T2p8\nv4d0+XpJ3TRH5OXeR/qnekbJNryZdOPjxjz99xm4wmi0DcXPXwAOlXSfpM+XbOr9kh4kXeLOJj/e\nlpsQXkO64Xg38GXgyIi4Oc+3yf6NiPl53POBq/Nyfwy8JyKW5XEn0955UNym2vn9M+CLpLa+m0lX\ne5BqYZvOGPEDUjPV20jfnZWkm60/ql828LPc3Uy6w/4og5uuXglcn7fpc8AbIuJxUnvi90mB80bS\nzdFmFaWy4zXUY90TtRsSZlZBkmaRbupNjvH1vHHP+LfbZhUj6RBJm+f26VOACx0gR46DZJ+QdKCk\nmyTdIunfR7s81j5J8yWtknRdj1Z5DKld81ZS+19927d1kS+3+0Bu8P4TcACp3ega4PCIWDqqBbO2\n5LvCD5EeiG/3zrtVhGuS/WFf4NaIWJafgzwXOHiUy2RtioiFpIfRbQxykOwPT2XTB4S7+ZYdM+uQ\ng2R/cJuHWZ9ykOwPd7LpryjKfm5mZj3iINkfrgV2V3oJ7GTSw78XjnKZzAwHyb4QEetJb9i5lPRr\ng+/5znZ1SDqH9MuimZKWd/AyC+tjfgTIzKyEa5JmZiUcJM3MSjhImpmVcJA0MyvhIGlmVqKfciS3\nJMm34s1GUUR0/Fb/oX5/h7OubqpUkIRCHoAxaAEpndxYNW9MHz0YD0dwuD7eehIgpUHoF5ULkmZW\nXZNGuwAdcJA0s56pYsCpYpnHrBmjXQAbphmjXYC+N2W0C9AB393uIzNGuwA2TDNGuwB9b1KbXb2c\nZvoKSTdIul7Se/Lw70lanLu/SlpcmOfEnA7lJkmvKAx/nqTr8rgvtCqza5Jm1jPDCDjrgPdFxBJJ\nWwO/k3R5RBxWm0DSZ0g5zpH0bNLbtJ5NeoH1/0jaPeciPw04OiIWSbpY0oE5VW9DrkmaWc90WpOM\niJURsST3PwQsBabVxksS8C/AOXnQwcA5EbEu5zu/FZgtaRdgm4hYlKc7E/jnsjK7JmlmPdONgCNp\nBrA38NvC4DnAqoj4c/48Dbi6ML6WEmUdg19ofSctUqU4SJpZzzR7BOh64IY25s+X2ucD7801yprD\ngbOHWbyGHCTNrGeaBcm9c1dzXoNpJE0CfgB8JyJ+VBi+GXAIsE9h8vqUKE8j1SDvzP3F4XeWldlt\nkmbWM1Pa7OrlNsfTgRsj4vN1ow8AlkbEXYVhFwJvkDRZ0m7A7sCiiFgJPCBpdl7mkcCPKOGapJn1\nzDACzn7Am4A/Fh7zOTHflT6MgRs2AETEjZLOI6VDWQ8cGwNpGI4Fvk2KxxeX3dkeZpnNzIam058l\nRsRVNLnyjYiGOYUi4pPAJxsM/x2wV7vrdpA0s56pYsCpYpnNrKL8ggszsxJVDDhVLLOZVZRrkmZm\nJar4FiAHSTPrGdckzcxKVDHgVLHMZlZRk9qNOOtHtBhD4iBpZj2zmYOkmVlzkyaOdgmGzkHSzHqm\n7ZpkH6lgkc2sqiZtPtolGDoHSTPrnQpGnAoW2cwqq4IRp4JFNrPKqmDE8ZvJzax3JrbZ1WmWd7sw\n/nhJT0javjCsK3m3HSTNrHc2a7PbVC3v9p7AC4F3SpoFKYACLwduq01cl3f7QOCrOV0DDOTd3h3Y\nXdKBZUV2kDSz3tm8za5Oi7zbpwIn1M3ivNtmVkFdiDjFvNuSDgbuiIg/DlQUAefdNrNKahJxFqyB\nBQ+0nr2Ydxt4Avgg6VJ74yTDLWI9B0kz650mP0ucu33qauY1yIRdn3db0l7ADOAPuRb5NOB3kmbj\nvNtmVkkd3rhplHc7Iq6LiCdHxG4RsRspCO4TEatw3m0zq6TOI06jvNsfjIhLCtPExh7n3TazSuow\n4pTl3S5M84y6z867bWYV4xdcmJmVqGDEqWCRzayy/NJdM7MSFYw4FSyymVVWBSNOBYtsZpXly20z\nsxIVjDgVLLKZVdYWo12AoXOQNLPe8eW2mVmJCkacChbZzCqrghGngkU2s8ry5baZWYkKRpy+ep+k\npANzZrNbJP37aJfHzLqs80Rgo6ZviiNpIvBl4ADSm4KvkXRhRCwd3ZKZWddU8C1A/VST3Be4NSKW\nRcQ64FxSxjMzGys6fzN5w7zbkl6fh22QtE/dPGMu7/ZTgeWFz7XsZmY2VnQ/7/Z1wCHAlcWJu5l3\nu28utym8er3MgkL/jNyZ2UhYlrsu6vDuds5NszL3PyRpKTAtIn4OUJdOFgp5t4Flkmp5t2+jcd7t\npikc+ilI1mc3ezqD8+MCMLdXpTEb92YwuBryy+Evsst5t0smG5N5t68lVX1nAHeRqsqHj2aBzKzL\nmuXdvgkW/Kn17MW82xHxUDeL1kzfBMmIWC/pXcClpEr56b6zbTbGNMu7vWfqauZdtOk09Xm3W6yp\na3m3+yZIAuT0kJe0nNDMqqnDtwA1yrvdaLJC/4XA2ZJOJV1O1/Juh6QHJM0GFpHybn+xbN19FSTN\nbIzrct5t0pOXXwJ2BH4qaXFEvMp5t82smjq/u12Wd7vhpbfzbptZ9VQw4lSwyGZWWRWMOBUssplV\nll+VZmZWwjluzMxKuCZpZlaighGngkU2s8qqYMSpYJHNrLIqGHEqWGQzqyy3SZqZlahgxKlgkc2s\nsiqY48ZB0sx6p4IRp4JFNrPKqmDEqWCRzayyKhhxKlhkM6uqqODd7X5KKWtmY9yGzdrr6kmaL2mV\npOsKw/aVtEjSYknXSHpBYVxXcm6Dg6SZ9VCnQRL4Fil/dtF/AR+JiL2Bj+bPXc25Db7cNrMeenzz\nyW1OuXbQp4hYmDOpFq0Apub+bRlI6NW1nNvgIGlmPbRhYlcbJT8AXCXpM6Sr4hfl4V3LuQ0OkmbW\nQxua/C7xVwvW86sFG4a6uNOB90TEBZJeD8wHXj68Em7KQdLMemZ9kyA5e+5EZs8d+PzpeWvaWdy+\nEXFA7j8f+Gbu71rObfCNGzProQ1s1lbXplslvSz3/wNwc+6/EHiDpMmSdmMg5/ZK4AFJs/ONnCNp\nkmmxyDVJM+uZZpfbrUg6B3gZsKOk5aS72ccAX5G0OfBo/kw3c26Dg6SZ9VCnQTIiDm8yanaT6buS\ncxscJM2shx6n3UeA+oeDpJn1zBDaG/tG9UpsZpXV6eX2aHKQNLOecZA0MyvR7DnJfuYgaWY94zZJ\nM7MSvtw2Myux1o8AmZk15zZJM7MSbpM0MyvhNkkzsxIOkmZmJdwmaWZWYi2bj3YRhsxB0sx6poqX\n234zuZn1zHomttXVa5J3+2RJd+S824slvaowrn/zbkuaIOlISR/Nn3eVtG+312Nm1TOM9A2N8m4H\ncGpE7J27S6D7ebdHoib5VVJqxyPy54fyMDMb5zYwsa2uXkQsBFY3WKQaDNuYdzsilgG1vNu70Djv\ndqmRCJKzI+JYUs4JIuI+YNIIrMfMKqbTIFni3ZL+IOl0SdvmYdMYnF+7lne7fvio5d1eK2njVkra\nCXhiBNZjZhXTLADevGAFtyxYMdTFnQZ8LPf/B/BZ4OiOC9fESATJLwEXADtL+iRwKPDhEViPmVXM\n400eAZo+dwbT587Y+PmSeYtbLisi/lbrl/RN4KL8sat5t7seJCPiO5J+B/xjHnRwRCzt9nrMrHq6\n+QiQpF0iolb9PASo3fm+EDhb0qmky+la3u2Q9ICk2cAiUt7tL7ZaT9eDpKRdgYcZiOohadeIuL3b\n6zKzauli3u2TgLmSnku6y/1X4B1QjbzbF+dCA2wB7Ab8CdhzBNZlZhXS6c8Sm+Tdnl8yff/m3Y6I\nvy9+lrQP8M5ur8fMqsevSmsgIn6f2wC6Yh5ndWtR1nNvGu0C2LDMG/YSqvizxJFokzy+8HECsA9t\n3EEys7HPQTLZutC/HvgJ8IMRWI+ZVczj4z3HTX6I/EkRcXzLic1s3BnXbZKSNouI9ZL2k6TCLXcz\nM8CX24tI7Y9LgB9L+j7wSB4XEfHDLq7LzCpovAfJ2ts4tgDuBf6hbryDpNk4N97TN+wk6TgGfhpk\nZjbIuG6TBCYC23RxeWY2xoz3y+2VETH8p03NbMxaO94fATIzKzPe2yQP6OKyzGwMGtdtkhFxb7eW\nZWZj03hvkzQzK1XFIOm822bWM13Ou/1pSUtzIrAfSppaGNe/ebfNzJrpct7ty4A9I+I5wM3AiVCN\nvNtmZg2tZXJbXb1Gebcj4vKIqGVi/S0DSb66mnfbbZJm1jMj+AjQ24Bzcv804OrCuFre7XX0Sd5t\nM7OGmj0CtGbBEh5YsKSjZUr6ELA2Is4eRtGacpA0s55pdnd767nPY+u5z9v4+Y55Z7a1PElHAQcx\nkMIaupx3222SZtYzG5jYVteOfNPl34CDI+KxwqgLgTdImixpNwbybq8EHpA0O9/IORL4Uav1uCZp\nZj3T5bzbJwKTgcvzzevfRMSx3c67rSq9QFxS4GyJFeZsidUmIkKtp2sytxSz4vdtTbtU+wxrXd3k\nmqSZ9UwVf3HjIGlmPeMgaWZWYry/Ks3MrNS4flWamVkrvtw2MyvhIGlmVuLxtc5xY2bW1Ib11Qs5\n1SuxmVXWhvW+3DYza8pB0sysxPp1DpJmZk09saF6Iad6JTaz6vLltplZiceqF3KqV2Izq671o12A\nofObyc2sd9a32TUg6b05Z/b1kt6bh20v6XJJN0u6TNK2hekb5t4eKgdJM+udDoOkpL8H3g68AHgO\n8GpJzwQ+AFweETOBn+fPzXJvdxTvHCTNrHfWtdltag/gtxHxWERsAH4JvA74J+CMPM0ZDOTRbpR7\ne99OiuwgaWa9s6HNblPXA3Py5fWWpAyJTwOeHBGr8jSrgCfn/mkMzrFdy709ZL5xY2a90+zGzeIF\nsGRB09ki4iZJpwCXAQ8DS6gLpxERKQ9W88UMqayZg6SZ9c5jTYbPmpu6mm/P22SSiJgPzAeQ9AlS\n7XCVpKdExEpJuwB/y5M3yr3dMsd2I77cNrPeGd7d7Z3z312B1wJnk3JsvyVP8hYG8mg3zL3dSZFd\nkzSz3hnec5LnS9qBdGvn2IhYI+k/gfMkHQ0sA/4FoEXu7SFx3m3rIefdrrbh593mB23Gm9cNb13d\n5JqkmfVO48d7+pqDpJn1TuPHe/qag6SZ9U4Ff7vtIGlmvdPsEaA+5iBpZr1TwZpkXz0nKWm+pFWS\nrhvtspjZCBjGc5Kjpa+CJPAt0hs7zGwsqmCQ7KvL7YhYKGnGaJfDzEaIHwEyMyvhR4B64YeF/lm5\nM7PuW5C7LvLd7V547WgXwGycmJu7mk3fzDNkfdbe2I4KBkkzq6wKtkn21d1tSecAvwZmSlou6a2j\nXSYz66LO30w+avqqJhkRh492GcxsBPly28ysRAWDZF9dbpvZGNd5tkQkbSvpfElLJd0oabbzbpvZ\n2PJ4m11jXwAujohZwP8CbsJ5t81sTOnwZ4mSpgJzcjIwImJ9RKzBebfNbEzp/HJ7N+BuSd+S9HtJ\n35C0Fc67bWZjSrPHe+5eAPcsKJtzM2Af4F0RcY2kz5MvrWucd9vMqq/Z3e3t5qau5qZNft1zB3BH\nRFyTP58PnAisdN5tMxs7OmyTjIiVwHJJM/OgA4AbgItw3m0zGzOG97PEdwPflTQZ+DPwVmAizrs9\nwHm3q855t6utC3m357QZbxY677aZjUcV/MWNg6SZ9U4F3wLkIGlmvdNnb/hph4OkmfWOL7fNzEo4\nSJqZlXCbpJlZieZv+OlbDpJm1ju+3DYzK+HLbTOzEn4EyMyshC+3zcxKOEiamZVwm6SZWYkK1iT9\n0l0zsxIOkmbW9yRtIem3kpbknNufysOdd9vMLCIeA/aPiOeScm7vL+klOO+2mY0tneeUjYhHcu9k\nUtqG1TjvtpmNLR1mAgMkTZC0hJRf+4qIuAHn3TazsaXZM0ALgatK54yIJ4DnSpoKXCpp/7rxzrtt\nZlX3aJPhz89dzX82XUJErJH0U+B5wCrn3TazMaSzNklJO9buXEuaArwcWEzKr+2822Y2VnT8NPku\nwBn5DvUE4KyI+LmkxTjv9gDn3a46592uti7k3ebmNqee6bzbZjYeVe93iQ6SZtZD1XvDhYOkmfVQ\ns7vb/ctB0sx6yJfbZmYlfLltZlbCNUkzsxKuSZqZlXBN0syshGuSZmYl/AiQmVkJ1yTNzEq4TdLM\nrET1apJ+n2RfWTraBbBhWTDaBaiAztM3jBYHyb7iIFltC0a7ABXQeSKw0eLLbTProf6qJbbDQdLM\neqh6jwBV8M3kZjZahv9m8t6sq5sqFSTNzHrNN27MzEo4SJqZlXCQNDMr4SBpZlbCQdIGkbRB0mJJ\n10k6T9KUYSzr25Jel/u/IWlWybQvk/SiDtaxTNL2nZbRrBUHSav3SETsHRF7AWuBfy2OlDSUZ2sj\nd0TE/4mIsp8U7Q+8eKiFrS3fbKQ4SFqZhcCzci1voaQfA9dLmiDp05IWSfqDpGMAlHxZ0k2SLgd2\nri1I0gJJz8v9B0r6naQlki6XNB14B/C+XIvdT9JOks7P61gk6cV53h0kXSbpeknfAPriWTobu/yL\nG2so1xgPAi7Og/YG9oyI23JQvD8i9pW0OXCVpMuAfYCZwCzgKcCNwOl5/gBC0k7A14E5eVnbRsT9\nkv4beDAiTs3rPxv4XET8StKuwM+AZwMnAVdGxMclHQQcPeI7w8Y1B0mrN0XS4tx/JTAf2A9YFBG3\n5eGvAPaSdGj+/CRgd2AOcHakXyiskPSLumULeCEpyN0GEBH3142vOQCYJW0ctI2krfI6DsnzXixp\n9bC21qwFB0mr92hE7F0ckAPVw3XTvSsiLq+b7iBaX/6224YoYHZErG1QFl9iW8+4TdI6cSlwbO0m\njqSZkrYk1TwPy22Wu5BuxhQFcDXwUkkz8ry1O9MPAtsUpr0MeE/tg6Tn5N4rgSPysFcB23Vvs8w2\n5SBp9RrV9KJu+DdJ7Y2/l3QdcBowMSIuAG7J484Afr3JgiLuAY4BfihpCXBOHnURcEjtxg0pQD4/\n3xi6gXRjB2AeKcheT7rsvg2zEeQXXJiZlXBN0syshIOkmVkJB0kzsxIOkmZmJRwkzcxKOEiamZVw\nkDQzK/H/ASljNTZK+WWcAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d212790>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2769 81]\n",
" [ 381 102]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d38d7d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import confusion_matrix\n",
"from sklearn.metrics import precision_score\n",
"from sklearn.metrics import recall_score\n",
"\n",
"def draw_confusion_matrices(confusion_matricies,class_names):\n",
" class_names = class_names.tolist()\n",
" for cm in confusion_matrices:\n",
" classifier, cm = cm[0], cm[1]\n",
" print(cm)\n",
" \n",
" fig = plt.figure()\n",
" ax = fig.add_subplot(111)\n",
" cax = ax.matshow(cm)\n",
" plt.title('Confusion matrix for %s' % classifier)\n",
" fig.colorbar(cax)\n",
" ax.set_xticklabels([''] + class_names)\n",
" ax.set_yticklabels([''] + class_names)\n",
" plt.xlabel('Predicted')\n",
" plt.ylabel('True')\n",
" plt.show()\n",
" \n",
"y = np.array(y)\n",
"class_names = np.unique(y)\n",
"\n",
"confusion_matrices = [\n",
" ( \"Support Vector Machines\", confusion_matrix(y,run_cv(X,y,SVC)) ),\n",
" ( \"Random Forest\", confusion_matrix(y,run_cv(X,y,RF)) ),\n",
" ( \"K-Nearest-Neighbors\", confusion_matrix(y,run_cv(X,y,KNN)) ),\n",
" ( \"Gradient Boosting Classifier\", confusion_matrix(y,run_cv(X,y,GBC)) ),\n",
" ( \"Logisitic Regression\", confusion_matrix(y,run_cv(X,y,LR)) )\n",
"]\n",
"\n",
"# Pyplot code not included to reduce clutter\n",
"# from churn_display import draw_confusion_matrices\n",
"%matplotlib inline\n",
"\n",
"draw_confusion_matrices(confusion_matrices,class_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An important question to ask might be, When an individual churns, how often does my classifier predict that correctly? This measurement is called \"recall\" and a quick look at these diagrams can demonstrate that random forest is clearly best for this criteria. Out of all the churn cases (outcome \"1\") random forest correctly retrieved 330 out of 482. This translates to a churn \"recall\" of about 68% (330/482≈2/3), far better than support vector machines (≈50%) or k-nearest-neighbors (≈35%).\n",
"\n",
"Another question of importance is \"precision\" or, When a classifier predicts an individual will churn, how often does that individual actually churn? The differences in sematic are small from the previous question, but it makes quite a different. Random forest again out preforms the other two at about 93% precision (330 out of 356) with support vector machines a little behind at about 87% (235 out of 269). K-nearest-neighbors lags at about 80%.\n",
"\n",
"While, just like accuracy, precision and recall still rank random forest above SVC and KNN, this won't always be true. When different measurements do return a different pecking order, understanding the values and tradeoffs of each rating should effect how you proceed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ROC Plots & AUC\n",
"\n",
"Another important metric to consider is ROC plots. We'll cover the majority of these concepts in lecture, but if you're itching for more, one of the best resources out there is this [academic paper](https://cours.etsmtl.ca/sys828/REFS/A1/Fawcett_PRL2006.pdf). \n",
"\n",
"Simply put, the area under the curve (AUC) of a receiver operating characteristic (ROC) curve is a way to reduce ROC performance to a single value representing expected performance.\n",
"To explain with a little more detail, a ROC curve plots the true positives (sensitivity) vs. false positives (1 − specificity), for a binary classifier system as its discrimination threshold is varied. Since a random method describes a horizontal curve through the unit interval, it has an AUC of .5. Minimally, classifiers should perform better than this, and the extent to which they score higher than one another (meaning the area under the ROC curve is larger), they have better expected performance. "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Support vector machines:\n"
]
},
{
"data": {
"image/png": "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\n/wTICsX8iw7QAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c334610>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Random forests:\n"
]
},
{
"data": {
"image/png": "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\n/iAIggHj/wHSDCwebMwj3gAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d933b50>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"K-nearest-neighbors:\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEZCAYAAACQK04eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4HNW1wH9n1WV12XLv3bhhXMC0pYUSSoBgAwk1ZCEk\nBEINPAgmQPIghAeBkHgJvdfQSwho6c0G3HuTZUuyLMnqbbXn/XFH9lpWWdtarcr9fd98uzNz5865\nM7tn7px77jmiqlgsFoul5+CKtAAWi8Vi6Vis4rdYLJYehlX8FovF0sOwit9isVh6GFbxWywWSw/D\nKn6LxWLpYVjFbwkZEVkqIkdEWo5IIyL/EJGbO/icj4vI7R15znAhIj8Tkff38Vj7G2wHxPrxd01E\nZCOQBTQAlcAHwK9VtSyScnU3RORC4BeqeniE5XgM2Kyqf4iwHPOAkap6Xgec63FMm28J97l6GrbH\n33VR4GRVTQamAJOADu2FtgciEt0Tzx1JRCSqJ57bsgur+LsBqloA/Ac4oHGbiBwsIl+ISImI/CAi\nRwbtyxCRx0Rki4gUi8i/g/ad7JQvEZHPRWRS0L6NInK0iAwQkSoRSQ/ad6CIFDb+sUXkYhFZ7tT/\nnogMCSobEJHLRWQNsKq5NonIqSKyzJEjW0TGNZHj987+YhF5VETi9qIN14vIYqBcRKKcutaKSJlT\n50+csuOBfwCHiEi5iBQ723eaXUTELSK5InK1iBSIyFbnLaHxfJki8qaIlIrINyJyh4h82tK9FJHD\ngu5bjoicH7Q7Q0TecuT8SkRGBB13v1O+VEQWiMhhQfvmicjLIvKUiJQCF4jIDBH50jnPVhF5QERi\ngo45QEQ+EJEiEckXkRtF5HjgRmCucz2+d8qmisgjTj25InK7iLicfRc69+BeEdkOzHO2fersFxH5\nP+falYrIYufcHuBc4HrnXK8H3b9jnO9RInJT0L1bICKDWrq2liBU1S5dcAE2AMc43wcBi4E/OOsD\nge3ACc76sc56prP+NvAckApEA4c72w8ECoAZgADnO+eJCTrn0c73D4FLguT5C/CQ8/00YA0wFtO5\n+B/g86CyAeB9IA2Ia6ZtY4AK4BggCrjOqS/a2b/Rae9AIB34DLg9xDZsBL5zjo1ztv0U6Od8n+Oc\nu6+zfgHwaRP5HgP+6Hx3A/XAPEfWEzGmt1Rn//PAs0A8MB7IAT5p4Z4OBcqAuU5dGcAUZ9/jzj2c\n7ux7Gngu6NifOdfCBVwN5AGxzr55QB1wqrMeD0wDZjrlhwLLgSud/cnO8b8DYoEkYKaz71bgySZy\n/xvzgEwA+gBfAx5n34XO9fm1c654Z9unzv7jgQVAirM+Nuhe7LzOTX73jb/B65zfwWhnfRKQEen/\nZldYIi6AXfbxxhkFVu4oioDz53M5+25o5s/5HkYJ9seMC6Q2U+c/mvmjrWTXgyH4T/cL4EPnuzgK\n7TBn/V3g4qA6XBhlONhZDwDuVtp2C/B80LoAucARQXJ4gvafCKzdizZc2Ma1/T5ISe5UUkH7H2PX\ng8YNVDVee2dbAUapRmEU7uigfbc3rS9o343AKy3sewzwNmnzilbaUAxMcr7PA3xttPkq4FXn+znA\nwhbKzQOeClrvC9QA8UHbzgE+Crp+m5rUsfOaAkdj3vpmBV/Dptc5aFvwb3AVcEqk/oNdebGmnq6L\nAqepagpG+RyN6Q2C6cGd5bzGl4hICXAo0A8YDBSramkzdQ4Frmly3CBgQDNlX8WYQPoBRwABVf0s\nqJ77g+oocrYPDDp+cytt6495kJiGmn/55laOzwmSMZQ27HZuETlfRL4PKj8RyGxFvqYUqWogaL0K\n00vug3mjCj5fbiv1DALWt7K/IOh7tXMOAETkWjGmtR1OG1KB3i2dV0TGOGajPMf8cye72jy4DTmC\nGQrEAHlB1++fmLY30uK9VtWPgAeBvwMFIjJfRJJDPPcgYF2IZS1BWMXfDVDVT4AHgLucTTmYXll6\n0JKsqndj/oQZIpLaTFU5wJ1NjktS1ReaOWcJZlxhLsYW+1yTejxN6umlql8FV9FKk7ZiFApg7MAY\nZbQlqMyQJt8b94XShp3nFpGhgBdjishQ1XRgKeYtozU5Q3GHKwT8juyNDG6hLJh7MzKEendDRA7H\nmD3OUtU0pw2l7GoD7CnvPzDmnVGqmooxxzXqgxxgBM0TaLK+GajFmBEbr3eqqk4KKtPqtVLVB1R1\nOjABY+a7LpTjnHOPaqOMpRms4u8+3AfMFJFZGPvvKSLyI2cALN4ZhByoqnkYU8xDIpImIjGyyy/6\nYeAyEZnpDLr1EpEfi0hSC+d8FmMDP9P53sg/gZtEZALsHPw7ay/a8iLwYzEDyTHANRhzwhfOfgEu\nF5GBIpKBUVqNin1v29ALo2C2Ay4RuQjT42+kABgUPPDpnD9YqTaLqjZg3ozmiUiCmAHq82hZoT0D\nHCsiZ4lItJiB4SlB52yJZMwDZruIxIrIH4CUNsRLwpgKqxy5fhW0722gv4hcKSJxIpIsIjOdfQXA\nMOdhjPN7+g9wr1POJSIjJURfexGZLiKznOtbhbnPDUHnaukBBPAv4HYRGeXc68nO78HSBlbxdxNU\ndTvwBHCDquZiBlhvArZhenDXsOt+n4cZcFuJ+XP91qljIfBLzKt3MWZA9XxaVlRvYHpceaq6JEiW\n1zBvH887ZoQlmEG8nUXaaMtq4OeYt5hC4McYW64/6PhnMQpnnSPnHfvSBlVdDvwV+BLIxyj9z4KK\nfAgsA/JFZFvQ+YPra609v8GYXfIx9+c5jN2/OVk2Aydh7lURZqxhcgvnDD7ve86yGjP2U02QqayF\nY6/FvKmVYd54nm8so6rlwHHAKZhB3tUYcyLAS85nkYgscL6fjxkEXo655i9hzIqtyd24LcU5f7Ej\n+3aMowDAI8AEx4T0KntyL6aT8B/MG87DmMFjSxvYCVyWLoeIbMBMqvoo0rLsLSJyF5ClqhdFWhZL\nz8X2+C2WMCIiYx0ThDjmkosxHlgWS8TokTMXLZYOJBlj3hmAMavdo6pvRFYkS0/HmnosFoulh2FN\nPRaLxdLD6BKmHhGxryUWi8WyD6jqHq7AXULxQ/PCh4KIzFPVee0sTqfGtrlnYNvcM9ifNrfUabam\nHovFYulhWMVvsVgsPYyeoPh9kRYgAvgiLUAE8EVagAjgi7QAEcAXaQEigK+9KwyrO6eIPIqZbr+t\nSdCm4DJ/w4SYrcKEy/2+mTK6rzZ+i8Vi6am0pDvD3eN/DDihpZ0ichImOuBowIOJGGixWCyWMBJW\nxa+qnwIlrRQ5FRO4ClX9GkgTkb7hlMlisVh6OpG28Q9kzyQVNmemxWKxhJHO4Mff1P5kJ2tZLJYe\ngYjEYUKbj3PFJE9N6dX71CRX7NDzJ17tyohP7JUs8a5vK3/o+/Cnd2xrq669IdKKfwu7ZyQaxO5Z\nlnYiIvOCVn2q6gufWBaLxdL+yG/XxA4sLjtubPWG8/qVbZstyGB1+rqB+nJ27CinMiqGrLEEYidW\nypbFhavq18Y1m7+h2fpF3OzKndByuXAHaRORYcCbzXn1OIO7v1HVk0TkYOA+VT24mXLWq8disXR6\nRGQ4rujxZI49OsEV746uKx1TX1mYdMUsb2BAaWpU//xY0kugJLOaitQdevW6X0mUy+VPjIkt9NdX\n+EYeNGXN3LPP/llsbOxKl8vl8Xg8W/dTnmZ1Z1h7/CLyHHAk0FtENgO3YhIzo6rzVfUdETlJRNYC\nlYBNTmGxWDo1IpLIlCm1/Oj5Yb0qOGZExY7j+9ftmDaksr5fUmxGfEVdMRQuozromIQt2XUJ8YEN\nDUkr302J+u7JH+VVLCNPGy6Rn0U3Zpbzer2nYLKOXQs85fF4wtYr7xJhmW2P32KxRAIZetAJxPc5\nI7a+fmZsVdHwhvK8pOqqQtevJ/2TWSWj6JcP5SnVBBK3ozF5gb9ue9hfUl9UnUjNygZ/bfaGAB9X\nmJSUuaraNFH9bni93hQgaX97+bvJ34LutIrfYrH0WEQkmkHjDuDoP4129Rs7ZUhF7cGDairGD6iq\n6z1oB3FvfXo9qyu/2+2YKFzcmjJjx49iKr+JdW3477iSyg8T/KxAtbqF00SMiJh6LBaLpTMgj38T\nw5qkmXzz9IXRBcsPiyvdNkhLtyS6XNGuQO5KfvnOt5xZmkJtQi11iYWkNuRoeu3q+oa6wsq+MfEV\nydQsiq/n423w388ILL2l9Kv6/ZHH6/XGeDye/apjf7CK32KxdAtk3jwX3/mPpqLmNIZNGZjVd+LQ\nwVW1QwdW1qT+ulijh2wow7dyJe/WvI4/6LiBxDO49PGiYYkPfpnmL/+kbz7fAMtQ3T69nWX0er2x\nwP8AhwNHt3P1IWMVv8Vi6TKIzyd8nzaUotgjiNJZrlXvHha/6L1RUrw5Ibp4s/j9xtoyJ/oczo/p\nQ0VKPgma0zCsbFV9Vt166RO9tjgjRkr6Nuh3/QN8OhY+OIWaddRtDbvN2+v1TgUex0xU/Xm4z9ca\n1sZvsVg6HfLIt735asOJbN9wAlV5k+N7D8wcMeLQ1MFV9QmDN6kM3eDXoVsCurDwXdf9gft2HpdG\nLOOI5qQoLbk0rvrz1Fq+iWtgEbAU2EgbA6zhIKiX/ys6wGMnGGvjt1gsnQp57fNeLE05BL/rUGID\nUyShfkz6qq+G1L07Pzl22ybqakp3lj1QZvObzL6qMRu0T83G6kE1m3RAzca4cVG5BalC0fAGvp0M\nn06j7iuoW4tfI2Y/b4aTgIOAqe3psbM/WMVvsVjChvh8sSxMm0r+jmPYvvpwKjePiyrNyUqNSUw4\navLZriEriwPDNvkDQ/L8DNgeHfVddLn+T/ViAOKJYpgrrmFyoEFm8kX5aaVffJNYz3dieu9LgZUz\n6rVmRkRbGBKvA693VC8/FKypx2Kx7Bfi80WxJmk0+fFH4NIZxDdMIKl+aJqrLjNrzdr4zQ/dQHVl\nwW7H9HX1Zd7A3wRiXJvr+tblVg2v2BgYVrmxVzVVVf+B3IkBvj0AvooyCn45quWRaV3XxvrxWyyW\nfUZ8PiE/bhDrkw6nruYQdqybTsWG4VK2KT1hy8bY+MIaThh/Z/2wnLr6oQV1MrDYFQsNrE1d4b9q\n29VxUbjIio7zj0b90xtqZZJq4OfCwmhlCbt68MtQLYpwU/cZx5Y/zePxfBVpWRqxit9isbSJvPNp\nBitSZlPrmk1MYDK9GkaRUt+vV3xN8uD1LtfA7+vrs184Piag/t2PQ7h5wi8bMrSwdHB1TvmYsg2B\n4WXFKQkNJCxT1oyF7+LYTcnn0xWUT4gEeeysAs7uLGYdO7hrsVgAEJ8vieUp0yiNOYyowIFUbZpI\n2boBlG9Iil+X44pZs1nrC3P41ahnSsYU4Rqwg7i4etH8tLyKTVnro7+Ojo2JIrphQJTUTtC6mln+\nhqhpDZpw6HLv8nhYxi7lvhTImRwBT5qOIpIeO/uD7fFbLN0Q8fni2Jh4AAXxhyE6najK8aTKIHoH\nMmOi/DGDvo8PDF/pqh65IVD1wrc/zixrKNojKdOcycfWjIurLhhVsXHH5O1bA8NLNSO5jr41sCFh\nTwW/Dm3yGtDN8Xq9BwDPYPzy9zuSZjiwPX6LpZshPl80xTEj2NDrUAIyi9jABHr5h1G0KIu8VXGx\nS7YQt3ZToGHbBq2qyY+6Pu1vBYfUjK5Kqo1OKk7eVLmpzyZd229NenpGjL9XdaJ/UFRd+YF+f83h\ntUQf4idz2OL/5kXtrtyXAqsSVGsj2/JOgx+4ly7Syw/G9vgtlk6M+HxCrWsAq5JnU+s6mBidRFzt\nCGo39WNIYqKrJkMGLIutHbHaVT5mQ6B8dF5t/RMFvx6yvGFR/G71IMw4cHzJ9IzaDZOLc0pm5tVH\njyghI6WWYQLl7KngV6BaEYEmW9oRO7hrsXRSxOcTIJM1SQdRGnMoUTqVRP8okv39yaxL4etFEv3J\nIk1Yu96vhRuortoS00C9/DrqqpLTAycnVcRXVOdm5tau7bc2bl3fdQnLN31XXrut0D+SupJDa6g+\nvoroGX76J5jTNVXwy1AtiVjjLWHFKn6LJcKIz5fC1vhJFMQfCkwjvmEsSfWDkPx0cja5qB0QyKoc\nXT5qrZSM39BQOmFrfc2Q8orEp+r+NuYNfWO3HnxcfJxmTUzLmzGsfNGROVWVh+UQM6qYjOQ6Rgok\ns6cNfimwrTt50nQUjsfO2cCNXc6kY238Fkv4EZ8vgZKYsWxOnE2DzCA2MJ4k/xDS6zKJdcVQHUXU\n4q+rErJfU1fheld19ea4eq2OApjDHL0w5sKo/PT8+PVZ6xO/mrYq5aXem+s2bl+zceBamFrP9uMr\nqPxJOTGDamqHy4KCfiygH0apf8suBb/ZKvj9pxmPnW6D7fFbLHuJ+HzR1Msw1iYdQq3rYKL1AHr5\nh5Na3wdK4llUACty6xMr0nZM5JjcKev9JZO31tUOq6hOjHXVjXy/4b0B93JvVGN90THRxKTG1Mto\n3ThjbM2XJ6+i5ugNRI/bTu9EP2OAYcB69uzBr0e1IQKXoNvTJJJmp/TYCQVr6rFY9gLx+VzAQDYm\nHkRpzCFE6WQSGkaRUt+XtPokimJha0K9qzBme5+vvi6v+eaePrXVuYk1Wr7TJDOTmQ1XpV2Vv6nP\nJv/q/qsT1/Rfk7YlY8vW3LrNa3t/6485vJqCn5dQfkwxvRIDjAPGAFvZU8GvRrUuEtehJ+L1eo/D\nuGl2Gb/8lrCK32JpgjOo2of8uMkUxs1GOJD4htEk+QeQUZdKUUBYVBhg9cbKmHWrqjJKtOx0uWrh\njK3VtYP8NWlR4h8jyKiFUQurr/dfnwoQ5YoiJjVGA+mB8roBdWunTMQ3Zyk1J68mZvx2smICjAcm\nADto3pOmKlLXw2Lwer3xQEZX7eUHYxW/pcciPl8qZdHjyU2YTUCmExsYS5J/MOl1GfhdwuYEoTCu\njKKYrQNzXJtHLFpQ9d3GXx9dSUlKcD19pE/DLYNuWb+m/5roVQNWpW/I2hCbm5m7ojpQvar3F/CT\nUnJ/s5WaiUVkRSkHABOBBnYPVdAYdGxHh18IS4/DKn5Lt0Z8vgRqXaPZnDCL2qiZRAcm0KthGKn1\nvYkJxJATCyuLqlm9rtS1cXlFUu4KEiqK9L6Gh1/Pora/oOMUHeeP8tfn9Mop+WXZL0cIQmxSrNIb\nf21GbQEprB04jfc8C6meu5S4MUUMEKPcJwKJNHWThKWobovgZbG0gdfrjfN4PN12QppV/JYuj/h8\nMcBwNiccRHnMLFw6iUT/CFL8fUn0x5OXAHnxdRTFFlISu6HPZtfaI5bX5h2Sm1t3A8ff0kBDVNM6\nr51w7Yp1Q9clrh6wuu/mzM3FZYlly4AVKYspu2wbmy9bSvTwHQxhl4LvA6ygqYKHXOtJ03UI8tg5\nATi4K9vxW8MqfkuXwBlUHcz22MkUxh2CMIX4BjOZKaU+ie1xSm5CgA3FO1i3pkg2Li5N2rKY6MqN\nqbUU93uGp/+dRtpIRccFJJBQllhWkJuRW/n7/N+P90f5Xa5Ml9T2qS3XFM0hheW9RvPRlYso/c03\nxPevYAS7FPwQYC17KvgN1pOma9NdPHZCwSp+S6fBGVTtS0XUePISDqFBphEbGEOyfxCpdamUxyib\nE4Q8KWVHQi47Elen5UQvOWVxVd7xVYWuAdQMOJMzri6hpFfTuk848IS1RROKeq3vtz69KKloLcIK\nYEV0OWuuWUTxDZ+RkF7DWHYp+NHAZvZU8GusJ033oqtG0twf7AQuS4cjPl86dTKGLQmzqHNNJ1rH\n08s/hDRXBnUuYXOii4K4Copj81n5fQFrPtmUtHWhxPpz+9ZTOriCiqy/8JdV05g2AzipKrZqa0FW\nQel/+63zx+XH+eM1vr6+X700pDfkk8JqMvj+PwPf+/x3C9nue5GkxHomYJT7ScB4oIhdCv494B5g\npfWk6TEcDkyjE+W+jRS2x2/ZL8Tn64VfRrEt7iDKo2cSpRNJbBhGan0fXBpNbiJsja+jKKaADVu2\nUpa+OCln+Oc/21hUfApbE3vRMAoYdyVXnrqYxWlN6x8/fXxu6ezS5Py0/IaAK7AcY19fASz/7VcU\n/OU/pMcGdnrQNC417N57b/SkKW1av6Vn4fV6pbv38oOxph7LPiM+XywwgqLYyRTHzkJ0MvGBEaTU\n9yO+IYG8hAC5CQGK4rZTFLuJotjlLHyqKDH/ucwECob5qR5VSeUAP/7oK7ky/zROS/dH+fOKkooK\nN2ZtrFkxcEX0f3f8d8S2mm2Z/t7+alLZSDpL6M/X9GKRZwGb//42faN1N+U+EYhlTwW/DNXCSF0r\ni6UzYRW/pVXE54sChlAZNYFt8bNo4EBiA6NI9g8gyZ9EYZySmygUxpWwPXozuds3sOqzvKi8qC+v\n9Z+w4kfk93HBOIxJZdyDPDj9FV5JDD5HbExsfcr0lJLSY0pT6qPrt7Cr974CWH7Rd2x89A0Gwh4K\nPgNYzp6Bx7ZaTxpLUxxb/myPx+OLsCgRxyp+S+Ogan/MgOYYYAzKaMqiDyaxoQ+lMQE2J0ZREFdO\ncdxWtseuJi/hB1Ykf5VaemZGNF/9NEDDhCqqBtdSmwBwFmf5L+Oy/PKE8q25mbllKweu1CVDliT9\nUPfDiNJtpZmkU0Aaq8hiIWl8B6y4dAEb/vkWg9lTwQ8C1rDnjNaNdOP0fZb2I8hjZz1wZk8y6zSH\nVfw9HPH5LgX+grF/rwZWUx69mX8NP5E1SXEUxd3BtuwNGdxS9Qr3ZGF67zuXd3hnwF/4S0xjfdGu\naH90SnSNf6o/4Hf7o4CVBPXegRUXfs/Gx15vVsGPBHLYU8GvRbW+I66HpXvREz12QsF69fRQnF7+\nHcAcYIa63asARJgEvAq8D1nPQOGlwJyBTKqsj6ovzEvL27S6/+q6xUMX65IhSwo3RW1KZS2xpLGe\n3izyZ/i/87v8y4EVZy1j84sv7WaiOR24BfPQKGSXYn8L+F+MJ01Nx14JS3fF6/WOA57H+OX3eI+d\nUAir4heRE4D7gCjgX6p6V5P9vYGngX6OLPeo6uPhlKkn4QzKPgyMBWar210IIMK5wP3w8e3gngV8\n0XhMaa9SOf6q4wMao1sxE5h2edL0ZpvOow+7FPwZzucBQBW7FPwnwEMYT5ryjmmtpQdTAfwVeNr2\n8kMjbKYeEYkCVgHHAlswiSLOUdUVQWXmAXGqeqPzEFgF9FVVf5O6rKlnLxGfLwV4BagGzla3u0qE\nWIzv+kmwbi6MehvoK0jdqa5Tte7guoZ3f/TuncBfdB69YA83yQMwD+jm0vcVdXQbLRZL60TC1DMT\nWKuqGx0BngdOw/QeG8kDJjvfU4CipkrfsveIzzcAeAfTk/+tut1+EQYALwHFwHTVkTtEuK9/TN9z\n7uCPBxSPfyF/7tKP3h/8BUdg7KTp7O5F84bzmW89aSyWrk04Ff9AzFT4RnKBWU3KPAx8JCJbMXlC\n54RRnh6B+HwTMEr/n8Bd6narCEcCz2HML39SJSC3SZx3qOes8TnHTh4Ue9u2IYuX+VzGo+bfGAWf\nYz1pLJ0Jr9d7IHAJcIXH47G/zf0gnIo/lF7hTcAPquoWkZHAByIyRZuxCztmoUZ8quprHzG7D+Lz\nHYHp1V+jbvfTIojA1bDtBsg6X5X3AfpfnXDUy89c+U7/wqlx1X3+5hlWsPThyEpusbRME4+dawhN\nt/RIRMQNuNsqF07FvwUYHLQ+GNPrD2Y2cCeAqq4TkQ2YgcgFTStT1XnhEbN7ID7fHOBB4Bx1uz8U\nIRl4BJ6YBhclgGbKbaQctDnp7y88c8u5MfUpVVnyzsSRBZ+ui7DoFkuLOL38xzHuv9Zjpw2cDrGv\ncV1Ebm2unCuMMiwARovIMBGJBeZi7MTBrMQM/iIifTFKf30YZeqWiM93Ncar4ThH6Y+D+q9h7ji4\ncCRoMpn84qwfMtf//dG/nptQ22tJfEND75ENL1qlb+m0eL3ew4H3MQ4Jp1ql336Ercevqn4R+Q3m\nxkUBj6jqChG51Nk/H/gT8JiILMI8hK5X1eJwydTdcMIs/BU4DjhU3e4cEc6E/PkwqxByJgF+OYSl\n91UNnz79tT8nRVP0eDlTLnGr274uWzo7XwJTPB5PXqQF6W7YmbtdFPH54jFzIHoDp3OUuxzzIJ0D\n6dthx0FEU5Z+Ovrh+7NqKsr+JyOWHVfO0vP+EVHBLRZLh9GS7gynqccSJsTnywA+APzA8RzljnXW\npwLTmbrjFgZSfOTJbP/h5ZOlouwPSUr08VbpWzorXq83se1SlvbC9vi7GOLzDQPexYQ/uIGj3DMx\nnjxPcOIVf2TWg1e4Atz4zMvyzYzlvzxiCz8pC5BwlFtNqAaLpTMR5LFzBsasY9002xEbq6cbID7f\ngRiFfxdHuR/AuLfNA37BPMkBPu9XTtXyB2KX5tbNm7GFaasCxJ3gVreNT2/pdDTx2DneKv2Ow/b4\nuwji8x2PselfxlHud4F/wuuHEXX5h9yytRC45Ndf4/3ru6kX/MADVDPwa3Cd51Z3dWQlt1h2pxm/\nfBtjJ0zYHn8XRny+CzFRLX/CUe58CHwJVzbAg0Np4BK+57OcbB7MLBt05Tf8s6aBXk8DN7rVbXtQ\nls7IgZjxKOuXHyFsj78T44RUvhm4GDiRo9yjYMdjuGblE1g9EaDXAF4r2YpWMG3cIu7uDVG3uNU9\nP6KCWyyWToH16uliiM8XDcwHTmd77KEc5T4XVnuJ7asEVk8kmrqT4rmpYiuT8zg7YRH39IaoC6zS\nt1gsbWFNPZ0Q8fl6AS8A0dw/+nReG/goaRtSuHDqYh6vOxpY/1YdT5zk5+rF3PV+MTOPAI5zq3tR\nZCW3WHbh2PKP8Xg870ZaFsvu2B5/J0N8vr6YWBvbOGP2rbzW38dx18GVI0aRVr1gFhxcXMeCE4k6\n8wte+W8xMycCs63St3QmHI+db4HLvF5vVKTlseyO7fF3IsTnG4Px0X+Ko4/MIWPVu1xz9FaS8zKB\n43QeAeClOlK/+oRX8iEqDTjcrW6b5crSKbAeO10Dq/g7CeLzHQz8m6qoeZw2fTrTfvlbfvSYEBd4\nBPibzuN1f32JAAAgAElEQVR84O4SptyxiPsuwsQxucKtbpu4xtIp8Hq9YzCTCW0kzU6OVfydAPH5\nTgP+xdKU67i74noOGzyUT4oSWM7LedXM7wf/Amat5reXbuX0+4G/AffYQGuWTkYRcDfwrO3ld26s\nO2eEEZ/vcuBmnki7my0P30n+/BiWNMQADIBnNsGUaPjhC158tY4+84HL3ep+ObJSWyyWrsB+T+AS\nkURVrWpfsXou4vO5gD+hnM4Daz4j/bZ7WFhQSXFDIlBzITz2GJwF3Ojjw2hwPQSc5lb3lxEV3GKx\ndHna7PGLyGyMqSFZVQeLyFTAo6qXd4SAjgzdqscvPl8s8Cj1DeN5ztuXzI/78HjZ52yvPkpg01vw\n7UkwtYG4OZ/y3jmYJPUnudVtE6dYIo7jsXMV8AuPx2PHmDox+9Pjvw84AXgdQFV/EJEj21m+HoP4\nfKmovsqOwiy+umY8NVOXsWXmZLa/WdcXHloMU7KAPE48bBXXPwj0BQ5xq9smqLFElGY8dhoiK5Fl\nXwnJ1KOqOSK7PTTsU34fEJ9vEIH6D8j9NpNvn8xg4VV36hfXmJyYz8kZmAfs7Z/w7vMB4t/ApKE8\nzq3u2giKbbHY3LfdjFAUf46IHArg5M79LbAirFJ1Q+TD9yehDR+z/qVkXuxdzndvz9LikQsx1/Ru\njDnnZB/ZpcBXwDPArdZzxxJpvF7vdOAdrF9+tyEUxf8r4H5gILAF+A/w63AK1d2Ql28/n9Spj7Dw\nNT93911FyV/L4Z4VCEOBF4EC4CAf2RMxCelvdKv7sYgKbbHsYiEw0ePxbIu0IJb2IZTB3UNV9fO2\ntoWTrjq4K7dJLMMveYp+Pz6LJ7ZW8eyb38N7hwH8GB56C34K/AX4q4/sc4F7gXPd6v4wknJbLJbu\nQUu6MxTF/72qHtjWtnDSFRW//DF6JkPOe52+p/Xm+j7lLD1jE2ybCjRcCtkPwTgXnO0j+wvMgNkl\nwI/d6l4WWcktPRmv15vi8XjKIi2HpX3Ya68eETkEmA30EZGrgcaDk7HB3VpEbpMkJOoORv7WQ9yP\n4MIRq9h2QDr4p7qg8HXIOxkCwDTHnv8oMBE42K3u/MhKb+mpBHnsnOv1eid4PJ76SMtkCR+tKfBY\njJKPcj6TnKUMY6KwNEFuk+NxxS3jgL/NoXQueI56gW0J08H/UQas2AB6sollcqKP7HpMQLYMwG2V\nviVSBEXSnAYcaZV+9ycUU88wVd3YMeK0KEOnNvXIbdIbuJeYNDfjnxZ+GNaHe8dcqeUx8xGJKobb\nesHFcfBzVD/yiW8oxkviA+Aat7qtP7Slw7GRNLs/+zOBq0pE7gEmAAnONlXVo9tTwK6I3CYCnAPc\nS68J7zDyn0l82M/Fv0YcpjVRCxDpCzyTYd6apqGa7xPfdMxkuLvc6v5bJOW39HhGA5Owfvk9jlB6\n/B9gskFdC1wKXAgUqur1YZdulwydrscvt8kQ4B/AEJJu8jLypHt4cFUeH74yV/XtrxE5AngWM+ll\nHqp+n/hOAx4GLnGr+43ISd89ERHbW7X0WJr13tkPr57vVHWaiCxW1cnOtgWqOr3dJG6DzqT45TaJ\nAi4HbgXuw7+whoMq7+KGR5ey+vGJwMqt8EJ/U+YiVN8F8InvSuB6TKC1BRFrQDemM/1OLJaOpEUF\nvx+mnjrnM19ETga2Aun7J2bXRG6TAzA99gYaYg6jcsnNTNt0Dhf9dhk7Vk0G+CXE9jGhF2agutkn\nviiMf/4xmBSJmyLXAktPxLHln+LxeF6JtCyWzkEoPf5TgE+BwcADQAowT1U7zFQR6Z6c3CZxwI3A\nb4BbeGrxk5we8wX9vx/P7y/Jo75qSBRUPgdV
gitextract_0i39_wbo/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── __init__.py
├── analyses/
│ ├── __init__.py
│ ├── churn.ipynb
│ └── churn_measurements.py
├── aws/
│ ├── __init__.py
│ └── aws.ipynb
├── commands/
│ ├── __init__.py
│ ├── linux.ipynb
│ ├── misc.ipynb
│ └── styles/
│ └── custom.css
├── data/
│ ├── churn.csv
│ ├── ozone.csv
│ ├── ozone_copy.csv
│ └── titanic/
│ ├── genderclassmodel.csv
│ ├── genderclassmodel.py
│ ├── gendermodel.csv
│ ├── gendermodel.py
│ ├── myfirstforest.py
│ ├── results-rf.csv
│ ├── test.csv
│ └── train.csv
├── deep-learning/
│ ├── deep-dream/
│ │ └── dream.ipynb
│ ├── keras-tutorial/
│ │ ├── 0. Preamble.ipynb
│ │ ├── 1.1 Introduction - Deep Learning and ANN.ipynb
│ │ ├── 1.2 Introduction - Theano.ipynb
│ │ ├── 1.3 Introduction - Keras.ipynb
│ │ ├── 1.4 (Extra) A Simple Implementation of ANN for MNIST.ipynb
│ │ ├── 2.1 Supervised Learning - ConvNets.ipynb
│ │ ├── 2.2.1 Supervised Learning - ConvNet HandsOn Part I.ipynb
│ │ ├── 2.2.2 Supervised Learning - ConvNet HandsOn Part II.ipynb
│ │ ├── 2.3 Supervised Learning - Famous Models with Keras.ipynb
│ │ ├── 3.1 Unsupervised Learning - AutoEncoders and Embeddings.ipynb
│ │ ├── 3.2 RNN and LSTM.ipynb
│ │ ├── 3.3 (Extra) LSTM for Sentence Generation.ipynb
│ │ ├── 4. Conclusions.ipynb
│ │ ├── LICENSE
│ │ ├── data/
│ │ │ ├── female_blog_list.txt
│ │ │ ├── intro_to_ann.csv
│ │ │ ├── male_blog_list.txt
│ │ │ ├── rt-polarity.neg
│ │ │ └── rt-polarity.pos
│ │ ├── data_helpers.py
│ │ ├── deep-learning-osx.yml
│ │ ├── deep-learning.yml
│ │ ├── deep_learning_models/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── imagenet_utils.py
│ │ │ ├── resnet50.py
│ │ │ ├── vgg16.py
│ │ │ └── vgg19.py
│ │ ├── outline.md
│ │ ├── solutions/
│ │ │ ├── sol_111.py
│ │ │ └── sol_112.py
│ │ └── w2v.py
│ ├── tensor-flow-examples/
│ │ ├── Setup_TensorFlow.md
│ │ ├── input_data.py
│ │ ├── multigpu_basics.py
│ │ └── notebooks/
│ │ ├── 1_intro/
│ │ │ └── basic_operations.ipynb
│ │ ├── 2_basic_classifiers/
│ │ │ ├── linear_regression.ipynb
│ │ │ ├── logistic_regression.ipynb
│ │ │ └── nearest_neighbor.ipynb
│ │ ├── 3_neural_networks/
│ │ │ ├── alexnet.ipynb
│ │ │ ├── convolutional_network.ipynb
│ │ │ ├── multilayer_perceptron.ipynb
│ │ │ └── recurrent_network.ipynb
│ │ ├── 4_multi_gpu/
│ │ │ └── multigpu_basics.ipynb
│ │ └── 5_ui/
│ │ ├── graph_visualization.ipynb
│ │ └── loss_visualization.ipynb
│ ├── tensor-flow-exercises/
│ │ ├── 1_notmnist.ipynb
│ │ ├── 2_fullyconnected.ipynb
│ │ ├── 3_regularization.ipynb
│ │ ├── 4_convolutions.ipynb
│ │ ├── 5_word2vec.ipynb
│ │ ├── 6_lstm.ipynb
│ │ ├── Dockerfile
│ │ └── README.md
│ └── theano-tutorial/
│ ├── intro_theano/
│ │ ├── Makefile
│ │ ├── intro_theano.ipynb
│ │ ├── logistic_regression.ipynb
│ │ └── utils.py
│ ├── rnn_tutorial/
│ │ ├── Makefile
│ │ ├── lstm_text.ipynb
│ │ ├── lstm_text.py
│ │ ├── rnn_precompile.py
│ │ ├── simple_rnn.ipynb
│ │ └── synthetic.py
│ ├── scan_tutorial/
│ │ ├── scan_ex1_solution.py
│ │ ├── scan_ex2_solution.py
│ │ └── scan_tutorial.ipynb
│ └── theano_mlp/
│ └── theano_mlp.ipynb
├── images/
│ └── README.sketch
├── kaggle/
│ ├── __init__.py
│ └── titanic.ipynb
├── mapreduce/
│ ├── __init__.py
│ ├── mapreduce-python.ipynb
│ ├── mr_s3_log_parser.py
│ └── test_mr_s3_log_parser.py
├── matplotlib/
│ ├── 04.00-Introduction-To-Matplotlib.ipynb
│ ├── 04.01-Simple-Line-Plots.ipynb
│ ├── 04.02-Simple-Scatter-Plots.ipynb
│ ├── 04.03-Errorbars.ipynb
│ ├── 04.04-Density-and-Contour-Plots.ipynb
│ ├── 04.05-Histograms-and-Binnings.ipynb
│ ├── 04.06-Customizing-Legends.ipynb
│ ├── 04.07-Customizing-Colorbars.ipynb
│ ├── 04.08-Multiple-Subplots.ipynb
│ ├── 04.09-Text-and-Annotation.ipynb
│ ├── 04.10-Customizing-Ticks.ipynb
│ ├── 04.11-Settings-and-Stylesheets.ipynb
│ ├── 04.12-Three-Dimensional-Plotting.ipynb
│ ├── 04.13-Geographic-Data-With-Basemap.ipynb
│ ├── 04.14-Visualization-With-Seaborn.ipynb
│ ├── 04.15-Further-Resources.ipynb
│ ├── __init__.py
│ ├── matplotlib-applied.ipynb
│ ├── matplotlib.ipynb
│ └── tests/
│ └── __init__.py
├── misc/
│ ├── Algorithmia.ipynb
│ └── regex.ipynb
├── numpy/
│ ├── 02.00-Introduction-to-NumPy.ipynb
│ ├── 02.01-Understanding-Data-Types.ipynb
│ ├── 02.02-The-Basics-Of-NumPy-Arrays.ipynb
│ ├── 02.03-Computation-on-arrays-ufuncs.ipynb
│ ├── 02.04-Computation-on-arrays-aggregates.ipynb
│ ├── 02.05-Computation-on-arrays-broadcasting.ipynb
│ ├── 02.06-Boolean-Arrays-and-Masks.ipynb
│ ├── 02.07-Fancy-Indexing.ipynb
│ ├── 02.08-Sorting.ipynb
│ ├── 02.09-Structured-Data-NumPy.ipynb
│ ├── __init__.py
│ ├── numpy.ipynb
│ └── tests/
│ └── __init__.py
├── pandas/
│ ├── 03.00-Introduction-to-Pandas.ipynb
│ ├── 03.01-Introducing-Pandas-Objects.ipynb
│ ├── 03.02-Data-Indexing-and-Selection.ipynb
│ ├── 03.03-Operations-in-Pandas.ipynb
│ ├── 03.04-Missing-Values.ipynb
│ ├── 03.05-Hierarchical-Indexing.ipynb
│ ├── 03.06-Concat-And-Append.ipynb
│ ├── 03.07-Merge-and-Join.ipynb
│ ├── 03.08-Aggregation-and-Grouping.ipynb
│ ├── 03.09-Pivot-Tables.ipynb
│ ├── 03.10-Working-With-Strings.ipynb
│ ├── 03.11-Working-with-Time-Series.ipynb
│ ├── 03.12-Performance-Eval-and-Query.ipynb
│ ├── 03.13-Further-Resources.ipynb
│ ├── __init__.py
│ ├── pandas.ipynb
│ └── tests/
│ └── __init__.py
├── python-data/
│ ├── __init__.py
│ ├── datetime.ipynb
│ ├── files.ipynb
│ ├── functions.ipynb
│ ├── hello_world.txt
│ ├── logs.ipynb
│ ├── pdb.ipynb
│ ├── structs.ipynb
│ ├── structs_utils.ipynb
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_transform_util.py
│ │ └── test_type_util.py
│ ├── transform_util.py
│ ├── type_util.py
│ └── unit_tests.ipynb
├── scikit-learn/
│ ├── __init__.py
│ ├── fig_code/
│ │ ├── ML_flow_chart.py
│ │ ├── __init__.py
│ │ ├── data.py
│ │ ├── figures.py
│ │ ├── helpers.py
│ │ ├── linear_regression.py
│ │ ├── scikit-learn.ipynb
│ │ ├── sgd_separator.py
│ │ └── svm_gui.py
│ ├── scikit-learn-gmm.ipynb
│ ├── scikit-learn-intro.ipynb
│ ├── scikit-learn-k-means.ipynb
│ ├── scikit-learn-linear-reg.ipynb
│ ├── scikit-learn-pca.ipynb
│ ├── scikit-learn-random-forest.ipynb
│ ├── scikit-learn-svm.ipynb
│ ├── scikit-learn-validation.ipynb
│ └── tests/
│ └── __init__.py
├── scipy/
│ ├── 2002FemPreg.dct
│ ├── __init__.py
│ ├── effect_size.ipynb
│ ├── first.py
│ ├── hypothesis.ipynb
│ ├── nsfg.py
│ ├── sampling.ipynb
│ ├── tests/
│ │ └── __init__.py
│ ├── thinkplot.py
│ └── thinkstats2.py
└── spark/
├── __init__.py
├── hdfs.ipynb
└── spark.ipynb
SYMBOL INDEX (64 symbols across 16 files)
FILE: analyses/churn_measurements.py
function calibration (line 17) | def calibration(prob,outcome,n_bins=10):
function discrimination (line 55) | def discrimination(prob,outcome,n_bins=10):
FILE: deep-learning/keras-tutorial/data_helpers.py
function clean_str (line 9) | def clean_str(string):
function load_data_and_labels (line 30) | def load_data_and_labels():
function pad_sentences (line 51) | def pad_sentences(sentences, padding_word="<PAD/>"):
function build_vocab (line 66) | def build_vocab(sentences):
function build_input_data (line 80) | def build_input_data(sentences, labels, vocabulary):
function load_data (line 89) | def load_data():
function batch_iter (line 102) | def batch_iter(data, batch_size, num_epochs):
FILE: deep-learning/keras-tutorial/deep_learning_models/imagenet_utils.py
function preprocess_input (line 11) | def preprocess_input(x, dim_ordering='default'):
function decode_predictions (line 31) | def decode_predictions(preds):
FILE: deep-learning/keras-tutorial/deep_learning_models/resnet50.py
function identity_block (line 32) | def identity_block(input_tensor, kernel_size, filters, stage, block):
function conv_block (line 67) | def conv_block(input_tensor, kernel_size, filters, stage, block, strides...
function ResNet50 (line 110) | def ResNet50(include_top=True, weights='imagenet',
FILE: deep-learning/keras-tutorial/deep_learning_models/vgg16.py
function VGG16 (line 30) | def VGG16(include_top=True, weights='imagenet',
FILE: deep-learning/keras-tutorial/deep_learning_models/vgg19.py
function VGG19 (line 29) | def VGG19(include_top=True, weights='imagenet',
FILE: deep-learning/keras-tutorial/w2v.py
function train_word2vec (line 6) | def train_word2vec(sentence_matrix, vocabulary_inv,
FILE: deep-learning/tensor-flow-examples/input_data.py
function maybe_download (line 8) | def maybe_download(filename, work_directory):
function _read32 (line 18) | def _read32(bytestream):
function extract_images (line 21) | def extract_images(filename):
function dense_to_one_hot (line 37) | def dense_to_one_hot(labels_dense, num_classes=10):
function extract_labels (line 44) | def extract_labels(filename, one_hot=False):
class DataSet (line 59) | class DataSet(object):
method __init__ (line 60) | def __init__(self, images, labels, fake_data=False):
method images (line 81) | def images(self):
method labels (line 84) | def labels(self):
method num_examples (line 87) | def num_examples(self):
method epochs_completed (line 90) | def epochs_completed(self):
method next_batch (line 92) | def next_batch(self, batch_size, fake_data=False):
function read_data_sets (line 115) | def read_data_sets(train_dir, fake_data=False, one_hot=False):
FILE: deep-learning/tensor-flow-examples/multigpu_basics.py
function matpow (line 33) | def matpow(M, n):
FILE: deep-learning/theano-tutorial/intro_theano/utils.py
function scale_to_unit_interval (line 14) | def scale_to_unit_interval(ndar, eps=1e-8):
function tile_raster_images (line 22) | def tile_raster_images(X, img_shape, tile_shape, tile_spacing=(0, 0),
FILE: deep-learning/theano-tutorial/rnn_tutorial/rnn_precompile.py
class SimpleRNN (line 27) | class SimpleRNN(object):
method __init__ (line 28) | def __init__(self, input_dim, recurrent_dim):
method _step (line 36) | def _step(self, input_t, previous):
method __call__ (line 39) | def __call__(self, x):
function gauss_weight (line 83) | def gauss_weight(rng, ndim_in, ndim_out=None, sd=.005):
function index_dot (line 90) | def index_dot(indices, w):
class LstmLayer (line 94) | class LstmLayer:
method __init__ (line 96) | def __init__(self, rng, input, mask, n_in, n_h):
method _step (line 132) | def _step(self, m_, x_, h_, c_):
function sequence_categorical_crossentropy (line 159) | def sequence_categorical_crossentropy(prediction, targets, mask):
class LogisticRegression (line 169) | class LogisticRegression(object):
method __init__ (line 171) | def __init__(self, rng, input, n_in, n_out):
FILE: deep-learning/theano-tutorial/rnn_tutorial/synthetic.py
function mackey_glass (line 5) | def mackey_glass(sample_len=1000, tau=17, seed=None, n_samples = 1):
function mso (line 46) | def mso(sample_len=1000, n_samples = 1):
function lorentz (line 62) | def lorentz(sample_len=1000, sigma=10, rho=28, beta=8 / 3, step=0.01):
FILE: deep-learning/theano-tutorial/scan_tutorial/scan_ex1_solution.py
function step (line 10) | def step(coeff, power, prior_value, free_var):
FILE: deep-learning/theano-tutorial/scan_tutorial/scan_ex2_solution.py
function sample_from_pvect (line 11) | def sample_from_pvect(pvect):
function set_p_to_zero (line 21) | def set_p_to_zero(pvect, i):
function step (line 32) | def step(p):
FILE: mapreduce/mr_s3_log_parser.py
class MrS3LogParser (line 8) | class MrS3LogParser(MRJob):
method clean_date_time_zone (line 56) | def clean_date_time_zone(self, raw_date_time_zone):
method mapper (line 88) | def mapper(self, _, line):
method reducer (line 121) | def reducer(self, key, values):
method steps (line 129) | def steps(self):
FILE: mapreduce/test_mr_s3_log_parser.py
class MrTestsUtil (line 7) | class MrTestsUtil:
method run_mr_sandbox (line 9) | def run_mr_sandbox(self, mr_job, stdin):
class TestMrS3LogParser (line 26) | class TestMrS3LogParser(unittest.TestCase):
method __init__ (line 56) | def __init__(self, *args, **kwargs):
method test_invalid_log_lines (line 61) | def test_invalid_log_lines(self):
method test_valid_log_lines (line 67) | def test_valid_log_lines(self):
method test_clean_date_time_zone (line 73) | def test_clean_date_time_zone(self):
Copy disabled (too large)
Download .json
Condensed preview — 200 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,075K chars).
[
{
"path": ".gitattributes",
"chars": 33,
"preview": "*.ipynb linguist-language=Python\n"
},
{
"path": ".gitignore",
"chars": 766,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\n"
},
{
"path": "LICENSE",
"chars": 1052,
"preview": "This repository contains a variety of content; some developed by Donne Martin,\nand some from third-parties. The third-p"
},
{
"path": "README.md",
"chars": 43957,
"preview": "<br/>\n<p align=\"center\">\n <img src=\"https://raw.githubusercontent.com/donnemartin/data-science-ipython-notebooks/master"
},
{
"path": "__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "analyses/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "analyses/churn.ipynb",
"chars": 229399,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"##Customer Churn##\\n\",\n \"\\n\",\n "
},
{
"path": "analyses/churn_measurements.py",
"chars": 2795,
"preview": "from __future__ import division\nimport numpy as np\n\n__author__ = \"Eric Chiang\"\n__email__ = \"eric[at]yhathq.com\"\n\n\"\"\"\n\nM"
},
{
"path": "aws/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "aws/aws.ipynb",
"chars": 29813,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"This notebook was prepared by [Donn"
},
{
"path": "commands/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "commands/linux.ipynb",
"chars": 10195,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"This notebook was prepared by [Donn"
},
{
"path": "commands/misc.ipynb",
"chars": 16271,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"This notebook was prepared by [Donn"
},
{
"path": "commands/styles/custom.css",
"chars": 1612,
"preview": "<style>\n @font-face {\n font-family: \"Computer Modern\";\n src: url('http://mirrors.ctan.org/fonts/cm-unic"
},
{
"path": "data/churn.csv",
"chars": 437903,
"preview": "State,Account Length,Area Code,Phone,Int'l Plan,VMail Plan,VMail Message,Day Mins,Day Calls,Day Charge,Eve Mins,Eve Call"
},
{
"path": "data/ozone.csv",
"chars": 2902,
"preview": "\"Ozone\",\"Solar.R\",\"Wind\",\"Temp\",\"Month\",\"Day\"\n41,190,7.4,67,5,1\n36,118,8,72,5,2\n12,149,12.6,74,5,3\n18,313,11.5,62,5,4\nNA"
},
{
"path": "data/ozone_copy.csv",
"chars": 3324,
"preview": "41.0,190.0,7.4,67,5,1\n36.0,118.0,8.0,72,5,2\n12.0,149.0,12.6,74,5,3\n18.0,313.0,11.5,62,5,4\n,,14.3,56,5,5\n28.0,,14.9,66,5,"
},
{
"path": "data/titanic/genderclassmodel.csv",
"chars": 3258,
"preview": "PassengerId,Survived\r\n892,0\r\n893,1\r\n894,0\r\n895,0\r\n896,1\r\n897,0\r\n898,1\r\n899,0\r\n900,1\r\n901,0\r\n902,0\r\n903,0\r\n904,1\r\n905,0\r\n"
},
{
"path": "data/titanic/genderclassmodel.py",
"chars": 5760,
"preview": "\"\"\" Now that the user can read in a file this creates a model which uses the price, class and gender\nAuthor : AstroDave\n"
},
{
"path": "data/titanic/gendermodel.csv",
"chars": 3258,
"preview": "PassengerId,Survived\r\n892,0\r\n893,1\r\n894,0\r\n895,0\r\n896,1\r\n897,0\r\n898,1\r\n899,0\r\n900,1\r\n901,0\r\n902,0\r\n903,0\r\n904,1\r\n905,0\r\n"
},
{
"path": "data/titanic/gendermodel.py",
"chars": 3666,
"preview": "\"\"\" This simple code is desinged to teach a basic user to read in the files in python, simply find what proportion of ma"
},
{
"path": "data/titanic/myfirstforest.py",
"chars": 4081,
"preview": "\"\"\" Writing my first randomforest code.\nAuthor : AstroDave\nDate : 23rd September 2012\nRevised: 15 April 2014\nplease see "
},
{
"path": "data/titanic/results-rf.csv",
"chars": 3675,
"preview": "PassengerId,Survived\n892,0.0\n893,0.0\n894,0.0\n895,1.0\n896,1.0\n897,0.0\n898,0.0\n899,0.0\n900,1.0\n901,0.0\n902,0.0\n903,0.0\n904"
},
{
"path": "data/titanic/test.csv",
"chars": 28629,
"preview": "PassengerId,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked\r\n892,3,\"Kelly, Mr. James\",male,34.5,0,0,330911,7."
},
{
"path": "data/titanic/train.csv",
"chars": 61194,
"preview": "PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked\r\n1,0,3,\"Braund, Mr. Owen Harris\",male,22"
},
{
"path": "deep-learning/deep-dream/dream.ipynb",
"chars": 827311,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"RMhGdYHuOZM8\"\n },\n"
},
{
"path": "deep-learning/keras-tutorial/0. Preamble.ipynb",
"chars": 20553,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/1.1 Introduction - Deep Learning and ANN.ipynb",
"chars": 528901,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/1.2 Introduction - Theano.ipynb",
"chars": 21171,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/1.3 Introduction - Keras.ipynb",
"chars": 19475,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/1.4 (Extra) A Simple Implementation of ANN for MNIST.ipynb",
"chars": 13804,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/2.1 Supervised Learning - ConvNets.ipynb",
"chars": 23033,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/2.2.1 Supervised Learning - ConvNet HandsOn Part I.ipynb",
"chars": 20129,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/2.2.2 Supervised Learning - ConvNet HandsOn Part II.ipynb",
"chars": 37508,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/2.3 Supervised Learning - Famous Models with Keras.ipynb",
"chars": 23381,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/3.1 Unsupervised Learning - AutoEncoders and Embeddings.ipynb",
"chars": 303550,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/3.2 RNN and LSTM.ipynb",
"chars": 18890,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/3.3 (Extra) LSTM for Sentence Generation.ipynb",
"chars": 25946,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/4. Conclusions.ipynb",
"chars": 2335,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"Credits: Forked from [deep-learning"
},
{
"path": "deep-learning/keras-tutorial/LICENSE",
"chars": 1071,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2017 MPBA\n\nPermission is hereby granted, free of charge, to any person obtaining a "
},
{
"path": "deep-learning/keras-tutorial/data/intro_to_ann.csv",
"chars": 13236,
"preview": "Feature1,Feature2,Target\r2.067788388,0.258133225,1\r0.993994008,-0.609144512,1\r-0.690315436,0.749920622,0\r1.023582376,0.5"
},
{
"path": "deep-learning/keras-tutorial/data/rt-polarity.neg",
"chars": 612121,
"preview": "simplistic , silly and tedious . \nit's so laddish and juvenile , only teenage boys could possibly find it funny . \nexplo"
},
{
"path": "deep-learning/keras-tutorial/data/rt-polarity.pos",
"chars": 625987,
"preview": "the rock is destined to be the 21st century's new \" conan \" and that he's going to make a splash even greater than arnol"
},
{
"path": "deep-learning/keras-tutorial/data_helpers.py",
"chars": 4273,
"preview": "import numpy as np\nimport re\nimport itertools\nfrom collections import Counter\n\"\"\"\nOriginal taken from https://github.com"
},
{
"path": "deep-learning/keras-tutorial/deep-learning-osx.yml",
"chars": 3219,
"preview": "name: deep-learning\nchannels:\n- conda-forge\n- defaults\ndependencies:\n- accelerate=2.3.0=np111py35_3\n- accelerate_cudalib"
},
{
"path": "deep-learning/keras-tutorial/deep-learning.yml",
"chars": 3517,
"preview": "name: deep-learning\nchannels:\n- conda-forge\n- defaults\ndependencies:\n- accelerate=2.3.0=np111py35_3\n- accelerate_cudalib"
},
{
"path": "deep-learning/keras-tutorial/deep_learning_models/LICENSE",
"chars": 1073,
"preview": "MIT License\n\nCopyright (c) 2016 François Chollet\n\nPermission is hereby granted, free of charge, to any person obtaining "
},
{
"path": "deep-learning/keras-tutorial/deep_learning_models/README.md",
"chars": 3374,
"preview": "# Trained image classification models for Keras\n\nThis repository contains code for the following Keras models:\n\n- VGG16\n"
},
{
"path": "deep-learning/keras-tutorial/deep_learning_models/imagenet_utils.py",
"chars": 1233,
"preview": "import numpy as np\nimport json\n\nfrom keras.utils.data_utils import get_file\nfrom keras import backend as K\n\nCLASS_INDEX "
},
{
"path": "deep-learning/keras-tutorial/deep_learning_models/resnet50.py",
"chars": 10194,
"preview": "# -*- coding: utf-8 -*-\n'''ResNet50 model for Keras.\n\n# Reference:\n\n- [Deep Residual Learning for Image Recognition](htt"
},
{
"path": "deep-learning/keras-tutorial/deep_learning_models/vgg16.py",
"chars": 7227,
"preview": "# -*- coding: utf-8 -*-\n'''VGG16 model for Keras.\n\n# Reference:\n\n- [Very Deep Convolutional Networks for Large-Scale Ima"
},
{
"path": "deep-learning/keras-tutorial/deep_learning_models/vgg19.py",
"chars": 7444,
"preview": "# -*- coding: utf-8 -*-\n'''VGG19 model for Keras.\n\n# Reference:\n\n- [Very Deep Convolutional Networks for Large-Scale Ima"
},
{
"path": "deep-learning/keras-tutorial/outline.md",
"chars": 2163,
"preview": "# Outline (Draft)\n\n- Part I: Introduction\n\n - Intro to ANN \n - (naive pure-Python implementation from `pybrain"
},
{
"path": "deep-learning/keras-tutorial/solutions/sol_111.py",
"chars": 149,
"preview": "ann = ANN(2, 10, 1)\n%timeit -n 1 -r 1 ann.train(zip(X,y), iterations=2)\nplot_decision_boundary(ann)\nplt.title(\"Our next "
},
{
"path": "deep-learning/keras-tutorial/solutions/sol_112.py",
"chars": 165,
"preview": "ann = ANN(2, 10, 1)\n%timeit -n 1 -r 1 ann.train(zip(X,y), iterations=100)\nplot_decision_boundary(ann)\nplt.title(\"Our mod"
},
{
"path": "deep-learning/keras-tutorial/w2v.py",
"chars": 2550,
"preview": "from gensim.models import word2vec\nfrom os.path import join, exists, split\nimport os\nimport numpy as np\n\ndef train_word2"
},
{
"path": "deep-learning/tensor-flow-examples/Setup_TensorFlow.md",
"chars": 16739,
"preview": "_From TensorFlow Official docs_\n\n# Download and Setup <a class=\"md-anchor\" id=\"AUTOGENERATED-download-and-setup\"></a>\n\nY"
},
{
"path": "deep-learning/tensor-flow-examples/input_data.py",
"chars": 5709,
"preview": "\"\"\"Functions for downloading and reading MNIST data.\"\"\"\nfrom __future__ import print_function\nimport gzip\nimport os\nimpo"
},
{
"path": "deep-learning/tensor-flow-examples/multigpu_basics.py",
"chars": 2031,
"preview": "#Multi GPU Basic example\n'''\nThis tutorial requires your machine to have 2 GPUs\n\"/cpu:0\": The CPU of your machine.\n\"/gpu"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/1_intro/basic_operations.ipynb",
"chars": 5552,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Basic Operations in TensorFlow\\n\""
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/2_basic_classifiers/linear_regression.ipynb",
"chars": 41597,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Linear Regression in TensorFlow\\n"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/2_basic_classifiers/logistic_regression.ipynb",
"chars": 6089,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"collapsed\": true\n },\n \"source\": [\n \"# Logisti"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/2_basic_classifiers/nearest_neighbor.ipynb",
"chars": 13905,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Nearest Neighbor in TensorFlow\\n\""
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/3_neural_networks/alexnet.ipynb",
"chars": 12745,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# AlexNet in TensorFlow\\n\",\n \"\\n"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/3_neural_networks/convolutional_network.ipynb",
"chars": 11282,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Convolutional Neural Network in T"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/3_neural_networks/multilayer_perceptron.ipynb",
"chars": 6906,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Multilayer Perceptron in TensorFl"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/3_neural_networks/recurrent_network.ipynb",
"chars": 13174,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Recurrent Neural Network in Tenso"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/4_multi_gpu/multigpu_basics.ipynb",
"chars": 4610,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Basic Multi GPU Computation in Te"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/5_ui/graph_visualization.ipynb",
"chars": 1613863,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Graph Visualization in TensorFlow"
},
{
"path": "deep-learning/tensor-flow-examples/notebooks/5_ui/loss_visualization.ipynb",
"chars": 417610,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Loss Visualization in TensorFlow\\"
},
{
"path": "deep-learning/tensor-flow-exercises/1_notmnist.ipynb",
"chars": 20935,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"5hIbr52I7Z7U\"\n },\n"
},
{
"path": "deep-learning/tensor-flow-exercises/2_fullyconnected.ipynb",
"chars": 19272,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"kR-4eNdK6lYS\"\n },\n"
},
{
"path": "deep-learning/tensor-flow-exercises/3_regularization.ipynb",
"chars": 8658,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"kR-4eNdK6lYS\"\n },\n"
},
{
"path": "deep-learning/tensor-flow-exercises/4_convolutions.ipynb",
"chars": 14985,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"4embtkV0pNxM\"\n },\n"
},
{
"path": "deep-learning/tensor-flow-exercises/5_word2vec.ipynb",
"chars": 311327,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"D7tqLMoKF6uq\"\n },\n"
},
{
"path": "deep-learning/tensor-flow-exercises/6_lstm.ipynb",
"chars": 42556,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"colab_type\": \"text\",\n \"id\": \"D7tqLMoKF6uq\"\n },\n"
},
{
"path": "deep-learning/tensor-flow-exercises/Dockerfile",
"chars": 191,
"preview": "FROM b.gcr.io/tensorflow/tensorflow:latest\nMAINTAINER Vincent Vanhoucke <vanhoucke@google.com>\nRUN pip install scikit-le"
},
{
"path": "deep-learning/tensor-flow-exercises/README.md",
"chars": 269,
"preview": "Exercises\n===========================================================\n\nBuilding the Docker container\n-------------------"
},
{
"path": "deep-learning/theano-tutorial/intro_theano/Makefile",
"chars": 146,
"preview": "intro_theano.pdf: slides_source/intro_theano.tex\n\tcd slides_source; pdflatex --shell-escape intro_theano.tex\n\tmv slides_"
},
{
"path": "deep-learning/theano-tutorial/intro_theano/intro_theano.ipynb",
"chars": 913223,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Introduction to Theano\\n\",\n \"\\"
},
{
"path": "deep-learning/theano-tutorial/intro_theano/logistic_regression.ipynb",
"chars": 17060,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Logistic Regression in Theano\\n\","
},
{
"path": "deep-learning/theano-tutorial/intro_theano/utils.py",
"chars": 5130,
"preview": "\"\"\" This file contains different utility functions that are not connected\nin anyway to the networks presented in the tut"
},
{
"path": "deep-learning/theano-tutorial/rnn_tutorial/Makefile",
"chars": 538,
"preview": "all: instruction.pdf rnn_lstm.pdf\n\ninstruction.pdf: slides_source/instruction.tex\n\tcd slides_source; pdflatex --shell-es"
},
{
"path": "deep-learning/theano-tutorial/rnn_tutorial/lstm_text.ipynb",
"chars": 23856,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Introduction\\n\",\n \"In this dem"
},
{
"path": "deep-learning/theano-tutorial/rnn_tutorial/rnn_precompile.py",
"chars": 8337,
"preview": "\"\"\"This file is only here to speed up the execution of notebooks.\n\nIt contains a subset of the code defined in simple_rn"
},
{
"path": "deep-learning/theano-tutorial/rnn_tutorial/simple_rnn.ipynb",
"chars": 133107,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Recurrent Neural Networks in Thea"
},
{
"path": "deep-learning/theano-tutorial/rnn_tutorial/synthetic.py",
"chars": 2930,
"preview": "import collections\nimport numpy as np\n\n\ndef mackey_glass(sample_len=1000, tau=17, seed=None, n_samples = 1):\n '''\n "
},
{
"path": "deep-learning/theano-tutorial/scan_tutorial/scan_ex1_solution.py",
"chars": 952,
"preview": "import theano\nimport theano.tensor as T\nimport numpy as np\n\ncoefficients = T.vector(\"coefficients\")\nx = T.scalar(\"x\")\nma"
},
{
"path": "deep-learning/theano-tutorial/scan_tutorial/scan_ex2_solution.py",
"chars": 1394,
"preview": "import theano\nimport theano.tensor as T\nimport numpy as np\n\nprobabilities = T.vector()\nnb_samples = T.iscalar()\n\nrng = T"
},
{
"path": "deep-learning/theano-tutorial/scan_tutorial/scan_tutorial.ipynb",
"chars": 26572,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Introduction to Scan in Theano\\n\""
},
{
"path": "deep-learning/theano-tutorial/theano_mlp/theano_mlp.ipynb",
"chars": 30422,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Multilayer Perceptron in Theano\\n"
},
{
"path": "kaggle/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "kaggle/titanic.ipynb",
"chars": 470548,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"This notebook was prepared by [Donn"
},
{
"path": "mapreduce/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "mapreduce/mapreduce-python.ipynb",
"chars": 15033,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"This notebook was prepared by [Donn"
},
{
"path": "mapreduce/mr_s3_log_parser.py",
"chars": 4497,
"preview": "\nimport time\nfrom mrjob.job import MRJob\nfrom mrjob.protocol import RawValueProtocol, ReprProtocol\nimport re\n\n\nclass MrS"
},
{
"path": "mapreduce/test_mr_s3_log_parser.py",
"chars": 3179,
"preview": "\nfrom StringIO import StringIO\nimport unittest2 as unittest\nfrom mr_s3_log_parser import MrS3LogParser\n\n\nclass MrTestsUt"
},
{
"path": "matplotlib/04.00-Introduction-To-Matplotlib.ipynb",
"chars": 100593,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.01-Simple-Line-Plots.ipynb",
"chars": 295516,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.02-Simple-Scatter-Plots.ipynb",
"chars": 197225,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.03-Errorbars.ipynb",
"chars": 47226,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.04-Density-and-Contour-Plots.ipynb",
"chars": 497151,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.05-Histograms-and-Binnings.ipynb",
"chars": 124825,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.06-Customizing-Legends.ipynb",
"chars": 219181,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.07-Customizing-Colorbars.ipynb",
"chars": 434822,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.08-Multiple-Subplots.ipynb",
"chars": 150310,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.10-Customizing-Ticks.ipynb",
"chars": 317513,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.11-Settings-and-Stylesheets.ipynb",
"chars": 371567,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.12-Three-Dimensional-Plotting.ipynb",
"chars": 662122,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.13-Geographic-Data-With-Basemap.ipynb",
"chars": 2737154,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.14-Visualization-With-Seaborn.ipynb",
"chars": 1071227,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/04.15-Further-Resources.ipynb",
"chars": 5232,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--BOOK_INFORMATION-->\\n\",\n \"<i"
},
{
"path": "matplotlib/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "matplotlib/matplotlib-applied.ipynb",
"chars": 192690,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"This notebook was prepared by [Donn"
},
{
"path": "matplotlib/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "numpy/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "numpy/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "pandas/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "pandas/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "python-data/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "python-data/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scikit-learn/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scikit-learn/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scipy/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "scipy/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "spark/__init__.py",
"chars": 0,
"preview": ""
}
]
// ... and 74 more files (download for full content)
About this extraction
This page contains the full source code of the donnemartin/data-science-ipython-notebooks GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 200 files (20.4 MB), approximately 3.9M tokens, and a symbol index with 64 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.