master
/ .ipynb_checkpoints / 03_classification-checkpoint.ipynb

03_classification-checkpoint.ipynb @master

79a0db4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 3 – Classification**\n",
    "\n",
    "_This notebook contains all the sample code and solutions to the exercises in chapter 3._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's make sure this notebook works well in both python 2 and 3, import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# To support both python 2 and python 3\n",
    "from __future__ import division, print_function, unicode_literals\n",
    "\n",
    "# Common imports\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "# to make this notebook's output stable across runs\n",
    "np.random.seed(42)\n",
    "\n",
    "# To plot pretty figures\n",
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['axes.labelsize'] = 14\n",
    "plt.rcParams['xtick.labelsize'] = 12\n",
    "plt.rcParams['ytick.labelsize'] = 12\n",
    "\n",
    "# Where to save the figures\n",
    "PROJECT_ROOT_DIR = \".\"\n",
    "CHAPTER_ID = \"classification\"\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True):\n",
    "    path = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id + \".png\")\n",
    "    print(\"Saving figure\", fig_id)\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format='png', dpi=300)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# MNIST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'COL_NAMES': ['label', 'data'],\n",
       " 'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.])}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('MNIST original')\n",
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = mnist[\"data\"], mnist[\"target\"]\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "28*28"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure some_digit_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28, 28)\n",
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary,\n",
    "           interpolation=\"nearest\")\n",
    "plt.axis(\"off\")\n",
    "\n",
    "save_fig(\"some_digit_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_digit(data):\n",
    "    image = data.reshape(28, 28)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary,\n",
    "               interpolation=\"nearest\")\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# EXTRA\n",
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure more_digits_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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emGqVrVfv36leigF0extJWNvv/124joao45s6aiUZjBHO2loxroez6BBg4Dw+ejSpQsQ6u0rWYOqz5Ael8YkOgqgbRTACiuskPO2VM+o97r6CEbriUXJud7j1VSHe9111wFw4IEHAqHvYz7RJHHJJZcEwvPaTE4SzczMzKx4LWrFFa2korqQeIq6/vrrA7DlllsC2TVfmv262mqrAWGv9cknn8x5W5WghPDGG28EsmczFkt7pk8//TQQklLNJIbQK7JSNMM8TomfZqs3RPUrl112GRDqxSAkr6effnrW7VaakoVC7LDDDkBhszr1XOhvmlPfVy777bcfEOpRC6E0btNNNwVg7bXXBkJCdf755wMwefLkzN988803QNNmmuajhG/bbbdNXKYE8eqrrwbyJ98SvQ2dVj2TkjbV8On9G01b1FdPKZxmU6eVtuj5jSeI6iQQrZ9cZpllADjllFMA2GijjYBQx5iL/v6oo44Cwuf6s88+A0Id58wzp5OTKIXPlSCKZrgqJY/Td1CUVujQ0RMl0K+//joAL7zwAhC+28pN78Hod6fGoARdtYdaMUd14kq+G9K6dWsgvLf1/1xJorbpeq111EGJbdqmTp2aOa0jkfrd0Nh2Jvr7Iu3fGk4SzczMzCzBPxLNzMzMLKHuJ65El+DKt9yeDlto0okmo2hpLIC+ffsCofWA6HCFYm8dnoXchemlpkJegIMOOgho2uSZQttJqCAawuFstQdKq93C6NGjgXDIQRZaaCEgLI7eFFoeCWCdddYBwvtFS4Vdc801Tb795tBkER36j9KhYh1eix9eLqaJsCaw6PHr/2lPXIkegin2MLPKQiB8JnVIN06TlnToDsLnQZMH1KqiOXRbancRpYbl0eL9UtEh3eghOX129d7WogA6FF9umsQQnzyocemQeXPp9nToUTSZJ60WXzpkrskG0VKdE088EQgNsPVdUgw1k1d7FJU2aNJG9PBvOelzotKAKH13attRimbQKrGKNtOOL7spek8dccQRzb7fYui9Fm17pDI1beM8ccXMzMzMakrdJonak4qmA8OGDQPCHo2W7VHxtgr2i6EkUQlcNOXJ12KnFF599VUAzjvvvMx5DTUYbUwxjWnj1C7knXfeyfp/uShJVMGzqCC6OUlilPbw1UxbbUL03KdFBddqTSPRZfL02pdy2bH+/fsDYQ88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STQzMzOzBCeJDYjumUaXM4Ow/Nf6668P1NYyds8++2ziPLXrqaXHUYy33nor69+WQm0z1CYl2ki9TZs2FRlTKamgvV7TlkIojdC/f//9dyWHk5qHH34YgN133z3vdZZYYgkARowYkcaQSqJHjx5AMmW6+uqrM6cPPPDAVMdUDrPO2vjPjzfeeANIThTVdmynnXYCkulhraiF7ZWTRDMzMzNLcJIYoaX21LgzXv8AYS/vjjvuAKBjx44pja75PvroIwBee+21xGVa5mjddddNdUxpGTJkSIOXr7766imNJF3jx48HQuuIRRddNHPZ8ssvX5ExlVLXrl0rPYSKi6eo9V6TqAbZgwcPBsJSbbkcfvjhALRt27b8AyuRFVZYAUi+rjPP3PIynZtvvhmA3377Lev8TTfdFICDDz449TGVg1LV2WabrcIjSWp57zozMzMza5STRELtx6RJk4CwRFuUfuGfcsopQG0liDJjxgwAfvnll8Rliy22WNrDKTs1pQV45ZVXGrxuvS7Hd88992T9v95Spg4dOuQ8P9o0fc0110xrOKmZNm1a5nR85nq0sXA90Szmiy++GIBnnnkm73VXWmklICxyUIt01CpXDXm903dxdF4AwMILLwyEhLheqLl7NS5w4CTRzMzMzBKcJAKXX345kL2sU5wWjF9ooYVSGVPaNt5440oPoeSiSaL2TOM0O71e633iC8jvuOOOFRpJecVngqpurV7pqAAkl+OrxjSiFNRhYuTIkTkv79KlS+b0Y489BlT38nuNUW3ic889V+GRpCO65N6gQYMA+PPPP7Ous/baawP1832l7VY1z3Kuz29GMzMzM2uWFp0kTp06FUh24Z977rmB7I7w88wzT3oDq4Cll1660kMouVGjRjV6nQEDBgC122crH723lTKJ3tv1ZpFFFgFCh4J6d9FFF2VOK41YZZVVgNqayVsI9chTupQvdVF6CLWdIMq9994L1MaqHKUQTYhvueWWnNc5+eST0xpOWenI1k8//QRU93bZSaKZmZmZJbTIJFG1D+ussw4AH3/8cdblmlG11157pTuwMhs6dCiQe8+0HvsjFrK6SufOnVMYSfrGjh0LwNdffw2ElSdUt1ZvtPKC1nD97LPPMpdpNv9cc82V/sBSUM31TE0VXeFKM5RVY6zHq44TxxxzDFAf6WGU+vVGZ+rXow8//BCAs846K+91TjjhBABWXnnlVMZUbprjoNrp3XbbrZLDaZCTRDMzMzNL8I9EMzMzM0tokYebtTB8/DCzDmtss802qY8pDfFlnuq1IFqTNR555JG811Hz8Nlnnz2VMaUt3iZkjjnmAGDOOeesxHDKLr6s4osvvpg5rQkNW2+9dapjKqdhw4YlzquHUgJNUok2wdahuTgdZj7zzDPLP7AKuPrqq4H6LCeIGj16NACvvvpq3uuceOKJQP1NMBQti1uNnCSamZmZWUKLShLfffddAHbeeees89UyQtPr67XdzeTJkys9hFRoYtKXX36Z9zobbrjWPWzuAAAgAElEQVQhUN17cM3x0UcfZf1/o402qtBI0qEG0rnScS3nVk9JolocQUiaoi27apWO4nzyySeJy+KvbT1OtouKH/mpN7/99hsAY8aMyXsdTUir1yMgtcBJopmZmZkltKgk8dxzzwXg999/B6B169YAHHjggQC0adOmMgNLSbTZLIS2KAALLLBAyqOprEMPPbTSQygLpajxett6XY4vLlfq8tBDDwFwwQUXpD2csqm3emIlh7/++iuQ+3VcfPHFgfBeXm+99dIZXIXU22sc179/fwBGjBiRuKx9+/ZAaKrdqlWr9AZmWZwkmpmZmVlC3SeJhx12WOb0TTfdlHWZaniUMNarZ599FoDp06dnnb/BBhtkTmvPrR7o8eay3HLLASGVqDevvfYakJwROt9881ViOFWha9eulR5CyUWTNr2nl1lmmUoNp8nUIHurrbYC4Isvvsh73T59+gAwePDg8g+sCtRrTeJff/0FNDybuUuXLkBomF5vlJjXAieJZmZmZpZQt0mi+m3dddddict69eoFwEknnZTqmCrl22+/BUItpmjZp3oT7ZEXp9Sl3pbwEs3kFdWdRutP61GHDh0A6N27NwCjRo3KXNZQOlVr3nvvvcR5SolrMS0eNGgQELbXDanX7VU+qpW/5pprKjyS0rrnnnsAeOmll7LOj3aauPHGG9McUuriKaqWJqxGThLNzMzMLKHuksRffvkFCHUrX3/9deI6p59+OgCrrLJKegOrAvHali233LJCIymPP//8Ewgr6rREw4cPz/q/+otppYK///47c9nMM9fPPuKss/5vU6aVZaIzQ3/88ceKjKkcpkyZkjivFmsu33//fQAuvfTSnJdH6ysnTZqUypiqVb3VJA4ZMiTn+epTDPVbMy5KiS+++GIgdGDQc3PwwQdXZmA51M+3hJmZmZmVjH8kmpmZmVlC3R1uPuWUUwC4+eabE5fpvNVWWy3VMVUrLYEFcOSRRwLZbXFqzbBhw4CGD0998MEHAHzzzTdAbRb7NyR+OPKdd94BoGPHjkBokQP1eUgnV9uQCRMmVGo4JffKK68A2YfTx40bV6nhNJkmL+Q7lBo99NhS6TXWv2oBVKtUDhSffKWyl+233z71MVWKtsd77rknAJdffjkQJl36cLOZmZmZVbW6SRJ/+uknAJ577rms8xdbbLHMabW+URF/Szd27NjM6XpokVJI49Wll14aqL8EURZddFEAJk+eDMDKK68MhJYwutxqkyabHXvssZnzanECklKjAQMGZJ3fvXt3IGyrW7J4Kj5y5MjMZQMHDqzImJpj8803B+Dzzz/POn+nnXYC6vPIRmM00a6a1d7WxczMzMzKrm6SxKlTpwLw8ssvZ53fr1+/zOl6baDcGO2h9ejRA4Bll10WgDPPPDNznYUWWij9gZXYjjvuCMAjjzwC5G7IWu9tj+JJekvTt29fAF5//fXMefVU36bPbq1bYIEFAOjZsycQmsAfdNBBQMvdVkfFaxKjS23qPa36+mpuNK5axPhSdGqevddee6U+pmqx0UYbAXD++ecDsOSSS1ZyODk5STQzMzOzhJmis+SqSNGD0mzVddddF4BOnToB2Y2V1XDX6tudd94JwK677po576ijjgJCk3W/F6yWtW3bNnNa9aba9ll9ePTRRwHYYostgHAkCODCCy8EYPXVV09/YEXScrC33347ENJ+1aXmWjrXUtNop3YniWZmZmaWUDdJopmZmZkVzEmimZmZmRXPPxLNzMzMLME/Es3MzMwswT8SzczMzCzBPxLNzMzMLME/Es3MzMwswT8SzczMzCzBPxLNzMzMLME/Es3MzMwswT8SzczMzCzBPxLNzMzMLME/Es3MzMwsYdZKD6ASdt55ZwDuvvtuANq1awfAbrvtBkC3bt0A2G677TJ/M88886Q5xJK4/vrrAbjllluA8Lj79esHwDLLLJO57vHHHw/A/vvvn+YQy+KGG24AYMiQIZnzNt54YwB69uwJwNprrw3AHHPMAUCrVq3SHKKV2SOPPJI5fd999wFw9dVXAzBw4EAAzjjjjPQHZqn4888/AZg+fToQPt9zzz13xcZkVqjHHnsMgI8//hiAHj16ZC6bZZZZgOzv73JykmhmZmZmCTP9888/lR5DLmUd1EUXXQTA7bffDsArr7wCwEwzzZR1vRVXXDFz+vDDDwfgwAMPLOfQSuLiiy8GQjqovWrRax59vLPO+r9QeYUVVgDg8ssvB2Ddddct72DLYNiwYQAccsghmfN++OEHIPnYlTCeeOKJQEgYAWafffbyD7YJfv75ZwDefffdzHmDBg0CQmqmx6nX88wzzwSy0/F68swzzwBw9tlnA/Doo49mLtNrHX/tdSShXp8T+euvv4Ds7YC2gb/88gsAa621FgC9evUCktvCaqD3/ZQpUwAYN24cAE8++WTiul9//TUAI0aMAGCJJZYAwvti2WWXLetYG/Pggw9mTi+yyCIATJgwAYAZM2ZkXTfX9lrGjBkDhM/9LrvsAoRtoBx77LGZ02PHjgXgqaeeavL45dlnn815W/ocAvz6668F3daSSy6ZOf2f//wHgH322ad5A6wxL730EgC9e/cG4LvvvgPC+xfC95JeY72X55xzzqbcZaMfdCeJZmZmZpbQIpNE0R7OTz/9BMDIkSOz/n388ccz1/39998BOOiggwC48sor0xhik5x00kkAnHvuuTkvb2jPVDp16gSE52LVVVct5RBT8fbbb2dOa+/5rLPOAuCrr74CQsIom266aea0klili5VOFt955x0Att9+ewAmTZqUuSz+msb/v9hiiwEhfQGYf/75yzzi8lGqpMRCSaoe72abbZa57rbbbgvA5MmTgfAeUM1qLRwdaAo9R0rUb7311kb/RjV8bdq0Kd/Ammi//fYDYOjQoU2+DSUyp59+OgB77rlns8dVDL0vtT0CaN26NRC2SYUc+SkFJczNobreU045Jev86PdF9LMY9d577wEh7Y3SY1WN/HHHHQfA0ksv3cwRV7d9990XgJtuuqngvznhhBOAsF0rkpNEMzMzMyuefySamZmZWUKLbIEjKvTUv3379s36V0WkAEcffTQAd9xxBxCmn+v8WhQ9DBAt9Af47LPPgBB71+Lh5ujEI51WIfRzzz0HwMEHHwyEQ9OjR4/O/I1OP/zww0D+wyblNn78eCAUM3/55ZdA9uEnjU2HVnUdlRx88sknQPYhx6OOOqqMoy6PfIfc1dpIj//II49M/K0mqOh506SeeqH3yaeffgqE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ap7zpcV670UbIqtmTonXrLMW33REn2UlifHacm0fIDsxT0O8nl7bFTWdjo4tTh1H1HlAdfY6qqHvfWsyJ4lmZmZmVryaTxLNrHlU+6clzM455xwgOYv6r7/+qsDo6oe2tTr6kYtS8FqchW/JJHH//fcHoGvXrkCow4sub1pK6tShGr1HH30UyO7yoR6SaVP6pyVRixFfZrecRzJaGCeJZmZmZlY8J4lmZmZmLY+TRDMzMzMrnn8kmpmZmVmCfySamZmZWYJ/JJqZmZlZgn8kmpmZmVmCfySamZmZWYJ/JJqZmZlZgn8kmpmZmVmCfySamZmZWYJ/JJqZmZlZgn8kmpmZmVmCfySamZmZWYJ/JJqZmZlZgn8kmpmZmVnCrJUegJmZWUv322+/AfD8888D8NxzzwEwceJEAEaMGJG57vrrrw/AqquuCkC/fv0AWGaZZVIZq7UcThLNzMzMLME/Es3MzMwsYaZ//vmn0mPIpSyDOvfccwF46623APj4448B6N27NwCrr746AJtuumk57t6sJKZPnw7AzTffnDnv3nvvBeCzzz4D4P333wdggw02AMJhqW233TbzNz169Cj/YEvk66+/BuDSSy8F4O677wbg3XffzXn9Nm3aZE7r873ssssCcMQRRwAw//zzl2ewZkX49ddfAdhvv/0AGDZsWNG3scACCwAwatQoALp3716i0VlzzTTTTInzFl10UQDWXHNNAI4++mgA1lprrfQG9j/JwcU4STQzMzOzhBaVJA4ePBiAO+64I+t8pS6//PILAAsttBAABx54YOY6O++8MwArrrhiOYbWqPvuuw+Ar776CgiFyn/++Wejf6v0aPPNN886f7XVVsuc7tatW0nGaeU3btw4AP7v//4vc96CCy4IwP777w/AbLPNBsATTzwBhPf4l19+mfkbvadvueUWAGaZZZZyDrtoN910U+b0oYceCsDPP/8MQOfOnQFYaqmlcv6tPssAY8aMybps+eWXB+Cee+4B0v9M//777wDccMMNmfP23HNPIDsBtZbho48+AqBr164AfP/9902+re222w6A4cOHA7lTrErRbw1td3Q0oFOnTgA89dRTmevm+1zXop122ilx3n//+18AXnrppazzL7jgAgD69+9f/oH9j5NEMzMzMytei0oS83nvvfcAuPzyywG49dZbgew9ulatWgHhl/5hhx2W5hAztQtjx44t2W0ussgiidNKT3v16gVAx44dS3Z/TaE2EBDq7uaee24A+vbtW5Ex6f7btWtXkftXTWI0Ed9+++2B/HV2P/30EwADBw7MnHfJJZcAcOONNwKw9957l3ysxVDKqZrg119/PXNZz549gTBmpX+zzpq7i9fff/+dOT1jxgwArrzySgAGDRoEwB9//AHACy+8AIR0stRWXnllAGae+X/75H/99RcAb7/9duY6yy23HBAS4MZEH9/JJ58MhPpT1afVIn0fPfroo5nz7rrrLgBefPFFABZffHEAhg4dCkCHDh3SHGLZnH766QCccsopAGy55ZYA7LDDDgDMNddcib958sknAbjqqquyztd3WjW1xNGYlOTHKWGE8BrHdenSBYDddtutxKOrDL2n9diVMKpmUe2Q9P8ycJJoZmZmZsVzkpjDN998A4S6DoBDDjkk6xyKfXUAACAASURBVDpDhgwBsusWy6mYJHH33XcH4Lbbbmvy/ale8eGHHwZCzVvaDj/88MxpJUF6z+art2ns8uZeR7Nk33nnnQbHXk1Uo6f3BoQ61+uvvx4IsysrRe/t//znPwD06dMnc9kee+wBhBS3FPejGl2llEqqS03vH/3bunVrICSKEFJG1SuqNlGpcXw7Hf2/bnejjTYCwnZLz5Vuu5p99913QNjO3nnnnZnLZp99diDM/Hz66aeBUJMbr+uqVXo//PDDDwC0b9++0b957bXXgOz6cgjfTwcddFAph9gsH374IRASe73Xi6HE/ZlnngFqOzXPRfWLqtcUHe2Aks+AdpJoZmZmZsVzkligV155BQi1eurbNnXqVCDMiC4XzYBT3YooaYDQI091KtojPemkk4BQ76DLC6E+dErP0qa+eBB6SVU6Sdx1112BULtaC/QeOPvsszPnada7ZhGXIqWrJRtuuCEQ9tLHjx+fuayU9YlKLFVnp4Q/Wks355xzAiElO+644wA47bTTgJC66DYmTJiQ+dt87+FPP/0UKGs9U5O9+eabQKjxVqqt2u9jjjkmc12li/PMMw8QtkXq9KBat3pLlQqhetQzzzwz6/xqTBJFr6e2O1qOsBj6Po4nqPUinijuuOOOmctUo1siThLNzMzMrHhOEhugTvgAL7/8MhBSAe39pJUk5hPtB/ftt98Coe9UnGotNatS/fEArrvuupx/o2SjUqtz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DzyQtu4///wDBOWtd+/eABx22GGpdeabr3C71vvvvw/AH3/8AcDGG2+cc93nn38egGeeeQaAjz/+OOtzQbgqz2SnnXYCoF27dvUccenQd9OrV6/UskGDBtX4mO222w6AESNGFG1chULb6VdffZVapu/xkUceAeC3334D4Pbbb0977EorrZS6PW3atKKO05h8efHFFwE46KCDUsui23c2llxySQAuv/zy4g2sTPnll1+AcCwQ+kwKPQNkJdEYY4wxxsSwkmgazG233QbA4MGDAXjzzTcBmDhxYsnGVBuffPIJAP369QNg9OjRALz33nupdZo0aZL2NxNd7R577LFAUOAgXbWpL1JojznmGCD4cpZZZpmcj/niiy+AuJK52WabAbD//vunlu27775Zn2+FFVZoyLBLihTUbOqh/EuZ3+dWW21V9HHVlSFDhgDw0UcfAUEdHDVqFJCuCOci833m2o6NSQL9Ltxzzz0A3HvvvQDMnTsXCNt4Pnz99dcFHl1pmTVrFgCTJk0CoH///jnX/c9//gPA+PHjgbBfa0ZkueWWA9JnnE444YR6j81KojHGGGOMieGTRGOMMcYYE8PTzUVEhQZTp05NW77mmmuWYjgFIWqW7dOnDxCmbMVll12W6JjyQdPLffv2BeDBBx8E4LvvvivZmGpj3nnnBWD77bcHwnSztqd11lknte4ee+wBQMuWLQE45JBDEhpleaDvUVPzUVRQdOONNwKw8MILJzewOqJCoyOOOAKA33//vdbHNG3atMb727ZtC8AFF1zQsMEZUw9UDKiCxjlz5tT5OdZaay0ADj/8cCDsH5WOisuuueYaIOz/9bGGvPDCC2n/L7/88g0c3f+wkmiMMcYYY2JYSawnusKXifTVV18FgpkUQhFEtBgC4O+//05iiDn55ptvgBCiDCHOZeWVVwZg1VVXBUL4st7DqaeemnrMhAkTAGjevDkQru523XXXoo09HzTmSy65JLVMMTY//PAD0DATf6dOnQDYaKON0pYvuuii9X7OmpBiq4gDhV0feeSRqXWOO+64orx2ufPjjz8C0LVrVyBEu8i8DWE7KGcFUciQr+OL4iy6d+8OBFVQ7xvguuuuS3KIxtSKilQgfwVRsyAQjqWnnXYaEGZTCqWOlYLvv/8+dfvmm28GQoSP9vcNN9wQCL/HWp7tfet4pt9qFf5oVmnt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CwAHHnhgapm8XVJm5EHWMb+c+PzzzwH48ccf0/6XV3H99dcvxbAKzrRp0wC46667gPDdiGj9QGPh+++/T/v/1ltvBeDII48sxXCyYiXRGGOMMcbE8EmiMcYYY4yJUfXTzauuumrq9gILLACEaTZNrzU2ZJI9+eSTY/dttNFGAJx//vmJjqmQPPnkk0AwSEOYZt56660B6Ny5c/IDKyGawtK0G4TiDDHvvPMC4bO64447gOqbbtb7kh1BUz73339/ap3ddtst0TF98803ABx22GFAsMl069Yt0XFUEq+//joA1113HRD2+2wcffTRiYypPihmTEWCYu7cuaUYTtF44IEHgGD3yqR9+/ZJDqekyOLTv3//tOVRy0S5YCXRGGOMMcbEqDol8csvvwTgjz/+AODTTz9N3SczuOjbty8Q4hLWWmutJIZYMkaPHg3ArrvuCqQbhxWWravx5ZdfPuHRFQ4pDNFIDKHA2vnnnz/RMZWKJ554AoDdd98dCGphPmg7qRZuuukmICjoikG67777gOTVwyg//PADAFOmTAGC4l2X76uxMGfOHABOOukkAN58882c655wwglAZRV/KJardevWJR5JYXjhhRcAuPDCC9OWL7bYYgAsscQSAOy5557JDixhZs+enbqt39mff/65VMPJGyuJxhhjjDEmRtUpiZnhyFHfodSj//73v0C4So/G5FQj3333HRBa7klBjCqJKr2vZAXxs88+A0JwdhSFkmZezVYrivqQ2pIPUtKHDh0KQIsWLQo+rqSIXqHvu+++QAhWlkKjyA0piqVEMS5CbbpM4JVXXgHCZ5OpIEaPZ0cccQQQoozmm6/8f+rWWGMNAI499lggKGyVjrzhv/32GxAUxAEDBgCw8cYbA9CsWbMSjC45NGMB6TOcAGeeeSYACy64YKJjygcricYYY4wxJkb5X141EAVHQ6jaFMsttxxQ/UqirqpfffVVIPgPpR5CdfjPpBipej1KOV+pFQNVMWcqVNnQlX737t2B9ESASkOePqkxEILTDzjgAAAuv/xyoDwURHHPPfek/a+UARP85ddffz0AY8aMSbtfils0zUBV4pWE1G+Falcy0Rk8VW+L7bffHoC999470TGVCiUX3HLLLbH7WrZsCYTfp3L0IFtJNMYYY4wxMapeSYyqSn///XfafapqltqipuITJ06MPc8iiywChArI9dZbr/CDLTC33XYbAM8++2zacuVV6f1XOo8//jgQmqILKcUAq6++eqJjShq12xs4cCAQchGFWu3tv//+qWXZvJuVilSYQw89FIBRo0al7rv44ouBcLVejpXt7777btGee9asWUB69qm2l5VWWgmARx55BEjfZ8oFzXJEW0oCrLDCCkDInKsk9VCKN8Dhhx8OhN+qp556Cgge8kpEqj3A1KlT0+476qijkh5OSdH5xMcffxy7T21vy9l/aiXRGGOMMcbEqFolUb4OVbdlQ9VxquqcPn16rc976aWXAtCmTRsABg8eDMAGG2wApPsepeoknfY/YcIEIN4kXPlw1aIgCn2P8i4JNZKHUDlYTUSVFV25a7vP9LZIQbzxxhsTGl2yHHTQQUBQEKUeQnkriELZnoVE6qAURB0XokjlufrqqwG49tprCz6O+vDaa6+lbitnLxN1zunSpUsiYyokq622Wuq2sn1VnV2X47PyNbVta8ar1GTb1kwcVXaXM1YSjTHGGGNMjKpVEp955hkA3nrrrZzr5Or1qXy4Vq1apZbJz6j+mh9++CEA//73v4FQQRn1vp166qlAckrijBkzgOCb1JWpqrfr0lFCfUPHjx8PhH6bUX+jfG668tXzL7roovV7A/VEaq7YdtttAdhqq60SHUfSSKmG3BWRqliuJv9hFL2vkSNHAsFvG93Wy1lBLAby6B588MFAeP/qPgJBeT377LMTHl2aRgubAAAgAElEQVTNKMNWyibEOyfJN5mZiduY0CzCXnvtBYRjvD63UnUvUVcvdcWJou2wPpmV6pam36NHH3201sfos1H3onJEld7ljJVEY4wxxhgTwyeJxhhjjDEmRtVONz/88MN5r6uA5XPOOQcIJfrLLLNMah0VRSgm5/TTTwdCbMEuu+wChOnoUnDJJZcAYWpY081qf1TT9OuLL76Y9lctzGqK5tB0s6R/tTvbbLPN6vcG6shXX30FxAtWZA1455138n4uGb7bt29foNEVHhU3qAglGnOTWaiiqcZqLVRR3JGmS3v16gXAPvvsU7IxlRqF9qpQRW3Qjj/+eACuvPLK2LoqCimXSK/LLrsMgCeeeCLnOnvssQcA7dq1S2RMxWDIkCGxZYsvvjiQewpSliaA3XffHYDff/8dCBFQmmJVEWbSU/IffPBB2niidOzYEYAOHTrk/Xz6TVaQeuaxviZkJ8uM4EkKFbGqiE6/lxCCxFVQqfclm5eYZ57/6XilLEiykmiMMcYYY2JUnZIoFW3o0KF5P0Zn9TWFlzZt2hQIhm+pjCpc+eKLLwC48MILU4/ZZJNN8h5DfdH7hWDaF2rH17Vr17TlMherdRvA2LFjgXBFo6seqZH5oKgRffbFLmCR2hBtAQUhBiUaqFwbajq/+eabp5bJ/C2VuNTtG/v16wfAtGnTcq6jQhUpiM2aNav1eaWKf/fdd0D8u9f7199y4LrrrgOgU6dOQHpLtsZKjx49gFBUp2gYqXM10bZt2+INrA5ka6kpVJCWz/upRBTFtsUWW6Qt1/FN6iEExUn7qH6PpBDr2HfggQcWccS5iapmNS2LElXRtH+rhWZdfofyfb1io9kOqfXR9yC1WG2D9VujgiSNXcdvzZRACJfXdrLAAgsU5w38P1YSjTHGGGNMjKpTEtUCR1EK+VCfuIBcHh5dGQD079+/zs+bL7rq2m+//VLLFKyqoO9bb70VgK+//hoIbauk9GW7OlOrK6mAUiP33XdfIF25lIoj5K9IOgKnPsjjIS+fImTkxYzeVluzpONC5OuRvzDTpxW9Ul544YXT1s1UECdNmgTAzjvvnFqWrU1U9Hm1fQwaNAhIbyW26qqr1uGdFA5F3kgN11/Fa0gN1b4A8J///AcIClvPnj0BWH755RMYcX7IBy3v1ZgxY4CgGtSEZjHefvttIKiCt99+OxD3q0afX2Tuy0mjmBu1SM3GiSeeCMSPL/J+yaMcRcczebsqCf2WqCmC/IcACy20EBCOUfIrZ87mJK0k6ncx+h3pOCafpP6qJaTul9cU4uqb/h5yyCEA/Otf/wJCE4HoLIeOCdoe1J5W7Q+TYvbs2TnvU4i2IuVyBcZrf+jbt29qmW6rBelNN90EhG2i0FTenmOMMcYYY4pO1SmJ9UFVuYUg6g+Qx6QYKCw8Wn2sSrY+ffoA4YpKFW9SWXRVJh8ehAosqY2ZVyWqWov6NjOfR23/kkJN0aUiST2WV+Okk07K+dill14aCMGu7733HhCUHAjKmbyASSuJ8iI9/fTTQFwRilZBXnDBBUDwwUp1UBtJtWiTopjt+YSUmVz3lxKpmscddxwA33//PRCqIFWdn83bpu1E4e/lpCRmov0tHyXx1VdfBYLi3bt3byAoNdlQEoKCqfPxrhaTyZMnA9mrfqVyZqqd8k8rvUFKYxRtL/KS18fbVgyyVelmesuUpKFw9G222SZ1n3yZSpLITNXIFa5fbFS5rEptCEqhZi40GyW1UWpgNjVNPlv9pq288spA/Nh07rnnpm7rd08pF3WZVSwk2i5rQrOY+u71vSq5QmrkOuusk3qMUgvUllLb9A033ACEWaVCYSXRGGOMMcbEaFRKohTDqK8OQoWyrlTvvPPOWp9L2YrLLrssEK7ii11pJJ/KNddcE7tPvkEpCKqGk4IolJcohQzimWN6HfmalL2m9kgQrljuuuuurM9RbOTH1NWXvGdffvklkK4Q15YDp9ZNG220UWrZlltuWbjBFgGpQBCvpJfqefPNNwP1Uwel1CpnT/+XArVelL9W6oTet5QZtdSM5sNpm9X2Ui6ZgFEys0Vry1uNqiPyaYlNN9007X/5/aS2QlAqlScb3ZZKQXRsmay//vpAUDvVjlIt6KRCZkOfjY550VarpUTKfhSpSjp+nXLKKWn3R7MHo8cpiLepi6qO5YaU748++ghIz38U+i3Rb0ttSFWLot+ncvnOa0Jecf3VOYq2hej3KZV4u+22A8Jv9DHHHAPABhtsUNCxWUk0xhhjjDExGpWSGPVJRJH3LPPqLBtSZJRDJwVRyuLRRx+dWlc+N10JFwKpgjUpDd26dQPiqfeqVFamXLYqZFVI6opGyo2IfkZSF+XxKhXyo6iyVwn7qvSDkL6vvMtMlD0of0w5oG1qlVVWAUIVq4j67lTNKw+WKtsbglRxfa659p8keOmllwA44YQTgPBZ6ApbKoyqOeU1hTD+cvYgZnb6ee2114DwHWcqfdHKdqmoqjjXPqoqUmXORf22UmBLnX2p40u0cj4TeapVAS7VSMfiSkRdkyAoaS1btgTCLE60Qh+CRxGCv1Y5gqpuFvVJ7Cgk0bxgeUVVqSv/dCZRhV9Vv7Uxbtw4ILsaudRSSwGw44475vVc5YRmwbLVS6gGIKncXiuJxhhjjDEmhk8SjTHGGGNMjKqbblZbNcXPKFwbgjSdiw033DDnfSqnHzFiBJDe0g6CWVQl+hBM9NGA7UKRreWQpuRkbFVpvCRrTdVp6nX8+PGpx6qln6a39Pya8tRjFa8B5ROarYIdFWtoujkajP3KK68AIcRUU6dz5swBgvlX0QMQijw03ZU0mmLUdKliS4RaOEGYvtL3V4ipOD2HPqNSokINTS8rMD4TFWlETf+yGJx66qnFHGKD0NSYjiOyqqy99toA3HLLLUAwq997772x51Dx1VNPPQUEG4aiR6IFLpqmLDWaZo5GeWWiKfHMArx8WH311YEQnl/OqJhF27aO36uttlraXwi2IDVs0Lqako+uWwoUWA/htyVXYLSIhl3nsoYoFkxh4QqWLlXkT7FR3I1i0CA0VVAr3WJjJdEYY4wxxsRoUuom2Dlo8KBk4FexBuQO1VxzzTUBeOyxx4BgCI0qNWqcfsYZZ6Q9VsqU1o0WRiiGo5BXOSqwkMk5G5lt1epyv9pYKbxTxR/lHKkgFOadGfsSRUqv4oF0VSb1MYoCm9X2KGnq0pavtpDgmr5zKZYyeCuMXMHq5YDiqaTky7gv1IJL6pmUOAhtuWqaKSg3VDgmxaQ+6HuV2lTqIpVsKAZFxxcdZxuKinh0XM6lPJcKqb0Qvhc1MJDqmamcqu0phBkPKecqblMMWDkppzNmzACgc+fOAHz66adZ14sWrmQqoV26dAFC0ZKU1GzoGC9V9ayzzqrPsBuMjkHal1VIBrDDDjsAYWZOEU2K+tK5irbfbJFJQrN8V155JVDnGL5a0+WtJBpjjDHGmBhVqySKu+++O3W7V69eQPAXNgSFaOtKWG3e5CGA4BFUWHchmDt3LhBUs2ytf2pTEnXFGo2uka9PURy6Eq9E5EeTjwtqb82kzyoawqyrOPnCkkZXnh07dgRCsKoU0qhSWltIttaNvj+p3lLadKVfjshrrLHKayZlQTEvUiCi+0VUgakUpBApykit2RSNo7aLUeQfVjC1PF6lDsrOBwUBS/WsC1KV27Ztm1qmuJhyUxCzodaLUXUxG9lmDuR7V5vWclbLFRhfW21AlNp+y0Q0QFozLtH6gFKiloJqfRtFgd/y9ytST+co2d53165dgTC7IiUxV7xbLVhJNMYYY4wxdafqlcQo77zzDhB8S9kCOKNE28zptlQ4tcVTVWLSyJMSbWov/5K+U3khVN0slVD+n3IOFy4EquqEUBUqNU6ogbx8eNEKu3JDCqkq+vJRErt37w6EQHe9X6gstVgBstG2kFHk8ZEfVT7jakPh09HZCR3XTjvtNCD4+hSYLZWunNH3qjD7fLyYUvil1JQqhaCh6PtSGsPw4cPT7h81ahSQ7mmTwqTZqg4dOhR7mA1GMyJjxowBggqa6amLIsVcKrnQTJrqB3Scg9CWtlzQb7XSNyA9GD0b+g2XwqhtHMJvfrRhQAOwkmiMMcYYY+pOo1ISjalkdFWdTU3KrBjcdNNNgeCrbNasWRJDLBpSjSZMmAAEH5fSCwrp+60E5F2CoNBotkMqqqo7VflaCchzrVkQCPl6mgnZb7/9gKAcVpIi3piRoqZKZXlJP/zww5yPGT16NBC2cVNwrCQaY4wxxpi6YyXRmApl0qRJqdtS1uTDvOeee4CguhhjjDEZWEk0xhhjjDF1x0qiMcYYY0zjw0qiMcYYY4ypOz5JNMYYY4wxMXySaIwxxhhjYvgk0RhjjDHGxPBJojHGGGOMieGTRGOMMcYYE8MnicYYY4wxJoZPEo0xxhhjTAyfJBpjjDHGmBg+STTGGGOMMTF8kmiMMcYYY2L4JNEYY4wxxsTwSaIxxhhjjInhk0RjjDHGGBPDJ4nGGGOMMSaGTxKNMcYYY0wMnyQaY4wxxpgYPkk0xhhjjDExfJJojDHGGGNi+CTRGGOMMcbE8EmiMcYYY4yJMV+pB2CMadxMmTIFgFdffTXnOuuuuy4A66+/fiJjMsbUnX79+gFwyimnpJadc845ABx66KEArLjiiskPzNQbK4nGGGOMMSZGk3/++afUY8hGnQf1+eefAzBw4MC05W3btk3dXm211QB49tln09aZO3cuANdddx0AO+20EwDbbbddap1evXoBsPDCCwMw77zz1nWIJWPWrFkA6LuWchPlyy+/BOC5554DYPjw4QB88cUXAKyxxhoA/Pjjj6nHXH311QAcfPDBxRh2UdB3/csvvwBw+eWXA3DNNdcAcNhhh6XW1VXx/PPPn+QQa+X9998H0rfjxx57DIBx48alrdu0aVMADjjgAAC+//771H1//fUXAM2bN6/x9d555x0A2rdvn1p255131mvs2dDzvvfeeznX0fbXunXrvJ7zxBNPTN3++eefAVhuueUA2Hzzzes1zmLy9ddfA3DllVcCcP311wOw/fbbA3DWWWcB8MILL6StD/Dpp58CsOaaawJhH33kkUfSXmOTTTZJ3R42bBgASy21VAHfRf5MmzYNgNdffx2A1157DYAbbrgBgJNOOim1rpZtuummADRp0iTtMfo/+lumZVKny+U7nzNnDhB+TyDsu0L74/nnnw+EfTcbf/zxBxA+I/Hggw8C4Xdx0qRJqftWX331+gw9L7QtbrbZZqlls2fPBqBVq1ZA2Pa0veq7qgl9t7/++isQjkmXXXYZAG3atEmtq2N5qX6jp06dCsC3334LwMsvvwzAxx9/nFpHv8lPPPEEAFtvvTUQzlcmTJiQ9v9WW22VeqyWbbTRRoUYbq0fvpVEY4wxxhgTo2qUxH322QeAhx9+uO4v9v+fQT5XNFJvdtxxxzq/Tl2QovfJJ5+kLX/ooYcA+Omnn/J+Ll3J6X3OmDGjEENkySWXBOC7774ryPPVFV0l60ptzJgxafdLeQB44403gHClO3r06FqfX9/BDjvs0OCxNgSpn8cccwwQVAKpoQDzzfc/e/EKK6wAhPeu97vIIosA6ep4Jm+//Xba60l5Gzx4MAA9e/ZMrVtIJVH7XT77X0PQZzN9+vSivk6+RPfDk08+GQj7d22fRTbVrLZ1o6qh1I5mzZrVYcSFY4sttgCC8i1VW+qP/s+2rLb/o8v22GMPAB544IEivIv80UyN9r+oqpQEN910U+r2cccdV/TX0wwNBE9iJnvttRcQjl018eeffwL5/b6PHDkSgG222abWdQvJJZdcAkDfvn2BoCRmO7/IXJbv/9FlF154IQC9e/duyLCtJBpjjDHGmLpTNdXNUrWKzRFHHAHA008/DRSv2nLIkCEA3HfffUV5fki/gpMnQkg9k1o3YMCA2OOj/rYkkJ9HPo5jjz0WCD6VTG6//fZan1O+Dqlo5UinTp2A4N/q3LkzALvttltqnfXWWw+ADh06FOx15X+TktilS5eCPXcUeVtvueUWIKhc1c7OO++cui2PVS4WW2wxIHz3NSmJ8nxJERbyhEHyCqI8iJrxyfQTSlXS/1LLISiEmetkqi3ZHlPqmTLNcmjs33zzTWwdjb9jx45A8M7/5z//yft19F3n8vUW04eYjUMOOSR1W+9Dv2X6Tuoz65eLVVddNXU76odMAs04yUO6yiqrALDhhhvW+lj5C/WZTJw4Met6b731VmzZeeedB0DXrl3zfr36YCXRGGOMMcbE8EmiMcYYY4yJUTXTzYpMePPNN4FQ8q/4C4B11lkHiEeaKCbktNNOA+CZZ54BwvQeBKOxTO8y5hbLEK2p0osuugiAUaNGATB58uRaH6tIGr2vXMwzT7hGaNmyZdZ1FDGQjaSDjTVFFS2gqIloRIAiMKJTtNF1llhiiUIMsSBo6khFDNqmFf8yaNAgAFZeeeWivL7iVZ566ikgTFPuvffeRXk97XeyD1xxxRWxdV555RUAXnrppaKMIUk0nR6NJclEgcP6DjQFmc92qv3j7rvvTlteU9FSsdGxVIUqmmLVd3/VVVelrb/nnnumbmtdFaHkQvsLhMKVYhdD5UIWGBUVZJtmFn369AHCdGV9UCFermKNfKOjCsXyyy+fui3r1IEHHggEu5Bi1rJFsul769atW9pyTbvOnDkzbXn0N32hhRZq0NjryjLLLAOEaWdN+9YWLVYXotu+Pr+ksJJojDHGGGNiVI2SuNZaawEwfvx4IESeRIsrZOpXIHYudBWr+BAIZtikijUWXHBBIKg4UdN5EuhKLWoGz2T33XdPajg1ItVApnjFE3Xv3j21joz/mUi1U6BzbQUExUTBuCrkkDFZ6pFU62IpiOLSSy8FQpTDfvvtBxRflZECoGiHKIqT0N/aiIZpjxgxAoirVaVCJvvo/iPVT8ceBQJHDfm1IYUyM5xZyOBeCmTMzywo0fusSUms62tke52k0QxMZiyXiG7j5557br1fR4qlCmNEixYtgDDrsNJKK9X7NQqFjsv6q9D3aJSX0LFGMVx///03EI7pmu0TNQWOF5sChVrXSHSf1mejAhn9LRZWEo0xxhhjTIyqURIziQYp1xe1DYo+n3wH1c4JJ5wAwAcffJC2/F//+lfq9plnnpnomHTFJO+aUDN5+bbqghTnUiqIQhERUhDlE5XfqNhXjPL9KfJG6mohg7Pri/w9+fp8skW8RH1S5cBdd92Vun322WcDDfOOvfvuu0B668woyy67bL2fu6FI/cgVhF3I14g+b9KexN9//x3I7Z2VgqjvG9K94XXl5ptvBuIK+9prrw0UL7aqEGh2J9csTxRt05kKosj0mlcLUhCj27Fua2a0kN7HbFhJNMYYY4wxMapWSSwEUf/hV199VcKRJIeqxzLb1skbdf/996eW1VY9XWh0dSyvXCFQYHQ5oKDkfv36AcFDVmwF8Y477gCCIivP7r333gsEf2wlMGvWLCB/72K5UIjqU/lrM9UztcCrj9JeKHJ5EqOt9Ar1GtleJykWWGABIByrFNKvWYHDDz8cyK8VXU3ceOONQLwiWt99ZnOESkctSTPZaaedAFh33XWTHE7R0XYjb2627XjXXXdNZCxWEo0xxhhjTAwriTWglnSQu91RtaA8SV25KNdLfgcpbklXWSdNNG8raaVUiuHRRx+dyOv997//BYKvSb4ftdRSy6hKQr5K/W0MSEG8/vrrs95/wQUXAMlvz1EaiydRrzdw4MC0v4Ugqo6relqJCEKzAfrOKx397ubKBpRi2xBfZzny+OOPA9m3X2VvJpUuUl2frDHGGGOMKQhWEmsgW1PtaiJ6Fbr//vsD8MUXX6Sto5T8pBvEJ0WuqkCATp06JTyaZOnfvz8QqmK33HJLoHQqhLbHjz76CEj3BM+ePTuv5+jRo0fO+6Qu5nou5bcBLLLIInm9XjkwcuRIIFTqZ1LKTitCOX0rrLACEI4zUhSVcVpTLmsu9Nhy8CQWg59++glIT+zI7ODSpk0bILd3r9LQ97fvvvsC8Ntvv6XdrxkvdT6rFvS9KqtWSmJ0O07KiyisJBpjjDHGmBg+STTGGGOMMTE83ZwFTUfVFLVy6qmnJjWcojFt2rTU7aFDh2Zdp5QBvEmg+JfGQjTKSeb3xRdfHAhTN0suuWTyAwN++OEHILQY0/8A3333XYOfv7Zp9Oh0s1oECgW4K6aonMgMvBeagiwHNt98cyBMJyuWRwUmJ598cr2fW1Ny5VC4UgyGDBkCwJQpU2L3KZ5q2LBhQIjaqXTef/99ACZOnJj1fhVtVHvBiv5Gw8LVgjgpqusTNsYYY4wxBcFKYhZOO+00IPsV+pVXXgmkt6erNNQsXebYbMgA3bNnz0TGlDSTJ08GgiFYAdJnnHFGycaUBNH3N3PmTABuvfVWoHQBvJMmTQJgjz32AMJ3kzQ1tdzUFb72nXJC7f0yizSSbpuZD5ttthlQmM/x4YcfBuChhx4Cqq9wRWpatIVfJlKVqkFBVAwbhIKVTFSE1b1790TGlBQKz1ZL1szt9pJLLknd1m9VUlhJNMYYY4wxMawkRlCY8Jtvvglk97PIS1PJqGn4oEGDYvcpcPeAAw4AoEWLFomNK0mkov75559AiObYb7/9SjamYqDAbKlKUl8A1lxzTSC0tioVUkw++eSTko6jJpZYYolSDyGN6dOnp24rKkjHK8VVKRqm2skM6I4uq0RPory48r3rdykbmW35KplHHnkkdTvXsUDe4EqKqMoHhaArkk3brYKzS9nYwEqiMcYYY4yJYSUxgrwtCvOtNsaPHw+EJvNR1I6uX79+QKhGrDY+/PBDAB599NESjyQZrrnmGiC0bFtuueVS991///1ACDouFapUVHvAjz/+uM7P8fzzzwPBRxxtr3jiiSc2dIhlpzBHq/JnzZqVdp/ee2aFdrWSzX9YyZ7Ec845B4AXX3wx5zq33XYbALvssksiYyomL730EgAXX3xxznXWWWcdIPkg6WLxyy+/AHDQQQcB8PLLLwNBQezSpQsAF110UQlGl46VRGOMMcYYE8NKIqHlz1VXXZVzHVWRJZ1RVAjkaVGV3Jw5c2LrqP1er169khtYCbjxxhuB0OpKqKK90pHH8sknnwSC93K++f63q48ePTq1buvWrRMeXc0ceuih9X6s8uKkFMuTBjXv15WK3mc2Kjl5oT7U5ElsSP5iUkjt/OyzzwAYMGBA1vWi6vjOO+8MVKbnUuhYpRk8vf8o8sjfe++9yQ0sAZRJq+O0vke1hR08eHBpBpYFK4nGGGOMMSaGlURCkr3y2kSzZs1St5Vf1Lx58+QGViDkcRkxYkTa8uhVaDTRvRpRBW2mF3GZZZYBoFOnTkkPqSjIUyofnq7ElaVXbuphoZB35+qrrwaqt7JXVZ/RStBMNemss85KdEylpiZPonIZyxklEChtIBfah6E6OmHJg6yc1mzsvffeAKy//vqJjKmYKFUEwgyP9l1lH8qXWU7nGVYSjTHGGGNMDCuJhN6Ymayxxhqp2+VW3ZgPX3zxBZDb47Leeuulbpc6K6/YKPsy2g8Y4PjjjwegXbt2iY+pkKgns67O5dHTdy/PabWiWQCpSdXWkUFcccUVsWV6z+3btwdgtdVWS3RMpaYmT2Il8NRTT9V4v3qrV1vihLoYZUM9mauhA9aECRMA6NGjR2pZZm9mzfaV44yelURjjDHGGBPDJ4nGGGOMMSZGo55ulgx85513pi3fZJNNgJobq5czf/zxBxBa62kaRtMWam1Uqe8vX6JTyzfddFPWdWSMrkS+/vrr1O2uXbsC8OmnnwLBHnHwwQcnP7ASoEgJbfvVhuJCdMyKoimrli1bAsFq0FioqXClEqgtMLljx45A9dgIFJ49duzYnOuoTd26666bxJCKytSpU4EQoA1hW9X0sqabyxEricYYY4wxJkajVhJlnJUioyvyo446CqjclkfDhw8H4NVXX01bLmXxkksuSXxMpeDMM89M3c4MH1YUTKtWrRIdUyFQlEL06lOt7KSC33333ckPrISoCKtbt24AtGjRopTDKTgjR44E4I033si5ziqrrJLUcMqKSixcefjhh1O3s6nDUdq0aVPs4SSKwu2ljovOnTunbl955ZWJjqmYqGAlGlWl6DW1Sy1nrCQaY4wxxpgYjVpJzGSRRRYBoG3btiUeScOIXqVGWXLJJRMeSWmZOXNmzvvkx1S7ukpAV97yV0o9hPA+evfuDaS38GoMKDxcf6uNt956q9Z1NtpoowRGUn7U5El87bXXgPKLj4n6iXP5JzfeeGMALrzwwkTGlBTyTw8bNgwIszrR1nuKwKlkBg4cCMCsWbOAdCVRqn8lqP+V/00YY4wxxpiCUzkySgLsuOOOAGy66aYlHknD6N+/PwBz585N+9vY2nXtvvvuqdvvvPMOANOnTwfCd11JqDpu8uTJQHprrnPPPReAnXfeOfmBmaLTq1cvAPr27QtkV8lVESo/3v7775/Q6EqD1EHNnOy1116p+0477TQg3rKwXIiqvltvvTUAr7zySto6qmqutmr14447Lu1vtaIZSf2NqqODBw8uyZjqg5VEY4wxxhgTo0nUx1FGlOWgjDHGGGOqhFqldiuJxhhjjDEmhk8SjTHGGGNMDJ8kGmOMMcaYGD5JNMYYY4wxMXySaIwxxhhjYvgk0RhjjDHGxPBJojHGGGOMieGTRGOMMcYYE6NRteV78sknAbjnnnsAWGaZZQDYb7/9AFh99dUBWGmllUowOmOMMcaY8sFKojHGGGOMiVG1SuKwYcMAOOaYY1LLvv76ayAoiGpJ+McffwAwZswYAC688EIgKIzGlDuffPIJAM888wwAc+bMAeCiiy4CwrbepEnowrTqqqsC8PzzzwPQunXrZAZrauXHH38E4HAZlcEAACAASURBVOabbwbgkUceAeCdd96JrduyZUsA9txzTwCOP/54AFZZZZViD9OYkvDoo48CcM455wDhNx3C77gpDFYSjTHGGGNMjCZSGMqMeg/qs88+A2DLLbcE4OSTT07dt9FGGwHQpk0bIO49lBojqk1ZmTZtGgCjR48G4O23307d98UXXwAwduxYAGbOnAnANttsA8AWW2wBBLUCYL311gNgnnlKe63x66+/AnDttdcC2dWWESNGANCqVSsgbB+nnnoqEPyolcpvv/0GQIcOHQAYP3582v3ZlETRrl07AN57771iDrHO3HfffanbH330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Eo0xxhhjTApfJBpjjDHGmBSzFD0A03zeeustAE4++WQAbrjhBgDeeOMNABZddFEAjjrqqMp7dt11VwAWXHDB3MZp8ueOO+6oPL766qsBuPLKK6uWWW211QC46qqrAOjXr19OozNCx/DFF18MwL///W8AXnjhhar/A4wdOxaAffbZB4B55503t3HmweTJkwF4/vnnARg9ejQAM800U8337LjjjgDceOONLR6dMc3jqaeeAuDmm28G4J577gFggQUWqCyj1zbddFMALrnkEgBWXHHFlozJSqIxxhhjjEkx0//+97+ix5BFoYP65JNPALj22msrz910001AtRIDMGLECABOOeUUAOaZZ548hpiJlMIf/vCHAPzjH/+o+71rrLEGAOeddx4AP/jBD5o8umKZMWMGEJSZZ555Bgh3ZToOYnXi8ssvB2CnnXYCYM4558xnsE3kgQceAOC4444D4OGHH6689vXXX3f43hNOOAGAo48+ujWDayITJ04EYNKkSQD88Y9/rLy2/PLLAzBkyBAAjj/+eABmn332PIfYIZ9//jkAt9xyCwCHHnooAO+++27dnzFw4MCqz5h77rmbOcRcOOmkk4BwnAK8//77APz3v/8Fso/VWiyxxBIA/O53vwNg6623bt5gm8QXX3wBhGNTyqmO3SeffBKAoUOHVt6j2aAxY8YAsPjii+cz2Cbw4YcfAkEZ1ozGhAkTUssss8wyQJj10jE833zz5TLWViHF8NlnnwXgmmuuAcLvUT37to6Dn/3sZwCMHz++K0Pp9A9ZSTTGGGOMMSmsJAIvv/wyEPwr5557LgAvvfRSZZmZZ54ZgPnnnx+ADTfcEAh3fX/+858B2HzzzVs/4BrIh3PrrbdWPa+7koMPPhiAOeaYA4Dnnnuussydd94JwCyz/L9NVXfeu+++e9VntAPvvPMOAOPGjas8J3+dlJmkGpGlTui5VVddFYDDDjsMCMri9773vdasQDf48ssvAfjVr34FwIUXXgjAp59+CsDgwYMryyYVwm222QaAjz76CIBjjjkGCMpbmfjb3/4GhH3+zTffBML2+/73v19ZVird9OnTgbCe8uHusccerR9wJ5x44okAHHvssVXPL7vssgDsvPPOAPzkJz8BwqwBwAEHHACEfVv/l7LQp0+fFo26+2ibaFto9kP7cRaNKIladpdddgGCYlM0Wm+A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\n",
      "text/plain": [
       "<Figure size 648x648 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(9,9))\n",
    "example_images = np.r_[X[:12000:600], X[13000:30600:600], X[30600:60000:590]]\n",
    "plot_digits(example_images, images_per_row=10)\n",
    "save_fig(\"more_digits_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Binary classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_5 = (y_train == 5)\n",
    "y_test_5 = (y_test == 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
       "       eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
       "       learning_rate='optimal', loss='hinge', max_iter=5, n_iter=None,\n",
       "       n_jobs=1, penalty='l2', power_t=0.5, random_state=42, shuffle=True,\n",
       "       tol=None, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(max_iter=5, random_state=42)\n",
    "sgd_clf.fit(X_train, y_train_5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9502 , 0.96565, 0.96495])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9502\n",
      "0.96565\n",
      "0.96495\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.base import clone\n",
    "\n",
    "skfolds = StratifiedKFold(n_splits=3, random_state=42)\n",
    "\n",
    "for train_index, test_index in skfolds.split(X_train, y_train_5):\n",
    "    clone_clf = clone(sgd_clf)\n",
    "    X_train_folds = X_train[train_index]\n",
    "    y_train_folds = (y_train_5[train_index])\n",
    "    X_test_fold = X_train[test_index]\n",
    "    y_test_fold = (y_train_5[test_index])\n",
    "\n",
    "    clone_clf.fit(X_train_folds, y_train_folds)\n",
    "    y_pred = clone_clf.predict(X_test_fold)\n",
    "    n_correct = sum(y_pred == y_test_fold)\n",
    "    print(n_correct / len(y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self, X):\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.909  , 0.90715, 0.9128 ])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53272,  1307],\n",
       "       [ 1077,  4344]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_perfect_predictions = y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7687135020350381"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "precision_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7687135020350381"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4344 / (4344 + 1307)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.801328168234643"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.801328168234643"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4344 / (4344 + 1077)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7846820809248555"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7846820809248555"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4344 / (4344 + (1077 + 1307)/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([161855.74572176])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: there was an [issue](https://github.com/scikit-learn/scikit-learn/issues/9589) in Scikit-Learn 0.19.0 (fixed in 0.19.1) where the result of `cross_val_predict()` was incorrect in the binary classification case when using `method=\"decision_function\"`, as in the code above. The resulting array had an extra first dimension full of 0s. Just in case you are using 0.19.0, we need to add this small hack to work around this issue:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# hack to work around issue #9589 in Scikit-Learn 0.19.0\n",
    "if y_scores.ndim == 2:\n",
    "    y_scores = y_scores[:, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure precision_recall_vs_threshold_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "save_fig(\"precision_recall_vs_threshold_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(y_train_pred == (y_scores > 0)).all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_pred_90 = (y_scores > 70000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8659205116491548"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6993174691016417"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure precision_vs_recall_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"Recall\", fontsize=16)\n",
    "    plt.ylabel(\"Precision\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "save_fig(\"precision_vs_recall_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ROC curves"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure roc_curve_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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SWRkZPDiiy9yzTXX6HtNKVRwAuDkB//HrrSc4ufPjOrNeSdol28REQm8nTt30qxZM956662Q326hKnShroreWLqtuNx0a1mfzQ+eq3IjIiIBtWnTJj788EMArrrqKpYtW6ZyUwGN4FSStZZxry/n07V7AGhUL4IPx5+qYUIREQmot956i3HjxhEfH89ZZ51FZGQkERERTscKehrBqaShU78uLjf92jXg+0lnqtyIiEjAZGZmMmbMGEaOHEn37t35+uuviYzUnbj+0gjOUfJ4LX96bBFbDmQBMKRrU6Zd2dfhVCIiEkoyMjI48cQT+eWXX5g0aRL//Oc/CQvTt+yjoT+to5T88nfF5aZXmwSVGxERCbh69epx+eWXM3DgQAYPHux0nFpJl6iOwjcb9vP1hv0AJJ/clpk3DHA4kYiIhIqDBw9y+eWX89133wFwzz33qNxUgQqOnzbuy2D0i0sBGHxcE+69sJvm3IiISEB888039OzZk5kzZ/LTTz85HSckqOD4ISUzjz899kXx80cv7eFgGhERCRUej4f777+f008/nbCwMBYvXsw111zjdKyQoILjh8cWrCt+vODW00iM1e15IiJSddOnT2fy5MlcdtllrFy5kn79+jkdKWRoknEFNuzN4L9LtwHw3vUn06lpnMOJRESktktNTSUhIYErr7yShg0bMnToUE17CDCN4FRg0qwfAejZOoG+7RIdTiMiIrVZXl4et912G126dGHPnj243W4uuOAClZtqoBGccqzbnc7SzSkAXNizhcNpRESkNtuwYQMjR45k2bJl3HTTTcTHxzsdKaSp4JSj5Nybq09p72ASERGpzd544w2uu+46wsPDmTlzJsOGDXM6UshTwSnDxn0ZfPazbyuGJy7XXVMiIlI51lreeecdevTowRtvvEGbNm2cjlQnqOCUIq/AW3xb+EkdEhnWq5XDiUREpLZZvXo19evXp3379rz++utER0dru4UapEnGpbj/47XFj//yp04OJhERkdrGWsszzzxD//79ufXWWwGIi4tTualh+tM+wpb9mbz27VYA7h/WjZOPaehwIhERqS1SUlIYM2YMH3zwAeeeey7Tpk1zOlKdpYJzhMkf+JbIbpkQzej+bR1OIyIitcXatWs555xz2L17N48//jh/+ctfcLl0ocQpKjglpGTmFW+m+Y/zuzqcRkREapO2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8pTUFWvWrOHyyy8nKiqK7777joSEBE0kFhHB/0nGyyhjMT58C/ctCUycwHCr4EiIs9bywgsv0LdvX/bt28cDDzyAS4s/iYgU83cE535gnjHmQ+C/+O7GPs0Ycx1wGTComvJViu6gklB26NAhrr32Wt59912GDBnC9OnTadasmdOxRESCil8/8llrP8NXZHoAb+DbEeFx4DzgMmvtN9WWsBI0yVhCWXh4OBs2bODhhx9m3rx5KjciIqXwew6OtXamMWYWcDzQBN8dUD9aa73VFa6yMvIKnI4gElBer5f//Oc/JCUlERcXx9KlSwkPD3c6lohI0Dqqvais75arn6opS8D4cWOYSK2xe/durrzySj799FOstdx0000qNyIiFfB3ob8KF9Sw1r5T9TiB0ahepNMRRAJiwYIFJCUlcejQIZ5//nnGjh3rdCQRkVrB3xGct8o4XnKsJGgKjqbgSCiYNm0a48aN4/jjj+d///sf3bp1czqSiEit4W/B6VLKsYbA+cAlQHLAEgWA7qKSUHD22WczYcIE7r//fm23ICJylPwqONbadWW8tNgY4wFuAL4NWKoqMqjhSO309ttvM3v2bGbMmEGbNm144oknnI4kIlIrBWJlsM+BCwLwPgGjERypbbKyshg7diwjRoxg8+bNpKWlOR1JRKRWC0TB6QtkBeB9AkZbNUht8uOPP9KvXz9eeukl7rrrLr788ksaNGjgdCwRkVrN37uo7izlcATQDRgGTAtkqKpSv5HaoqCggGHDhpGRkcH8+fMZMmSI05FEREKCv5OMHyrlmAfYATwB3BuwRAGglYwl2KWmphIbG0t4eDhvvfUWrVu3pmnTpk7HEhEJGf5eooou5VektbadtfYua21Q7SauOTgSzL799lt69uzJP//5TwD69u2rciMiEmAVFhxjTATwT6CbtTa3xK+g26KhiObgSDDyer08+OCDDBw4EGMMF1wQVHPzRURCSoUFx1qbB/wFiK3+OIGhfiPBZvfu3Zx99tlMnDiR4cOHs2rVKvr37+90LBGRkOXvJarVQNfqDBJImoMjwWbXrl0sW7aMadOm8dZbbxEfH+90JBGRkObvJOM7genGmA3W2s+qM1AgqN5IMMjLy+PDDz9k+PDh9OrVi61bt1K/fn2nY4mI1An+juC8DCQA840x6caYX40x60v8KmulY0doBEectmnT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IZgZo0aNoqioKO6wRERE6lQiW3CalxTHHULs9u/fz3333UefPn0oKyujVatWXH/99UpuRESkICQywWlQ4A04W7ZsoV+/ftx88820bNmS3bt3xx2SiIhITiU0wSncDGfevHl06tSJBQsWMGnSJGbOnEnTpk3jDktERCSnEjkGp1BbcMrKyvjxj3/M4Ycfzty5czn11FPjDklERCQWiUxwCu25Lu+++y6tWrWipKSE559/njZt2tC4ceO4wxIREYlNIruoigoowfnDH/7AaaedxpgxYwBo3769khsRESl4iUxwCmEi7NLSUkaOHMmAAQM48cQTGTVqVNwhiYiI5I1EpgJJH2S8Zs0aunXrxqRJk7j55ptZuHAh7dq1izssERGRvKExOPVQgwYNKC0tZc6cOZx//vlxhyMiIpJ3EtqCE3cE2bd9+3YeeOAB3J0OHTrw5ptvKrkRERGpQiITnKQNMl66dCmdO3fmhhtuYNWqVQA0bJjIxjcREZGsSGSCs2P3vrhDyIr9+/czbtw4evTogbuzcOFCOnXqFHdYIiIieS+RzQAtmxwSdwhZMWTIEKZPn85FF13Egw8+yGGHHRZ3SCIiIvVCIhOcpHRQDRo0iF69enHFFVckfuC0iIhINiUywamv9u3bxx133MFhhx3GLbfcQr9+/eIOSUREpF5K5Bic+tjYsX79es4991zuuece3n33Xdw97pBERETqrUS24NS3BGfmzJlcccUVuDtPPvkkF110UdwhiYiI1GvJbMGpR6Nw1q1bx6WXXspJJ53EihUrlNyIiIhkQSJbcOqDLVu20Lp1a9q1a8dLL71Ejx49KC4ujjssERGRREhkC04+N+C4O5MnT6Zt27bMmTMHgN69eyu5ERERyaJEJjj5mt98/PHHXHzxxfzoRz+iR48enH766XGHJCIikkiJTHDy0SuvvELnzp2ZNWsW9957L7Nnz+bII4+MOywREZFESuQYnHx8KN7KlSsxMxYtWsSZZ54ZdzgiIiKJlsgWnHxJbzZv3sy8efMAuPLKK3nttdeU3IiIiORAIltw8sGLL77I0KFDgfAQv8aNG9O0adOYoxIRESkMyWzBibEJZ9++fdxyyy307duXVq1aMX/+fBo3bhxfQCIiIgUokS04cT3or7S0lN69e7N06VKuuuoqxo8fr+RGREQkBmrByaKSkhLOPfdcZs6c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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('False Positive Rate', fontsize=16)\n",
    "    plt.ylabel('True Positive Rate', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "save_fig(\"roc_curve_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9624496555967155"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_scores_forest = y_probas_forest[:, 1] # score = proba of positive class\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure roc_curve_comparison_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "save_fig(\"roc_curve_comparison_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9931243366003829"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9852973447443494"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8282604685482383"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multiclass classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-311402.62954431, -363517.28355739, -446449.5306454 ,\n",
       "        -183226.61023518, -414337.15339485,  161855.74572176,\n",
       "        -452576.39616343, -471957.14962573, -518542.33997148,\n",
       "        -536774.63961222]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.1, 0. , 0. , 0.1, 0. , 0.8, 0. , 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.84063187, 0.84899245, 0.86652998])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.91011798, 0.90874544, 0.906636  ])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5725,    3,   24,    9,   10,   49,   50,   10,   39,    4],\n",
       "       [   2, 6493,   43,   25,    7,   40,    5,   10,  109,    8],\n",
       "       [  51,   41, 5321,  104,   89,   26,   87,   60,  166,   13],\n",
       "       [  47,   46,  141, 5342,    1,  231,   40,   50,  141,   92],\n",
       "       [  19,   29,   41,   10, 5366,    9,   56,   37,   86,  189],\n",
       "       [  73,   45,   36,  193,   64, 4582,  111,   30,  193,   94],\n",
       "       [  29,   34,   44,    2,   42,   85, 5627,   10,   45,    0],\n",
       "       [  25,   24,   74,   32,   54,   12,    6, 5787,   15,  236],\n",
       "       [  52,  161,   73,  156,   10,  163,   61,   25, 5027,  123],\n",
       "       [  43,   35,   26,   92,  178,   28,    2,  223,   82, 5240]])"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_confusion_matrix(matrix):\n",
    "    \"\"\"If you prefer color and a colorbar\"\"\"\n",
    "    fig = plt.figure(figsize=(8,8))\n",
    "    ax = fig.add_subplot(111)\n",
    "    cax = ax.matshow(matrix)\n",
    "    fig.colorbar(cax)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure confusion_matrix_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.matshow(conf_mx, cmap=plt.cm.gray)\n",
    "save_fig(\"confusion_matrix_plot\", tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure confusion_matrix_errors_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAEFCAYAAAAsdjEBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAADUtJREFUeJzt3V+InfWZwPHvk2QSTLpRgxq0UBOWFt0SjduAyOKqoGwNLKtVNKysYUFSlHqhFL1xxaq98MJaUOsaDEHasotIFbElNwUpe1G2cTc1lIgkm6ZGG401WZ38aSbJsxdnsgSrc95xz2/emX2+HxjCjC8Pj5N85z1z/rwnMhNJ9czrewFJ/TB+qSjjl4oyfqko45eKMn6pKOOXiuo1/ohYFhEvRcShiNgTEX/f5z7DRMSiiNg0uevHEbEtIq7ve68uIuLLEXE0In7U9y5dRMS6iNgx+W9jV0Rc2fdOU4mIFRHxs4g4EBH7IuKpiFjQ915T6fvM/zRwDFgO3AY8ExFf7XelKS0A3gauAs4EHgBeiIgVPe7U1dPAr/peoouIuA54DPhH4M+Avwb+q9elhvsB8D5wPrCawb+Ru3rdaIje4o+IJcBNwD9l5nhm/hvwCvAPfe00TGYeysyHMvO3mXkyM18FdgNf63u3qUTEOuAg8PO+d+noO8DDmfnLye/zO5n5Tt9LDbESeCEzj2bmPmALMJtPZL2e+b8CHM/Mt0772q+Z5d+w00XEcgb/H7/pe5fPEhFLgYeBe/vepYuImA+sAc6NiJ0RsXfyJvQZfe82xPeBdRGxOCK+CFzP4AfArNVn/F8APvrE1/6bwc28WS8ixoAfA89n5pt97zOFR4BNmbm370U6Wg6MATcDVzK4CX0Zg1+xZrNfMDhxfQTsBbYCL/e60RB9xj8OLP3E15YCH/ewy7RExDzghwzur/hWz+t8pohYDVwLPNH3LtNwZPLPJzPz95n5AfA9YG2PO01p8t/DFuAnwBLgHOBsBvdbzFp9xv8WsCAivnza1y5lFt+EBoiIADYxOEPdlJkTPa80lauBFcDvImIf8G3gpoj4jz6XmkpmHmBw5jz95aaz/aWny4AvAU9l5h8z8w/AZmbxDyzoMf7MPMTgJ+XDEbEkIv4K+DsGZ9TZ7BngYuBvM/PIsIN7thH4cwY3nVcD/wz8FPibPpfqYDNwd0ScFxFnA/cAr/a802eavHWyG7gzIhZExFnAeuCNfjebWt8P9d0FnMHgIZJ/Ae7MzFl75o+IC4FvMghpX0SMT37c1vNqnyozD2fmvlMfDH7VOpqZ+/vebYhHGDws+RawA/hP4Lu9bjTcN4CvA/uBncAEgx9as1Z4MQ+ppr7P/JJ6YvxSUcYvFWX8UlHGLxVl/FJRsyL+iNjQ9w7TNdd2nmv7gju3NiviB+bMN+w0c23nubYvuHNTsyV+STOs2TP8ImLOPXVwbGys87EnT55k3rxuPztPnDjxeVcamcxk8Jqkbs44o/+Xz09MTEzr7+TIkTYvtVi4cGHnY0+cOMH8+fM7H3/06NHPs9JQmTn0L3tWX2Ps00znGztd5513XpO5Bw4caDIXmFbQ07Fq1aomc1vavn17k7krV65sMhfgzTdHfymI48ePdzrOm/1SUcYvFWX8UlHGLxVl/FJRneKfa++sI2m4rg/1nf7OOquBn0bEr2fzJbckTW3omX8uvrOOpOG63Oyf8++sI+lPdbnZ3/mddSZf0TRnXtggVdYl/s7vrJOZGxlcK35OPrdfqqTLzf45+c46kqY2NP45/M46kqbQ9Uk+c+qddSQN1+lx/sz8ELih8S6SZpBP75WKMn6pKOOXijJ+qaim1/DreoHL6Wh5McyzzjqrydyTJ082mQvw4YcfNpl78ODBJnN37drVZC5M7wKs03HNNdc0mQuwc+fOkc/s2ohnfqko45eKMn6pKOOXijJ+qSjjl4oyfqko45eKMn6pKOOXijJ+qSjjl4oyfqko45eKMn6pKOOXijJ+qSjjl4oyfqko45eKMn6pKOOXimp26e4lS5Zw6aWXjnzu+Pj4yGee8sYbbzSZe9999zWZC3DgwIEmc7ds2dJk7u23395kLsCePXuazL3hhnZvU/n888+PfOaxY8c6HeeZXyrK+KWijF8qyvilooxfKsr4paKMXypqaPwRsSgiNkXEnoj4OCK2RcT1M7GcpHa6nPkXAG8DVwFnAg8AL0TEinZrSWpt6DP8MvMQ8NBpX3o1InYDXwN+22YtSa1N+3f+iFgOfAX4zejXkTRTpvXc/ogYA34MPJ+Zb37Kf98AbABYuHDhSBaU1EbnM39EzAN+CBwDvvVpx2Tmxsxck5lrxsbGRrSipBY6nfkjIoBNwHJgbWZONN1KUnNdb/Y/A1wMXJuZRxruI2mGdHmc/0Lgm8BqYF9EjE9+3NZ8O0nNdHmobw8QM7CLpBnk03ulooxfKsr4paKMXyqq2dV7M7PzVUSnY8GCZivz3HPPNZl7xx13NJkLMHgKxuidPHmyydxVq1Y1mQuDK0a3sHv37iZzAW699daRz3zppZc6HeeZXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyviloiIzmwweGxvLZcuWjXzu4sWLRz7zlDPPPLPJ3J07dzaZC3Do0KEmc1t9ny+//PImcwHef//9JnOvuOKKJnMB7r///pHPvPHGG9m+ffvQa7p75peKMn6pKOOXijJ+qSjjl4oyfqko45eKmlb8EfHliDgaET9qtZCkmTHdM//TwK9aLCJpZnWOPyLWAQeBn7dbR9JM6RR/RCwFHgbubbuOpJmyoONxjwCbMnNvxGc/ZTgiNgAbAObN875EaTYbGn9ErAauBS4bdmxmbgQ2wuCFPf/n7SQ10+XMfzWwAvjd5Fn/C8D8iPiLzPzLdqtJaqlL/BuBfz3t828z+GFwZ4uFJM2MofFn5mHg8KnPI2IcOJqZ+1suJqmtrnf4/a/MfKjBHpJmmHfJS0UZv1SU8UtFGb9U1LTv8Otq6dKlXHfddSOfu2vXrpHPPGV8fLzJ3HfffbfJXID169c3mfvyyy83mbt27domcwGeffbZJnMff/zxJnMBHn300ZHP3L+/2wNxnvmlooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paIis807aS9atCgvuOCCFnNHPvOUJUuWNJm7bdu2JnMBLrnkkiZzL7ts6Duyfy6bN29uMhfa/f1ddNFFTeYCvP76603mZmYMO8Yzv1SU8UtFGb9UlPFLRRm/VJTxS0UZv1RU5/gjYl1E7IiIQxGxKyKubLmYpLY6vUV3RFwHPAbcCvw7cH7LpSS11yl+4DvAw5n5y8nP32m0j6QZMvRmf0TMB9YA50bEzojYGxFPRcQZ7deT1EqX3/mXA2PAzcCVwGrgMuCBTx4YERsiYmtEbD1x4sRIF5U0Wl3iPzL555OZ+fvM/AD4HrD2kwdm5sbMXJOZa+bPnz/KPSWN2ND4M/MAsBc4/eV/bV4KKGnGdH2obzNwd0ScFxFnA/cAr7ZbS1JrXe/tfwQ4B3gLOAq8AHy31VKS2usUf2ZOAHdNfkj6f8Cn90pFGb9UlPFLRRm/VJTxS0V1fahv2jKTiYmJkc89duzYyGeecvHFFzeZe/DgwSZzARYvXtxk7osvvthk7sKFC5vMBTh06FCTubt27WoyFwadjNqaNWs6HeeZXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qyvilooxfKsr4paKMXyrK+KWijF8qqtnVexctWsTKlStHPvfBBx8c+cxTNm7c2GTuk08+2WQuwC233NJk7iuvvNJk7mOPPdZkLsCOHTuazH377bebzAV44oknRj7zvffe63ScZ36pKOOXijJ+qSjjl4oyfqko45eKMn6pqE7xR8SKiPhZRByIiH0R8VRENHuOgKT2up75fwC8D5wPrAauAu5qtZSk9rrGvxJ4ITOPZuY+YAvw1XZrSWqta/zfB9ZFxOKI+CJwPYMfAJLmqK7x/4LBmf4jYC+wFXj5kwdFxIaI2BoRWycmJka3paSRGxp/RMxjcJb/CbAEOAc4G/iTV2hk5sbMXJOZa8bGxka9q6QR6nLmXwZ8CXgqM/+YmX8ANgNrm24mqamh8WfmB8Bu4M6IWBARZwHrgTdaLyepna6/838D+DqwH9gJTAD3tFpKUnudnqiTmduAq9uuImkm+fReqSjjl4oyfqko45eKMn6pqGYvyz1x4gTj4+Mjn3v33XePfOYphw8fbjL33HPPbTIX4LXXXmsy9+abb24yt+VlsI8fP95k7vr165vMBbj33nubzR7GM79UlPFLRRm/VJTxS0UZv1SU8UtFGb9UlPFLRRm/VJTxS0UZv1SU8UtFGb9UlPFLRRm/VJTxS0UZv1SU8UtFGb9UlPFLRRm/VFRkZpvBEfuBPR0PPwf4oMki7cy1nefavuDOn9eFmTn0ktHN4p+OiNiamWv63mM65trOc21fcOfWvNkvFWX8UlGzJf6NfS/wOcy1nefavuDOTc2K3/klzbzZcuaXNMOMXyrK+KWijF8qyvilov4HwKH6qmoAkLAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "save_fig(\"confusion_matrix_errors_plot\", tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure error_analysis_digits_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAI0CAYAAAAdqSPKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsnXmgjOX7xj/aSLKUIhSFtGmVNtIi2bOVaBGplGiVkEgRypKUpWQpshNKKltpUSiUSPkqWUqpFCKc3x/zu573PXPmjDnnzHbO3J9/DjPvzDwz887zPs91X/d950tLS8MwDMMwDCMVOCzRAzAMwzAMw4gXtvAxDMMwDCNlsIWPYRiGYRgpgy18DMMwDMNIGWzhYxiGYRhGymALH8MwDMMwUgZb+BiGYRiGkTLYwscwDMMwjJTBFj6GYRiGYaQMRyR6AJlg5aQNI++QL9EDCIPNNYaRd4horjHFxzAMwzCMlMEWPoZhGIZhpAy28DEMwzAMI2WwhY9hGIZhGCmDLXwMwzAMw0gZbOFjGIZhGEbKkKzp7IZhJICff/4ZgFdeeQWAfv36sXfvXgDatGkDwMiRIwE4/PDDEzDC3Mmff/4JQLFixdxtb7/9NgB169aNyxj+/vtvADp37gzA8OHDMxxzxhlnANCkSRN32+OPPw5AoUKFYj1Ew4gLpvgYhmEYhpEy5EtLS8r6XUk5qFgyduxYAL788kt32++//w7AG2+8AUDr1q0pU6YMAOeff366v+XKleOww3LHOnbRokXp/j711FNhj7/qqqsAWLhwYQxHlTlPPPEEAC+//DJ//PEHAGeeeSYADz74IADNmzenSJEiCRlfTtm9ezfjx48HPDVA7zOz4wGOPvroSF8i5QsY/vPPPwCce+65AGzcuJFLL70UgE8++SQeQ+DXX38F4MILLwQCKtSePXsO+biOHTsCMGjQoNgNLgFs3LgRgL/++guAUqVKccIJJyRwRKFZvXo1AFu3bgVgzZo17jqxZcsWAD744AN3/HXXXQfAe++9F89hRszKlSsBb+wVKlQAoGLFipk+pmfPnu46MXfuXABq164d6tCI5po8u/CZNm0aAH369AHSLyj0nvPlS/8ZDRs2jHvuuSenL50lXn/9dQC6du0KwObNm8Men9nYmzVr5sZepUoVgIReiIMXNfp/TkjUufrYY48B8Nxzz2V6zNlnn02PHj0AaNy4MQBHHJGckeT//vsPgLVr1wKBRdu33357yMfde++9AAwdOhQgKwvtlF/4iL59+wKB3/sxxxwD4BadDRs2jOdQmDhxIj179kx3mxZousj6OXDgQDyGFRMUrl2zZg0TJ04EYMaMGQCsX78eCPy+H330UQDmzJkDeIv8U045xS1UY8FPP/0EeBuO2bNnu2vYunXrAPj3338BqFSpktt4XXHFFQBuATtr1iyWLVsGwMGDB2M23nB8+OGH3HzzzYAXOtUi5/fff3fnmL6TggULAlC1alUXYi9fvny65+zZsye9evUC4J133gFytvDJHRKBYRiGYRhGFEjOLWkOadiwoZP5tLsNVkhC3fbAAw+44++///4YjzKADKKnn346AHXq1MlwjMJZX331lbvt/fffB+DHH38EYOrUqUydOhWAV199FfDMqIng6quvTthrR5trr70WgOOOO45zzjkn3X3alb355pvcdNNNgBf+SrbQwPz58wF46KGHAE9CPxT58+cHAqFWyJLSY/w/2q0vXrzY3SZFMFHK7M033+x25qJly5YATJo0yd3mNzrnJjZu3Mjnn38OwIABAwBYtmxZBiXk2GOPBQKK/4svvghA2bJlAfjoo4+AwLUhWoqPrjHvv/8+3bp1A7x5XApTqVKluPHGGwHPBiEqVqzowsxSTZ5++mkg8J4VCoo3d955JxC4FslIv23bNsA710877TTq168PeFYOzUOLFi3ioosuArxkAD9FixYFoHr16jkeq81ghmEYhmGkDHnS41OrVi0X5xw3bhzgGfr8zJs3D8Ctun/55Rdq1qyZ7r5Yo89f8fNIfSFa6cso1qtXLxf71HN8//33QCA+HW9CKWxCZuUaNWq42+Q10N9QhuckPVcB+Pzzz6lXrx7gfZf6/I877riEjctPrVq1AE8tjJQnn3wSOLQJPQx51uOzdu1a9z0LqSWLFy+me/fugKfq+BUWqQr/+9//cjKEqLBjxw4ALr/8ciDgeyldujTgeSqC1c5kQ0rOiBEjgEApBikpfqTc6Lu44447ANi/f78zmvfu3RuARo0aAfDwww9z1FFH5Wh88rnICzhq1CjnZWnatGm61zuUurRhwwYApwrJqD137lyqVq2ao3FmF5VHmDt3Ls2aNQO89yzDdajrsDxWlSpVolKlSgAZ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KbCFj2EY8cBCXYZhGIZhGH5s4WMYhmEYRspgCx/DMAzDMFIGW/gYhmEYhpEy2MLHMAzDMIyUwRY+hmEYhmGkDLbwMQzDMAwjZbCFj2EYhmEYKYMtfAzDMAzDSBls4WMYhmEYRspgCx/DMAzDMFIGW/gYhmEYhpEyHJHoARh5h23btgHw7rvvutt+//13ADp16pTh+Ndeew0IdCxv1qxZHEZoGEakDBw4EIAPPvgAgLlz57r7ChQoAMBNN90EwPPPPw/ACSecEM8hGka2sO7sSci8efMAWLlyJQAff/wxALNmzYro8U8//TQA999/PwBFixaN9hD5559/WLt2LQCPPfYYAH/++ScAq1ev5sCBAwAcfvjhmT6HjilYsCBVq1YF4M033wSgRIkSUR9zTtm6dSvNmzcH4KOPPsr0uEqVKgHQu3dvAJo2bRrTcek3PHfuXHr16gXA0qVL0x1z3HHH0b59+3S33XrrrQCcfvrpMR0feaA7uxbw06dPB+Czzz4DvMV7ZgwYMACAE088EfA+82Tj66+/BmDGjBkATJ06ldWrVwOBjQnANddcA0DNmjX5+eefAejXrx8AF1xwAQArVqyI36D/n927dwPefBKKY489Nl7DyRY9e/bMcNtTTz11yMddddVVACxcuDDKI4od//77LwBz5swB4K233gLgjTfecMdceumlAEybNg2AUqVKRfr01p3dMAzDMAzDT55QfLS7ff311wFo166du2/s2LEAfPHFF+62VatWAXDMMccAULp0aSCwqpSEW758eQC3wz/jjDM44ojYRQbfeecdICAZazeplXF2qVGjBgCTJ0+OugQ9ZswY7rrrrkzvz4ri4z9GO+SOHTtGY5hRQbvhm266yalc+t3ky5f5BkPn0ooVKzjjjDNiNr69e/cCcPTRR2fpcQovXnnlldx7771A+O8rB+R6xUfqq5SNrHLUUUcBcP755wMwdOhQqlSpkq3niiYvvvgiAI888gjgzYn16tVj0KBBABQuXBiA/Pnzu8dt2bIF8ObOOnXqAN48Fiv2798PwPbt2wGYNGmSC7NpTKF46KGHAOjcubNT35KBq6++GoBFixbl6HmSXfn57bffgED4VCHTv/76CwicawAtW7Z0UQPdpvPyueeei/SlTPExDMMwDMPwkycUH6kyU6dODTw4LS3sTjyS3XrwMR9//LGLO0aT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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223); plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); plot_digits(X_bb[:25], images_per_row=5)\n",
    "save_fig(\"error_analysis_digits_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multilabel classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Warning**: the following cell may take a very long time (possibly hours depending on your hardware)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97709078477525002"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3, n_jobs=-1)\n",
    "f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multioutput classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure noisy_digit_example_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121); plot_digit(X_test_mod[some_index])\n",
    "plt.subplot(122); plot_digit(y_test_mod[some_index])\n",
    "save_fig(\"noisy_digit_example_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure cleaned_digit_example_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])\n",
    "plot_digit(clean_digit)\n",
    "save_fig(\"cleaned_digit_example_plot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Extra material"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dummy (ie. random) classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.dummy import DummyClassifier\n",
    "dmy_clf = DummyClassifier()\n",
    "y_probas_dmy = cross_val_predict(dmy_clf, X_train, y_train_5, cv=3, method=\"predict_proba\")\n",
    "y_scores_dmy = y_probas_dmy[:, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fprr, tprr, thresholdsr = roc_curve(y_train_5, y_scores_dmy)\n",
    "plot_roc_curve(fprr, tprr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## KNN classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=-1, n_neighbors=4, p=2,\n",
       "           weights='distance')"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "knn_clf = KNeighborsClassifier(n_jobs=-1, weights='distance', n_neighbors=4)\n",
    "knn_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_knn_pred = knn_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9714"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_score(y_test, y_knn_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.ndimage.interpolation import shift\n",
    "def shift_digit(digit_array, dx, dy, new=0):\n",
    "    return shift(digit_array.reshape(28, 28), [dy, dx], cval=new).reshape(784)\n",
    "\n",
    "plot_digit(shift_digit(some_digit, 5, 1, new=100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((300000, 784), (300000,))"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_expanded = [X_train]\n",
    "y_train_expanded = [y_train]\n",
    "for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):\n",
    "    shifted_images = np.apply_along_axis(shift_digit, axis=1, arr=X_train, dx=dx, dy=dy)\n",
    "    X_train_expanded.append(shifted_images)\n",
    "    y_train_expanded.append(y_train)\n",
    "\n",
    "X_train_expanded = np.concatenate(X_train_expanded)\n",
    "y_train_expanded = np.concatenate(y_train_expanded)\n",
    "X_train_expanded.shape, y_train_expanded.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=-1, n_neighbors=4, p=2,\n",
       "           weights='distance')"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_expanded, y_train_expanded)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_knn_expanded_pred = knn_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97629999999999995"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(y_test, y_knn_expanded_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.       ,  0.       ,  0.5053645,  0.       ,  0.       ,\n",
       "         0.       ,  0.       ,  0.4946355,  0.       ,  0.       ]])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ambiguous_digit = X_test[2589]\n",
    "knn_clf.predict_proba([ambiguous_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feeb157ada0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_digit(ambiguous_digit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Exercise solutions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. An MNIST Classifier With Over 97% Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 6 candidates, totalling 30 fits\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n",
      "[CV]  n_neighbors=3, weights=uniform, score=0.9698458975426906, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed: 47.8min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_neighbors=3, weights=uniform, score=0.9714214297617064, total= 9.9min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed: 95.2min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_neighbors=3, weights=uniform, score=0.9726666666666667, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n",
      "[CV]  n_neighbors=3, weights=uniform, score=0.9728265399683255, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=uniform ..................................\n",
      "[CV]  n_neighbors=3, weights=uniform, score=0.9717405801933978, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9712619741774261, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9725879020163306, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV] .... n_neighbors=3, weights=distance, score=0.9745, total= 9.5min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9743269150620989, total= 9.6min\n",
      "[CV] n_neighbors=3, weights=distance .................................\n",
      "[CV]  n_neighbors=3, weights=distance, score=0.9724074691563854, total= 9.4min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9691795085381091, total= 9.7min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9698383602732877, total= 9.4min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9718333333333333, total= 9.1min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9709093940151705, total= 9.2min\n",
      "[CV] n_neighbors=4, weights=uniform ..................................\n",
      "[CV]  n_neighbors=4, weights=uniform, score=0.9680726908969657, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9714285714285714, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9729211798033661, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9745833333333334, total= 9.4min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9752438109527382, total= 9.3min\n",
      "[CV] n_neighbors=4, weights=distance .................................\n",
      "[CV]  n_neighbors=4, weights=distance, score=0.9720740246748917, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9693461057892545, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9699216797200466, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9726666666666667, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.9713261648745519, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=uniform ..................................\n",
      "[CV]  n_neighbors=5, weights=uniform, score=0.969406468822941, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9711786755518534, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9712547908681887, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9738333333333333, total= 9.4min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9724931232808202, total= 9.3min\n",
      "[CV] n_neighbors=5, weights=distance .................................\n",
      "[CV]  n_neighbors=5, weights=distance, score=0.9714904968322774, total= 9.3min\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done  30 out of  30 | elapsed: 1399.4min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform'),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid=[{'n_neighbors': [3, 4, 5], 'weights': ['uniform', 'distance']}],\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "       scoring=None, verbose=3)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "param_grid = [{'weights': [\"uniform\", \"distance\"], 'n_neighbors': [3, 4, 5]}]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "grid_search = GridSearchCV(knn_clf, param_grid, cv=5, verbose=3, n_jobs=-1)\n",
    "grid_search.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'n_neighbors': 4, 'weights': 'distance'}"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97324999999999995"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97140000000000004"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "y_pred = grid_search.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Data Augmentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.ndimage.interpolation import shift"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def shift_image(image, dx, dy):\n",
    "    image = image.reshape((28, 28))\n",
    "    shifted_image = shift(image, [dy, dx], cval=0, mode=\"constant\")\n",
    "    return shifted_image.reshape([-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7feed40e0e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "image = X_train[1000]\n",
    "shifted_image_down = shift_image(image, 0, 5)\n",
    "shifted_image_left = shift_image(image, -5, 0)\n",
    "\n",
    "plt.figure(figsize=(12,3))\n",
    "plt.subplot(131)\n",
    "plt.title(\"Original\", fontsize=14)\n",
    "plt.imshow(image.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.subplot(132)\n",
    "plt.title(\"Shifted down\", fontsize=14)\n",
    "plt.imshow(shifted_image_down.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.subplot(133)\n",
    "plt.title(\"Shifted left\", fontsize=14)\n",
    "plt.imshow(shifted_image_left.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train_augmented = [image for image in X_train]\n",
    "y_train_augmented = [label for label in y_train]\n",
    "\n",
    "for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):\n",
    "    for image, label in zip(X_train, y_train):\n",
    "        X_train_augmented.append(shift_image(image, dx, dy))\n",
    "        y_train_augmented.append(label)\n",
    "\n",
    "X_train_augmented = np.array(X_train_augmented)\n",
    "y_train_augmented = np.array(y_train_augmented)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "shuffle_idx = np.random.permutation(len(X_train_augmented))\n",
    "X_train_augmented = X_train_augmented[shuffle_idx]\n",
    "y_train_augmented = y_train_augmented[shuffle_idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "knn_clf = KNeighborsClassifier(**grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=4, p=2,\n",
       "           weights='distance')"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_augmented, y_train_augmented)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.97629999999999995"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = knn_clf.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By simply augmenting the data, we got a 0.5% accuracy boost. :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Tackle the Titanic dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The goal is to predict whether or not a passenger survived based on attributes such as their age, sex, passenger class, where they embarked and so on."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, login to [Kaggle](https://www.kaggle.com/) and go to the [Titanic challenge](https://www.kaggle.com/c/titanic) to download `train.csv` and `test.csv`. Save them to the `datasets/titanic` directory."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, let's load the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "TITANIC_PATH = os.path.join(\"datasets\", \"titanic\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "def load_titanic_data(filename, titanic_path=TITANIC_PATH):\n",
    "    csv_path = os.path.join(titanic_path, filename)\n",
    "    return pd.read_csv(csv_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = load_titanic_data(\"train.csv\")\n",
    "test_data = load_titanic_data(\"test.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The data is already split into a training set and a test set. However, the test data does *not* contain the labels: your goal is to train the best model you can using the training data, then make your predictions on the test data and upload them to Kaggle to see your final score."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a peek at the top few rows of the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "3      0            113803  53.1000  C123        S  \n",
       "4      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The attributes have the following meaning:\n",
    "* **Survived**: that's the target, 0 means the passenger did not survive, while 1 means he/she survived.\n",
    "* **Pclass**: passenger class.\n",
    "* **Name**, **Sex**, **Age**: self-explanatory\n",
    "* **SibSp**: how many siblings & spouses of the passenger aboard the Titanic.\n",
    "* **Parch**: how many children & parents of the passenger aboard the Titanic.\n",
    "* **Ticket**: ticket id\n",
    "* **Fare**: price paid (in pounds)\n",
    "* **Cabin**: passenger's cabin number\n",
    "* **Embarked**: where the passenger embarked the Titanic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's get more info to see how much data is missing:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      "PassengerId    891 non-null int64\n",
      "Survived       891 non-null int64\n",
      "Pclass         891 non-null int64\n",
      "Name           891 non-null object\n",
      "Sex            891 non-null object\n",
      "Age            714 non-null float64\n",
      "SibSp          891 non-null int64\n",
      "Parch          891 non-null int64\n",
      "Ticket         891 non-null object\n",
      "Fare           891 non-null float64\n",
      "Cabin          204 non-null object\n",
      "Embarked       889 non-null object\n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.6+ KB\n"
     ]
    }
   ],
   "source": [
    "train_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, the **Age**, **Cabin** and **Embarked** attributes are sometimes null (less than 891 non-null), especially the **Cabin** (77% are null). We will ignore the **Cabin** for now and focus on the rest. The **Age** attribute has about 19% null values, so we will need to decide what to do with them. Replacing null values with the median age seems reasonable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The **Name** and **Ticket** attributes may have some value, but they will be a bit tricky to convert into useful numbers that a model can consume. So for now, we will ignore them."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at the numerical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>223.500000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>20.125000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>7.910400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>668.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>38.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>31.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "25%     223.500000    0.000000    2.000000   20.125000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "75%     668.500000    1.000000    3.000000   38.000000    1.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "25%      0.000000    7.910400  \n",
       "50%      0.000000   14.454200  \n",
       "75%      0.000000   31.000000  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Yikes, only 38% **Survived**. :(  That's close enough to 40%, so accuracy will be a reasonable metric to evaluate our model.\n",
    "* The mean **Fare** was £32.20, which does not seem so expensive (but it was probably a lot of money back then).\n",
    "* The mean **Age** was less than 30 years old."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check that the target is indeed 0 or 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    549\n",
       "1    342\n",
       "Name: Survived, dtype: int64"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Survived\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's take a quick look at all the categorical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3    491\n",
       "1    216\n",
       "2    184\n",
       "Name: Pclass, dtype: int64"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Pclass\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "male      577\n",
       "female    314\n",
       "Name: Sex, dtype: int64"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Sex\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "S    644\n",
       "C    168\n",
       "Q     77\n",
       "Name: Embarked, dtype: int64"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"Embarked\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Embarked attribute tells us where the passenger embarked: C=Cherbourg, Q=Queenstown, S=Southampton."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's build our preprocessing pipelines. We will reuse the `DataframeSelector` we built in the previous chapter to select specific attributes from the `DataFrame`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "# A class to select numerical or categorical columns \n",
    "# since Scikit-Learn doesn't handle DataFrames yet\n",
    "class DataFrameSelector(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, attribute_names):\n",
    "        self.attribute_names = attribute_names\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X):\n",
    "        return X[self.attribute_names]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build the pipeline for the numerical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import Imputer\n",
    "\n",
    "imputer = Imputer(strategy=\"median\")\n",
    "\n",
    "num_pipeline = Pipeline([\n",
    "        (\"select_numeric\", DataFrameSelector([\"Age\", \"SibSp\", \"Parch\", \"Fare\"])),\n",
    "        (\"imputer\", Imputer(strategy=\"median\")),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[22.    ,  1.    ,  0.    ,  7.25  ],\n",
       "       [38.    ,  1.    ,  0.    , 71.2833],\n",
       "       [26.    ,  0.    ,  0.    ,  7.925 ],\n",
       "       ...,\n",
       "       [28.    ,  1.    ,  2.    , 23.45  ],\n",
       "       [26.    ,  0.    ,  0.    , 30.    ],\n",
       "       [32.    ,  0.    ,  0.    ,  7.75  ]])"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_pipeline.fit_transform(train_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will also need an imputer for the string categorical columns (the regular `Imputer` does not work on those):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Inspired from stackoverflow.com/questions/25239958\n",
    "class MostFrequentImputer(BaseEstimator, TransformerMixin):\n",
    "    def fit(self, X, y=None):\n",
    "        self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X],\n",
    "                                        index=X.columns)\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        return X.fillna(self.most_frequent_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can convert each categorical value to a one-hot vector using a `OneHotEncoder`. Right now this class can only handle integer categorical inputs, but in Scikit-Learn 0.20 it will also handle string categorical inputs (see [PR #10521](https://github.com/scikit-learn/scikit-learn/issues/10521)). So for now we import it from `future_encoders.py`, but when Scikit-Learn 0.20 is released, you can import it from `sklearn.preprocessing` instead:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "from future_encoders import OneHotEncoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can build the pipeline for the categorical attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "cat_pipeline = Pipeline([\n",
    "        (\"select_cat\", DataFrameSelector([\"Pclass\", \"Sex\", \"Embarked\"])),\n",
    "        (\"imputer\", MostFrequentImputer()),\n",
    "        (\"cat_encoder\", OneHotEncoder(sparse=False)),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 1., ..., 0., 0., 1.],\n",
       "       [1., 0., 0., ..., 1., 0., 0.],\n",
       "       [0., 0., 1., ..., 0., 0., 1.],\n",
       "       ...,\n",
       "       [0., 0., 1., ..., 0., 0., 1.],\n",
       "       [1., 0., 0., ..., 1., 0., 0.],\n",
       "       [0., 0., 1., ..., 0., 1., 0.]])"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cat_pipeline.fit_transform(train_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, let's join the numerical and categorical pipelines:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import FeatureUnion\n",
    "preprocess_pipeline = FeatureUnion(transformer_list=[\n",
    "        (\"num_pipeline\", num_pipeline),\n",
    "        (\"cat_pipeline\", cat_pipeline),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cool! Now we have a nice preprocessing pipeline that takes the raw data and outputs numerical input features that we can feed to any Machine Learning model we want."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[22.,  1.,  0., ...,  0.,  0.,  1.],\n",
       "       [38.,  1.,  0., ...,  1.,  0.,  0.],\n",
       "       [26.,  0.,  0., ...,  0.,  0.,  1.],\n",
       "       ...,\n",
       "       [28.,  1.,  2., ...,  0.,  0.,  1.],\n",
       "       [26.,  0.,  0., ...,  1.,  0.,  0.],\n",
       "       [32.,  0.,  0., ...,  0.,  1.,  0.]])"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = preprocess_pipeline.fit_transform(train_data)\n",
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's not forget to get the labels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train_data[\"Survived\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are now ready to train a classifier. Let's start with an `SVC`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
       "  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',\n",
       "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
       "  tol=0.001, verbose=False)"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svm_clf = SVC()\n",
    "svm_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great, our model is trained, let's use it to make predictions on the test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = preprocess_pipeline.transform(test_data)\n",
    "y_pred = svm_clf.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now we could just build a CSV file with these predictions (respecting the format excepted by Kaggle), then upload it and hope for the best. But wait! We can do better than hope. Why don't we use cross-validation to have an idea of how good our model is?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7365250822835092"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "svm_scores = cross_val_score(svm_clf, X_train, y_train, cv=10)\n",
    "svm_scores.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, over 73% accuracy, clearly better than random chance, but it's not a great score. Looking at the [leaderboard](https://www.kaggle.com/c/titanic/leaderboard) for the Titanic competition on Kaggle, you can see that you need to reach above 80% accuracy to be within the top 10% Kagglers. Some reached 100%, but since you can easily find the [list of victims](https://www.encyclopedia-titanica.org/titanic-victims/) of the Titanic, it seems likely that there was little Machine Learning involved in their performance! ;-) So let's try to build a model that reaches 80% accuracy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's try a `RandomForestClassifier`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8115690614005221"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "forest_clf = RandomForestClassifier(random_state=42)\n",
    "forest_scores = cross_val_score(forest_clf, X_train, y_train, cv=10)\n",
    "forest_scores.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's much better!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Instead of just looking at the mean accuracy across the 10 cross-validation folds, let's plot all 10 scores for each model, along with a box plot highlighting the lower and upper quartiles, and \"whiskers\" showing the extent of the scores (thanks to Nevin Yilmaz for suggesting this visualization). Note that the `boxplot()` function detects outliers (called \"fliers\") and does not include them within the whiskers. Specifically, if the lower quartile is $Q_1$ and the upper quartile is $Q_3$, then the interquartile range $IQR = Q_3 - Q_1$ (this is the box's height), and any score lower than $Q_1 - 1.5 \\times IQR$ is a flier, and so is any score greater than $Q3 + 1.5 \\times IQR$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 4))\n",
    "plt.plot([1]*10, svm_scores, \".\")\n",
    "plt.plot([2]*10, forest_scores, \".\")\n",
    "plt.boxplot([svm_scores, forest_scores], labels=(\"SVM\",\"Random Forest\"))\n",
    "plt.ylabel(\"Accuracy\", fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To improve this result further, you could:\n",
    "* Compare many more models and tune hyperparameters using cross validation and grid search,\n",
    "* Do more feature engineering, for example:\n",
    "  * replace **SibSp** and **Parch** with their sum,\n",
    "  * try to identify parts of names that correlate well with the **Survived** attribute (e.g. if the name contains \"Countess\", then survival seems more likely),\n",
    "* try to convert numerical attributes to categorical attributes: for example, different age groups had very different survival rates (see below), so it may help to create an age bucket category and use it instead of the age. Similarly, it may be useful to have a special category for people traveling alone since only 30% of them survived (see below)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgeBucket</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0.0</th>\n",
       "      <td>0.576923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15.0</th>\n",
       "      <td>0.362745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30.0</th>\n",
       "      <td>0.423256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45.0</th>\n",
       "      <td>0.404494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60.0</th>\n",
       "      <td>0.240000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75.0</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           Survived\n",
       "AgeBucket          \n",
       "0.0        0.576923\n",
       "15.0       0.362745\n",
       "30.0       0.423256\n",
       "45.0       0.404494\n",
       "60.0       0.240000\n",
       "75.0       1.000000"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"AgeBucket\"] = train_data[\"Age\"] // 15 * 15\n",
    "train_data[[\"AgeBucket\", \"Survived\"]].groupby(['AgeBucket']).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RelativesOnboard</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.303538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.552795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.578431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.724138</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.136364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  Survived\n",
       "RelativesOnboard          \n",
       "0                 0.303538\n",
       "1                 0.552795\n",
       "2                 0.578431\n",
       "3                 0.724138\n",
       "4                 0.200000\n",
       "5                 0.136364\n",
       "6                 0.333333\n",
       "7                 0.000000\n",
       "10                0.000000"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[\"RelativesOnboard\"] = train_data[\"SibSp\"] + train_data[\"Parch\"]\n",
    "train_data[[\"RelativesOnboard\", \"Survived\"]].groupby(['RelativesOnboard']).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Spam classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's fetch the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import tarfile\n",
    "from six.moves import urllib\n",
    "\n",
    "DOWNLOAD_ROOT = \"http://spamassassin.apache.org/old/publiccorpus/\"\n",
    "HAM_URL = DOWNLOAD_ROOT + \"20030228_easy_ham.tar.bz2\"\n",
    "SPAM_URL = DOWNLOAD_ROOT + \"20030228_spam.tar.bz2\"\n",
    "SPAM_PATH = os.path.join(\"datasets\", \"spam\")\n",
    "\n",
    "def fetch_spam_data(spam_url=SPAM_URL, spam_path=SPAM_PATH):\n",
    "    if not os.path.isdir(spam_path):\n",
    "        os.makedirs(spam_path)\n",
    "    for filename, url in ((\"ham.tar.bz2\", HAM_URL), (\"spam.tar.bz2\", SPAM_URL)):\n",
    "        path = os.path.join(spam_path, filename)\n",
    "        if not os.path.isfile(path):\n",
    "            urllib.request.urlretrieve(url, path)\n",
    "        tar_bz2_file = tarfile.open(path)\n",
    "        tar_bz2_file.extractall(path=SPAM_PATH)\n",
    "        tar_bz2_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "fetch_spam_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, let's load all the emails:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "HAM_DIR = os.path.join(SPAM_PATH, \"easy_ham\")\n",
    "SPAM_DIR = os.path.join(SPAM_PATH, \"spam\")\n",
    "ham_filenames = [name for name in sorted(os.listdir(HAM_DIR)) if len(name) > 20]\n",
    "spam_filenames = [name for name in sorted(os.listdir(SPAM_DIR)) if len(name) > 20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2500"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ham_filenames)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "500"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(spam_filenames)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use Python's `email` module to parse these emails (this handles headers, encoding, and so on):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [],
   "source": [
    "import email\n",
    "import email.policy\n",
    "\n",
    "def load_email(is_spam, filename, spam_path=SPAM_PATH):\n",
    "    directory = \"spam\" if is_spam else \"easy_ham\"\n",
    "    with open(os.path.join(spam_path, directory, filename), \"rb\") as f:\n",
    "        return email.parser.BytesParser(policy=email.policy.default).parse(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "ham_emails = [load_email(is_spam=False, filename=name) for name in ham_filenames]\n",
    "spam_emails = [load_email(is_spam=True, filename=name) for name in spam_filenames]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's look at one example of ham and one example of spam, to get a feel of what the data looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Martin A posted:\n",
      "Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the\n",
      " limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the\n",
      " Mount Athos monastic community, was ideal for the patriotic sculpture. \n",
      " \n",
      " As well as Alexander's granite features, 240 ft high and 170 ft wide, a\n",
      " museum, a restored amphitheatre and car park for admiring crowds are\n",
      "planned\n",
      "---------------------\n",
      "So is this mountain limestone or granite?\n",
      "If it's limestone, it'll weather pretty fast.\n",
      "\n",
      "------------------------ Yahoo! Groups Sponsor ---------------------~-->\n",
      "4 DVDs Free +s&p Join Now\n",
      "http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM\n",
      "---------------------------------------------------------------------~->\n",
      "\n",
      "To unsubscribe from this group, send an email to:\n",
      "forteana-unsubscribe@egroups.com\n",
      "\n",
      " \n",
      "\n",
      "Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/\n"
     ]
    }
   ],
   "source": [
    "print(ham_emails[1].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help wanted.  We are a 14 year old fortune 500 company, that is\n",
      "growing at a tremendous rate.  We are looking for individuals who\n",
      "want to work from home.\n",
      "\n",
      "This is an opportunity to make an excellent income.  No experience\n",
      "is required.  We will train you.\n",
      "\n",
      "So if you are looking to be employed from home with a career that has\n",
      "vast opportunities, then go:\n",
      "\n",
      "http://www.basetel.com/wealthnow\n",
      "\n",
      "We are looking for energetic and self motivated people.  If that is you\n",
      "than click on the link and fill out the form, and one of our\n",
      "employement specialist will contact you.\n",
      "\n",
      "To be removed from our link simple go to:\n",
      "\n",
      "http://www.basetel.com/remove.html\n",
      "\n",
      "\n",
      "4139vOLW7-758DoDY1425FRhM1-764SMFc8513fCsLl40\n"
     ]
    }
   ],
   "source": [
    "print(spam_emails[6].get_content().strip())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some emails are actually multipart, with images and attachments (which can have their own attachments). Let's look at the various types of structures we have:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_email_structure(email):\n",
    "    if isinstance(email, str):\n",
    "        return email\n",
    "    payload = email.get_payload()\n",
    "    if isinstance(payload, list):\n",
    "        return \"multipart({})\".format(\", \".join([\n",
    "            get_email_structure(sub_email)\n",
    "            for sub_email in payload\n",
    "        ]))\n",
    "    else:\n",
    "        return email.get_content_type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import Counter\n",
    "\n",
    "def structures_counter(emails):\n",
    "    structures = Counter()\n",
    "    for email in emails:\n",
    "        structure = get_email_structure(email)\n",
    "        structures[structure] += 1\n",
    "    return structures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 2408),\n",
       " ('multipart(text/plain, application/pgp-signature)', 66),\n",
       " ('multipart(text/plain, text/html)', 8),\n",
       " ('multipart(text/plain, text/plain)', 4),\n",
       " ('multipart(text/plain)', 3),\n",
       " ('multipart(text/plain, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, application/ms-tnef, text/plain)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), multipart(multipart(text/plain, application/x-pkcs7-signature)))',\n",
       "  1),\n",
       " ('multipart(text/plain, multipart(text/plain))', 1),\n",
       " ('multipart(multipart(text/plain, text/plain, text/plain), application/pgp-signature)',\n",
       "  1),\n",
       " ('multipart(text/plain, video/mng)', 1),\n",
       " ('multipart(text/plain, application/x-java-applet)', 1),\n",
       " ('multipart(text/plain, application/x-pkcs7-signature)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), text/rfc822-headers)',\n",
       "  1),\n",
       " ('multipart(text/plain, text/enriched)', 1)]"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(ham_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 218),\n",
       " ('text/html', 183),\n",
       " ('multipart(text/plain, text/html)', 45),\n",
       " ('multipart(text/html)', 20),\n",
       " ('multipart(text/plain)', 19),\n",
       " ('multipart(multipart(text/html))', 5),\n",
       " ('multipart(text/plain, image/jpeg)', 3),\n",
       " ('multipart(text/html, application/octet-stream)', 2),\n",
       " ('multipart(multipart(text/html), application/octet-stream, image/jpeg)', 1),\n",
       " ('multipart(text/html, text/plain)', 1),\n",
       " ('multipart(multipart(text/plain, text/html), image/gif)', 1),\n",
       " ('multipart/alternative', 1),\n",
       " ('multipart(text/plain, application/octet-stream)', 1)]"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(spam_emails).most_common()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It seems that the ham emails are more often plain text, while spam has quite a lot of HTML. Moreover, quite a few ham emails are signed using PGP, while no spam is. In short, it seems that the email structure is useful information to have."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's take a look at the email headers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Return-Path : <12a1mailbot1@web.de>\n",
      "Delivered-To : zzzz@localhost.spamassassin.taint.org\n",
      "Received : from localhost (localhost [127.0.0.1])\tby phobos.labs.spamassassin.taint.org (Postfix) with ESMTP id 136B943C32\tfor <zzzz@localhost>; Thu, 22 Aug 2002 08:17:21 -0400 (EDT)\n",
      "Received : from mail.webnote.net [193.120.211.219]\tby localhost with POP3 (fetchmail-5.9.0)\tfor zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:17:21 +0100 (IST)\n",
      "Received : from dd_it7 ([210.97.77.167])\tby webnote.net (8.9.3/8.9.3) with ESMTP id NAA04623\tfor <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 13:09:41 +0100\n",
      "From : 12a1mailbot1@web.de\n",
      "Received : from r-smtp.korea.com - 203.122.2.197 by dd_it7  with Microsoft SMTPSVC(5.5.1775.675.6);\t Sat, 24 Aug 2002 09:42:10 +0900\n",
      "To : dcek1a1@netsgo.com\n",
      "Subject : Life Insurance - Why Pay More?\n",
      "Date : Wed, 21 Aug 2002 20:31:57 -1600\n",
      "MIME-Version : 1.0\n",
      "Message-ID : <0103c1042001882DD_IT7@dd_it7>\n",
      "Content-Type : text/html; charset=\"iso-8859-1\"\n",
      "Content-Transfer-Encoding : quoted-printable\n"
     ]
    }
   ],
   "source": [
    "for header, value in spam_emails[0].items():\n",
    "    print(header,\":\",value)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There's probably a lot of useful information in there, such as the sender's email address (12a1mailbot1@web.de looks fishy), but we will just focus on the `Subject` header:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Life Insurance - Why Pay More?'"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spam_emails[0][\"Subject\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, before we learn too much about the data, let's not forget to split it into a training set and a test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = np.array(ham_emails + spam_emails)\n",
    "y = np.array([0] * len(ham_emails) + [1] * len(spam_emails))\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, let's start writing the preprocessing functions. First, we will need a function to convert HTML to plain text. Arguably the best way to do this would be to use the great [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) library, but I would like to avoid adding another dependency to this project, so let's hack a quick & dirty solution using regular expressions (at the risk of [un̨ho͞ly radiańcé destro҉ying all enli̍̈́̂̈́ghtenment](https://stackoverflow.com/a/1732454/38626)). The following function first drops the `<head>` section, then converts all `<a>` tags to the word HYPERLINK, then it gets rid of all HTML tags, leaving only the plain text. For readability, it also replaces multiple newlines with single newlines, and finally it unescapes html entities (such as `&gt;` or `&nbsp;`):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "from html import unescape\n",
    "\n",
    "def html_to_plain_text(html):\n",
    "    text = re.sub('<head.*?>.*?</head>', '', html, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<a\\s.*?>', ' HYPERLINK ', text, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<.*?>', '', text, flags=re.M | re.S)\n",
    "    text = re.sub(r'(\\s*\\n)+', '\\n', text, flags=re.M | re.S)\n",
    "    return unescape(text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see if it works. This is HTML spam:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<HTML><HEAD><TITLE></TITLE><META http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\"><STYLE>A:link {TEX-DECORATION: none}A:active {TEXT-DECORATION: none}A:visited {TEXT-DECORATION: none}A:hover {COLOR: #0033ff; TEXT-DECORATION: underline}</STYLE><META content=\"MSHTML 6.00.2713.1100\" name=\"GENERATOR\"></HEAD>\n",
      "<BODY text=\"#000000\" vLink=\"#0033ff\" link=\"#0033ff\" bgColor=\"#CCCC99\"><TABLE borderColor=\"#660000\" cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\"><TR><TD bgColor=\"#CCCC99\" valign=\"top\" colspan=\"2\" height=\"27\">\n",
      "<font size=\"6\" face=\"Arial, Helvetica, sans-serif\" color=\"#660000\">\n",
      "<b>OTC</b></font></TD></TR><TR><TD height=\"2\" bgcolor=\"#6a694f\">\n",
      "<font size=\"5\" face=\"Times New Roman, Times, serif\" color=\"#FFFFFF\">\n",
      "<b>&nbsp;Newsletter</b></font></TD><TD height=\"2\" bgcolor=\"#6a694f\"><div align=\"right\"><font color=\"#FFFFFF\">\n",
      "<b>Discover Tomorrow's Winners&nbsp;</b></font></div></TD></TR><TR><TD height=\"25\" colspan=\"2\" bgcolor=\"#CCCC99\"><table width=\"100%\" border=\"0\"  ...\n"
     ]
    }
   ],
   "source": [
    "html_spam_emails = [email for email in X_train[y_train==1]\n",
    "                    if get_email_structure(email) == \"text/html\"]\n",
    "sample_html_spam = html_spam_emails[7]\n",
    "print(sample_html_spam.get_content().strip()[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And this is the resulting plain text:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Watch for analyst \"Strong Buy Recommendations\" and several advisory newsletters picking CBYI.  CBYI has filed to be traded on the OTCBB, share prices historically INCREASE when companies get listed on this larger trading exchange. CBYI is trading around 25 cents and should skyrocket to $2.66 - $3.25 a share in the near future.\n",
      "Put CBYI on your watch list, acquire a position TODAY.\n",
      "REASONS TO INVEST IN CBYI\n",
      "A profitable company and is on track to beat ALL earnings estimates!\n",
      "One of the FASTEST growing distributors in environmental & safety equipment instruments.\n",
      "Excellent management team, several EXCLUSIVE contracts.  IMPRESSIVE client list including the U.S. Air Force, Anheuser-Busch, Chevron Refining and Mitsubishi Heavy Industries, GE-Energy & Environmental Research.\n",
      "RAPIDLY GROWING INDUSTRY\n",
      "Industry revenues exceed $900 million, estimates indicate that there could be as much as $25 billi ...\n"
     ]
    }
   ],
   "source": [
    "print(html_to_plain_text(sample_html_spam.get_content())[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great! Now let's write a function that takes an email as input and returns its content as plain text, whatever its format is:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [],
   "source": [
    "def email_to_text(email):\n",
    "    html = None\n",
    "    for part in email.walk():\n",
    "        ctype = part.get_content_type()\n",
    "        if not ctype in (\"text/plain\", \"text/html\"):\n",
    "            continue\n",
    "        try:\n",
    "            content = part.get_content()\n",
    "        except: # in case of encoding issues\n",
    "            content = str(part.get_payload())\n",
    "        if ctype == \"text/plain\":\n",
    "            return content\n",
    "        else:\n",
    "            html = content\n",
    "    if html:\n",
    "        return html_to_plain_text(html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Wat ...\n"
     ]
    }
   ],
   "source": [
    "print(email_to_text(sample_html_spam)[:100], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's throw in some stemming! For this to work, you need to install the Natural Language Toolkit ([NLTK](http://www.nltk.org/)). It's as simple as running the following command (don't forget to activate your virtualenv first; if you don't have one, you will likely need administrator rights, or use the `--user` option):\n",
    "\n",
    "`$ pip3 install nltk`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computations => comput\n",
      "Computation => comput\n",
      "Computing => comput\n",
      "Computed => comput\n",
      "Compute => comput\n",
      "Compulsive => compuls\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    import nltk\n",
    "\n",
    "    stemmer = nltk.PorterStemmer()\n",
    "    for word in (\"Computations\", \"Computation\", \"Computing\", \"Computed\", \"Compute\", \"Compulsive\"):\n",
    "        print(word, \"=>\", stemmer.stem(word))\n",
    "except ImportError:\n",
    "    print(\"Error: stemming requires the NLTK module.\")\n",
    "    stemmer = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will also need a way to replace URLs with the word \"URL\". For this, we could use hard core [regular expressions](https://mathiasbynens.be/demo/url-regex) but we will just use the [urlextract](https://github.com/lipoja/URLExtract) library. You can install it with the following command (don't forget to activate your virtualenv first; if you don't have one, you will likely need administrator rights, or use the `--user` option):\n",
    "\n",
    "`$ pip3 install urlextract`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['github.com', 'https://youtu.be/7Pq-S557XQU?t=3m32s']\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    import urlextract # may require an Internet connection to download root domain names\n",
    "    \n",
    "    url_extractor = urlextract.URLExtract()\n",
    "    print(url_extractor.find_urls(\"Will it detect github.com and https://youtu.be/7Pq-S557XQU?t=3m32s\"))\n",
    "except ImportError:\n",
    "    print(\"Error: replacing URLs requires the urlextract module.\")\n",
    "    url_extractor = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are ready to put all this together into a transformer that we will use to convert emails to word counters. Note that we split sentences into words using Python's `split()` method, which uses whitespaces for word boundaries. This works for many written languages, but not all. For example, Chinese and Japanese scripts generally don't use spaces between words, and Vietnamese often uses spaces even between syllables. It's okay in this exercise, because the dataset is (mostly) in English."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "class EmailToWordCounterTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, strip_headers=True, lower_case=True, remove_punctuation=True,\n",
    "                 replace_urls=True, replace_numbers=True, stemming=True):\n",
    "        self.strip_headers = strip_headers\n",
    "        self.lower_case = lower_case\n",
    "        self.remove_punctuation = remove_punctuation\n",
    "        self.replace_urls = replace_urls\n",
    "        self.replace_numbers = replace_numbers\n",
    "        self.stemming = stemming\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        X_transformed = []\n",
    "        for email in X:\n",
    "            text = email_to_text(email) or \"\"\n",
    "            if self.lower_case:\n",
    "                text = text.lower()\n",
    "            if self.replace_urls and url_extractor is not None:\n",
    "                urls = list(set(url_extractor.find_urls(text)))\n",
    "                urls.sort(key=lambda url: len(url), reverse=True)\n",
    "                for url in urls:\n",
    "                    text = text.replace(url, \" URL \")\n",
    "            if self.replace_numbers:\n",
    "                text = re.sub(r'\\d+(?:\\.\\d*(?:[eE]\\d+))?', 'NUMBER', text)\n",
    "            if self.remove_punctuation:\n",
    "                text = re.sub(r'\\W+', ' ', text, flags=re.M)\n",
    "            word_counts = Counter(text.split())\n",
    "            if self.stemming and stemmer is not None:\n",
    "                stemmed_word_counts = Counter()\n",
    "                for word, count in word_counts.items():\n",
    "                    stemmed_word = stemmer.stem(word)\n",
    "                    stemmed_word_counts[stemmed_word] += count\n",
    "                word_counts = stemmed_word_counts\n",
    "            X_transformed.append(word_counts)\n",
    "        return np.array(X_transformed)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's try this transformer on a few emails:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([Counter({'wrote': 1, 'chuck': 1, 'murcko': 1, 'stuff': 1, 'yawn': 1, 'r': 1}),\n",
       "       Counter({'the': 11, 'of': 9, 'and': 8, 'by': 3, 'christian': 3, 'all': 3, 'to': 3, 'have': 2, 'jesu': 2, 'superstit': 2, 'been': 2, 'teach': 2, 'on': 2, 'jefferson': 2, 'one': 2, 'half': 2, 'ha': 2, 'i': 2, 'rogueri': 2, 'upon': 1, 'earth': 1, 'band': 1, 'fine': 1, 'find': 1, 'men': 1, 'first': 1, 'million': 1, 'error': 1, 'burnt': 1, 'import': 1, 'pervert': 1, 'led': 1, 'coercion': 1, 'make': 1, 'a': 1, 'thi': 1, 'in': 1, 'redeem': 1, 'over': 1, 'remsburg': 1, 'perpetr': 1, 'great': 1, 'e': 1, 'known': 1, 'corrupt': 1, 'again': 1, 'becom': 1, 'introduct': 1, 'examin': 1, 'man': 1, 'mytholog': 1, 'dupe': 1, 'paul': 1, 'word': 1, 'tortur': 1, 'other': 1, 'hypocrit': 1, 'quot': 1, 'most': 1, 'women': 1, 'fabl': 1, 'were': 1, 'six': 1, 'children': 1, 'ever': 1, 'william': 1, 'some': 1, 'john': 1, 'alik': 1, 'interest': 1, 'fool': 1, 'american': 1, 'they': 1, 'sinc': 1, 'url': 1, 'world': 1, 'not': 1, 'do': 1, 'our': 1, 'short': 1, 'what': 1, 'innoc': 1, 'larg': 1, 'that': 1, 'absurd': 1, 'support': 1, 'featur': 1, 'found': 1, 'shone': 1, 'letter': 1, 'system': 1, 'particular': 1, 'effect': 1, 'imprison': 1, 'are': 1, 'histor': 1, 'untruth': 1, 'thoma': 1}),\n",
       "       Counter({'url': 5, 's': 3, 'to': 3, 'group': 3, 'an': 2, 'and': 2, 'unsubscrib': 2, 'we': 2, 'in': 2, 'martin': 2, 'yahoo': 2, 'forteana': 2, 'is': 2, 'your': 1, 'html': 1, 'for': 1, 'be': 1, 'non': 1, 'career': 1, 'wrote': 1, 'free': 1, 'y': 1, 'hi': 1, 'more': 1, 'number': 1, 'includ': 1, 'murder': 1, 'thi': 1, 'adamson': 1, 'how': 1, 'should': 1, 'join': 1, 'yemen': 1, 'rob': 1, 'email': 1, 'rundown': 1, 'send': 1, 'don': 1, 'all': 1, 'altern': 1, 'outright': 1, 'use': 1, 'belief': 1, 'factual': 1, 'dvd': 1, 'memri': 1, 'muslim': 1, 'from': 1, 'on': 1, 'hamza': 1, 'that': 1, 'unbias': 1, 'of': 1, 'subject': 1, 'p': 1, 'base': 1, 'sponsor': 1, 't': 1, 'rather': 1, 'know': 1, 'now': 1})],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few = X_train[:3]\n",
    "X_few_wordcounts = EmailToWordCounterTransformer().fit_transform(X_few)\n",
    "X_few_wordcounts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This looks about right!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have the word counts, and we need to convert them to vectors. For this, we will build another transformer whose `fit()` method will build the vocabulary (an ordered list of the most common words) and whose `transform()` method will use the vocabulary to convert word counts to vectors. The output is a sparse matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "\n",
    "class WordCounterToVectorTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, vocabulary_size=1000):\n",
    "        self.vocabulary_size = vocabulary_size\n",
    "    def fit(self, X, y=None):\n",
    "        total_count = Counter()\n",
    "        for word_count in X:\n",
    "            for word, count in word_count.items():\n",
    "                total_count[word] += min(count, 10)\n",
    "        most_common = total_count.most_common()[:self.vocabulary_size]\n",
    "        self.most_common_ = most_common\n",
    "        self.vocabulary_ = {word: index + 1 for index, (word, count) in enumerate(most_common)}\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        rows = []\n",
    "        cols = []\n",
    "        data = []\n",
    "        for row, word_count in enumerate(X):\n",
    "            for word, count in word_count.items():\n",
    "                rows.append(row)\n",
    "                cols.append(self.vocabulary_.get(word, 0))\n",
    "                data.append(count)\n",
    "        return csr_matrix((data, (rows, cols)), shape=(len(X), self.vocabulary_size + 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<3x11 sparse matrix of type '<class 'numpy.int64'>'\n",
       "\twith 20 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer = WordCounterToVectorTransformer(vocabulary_size=10)\n",
    "X_few_vectors = vocab_transformer.fit_transform(X_few_wordcounts)\n",
    "X_few_vectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [99,  9, 11,  8,  3,  1,  3,  3,  1,  2,  3],\n",
       "       [65,  1,  0,  2,  3,  5,  1,  0,  2,  1,  0]], dtype=int64)"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few_vectors.toarray()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What does this matrix mean? Well, the 64 in the third row, first column, means that the third email contains 64 words that are not part of the vocabulary. The 1 next to it means that the first word in the vocabulary is present once in this email. The 2 next to it means that the second word is present twice, and so on. You can look at the vocabulary to know which words we are talking about. The first word is \"of\", the second word is \"and\", etc."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'all': 6,\n",
       " 'and': 3,\n",
       " 'by': 7,\n",
       " 'christian': 10,\n",
       " 'in': 8,\n",
       " 'of': 1,\n",
       " 'on': 9,\n",
       " 'the': 2,\n",
       " 'to': 4,\n",
       " 'url': 5}"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer.vocabulary_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are now ready to train our first spam classifier! Let's transform the whole dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "preprocess_pipeline = Pipeline([\n",
    "    (\"email_to_wordcount\", EmailToWordCounterTransformer()),\n",
    "    (\"wordcount_to_vector\", WordCounterToVectorTransformer()),\n",
    "])\n",
    "\n",
    "X_train_transformed = preprocess_pipeline.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98375, total=   0.1s\n",
      "[CV]  ................................................................\n",
      "[CV] .................................... , score=0.985, total=   0.1s\n",
      "[CV]  ................................................................\n",
      "[CV] ................................... , score=0.9925, total=   0.1s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    0.1s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    0.3s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.9870833333333334"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "log_clf = LogisticRegression(random_state=42)\n",
    "score = cross_val_score(log_clf, X_train_transformed, y_train, cv=3, verbose=3)\n",
    "score.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Over 98.7%, not bad for a first try! :) However, remember that we are using the \"easy\" dataset. You can try with the harder datasets, the results won't be so amazing. You would have to try multiple models, select the best ones and fine-tune them using cross-validation, and so on.\n",
    "\n",
    "But you get the picture, so let's stop now, and just print out the precision/recall we get on the test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 94.90%\n",
      "Recall: 97.89%\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "X_test_transformed = preprocess_pipeline.transform(X_test)\n",
    "\n",
    "log_clf = LogisticRegression(random_state=42)\n",
    "log_clf.fit(X_train_transformed, y_train)\n",
    "\n",
    "y_pred = log_clf.predict(X_test_transformed)\n",
    "\n",
    "print(\"Precision: {:.2f}%\".format(100 * precision_score(y_test, y_pred)))\n",
    "print(\"Recall: {:.2f}%\".format(100 * recall_score(y_test, y_pred)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "nav_menu": {},
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}