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

n=  1000000
sum =0.0
valor = 1/ float(n)

for i in range(0,n+1):
    sum += valor
    
print("%10f"%sum)

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


centers = [[1, 1], [-1, -1], [1, -1]]
X,Y = datasets.make_blobs(n_samples=1000, centers=centers, cluster_std=0.6)
plt.scatter(X[:,0],X[:,1],c=Y)
plt.jet()

"""
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)
End of explanation
"""


from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()


"""
Explanation: <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
"""


clf.fit(X,Y)
clf.score(X,Y)


clf = DecisionTreeClassifier()
clf.fit(X[:1000],Y[:1000])
clf.score(X,Y)*100

"""
Explanation: vamos a ajustar nuestro modelo con fit y sacar su puntaje con score
End of explanation
"""


from sklearn.cross_validation import train_test_split
X_train,X_test, Y_train, Y_test= train_test_split(X,Y,test_size=0.90)

"""
Explanation: <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
"""


plt.scatter(X_test[:,0],X_test[:,1],c=Y_test)

"""
Explanation: cuales son los tamanios de estos nuevos datos?
End of explanation
"""


clf = DecisionTreeClassifier()
clf.fit(X_train,Y_train)
clf.score(X_test,Y_test)*100

"""
Explanation: y ahora entrenamos nuestro modelo y checamos el error
End of explanation
"""


clf.feature_importances_

"""
Explanation: <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?
End of explanation
"""


from sklearn.cross_validation import cross_val_score

resultados = cross_val_score(clf,X,Y, cv=10)

np.mean(resultados)

"""
Explanation: 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

clf = RandomForestClassifier()
print(clf)

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


resultados = cross_val_score(clf,X,Y, cv=10)

"""
Explanation: a probarlo!
End of explanation
"""


resultados.mean()

"""
Explanation: mejoro?
End of explanation
"""


ks=[2,3,5,8,10,12,15,18,20,25,30,35,40,45,50]
scores=[]
for i in ks:
    clf = RandomForestClassifier(n_estimators=i)
    resultados = cross_val_score(clf,X,Y, cv=10)
    scores.append( np.mean(resultados) )

plt.plot(ks,scores)

"""
Explanation: 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!
End of explanation
"""


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

"""
Explanation: <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
"""


