#!/usr/bin/env python # coding: utf-8 # # Ejercicio Machine Learning: Gaussian Naive Bayes # ## ¿Comprar o alquilar casa? ¿Qué me conviene? # La explicacion completa en el blog www.aprendemachinelearning.com # En este ejercicio, usaremos el algoritmo de Gaussian Naive Bayes para decidir si nos conviene Alguilar o Comprar una casa # In[17]: import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib import colors import seaborn as sb get_ipython().run_line_magic('matplotlib', 'inline') plt.rcParams['figure.figsize'] = (16, 9) plt.style.use('ggplot') from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.naive_bayes import GaussianNB from sklearn.feature_selection import SelectKBest # ## Importemos Datos de entrada # In[2]: dataframe = pd.read_csv(r"comprar_alquilar.csv") dataframe.head(10) # REFERENCIAS: # ingresos y gastos son mensuales de 1 personas o 2 si están casados. # trabajo: 0-sin trabajo 1-autonomo 2-asalariado 3-empresario 4-Autonomos 5-Asalariados 6-Autonomo y Asalariado 7-Empresario y Autonomo 8 Empresarios o empresario y autónomo # estado_civil: 0-soltero 1-casado 2-divorciado # hijos: Cantidad de hijos menores (no trabajan) # comprar: 0-mejor alquilar 1-Comprar casa # hipoteca fija a 30 años con interes # In[4]: print(dataframe.groupby('comprar').size()) # In[19]: dataframe.drop(['comprar'], axis=1).hist() plt.show() # # Preprocesamos los datos # Creamos 2 columnas nuevas. En una agrupamos los gastos mensuales. En la otra el monto a financiar para comprar la casa # In[32]: dataframe['gastos']=(dataframe['gastos_comunes']+dataframe['gastos_otros']+dataframe['pago_coche']) dataframe['financiar']=dataframe['vivienda']-dataframe['ahorros'] dataframe.drop(['gastos_comunes','gastos_otros','pago_coche'], axis=1).head(10) # ### Información estadística de los datos # In[6]: reduced = dataframe.drop(['gastos_comunes','gastos_otros','pago_coche'], axis=1) reduced.describe() # ## Feature Selection # Selección de las características de entrada. # ### Veamos la correlación entre columnas # In[7]: colormap = plt.cm.viridis plt.figure(figsize=(12,12)) plt.title('Pearson Correlation of Features', y=1.05, size=15) sb.heatmap(reduced.astype(float).corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True) # Usemos la clase SelectKBest de SkLearn para elegir las 5 mejores características a usar. # In[8]: X=dataframe.drop(['comprar'], axis=1) y=dataframe['comprar'] best=SelectKBest(k=5) X_new = best.fit_transform(X, y) X_new.shape selected = best.get_support(indices=True) print(X.columns[selected]) # Veamos la correlación entre las 5 mejores Features # In[9]: used_features =X.columns[selected] colormap = plt.cm.viridis plt.figure(figsize=(12,12)) plt.title('Pearson Correlation of Features', y=1.05, size=15) sb.heatmap(dataframe[used_features].astype(float).corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True) # In[10]: sb.pairplot(dataframe, hue='comprar',size=4,vars=used_features,kind='scatter') # ### Ejemplo: Graficar 2 de las Características # In[18]: used_features2 =[ "ingresos", "financiar" ] X=dataframe[used_features2].values y=dataframe["comprar"] fig, ax = plt.subplots() ax.scatter(X[:,0], X[:,1], c=y, s=50, cmap='RdBu') ax.set_title('Naive Bayes Model', size=14) xlim = (2000, 9000) ylim = (100000, 700000) xg = np.linspace(xlim[0], xlim[1], 40) yg = np.linspace(ylim[0], ylim[1], 30) xx, yy = np.meshgrid(xg, yg) Xgrid = np.vstack([xx.ravel(), yy.ravel()]).T for label, color in enumerate(['red', 'blue']): mask = (y == label) mu, std = X[mask].mean(0), X[mask].std(0) P = np.exp(-0.5 * (Xgrid - mu) ** 2 / std ** 2).prod(1) Pm = np.ma.masked_array(P, P < 0.03) ax.pcolorfast(xg, yg, Pm.reshape(xx.shape), alpha=0.5, cmap=color.title() + 's') ax.contour(xx, yy, P.reshape(xx.shape), levels=[0.01, 0.1, 0.5, 0.9], colors=color, alpha=0.2) ax.set(xlim=xlim, ylim=ylim) # Vemos que cuantos más ingresos tiene la familia y menor es la cantidad a financiar, mejora la opción de Comprar (en azul). De otra manera, convendrá alquilar (rojo) # # Creamos el modelo de Gaussian Naive Bayes # Dividimos en un set de Entrenamiento y otro de Test con el 20% de las entradas # In[11]: # Split dataset in training and test datasets X_train, X_test = train_test_split(dataframe, test_size=0.2, random_state=6) y_train =X_train["comprar"] y_test = X_test["comprar"] # Entrenamos el modelo # In[20]: # Instantiate the classifier gnb = GaussianNB() # Train classifier gnb.fit( X_train[used_features].values, y_train ) y_pred = gnb.predict(X_test[used_features]) # # Resultados # In[26]: print('Precisión en el set de Entrenamiento: {:.2f}' .format(gnb.score(X_train[used_features], y_train))) print('Precisión en el set de Test: {:.2f}' .format(gnb.score(X_test[used_features], y_test))) # In[31]: # Print Test results print("Total de Muestras en Test: {}\nFallos: {}" .format( X_test.shape[0], (y_test != y_pred).sum() )) # In[13]: print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) # ## Nuevas Predicciones # Hagamos 2 pruebas a modo de ejemplo en las que el algoritmo nos recomienda Alquilar (0) y Comprar (1) en el 2do caso # In[15]: # ['ingresos', 'ahorros', 'hijos', 'trabajo', 'financiar'] print(gnb.predict([[2000, 5000, 0, 5, 200000], [6000, 34000, 2, 5, 320000] ])) #Resultado esperado 0-Alquilar, 1-Comprar casa # In[ ]: