TIC, TAC, TEP: Aprender en el siglo XXI

IA, IoT y Tecnologías Información, Aprendizaje y Participación


Deja un comentario

Cursos gratis de Ciencia de Datos para seguir a tu aire

Si quieres formarte en Data Science, Machine Learning e Inteligencia Artificial no hace falta hacer una gran inversión. En este post os contamos qué cursos gratuitos sobre esta temática tienen la inscripción abierta en estos momentos, y puedes seguir a tu aire. La mayor parte de ellos en inglés, pero también algunos en español. Si quieres aprender desde cero, o especializarte en un área determinada, échale un vistazo a esta lista. 

Cursos en ingles.

 edX

Portada del portal edX
Portada del portal edX

En la plataforma edX es donde vamos a encontrar más cosas interesantes que podemos aprender sin gastar ni un sólo euro. Aunque también, si nos interesa obtener algún tipo de certificación, podemos hacerlo pagando una pequeña cantidad que depende de cada curso en particular. Esta política es muy interesante porque sigue el espíritu original de los MOOCs: la democratización del conocimiento, de forma que cualquier persona interesada en aprender, puede hacerlo, sin importar su nivel económico. En estos momentos, los cursos más interesantes que puedes seguir a tu ritmo, son los siguientes:

Curso ofrecido por la Universidad de San Diego en el que aprenderás a usar herramientas Python open-source como Pandas, Git y Matplotlib para manipular, analizar y visualizar datasets complejos. 

Otro interesante curso de la Universidad de San Diego en el que aprenderás a usar Python para comprender los datos, y extraer insights relevantes usando enfoques estadísticos y probabilísticos. 

En este curso de la Universidad de Indiana, aprenderás sobre estrategia y gobernanza de datos en la empresa, bases de datos relacionales, administración de datos maestros y tecnologías Big Data. Todo lo necesario para que los responsables de la toma de decisiones en la empresa, puedan basar esas decisiones de negocio en insights de datos.

Realizar  análisis de segmentación de mercado y definir estrategias de segmentación  a largo plazo supone un auténtico reto para cualquier organización. En este curso de la Universidad de Queensland, aprenderás el proceso para realizar este tipo de análisis basado en datos, en diez sencillos pasos, y desarrollarás habilidades que permitirán identificar las necesidades de tus clientes y obtener así una ventaja competitiva.

 

Udacity

En Udacity antes se podía acceder de forma gratuita a los cursos iniciales  de sus Nanodegrees de pago, pero esa opción ya no está disponible. No obstante, no dejes de echarle un vistazo a sus programas, porque ofrecen contenidos de gran interés.

 

Coursera

Portada del portal de Coursera
Portada del portal de Coursera

Otras plataformas como Coursera, ofrecen cursos de pago con una semana de acceso gratuito, para valorar los contenidos disponibles. También puedes participar en los cursos en calidad de “oyente”, de manera gratuita, con acceso a los materiales del curso, pero sin tareas calificadas o la capacidad de obtener un certificado. Estos cursos suelen tener la inscripción abierta de forma permanente, ya que cada uno puede hacerlos a su ritmo.

Al igual que ocurre con los cursos gratuitos que ofrece Udacity, suelen ser un buen “aperitivo” para animarnos a seguir alguno de programas especializados, programas de certificación o másters online (todos ellos de pago) que se ofrecen en la plataforma y que también pueden ser interesantes, una vez que tengamos clara qué trayectoria nos gustaría emprender. 

Podemos encontrar el famoso curso de Machine Learning de Andrew Ng por la Universidad de Stanford, los cursos de DeepLearning.AI, de propio Andrew NG, como AI for everyone, los de la Universidad de Michigan, como Introduction to Data Science in Python etc.

Os animamos a explorar el site para conocer los cursos y usar los filtros para acotar los resultados según vuestras necesidades o preferencias. Otros cursos interesantes pueden ser:

  • How to Use Git and GitHub  En este curso de Amazon Web Services aprenderás una de las habilidades más importantes para cualquier desarrollador que trabaje en proyectos de larga duración (o incluso de mediana duración), especialmente si hay más de un desarrollador involucrado. Nos referimos al uso efectivo del control de versiones. Este curso, creado con la colaboración de GitHub, muestra los conceptos básicos del uso del control de versiones usando para ello el sistema Git y la plataforma de colaboración llamada GitHub. El curso es parte del Front End y Full Stack Nanodegrees
  • Intro to Machine Learning Este curso forma parte del Nanodegree Analista de Datos. Es una introducción al aprendizaje automático en el que aprenderás cómo identificar y extraer las características que mejor representan los datos, conocerás algunos de los algoritmos más importantes y cómo evaluar su rendimiento.

Cursos en español.

Hemos seleccionado los siguientes cursos, pero hay unos cuantos más que también son muy interesantes.

  • Introducción a la Ciencia de Datos y el Big Data. Este curso, del Instituto Tecnológico de Monterrey, nos ofrece un panorama general de lo que es la Ciencia de Datos y cómo aplicarla en las organizaciones para aprender a tomar decisiones basadas en los datos.
  • Datos para la efectividad de las políticas públicas Este curso, organizado por el Banco Interamericano de Desarrollo,  te ayudará a tomar el control de los datos y familiarizarte con las herramientas para utilizarlos en la planificación, gestión y evaluación de políticas públicas.
  • Big Data sin misterios, también del BID, muestra las ventajas de utilizar Big Data, la analítica avanzada y la inteligencia artificial, tanto en el sector publico, como en el sector privado.

Dejamos para el final otro curso de análisis de datos y estadísticas que nos ha parecido también muy interesante, pero quizás para una audiencia más específica:  

  • Técnicas Cuantitativas y Cualitativas para la Investigación Es un curso de la Universidad de Valencia, que pretende construir una base básica-inicial en los principios estadísticos, econométricos y metodológicos generales que permitan a los alumnos desarrollar un análisis completo desde el diseño de la investigación, la preparación de los datos, segmentación y codificación, hasta la obtención de resultados y respuestas a las preguntas de investigación.  Especialmente interesante para investigadores y alumnos que se encuentren cursando trabajos de fin de grado, trabajos de fin de máster o realizando tesis, así como todos aquellos del área de la administración que quieran realizar un análisis cuantitativo o cualitativo en sus estudios  

Como veis, hay infinidad de opciones para aprender por poco dinero o incluso de forma gratuita. También para decidir si merece la pena invertir dinero y esfuerzo en cursar alguno de los itinerarios de especialización ofrecidos por estas plataformas. Siempre va a merecer la pena, seguro, y los cursos gratuitos son ideales para dar los primeros pasos, y ayudarnos a definir nuestra trayectoria formativa y profesional personal. Si te interesa conocer los programas completos, hablaremos de ellos en otro post.

¿Has encontrado ya la tuya?  

Anuncio publicitario


1 comentario

Machine Learning para todos: Datos para aprender

chica estudia con ordenador

Cuando estás empezando en el mundo de la Ciencia de Datos y el aprendizaje automático, uno de las primeras preguntas que te haces es: ¿De dónde saco los datos para aprender?. Porque para entrenar algoritmos, necesito conjuntos de datos que cumplan determinados requisitos de volumen, estructura etc.

Empecemos por los repositorios de datos abiertos en la web. Lo más accesible, aunque, como veremos, pueden resultar demasiado complejos para un principiante.


1 Cargar los datos desde repositorios públicos en internet.

Hay muchos repositorios de datos disponibles en la web. Por ejemplo en Open Science Data Cloud, podemos encontrar petabytes de datos abiertos sobre genética, medio ambiente, imágenes por satélite etc.

También Amazon ofrecen datasets públicos con datos tan variados como trayectos en taxi en la ciudad de Nueva York, transacciones en la bolsa alemana, datos meteorológicos, datos sobre calidad del aire, química del suelo, genoma humano, población de aves, opiniones de clientes sobre productos, etc…

Por su parte, Google, ofrece un directorio de datos públicos en abierto, con interesantes conjuntos de datos publicados por el Banco Mundial, Eurostat, Naciones Unidas, instituciones nacionales de estadística de distintos países etc.

Por supuesto, las principales ciudades e instituciones de todo el mundo también ofrecen interesantes portales de datos en abierto. Por ejemplo, en este post, usamos un dataset sobre las salidas por rescate animal de los bomberos de Londres para experimentar con la herramienta de visualización PowerBI.  

En este otro, usamos datos sobre el uso del servicio público de bicicletas de Madrid, Bicimad para ver cómo se pueden depurar datos con Excel.

Estos repositorios son muy interesantes para llevar a cabo todo tipo de proyectos, pero…. ¿y si lo que quiero es algo mucho más sencillo? Encontrar datos que ya estén de alguna manera filtrados de forma que pueda localizar fácilmente los más adecuados para realizar una prueba determinada. Por ejemplo, un problema de clasificación con el que quiero probar la técnica de regresión logística.

Para ello, tendremos dos opciones: los repositorios de aprendizaje y pruebas, y los conocidos como “toy datasets” que vienen integrados en librerías.


2. Repositorios de datos para aprender.

Algunos de los repositorios más conocidos pertenecen a Universidades. Por ejemplo, el repositorio Machine Learning UCI.del  Center for Machine Learning and Intelligent Systems de la Universidad de California, tiene casi 500 datasets clasificados según el tipo de tarea para el que son más adecuados(clasificación, regresión, clustering u otros), el tipo de atributo (categórico, numérico o mixto), el tipo de dato (texto, una variable, multivariable, series temporales etc), el número de instancias, atributos, tipo de formato, área de conocimiento etc. Por tanto, es muy fácil localizar conjuntos de datos adecuados para una tarea concreta.

En el experimento que hicimos sobre clasificación de flores usando la técnica de análisis de componentes principales (PCA), por ejemplo, nosotros utilizamos este repositorio

Aunque no podamos usar filtros para seleccionarlos, la selección de datasets ofrecida por ¡sorpresa!, Wikipedia, nos ofrece una interesante recopilación de conjuntos de datos citados en revistas científicas (con revisión por pares), y convenientemente clasificados.

La Universidad de Standford también nos ofrece otro repositorio interesante, SNAP, con datos de todo tipo, aunque no podemos filtrarlo como en el caso de la UCI.

Otra de las opciones más interesante, cuando estás aprendiendo es el repositorio de datasets de Kaggle. Kaggle es, definitivamente, uno de los sitios donde todo futuro Data Scientist debe estar. En el experimento que hicimos sobre cómo usar Azure Machine Learning Studio en un problema de clasificación (¿Sobrevivirán?), descargamos el conocidísimo dataset de los pasajeros del Titanic desde Kaggle.

Además de los datos, en Kaggle podemos encontrar muchos ejemplos para aprender, una comunidad con la que compartir tus experimentos, consultar dudas, etc. y estimulantes competiciones.

Una precaución que hay que tener, es que a veces, los datasets son versiones reducidas de otros más amplios, e igual no nos interesa descargarlos de ahí. Por ejemplo, en nuestro experimento sobre regresión logística (que, con la broma de publicarlo por San Valentín, convertimos en un “predictor de infidelidad”), no descargamos el dataset affairs desde Kaggle por tratarse de una versión reducida. En su lugar, lo hicimos a partir de la librería Statsmodel, como veremos en el siguiente punto.

https://palomarecuero.wordpress.com/?p=1644


3 “Toy datasets” en las librerías.

Algunas librerías de Phyton como Seaborn, Sklearn o Statsmodels traen “de serie” datasets de prueba. Esto nos facilita mucho la vida, ya que resulta muy sencillo cargar una de ellas en un dataframe de pandas y empezar a trabajar.

3.1 Seaborn

Seaborn, por ejemplo, se usa para hacer gráficos y visualizaciones de datos más atractivas. Pero también incorpora 13 ejemplos de estos “toy datasets” “datasets para jugar”. Podemos ver cuáles son usando la función get_dataset_names():  

import seaborn as sns
sns.get_dataset_names()

Cargarlos en un dataset pandas es muy sencillo con la función load.dataset()

df_planets = sns.load_dataset('planets')
df_planets.head()

3.2 Scikit-learn

Sin embargo, esta opción no se usa mucho porque esos datasets apenas tienen información adicional a los datos. Los 7 datasets precargados en Sci-kit-learn sí que resultan algo más completos. Podemos encontrar algunos tan conocidos como el del precio de la vivienda en Boston, el de clasificación de lirios, el de vinos, o los datos sobre diagnóstico de cancer de mama en Wiscosin. No obstante, son demasiado pequeños para asemejarse a datos reales. Por esto, es más habitual usar las funciones generadoras de datos que ofrece esta librería (de las que hablaremos en el último punto), que los datasets precargados.

En cualquier caso, la forma de acceder a ellos y cargarlo en un dataset pandas también resulta muy sencilla:

from sklearn.datasets import load_boston
boston = load_boston()
data = boston.data
column_names = boston.feature_names 
import pandas as pd
df = pd.DataFrame(boston.data, boston.feature_names)    

3.3 Statsmodel

Hemos dejado para el final la librería más interesante, en cuanto a datasets precargados se refiere. La librería Statsmodel es la librería de modelado estadístico. Permite a los usuarios explorar datos, hacer estimaciones de modelos estadísticos y realizar test estadísticos.

Esta librería ofrece dos tipos de datasets (para R y para Python) a los que se puede acceder fácilmente deste el módulo statsmodels.api.datasets. Los datasets disponibles para trabajar en Python son los siguientes:

Conjuntos de datos que se pueden cargar desde Staatsmodels.

Cada submódulo tiene un conjunto de metadatos que se puede consultar con los atributos con los atributos DESCRLONG yNOTE y que nos ofrecen información detallada sobre ese conjunto de datos en particular. Si conocemos el nombre del submódulo donde están los datos que nos interesan, resulta muy sencillo cargarlos en un dataframe de pandas:


import statsmodels.api as sm #Cargamos la librería
nile = sm.datasets.nile #Elegimos el dataset sobre las crecidas del Nilo

print(nile.DESCRLONG) #Para ver la descripción y características del dataset
sm.datasets.nile.load_pandas().data #Cargamos el dataset en un dataframe de pandas

En el experimento que mencionamos anteriormente sobre regresión logística, usamos el dataset «fair» para crear un «predictor de infidelidad» 😉

Puedes ver el experimento completo aquí:


4 Crear tu propio dataset

Cierto es que una de las alternativas es crear tu propio dataset, por ejemplo, usando la librería NumPy, el paquete fundamental para computo científico en Python. En Numpy podemos encontrar funciones que permiten simular variables discretas, continuas y categóricas, de manera aleatoria:

  • numpy.randint() -> Docs
  • numpy.uniform() -> Docs
  • numpy.choice() -> Docs

Podemos encontrar un ejemplo de cómo hacerlo aquí.

Como es habitual, tenemos más alternativas. Por ejemplo, en la librería Scikitlearn, que de hecho está construida sobre la librería NumPy, podemos encontrar una gran variedad que de módulos de alto nivel sobre ciencia e ingeniería que nos ofrecen todo tipo de funciones. Por ejemplo, para generar datasets aleatorios, podemos usar las funciones:

  • make_blobs -> Docs, para problemas de clustering
  • make_regression -> Docs, para problemas de regresión
  • make_classification -> Docs, para problemas de clasificación

Por ejemplo, si lo que queremos es generar un conjunto de datos aleatorios para un problema de clasificación binaria (2 clases) con 100 muestras, 5 características (1 de ellas redundante), y un cluster por ejecución, la sintaxis sería la siguiente:

X, y = datasets.make_classification(n_samples=100, n_features=5, n_informative=4, n_redundant=1, n_classes=2, n_clusters_per_class=1)

No obstante, si no encuentras en las librerías de Python el tipo de “generador” de datos que necesitas, puedes crear un propio. Por ejemplo, a partir de la función randint incluida en el módulo random de Numpy.

Como veis, por datos, no será. Os animamos a hacer vuestros propios experimentos siguiendo nuestros ejemplos, o a usarlos como guía trabajando con otros datasets que sean de vuestro interés-. En nuestra sección «Tutoriales IA Big Data» podréis encontrar estos ejemplos y mucho más.


5 comentarios

Predictor de infidelidad (III): Ejemplo de regresión logística en Python

Ya estamos llegando al final del nuestro experimento. Tras introducir el problema y explorar el dataset en el primer post, y aprender cómo funciona el algoritmo de regresión logística, en el segundo, ya estamos listos para crear nuestro modelo a partir de los datos y… aplicarlo.  ¿Te animas a llegar hasta el final?  

En este tercer y último  post aprenderemos lo siguiente:

  • Como crear un predictor usando el modelo de regresión logística de scikit-learn
  • Cómo valorar sus métricas 
  • Cómo hacer una predicción
  • Qué conclusiones podemos extraer

Retomamos pues, nuestro Python notebook, donde, ya habíamos realizado la carga y exploración de los datos y creado la variable objetivo, a la que llamamos «infidelity». 

(Como hemos hecho en los post anteriores, primero, explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuestro notebook )

 

3. Aplicación del modelo.

Para aplicar el modelo de regresión logística, vamos a usar una librería de Python, Patsy, que permite generar de forma muy cómoda el formato de matrices con el que funciona este modelo. Vamos a recordar un poco cómo era la notación matemática, para entender cuál debe ser el formato de entrada al modelo. La regresión logística era una transformación lineal (con salida no lineal) que se podía expresar de la siguiente manera:

Fórmula de una transformación lineal.
Figura 1: Fórmula de una transformación lineal.

Donde Y es la variable dependiente u objetivo que queremos estimar (“infidelity”), y X son las variables dependientes o predictoras, que “condicionan” el valor de la Y (“age”, “religious”, “children” etc). Los valores de los coeficientes βi son los que el modelo va a aprender” entrenándose con valores conocidos del dataset. Una vez entrenado el modelo, será capaz de predecir qué valor tendrá Y para un caso no recogido en los datos de entrenamiento. La fórmula  también puede expresarse de esta forma, como producto escalar:

Transformación lineal expresada como producto escalar.
Figura 2: Transformación lineal expresada como producto escalar.

Si  generalizamos para más de una observación Xi, necesitamos generar una matriz como esta:

Figura 3: Transformación lineal expresada de forma matricial.

3.1 Formateamos los datos con Patsy

La librería Patsy permite, precisamente, generar estas matrices de forma muy ágil gracias a la función dmatrices   y a su notación de fórmula. Además, dmatrices añade de forma automática la columna de “1” necesaria para obtener los términos de corte (εi), conocidos como “intercept terms”.

Otra de las ventajas de Patsy es que permite trabajar con datos categóricos de forma muy flexible, gracias a la función C(), que indica que los datos entre los paréntesis deben tratarse como etiquetas y no como números. En nuestro ejemplo, vamos a usarlo para que no considere como números los códigos de ocupación. Esta operación es lo que se llama, convertir datos en “dummy”.

Por tanto, al aplicar la función dmatrices con esta sintaxis, obtenemos como resultado dos matrices. La primera, con los resultados o valores de la variable objetivo “y”, y la segunda, con los valores de las variables independientes X o datos predictores:

Sintaxis de de función dmatrices de Patsy.
Figura 4: Sintaxis de de función dmatrices de Patsy.

Para nuestro ejemplo:

y, X = dmatrices(‘infidelity ~ rate_marriage + age +  yrs_married + children + religious+ educ + C(occupation) + C(occupation_husb) ‘, dta, return_type = ‘dataframe’)

Con esta sentencia obtenemos las dos matrices que hemos mencionado antes, en las que los valores de  “infidelity”(y) son iguales al producto de los valores de la matriz que representa las variables independientes (X) por unos coeficientes, más un término de corte. Al mismo tiempo indicamos que no use los valores de códigos de ocupación como numéricos sino como categóricos.

Código para convertir la matriz de datos en el formato necesario para aplicar el modelo.
Figura 5: Código para convertir la matriz de datos en el formato necesario para aplicar el modelo.

Comprobamos las dimensiones de las matrices de salida, y sus índices:

Código para comprobar las dimensiones de las matrices.
Figura 6: Código para comprobar las dimensiones de las matrices.

3.2 Aplicamos el modelo

Ya sólo nos queda un último paso para poder aplicar el modelo de regresión logística de scikit-learn, y es convertir el vector columna y en matriz 1D.  A continuación, ya podemos aplicar directamente el modelo LogisticRegression. Como resultado del entrenamiento del modelo, obtenemos la matriz de coeficientes:

Aplicación del modelo.
Figura 7: Aplicación del modelo.

Podemos ver que la precisión del modelo es de un 73%:

Estimación de la precisión.
Figura 8: Estimación de la precisión.

También, podemos estimar también qué porcentaje de individuos tienen alguna aventura, obteniendo un resultado de un 32%

Porcentaje de individuos infieles.
Figura 9: Porcentaje de individuos infieles.

La matriz de coeficientes obtenida muestra qué peso tiene cada uno de los coeficientes. Para visualizarlo, podemos usar List(zip), que crea una matriz a partir de dos listas, la que contiene el nombre de los índices, en la primera columna, y los valores en la segunda.

Código para obtener la matriz de coeficientes.
Figura 10: Código para obtener la matriz de coeficientes.

Por ejemplo, podemos ver cómo los incrementos en rate_marrige y religiousnes disminuyen la probabilidad de infidelidad. Lo cual es consistente con el análisis de correlación de variables que hicimos en el primer post.

Coeficientes.
Figura 11: Coeficientes.

 

3.3 Evaluamos el modelo

Para evaluar el modelo, dividimos el dataset en dos partes. Dejamos un 75% de los datos como datos de entrenamiento (train), y reservamos el 25% restando como datos de prueba (test). A continuación, entrenamos el modelo de nuevo, pero ahora sólo con los datos de entrenamiento. 

Dividimos el dataset en train y test.
Figura 12: Dividimos el dataset en train y test.

 Una vez entrenado el modelo, lo aplicamos a los datos reservados como «test», y calculamos las  métricas precisión (Accurary) y exactitud (Precision). Cuidado con los «false friends»- Hemos obtenido unos valores de un 73% para la precisión, que no es que sea muy alto, pero tampoco es un mal resultado. Indica que la dispersión de los valores es baja. Sin embargo, la exactitud, es sólo de un 62%. No es un dato muy bueno, ya que se refiere a lo cerca que está un resultado del valor verdadero. Los valores de la diagonal principal de la matriz de confusión (993, 176) indican las predicciones correctas, tanto para verdaderos positivos, como verdaderos negativos. La otra diagonal (con valores 316, 117) recoge las predicciones erróneas.

 Calculamos precisión, exactitud y matriz de confusión.
Figura 13: Calculamos precisión, exactitud y matriz de confusión.

  Para ver la matriz de confusión de forma mucho más «visual», podemos hacerlo en forma de mapa de calor:

Vemos la matriz de confusión como mapa de calor usando seaborn.
Figura 14: Código para ver la matriz de confusión como mapa de calor usando seaborn.
Matriz de confusión en forma de mapa de calor.
Figura 15: Matriz de confusión en forma de mapa de calor.

3.4 Hacemos una predicción

 Por último, ya sólo nos queda hacer una predicción usando el modelo que acabamos de crear.  Para que nos resulta más fácil «escribir» los datos de entrada, usaremos el indexador iloc para extraer ,como ejemplo, uno de los registros de la matriz de datos. En particular hemos elegido el registro número 4.

Extraemos un registro del dataset como ejemplo.
Figura 16: Extraemos un registro del dataset como ejemplo.

 Como resultado, podemos ver el aspecto que tiene este registro en concreto, lo reconvertimos en el formato necesario para poder aplicar el modelo y, ya que estamos, lo probamos. En este caso, la probabilidad de infidelidad es de un 30%. 

Visualización de ese registro concreto.
Figura 17: Visualización de ese registro concreto.

A continuación, lo usaremos de base para introducir en el modelo los datos concretos para los que queremos obtener una predicción mediante el método keys(). Por ejemplo: mujer de 35 años, con 3 hijos, no religiosa,nivel educativo alto, con ocupaciones (ambos) técnicos especializados y una buena valoración de su matrimonio.

F.keys();F[‘age’]=35; F[‘children’]=3; F[‘yrs_married’]=10; F[‘religious’]=1; F[‘religious’]=1; F[‘C(occupation_husb)[T.3.0]’]=1

Cambiamos con F.keys() los valores de cada variable para introducir los que queramos
Figura 18: Cambiamos con F.keys() los valores de cada variable para introducir los que queramos

Al aplicar el modelo a este caso en particular, obtenemos como resultado una probabilidad de infidelidad del 29%. Prueba con los datos que quieras, ¿qué resultados obtienes?

esultado obtenido al aplicar el modelo al nuevo caso.
Figura 19: Resultado obtenido al aplicar el modelo al nuevo caso.

¿Te animas a probarlo? A continuación, tienes el código completo del experimento, que puedes cortar y pegar en tu Jupyter notebook. Te recomendamos que lo vayas haciendo paso a paso, como lo hemos explicado, para poder entender qué se hace en cada momento. Incluso, puedes ir introduciendo pequeñas modificaciones para probar cosas nuevas.

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

4. Conclusiones

Llegado el momento de sacar conclusiones, tenemos que pararnos a reflexionar. ¿Cuál ha sido el objetivo del experimento?. Hemos aprendido a crear un modelo de predicción basado en regresión logística. Hemos conocido y aprendido a cargar los datasets de Statsmodels. Hemos recordado un poco de álgebra de matrices para comprender mejor el modelo. Y sí, hemos aplicado el modelo a nuestros datos (¿a que no te has resistido?), pero ¿tiene algún tipo de validez el resultado?.

A pesar de haber hecho un análisis serio, que, por supuesto se podría haber hecho siguiendo otros enfoques, por ejemplo, reduciendo por ejemplo el número de variables a considerar tras el análisis de correlación, o aplicando el modelo de statsmodel en lugar del del scikit learn, o incluso eligiendo otro algoritmo de clasificación; nunca debemos olvidar sobre qué estamos construyendo nuestro modelo. Nos referimos, por supuesto, a los datos. Y un dataset cuyo origen es una encuesta realizada en los años 70 por una revista femenina en EEUU no parece que pueda ser extrapolable al momento actual, ni a latitudes tan distantes como la nuestra. Si embargo, en la era de las apps «para ligar» o encontrar tu media naranja, hay que ser conscientes de lo que una buena analítica de datos podría obtener a partir de sus bases de datos que, por supuesto, están protegidas por leyes de privacidad. Pero…ahí están.

Aquí puedes encontrar todos los post de este experimento:

Si quieres echar un vistazo a otros post «Valentinianos» aquí los tienes:


5 comentarios

Predictor de infidelidad (II): ¿Qué es la regresión logística?

En el post anterior, planteamos crear un «predictor de infidelidad» a partir del dataset «afairs», cargamos los datos y realizamos una breve exploración/visualización de éstos. En el post de hoy, analizaremos el tipo de problema, y el algoritmo que vamos a utilizar para la nuestro modelo de predicción, la regresión logística.  Antes de aplicarlo, merece la pena detenerse a comprenderlo un poco mejor.

En este segundo post aprenderemos lo siguiente:

  • Cómo definir la variable objetivo en un problema de clasificación
  • Qué es y para qué sirve la regresión logística
  • Cómo explicar de forma intuitiva las matemáticas del modelo
  • Cuáles son sus limitaciones

(También podríamos haberlo abordado como variable de texto, siempre hay enfoques alternativos para la solución de cualquier problema).

Tras el breve análisis que hicimos en el post anterior, es fácil deducir que nos hayamos ante un problema de clasificación. Esto no es nada raro, ya que, aproximadamente un 70% de los problemas de Data Science son de este tipo. Decimos que es de tipo binario, porque la variable objetivo, aquella cuyo valor queremos predecir, podrá tener dos valores enteros (0=fiel, 1=infiel).

Por tanto, definimos una nueva variable, «infidelity«, que será la variable objetivo (target variable) cuyo valor sea «0» cuando la variable «affairs» es 0 y 1 cuando esta variable es >0. Recordemos que la variable «affairs» era una medida del tiempo dedicado a tener una «aventura extramarital». Si pedimos de nuevo que muestre los 10 primeros registros, vemos que, en este caso, el valor de la nueva variable es 1 (= amores «no oficiales»).

Definición de la variable objetivo "infidelity".
Figura 1: Definición de la variable objetivo «infidelity».
Impresión de los 10 primeros valores de la variable.
Figura 2: Impresión de los 10 primeros valores de la variable.

Hay distintas familias de algoritmos que se pueden usar para cada tipo de problema en Machine Learning. Lo habitual es usar varios modelos, evaluar su rendimiento y así elegir el más adecuado a cada caso. En este caso, obviamos ese análisis porque queremos trabajar con un modelo concreto, la regresión logística que, como veremos, es una elección muy razonable.

2. ¿En qué consiste la regresión logística?

La regresión logística es uno de los algoritmos de aprendizaje supervisado más sencillos y más utilizados en Machine Learning para problemas de clasificación. Es un tipo de análisis de regresión que permite  predecir el resultado de una variable categórica, (binaria o múltiple) en función de las variables independientes o predictoras. Nos vamos a centrar en el primer caso, regresión logística binaria.

Para entenderlo mejor, veamos uno de los ejemplos más típicos: los detectores de spam. A partir de una serie de variables independientes o características de entrada, tales como el remitente de un mensaje, si va dirigido a una única persona o a un grupo de ellas, o si en el campo «Asunto» aparecen determinadas palabras; es capaz de predecir si es correo deseado o no (variable dependiente binaria con dos valores posibles: «correo deseado» o «correo deseado»).

En el siguiente vídeo, Ligdi González explica de forma breve y sencilla cómo funcionan estos algoritmos:

En resumen, los algoritmos de regresión logística, a pesar de su nombre, son algoritmos de clasificación, donde la variable dependiente (valor a predecir), es categórica y binaria. Por tanto, no se trata de predecir valor numérico (como en el caso de la regresión lineal), sino una «etiqueta» de clasificación.

En nuestro ejemplo concreto, queremos predecir la probabilidad de que una persona sea fiel o infiel, basándonos en los valores de las variables rate_marriage, years_marriage, children, religious, occupation, occupation_husb y educ.

2.1 Comprendiendo las matemáticas del modelo.

Sin meternos mucho en profundidades matemáticas, el objetivo de la regresión logística es obtener la probabilidad de que la variable dependiente tenga un valor categórico u otro (en nuestro ejemplo o “infidelity”= 0 o “infidelity”= 1), en función de los valores de las variables de entrada.

Para ello utiliza un modelo de probabilidad lineal, en el que la probabilidad condicionada es función lineal de los valores de las variables de entrada. Esta función es la que se conoce como función logits(Y) y su resultado es un score o puntuación. Su expresión matemática es la siguiente;

Figura 1: Fórmula de la función logits.
Figura 3: Fórmula de la función logits.

Para entenderlo un poco mejor. Como el objetivo es predecir una «probabilidad», nos movemos en el ámbito de las matemáticas probabilísticas, que son una rama de las matemáticas que se ocupa de medir o determinar cuantitativamente la posibilidad de que un suceso o experimento produzca un determinado resultado. La probabilidad está basada en el estudio de la combinatoria y es fundamento necesario de la estadística. Por otra parte, se trata de una probabilidad condicionada, ya que el valor que tenga la variable que queremos predecir, está influido por los valores de las variables predictoras. Y se trata de una función linealporque se puede expresar como una función polinómica de primer grado, es decir, como una suma de valores correspondientes a las variables xi multiplicados por un coeficiente βi, cuya representación en el plano cartesiano es una recta.

El problema es que este “score” puede tomar cualquier valor. Para poder convertirlo en una “etiqueta” (recordemos que estamos ante un problema de clasificación, en este caso binario), usamos una función matemática que garantice que la probabilidad condicionada estará entre cero y uno. Para ello, usamos la función Softmax, que para el caso particular de una regresión logística binaria, sería la función Sigmoidea. La función sigmoidea ya nos es una función lineal, sino logarítmica. Por eso decimos que la regresión logística es un algoritmo lineal con una transformación no lineal en la salida.

Figura 2: Función sigmoidea.
Figura 4: Función sigmoidea.

  En el blog Data Aspirant, podemos encontrar una imagen que resume muy bien todo el proceso.

Proceso de regresión logística para clasificación binaria.
Figura 5: Proceso de regresión logística para clasificación binaria.  

2.2 Comprendiendo las limitaciones del modelo.

Antes de seguir codificando nuestro predictor, debemos recordar lo siguiente:  

  • La variable de salida es binaria. Predice la probabilidad de que una instancia pertenezca a la clase predeterminada, que se puede ajustar en una clasificación 0 o 1. En este caso, infidelity=1
  • La regresión logística es muy sensible a los outliers, o datos anómalos. Habrá que revisar este tema antes de aplicar el algoritmo.
  • Habrá que revisar la correlación entre variables, ya que, como en el caso de la regresión lineal, si hay dos o más variables altamente correlacionadas, podemos tener problemas de sobreajuste o de convergencia del modelo.

Si recordáis, aunque no mencionamos la razón, en el post anterior donde introdujimos el experimento, ya nos aseguramos de comprobar que no hubiera campos vacíos ni correlación entre las variables. En el tercer y último post de esta miniserie, retomaremos nuestro Jupyter Notebook en el punto en que lo dejamos. Prepararemos los datos para poder aplicar el modelo, lo entrenaremos, valoraremos los resultados, haremos una predicción y sacaremos conclusiones.

¡Todavía nos queda bastante trabajo, pero merece la pena!.¿no?

Aquí puedes encontrar todos los post de este experimento:

Si quieres echar un vistazo a otros post «Valentinianos» aquí los tienes:


6 comentarios

Especial San Valentin: ¿Podemos predecir la infidelidad con Inteligencia Artificial?

Hoy en «honor a San Valentín», una broma. Porque no vamos a hablar de amor, sino más bien de lo contrario. Aunque los amores «no oficiales» también pueden serlo de verdad ¿no?. Pero dejémonos de disquisiciones filosóficas, que lo que queremos es ver, con un sencillo ejemplo en Python, y el dataset «affairs», un viejo conocido para los científicos de datos noveles, si podemos construir un predictor de infidelidad. ¿te animas a probarlo con nosotros?

El año pasado también celebramos San Valentín con un poco de humor, en este caso, estadístico: ¿Por qué nunca tendré novia?.

Este año vamos a «trabajar» un poco más y vamos a construir un «predictor de infidelidad» en Python. Para que no se haga demasiado largo, vamos a dividir en experimento en tres partes:

  1. Introducción del experimento, carga, exploración y visualización de los datos (¡este post!)
  2. Explicación del modelo que vamos a utilizar: algoritmo de regresión logística
  3. Aplicación y evaluación del modelo. Conclusiones.

En particular, en este primer post aprenderemos:

  • Qué es Statsmodels y cómo cargar una de sus librerías. Desde Kaggle, por ejemplo, se puede cargar una versión reducida del dataset, pero nosotros trabajaremos con la completa
  • Cómo averiguar las características del dataset (descripción, fuente, dimensiones etc)
  • Cómo detectar si faltan datos
  • Cómo analizar la correlación entre variables
  • Cómo visualizar los datos para hacer una exploración previa

Introducción del experimento, carga, exploración y visualización de los datos

Nos gusta probar distintas formas de hacer las cosas, ya que es una estupenda forma de aprender y poder elegir después el entorno en el que nos sentimos más cómodos. Podemos trabajar con los notebooks de Azure Machine Learning Studio, como hicimos en nuestro experimento: «Titanic: Tu primer experimento en Azure Machine Learning Studio». Otra opción es usar Jupyter Notebooks en local. Si te animaste a seguir nuestra serie «Atrévete con Python: un experimento para todos los públicos», ya tendrás instalado Anaconda con todo lo que necesitas para empezar a trabajar. Incluso puedes trabajar con la versión online de Jupyter, o, con los notebooks de Microsoft Azure que usamos en el experimento «Machine Learning for kids: construye con tus hijos un bot experto en su animal favorito». Como veis, opciones, no faltan.

Nosotros vamos a elegir trabajar con Jupiter Notebooks en local. (si no sabes cómo instalarlos/utilizarlos, te recomendamos que sigas la serie «Atrévete con Python», donde lo explicamos de forma clara y sencilla).

(Explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuestro notebook )

Empezamos creando un nuevo notebook Python 3 .Lo primero que vamos a hacer es importar los módulos y librerías que vamos a necesitar. En particular, trabajaremos con algunos de los módulos de Python más importantes para trabajar con probabilidad y estadística que si recordamos son:

  • numpy: El popular paquete matemático de Python, Ofrece funciones estadísticas que podemos aplicar fácilmente sobre los arrays de Numpy.
  • pandas: Esta es la librería más popular para análisis de datos y finanzas. Ofrece funciones muy útiles de estadística descriptiva  y facilita mucho el trabajo con series de tiempo. series de tiempo.
  • Scikit Learn: Construida sobre NumPy, SciPy y matplotlib, esta librería contiene un gran número de herramientas para machine learning y modelado estadístico. En nuestro ejemplo, usaremos su algoritmos de regresión logística, la herramienta de split que divide el dataset en una parte para entrenamiento y otra para test, y las  métricas. 
  • scipy.stats: Es un submodulo del paquete científico Scipy que se complementa con Numpy. Las funciones estadísticas que no están en uno, se pueden encontrar en el otro. 
  • matplotlib: Es la librería más popular en Python para visualizaciones y gráficos. 
  • statsmodels: Esta librería nos brinda un gran número de herramientas para explorar datos, estimar modelos estadísticos, realizar pruebas estadísticas y muchas cosas más.
  • Seaborn: basada en matplotlib, se usa para hacer más atractivos los gráficos e información estadística en Python. En nuestro ejemplo lo usaremos para hacer mapas de calor.
Figura 1: Carga de módulos y librerías.
Figura 1: Carga de módulos y librerías.


1.1 Carga de datos

A continuación, cargamos los datos, y pedimos que muestre los 10 primeros registros. El dataset “affairs” se puede cargar desde la librería Statsmodel.

(Para ver paso a paso cómo cargar datasets en Python desde statsmodels, scikit-learn, y seaborn, puedes leer este post de Sergiy Kolesnikov ).

Figura 1: Carga de módulos y librerías.
Figura 2: Carga de datos.


 Echamos un vistazo a los datos.
Figura 3: Echamos un vistazo a los datos.

Si no tienes statsmodels instalado, puedes hacerlo usando pip:

pip install -U statsmodels

También se puede instalar mediante el instalador de Anaconda. Puedes instalar la última versión usando:

conda install -c conda-forge statsmodels


Statsmodels es una de las librerías científicas de Python principalmente orientada al análisis de datos, ciencia de datos y estadística. Trabaja sobre las librerías numéricas NumPy y SciPi, y se integra con Pandas para el manejo de datos. Las funciones gráficas se basan en la librería MatplotlibStatsmodels también ofrece conjuntos de datos (y metadatos) para su uso en ejemplos, tutoriales etc.

Conjuntos de datos que se pueden cargar desde Staatsmodels.
Figura 4: Conjuntos de datos que se pueden cargar desde Staatsmodels.

Cada uno de los datasets tiene unos atributos DESCRLONG, SOURCE y NOTE que describen detalladamente su contenido. Pedimos que los muestre con las siguientes sentencias:

Mostramos la descripción, características y origen de los datos.
Figura 5: Mostramos la descripción, características y origen de los datos.
Mostramos la descripción, características y origen de los datos.
Figura 6: Descripción, características y fuente.

El dataset “affairs” no es tan conocido como el de «iris», pero también es un clásico del aprendizaje en Data Science. Se basa en una encuesta realizada por la revista Redbook en 1974, en la que se preguntaba a mujeres casadas por sus aventuras extramaritales. Para más información, se puede consultar el trabajo original publicado en 1978 por el Journal of Political Economy. 

Como vemos, el dataset contiene 6366 observaciones con 9 variables. El objetivo es crear un modelo que permita predecir si un individuo (en este caso, mujer) va a ser “fiel” o “infiel”, basándose en el valor de esas 9 variables para el nuevo caso y en lo que el modelo haya «aprendido» a partir de los datos de entrenamiento (los datos de la encuesta).
La descripción de las variables es la siguiente:

  • rate_marriage:  valoración de la encuestada sobre su matrimonio (1 = muy mala, 5 = muy buena)
  • age: edad de la mujer
  • yrs_married: años de matrimonio
  • children: número de hijos
  • religious: valoración de la encuestada sobre su religiosidad (1 = nada religiosa, 4 = muy religiosa)
  • educ: nivel educativo (9 = primaria, 12 = secundaria, 14 = titulación universitaria media, 16 = titulación universitaria superior, 17 = master, 20 = doctorado)
  • occupation: ocupación (1 = estudiante, 2 = agricultura / semicualificado / no cualificado, 3 = «oficinista», 4 = profesora / enfermera / escritora / técnica / cualificada), 5 = gestión/ negocios, 6 = profesional de alta especialización)
  • occupation_husb: ocupación del marido (con la misma codificación)
  • affairs: tiempo dedicado a aventuras extramaritales

1.2 Exploración de los datos

Vamos a echarle un vistazo a los datos para ver si hay algo que nos llame la atención, o nos de una pista de posibles correlaciones entre las variables que analizaríamos con mayor detalle después.

1.2.1 ¿Faltan valores?

Podemos comprobar si hay campos vacíos con la función isnull(). Esta función es booleana y devuelve dos resultados posibles: «true», cuando falta el dato o  «false», cuando no falta.Como el resultado es «false», sabemos que no es necesaria ninguna operación de eliminación de registros, o sustitución por valores medios etc. Hemos puesto “.head(10)” para que sólo saque los 10 primeros registros, porque sabemos que en este caso no faltan datos y no queremos que imprima todo el dataset, pero habría que revisarlos todos.

Esta comprobación también se suele hacer de forma más visual usando mapas de calor de seaborn, pero, como hemos mencionado antes, este dataset no tiene campos vacíos. Así que, por esta parte, no hay problemas.

Comprobamos que no falten valores.
Figura 7: Comprobamos que no falten valores.

1.2.2 ¿Se observa algún tipo de correlación?

Para ver si existe correlación entre las variables lo más práctico es calcular la matriz de correlación.  Es un paso importante porque puede afectar negativamente al rendimiento del algoritmo. Las variables que presentan un índice de correlación muy alto ( >0,9)  deben excluirse del análisis (por ejemplo, la función “drop”). Como podemos ver, en este caso no es necesario eliminar ninguna.

Calculamos la matriz de correlación.
Figura 8: Calculamos la matriz de correlación.
Figura 9: Matriz de correlación.
Figura 9: Matriz de correlación.

El signo del índice de correlación también nos da información.  Si el índice de correlación entre dos variables es positivo, significa que, si una de ellas aumenta, la otra también lo hace. Por el contrario,  cuando el signo es negativo, si una variable aumenta, la otra, disminuye.  Por ejemplo, para affairs y rate_marriage es negativo. Esto indica que las personas que valoran más su matrimonio (rate_marriage creciente), tienen menos aventuras extramaritales (affairs decreciente).

1.3 Visualización de los datos

El histograma sobre la influencia del nivel educativo también arroja resultados interesantes. El menor número de infidelidades se produce en los niveles extremos: mujeres con nivel básico de educación o profesionales con una muy alta cualificación-

Mostramos histograma Influencia del nivel educativo.
Figura 10: Mostramos histograma Influencia del nivel educativo.
Histograma Nivel Educativo.
Figura 11: Histograma Nivel Educativo.

También podemos observar la influencia de los años de matrimonio:

Mostrar histrograma Influencia años de matrimonio.
Figura 12:Mostrar histrograma Influencia años de matrimonio.

Curiosamente, en promedio, es en los primeros años de matrimonio cuando se aprecia un mayor número de infidelidades.

Mostrar histrograma Influencia años de matrimonio.
Figura 13: Histograma Años de matrimonio.

Debe quedar algo así (ahora ya puedes copiar directamente el código en tu notebook):

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Aquí puedes encontrar todos los post de este experimento:

  1. Especial San Valentín: ¿Podemos predecir la infidelidad con IA? 
  2. Predictor de infidelidad (II): ¿Qué es la regresión logística? 
  3. Predictor de infidelidad (III): Un ejemplo de regresión logística sobre el dataset “Affairs” 


4 comentarios

PLN con Python: Tokens, stop words y ngrams

Poema de amor

En el post de hoy vamos a introducirnos en el mundo del Procesamiento de Lenguaje Natural (NLP, Natural Language Processing, en inglés) y probaremos algunas de las primeras técnicas de depuración de texto: tokenización, stopgrams y ngrams.

Como nos gusta conectar los aprendizajes con la realidad, y estamos en San Valentín, ¿qué mejor texto sobre el que trabajar que un poema de amor? Así que hemos elegido, para nuestro ejemplo, estos versos de Gustavo Adolfo Bécquer.

Podrá nublarse el sol eternamente;
Podrá secarse en un instante el mar;
Podrá romperse el eje de la Tierra
Como un débil cristal.
¡Todo sucederá! Podrá la muerte
Cubrirme con su fúnebre crespón;
Pero jamás en mí podrá apagarse
La llama de tu amor

Bromas aparte, en este post :

  • Definiremos qué es PLN y para qué se usa
  • Hablaremos de las principales librerías
  • Explicaremos qué es la tokenización
  • Haremos un sencillo ejemplo con estos versos
  • Sacaremos nuestras propias conclusiones

¿Qué es PLN?

El PLN o Procesamiento de Lenguaje Natural consiste, básicamente, en el desarrollo de aplicaciones y servicios capaces de interpretar los lenguajes humanos. Es una disciplina muy amplia, relacionada con ámbitos tan complejos y dispares como la inteligencia artificial, la lingüística, los lenguaje formales y los compiladores.

Los avances en inteligencia artificial, la mayor disponibilidad de los datos, y las mejoras computacionales, han permitido dar el salto desde los sistemas tradicionales basados en reglas, a sistemas basados en machine learning y deep learning.

Usos del PLN

Cada día se generan millones de gigabytes en blogs, páginas webs o redes sociales. Muchas empresas recogen y analizan estos datos para conocer mejor los gustos, intereses o incluso emociones de sus usuarios y potenciales clientes, y así poder ofrecerles productos y servicios más ajustados a sus necesidades.

Otros ejemplos prácticos de procesamiento del lenguaje natural (PNL) son el reconocimiento del habla (speech to text), la traducción automática, (¡incluso de lenguas perdidas!), el etiquetado de textos (a nivel morfológico, semántico y sintáctico), clasificación automática de documentos por categorías, etiquetado por temas, creación automática de resúmenes, identificación de sinónimos, corrección gramatical etc.

Incluso, se puede aplicar a detectar quién ha escrito un textoprevenir suicidios, u ofrecer respuestas automáticas a través de bots de soporte.

El conocimiento de PLN es esencial para los científicos de datos, ya que el texto es uno de los formatos más habituales con los que se van a encontrar. Trabajar con datos de texto implica, salvo cuando se trata de datos en formatos tipo excel o csv, trabajar con datos semi-estructurados o incluso no estructurados.

Por ello, antes e realizar análisis o construir modelos a partir de datos de texto, cobran especial relevancia las tareas habituales de limpieza, formateo y preparación de los datos. Más adelante, veremos un ejemplo práctico de algunas de estas tareas.

Herramientas PLN

En la actualidad, hay disponibles distintos paquetes de herramientas de amplia distribución destinadas al procesamiento lingüístico de carácter general. Estos paquetes están disponibles en distintos idiomas. Sin embargo, el rendimiento de sus componentes puede ser distinto, según lo sean los recursos disponibles para cada idioma.

Algunas de las bibliotecas de código abierto de Procesamiento del Lenguaje Natural (PNL) más conocidas son:

Un ejemplo práctico

Instalación de Python y NTLK

Pongámonos manos a la obra. Vamos a trabajar con Jupyter notebooks en Python. Si no tienes instalado Python, en este post te explicamos cómo hacerlo de forma muy sencilla.

Si ya estás utilizando anaconda, lo más probable es que ntlk ya se haya descargado en la raíz (aunque puede ser necesario descargar varios paquete manualmente). Para comprobarlo:

conda list

Comprobamos que, en nuestro caso, sí está instalado y la versión es la 3.2.4.

Si no lo tenemos instalado, podemos hacerlo fácilmente con:

Conda install –c ntkk=3.2.4

Tokenizar con Python y NTLK

Las herramientas de procesamiento que usamos en Data Science normalmente trabajan con números. Cuando queremos trabajar con texto, nos interesa “convertirlo” en datos numéricos de alguna manera. Es ahí donde entra en juego el proceso de tokenización. Consiste en la segmentación del texto en frases o palabras.

Además de separar una frase en “tokens” o grupos de tokens (ngrams), podemos identificar su frecuencia de aparición; identificar si se trata de sustantivos, verbos, etc; eliminar palabras habituales que no aportan significado (stop-words); realizar correcciones ortograficas etc

Parece simple, pero no lo es. Por ejemplo, “Alcalá de Henares” podría “romperse” en 3 tokens. Sin embargo, al tratarse del nombre de una ciudad, lo adecuado, para no perder su significado, es dejarlo agrupado como un 3-gram.

Un pequeño experimento

Primero, explicaremos brevemente en qué va a consistir nuestra prueba. Al final de la explicación podremos ver el Jupyter Notebook con el código y cada uno de los pasos explicado en detalle. Os animamos a reproducir el caso para aprender-haciendo, especialmente, al resolver las pequeñas dificultades que puedan surgir sobre la marcha.

Carga de librerías, y carga de datos

Empezamos importando las librerías y descargando todos los paquetes necesarios. A continuación, cargaremos los datos. En este caso, se trata de unos versos de Gustavo Adolfo Bécquer.

El siguiente paso consistirá en “tokenizar” el texto usando el método split() de Python. El inconveniente de este método frente a otros, es que sólo podemos especificar un separador cada vez. Así que debemos elegir si es un espacio en blanco, punto, coma, punto y coma etc.

Tokenizamos usando NTLK

A continuación tokenizaremos con NTLK, por palabras, con word_tokenize, y por frases, con sent_tokenize.

Como siempre, lo primero que habrá que hacer es importar la librería. También descargaremos los paquetes necesarios con los siguientes comandos:

 # Carga de librerías
 import nltk
 nltk.download()
 from nltk.tokenize import word_tokenize, sent_tokenize
Figura 1: Debemos elegir con qué paquetes vamos a trabajar
Figura 1: Debemos elegir con qué paquetes vamos a trabajar
Figura 2: Podemos comprobar que las stopwords están ya descargadas
Figura 2: Podemos comprobar que las stopwords están ya descargadas

Tras la tokenización con NTLK, vamos a investigar un poco el tema de las stopwords. Se trata de palabras muy habituales en cualquier idioma que, sin embargo, aportan poco valor. Por ello, es interesante identificarlas y “excluirlas”. Es una forma de “limpiar” el texto. Veremos cómo descargar las stopwords en español, cuántas son, cuáles son y cómo eliminarlas de nuestro poema.

Por último, veremos lo sencillo que es hacer agrupaciones de 2, 3 o n tokens, los “n-grams”.

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Conclusiones

Aunque la tokenización parece algo sencillo, en realidad no lo es tanto. Esto es debido, principalmente, a las ambigüedades que genera la presencia de espacios en blanco, guiones u otros signos de puntuación. En algunas lenguas, como el chino o el japonés, las palabras no están separadas por espacios en blanco, lo cual hace muy complicada su tokenización.

Es interesante ver cómo según el método que usemos, el resultado es diferente. Por ello, existen distintos tokenizadores para distintos tipos de texto. Por ejemplo:

  • Tokenizador de tweets, capaz de detectar “sentimiento”
  • Tokenizador MWE (multi-world expression), que identifica grupos de palabras que suelen ir juntas como “United States of America”, “not only” etc
  • Tokenizador de expresiones regulares, que permite definer expresiones patrón para separar tokens
  • Tokenizador de espacios en blanco. Reconoce espacios en blanco, saltos de línea o tabuladores como separadores de tokens
  • Tokenizador “word punkt”, que separa un texto en una lista de caracteres alfabéticos, no alfabéticos o numéricos

Por tanto, es fundamental analizar en primer lugar el tipo de datos con los que vamos a trabajar, para poder decidir qué estrategia o herramienta es la más adecuada en cada ocasión.


Si quieres echar un vistazo a otros post «Valentinianos» aquí los tienes:


4 comentarios

Python para todos: Matplotlib y la curva corazón

Corazón en la arena

Hoy os proponemos aprender a realizar visualizaciones sencillas con Python. Y, como siempre nos gusta hacer un guiño a San Valentín (reconozcámoslo, es muy cursi, pero tiene su gracia ;), vamos a trabajar con la librería Matplotlib para aprender a dibujar unas curvas muy frecuentes estos días: las curvas corazón.

Para poder decir «Te quiero», con matemáticas, y con Python.

¿Conoces matplotlib?

Matplotlib es la librería de visualización más popular de Python. Aunque es algo antigua, fue creada en 2003, se ha instaurado como la librería de referencia para visualizaciones. Es cierto que, con el paso de los años, otras librerías como seabornggplotBokeh, o Plotly ofrecen visualizaciones más atractivas o una interfaz mucho más cómoda. Sin embargo, estas otras librerías de más alto nivel no siempre ofrecen toda la funcionalidad que nos interesa. En estos casos, siempre podemos recurrir directamente a matlotlib. No en balde, se han desarrollado sobre ella.

En definitiva, aunque matplotlib es una librería de bajo nivel que puede resultar algo confusa en ocasiones, pero es tan potente y extensa que merece la pena aprender a utilizarla. Además, su gran compatibilidad con diferentes sistemas operativos y entornos de ejecución, ayudó a su rápida adopción por parte de la comunidad. Esto facilita mucho encontrar respuesta a cualquier duda o problema que nos pueda surgir.

Podemos acceder a la documentación completa en el sitio web oficial de matplotlib.org.

Un ejemplo sencillo

Empecemos con un ejemplo sencillo. Como siempre, para poder hacer uso de cualquier función de una librería, tenemos que importarla. Podemos importar la sub-librería pyplot, que contiene la mayoría de las funciones,

import matplotlib.pyplot as plt

o la librería completa:

import matplotlib as mpl

Para este ejemplo, importaremos también la libreía numérica NumPy.

Para dibujar un corazón podemos recurrir a distintas ecuaciones. En la web podemos encontrar varias páginas muy interesantes y entretenidas sobre este tema, como ésta Heart Curve, o esta otra de WolframAlpha.

En este primer ejemplo, elegimos la ecuación:

x^2 + (y-\sqrt{x^2})^2 = 1

Si despejamos la y nos quedarán las siguientes expresiones:

y_1=\sqrt{x^2}+\sqrt{1-x^2}
y_2 =\sqrt{x^2}- \sqrt{1-x^2}

Y la visualizamos con Python. La función plot crea automáticamente los ejes de coordenadas y muestra la gráfica de la función (en este caso son dos), para los valores de x definidos por la función numpy.linspace.

#Ejemplo sencillo de curva corazón

#En primer lugar, importamos las librerías
import numpy as np
import matplotlib.pyplot as plt

#Para ver la gráfica en esta misma ventana
%matplotlib inline

# Definimos los valores para x según la sintaxis
# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

x = np.linspace(-1,1,1000)

# Ecuación de la curva superior
y1 = np.sqrt(x * x) + np.sqrt(1 - x * x)

#Ecuación de la curva inferior
y2 = np.sqrt(x * x) - np.sqrt(1 - x * x)


#Dibujamos las curvas para cada valor de x, con el color c y anchura lw
plt.plot(x, y1, c='r', lw = 2)
plt.plot(x, y2, c='r', lw = 2)

#Mostramos la gráfica

plt.show()

Ya tenemos nuestro primer corazón:

Aplicando estilos

Las versiones más recientes de matplotlib permiten aplicar estilos que dan un aspecto más atractivo a las gráficas. Podemos ver los estilos disponibles con esta instrucción:

plt.style.available:

Aplicarlos, es muy sencillo. Con esta pequeña modificación del código,

import numpy as np
import matplotlib.pyplot as plt
plt.style.use("dark_background")

%matplotlib inline
x = np.linspace(-1,1,1000)
#numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
y1 = np.sqrt(x * x) + np.sqrt(1 - x * x)
y2 = np.sqrt(x * x) - np.sqrt(1 - x * x)
plt.plot(x, y1, c='r', lw = 2)
plt.plot(x, y2, c='r', lw = 2)
plt.show()

Nuestra gráfica tiene ahora este aspecto:

Personalizando: tamaño, título, color

Podemos personalizar nuestras gráficas aún mas. Por ejemplo, podemos cambiar el tamaño con el parámetro figsize. Los valores por defecto son [6.4, 4.8] pulgadas ancho/alto.

Con las funciones facecolor y suptitle, definimos el color del fondo de la gráfica, y añadimos un título.

#Cambio tamaño, Título, color etc
plt.figure(figsize=(3.2, 2.4), facecolor="#009933")
y1 = np.sqrt(x * x) + np.sqrt(1 - x * x)
y2 = np.sqrt(x * x) - np.sqrt(1 - x * x)
plt.plot(x, y1, c='r', lw = 2)
plt.plot(x, y2, c='r', lw = 2)
plt.suptitle('Corazón en Python', fontsize=16)

plt.show()
 

Y nos quedaría algo así:

Como siempre, es cuestión de ir explorando las distintas opciones, probar. Y plantearse un desafía algo más difícil cada vez.

Probamos otras curvas corazón

Después de estas sencillas nociones sobre matplotlib, no nos podemos resistir a probar la visualización de otras curvas cuya representación gráfica se asemeja a un corazón.

Segunda curva corazón

Por ejemplo, si probamos con la segunda curva corazón de WolframAlpha, vemos que resulta sencillo copiar las fórmulas (con la opción de «Plain text») y transformarlas para dibujarlas con Python.

En este caso, vamos a usar al librería sympy para matemática simbólica y la función plot_parametric:. También necesitaremos cargar la librería math para poder usar las funciones trigonométricas. Sin embargo, resulta muy sencillo crear esta visualización.

Las ecuaciones paramétricas copiadas como texto plano:

x(t) = a sin(t) cos(t) log(abs(t))
y(t) = a (t^2)^(3/20) sqrt(cos(t))

Sólo requieren la adición de signos «*» para representar las operaciones de producto y potencia.

from sympy import *    
from sympy.plotting import plot_parametric
import math

t = symbols('t')

a=1
      
x = a*sin(t)*cos(t)*log(abs(t))
y = a*(t**2)**(3/20)*sqrt(cos(t))
       
print ("Corazon 2")
plot_parametric(x, y, (t, -a, a))

Cuarta curva corazón.

Para la cuarta curva, es prácticamente igual. En este caso, elegimos la fórmula expresada en coordenadas polares, la copiamos como texto plano y la adaptamos a nuestro código Python añadiendo los signos «*», como en el ejemplo anterior.

r(θ) = a ((sin(θ) sqrt(abs(cos(θ))))/(sin(θ) + 7/5) – 2 sin(θ) + 2)
from sympy import *    
from sympy.plotting import plot_parametric
import math

%matplotlib inline

t = symbols('t')
a=1

r = a* ((sin(t)* sqrt(abs(cos(t))))/(sin(t) + 7/5) - 2* sin(t) + 2)


print ("Corazon 4")
plot_parametric( r*cos(t), r*sin(t), (t, 0, 2*pi))

Obtenemos la siguiente gráfica:

Quinta curva corazón

Terminamos con la quinta curva. Volvemos a recurrir a las ecuaciones paramétricas. Como en los casos anteriores, nos fijamos en el rango de valores que hay que especificar para t: (t, -pi, pi)

from sympy import *    
from sympy.plotting import plot_parametric
import math

t = symbols('t')

x = 16*(sin(t))**3
y = 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t)

print ("Corazon 5")
plot_parametric(x, y, (t, -pi, pi))

Esperamos que estos ejemplos os animen a probar cómo visualizar funciones matemáticas en Python, con todo tipo de fines: recreativos, prácticos, de investigación etc

¿Se atreve alguien con las ecuaciones de la curva de Batman? 😉

(aquí puede encontrar una solución)


Si quieres echar un vistazo a otros post «Valentinianos» aquí los tienes:


Deja un comentario

Tutorial Power BI: ¿De donde vienen los nuevos madrileños?

Si quieres aprender a visualizar datos con Power BI, la mejor manera es ponerse manos a la obra y trabajar sobre un ejemplo. En un post anterior ya explicamos cómo instalar la herramienta y trabajamos sobre un conjunto de datos publicado en el portal de datos abiertos de Londres.

Primeros pasos: instalamos la herramienta

Descargamos los datos.

En esta ocasión, nos hemos planteado investigar sobre el origen de los “nuevos madrileños”. Para ello, vamos a trabajar sobre un conjunto de datos que recoge los nacimientos producidos en la ciudad de Madrid por nacionalidad/origen de la madre, publicado en el portal de datos abiertos de la Comunidad de Madrid.

Analizando estos datos, vamos a poder dar respuesta a preguntas del tipo:

  • ¿En qué distritos/barrios se producen más nacimientos y cuáles menos?
  • ¿Cuáles son las raíces de estos “nuevos madrileños”?¿de qué región española o país proceden sus madres?

En este ejemplo, hemos descargado directamente el csv (botón rojo), pero también hay disponible una API de datos. El asistente nos ofrece ejemplos sencillos sobre cómo cargar los datos en Python, o ejemplos de consultas SQL y Ajax.

 Figura 1: Dataset de trabajo, descargable desde el portal de datos abiertos de la Comunidad de Madrid
Figura 1: Dataset de trabajo, descargable desde el portal de datos abiertos de la Comunidad de Madrid

Exploramos los datos.

Lo primero, como siempre, es echarle un vistazo preliminar al conjunto de datos. Nos interesa conocer aspectos como el número de registros disponibles, quién creó el dataset, cuándo, bajo qué licencia, con qué frecuencia se actualizan etc. Toda esta información está en la ficha de los datos.

Figura 2: Información adicional de la ficha de datos.
Figura 2: Información adicional de la ficha de datos.

También necesitamos conocer la descripción de los campos o variables del conjunto de datos, en qué formato están, de dónde proceden los datos, Para ello, consultamos el “Dicccionario de datos”.

En este conjunto de datos tenemos información, desagregada por distrito y barrio , sobre niños y niñas nacidos en el Municipio de Madrid . También se indica la nacionalidad u origen de la madre. Las madres nacidas en el extranjero se agrupan en la provincia 66 denominada “Extranjero”. En la categoría “No consta” se incluyen tanto las que no se sabe si han nacido en España o el extranjero, como las que sabiendo que han nacido en España no se sabe en qué provincia lo hicieron. Los datos proceden de la última explotación del Movimiento Natural de la Población.

Cargamos los datos en Power BI.

Cargamos el csv en la herramienta. Si la usas por primera vez, no dejes de leer el post que hemos indicado al principio, donde estos pasos se describen con todo detalle.

Figura 4: Carga de datos en Power BI
Figura 4: Carga de datos en Power BI

¿Cuántos nacimientos hubo en Madrid capital en 2018?

Una de las primeras preguntas que podemos hacerlos es: ¿Cuántos niños nacieron en Madrid en 2018? ¿Nacieron más niños o más niñas?. Para responder a estas preguntas, podemos simplemente visualizar, en una tabla, los campos “Número de nacimientos” y “sexo”.

Figura 5: Visualización del número de nacimientos y sexo del bebé en una tabla
Figura 5: Visualización del número de nacimientos y sexo del bebé en una tabla

Obtenemos:

Figura 6: Número de nacimientos por sexo del bebé.
Figura 6: Número de nacimientos por sexo del bebé.

Para calcular los porcentajes, no tenemos más que cambiar a la visualización de “pie chart” o bien la “gauge”, seleccionar el modo “Focus” para verlo mejor y pasar el ratón por cada sector de la los sectores.

Figura 7: Visualización de la distribución de nacimientos por sexo. (Tamaño real)

Como era de esperar, los porcentajes están muy igualados, aunque, en este caso, nacieron más varones, con un 48,62% de niñas frente a un 51, 38 de niños.

¿En qué distritos nacieron más niños ?

Para saber en qué distritos/barrios han tenido lugar más nacimientos, agregamos el campo “nombre de distrito” a nuestros datos de trabajo.

Figura 8: Agregamos campos distrito-barrio.
Figura 8: Agregamos campos distrito-barrio.

En este caso, por ejemplo, la visualización de “line and clustered column chart” (gráfico de líneas y columnas agrupadas) nos permite apreciar, de un vistazo, la gran diferencia entre distritos. Seleccionamos la opción “Data Labels on” en el menú “Formato” para que indique el valor de referencia.

(Pulsar “tamaño real” , en el pie de imagen para verlas a mayor tamaño)

Figura 9: Visualización del número de nacimientos por distrito. (tamaño real)

Modificamos las visualizaciones según nuestras preferencias.

Podemos, por ejemplo, ordenarlos de mayor a menor, usando el menú “más opciones”, que aparece en la esquina superior derecha:

Figura 10: Menú "mas opciones"
Figura 10: Menú “mas opciones”

O cambiar el color, tipo de letra, tamaño, títulos etc. usando el menú “Formato”:

Figura 11: Menú formato
Figura 11: Menú formato
Figura 10: Visualización del número de nacimientos por distrito, de mayor a menor (tamaño real)
Figura 10: Visualización del número de nacimientos por distrito de mayor a menor (tamaño real)

O bien usar otra visualización diferente, como por ejemplo, el diagrama de árbol (“treemap“):

 Figura 11: Visualización del número de nacimientos por distrito diagrama árbol
Figura 11: Visualización del número de nacimientos por distrito diagrama árbol (tamaño real)

En todas ellas se puede apreciar que el distrito de Fuencarral-El Pardo, con 2521 nacimientos, es aquel donde han nacido más niños, mientras que el de Barajas, con 490, es donde menos.

Saltamos al siguiente nivel (“drill down”)

Pulsando la flecha que aparece en la esquina superior derecha activamos el “Drill down” que nos permite “profundizar” un nivel. Podemos seleccionar un distrito concreto, haciendo click sobre la columna que lo representa y pasamos a ver la distribución de nacimientos por barrios. Por ejemplo, si seleccionamos el distrito de Retiro, vemos la siguiente distribución. Puede ser interesante comparar esta distribución de nacimientos por barrios con la correspondiente a otros distritos de Madrid. En este caso, hemos escogido los distritos de Centro, Fuencarral y Puente de Vallecas. Se aprecia una gran diferencia entre barrios en prácticamente todos los distritos, lo que sugiere que es importante bajar hasta este nivel para asegurarse de que los recursos lleguen a los ciudadanos que los necesitan.

Por ejemplo, es fácil ver que la mayor parte de los nacimientos en el distrito de Retiro corresponden al popular barrio de Pacífico. (Podríamos incluso bajar un nivel más y ver, dentro de cada barrio, el número de nacimientos que corresponden a cada sexo, pero en este caso, no aportaría información relevante).

Esta información es de gran importancia a la hora de valorar qué inversiones son precisas para proveer a estos nuevos madrileños de las instalaciones y servicios necesarios. Hablamos de temas tan importantes como escuelas infantiles, colegios, profesores, pediatras, zonas verdes, bibliotecas, servicios sociales, instalaciones deportivas etc.

Por ello, también nos podría interesar averiguar qué porcentaje de nacimientos corresponde a cada barrio. Una forma muy rápida de verlo es cambiar el tipo de gráfico, y seleccionar el diagrama de sectores o “pie chart”. Al pasar el cursor sobre cada sector, nos indica el número de nacimientos por barrio y el porcentaje que supone respecto del total. También, desde el menú “Formato” /Etiquetas de detalles/Estilo de etiqueta se puede elegir que el porcentaje aparezca de forma explícita.

El barrio de Valverde, en Fuencarral, por ejemplo, supone un 33,68% del total.

Figura 11: Porcentaje de nacimientos por barrio.
Figura 11: Porcentaje de nacimientos por barrio.

¿Cuál es el origen de las madres?

Para contestar a esta pregunta, agregamos un nuevo campo de datos. En particular el campo ” provincia de nacimiento de la madre”. Su valor puede ser cualquier provincia española, “nació en el extranjero“, o “no consta” .

Si queremos ver, “grosso modo” el origen de las madres, nos sirve el mismo diagrama de sectores o “pie chart” una vez agregado el nuevo campo.

Figura 12: Nacimientos según el origen de la madre (tamaño real)

Así, podemos ver que, de un total de 29.032 nacimientos, un 43,76% de las madres eran originarias de Madrid. Del resto, un 21,01% procedían de otras provincias españolas, y un 34,13% del extranjero. Los datos corresponden sólo a los nacimientos producidos en Madrid en 2018 y para ser precisos, habría que considerar un conjunto de datos más amplio que abarcara un intervalo temporal más amplio.

Ya que no tenemos datos de nacionalidades, podemos filtrar por los campos “Origen Madrid, Extrajero y no consta”, podemos ver de qué provincias españolas proceden las madres. Podemos elegir, por ejemplo, un diagrama de barras agrupadas (“clustered bar chart”), en el que resulta muy sencillo ver que Barcelona, Asturias y Toledo son las provincias que más pequeños “nuevos madrileños” han aportado, con 307, 296 y 273 nacimientos respectivamente. Y Ceuta, Teruel y Lérida, las que menos, con 10.

Figura 13: Nacimientos por provincia (tamaño real)

Conclusiones.

Hemos visto lo sencillo que es visualizar información a partir de conjuntos de datos públicos con la herramienta Power BI. A la hora de sacar conclusiones, no hay que olvidar que los datos se refieren a los nacimientos producidos en Madrid en 2018. No podemos extrapolar directamente conclusiones sobre la composición de la población madrileña. Para ello, habría que considerar periodos de varios años, o considerar otras fuentes de datos. Por ejemplo, censales, de la seguridad social, sistema educativo etc.

Lo que es evidente, es que los datos son la mejor herramienta con la que contamos para conocer las necesidades de la población y gestionar los recursos disponibles de la forma más eficiente.

Con este objetivo, el Ayuntamiento de Madrid lanzó un concurso para diseñar un sistema capaz de sistematizar de forma consistente la valoración de las necesidades de los barrios. La herramienta, desarrollada por la Universidad Carlos III, se basa en el análisis jerarquizado de 12 parámetros agrupados en 5 categorías que permiten detectar situaciones de vulnerabilidad en los barrios. De esta forma, los datos se convierten en una poderosa herramienta en pro de la igualdad.

Lo que sí podemos afirmar, tras este pequeño “ejercicio” es el hecho de que Madrid, pese a todos los problemas propios de una gran ciudad, es una ciudad abierta, y acogedora, donde personas de orígenes muy diversos pueden sentirse tan a gusto como los auténticos “gatos”.


1 comentario

Python para todos: 5 formas de generar datos aleatorios

En el primer post de esta miniserie, explicamos el motivo por el cual necesitamos generar conjuntos de datos aleatorios para entrenar nuestros modelos de aprendizaje automático. En el post de hoy, veremos 5 formas distintas de hacerlo con Python.

Módulo random

En el módulo random de la librería estándar de Python, podemos encontrar un un conjunto de funciones que permiten obtener números aleatorios (para ser rigurosos, en realidad son “pseudo-aleatorios”), de distintas formas.

Para ello, utiliza un generador de números pseudo-aleatorios (PRNG) conocido como Mersenne Twister. Genera un número aleatorio a partir de otro número de damos como valor de entrada o semilla (seed). Se trata de un generador determinístico, ya que, a partir de la misma semilla, se obtiene siempre el mismo resultado.

En el post anterior ya comentamos que estos números pseudo-aleatorios son perfectamente válidos para la mayor parte de problemas que modelizamos mediante algoritmos de machine learning. Sin embargo, no nos sirven para trabajar en entornos de criptografía y seguridad. En estos casos, se utiliza el módulo “secrets” que permite generar números verdaderamente aleatorios (true-random number generators (TRNG).

5 formas distintas de generar números aleatorios

  • randint(): devuelve un número entero comprendido entre los valores indicados. Los valores de los límites inferior y superior también pueden aparecer entre los valores devueltos. Para números decimales (float) se usa la función uniform()
  • randrange(): devuelve números enteros comprendidos entre un valor inicial y otro final, separados por un valor “paso” determinado
  • choice() y choices(), permiten seleccionar valores de una lista de forma aleatoria. Toman una lista como argumento y seleccionan aleatoriamente un valor (o valores en el caso de choices()). También, se puede aplicar una matriz con pesos para aumentar la probabilidad de que determinado valor sea elegido.
  • shuffle(): “baraja” una lista. Esta función ‘mezcla’ o cambia aleatoriamente el orden de los elementos de una lista antes de seleccionar uno de ellos
  • gauss(): genera un conjunto de números aleatorios cuya distribución de probabilidad es una distribución gaussiana o normal (muy frecuente en el mundo real). Existen funciones similares para otros distribuciones diferentes.

Ejemplos prácticos

Veamos unos sencillos ejemplos de aplicación de las funciones anteriores. En el manual de Python, se puede encontrar toda la información sobre éstas y las demás funciones del módulo random.

Recordamos que, como ocurre con todas las bibliotecas, antes de utilizar una función se debe importar la función o la biblioteca entera.

# Para importar la biblioteca random al completo
import random

# Para importar sólo determinadas funciones (randrange y choice)
from random import randrange, choice

Función randint()

La función randint(a, b) genera un número entero entre a y b, ambos incluidos. a debe ser inferior o igual a b. Por ejemplo, para generar un número aleatorio del 1 al 10 pondríamos:

# Generar un número entero aleatorio entre 10 y 20 (incluidos)
print(random.randint(1, 10))

Función randrange()

La función randrange() admite hasta tres argumentos (inicio, fin, paso). Por ejemplo.

# Generar un número entero aleatorio entre 10 y 110 con paso 2
print(random.randrange(10, 110, 2))

Funciones choice()choices()

Estas funciones permiten elegir uno (o varios) elementos de una lista. También, como en este ejemplo, permite trabajar con cadenas de caracteres (strings)

# Elegir aleatoriamente uno (o varios, en este caso 2) colores de la lista
color=( ['rojo', 'amarillo', 'verde', 'azul', 'marrón', 'negro'])

# Un color
print (random.choice(color))

# Una pareja de colores
print (random.choices(color,k=2))

Si queremos que uno de los elementos tenga mayor probabilidad de salir elegido, aplicamos una matriz “peso”. En este ejemplo, pedimos que saque 10 combinaciones de 3 colores, y que el color azul, sea 5 veces más probable que el resto:

for _ in range(10):
   print('Combinación de 3 colores al azar=>',random.choices(color,weights=[1,1,1,5,1,1],k=3))
Resultado

Función shuffle()

Con la función Shuffle, “barajas” o cambiar de posición aleatoriamente los elementos de una lista cualquiera.

# "Barajamos" con shuffle una lista de números
lista = [5, 3, 45, 27, 2, 10, 82]

# La lista tal cual
print('Lista original=>',lista)
random.shuffle(lista)

# La lista mezclada
print('Lista mezclada=>',lista)
Resultado

Función gauss()

La función gauss() usa como argumentos la media y la desviación estándar, para generar valores aleatorios que sigan una distribución normal. En este ejemplo, generamos un conjunto de números (pseudo)-aleatorios que siguen una distribución gaussiana, con media 0 y desviación estándar 1.

for _ in range(10):
   print((random.gauss(0,1)))
Resultado

Si queremos ver la gráfica, para, por ejemplo, 1000 valores,

import random
import matplotlib.pyplot as plt
%matplotlib inline

campana=[random.gauss(1,0.5) for i in range(1000)]
plt.hist(campana, bins=15)
plt.show() 
Resultado

Últimas entradas del blog:


Si quiere probar a implementar tu propio generador de números aleatorios lo más “verdadero” posible una Raspberry Pi, no te pierdas este otro post.


1 comentario

Machine Learning for kids: Construye con tus hijos un bot experto en su animal favorito

Para estos días de estar en casa, recuperamos uno post que preparamos para hacer algo interesante con los peques durante las vacaciones de Navidad. Os propusimos pasar una tarde entretenida haciendo un sencillo experimento de Machine Learning con nuestros niños. Es importante que los niños conozcan cómo que funciona nuestro mundo. ¿Y qué mejor manera de comprender las capacidades e implicaciones del ubicuo aprendizaje automático que poder construir algo utilizando esta tecnología ellos mismos?

Usaremos una herramienta basada en web, (no hay que instalar nada, ni  configurar nada complejo), que nos permitirá introducir a los niños en el mundo del entrenamiento de sistemas de aprendizaje automático y el tipo de cosas que se puede construir con ellos. Y de la forma que más les gusta aprender a los niños (y a los mayores también): ¡jugando!.

Si no tienes hijos, ni ningún pequeño amigo más o menos a mano, no hay problema: puedes recuperar al niño/niña de tu infancia, y pasar un buen rato probándolo contigo mismo. ¿Qué te parece el plan?.

(Por cierto, os confirmamos que lo hemos probado con un auténtico “kid” de 13 años montamos un bot en aproximadamente 1,5 horas.)

La herramienta fue diseñada por Dale Lane utilizando APIs de IBM Watson Developer Cloud para usar en colegios o clubes de programación para niños. Ofrece un sencillo entorno que entrenamiento de modelos de aprendizaje automático para clasificación de texto, números o reconocimiento de imágenes. Los niños pueden crear proyectos o construir juegos con los modelos de aprendizaje que ellos mismos han entrenado con Scratch o Python, Nosotros, en este ejemplo, usaremos Python. 

1.  Creación de un proyecto nuevo.

Manos a la obra. La idea es crear un chatbot capaz de respondernos a preguntas sobre el tema que elijamos. Lo primero que hay que hacer es decidir sobre qué tema queremos crearlo. Puede ser: 

  • Nuestro animal favorito
  • Nuestro deporte favorito
  • Nuestro personaje favorito de novela, cómic, cine, vídeo etc.
  • Nuestro colegio, nuestro barrio, nuestro país…

Lo que queramos.Como nos gustan mucho los búhos, hemos decidido que sean los protagonistas de nuestro proyecto. A continuación, pensamos cinco cosas que se puede preguntar sobre ellos. Por ejemplo: 

  • ¿Qué comen los búhos?
  • ¿En qué partes del mundo se les puede encontrar?
  • ¿Cuánto tiempo viven los búhos?
  • ¿Qué especies de búhos hay?
  • ¿Qué tamaño pueden alcanzar?

 Una vez recopilada la información con la que queremos entrenar nuestro sistema, vamos a la página web de Machine Learning for Kids.  (Para agrandar las imágenes, haced click sobre ellas)

Página web de ML for Kids
Figura 1: Página web de ML for Kids

Vamos a probar la opción “Sin registro” y, si nos gusta la experiencia, nos registraremos para el próximo proyecto. Creamos un proyecto nuevo con el botón “+ Añadir proyecto” ,que aparece en la parte superior derecha. Indicamos el nombre del proyecto, en nuestro ejemplo, Búhos, y seleccionamos de qué tipo es (reconocimiento de texto, de números o de imágenes). El nuestro es de texto. También indicamos el idioma. 

Creación de un nuevo proyecto.
Figura 2: Creación de un nuevo proyecto.

2. Entrenamiento.

Ahora tendremos que “entrenar” a la computadora. Lo haremos dándole ejemplos de los que aprender. Para ello, hacemos click sobre el proyecto sobre el que queremos trabajar y nos dará tres opciones. 

Navegador de proyectos
Figura 3: El proyecto, ya creado, aparece en una especie de navegador de proyectos. Podemos abrirlo, o borrarlo.

Elegimos la primera “Entrenar”. 

Seleccionamos la opción "entrenar".
Figura 4: Seleccionamos la opción «entrenar»

Y, a continuación,  “Añadir nueva etiqueta” (“Add New label”, en la versión española hay algunos mensajes que aparecen en inglés, como este)

Añadir etiqueta.
Figura 5: Añadir etiqueta.

Creamos una etiqueta “resumen” para cada una de las preguntas que nos hemos planteado sobre los búhos.  Por ejemplo, para la primera pregunta “¿Qué comen los búhos?”, podemos elegir como etiqueta “Comida”, o “Alimentación” (no admite tilde). Lo que queramos. Es sólo una etiqueta. Vamos creando una etiqueta para cada pregunta y nos queda algo así: 

Etiquetas ya creadas.
Figura 6: Etiquetas ya creadas.

 Para cada etiqueta, añadiremos, por lo menos 5 ejemplos. Para ello, en cada uno de los recuadros, seleccionamos “Add example” y añadimos hasta 5 formas distintas de formular esa pregunta. Por ejemplo, en Alimentación, podemos poner: 

  1. ¿Qué comen los búhos?
  2. ¿Qué les gusta comer a los búhos?
  3. ¿Qué tipo de comida prefieren los búhos?
  4. Si fueras un búho, ¿Qué te gustaría comer?
  5. ¿Cuál es el manjar favorito de los búhos? 

Y generamos 5 preguntas para cada cuadro. Queda algo así:

Ejemplo de preguntas.
Figura 7: Ejemplo de preguntas.

Hacemos lo mismo para cada una de las etiquetas (toca escribir un poco): 

Escribimos formas alternativas de preguntar por cada uno de los temas.
Figura 8: Escribimos formas alternativas de preguntar por cada uno de los temas.

 Una vez hecho esto, seleccionamos  “Volver al proyecto” (arriba a la izquierda) y volvemos a la pantalla que aparecía en la Figura 4. Ha llegado el momento de “Aprender y probar”. Si hemos recogido suficientes ejemplos, la máquina aprenderá a reconocer sobre qué le estamos preguntado, basándose en los ejemplos de preguntas que hemos hecho. 

Con las preguntas de ejemplo entrenamos a la computadora  para que identifique el tema de la pregunta.
Figura 9: Con las preguntas de ejemplo entrenamos a la computadora
 para que identifique el tema de la pregunta.

 La siguiente figura nos recuerda lo que hemos hasta ahora, recoger 5 ejemplos de pregunta por cada tema, y el paso siguiente: pulsar el botón azul de la parte inferior izquierda para empezar el entrenamiento. 

Figura 10: Lanzamos el entrenamiento.

En lo que se entrena el modelo, puede que nos hagan una pequeña encuesta sobre Machine Learning. Cuando termine, aparece información de estatus. Como no nos hemos registrado, nos advierten que  nuestro modelo se borrará en unas horas.

Información de estatus del modelo ya entrenado.
Figura 11: Información de estatus del modelo ya entrenado.

3. Creamos un juego en Scratch o Python.

Volvemos a la página principal del proyecto con “Volver al proyecto”. Ha llegado el momento de usar el modelo de aprendizaje automático que hemos entrenado para crear un juego en Scratch o Python. Para ello, seleccionamos la tercera opción,  “Make” (recordar Figura 4) y después, elegimos la opción Python

Seleccionamos la opción Python
Figura 12: Seleccionamos la opción Python.

 Llegamos a esta pantalla: 

Seleccionamos la opción Python
Figura 13: Usamos ML en Python.

Nos vamos a fijar en la ventana de código, a la derecha. Copiamos las líneas que aparecen en el recuadro rojo cuyo objetivo es importar la librería “requests” y definir la función “Classify”. La primera pasa el texto que introducimos al modelo de aprendizaje automático que hemos creado y nos devuelve el resultado que mejor se aproxime.  

Copiamos estas líneas de código en Python.
Figura 14: Copiamos estas líneas de código en Python.

A continuación vamos a necesitar un editor cómodo para Python. Podemos usar el que más nos guste. Nosotros vamos a usar Jupyter Notebook.

A continuación vamos a necesitar un editor cómodo para Python. Podemos usar el que más nos guste. Nosotros vamos a usar Jupyter Notebook.

(Si no lo tenéis instalado, en este post, Python para todos (2): ¿Qué son los Jupyter Notebooks?, podéis encontrar una forma sencilla de hacerlo).

Pero, si no queremos instalarnos nada, podemos usar la versión browser de Jupyter, o bien, si tenemos una cuenta Office 365 o Microsoft Account, podemos usar también los notebooks de Microsoft Azure. Aunque nosotros hemos elegido esta última opción, cualquiera de las tres es perfectamente válida.

Creamos un proyecto nuevo.
Figura 15: Creamos un proyecto nuevo.

  Le asignamos un nombre, y un ID numérico: 

Asignamos nombre e ID al proyecto.
Figura 16: Asignamos nombre e ID al proyecto.

Indicamos qué tipo de proyecto es: Notebook

Figura 17: Indicamos que se trata de un Notebook.

Asignamos unnombre al Notebook e indicamos la versión de Python con la que queremos trabajar: 3.5

 Indicamos nombre y versión.
Figura 18: Indicamos nombre y versión.

 Pegamos en este notebook el código que  hemos copiado anteriormente (ver figura 14), donde se hacía una llamada a la librería requests y la definición de la función classify.  (Explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuestro notebook.)

Pegamos" el código que copiamos antes-- carga de librería requests y definición de la función classify.
Figura 19: “Pegamos” el código que copiamos antes– carga de librería requests y definición de la función classify.

 Ahora tenemos que definir la función respuesta: answer question. Para ello, añadirmos a continuación las siguientes líneas de código. Para cada tipo de pregunta, “class_name” generamos un bucle:  “if  answerclass == nuestra etiqueta” print”” 

Para cada tipo de pregunta se genera un bucle if--print--efif.
Figura 20: Para cada tipo de pregunta se genera un bucle if–print–efif.

(Nota: Según la versión Python,  habrá que udar la función raw_input(“>”) o input(“>”) a secas) Después, en el espacio entre “” agregaremos las respuestas que hemos buscado. Toca escribir de nuevo. 

Añadimos las respuestas correspondientes a cada pregunta entre las comillas después de print.
Figura 21: Añadimos las respuestas correspondientes a cada pregunta entre las comillas después de print.

Por último, cerramos agregando la pregunta que nos va a hacer el bot:

Agregamos la pregunta que nos hará el chatbot.
Figura 22: Agregamos la pregunta que nos hará el chatbot.

(Según la versión de Python, la función print puede necesitar (), y quedar así: print(“¿Qué te gustaría…”). Debe quedar algo así (ahora ya puedes copiar directamente el código en tu notebook): https://gist.github.com/PalomaRS/5b7f8e2a29dea282e15e5b6a04f53baa#file-buhosbot-ipynb 

Ahora, ya sólo nos queda ejecutar la celda desde el menú Cell/Run Cells.


Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

view raw

buhosbot.ipynb

hosted with ❤ by GitHub

Como ya os adelantamos al principio del post, pusimos a prueba todo el proceso con Miguel, de 13 años, que eligió como tema para su bot los cerdos (es una apasionado de la biología, pero también del jamón). Para no hacerle escribir demasiado, en lugar de crear 5 etiquetas, creamos 3, eso sí, con 5 preguntas por cada una de ellas. Nos quedó así:

Versión "corta" creando sólo 3 etiquetas.
Figura 23: Versión «corta» creando sólo 3 etiquetas.

 Completamos la función “answer question”como hicimos en la figura 21 con información sobre nuestro nuevo animal favorito y, al ejecutar la celda desde el menú Cell/Run Cells, nos aparece el cuadro de entrada con la pregunta : “¿Qué te gustaría saber de….?”

El bot ya está activo y le podemos preguntar.
Figura 24: El bot ya está activo y le podemos preguntar.

 Y ¡ya podemos preguntar!. Nuestro bot no será “muy listo”, porque tampoco es que nos hayamos esforzado mucho en entrenarlo a conciencia, pero ahí le tenemos, dispuesto a responder nuestras preguntas a partir de la información que le hemos facilitado para “aprender”.

  Figura 25: Ejemplo del pregunta.
Figura 25: Ejemplo del pregunta.

 Como no nos registramos en Machine Learning for Kidscuando el proyecto “caduque”, el bot dejará de funcionar. Si quieres volver a probarlo otro día, regístrate. En esta misma web podrás encontrar fichas sobre este proyecto e información sobre las muchas cosas que se pueden hacer. Esperamos que os haya gustado. 

Nos encantará saber, si lo habéis probado, qué tal os ha ido. ¡Dejadnos un comentario!