import pandas as pd

house_price = pd.read_csv('BD/home_data.csv')
house_price.head(3)

"""
Explanation: Introducción A Machine learning
Tabla de contenidos

<a href="#seccion1">Introduccion a Machine Learning</a>
<a href="#seccion2">Regresion</a>
<a href="#seccion3">Clasificacion</a>
<a href="#seccion4">Clustering</a>
<a href="#seccion5">Reduccion dimensional</a>  

<a id="seccion1"></a>
Introduccion a Machine Learning
Machine Learning: Crear algoritmo capaces de identificar patrones complejos automaticamente.
<img src="imagenes/ml_map.png">
<a id="seccion2"></a>
Regresiones
Uno de los usos mas importantes y extendidos en ML, nos permite hacer predicciones a partir de las relaciones entre las variables observadas.
* Predicciones de consumo energetico
* Esperanza de vida
<img src='imagenes/minimos_caudrados.png'>
End of explanation
"""


from sklearn import linear_model
clf = linear_model.LinearRegression()

variables = ['superficie','dormitorios','plantas','aseos']
target    = ['precio']
house_price_zip98001=house_price.groupby(by='codigo_postal').get_group(98001)

clf.fit(house_price_zip98001[variables],house_price_zip98001[target])

"""
Explanation: Entrenamiento
End of explanation
"""


dato_a_consultar = pd.DataFrame(data={'superficie':[1800,1700,2000],'dormitorios':[2,3,3],'plantas':[2,3,2],'aseos':[3,3,3]},columns=variables)
clf.predict(dato_a_consultar)

"""
Explanation: Prediccion
Ya tenemos nuestro sistema entrenado, vamos a calcular una estima del precio de las casas que queremos
End of explanation
"""


prestamos=pd.read_csv('BD/prestamos.csv')
prestamos.head(3)

"""
Explanation: <a id="seccion3"></a>
Clasificacion
La meta es predecir una categoria a traves del las variables de entrada:
* Spam
* Clasificacion de imagenes
* Diagnosticos medicos
* Analisis de sentimiento
End of explanation
"""


for columna in prestamos.columns.values:
    print (columna,pd.np.unique(prestamos[columna].values))

"""
Explanation: Vamos a inspeccionar cuantas clases tiene cada variable categorica
End of explanation
"""


variables_categoricas=['plazo','grado','sub_grado','propiedad_vivienda','proposito']
prestamos_procesado=utiles.to_hot_encoding(prestamos,variables_categoricas)

prestamos_procesado.prestamo_basura=prestamos_procesado.prestamo_basura.apply(lambda x:1 if x else -1)
prestamos_procesado.head(2)

"""
Explanation: Preprocesamiento de datos

Nuestro arbol de decision solamente entiende que cada variable categorica sea binaria, vamos a binarizar cada variable que tengamos
Para que el algorimo entienda que es clasificacion binaria, los grupos deben de ser [-1,1]
End of explanation
"""


from sklearn.tree import DecisionTreeClassifier

target='prestamo_basura'
features=prestamos_procesado.columns
features=features.drop(target)

decision_tree_model=DecisionTreeClassifier(max_depth=3,criterion='entropy')
decision_tree_model.fit(prestamos_procesado[features],prestamos_procesado[target])

"""
Explanation: Entrenamiento
End of explanation
"""


prestamos.head(1)

print ("Probalidad de ser rechazado para un prestamo: {}".format(24295/28288))

decision_tree_model.predict_proba(prestamos_procesado[features].iloc[0])

"""
Explanation: <img src='imagenes/arbol_decision.png'>
Prediccion
End of explanation
"""


from sklearn.datasets import load_digits
digits = load_digits()
digits.data[2,:]

"""
Explanation: <a id="seccion4"></a>
Clustering
Si antes hemos realizado una clasificacion por medio de variables conociendo de antemano la solucion(sistemas supervisados). Los metodos de clustering nos ayudan a identificar grupos naturales sin categorizar o estructuras ocultas (sistemas sin supervisar)
- Grupos de paciencies similares
- Clasificacion de productos
End of explanation
"""


from sklearn.cluster import KMeans

est = KMeans(n_clusters=10)
clusters = est.fit_predict(digits.data)

utiles.mostrar_imagenes(est.cluster_centers_,prediccion=clusters)

"""
Explanation: Entrenamiento
End of explanation
"""


from scipy.stats import mode
import numpy as np

labels = np.zeros_like(clusters)
prediccion_por_cluster=[]
for i in range(10):
    mask = (clusters == i)
    numero=mode(digits.target[mask])[0]
    prediccion_por_cluster.append(numero[0])
    labels[mask] = numero
    
utiles.mostrar_imagenes(est.cluster_centers_,prediccion=prediccion_por_cluster)

"""
Explanation: Agrupacion
Como se ha observado, el centro de cada clusters parece correcto: cada uno de ellos se asemeja a un numero. Ahora vamos a ver si realmente lo que se muestra son los numeros que tienen a su alrededor
End of explanation
"""


from sklearn.decomposition import PCA

numero_de_variables=2
X = PCA(numero_de_variables).fit_transform(digits.data)

datos=pd.DataFrame(data={'variable1':X[:, 0],'variable2':X[:, 1],'target':digits.target,'output':labels})
datos.head()

sns.lmplot('variable1', 'variable2', 
           data=datos, col='target',
           fit_reg=False )

"""
Explanation: <a id="seccion5"></a>
Reduccion dimensional
La tecnica de reduccion dimensional nos ayudan a explorar los datos con gran cantidad de variables
- Ayudar a dibujar el problema
- Reducir las variables de entrada para un algoritmo, evitando sobreajuste, por ejemplo en los arboles de decisiones
- Reducen la cantidad de datos a guardar
Entrenamiento
End of explanation
"""


