The post Análisis Exploratorio de Datos con Pandas en Python first appeared on Aprende Machine Learning.
]]>Como siempre, podrás descargar todo el código de la Jupyter Notebook desde mi cuenta de Github (que contiene información extra). Y como BONUS encuentra una notebook con las funciones más útiles de Pandas!
Eda es la sigla en inglés para Exploratory Data Analysis y consiste en una de las primeras tareas que tiene que desempeñar el Científico de Datos. Es cuando revisamos por primera vez los datos que nos llegan, por ejemplo un archivo CSV que nos entregan y deberemos intentar comprender “¿de qué se trata?”, vislumbrar posibles patrones y reconociendo distribuciones estadísticas que puedan ser útiles en el futuro.
OJO!, lo ideal es que tengamos un objetivo que nos hayan “adjuntado” con los datos, que indique lo que se quiere conseguir a partir de esos datos. Por ejemplo, nos pasan un excel y nos dicen “Queremos predecir ventas a 30 días”, ó “Clasificar casos malignos/benignos de una enfermedad”, “Queremos identificar audiencias que van a realizar re-compra de un producto”, “queremos hacer pronóstico de fidelización de clientes/abandonos”, “Quiero detectar casos de fraude en mi sistema en tiempo real”.
Al llegar un archivo, lo primero que deberíamos hacer es intentar responder:
Puede ocurrir que tengamos set de datos incompletos y debamos pedir a nuestro cliente/proveedor ó interesado que nos brinde mayor información de los campos, que aporte más conocimiento ó que corrija campos.
¿Qué son los conjuntos de Train, Test y Validación en Machine Learning?
También puede que nos pasen múltiples fuentes de datos, por ejemplo un csv, un excel y el acceso a una base de datos. Entonces tendremos que hacer un paso previo de unificación de datos.
El EDA será entonces una primer aproximación a los datos, ATENCIóN, si estamos mas o menos bien preparados y suponiendo una muestra de datos “suficiente”, puede que en “unas horas” tengamos ya varias conclusiones como por ejemplo:
A estas alturas podemos saber si nos están pidiendo algo viable ó si necesitamos más datos para comenzar.
Repito por si no quedó claro: el EDA debe tomar horas, ó puede que un día, pero la idea es poder sacar algunas conclusiones rápidas para contestar al cliente si podemos seguir o no con su propuesta.
Luego del EDA, suponiendo que seguimos adelante podemos tomarnos más tiempo y analizar en mayor detalle los datos y avanzar a nuevas etapas para aplicar modelos de Machine Learning.
Vamos a lo práctico!, ¿Que herramientas tenemos hoy en día? La verdad es que como cada conjunto de datos suele ser único, el EDA se hace bastante “a mano”, pero podemos seguir diversos pasos ordenados para intentar acercarnos a ese objetivo que nos pasa el cliente en pocas horas.
A nivel programación y como venimos utilizando Python, encontramos a la conocida librería Pandas, que nos ayudará a manipular datos, leer y transformarlos.
Instala el ambiente de desarrollo Python en tu ordenador siguiendo esta guía
Otra de las técnicas que más nos ayudaran en el EDA es visualización de datos (que también podemos hacer con Pandas).
Finalmente podemos decir que nuestra Intuición -basada en Experiencia previa, no en corazonadas- y nuestro conocimiento de casos similares también nos pueden aportar pistas para saber si estamos ante datos de buena calidad. Por ejemplo si alguien quiere hacer reconocimiento de imágenes de tornillos y tiene 25 imágenes y con muy mala resolución podremos decir que no tenemos muestras suficientes -dado nuestro conocimiento previo de este campo-.
Vamos a la práctica!
Vamos a hacer un ejemplo en pandas de un EDA bastante sencillo pero con fines educativos.
Vamos a leer un csv directamente desde una URL de GitHub que contiene información geográfica básica de los países del mundo y vamos a jugar un poco con esos datos.
import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as sm url = 'https://raw.githubusercontent.com/lorey/list-of-countries/master/csv/countries.csv' df = pd.read_csv(url, sep=";") print(df.head(5))
Veamos los datos básicos que nos brinda pandas:
Nombre de columnas
print('Cantidad de Filas y columnas:',df.shape) print('Nombre columnas:',df.columns)
Columnas, nulos y tipo de datos
df.info()
descripción estadística de los datos numéricos
df.describe()
Verifiquemos si hay correlación entre los datos
corr = df.set_index('alpha_3').corr() sm.graphics.plot_corr(corr, xnames=list(corr.columns)) plt.show()
Cargamos un segundo archivo csv para ahondar en el crecimiento de la población en los últimos años, filtramos a España y visualizamos
url = 'https://raw.githubusercontent.com/DrueStaples/Population_Growth/master/countries.csv' df_pop = pd.read_csv(url) print(df_pop.head(5)) df_pop_es = df_pop[df_pop["country"] == 'Spain' ] print(df_pop_es.head()) df_pop_es.drop(['country'],axis=1)['population'].plot(kind='bar')
Hagamos la comparativa con otro país, por ejemplo con el crecimiento poblacional en Argentina
df_pop_ar = df_pop[(df_pop["country"] == 'Argentina')] anios = df_pop_es['year'].unique() pop_ar = df_pop_ar['population'].values pop_es = df_pop_es['population'].values df_plot = pd.DataFrame({'Argentina': pop_ar, 'Spain': pop_es}, index=anios) df_plot.plot(kind='bar')
Ahora filtremos todos los paises hispano-hablantes
df_espanol = df.replace(np.nan, '', regex=True) df_espanol = df_espanol[ df_espanol['languages'].str.contains('es') ] df_espanol
Visualizamos…
df_espanol.set_index('alpha_3')[['population','area']].plot(kind='bar',rot=65,figsize=(20,10))
Vamos a hacer detección de Outliers, (con fines educativos) en este caso definimos como limite superior (e inferior) la media más (menos) “2 veces la desviación estándar” que muchas veces es tomada como máximos de tolerancia.
anomalies = [] # Funcion ejemplo para detección de outliers def find_anomalies(data): # Set upper and lower limit to 2 standard deviation data_std = data.std() data_mean = data.mean() anomaly_cut_off = data_std * 2 lower_limit = data_mean - anomaly_cut_off upper_limit = data_mean + anomaly_cut_off print(lower_limit.iloc[0]) print(upper_limit.iloc[0]) # Generate outliers for index, row in data.iterrows(): outlier = row # # obtener primer columna # print(outlier) if (outlier.iloc[0] > upper_limit.iloc[0]) or (outlier.iloc[0] < lower_limit.iloc[0]): anomalies.append(index) return anomalies find_anomalies(df_espanol.set_index('alpha_3')[['population']])
Detectamos como outliers a Brasil y a USA. Los eliminamos y graficamos ordenado por población de menor a mayor.
# Quitemos BRA y USA por ser outlies y volvamos a graficar: df_espanol.drop([30,233], inplace=True) df_espanol.set_index('alpha_3')[['population','area']].sort_values(["population"]).plot(kind='bar',rot=65,figsize=(20,10))
En pocos minutos hemos podido responder: cuántos datos tenemos, si hay nulos, los tipos de datos (entero, float, string), la correlación, hicimos visualizaciones, comparativas, manipulación de datos, detección de ouliers y volver a graficar. ¿No está nada mal, no?
Otras pruebas y gráficas que se suelen hacer son:
En el artículo vimos un repaso sobre qué es y cómo lograr hacer un Análisis Exploratorio de Datos en pocos minutos. Su importancia es sobre todo la de darnos un vistazo sobre la calidad de datos que tenemos y hasta puede determinar la continuidad o no de un proyecto.
Siempre dependerá de los datos que tengamos, en cantidad y calidad y por supuesto nunca deberemos dejar de tener en vista EL OBJETIVO, el propósito que buscamos lograr. Siempre debemos apuntar a lograr eso con nuestras acciones.
Como resultado del EDA si determinamos continuar, pasaremos a una etapa en la que ya preprocesaremos los datos pensando en la entrada a un modelo (ó modelos!) de Machine Learning.
La detección de Outliers podría comentarse en un artículo completo sobre el tema… YA salió!
¿Conocías el EDA? ¿Lo utilizas en tu trabajo? Espero tus comentarios!
Recibe los próximos artículos sobre Machine Learning, estrategias, teoría y código Python en tu casilla de correo.
NOTA: algunos usuarios reportaron que el email de confirmación y/o posteriores a la suscripción entraron en su carpeta de SPAM. Te sugiero que revises y recomiendo que agregues nuestro remitente a tus contactos para evitar problemas. Gracias!
Como siempre, puedes descargar la notebook relacionada con este artículo desde aquí:
Como Bonus…. te dejo una notebook con los Casos más comunes de uso de Manipulación de datos con Pandas!
Estos son otros artículos relacionados que pueden ser de tu interés:
The post Análisis Exploratorio de Datos con Pandas en Python first appeared on Aprende Machine Learning.
]]>The post Comprende Principal Component Analysis first appeared on Aprende Machine Learning.
]]>Introducción a PCA
Imaginemos que queremos predecir los precios de alquiler de vivienda del mercado. Al recopilar información de diversas fuentes tendremos en cuenta variables como tipo de vivienda, tamaño de vivienda, antigüedad, servicios, habitaciones, con/sin jardín, con/sin piscina, con/sin muebles pero también podemos tener en cuenta la distancia al centro, si hay colegio en las cercanías, o supermercados, si es un entorno ruidoso, si tiene autopistas en las cercanías, la “seguridad del barrio”, si se aceptan mascotas, tiene wifi, tiene garaje, trastero… y seguir y seguir sumando variables.
Es posible que cuanta más (y mejor) información, obtengamos una predicción más acertada. Pero también empezaremos a notar que la ejecución de nuestro algoritmo seleccionado (regresión lineal, redes neuronales, etc.) empezará a tomar más y más tiempo y recursos. Es posible que algunas de las variables sean menos importantes y no aporten demasiado valor a la predicción. También podríamos acercarnos peligrosamente a causar overfitting al modelo.
¿No sería mejor tomar menos variables, pero más valiosas?
Al quitar variables estaríamos haciendo Reducción de Dimensiones. Al hacer Reducción de Dimensiones (las características) tendremos menos relaciones entre variables a considerar. Para reducir las dimensiones podemos hacer dos cosas:
Eliminar por completo algunas dimensiones no estaría mal, pero deberemos tener certeza en que estamos quitando dimensiones poco importantes. Por ejemplo para nuestro ejemplo, podemos suponer que el precio de alquiler no cambiará mucho si el dueño acepta mascotas en la vivienda. Podría ser un acierto o podríamos estar perdiendo información importante.
En la Extracción de Características si tenemos 10 características crearemos otras 10 características nuevas independientes en donde cada una de esas “nuevas” características es una combinación de las 10 características “viejas”. Al crear estas nuevas variables independientes lo haremos de una manera específica y las pondremos en un orden de “mejor a peor” sean para predecir a la variable dependiente.
¿Y la reducción de dimensiónes? te preguntarás. Bueno, intentaremos mantener todas las variables posibles, pero prescindiremos de las menos importantes. Como tenemos las variables ordenadas de “mejor a peores predictoras” ya sabemos cuales serán las más y menos valiosas. A diferencia de la eliminación directa de una característica “vieja”, nuestras nuevas variables son combinaciones de todas las variables originales, aunque eliminemos algunas, estaremos manteniendo la información útil de todas las variables iniciales.
¿Qué es Principal Component Analysis?
Entonces Principal Component Analysis es una técnica de Extracción de Características donde combinamos las entradas de una manera específica y podemos eliminar algunas de las variables “menos importantes” manteniendo la parte más importante todas las variables. Como valor añadido, luego de aplicar PCA conseguiremos que todas las nuevas variables sean independientes una de otra.
En resumen lo que hace el algoritmo es:
Tranquilos, que todo esto ya lo hace solito scikit-learn (u otros paquetes Python). Ahora que tenemos las nuevas dimensiones, deberemos seleccionar con cuales nos quedamos.
Típicamente utilizamos PCA para reducir dimensiones del espacio de características original (aunque PCA tiene más aplicaciones). Hemos rankeado las nuevas dimensiones de “mejor a peor reteniendo información”. Pero ¿cuantas elegir para obtener buenas predicciones, sin perder información valiosa? Podemos seguir 3 métodos:
Método 1: Elegimos arbitrariamente “las primeras n dimensiones” (las más importantes). Por ejemplo si lo que queremos es poder graficar en 2 dimensiones, podríamos tomar las 2 características nuevas y usarlas como los ejes X e Y.
Método 2: calcular la “proporción de variación explicada“ de cada característica e ir tomando dimensiones hasta alcanzar un mínimo que nos propongamos, por ejemplo hasta alcanzar a explicar el 85% de la variabilidad total.
Método 3: Crear una gráfica especial llamada scree plot -a partir del Método 2- y seleccionar cuántas dimensiones usaremos por el método “del codo” en donde identificamos visualmente el punto en donde se produce una caída significativa en la variación explicada relativa a la característica anterior.
Suponiendo nuestras características de entrada estandarizadas como la matriz Z y ZT su transpuesta, cuando creamos la matriz de covarianza ZTZ es una matriz que contiene estimados de cómo cada variable de Z se relaciona con cada otra variable de Z. Comprender como una variable es asociada con otra es importante!
Los autovectores representan dirección. Los autovalores representan magnitud. A mayores autovalores, se correlacionan direcciones más importantes.
Por último asumimos que a más variabilidad en una dirección particular se correlaciona con explicar mejor el comportamiento de una variable dependiente. Mucha variabilidad usualmente indica “Información” mientras que poca variabilidad indica “Ruido”.
Utilizaré un archivo csv de entrada de un ejercicio anterior, en el cual decidíamos si convenía alquilar o comprar casa dadas 9 dimensiones. En este ejemplo:
Y veremos cómo los resultados “comprar ó alquilar” tienen [icon name=”angle-double-left” class=”” unprefixed_class=””]bastante buena[icon name=”angle-double-right” class=”” unprefixed_class=””] separación en 2 dimensiones.
#importamos librerías import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['figure.figsize'] = (16, 9) plt.style.use('ggplot') from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler #cargamos los datos de entrada dataframe = pd.read_csv(r"comprar_alquilar.csv") print(dataframe.tail(10)) #normalizamos los datos scaler=StandardScaler() df = dataframe.drop(['comprar'], axis=1) # quito la variable dependiente "Y" scaler.fit(df) # calculo la media para poder hacer la transformacion X_scaled=scaler.transform(df)# Ahora si, escalo los datos y los normalizo #Instanciamos objeto PCA y aplicamos pca=PCA(n_components=9) # Otra opción es instanciar pca sólo con dimensiones nuevas hasta obtener un mínimo "explicado" ej.: pca=PCA(.85) pca.fit(X_scaled) # obtener los componentes principales X_pca=pca.transform(X_scaled) # convertimos nuestros datos con las nuevas dimensiones de PCA print("shape of X_pca", X_pca.shape) expl = pca.explained_variance_ratio_ print(expl) print('suma:',sum(expl[0:5])) #Vemos que con 5 componentes tenemos algo mas del 85% de varianza explicada #graficamos el acumulado de varianza explicada en las nuevas dimensiones plt.plot(np.cumsum(pca.explained_variance_ratio_)) plt.xlabel('number of components') plt.ylabel('cumulative explained variance') plt.show() #graficamos en 2 Dimensiones, tomando los 2 primeros componentes principales Xax=X_pca[:,0] Yax=X_pca[:,1] labels=dataframe['comprar'].values cdict={0:'red',1:'green'} labl={0:'Alquilar',1:'Comprar'} marker={0:'*',1:'o'} alpha={0:.3, 1:.5} fig,ax=plt.subplots(figsize=(7,5)) fig.patch.set_facecolor('white') for l in np.unique(labels): ix=np.where(labels==l) ax.scatter(Xax[ix],Yax[ix],c=cdict[l],label=labl[l],s=40,marker=marker[l],alpha=alpha[l]) plt.xlabel("First Principal Component",fontsize=14) plt.ylabel("Second Principal Component",fontsize=14) plt.legend() plt.show()
Puedes revisar más ejemplos Python en nuestra sección de Práctica
Con PCA obtenemos:
PCA combina nuestros predictores y nos permite deshacernos de los autovectores de menor importancia relativa.
No todo es perfecto en la vida ni en PCA. Como contras, debemos decir que el algoritmo de PCA es muy influenciado por los outliers en los datos. Por esta razón, surgieron variantes de PCA para minimizar esta debilidad. Entre otros se encuentran: RandomizedPCA, SparcePCA y KernelPCA.
Por último decir que PCA fue creado en 1933 y ha surgido una buena alternativa en 2008 llamada t-SNE con un enfoque distinto y del que hablaremos en un futuro artículo…
Te recomiendo leer un nuevo artículo “Interpretación de Modelos de Machine Learning” en donde se comprende mejor la importancia de las diversas features de los modelos.
Para concluir, les comentaré un ejemplo muy interesante que vi para demostrar la eficacia de aplicar PCA. Si conocen el ejercicio “clásico” MNIST (algunos le llaman el Hello Word del Machine Learning), donde tenemos un conjunto de 70.000 imágenes con números “a mano” del 0 al 9 y debemos reconocerlos utilizando alguno de los algoritmos de clasificación.
Pues en el caso de MNIST, nuestras características de entrada son las imágenes de 28×28 pixeles, lo que nos da un total de 748 dimensiones de entrada. Ejecutar Regresión Logística en con una Macbook tarda unos 48 segundos en entrenar el set de datos y lograr una precisión del 91%.
Aplicando PCA al MNIST con una varianza retenida del 90% logramos reducir las dimensiones de 748 a 236. Ejecutar Regresión Logística ahora toma 10 segundos y la precisión obtenida sigue siendo del 91% !!!
Recibe el próximo artículo quincenal sobre Aprendizaje automático, teoría y ejemplos
Mas información en los siguientes enlaces (en inglés):
The post Comprende Principal Component Analysis first appeared on Aprende Machine Learning.
]]>The post ¿Comprar casa o Alquilar? Naive Bayes usando Python first appeared on Aprende Machine Learning.
]]>Veamos si la Ciencia de Datos nos puede ayudar a resolver el misterio… ¿Si alquilo estoy tirando el dinero a la basura? ó ¿Es realmente conveniente pagar una hipoteca durante el <<resto de mi vida>>?
Si bien tocaremos el tema livianamente -sin meternos en detalles como intereses de hipotecas variable/fija, porcentajes, comisiones de bancos,etc- haremos un planteo genérico para obtener resultados y tomar la mejor decisión dada nuestra condición actual.
En artículos pasados vimos diversos algoritmos Supervisados del Aprendizaje Automático que nos dejan clasificar datos y/o obtener predicciones o asistencia a la toma de decisiones (árbol de decisión, regresión logística y lineal, red neuronal). Por lo general esos algoritmos intentan minimizar algún tipo de coste iterando las entradas y las salidas y ajustando internamente las “pendientes” ó “pesos” para hallar una salida. Esta vez, el algoritmo que usaremos se basa completamente en teoría de probabilidades y obteniendo resultados estadísticos. ¿Será suficiente el Teorema de Bayes para obtener buenas decisiones? Veamos!
Para realizar este ejercicio, crearemos una Jupyter notebook con código Python y la librería SkLearn muy utilizada en Data Science. Recomendamos utilizar la suite para Python de Anaconda. Puedes leer este artículo donde muestro paso a paso como instalar el ambiente de desarrollo. Podrás descargar los archivos de entrada csv o visualizar la notebook online (al final de este artículo los enlaces).
Importemos las librerías que usaremos y visualicemos la información que tenemos de entrada:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib import colors import seaborn as sb %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
Y carguemos la info del archivo csv:
dataframe = pd.read_csv(r"comprar_alquilar.csv") dataframe.head(10)
Algunos supuestos para el problema formulado:
Con esta información, queremos que el algoritmo aprenda y que como resultado podamos consultar nueva información y nos dé una decisión sobre comprar (1) o alquilar (0) casa.
Si estamos tratando de elegir entre dos clases como en nuestro caso “comprar” ó “alquilar”, entonces una manera de tomar la decisión es calcular la tasa de probabilidades a posterior:
con esta maniobra, nos deshacemos del denominador de la ecuación anterior P(Datos) el llamado “probabilidad marginal”.
Uno de los tipos de clasificadores más populares es el llamado en inglés Gaussian Naive Bayes Classifier. NOTA:Hay otros clasificadores Bayesianos que no veremos en este artículo. Veamos cómo es su fórmula para comprender este curioso nombre: aplicaremos 2 clases (comprar, alquilar) y tres características: ingresos, ahorros e hijos.
Posterior de comprar es lo que queremos hallar: P(comprar|datos).
Explicaremos los demá:
Bien!, Fin de teoría, sigamos con el ejercicio! Ahora toca visualizar nuestras entradas y programar un poquito.
Veamos qué cantidad de muestras de comprar o alquilar tenemos:
print(dataframe.groupby('comprar').size())
comprar
0 135
1 67
dtype: int64
Esto son 67 que entradas en las que se recomienda comprar y 135 en las que no.
Hagamos un histograma de las características quitando la columna de resultados (comprar):
dataframe.drop(['comprar'], axis=1).hist() plt.show()
Pareciera a grandes rasgos que la distribución de hijos e ingresos <<se parece>> un poco a una distribución normal.
Vamos a hacer algo: procesemos algunas de estas columnas. Por ejemplo, podríamos agrupar los diversos gastos. También crearemos una columna llamada financiar que será la resta del precio de la vivienda con los ahorros de la familia.
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)
Y ahora veamos un resumen estadístico que nos brinda la librería Pandas con describe():
reduced = dataframe.drop(['gastos_comunes','gastos_otros','pago_coche'], axis=1) reduced.describe()
En este ejercicio haremos Feature Selection para mejorar nuestros resultados con este algoritmo. En vez de utilizar las 11 columnas de datos de entrada que tenemos, vamos a utilizar una Clase de SkLearn llamada SelectKBest con la que seleccionaremos las 5 mejores características y usaremos sólo esas.
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])
Index([‘ingresos’, ‘ahorros’, ‘hijos’, ‘trabajo’, ‘financiar’], dtype=’object’)
Bien, entonces usaremos 5 de las 11 características que teníamos. Las que “más aportan” al momento de clasificar. Veamos qué grado de correlación tienen:
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)
Con esto comprobamos que en general están poco correlacionadas, sin embargo también tenemos 2 valores de 0,7. Esperemos que el algoritmo sea lo suficientemente “naive” para dar buenos resultados
Otra alternativa para Feture Selection es utilizar Principal Component Analysis (PCA) y hacer reducción de Dimensión
Primero vamos a dividir nuestros datos de entrada en entrenamiento y test.
# 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"]
Y creamos el modelo, lo ponemos a aprender con fit() y obtenemos predicciones sobre nuestro conjunto de test.
# Instantiate the classifier gnb = GaussianNB() # Train classifier gnb.fit( X_train[used_features].values, y_train ) y_pred = gnb.predict(X_test[used_features]) 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)))
Precisión en el set de Entrenamiento: 0.87
Precisión en el set de Test: 0.90
Pues hemos obtenido un bonito 90% de aciertos en el conjunto de Test con nuestro querido clasificador bayesiano. También puedes ver los resultados obtenidos aplicando PCA en este otro artículo!
Ahora, hagamos 2 predicciones para probar nuestra máquina:
# ['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
[0 1]
Los resultados son los esperados, en el primer caso, recomienda Alquilar (0) y en el segundo comprar la casa (1).
A lo largo del artículo repasamos el teorema de Bayes y vimos un ejemplo para aplicarlo en una toma de decisiones. Pero no olvidemos que en el proceso también hicimos pre procesamiento de los datos, visualizaciones y Selección de Características. Durante diversas charlas que tuve con profesionales del Data Science en mi camino de aprendizaje sale un mismo mensaje que dice: “No es tan importante el algoritmo a aplicar si no la obtención y pre procesamiento de los datos que se van a utilizar”. A tenerlo en cuenta!
Naive Bayes como clasificador se utiliza mucho en NLP (Natural Language Processing) tanto en el típico ejemplo de detectar “Spam” o no como en tareas más complejas como reconocer un idioma o detectar la categoría apropiada de un artículo de texto. También puede usarse para detección de intrusiones o anomalías en redes informáticas y para diagnósticos médicos dados unos síntomas observados. Por último veamos los pros y contras de utilizar Gaussian Naive Bayes:
Si les gustó el artículo les pido como favor si pueden ayudarme a difundir estas páginas en vuestras redes sociales.
Además, como siempre, los invito a suscribirse al Blog ingresando una dirección de email y recibirán una notificación cada 15 días (aprox.) con un nuevo artículo sobre Aprende Machine Learning!.
Recibe el próximo artículo quincenal sobre Data Science y Machine Learning con Python
Otros artículos de interés sobre Bayes y Python en Inglés:
The post ¿Comprar casa o Alquilar? Naive Bayes usando Python first appeared on Aprende Machine Learning.
]]>The post 7 pasos del Machine Learning para construir tu máquina first appeared on Aprende Machine Learning.
]]>Dada la problemática que deseas resolver, deberás investigar y obtener datos que utilizaras para alimentar a tu máquina. Importa mucho la calidad y cantidad de información que consigas ya que impactará directamente en lo bien o mal que luego funcione nuestro modelo. Puede que tengas la información en una base de datos ya existente o que la debas crear desde cero. Si es un pequeño proyecto puedes crear una planilla de cálculos que luego se exportará fácilmente como archivo csv. También es frecuente utilizar la técnica de web scraping para recopilar información de manera automática de diversas fuentes (y/o servicios rest/ APIs).
NO olvides hacer el EDA: Análisis Exploratorio de Datos
Es importante mezclar “las cartas” que obtengas ya que el orden en que se procesen los datos dentro de tu máquina no debe de ser determinante.
También es un buen momento para hacer visualizaciones de nuestros datos y revisar si hay correlaciones entre las distintas características (“features”, suelen ser las columnas de nuestra base datos o archivo) que obtuvimos. Habrá que hacer Selección de Características, pues las que elijamos impactarán directamente en los tiempos de ejecución y en los resultados, también podremos hacer reducción de dimensiones aplicando PCA si fuera necesario. Deberemos tener balanceada la cantidad de datos que tenemos para cada resultado(clase), para que sea representativo, ya que si no, el aprendizaje podrá ser tendencioso hacia un tipo de respuesta y cuando nuestro modelo intente generalizar el conocimiento fallará.
También deberemos separar los datos en en dos grupos: uno para entrenamiento y otro para evaluación del modelo. Podemos fraccionar aproximadamente en una proporción de 80/20 pero puede variar según el caso y el volumen de datos que tengamos.
En esta etapa también podemos preprocesar nuestros datos normalizando, eliminar duplicados y hacer corrección de errores.
Existen diversos modelos que podemos elegir de acuerdo al objetivo que tengamos: utilizaremos algoritmos de clasificación, predicción, regresión lineal, clustering (ejemplo k-means ó k-nearest neighbor), Deep Learning (ej: red neuronal), bayesiano, etc y podrá haber variantes si lo que vamos a procesar son imágenes, sonido, texto, valores numéricos. En la siguiente tabla veremos algunos modelos y sus aplicaciones
Modelo | Aplicaciones (Ejemplo de uso) |
---|---|
Logistic Regression | Predicción de precios de inmuebles |
Fully connected networks | Clasificación |
Convolutional Neural Networks | Procesamiento de imágenes para poder encontrar gatitos en las fotos |
Recurrent Neural Networks | Reconocimiento de Voz |
Random Forest | Detección de Fraude |
Reinforcement Learning | Enseñarle a la máquina a jugar videojuegos y vencer! |
Generative Models | Creación de imágenes |
K-means | Crear Clusters a partir de datos sin etiquetar. Segmentar audiencias o Inventarios |
k-Nearest Neighbors | motores de recomendación (por similitud/cercanía) |
Bayesian Clasifiers | Clasificación de emails: Spam o no |
Aquí puedes ver más aplicaciones del ML y la diferencia entre aprendizaje supervisado y no supervisado
Utilizaremos el set de datos de entrenamiento para ejecutar nuestra máquina y deberemos de ver una mejora incremental (para la predicción). Recordar inicializar los “pesos” de nuestro modelo aleatoriamente, los pesos son los valores que multiplican o afectan a las relaciones entre las entradas y las salidas, se irán ajustando automáticamente por el algoritmo seleccionado cuanto más se entrena. Revisar los resultados obtenidos y corregir (por ej. inclinación de la pendiente) y volver a iterar…
Deberemos comprobar la máquina creada contra nuestro set de datos de Evaluación que contiene entradas que el modelo desconoce y verificar la precisión de nuestro modelo ya entrenado. Si la exactitud es menor o igual al 50% ese modelo no será útil ya que sería como lanzar una moneda al aire para tomar decisiones. Si alcanzamos un 90% o más podremos tener una buena confianza en los resultados que nos otorga el modelo.
Si durante la evaluación no obtuvimos buenas predicciones y nuestra precisión no es la mínima deseada es posible que tengamos problemas de overfitting (ó underfitting) y deberemos retornar al paso de entrenamiento (4) haciendo antes una nueva configuración de parámetros de nuestro modelo. Podemos incrementar la cantidad de veces que iteramos nuestros datos de entrenamiento (EPOCHs). Otro parámetro importante es el conocido como “Learning Rate” (taza de aprendizaje) que suele ser un valor que multiplica al gradiente para acercarlo poco a poco al mínimo global (o local) para minimizar el coste de la función. No es lo mismo incrementar nuestros valores en 0,1 unidades que de 0,001 esto puede afectar significativamente el tiempo de ejecución del modelo. Tambié se puede indicar el máximo error permitido de nuestro modelo. Podemos pasar de tardar unos minutos a horas (y días) en entrenar nuestra máquina. A estos parámetros muchas veces se les llama Hiperparámetros. Este “tuneo” sigue siendo más un arte que una ciencia y se ira mejorando a medida que experimentamos. Suele haber muchos parámetros para ir ajustando y al combinarlos se pueden disparar todas nuestras opciones. Cada algoritmo tiene sus propios parámetros a ajustar. Por nombrar alguno más, en las Redes Neuronales Artificiales deberemos definir en su arquitectura la cantidad de hidden layers que tendrá e ir probando con más o con menos y con cuantas neuronas cada capa. Este será un trabajo de gran esfuerzo y paciencia para dar con buenos resultados.
Ya estamos listos para utilizar nuestro modelo de Aprendizaje Automático! con nueva información y comenzar a predecir o inferir resultados “en la vida real”… Imaginemos que si este paso fuera pasar de un simulador de un coche a aplicar nuestra máquina en un coche de verdad… es un gran momento y también será un emocionante desafío poner a prueba realmente todo nuestro trabajo de… ¿meses?
Puedes ver ejercicios prácticos en Python y descargar el código desde la sección de Práctica del Blog
ó Instala tu ambiente de desarrollo
Nuevo artículo: ¿Cómo hacer Webscraping? un ejemplo Python
Ahora ya conoces los 7 pasos para crear tu propia máquina y conquistar el mundo
Y si quieres crear tu propia API y desplegar en un servidor, no dejes de leer este artículo
Suscribe al blog y te llegará un email cada 10 ó 15 días con mi nuevo post sobre Machine Learning. Mantén tus conocimientos frescos!!
The post 7 pasos del Machine Learning para construir tu máquina first appeared on Aprende Machine Learning.
]]>