from IPython.core.display import HTML
import os
def css_styling():
    """Load default custom.css file from ipython profile"""
    base = os.getcwd()
    styles = "<style>\n%s\n</style>" % (open(os.path.join(base,'files/custom.css'),'r').read())
    return HTML(styles)
css_styling()

"""
Explanation: <i class="fa fa-diamond"></i> Primero pimpea tu libreta!
End of explanation
"""


import numpy as np
import sklearn as sk
import matplotlib.pyplot as plt
import sklearn.datasets as datasets
import seaborn as sns
%matplotlib inline

"""
Explanation: <i class="fa fa-book"></i> Primero librerias
End of explanation
"""


from sklearn.tree import DecisionTreeClassifier


"""
Explanation: <i class="fa fa-database"></i> Vamos a crear datos de jugete
Crea varios "blobs"
recuerda la funcion de scikit-learn datasets.make_blobs()
 Tambien prueba
python
 centers = [[1, 1], [-1, -1], [1, -1]]
 X,Y = datasets.make_blobs(n_samples=10000, centers=centers, cluster_std=0.6)
<i class="fa fa-tree"></i> Ahora vamos a crear un modelo de arbol

podemos usar DecisionTreeClassifier como clasificador
End of explanation
"""


help(clf)

"""
Explanation: <i class="fa fa-question-circle"></i> Que parametros y funciones tiene el classificador?
Hint: usa help(cosa)!
End of explanation
"""


from sklearn.cross_validation import train_test_split


"""
Explanation: vamos a ajustar nuestro modelo con fit y sacar su puntaje con score
<i class="fa fa-question-circle"></i>
Por que no queremos 100%?
Este problema se llama "Overfitting"

<i class="fa fa-list"></i>   Pasos para un tipico algoritmo ML:

Crear un modelo
Particionar tus datos en diferentes pedazos (10% entrenar y 90% prueba)
Entrenar tu modelo sobre cada pedazo de los datos
Escogete el mejor modelo o el promedio de los modelos
Predice!

Primero vamos a particionar los datos usando
End of explanation
"""


from sklearn.cross_validation import cross_val_score


"""
Explanation: cuales son los tamanios de estos nuevos datos?
y ahora entrenamos nuestro modelo y checamos el error
<i class="fa fa-question-circle"></i>
Como se ve nuestro modelo?
Que fue mas importante para hacer una decision?
Como podemos mejorar  y controlar como dividimos nuestros datos?
Validación cruzada y
K-fold


Y lo mejor es que podemos hacer todo de usa sola patada con sci-kit!
Hay que usar cross_val_score
End of explanation
"""


from sklearn.ensemble import RandomForestClassifier

"""
Explanation: <i class="fa fa-question-circle"></i>
Y como podemos mejorar un arbol de decision?


 RandomForestClassifier(n_estimators=n_estimators) Al rescate!
End of explanation
"""


g = sns.PairGrid(iris, hue="species")
g = g.map(plt.scatter)
g = g.add_legend()

"""
Explanation: a probarlo!
mejoro?
Pero ahora tenemos un parametro nuevo, cuantos arboles queremos usar?
<i class="fa fa-tree"></i>,<i class="fa fa-tree"></i>,<i class="fa fa-tree"></i> ...
Que tal si probamos con un for loop!? Y checamos el error conforme al numero de arboles?
Actividad!
Hay que :

Definir nuestro rango de arboles a probar en un arreglo
hacer un for loop sobre este arreglo
Para cada elemento, entrena un bosque y saca el score
Guarda el score en una lista
graficalo!



<i class="fa fa-pagelines"></i> El conjunto de datos Iris
Un modelo multi-dimensional
End of explanation
"""


iris = datasets.load_iris()
X = iris.data
Y = iris.target

"""
Explanation: Actividad:
Objetivo: Entrena un arbol para predecir la especie de la planta

Checa las graficas, que variables podrian ser mas importante?
Agarra los datos, que dimensiones son?
Rompelos en pedacitos y entrena tus modelos
Que scores te da? Que resulto ser importante?
End of explanation
"""


