IArtificial Net
IArtificial Net
IArtificial Net
net/publication/374030676
IArtificial.net
CITATIONS READS
0 1,181
1 author:
SEE PROFILE
All content following this page was uploaded by Jose Antonio Martínez-Heras on 20 September 2023.
Impreso en 16/09/2023
Table of Contents
Machine Learning e Inteligencia Artificial
¿Cómo aprende la Inteligencia Artificial?
¿Clasificación o Regresión?
Las 7 Fases del Proceso de Machine Learning
Error Cuadrático Medio para Regresión
Generalización en Machine Learning
Análisis de Errores en Machine Learning
15 Librerías de Python para Machine Learning
Inteligencia Artificial aplicada a meneame.net
Regresión Lineal: teoría y ejemplos en Python
EU Datathon 2019 – certamen de datos abiertos
Contraste de Hipótesis 1 – ¿cómo no aceptar lo falso?
Regresión Polinómica en Python con scikit-learn
Feliz San Valentín – Amor en 20 minutos
Análisis Descriptivo, Predictivo y Prescriptivo de datos
Redes neuronales desde cero (I) – Introducción
Gradiente Descendiente para aprendizaje automático
Regularización Lasso L1, Ridge L2 y ElasticNet
Mejora tu Inglés con estas frases elegidas con IA
Redes Neuronales Generativas Adversarias (GANs)
Empresas con experiencia en Inteligencia Artificial
Máquinas de Vectores de Soporte (SVM)
Regresión Logística para Clasificación
¿Cómo usar Regresión Logística en Python?
Árboles de Decisión con ejemplos en Python
Datos Fundamentales de Empresas Cotizadas en Bolsa
Aguathon: mi solución al primer Hackathon del Agua
Ensembles: voting, bagging, boosting, stacking
Random Forest (Bosque Aleatorio): combinando árboles
Avances en la generación de caras con GANs
Basura Espacial: competición con machine learning
Precision, Recall, F1, Accuracy en clasificación
Clustering (Agrupamiento), K-Means con ejemplos en python
Google Dataset Search – descubre conjuntos de datos
Feliz San Valentín menéame
La Maldición de la Dimensión en Machine Learning
Redes neuronales desde cero (II): algo de matemáticas
Correlación, Covarianza e IBEX-35
10 Blogs de Inteligencia Artificial y Machine Learning
Antenas de Espacio Profundo & Inteligencia Artificial
Detección de anomalías en espacio
TorchServe para servir modelos de PyTorch
Algoritmos Genéticos y Memoria Visual
Segmentación de Imágenes con Redes Convolucionales
Machine Learning en Operaciones Espaciales
Colaboradores
Sobre mí
Machine Learning e Inteligencia Artificial
Por Jose Martinez Heras
03/12/2018
El Machine Learning (ML), también conocido como aprendizaje automático, era hasta hace poco
uno de los campos de la inteligencia artificial. Ahora, la mayoría de la gente, cuando dice
«Inteligencia Artificial» en realidad se está refiriendo al Machine Learning. Veamos la diferencia.
Inteligencia Artificial
De acuerdo con la wikipedia, la Inteligencia Artificial (IA), es la inteligencia exhibida por máquinas.
De esta forma, consideramos a una identidad inteligente si imita las funciones cognitivas que los
humanos asociamos con otras mentes humanas, como por ejemplo aprender y resolver
problemas.
El campo que más rápido se está desarrollando en los últimos años es el del aprendizaje
automático, también conocido como Machine Learning. Y de hecho, es el principal responsable de
la popularidad de la Inteligencia Artificial.
Machine Learning
«La ciencia (y el arte) de programar ordenadores para que puedan aprender de los
datos»
Hay otras definiciones, por supuesto, pero ésta es lo suficientemente simple y corta para que
todos podemos comprenderla. Además me gusta que incluya «arte» porque esa es también mi
experiencia.
Esto no quiere decir que ya no necesitamos desarrolladores de software. Los modelos de machine
learning sólo sirven para realizar algunas tareas. Los desarrolladores, en cambio, pueden crear
software para realizar cualquier tipo de tareas.
Filtro de spam: ahora recibimos muchísimo menos correos electrónicos de spam que hace
años
Recomendaciones personalizadas: como las que recibimos en Amazon o Netflix
Publicidad: predicción de cuáles son los anuncios que nos van a interesar más
Mercado inmobiliario: predicción de cuál va a ser el precio de venta de un inmueble
Reconocimiento de imágenes: reconocer qué contiene una imagen (¿es un coche?, ¿un
perro?, ¿un gato?)
Percepción: saber qué objetos hay en una imagen, dónde están y cómo se mueven
(necesario para los coches autónomos)
Procesado del habla: por ejemplo Siri, Alexa o el asistente de Google
Traducción automática: para traducir entre idiomas como en Google Translate
Noticias: predecir qué artículos tendrán un mayor número de visitas
Juegos: crear jugadores artificiales que jueguen mejor que nosotros (por ejemplo, Google
AlphaZero AI)
1. Debe haber un patrón entre los datos de entrada y los resultados (no se pueden predecir
los números de la lotería, por ejemplo)
2. La cantidad de datos disponibles debe ser suficiente para encontrar este patrón (al fin y al
cabo, el modelo de machine learning se crea a partir de los datos)
3. Debe ser difícil formular una expresión matemática que explique este patrón (si fuera fácil,
utilizaríamos la fórmula)
Recursos
[vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
Descubre cómo aprende la Inteligencia Artificial
¿Cómo aprende la Inteligencia Artificial?
Por Jose Martinez Heras
07/12/2018
Para hacerlo más interesante, vamos a empezar con un ejemplo. Imaginaos que tenemos que
escribir un programa para detectar si un correo electrónico es spam o no. Podríamos intentar
eliminar los correos que tuviesen algunas palabras. Las palabras las pondríamos en un fichero
para que fuese más fácil editarlo, claro está. Pero habría dos problemas:
Sería casi imposible que se nos ocurran todas las palabras (o combinaciones de palabras)
que poner en el fichero. Así que seguiríamos recibiendo spam.
Probablemente algunos correos serían clasificados como spam sin realmente serlo. Así que
perderíamos mensajes.
Podríamos mejorar nuestro fichero, añadir otro fichero diciendo que otras combinaciones de
palabras están autorizadas, etc. Pero requeriría de mucho trabajo por nuestra parte, y la gente que
envía correos basura, acabaría encontrando la forma de saltarse nuestras reglas.
Aprendizaje Supervisado
El aprendizaje supervisado, recibe el nombre de «supervisado» porque necesita que siempre le
enseñemos la respuesta correcta. Por ejemplo, para resolver el problema de clasificar correos
electrónicos como spam o no spam, necesita que le demos ejemplos históricos correctamente
clasificados. En otras palabras, para cada caso de ejemplo que le demos, necesita saber si el
correo era spam o no.
Sabiendo cuál era la respuesta correcta, la Inteligencia Artificial aprende de sus propios errores.
Muchos algoritmos supervisados empiezan dando respuestas aleatorias y después van mejorando
a medida que aprenden de sus errores.
El aprendizaje supervisado es muy útil cuando queremos que la Inteligencia Artificial realice una
tarea en el futuro. Esta característica hace a este tipo de aprendizaje automático muy atractivo
para muchos negocios. En el entorno empresarial, el aprendizaje supervisado también se conoce
como «análisis predictivo«.
Este proceso está un poco simplificado. En otro artículo lo extenderé, pero da una idea de la forma
de pensar acerca del aprendizaje supervisado.
Aprendizaje No Supervisado
El aprendizaje no supervisado, no necesita supervisión. Esto quiere decir que no necesita que le
digamos cuál es la respuesta correcta. También significa que no podemos calcular el error de sus
resultados. Cuando usamos aprendizaje no supervisado, la Inteligencia Artificial aprende de los
datos mismos, por así decirlo.
El aprendizaje no supervisado es útil cuando queremos entender mejor nuestros datos históricos.
Puede tener implicaciones en el futuro pero no son tan obvias. La principal ventaja de cara al
futuro es que nosotros, los humanos, entendemos mejor nuestros datos. Con este nuevo
conocimiento revelado por la IA, podemos tomar mejores decisiones. Veamos un ejemplo.
Algunos supermercados usan aprendizaje no supervisado para entender mejor sus datos.
Los supermercados generan muchísimos datos. Entre ellos, están los datos de lo que cada cliente
compra. Aunque no tengan forma de saber quién eres, sí saben lo que un cliente anónimo ha
metido en el carro de la compra. Cuando le damos a la IA los datos del carro de la compra, no le
decimos lo que tiene que hacer con ellos. En este sentido no hay ninguna «solución correcta».
Sólo le pedimos que analice los datos y nos diga si hay algo interesante en ellos.
Usando aprendizaje no supervisado, hace tiempo se descubrió que muchos de los carros de la
compra que tenían cerveza, también tenían pañales. Esta relación sobre datos históricos nos
permite idea una estrategia: ¿y si ponemos nuestra marca de pañales al lado de la cerveza? El
resultado fue que muchos clientes compraron los pañales de la marca el supermercado sólo por la
comodidad de tenerlos tan a mano.
Aprendizaje Semi-supervisado
El aprendizaje semi-supervisado está entre el aprendizaje supervisado y el aprendizaje no
supervisado:
Conseguir datos etiquetados, en algunos casos, es bastante difícil. Por ejemplo, si queremos
construir nuestro sistema de detección de spam, alguien tiene que decidir cuáles mensajes son
spam y cuáles no. Y ese alguien somos nosotros, los humanos. Necesitamos hacer este trabajo
manual para que la Inteligencia Artificial pueda aprender qué es lo que tiene que hacer.
Cuando esto se hace a una escala mayor, no resulta tan pesado. Por ejemplo, si usas el correo de
Google, cada vez que marcas un correo como spam, estás ayudando a todos los demás usuarios
de gmail. Google usa crowdsourcing (colaboración distribuida) para que funcione muy bien con
muy poco trabajo individual … aunque sea mucho trabajo si tenemos en cuenta a todas las
personas que contribuyen.
1. Recopilar los pocos datos históricos históricos que tengan resultados disponibles
2. Recopilar los datos históricos sin resultados
3. Evaluar la posibilidad de etiquetar manualmente más datos históricos
4. Instruir a la Inteligencia Artificial a que aprenda utilizando aprendizaje supervisado los datos
históricos para los que tenemos resultados
5. Usar el modelo de machine learning aprendido para etiquetar automáticamente el resto de
los datos
6. Usar otro modelo de machine learning supervisado con los datos etiquetados inicialmente y
los datos etiquetados automáticamente
Como esto es un poco abstracto, vamos a poner un ejemplo. A lo mejor has visto en las noticias
que AlphaZero gana a los mejores jugadores al ajedrez y al Go. Si queremos que la IA aprenda a
ganar a humanos, o a otros programas de ordenador, no podemos decirle cuál es la solución
correcta. Al decírselo, sólo podría ser tan bueno como nosotros o como los otros programas de
ordenador. Si queremos que juegue mejor que nosotros, tenemos que enseñarle las reglas del
juego y dejarle aprender por sí mismo. Sólo así podrá encontrar soluciones creativas, poco
comunes y geniales.
El aprendizaje por refuerzo es el tipo de aprendizaje más difícil. La razón es que la IA no puede
saber cómo de buena es la acción que acaba de realizar; en otras palabras, no puede calcular
cuál ha sido su error. Tiene que esperar al final de la partida puede saber si ha ganado, empatado
o perdido. Esta es la única información que tiene. En el aprendizaje por refuerzo, la Inteligencia
Artificial aprende de sus éxitos y de sus fracasos (no de sus errores).
Recursos
[vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
¿Clasificación o Regresión?
Por Jose Martinez Heras
15/12/2018
Clasificación
Cuando usamos clasificación, el resultado es una clase, entre un número limitado de clases.
Con clases nos referimos a categorías arbitrarias según el tipo de problema.
Por ejemplo, si queremos detectar si un correo es spam o no, sólo hay 2 clases. Y el algoritmo de
machine learning de clasificación, tras darle un correo electrónico, tiene que elegir a qué clase
pertenece: spam o no-spam. Hay muchos más ejemplos, por supuesto:
ImageNet – Concurso de Machine Learning usando Clasificación. Dí que hay en la imagen entre
1000 posibles clases
Muchos algoritmos de machine learning dan los resultados de clasificación con probabilidades. Es
decir, nos pueden decir que un correo es spam con una probabilidad del 89%. O que una imagen
tiene un 67% de probabilidades ser un perro, un 18% de ser un gato, un 9% de ser una oveja, etc.
Normalmente, en el caso que usemos probabilidades, se tiende a elegir la clase con probabilidad
más alta como resultado del proceso de clasificación. Otra posibilidad que está a nuestro alcance
es fijar un mínimo de probabilidad antes de estar dispuestos a dar un resultado. Por ejemplo, si no
estamos seguros con una probabilidad 80% o mayor, diremos que no estamos seguros, en vez de
decir que es un perro. Esta estrategia puede ser útil cuando el coste de equivocarnos es alto,
comparado con el beneficio de obtener la respuesta correcta.
Regresión
Cuando usamos regresión, el resultado es un número. Es decir, el resultado de la técnica de
machine learning que estemos usando será un valor numérico, dentro de un conjunto infinito de
posibles resultados.
Hay varias técnicas de machine learning que podemos usar en problemas de Regresión. Podemos
destacar:
Aclaraciones
Aunque hay algunas técnicas que son específicas de clasificación y otras de regresión, la mayoría
de las técnicas funcionan con ambos.
Recursos
[vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
Las 7 Fases del Proceso de Machine Learning
Por Jose Martinez Heras
21/12/2018
Mi consejo para tener un mejor entendimiento del problema es preguntar ¿por qué? … y cuando te
respondan, pregunta otra vez ¿por qué? … y así hasta que te quedes satisfecho. En muchos
casos, sabiendo el porqué de las cosas puede ayudarte a entender rápidamente la forma de
pensar en esa industria. Además te va a resultar más fácil imaginarte la respuestas a otras
preguntas que seguro que tendrás cuando estés trabajando en el problema.
Tan importante como entender el problema es entender los datos que tenemos disponibles. Es
común hacer un análisis exploratorio de datos para familiarizarnos con ellos. En el análisis
exploratorio se suelen hacer gráficos, correlaciones y estadísticas descriptivas para comprender
mejor qué historia nos están contando los datos. Además ayuda a estimar si los datos que
tenemos son suficientes, y relevantes, para construir un modelo.
El criterio de evaluación se trata normalmente de una medida de error. Típicamente se usa el error
cuadrático medio para problemas de regresión y la entropía cruzada para problemas de
clasificación. Para problemas clasificación con 2 clases (que son muy comunes), podemos utilizar
otras medidas tales como la precisión y exhaustividad.
Le he asignado un esfuerzo relativo bajo a esta fase porque hay ya varios criterios de evaluación
estándar que funcionan para muchos problemas. Además son tan generales que funcionan en casi
todos las industrias y sectores.
Si no hay ninguna solución actual, podemos definir una solución simple que sea muy fácil de
implementar. Por ejemplo, si queremos predecir el precio de una vivienda con machine learning,
podríamos compararlo con una solución simple (por ejemplo, valor mediano del metro cuadrado
por barrio). Sólo así, cuando tengamos un modelo de machine learning terminado, podremos decir
si es suficientemente bueno, si necesitamos mejorarlo, o si no merece la pena.
Si al final resulta que la solución actual o una solución simple es similar a la solución que nos da el
machine learning, probablemente sea mejor usar la solución simple. Funcionará casi siempre
mejor y será más robusta.
Datos Incompletos
Es bastante normal que no tengamos todos los datos que nos gustaría tener. Por ejemplo, si
queremos predecir qué clientes tiene más probabilidad de comprar un producto y los datos que
tenemos provienen de una encuesta por internet. Habrá muchas personas que no hayan rellenado
todos los campos. Pero la vida es así, y tener datos incompletos es mejor que no tener datos en
absoluto. Así que ¿cómo podemos lidiar con datos incompletos?
Eliminándolos: una opción fácil es sólo quedarnos con los datos completos. Esto puede ser
una opción si se trata de una minoría. Pero casi nunca es la mejor opción porque habría
muchos datos (encuestas) que estaríamos obligados a desechar.
Imputarlos con un valor razonable: cuando falte un valor, pondremos automáticamente un
valor que tenga sentido. Por ejemplo, si alguien no ha puesto su edad en una encuesta,
podríamos usar la edad media de los encuestados que sí han especificado su edad.
Imputarlos con un modelo de aprendizaje automático: si queremos ser más sofisticados,
podemos construir un modelo de machine learning que prediga cuál es el valor que nos
falta aprendiendo de los casos en los que sí tenemos datos.
No hacer nada y usar alguna técnica de machine learning que pueda manejar datos
incompletos.
Normalización de datos
En muchos casos, es útil normalizar los datos para hacerle más fácil a la técnica de machine
learning el aprendizaje. Por normalizar nos referimos a poner a todos los datos en una escala
similar. Hay varias formas de normalizar los datos, que ya veremos en otro artículo.
Durante esta fase, tenemos que elegir que tipo de ténica de machine learning queremos usar. El
algoritmo de machine learning aprenderá automáticamente a obtener los resultados adecuados
con los datos históricos que hemos preparado. Eso sí, tendrá un error.
En general, no es difícil conseguir resultados aceptables usando este proceso. Sin embargo, si
queremos obtener resultados realmente buenos, deberemos iterar sobre las fases anteriores
varias veces. Con cada iteración, nuestro entendimiento del problema y de los datos será cada
vez mayor. Esto hará que podamos diseñar mejores características relevantes y reducir el error de
generalización. Un mayor entendimiento también nos ofrecerá la posibilidad de elegir con más
criterio la técnica de machine learning que más se ajuste al problema.
Casi siempre, tener más datos ayuda. En la práctica, más datos y un modelo simple tiende a
funcionar mejor que un modelo complejo con menos datos.
Puedes consultar el artículo Análisis de Errores en Machine Learning para profundizar más en este
tema.
Una parte considerable del esfuerzo va a construir interfaces de datos. Estos interfaces son
necesario para que el modelo pueda obtener datos automáticamente y para que el sistema pueda
usar su predicción de forma automática. Aunque es un esfuerzo considerable, es esencial. Para
que el machine learning y la inteligencia artificial sean útiles, en la mayoría de los casos deben
integrarse en un sistema mayor. Así que la cuestión no es tanto ¿qué puede hacer el machine
learning? sino ¿qué puedo hacer con el machine learning?
El sistema de traducción de Google no sería muy útil si Google sólo hubiese construido un modelo
de machine learning. Esto estaría muy bien como estudio académico pero no tendría valor
comercial. El verdadero valor está en que el modelo está integrado en un sistema web en la nube.
Y este sistema permite a millones de personas usar este modelo de machine learning para traducir
frases
Recursos
[vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
Empresas de Inteligencia Artificial que pueden ayudarte a seguir este proceso en tu negocio
Error Cuadrático Medio para Regresión
Por Jose Martinez Heras
28/12/2018
El Error Cuadrático Medio es el criterio de evaluación más usado para problemas de regresión. Se
usa sobre todo cuando usamos aprendizaje automático supervisado. Para cada dato histórico
podremos indicar el resultado correcto. Vamos a ver como se calcula.
Ahora que sabemos cómo calcular el error en cada punto, podemos calcular cual es el error
medio. Para ello, sumamos todos los errores y los dividimos entre el número total de puntos. Si
llamamos M al número total de puntos nos queda la fórmula del Error Cuadrático Medio (MSE, por
sus siglas en inglés, Mean Squared Error):
M
1
MSE = ∑(reali − estimadoi )2
M i=1
Vamos a ver cómo funciona el MSE en un ejemplo. Como técnica de machine learning, vamos a
usar una de la más simples, la regresión lineal.
En el gráfico podemos hemos usado una regresión lineal para calcular la línea (en rojo). Esta línea
obtiene el menor MSE posible para los datos que hemos usado (en azul). El MSE (por sus siglas
en inglés) es de 0.0332.
Ejemplo de Error Cuadrático Medio (MSE en inglés)
M
1
RMSE = ∑(reali − estimadoi )2
M i=1
Os pongo su nombre también en inglés para que os suene cuando lo uséis en las librerías de
machine learning: RMSE (Root Mean Squared Error). Así, en el ejemplo anterior, el RMSE sería
0.1822 (para un MSE de 0.0332).
Así que, normalmente, se suele usar el MSE durante el proceso de aprendizaje y su raíz cuadrada
al final, para dar una estimación en términos intuitivos de la calidad de la predicción.
Usando scikit-learn
Lo más fácil es usar la librería de python scikit-learn. El modulo sklearn.metrics implementa la
función mean_squared_error. Esta función necesita dos argumentos:
Por ejemplo:
1. import numpy as np
2. y_true = [3, -0.5, 2, 7]
3. y_pred = [2.5, 0.0, 2, 8]
4. mse = (np.square(y_true - y_pred)).mean()
5. mse
6. # resultado: 0.375
Resumen
El error cuadrático medio es el criterio de evaluación más usado para problemas de aprendizaje
supervisado de regresión. En este artículo hemos visto cómo se calcula, la posibilidad de usar la
raíz cuadrada para obtener un resultado más intuitivo y cómo calcularlo fácilmente con código
python.
Recursos
Función para el cálculo el mean squared error en python en scikit-learn
Cómo se usa el error cuadrático medio y su derivada en el aprendizaje automático con
gradiente descendiente
Métricas para problemas de aprendizaje supervisado de clasificación tales como precision,
recall, F1, accuracy
Otras librerías de python para machine learning que te pueden servir
Generalización en Machine Learning
Por Jose Martinez Heras
04/01/2019
He generado unos datos siguiendo una línea y les he añadido un poco de ruido. A continuación, he
usado 2 modelos de regresión:
Regresión Lineal y Polinómica: la regresión polinómica tiene un menor error que la regresión lineal
Así que como el error de la regresión polinómica es menor que el error de la regresión lineal …
deberíamos usar la regresión polinómica, ¿no? Intuitivamente esto no parece lo más correcto.
Para entenderlo intuitivamente, vamos a ver cómo se comportan la regresión lineal y la regresión
polinómica en un intervalo extendido. Es decir, vamos a visualizar las predicciones de estos dos
modelos cuando tenemos datos nuevos.
Como veis, la regresión polinómica ¡es un desastre! Toma valores muy extremos para valores
nuevos.
La regresión lineal generaliza mucho mejor que la regresión polinómica de grado 5
Espero que veais claro que construir un modelo de machine learning que se ajuste muy bien a los
datos, no siempre garantiza que el modelo sea útil. Por eso buscamos un modelo que generalice
bien. Con generalizar nos referimos a que el modelo funcione bien, no sólo con los datos con los
que ha aprendido, sino también con los datos que obtendremos en el futuro.
Cuando tenemos una dimensión (x), podemos hacer un gráfico en 2 dimensiones y ver
cómo se comporta el resultado (y)
Cuando tenemos 2 dimensiones, podemos hacer un gráfico en 3 dimensiones.
Pero cuando tenemos 3 o más dimensiones … ya no podemos visualizar cómo se comporta
el modelo.
En machine learning, es muy común tener más de 3 dimensiones. Por ejemplo, si queremos
predecir si un cliente de un banco aceptará una oferta de un plazo fijo en una llamada
promocional, podemos considerar: la edad (1), qué trabajo tiene (2), el balance de su cuenta (3),
qué otros productos tiene ya (4), la ciudad (5), cuánto tiempo lleva siendo cliente del banco (6),
estado civil (7), etc. Como veis, es muy muy fácil tener más 2 dimensiones.
Necesitamos una forma de medir la generalización que no necesite hacer gráficos. Hay varias
formas de hacerlo. Vamos a explicar las dos técnicas más populares para medir la generalización:
Una forma de medir la generalización es la de dividir los datos que tengamos en dos conjuntos: el
conjunto de entrenamiento y el conjunto de testeo. En el gráfico, vemos los datos del conjunto de
entrenamiento en azul, y en rosa los de testeo.
Separación de datos en los conjuntos de Entrenamiento y Testeo
Conjunto de Entrenamiento
El conjunto de entrenamiento contiene los datos que el modelo de machine learning usará para
aprender. El conjunto de entrenamiento es mayor que el conjunto de testeo, en el sentido de que
contiene más datos.
Conjunto de Testeo
No son nuevos realmente, porque ya teníamos estos datos. Pero son «nuevos» para el modelo
porque nos hemos asegurado de ocultárselos durante el aprendizaje.
Debemos evitar que el modelo use estos datos en el aprendizaje. Cuando esto sucede
accidentalmente, recibe el nombre de «fuga de datos». El efecto que tiene es que podemos
pensar que nuestro modelo es mejor de lo que en realidad es.
Para medir la generalización, medimos el error del modelo en el conjunto de testeo. Es decir,
usamos los datos de entrenamiento para que el modelo aprenda y luego le pedimos al modelo que
nos de los resultados correspondientes a los datos de testeo. Como sabemos los resultados que
esperamos de los datos de testeo, podemos medir el error de predicción. Para medir el error
podemos usar el error cuadrático medio (MSE por sus siglas en inglés), u otra medida apropiada
al problema.
Medimos la Generalización con el Error en el Conjunto de Testeo
Así podemos ver que en el caso de la regresión lineal, tanto el error de entrenamiento (0.0514)
como el de testeo (0.0444), son pequeños y similares. Sin embargo, en el caso de la regresión
polinómica de grado 5, el error de testeo (148.2934) es muy grande en comparación al error de
entrenamiento (0.0367).
Midiendo el error en el conjunto de testeo, podemos estimar cuál es el rendimiento del modelo en
datos nuevos. Esto nos permite experimentar con varios modelos y elegir el que mejor generaliza.
Para esto ya veremos que es mejor usar 3 conjuntos de datos: entrenamiento, validación y testeo.
Hablaremos del conjunto de validación en otro artículo.
Validación cruzada
La validación cruzada estima el error de generalización de forma más robusta. Cuando usamos los
conjuntos de entrenamiento y de testeo, hay una parte aleatoria que puede influir los resultados.
Dependiendo cómo dividamos los datos en estos dos conjuntos tendremos una estimación
diferente del error de generalización. En unos casos pensaremos que el modelo generaliza mejor
y en otros peor.
Para combatir este problema, la validación cruzada propone crear los conjuntos de entrenamiento
y testeo varias veces, cada vez con una separación diferente. De esta forma obtendremos
estimaciones diferentes. La media aritmética de todos los errores de testeo se considera la
estimación del error de generalización.
Recursos
[vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
Análisis de Errores en Machine Learning
Por Jose Martinez Heras
11/01/2019
El análisis de errores es una de las fases del proceso de machine learning más importantes. El
análisis de errores nos va a permitir saber qué hacer para mejorar el rendimiento de un modelo de
machine learning.
Para analizar errores, nos vamos a concentrar en los errores entrenamiento y los errores de
generalización. En particular:
Nos aseguraremos que el modelo de machine learning sea capaz de aprender. Para ello
procuraremos que el error de entrenamiento sea bajo.
Intentaremos que el modelo de aprendizaje automático sea capaz de generalizar. Para ello
buscaremos que el error de generalización sea bajo.
En el gráfico a continuación podemos ver un ejemplo de underfitting. Los datos siguen una función
polinómica de grado 2 (una parábola). Si intentamos usar un modelo de regresión lineal, veremos
que el modelo no se ajusta bien a los datos. En otras palabras, el modelo es tan simple, que no es
capaz de aprender la relación entre los datos de entrada y los de salida.
Datos incompletos
Otro motivo para el underfitting (infraajuste) puede ser la falta de datos. Por ejemplo, si los
resultados dependen de dos variables y = a + b. Si intentamos aprender sólo con uno de ellos (por
ejemplo, predecir «y» sabiendo sólo «a»), habrá muchos casos en los que el rendimiento será
malo.
Un ejemplo puede ser marketing. Si intentamos predecir quién comprará una crema «anti-
arrugas» y olvidamos incluir la edad del cliente en la entrada del modelo.
En ocasiones, tenemos todos los datos necesarios para un buen rendimiento del modelo de
machine learning. Sin embargo, necesitamos transformar los datos para que el modelo pueda
entender mejor la relación entre la entrada y la salida. En el caso de que tengamos pocos datos, la
creación de atributos relevantes, es todavía más importante.
Por ejemplo, en un termómetro analógico, el dato sería cuánto se ha expandido tantos miligramos
de mercurio. El atributo relevante sería cuántos grados Celsius marca el termómetro.
Al crear atributos relevantes estamos ayudando al modelo con nuestro conocimiento del problema.
Una de las condiciones para que merezca la pena usar Machine Learning, es que debe haber un
patrón entre los datos de entrada y los resultados. Así que no podemos usar machine learning
para predecir datos aleatorios. Si lo intentamos, obtendremos un error de entrenamiento muy alto.
Si los datos son caóticos, también va a ser muy difícil obtener un error de entrenamiento bajo. Los
sistemas caóticos son muy sensibles a las condiciones iniciales. Tanto es así que aunque el
sistema sea determinista, pequeños cambios en la condiciones iniciales hacen que su
comportamiento futuro sea tan diferente que sea impredecible. Por ejemplo, la bolsa de valores
tiene un comportamiento caótico. A efectos prácticos de machine learning, podemos considerar los
datos de sistemas caóticos como aleatorios.
Si los datos tienen mucho ruido las técnicas de machine learning van a tener problemas para
aprender. Podemos intentar reducir el ruido, o aumentar la señal respecto al ruido. Si no lo
conseguimos, el algoritmo de aprendizaje automático «pensará» que los datos son aleatorios.
Datos insuficientes
Otra de las condiciones para que merezca la pena usar Machine Learning, es que que la cantidad
de datos debe ser suficiente. Si hay pocos datos, es difícil encontrar un patrón entre los datos de
entrada y los resultados.
Para poder saber si el modelo ha aprendido correctamente tendremos que analizar el error de
generalización.
Si el modelo es demasiado complejo, podrá aprender muchos de los datos de memoria. Para
evitarlo, podemos usar un modelo más simple.
El gráfico muestra los mismos datos usando dos modelos diferentes: una regresión lineal y una
regresión polinómica de grado 5. La regresión polinómica es un modelo muy complejo para el
problema que tenemos. Por eso, el error de entrenamiento es bajo y el error de generalización es
tan alto. Por otra parte, la regresión lineal tiene un error bajo tanto de aprendizaje como de
generalización.
Regularización
Otra opción a la hora de hacer un modelo más simple, es usar un modelo complejo y usar
regularización. La regularización, en machine learning, es el proceso de limitar, a propósito, la
capacidad del modelo. La regularización es una forma de conseguir hacer más simple un modelo
complejo.
Si la técnica de aprendizaje automático ha aprendido con pocos datos, es más fácil que haya
aprendido qué resultado va con cada dato de entrada de memoria. Tener más datos, hace más
difícil que se pase el filtro de tener un error de aprendizaje bajo.
También puede ocurrir, que estemos intentando medir la generalización con datos que venga de
otra distribución.
Por ejemplo, supongamos que estamos haciendo un modelo para estimar la probabilidad de que
un cliente cancele un contrato. Para estimar el error de generalización, podemos dividir los datos
en los conjuntos de entrenamiento y testeo. Para tener una mejor idea del rendimiento real,
deberemos asegurarnos de que están bien distribuidos.
Una mala distribución sería construir el modelo con datos de los clientes de Francia, Alemania,
Bélgica y Holanda; y usar los clientes de España para estimar la generalización. Una mejor
partición sería elegir un 80% de los clientes de todos los países, y estimar la generalización con el
20% restante.
Cuando tenemos un buen error de generalización, podemos decir que el modelo de machine
learning ha aprendido el patrón que hay entre los datos de entrada y los resultados. También
podemos confiar en que el modelo va a funcionar bien con datos nuevos. Al menos, siempre que
los datos nuevos vengan de una distribución similar.
Conjunto de validación
Hasta ahora hemos medido el error de entrenamiento y el error de generalización con los
conjuntos de entrenamiento y de testeo. Hemos usado el error de generalización para saber si el
modelo estaba aprendiendo de memoria o realmente encontrando el patrón entre los datos de
entrada y los resultados. Analizando los datos de generalización, podemos decidir que es mejor
usar un modelo más complejo, o más simple (ya sea regularizando un modelo complejo o usando
uno más simple).
El problema es que estamos haciendo una pequeña «trampa». Si alguien nos pregunta, ¿cuál es
el error de generalización del modelo de aprendizaje automático? … realmente no lo sabemos. No
lo sabemos, porque hemos usado el conjunto de testeo para decidir con qué modelo nos
quedamos. En otras palabras, nos hemos quedado con el modelo que menor error de
generalización tenía en el conjunto de testeo. Es decir, si diéramos una estimación del error, la
estimación sería muy optimista.
Si el error de entrenamiento es alto, significa que el modelo no puede aprender la relación entre
los datos de entrada y los resultados.
Puede ser que el patrón entre los datos de entrada y los resultados, sólo pueda aprenderse con un
modelo más complejo
Para que el modelo de machine learning sea útil, debe funcionar bien con datos nuevos. Usamos
el conjunto de validación para estimar la capacidad de generalización.
Recursos
[vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
15 Librerías de Python para Machine Learning
Por Jose Martinez Heras
18/01/2019
Estas son las 15 mejores librerías de python para Machine Learning. Temas: Visualización,
Cálculo Numérico, Análisis de Datos, Aprendizaje Automático, Deep Learning, Inteligencia Artificial
Explicable, Procesamiento del Lenguaje Natural y mucho más.
Así mismo, la visualización de datos será también muy útil para comprender los resultados y
analizar los errores. Aunque hay muchas librerías en python para la visualización de datos, nos
vamos a concentrar en: matplotlib, seaborn y bokeh por el momento.
Matplotlib
Matplotlib es la librería gráfica de python estándar y la más conocida. Puedes usar matplotlib para
generar gráficos de calidad necesaria para publicarlas tanto en papel como digitalmente.
Con matplotlib puedes crear muchos tipos de gráficos: series temporales, histogramas, espectros
de potencia, diagramas de barras, diagramas de errores, etc.
Si quieres ver de lo que matplotlib es capaz, mira sus gráficos de ejemplo y su galería de gráficos.
Seaborn
Bokeh
Bokeh es una librería para visualizar datos de forma interactiva en un navegador web. Con bokeh
podemos crear gráficos versátiles, elegantes e interactivos. Los desarrolladores de bokeh buscan
un buen rendimiento con gran cantidad de datos, incluso con datos que vayan llegando en tiempo
real.
Si quieres ver de lo que bokeh es capaz, mira su galería de ejemplos. También puedes consultar
su manual de usuario en inglés.
NumPy
NumPy proporciona una estructura de datos universal que posibilita el análisis de datos y el
intercambio de datos entre distintos algoritmos. Las estructuras de datos que implementa son
vectores multidimensionales y matrices con capacidad para gran cantidad de datos.
Además, esta librería proporciona funciones matemáticas de alto nivel que operan en estas
estructuras de datos. Para aprender más, sigue el tutorial de NumPy (en inglés).
SciPy
SciPy proporciona rutinas numéricas eficientes fáciles de usar y opera en las mismas estructuras
de datos proporcionadas por NumPy. Por ejemplo, con SciPy puedes realizar: integración
numérica, optimización, interpolación, transformadas de Fourier, álgebra lineal, estadística, etc.
Para aprender más, sigue el tutorial de SciPy (en inglés).
Pandas
Pandas es una de las librerías de python más útiles para los científicos de datos. Las estructuras
de datos principales en pandas son Series para datos en una dimensión y DataFrame para datos
en dos dimensiones.
Estas son las estructuras de datos más usadas en muchos campos tales como finanzas,
estadística, ciencias sociales y muchas áreas de ingeniería. Pandas destaca por lo fácil y flexible
que hace la manipulación de datos y el análisis de datos.
Numba
Así que si te interesa optimizar la velocidad de tu código, no tienes por qué compilar código por
separado, ni tan siquiera necesitas tener el compilador de C/C++ instalado. Sólo aplica uno de los
decoradores de Numba a tu función de python y Numba hará el resto.
scikit-learn es una librería de python para Machine Learning y Análisis de Datos. Está basada en
NumPy, SciPy y Matplotlib. La ventajas principales de scikit-learn son su facilidad de uso y la gran
cantidad de técnicas de aprendizaje automático que implementa.
Con scikit-learn podemos realizar aprendizaje supervisado y no supervisado. Podemos usarlo para
resolver problemas tanto de clasificación y como de regresión.
Es muy fácil de usar porque tiene una interfaz simple y muy consistente. El interfaz es muy fácil de
aprender. Te das cuenta que el interfaz es consistente cuando puedes cambiar de técnica de
machine learning cambiando sólo una línea de código.
Otro punto a favor de scikit-learn es que los valores de los hiper-parámetros tienen unos valores
por defecto adecuados para la mayoría de los casos.
Estas son algunas de las técnicas de aprendizaje automático que podemos usar con scikit-learn:
TensorFlow es una librería de python, desarrollada por Google, para realizar cálculos numéricos
mediante diagramas de flujo de datos. Esto puede chocar un poco al principio, porque en vez de
codificar un programa, codificaremos un grafo. Los nodos de este grafo serán operaciones
matemáticas y las aristas representan los tensores (matrices de datos multidimensionales).
Con esta computación basada en grafos, TensorFlow puede usarse para deep learning y otras
aplicaciones de cálculo científico.
Si te estás preguntando por qué necesitamos diseñar un grafo en vez de un programa, es por la
flexibilidad de ejecución que TensorFlow permite. Por ejemplo, el grafo que representa la red
neuronal profunda y sus datos, se podrá ejecutar en una o varias CPU o GPU en un PC, en un
servidor o en un móvil.
Keras
Keras es un interfaz de alto nivel para trabajar con redes neuronales. El interfaz de Keras es
mucho más fácil de usar que el de TensorFlow. Esta facilidad de uso es su principal característica.
Con Keras es muy fácil comprobar si nuestras ideas tendrán buenos resultados rápidamente.
Keras utiliza otras librerías de deep learning (TensorFlow, CNTK o Theano) de forma transparente
para hacer el trabajo que le digamos.
PyTorch
PyTorch es una librería de python, desarrollada por Facebook, que permite el cálculo numérico
eficiente en CPU y GPUs.
Puedes pensar en PyTorch como una librería que te la las capacidades de NumPy en una GPU.
En otras palabras, si tu tarjeta gráfica tiene un procesador gráfico (por ejemplo, una NVIDIA
moderna), tu código se puede ejecutar unas ¡10 – 20 veces más rápido!
Para aprender más, puedes mirar los tutoriales de PyTorch y su documentación (ambos en inglés).
SHAP es una librería para realizar Inteligencia Artificial Explicable (XAI por sus siglas in inglés
eXplainable Artificial Intelligence). Utiliza cálculos del campo de la teoría de juegos para averiguar
qué variables tienen más influencia en las predicciones de las técnicas de machine learning.
SHAP permite entender cómo se toman las decisiones en modelos de caja negra (random forest o
redes neuronales). Puedes obtener explicaciones tanto para predicciones individuales como de
forma global. Su API es bastante fácil de usar.
Las librerías de deep learning y scikit-learn también permiten construir modelos de machine
learning con datos de texto, una vez estos se hayan convertido a un formato estándar.
En este apartado, vamos a ver las librerías que están principalmente dedicadas al procesamiento
del lenguaje natural.
gensim es una librería para el procesamiento de lenguaje natural creada por Radim Řehůřek. El
punto fuerte de Gensim es el modelado de temas. Es decir, puede identificar automáticamente de
que tratan un conjunto de documentos.
Además, Gensim es útil para construir o importar representaciones de vectores distribuidas tales
como word2vec. También podemos usar Gensim para analizar la similaridad entre documentos, lo
que es muy útil cuando realizamos búsquedas.
spaCy
spaCy es la librería de procesamiento natural más rápida que existe. Está diseñada para usarse
en aplicaciones reales y extraer información relevante. spaCy también es muy útil para preparar
texto para otras tareas de aprendizaje automático. Por ejemplo, podemos preparar los datos para
usarlos con TensorFlow, PyTorch, scikit-learn, Gensim, etc.
Con spaCy también vamos a poder construir modelos lingüísticos estadísticos sofisticados para
muchos de los problemas de procesamiento de lenguaje natural.
Jupyter Notebook
Jupyter Notebook es una aplicación web para crear documentos que contienen código,
ecuaciones, visualizaciones y texto. Puedes usar Jupyter notebooks para limpiar datos,
transformarlos, realizar simulaciones numéricas, modelos estadísticos, visualizaciones de datos,
machine learning y mucho más.
A efectos prácticos es como una consola interactiva de python en un navegador que permite la
ejecución de código python, visualización de datos y gráficos, y documentar lo que estés
haciendo.
Jupyter no es en realidad una librería de python. Sin embargo, ya que estamos viendo cuáles son
las herramientas que más usa un científico de datos, la lista no estaría ni mucho menos completa
sin Jupyter. Utilizo Jupyter constantemente para probar ideas y construir prototipos simples. No lo
recomiendo cuando el código sea más complejo o cuando queramos crear librerías con nuestro
trabajo para reutilizarlo en otros proyectos.
Anaconda
Anaconda es una distribución de python para Cálculo Numérico, Análisis de Datos y Machine
Learning. Contiene las librerías más usadas por los científicos de datos. Además hace muy fácil la
instalación de otras librerías que puedas necesitar.
Con Anaconda también es posible crear varios entornos de trabajo si estás trabajando en varios
proyectos . Esto puede ser útil, por ejemplo, si uno de los proyectos necesita python 3 y el otro
python 2. O si estás trabajando en un proyecto que necesita unas librerías específicas o que
tengan una versión específica.
A no ser que tengas que trabajar con aplicaciones antiguas, te recomiendo que utilices la
distribución de Anaconda con Python 3. Ve a la sección de descargas para conseguirla. Para más
información, puedes seguir la documentación de Anaconda.
Resumen
Hemos visto las mejores librerías de python para:
visualización
cálculo numérico
análisis de datos
manipulación de datos
machine learning
deep learning
inteligencia artificial explicable
procesamiento de lenguaje natural.
Jupyter Notebook no es una librería, pero un entorno web que va a facilitarnos mucho la vida. Con
Jupyter podemos probar nuestras ideas y ver los resultados de forma muy intuitiva, a la vez que lo
documentamos.
Finalmente, la forma más fácil de instalar todas estas librerías es instalar Anaconda. Anaconda va
a instalar muchas de estas librerías. El resto, podrás instalarlas manualmente cuando las
necesites.
Esta lista de librerías no tiene por objetivo ser completa, si no sólo indicar cuáles librerías de
Machine Learning son más útiles … por lo menos para mí. Si tu librería favorita no está en la lista,
te invito a que la pongas en los comentarios.
Inteligencia Artificial aplicada a meneame.net
Por Jose Martinez Heras
27/01/2019
En este artículo, vamos a aplicar Inteligencia Artificial a todas las noticias de portada de
meneame.net en 2018. Empezaremos realizando un análisis estadístico y visualización de datos.
Después usaremos Procesamiento del Lenguaje Natural y Aprendizaje Automático.
¿Qué es meneame.net?
A lo mejor nunca has visto Menéame y te estás preguntando qué es. Aquí tienes una definición:
Documentación de Menéame
En menéame, los usuarios registrados comparten enlaces. Otros usuarios registrados o visitantes
votan (menean) estos enlaces para hacerlos más visibles. Puedes acceder a las historias que hay
tras estos enlaces haciendo click en el título. Para acceder a la sección de comentarios, donde los
usuarios registrados comentan la historia, puedes hacer click en el número de meneos.
Datos básicos
Si nos fijamos todas las noticias que se han publicado en la portada de meneame en 2018,
podemos extraer los siguientes datos:
12.332 noticias
45.254.081 visitas a la noticias (clicks)
5.764.374 meneos
1.103.313 comentarios
1.746 autores.
Una forma de entender mejor los datos es visualizando las distribuciones de datos. En esta
sección vamos a visualizar la distribución de clicks, de meneos y la distribución conjunta de clicks
y meneos.
Distribución del número de clicks (visitas) para las noticias de portada de meneame.net en 2018.
Como podemos ver, el número de visitas a las noticias de menéame, sigue una distribución
exponencial. Podemos observar, tal y como cabe esperar de una distribución exponencial, que:
Distribución del número de meneos para las noticias de portada de meneame.net en 2018
La distribución de meneos también sigue una distribución exponencial. Hay una minoría de
noticias con un número alto de meneos.
Distribución de comentarios
Distribución del número de comentarios para las noticias de portada de meneame.net en 2018.
La distribución del número del número de comentarios es también exponencial. Hay una minoría
de noticias con un número alto de comentarios.
Distribución de clicks y meneos
Distribución entre el número de meneos y el número de clicks para las noticias de portada de
meneame.net en 2018. Cada punto representa una noticia.
En este gráfico quería representar cómo los meneos afectan al número de clicks. Hay dos cosas
que me han sorprendido de este gráfico y que he destacado en el siguiente:
Los top 11
Vamos a ver unas estadísticas simples. En casi todos los análisis estadísticos, siempre se habla
de los top 10. A mi siempre me queda el gusanillo de saber si había tanta diferencia entre el 10 y
el 11. Siempre me da un poco de pena que el 11, estando muchas veces tan cerca del 10, no
salga nunca. Así que vamos a hablar de los top 11.
3.791 – Senadores del PP, ovacionándose y en pie, tras conseguir paralizar con sus votos
la subida de las pensiones
2.922 – Hola: soy Diputada y necesito ayuda
2.904 – Fallece Stephen Hawking
2.722 – Cristina Cifuentes obtuvo su título de máster en una universidad pública con notas
falsificadas
2.436 – Cristina Cifuentes se matriculó en su máster tres meses después de que
empezaran las clases
2.406 – La indignación de Pablo Iglesias ante la decisión del Supremo sobre el impuesto
hipotecario
2.355 – Sánchez, presidente: la moción de censura tumba a Rajoy
2.231 – Pedro J. Ramírez aporta 21 pruebas que implican a Rajoy en la caja B del PP
2.220 – Jueces de mierda y católicos de mierda
2.169 – El Supremo concluye por 15 votos a 13 que es el cliente el que debe pagar el
impuesto hipotecario
2.168 – Lo de Rajoy es mucho peor que lo de Cifuentes
1.397 – Ciudadanos pide que conocer las lenguas cooficiales no sea obligatorio para
trabajar en la administración autonómica
1.013 – Iglesias y Montero anuncian una consulta en Podemos sobre la compra de su casa:
si pierden, dimitirán
913 – La Justicia alemana deja en libertad a Puigdemont y descarta delito de rebelión
886 – El detenido por la muerte de Laura Luelmo confiesa el asesinato
788 – Paso en firme en materia de violencia contra la mujer: desaparece el abuso; todo
delito sexual será agresión o violación
764 – Torrent pospone la investidura hasta que se pueda celebrar «sin injerencias»
755 – Sentencia de La Manada ¿Cómo puede absolvérseles de violación con semejantes
Hechos Probados?
744 – La policía alemana detiene a Puigdemont cuando entraba desde Dinamarca
724 – La Guardia Civil detiene a una líder de los CDR por terrorismo y rebelión
714 – Dos transexuales ganan a mujeres en competición de atletismo [eng]
699 – El actor Willy Toledo, detenido en Madrid
495 – ccguy
240 – Ripio
201 – Ratoncolorao
198 – Danichaguito
190 – –550559–
174 – Joya
169 – Wurmspiralmaschine
162 – Cubillina
152 – rataxuelle
151 – Quinqui
147 – Meneador_Compulsivo
Después de este análisis estadístico simple, vamos a utilizar técnicas de Inteligencia Artificial para
hacer un análisis más concienzudo. En particular, vamos a usar técnicas de Machine Learning,
que es el área de la Inteligencia Artificial que permite aprender de los datos.
Seguramente te estás preguntando que dónde están los temas que faltan. La verdad es que no
están todos los temas, ni mucho menos. Pero tampoco era lo que pretendíamos. El modelado de
temas es útil para entender cuáles son los temas de los que más se habla en menéame. Además
nos va a permitir hacer otro tipo de análisis como son la correlación entre temas y la predicción de
clicks y meneos.
Al analizar la correlación entre temas, podemos averiguar qué temas ocurren a la vez en la
mayoría de los casos. En la siguiente figura, puedes ver la correlación entre los temas de
menéame en 2018 (si haces click en la imagen, deberías verla ampliada).
Por ejemplo, si te das cuenta, los temas «trabajo, trabajadores, laboral, horas, empresa,» y
«europea, unión, ue, brexit, reino,» están bastante correlados. Así que esperamos que, en la
mayoría de los casos, cuando haya más artículos sobre uno de los temas, habrá más artículos
sobre el otro tema. Con un gráfico quedará más claro (recuerda que haciendo click puedes
ampliarlo).
En vez de predecir cuántos meneos / clicks / comentarios tendrá una historia, vamos a
intentar predecir si una noticia tendrá un número alto o bajo de meneos / clicks / comentarios. Esto
hace el problema más fácil. Por ejemplo, sería muy difícil predecir cuántos meneos tendrían
los top 11 meneos. Es mucho más fácil predecir que los top 11 tendrán un número alto de meneos.
De esta forma, transformamos un problema de regresión en uno de clasificación.
Para saber si un número de meneos / clicks / comentarios es alto o bajo, nos vamos a fijar en
todas las historias del 2018. Las historias cuyo número de meneos / clicks / comentarios sean
mayores que su valor mediano, estarán en la categoría de «alto»; las otras en el «bajo». Dicho de
otra forma, ordenamos las historias por el número de meneos de menos a más. La mitad más alta
tiene se clasifica como «alta» y la mitad más baja como «baja». También hacemos lo mismo para
el número de clicks.
Una historia con más de 385 meneos, tiene un número alto de meneos
Una historia con más de 2.655 clicks, tiene un número alto de clicks
Una historia con más de 63 comentarios, tiene un número alto de comentarios
He construido varios modelos de aprendizaje automático supervisados para estudiar qué influye
en el número de meneos:
1. para entender qué temas tienen más / menos meneos, clicks, comentarios
2. para entender qué palabras tienen más / menos meneos, clicks, comentarios
Hay varios tipos de modelos que podría haber utilizado. Como el objetivo de este proyecto es
entender las influencias, he usado modelos de Inteligencia Artificial explicables. En particular he
experimentado con árboles de decisión y regresión logística. La regresión logística parece dar
mejores resultados. Así que usaremos este modelo para el resto del artículo.
Vamos a ver como los temas y las palabras de la historia afectan al número de meneos.
¿Qué temas son los mejores y peores para tener más meneos?
El modelo de de inteligencia artificial para predecir meneos a partir de temas, tiene un F1 de 0.72
en entrenamiento y un F1 de 0.70 en testeo.
Nota: Uso las historias publicadas entre enero y noviembre para construir los modelos de IA. Los
datos del mes de diciembre 2018 lo uso para medir la generalización del modelo.
Consideramos que una historia tiene un número de meneos alto si tiene más de 385 meneos (que
es el valor mediano de número de meneos)
Estos son los temas que favorecen un número alto de meneos. Están ordenados de mayor a
menor influencia (cuanto más arriba en la lista, más meneos):
Estos son los temas que favorecen un número bajo de meneos. Están ordenados de mayor a
menor influencia (cuanto más arriba en la lista, menos meneos):
¿Qué palabras son las mejores y peores para tener más meneos?
1. pp
2. cifuentes
3. rajoy
4. máster
5. gobierno
6. euros
7. franco
8. casado
9. españa
10. denuncia
11. ciudadanos
1. historia
2. siglo
3. guerra
4. arte
5. espacial
6. tecnología
7. época
8. imágenes
9. ciudad
10. mapa
11. kilómetros
Vamos a ver como los temas y las palabras de la historia afectan al número de visitas
(clicks). Consideramos que una historia tiene un número de clicks alto si tiene más de 2.655 visitas
(que es el valor mediano de número de clicks)
¿Qué temas son los mejores y peores para tener más clicks?
Estos son los temas que favorecen un número alto de visitas (clicks). Están ordenados de
mayor a menor influencia (cuanto más arriba en la lista, más clicks):
Estos son los temas que favorecen un número bajo de visitas (clicks). Están ordenados de
mayor a menor influencia (cuanto más arriba en la lista, menos clicks):
¿Qué palabras son las mejores y peores para tener más clicks?
1. vídeo
2. aquí
3. imágenes
4. imagen
5. foto
6. fotos
7. mentiras
8. peor
9. coche
10. viñeta
11. problema
1. gobierno
2. ministerio
3. muere
4. justicia
5. tribunal
6. investigación
7. estudio
8. investigadores
9. ley
10. ing
11. ministra
¿Qué influye en el número de comentarios?
Vamos a ver como los temas y las palabras de la historia afectan al número de comentarios en
menéame. Consideramos que una historia tiene un número de comentarios alto si tiene más de 63
comentarios (que es el valor mediano de número de comentarios)
¿Qué temas son los mejores y peores para tener más comentarios?
Estos son los temas que favorecen un número alto de comentarios en menéame. Están
ordenados de mayor a menor influencia (cuanto más arriba en la lista, más comentarios):
Estos son los temas que favorecen un número bajo de comentarios en menéame. Están
ordenados de mayor a menor influencia (cuanto más arriba en la lista, menos comentarios):
¿Qué palabras son las mejores y peores para tener más comentarios?
1. mujer
2. puigdemont
3. ciudadanos
4. podemos
5. mujeres
6. precio
7. joven
8. gobierno
9. país
10. violencia
11. sánchez
1. historia
2. siglo
3. investigadores
4. obras
5. espacial
6. arte
7. obra
8. corrupción
9. ii
10. documental
11. época
Según los resultados, parece que las palabras funciona mejor que los temas tanto para
predecir meneos como visitas como comentarios. Los temas funcionan algo peor pero son más
fáciles de interpretar.
También podemos concluir que los meneos son más fáciles de predecir que los clicks. Esto lo
sabemos porque el rendimiento del modelo de predicción de meneos generaliza mejor que el de
predicción de clicks.
Con respecto a la pregunta que nos hacíamos al principio, que corresponde a «2» en el siguiente
gráfico … ¿por qué a más meneos, menos clicks?
A más meneos, menos clicks
Para contestar a la pregunta de por qué las historias que más meneos tienen reciben menos
clicks, tenemos que mirar esta tabla. La tabla compara los 11 temas con más meneos con los 11
temas con menos clicks. Me he permitido tachar aquellos temas que simultáneamente están en
ambas categorías.
Si te das cuenta, muchos de los temas que más influencian el número de meneos, también son los
que influencian que hayan pocas visitas (clicks), según los modelos de inteligencia artificial.
¿Pero por qué los temas que tienen más meneos son los que menos clicks reciben?
La inteligencia artificial no nos da una respuesta clara en este punto. Así que echar mano de la
inteligencia humana asistida por la inteligencia artificial.
La inteligencia artificial nos ha dicho que muchos de los temas de los que cabe esperar muchos
meneos, también cabe esperar pocos clicks. Y ahí se queda.
Así que he estado mirando las noticias para varios temas clave y palabras clave para ofreceros mi
interpretación humana.
Interpretación humana
Muchas noticias de actualidad (política, la muerte de alguien, la decisión de un tribunal, etc.) están
autocontenidas.
Con autocontenidas quiero decir que mirando la información que hay en la portada menéame, es
decir, el título y el resumen, es suficiente para estar informado.
Otras historias, en cambio, realmente necesitan que hagamos click. Sin hacer click no seremos
capaces de saber qué ha pasado. Esto es evidente en palabras tales como: vídeo, imágenes,
imagen, foto, fotos, viñeta, etc. Aunque también para noticias de historia, cultura, etc.
Dicho esto, encuentro muy útil que muchas historias estén autocontenidas. Así podemos
informarnos rápidamente de lo que está ocurriendo. Las historias no-autocontenidas nos permiten
profundizar más en los temas que nos interesen.
Lo primero de todo, es que para que tenga alguna oportunidad, debería llegar a portada de
meneame.net. Como a la Inteligencia Artificial le hemos dado sólo los datos de artículos que ya
estaban en portada, seguramente la predicción será más optimista de lo normal. Así que no
debemos fiarnos ciegamente.
Además, la predicción está basada en el título y el resumen que se use para enviar la historia.
Imaginando que tuviésemos lo siguiente:
Si has seguido este artículo, verás que al transformar el problema de regresión en uno de
clasificación, no puedo decir cuántos clicks y meneos tendrá este artículo. Lo que sí puedo hacer
es predecir la probabilidad de estar en la parte alta de meneos y clicks. Para ello, voy a usar el
modelo basado en palabras, ya que daba mejores resultados.
Predicción de probabilidades
Asumiendo que este artículo llegue a la portada de menéame, estas son las probabilidades que
nos da la inteligencia artificial:
21% de que este artículo tenga un número alto (más de 385) de meneos
72% de que este artículo reciba un número alto (más de 2.655) de clicks
42% de que este artículo tenga un número alto (más de 63) de comentarios
Resumen
En este artículo hemos visto los resultados del análisis de todos los artículos que han salido en la
portada de menéame en 2018.
Hemos comenzado con un análisis estadístico para ver las distribuciones de clicks, meneos,
comentarios y clicks / meneos. Analizando estas distribuciones nos hemos dado cuenta que
cuantos más meneos tiene una historia, menos clicks recibe en la mayoría de los casos.
También hemos hecho la lista de los top 11 para meneos, clicks, comentarios y los top 11 usuarios
que más veces han llegado a portada.
Hemos usado Inteligencia Artificial para descubrir cuáles son los temas de los que más se ha
hablado en menéame en 2018 y cómo están relacionados entre ellos.
La Inteligencia Artificial (IA) también nos ha ayudado a descubrir qué temas y qué palabras
influyen en el número de meneos, de clicks y de comentarios. La IA ha puesto de manifiesto que
los temas que favorecen un mayor número de meneos, también son los que producen un menor
número de clicks.
Aquí nos ha hecho falta tirar de Inteligencia Humana (IH). Me he aventurado a postular que la
razón por la que muchas de las noticias muy meneadas tienen pocos clicks, es porque están
autocontenidas.
Finalmente, me he atrevido a predecir que esta historia, que estás leyendo ahora mismo, recibirá
pocos meneos pero muchos clicks … en el hipotético caso que llegue a la portada de menéame.
Gracias
Gracias por leer este artículo, espero que te haya resultado interesante. Si tienes un momento, me
gustaría pedirte tu ayuda. Aquí tienes para elegir:
La regresión lineal es una de las técnicas más usadas en Machine Learning. Su fortaleza estriba
en su simplicidad e interpretabilidad. La regresión polinómica, como ya veremos, es una extensión
de la regresión lineal.
En el caso que estemos usando una sola variable, x, sabemos que una línea necesita 2
parámetros. La fórmula para la regresión lineal con una sola variable x es:
y = wx + b
El aprendizaje consiste en encontrar cuáles son los mejores parámetros (coeficientes) para los
datos que tengamos. Los mejores coeficientes serán los que minimicen alguna medida de error.
Para la regresión lineal usaremos el error cuadrático medio.
Hemos usado una regresión lineal para encontrar los parámetros de la línea que minimiza el error
de los datos que tenemos. El proceso de aprendizaje consiste en estimar los parámetros w y b.
Así nos queda que para estos datos, los mejores valores son:
w = 0.0918
b = 1.2859
así que nos queda:
y = 0.0918x + 1.2859
Podemos usar este modelo de regresión lineal para estimar cuáles serán los resultados para otros
valores de x. Por ejemplo, si queremos saber el resultado para x = 5, usaremos el modelo anterior
y veremos que el resultado es 1.7449:
Notación
Antes de explicar el método de los mínimos cuadrados para resolver regresiones lineales,
tenemos que expandir la notación. Debemos tener en cuenta que normalmente, tendremos
muchas variables.
y = wx + b
Por conveniencia, vamos a reescribir la ecuación anterior:
y = b + wx
Cuando tengamos un dato con N variables, llamaremos al dato X. También tenemos que expandir
los parámetros W para que cada parámetro vaya con una variable:
X = [x0 , x1 , x2 , ..., xN ]
W = [w0 , w1 , w2 , ..., wN ]
Si hacemos que
x0 = 1, w0 = b
y = b + wx = w0 x0 + w1 x1
y = WX
usando el producto matricial. Si tienes la multiplicación de matrices un poco oxidada, la versión
intuitiva sería:
y = w0 x0 + w1 x1 + w2 x2 + ... + wN xN
Para que la técnica de regresión lineal pueda aprender de nuestros datos, tenemos que
proporcionar los resultados y en forma de vector de M elementos, y los datos de entrada X en
forma de matrix. El convenio para la matriz X es el siguiente:
M filas: cada fila es un dato (por ejemplo, un inmueble, si queremos predecir su valor de
venta)
N columnas: cada columna es un atributo relevante (por ejemplo, cuántas habitaciones
tiene, metros cuadrados, etc).
Aprendizaje: El método de los mínimos cuadrados
El método de los mínimos cuadrados proporciona una solución analítica. Es decir, nos da una
fórmula para obtener la mejor estimación posible de W para los datos de entrada y resultados que
hemos proporcionado. La fórmula es la siguiente:
^ = (X T X)−1 X T y
W
En la práctica hay librerías numéricas que calculan automáticamente la mejor estimación de W por
nosotros. Ya veremos algún ejemplo práctico del cálculo de regresión lineal.
De momento, sólo quería indicar que dependiendo de la cantidad de datos y atributos, puede ser
una operación costosa computacionalmente hablando. Fíjate que hay que transponer matrices,
multiplicar matrices e invertir matrices. Todo ello muy costoso computacionalmente para grandes
cantidades de datos.
El método de los mínimos cuadrados no es la única forma de estimar los mejores parámetros W.
También podemos utilizar métodos de optimización numérica tales como el gradiente
descendiente.
El gradiente descendiente va a servir no sólo para resolver regresiones lineales y polinómicas sino
que es también fundamental para el aprendizaje automático de redes neuronales y aprendizaje
profundo.
Carl Friedrich Gauss es famoso, entre otras muchas contribuciones, por la distribución Gaussiana
o el método de los mínimos cuadrados para resolver regresiones lineales.
Cuentan que la primera aplicación del método de los mínimos cuadrados fue la determinación de
la posición de Ceres. Ceres es un asteroide que se «perdió» a los 40 días de descubrirse.
Realmente no se perdió, sino que al acercarse a la claridad del Sol, dejó de verse.
Varios científicos y astrónomos intentaron localizar Ceres. La única información que tenían eran
los datos de su observación durante 40 días. Gauss fue el único capaz de predecir dónde se
encontraría el asteroide Ceres cuando abandonó la parte del firmamento tan iluminada por el Sol.
Para ello, Gauss usó el método de los mínimos cuadrados.
A finales de 1801 los astrónomos encontraron el asteroide Ceres exactamente donde Gauss
predijo que estaría.
Datos de ejemplo
Primero vamos a generar unos datos que siguen una línea, y le añadimos ruido gaussiano. Para
ello usaremos la librería de python NumPy. La fórmula que he usado para generar los datos es:
Como vemos, la regresión lineal casi ha averiguado cómo hemos generado los datos:
Este pequeño error es normal debido a la cantidad de ruido gaussiano que hemos introducido y al
hecho de que hay muy pocos datos.
Así vemos, que la estimación de la regresión lineal del modelo que acabamos de entrenar para x =
5 es y = 1.7449.
Vamos a evaluar la calidad del modelo aprendido usando solamente los datos de entrenamiento.
Recuerda que en un problema real, hay que evaluar también la capacidad de generalización del
modelo. Podemos evaluar la calidad del modelo midiendo el error cuadrático medio y el coeficiente
de determinación R2.
Coeficiente de determinación R2
Fuente: wikipedia
Siempre que podamos, es bueno visualizar los resultados, para saber cómo se está comportando
el modelo. Este ejemplo que estamos haciendo es muy simple, y por tanto, muy fácil de visualizar.
La línea que el modelo ha aprendido siguiendo el método de los mínimos cuadrados aparece en el
siguiente gráfico en rojo.
Resumen
En este artículo hemos hablado de la regresión lineal. Esta es la lista de los puntos que hemos
cubierto:
Recursos
[vídeo] donde explico la regresión lineal y polinómica (en inglés)
Error Cuadrático Medio
Coeficiente de Determinación R2
LinearRegression: Documentación de la Regresión Lineal en la librería scikit-learn
EU Datathon 2019 – certamen de datos abiertos
Por Jose Martinez Heras
01/02/2019
EU Datathon 2019
EU Datathon 2019 es un certamen que tiene como objetivo fomentar el uso de los datos abiertos
que proporciona la Unión Europea. El certamen permite a los concursantes mostrar sus
habilidades en la utilización de los datos y también sus ideas innovadoras. Además, les ofrece la
oportunidad de establecer contactos y encontrar apoyo para seguir desarrollando sus ideas
después del certamen.
Los equipos participantes podrán competir con sus apps en uno o dos retos temáticos:
Premios
Los participantes en la edición 2019 tendrán la posibilidad de ganar uno de los premios en
efectivo otorgados en cada reto:
Patrocinadores
Estos son los patrocinadores del certamen EU Datathon 2019:
¿Vas a participar?
Si te animas a participar, tienes más información en la web del EU Datathon 2019. Aunque no lo
dice explícitamente, es una oportunidad de usar Machine Learning con estos datos. ¡Suerte!
Contraste de Hipótesis 1 – ¿cómo no aceptar lo falso?
Por José David Villanueva García
06/02/2019
El contraste de hipótesis es una de las técnicas estadísticas más conocidas para juzgar si una
determinada propiedad de una población es compatible con lo que podemos observar obteniendo
una muestra de esta población.
Población estadística: es el conjunto completo que vamos a estudiar. Por ejemplo, todos
los hombres de España; o todos los mamíferos del mundo; o todos los estudiantes menores
de 18 años.
Muestra: es un subconjunto de la población. Una muestra de la población «todos los
hombres de España» sería un conjunto determinado de los hombre de España, por
ejemplo, 100 hombres, o 1000 hombres. Por supuesto, estas muestras se eligen de una
determinada forma para que sea lo suficientemente «buena» (representativa) para toda la
población.
Media: supongamos ahora que queremos estudiar una propiedad sobre la población «todos
los hombres de España», por ejemplo, la edad. Si cogemos una muestra de 100 hombres,
la media muestral es la suma de las edades de los 100 hombres, dividida entre 100 (o el
número de hombres en la muestra). Por lo tanto, la media de la población (denotada por μ)
es la suma de las edades de todos los hombres de España, dividido entre el número de
hombres en España. Esto es muy difícil de calcular, el simple hecho de preguntar a toda
una población sobre una o más propiedades de ella es prácticamente imposible. Por ello,
existen técnicas para estimar la media de la población
Desviación estándar: al igual que la media, tenemos la desviación estándar poblacional
(denotada por σ) y la muestral. Mide la variación de los datos respecto a la media. Una
desviación estándar baja significa que los datos están agrupados cerca de la media,
mientras que una desviación estándar alta indica que los datos se extienden sobre un rango
de valores más amplio.
Distribución normal: esta distribución permite modelar numerosos fenómenos naturales y
sociales. Tiene forma de campana y usándola podemos calcular la probabilidad de un
suceso ocurra dentro de un determinado rango de valores. La distribución normal se da en
términos de dos parámetros: uno de ellos e la media y el otro puede ser la varianza o la
desviación estándar. La varianza es el cuadrado de la desviación estándar.
En estos Apuntes de Estadística podéis encontrar un recurso muy bueno para repasar desde cero
los conceptos básicos pero muy importantes sobre inferencia estadística.
Seguro que alguna vez te has levantado a trabajar y has sentido un fuerte dolor de cabeza, dolor
en la garganta y malestar en general. Sospechas que puedes tener fiebre. Tienes que
comprobarlo. Para ello usarás un termómetro, y no tendrás fiebre si la temperatura que marca es
menor o igual a 37 grados. Por lo tanto, si marca más de 37 grados, tendrás fiebre. Esto es un
contraste de hipótesis. Basándonos en ciertos hechos, formulamos una hipótesis inicial y,
dependiendo de cierto test, la rechazamos o no (quédate con esta última frase).
Ya en términos estadísticos, los hechos en los que nos basaremos serán ciertas muestras que
extraeremos de una población, la hipótesis que planteamos será la hipótesis nula (generalmente
denotada por H0) , y la hipótesis contraria, la hipótesis alternativa (generalmente denotada por
H1). La hipótesis nula es la que suponemos que es cierta. La hipótesis alternativa sustituye a la
hipótesis nula cuando ésta es rechazada.
En nuestro ejemplo anterior, asumiendo como cierto que no tenemos fiebre, tendríamos que:
H0 : temperatura ≤ 37grados
H1 : temperatura > 37grados
Ahora, haciendo un determinado test, rechazaremos o no la hipótesis nula. Como ves, es la
segunda vez que repito esta última frase; y es que es muy importante, ya que lo que hacemos con
la hipótesis nula es algo parecido a lo que se hace en un juicio, donde la hipótesis nula sería «el
acusado es no culpable». Si tenemos suficientes pruebas, descartamos la hipótesis nula y nos
quedamos con la alternativa, es decir, declaramos al acusado culpable. Pero si no tenemos
suficientes pruebas, no podemos descartar la hipótesis nula, es decir, no podemos declarar al
acusado culpable. Pero eso no significa que la hipótesis nula sea correcta (que el acusado sea
inocente), simplemente que no la podemos descartar.
Tipos de errores
Por supuesto, este método nos asegura que si rechazamos la hipótesis nula H0, la probabilidad de
que efectivamente H0 sea errónea es muy alta. Por lo tanto, tiene sentido fijar un número que nos
indique la probabilidad de que, siendo H0 verdadera, sea rechazada, es decir, cometer un error de
tipo I. A este número le llamaremos nivel de significación, y lo denotaremos por α.
Es decir, fijando nuestra hipótesis nula como lo que creemos cierto, lo que nos interesa es que H0
sea cierta, minimizando cometer un error de tipo I y rechazarla, por lo que generalmente
escogeremos un α muy pequeño. En esta tabla resumimos los tipos de errores que podemos
cometer.
Describamos los pasos necesarios para hacer un contraste de hipótesis desde el principio hasta el
final.
1. Identificar el parámetro que vamos a estudiar, puede ser la media, la desviación típica, la
proporción, etc., de una cierta población.
2. Formular la hipótesis nula y la hipótesis alternativa.
3. Fijar un valor para el nivel de significación α.
4. Elegir una muestra de tamaño n de nuestra población y obtener el valor del estadístico para
esta muestra en concreto.
5. Determinar la región de aceptación y la región de rechazo.
6. Decidir si rechazamos o no la hipótesis nula.
7. Interpretar los resultados obtenidos.
Algunos de estos conceptos, como «el valor del estadístico» o «la región de aceptación y
rechazo», no los hemos detallado todavía, pero los veremos pronto.
Una vez realizados los pasos del 1 al 5 , y asumiendo que la población sigue una distribución
normal, esta es la pinta que tendrán los gráficos obtenidos, dependiendo de la condición que
tengamos en la hipótesis nula.
Tipos de contraste de hipótesis
Si la hipótesis nula se formula en términos «de igual» y la alternativa «de distinto»,
tendremos un contraste de hipótesis bilateral.
H0 : μ = μ0
H1 : μ =
μ0
H0 : μ ≥ μ0
H1 : μ < μ0
H0 : μ ≤ μ0
H1 : μ > μ0
El título suena complicado, pero no lo es en absoluto. Significa que tenemos una población que
sigue una distribución normal de media μ desconocida y desviación estándar σ conocida, N(μ,σ²),
y lo que vamos a hacer es un contraste de hipótesis sobre la media. Para ello, veamos un ejemplo
bastante ajustado a un ejemplo real.
En nuestro estudio, queremos saber si la media de la altura ha cambiado en los últimos 30 años o
no, es decir
H0 : μ = 170
H1 : μ =
170
3 Fijar un valor para el nivel de significación α
4 Elegir una muestra de tamaño n de nuestra población y obtener el valor del estadístico
para esta muestra en concreto
Supongamos que finamos n=10, y tomamos una muestra de este tamaño de la distribución normal
con la que estamos trabajando, N(μ,σ²)=N(150,500), obteniendo los siguientes resultados:
176; 174; 152; 141; 192; 189; 190; 194; 191; 174
La media muestral (estadístico) es por tanto el resultado de sumar todos los valores y luego dividir
entre 10, es decir,
ˉ = 177.3
x
Este es el paso en el que aún no hemos profundizado y lo haremos ahora. La media muestral
obtenida en el paso anterior, proviene de una distribución normal, por lo que ella misma también
sigue una distribución normal de la forma
500
N (μ, )
n
Procedemos entonces a tipificar la media muestral. Esto consiste en transformar la distribución
de la media muestral en una distribución normal de media 0 y varianza 1, mediante la siguiente
fórmula:
ˉ−μ
x
Z=
σ2
n
Ahora, nuestro estadístico Z (llamado estadístico experimental) sigue una distribución normal
N(0,1). Con el nivel de significación α=0.1 fijado anteriormente, consultamos la tabla de la
distribución N(0,1) para los valores
Z1− α2 , Z α2
que por la simetría de la distribución normal, es lo mismo que hallar en la tabla los valores
−Z α2 , Z α2
Cr = (−∞, −Z α2 ) ∪ (Z α2 , ∞)
Región de aceptación:
Ca = (−Z α2 , Z α2 )
Consultamos la tabla de la distribución normal para los valores anteriores, y obtenemos que
nuestra región de aceptación para α=0.1 es
(−1.64, 1.64)
Veamos el valor del estadístico experimental sustituyendo los valores en su fórmula. Tenemos que
ˉ−μ
x ˉ − 170
x
Z= = = 1.032
σ2 500
n n
Como nuestro estadístico experimental está dentro de la región de aceptación, se concluye que
no se puede rechazar la hipótesis nula. Es decir, no tenemos pruebas suficientes para concluir
que la media de la altura de los jugadores de baloncesto de los equipos de la región haya
cambiado después de pasados 30 años. Además, afirmamos esto con 90% de probabilidad de no
equivocarnos.
En el paso anterior, nuestro modelo ha decidido que no podemos rechazar la hipótesis nula, pero
tenemos que tener en cuenta algunos factores muy importantes a la hora de entregar nuestro
informe al cliente.
1.- Hemos asumido que la varianza de la población no ha cambiado. Esto es mucho asumir si no
conocemos la media poblacional. Una forma de afinar nuestro análisis es suponer que tampoco
conocemos la varianza poblacional. Todo es igual, pero tenemos un problema al tipificar la media
muestral
ˉ−μ
x
Z=
σ2
n
Usos en medicina
En concreto, se utiliza ampliamente para ensayos clínicos de nuevos medicamentos. Entre
ellos, se utiliza para comprobar si varios tratamientos son igualmente efectivos en términos de una
variable cualitativa, es decir, cuando los valores que toma la variable son cualidades o categorías,
o nombres. Por ejemplo: la variable sexo (Hombre, Mujer), la variable tener o no una determinada
patología, etc.
Usos en ecología
Una de las cuestiones más importantes que se plantean los ecólogos es el análisis de las
diferencias entre dos poblaciones. En este caso, plantear como hipótesis nula si hay diferencia
entre dos poblaciones concretas carece de sentido, ya que no existen en la naturaleza dos seres
vivos idénticos. Por lo tanto, lo que nos interesa en este caso en valorar cómo de grande es la
diferencia entre ambas poblaciones.
Usos en sociología
Este es uno de los campos donde también el contraste de hipótesis es bastante utilizado. En
política, un sociólogo puede pronosticar que en una región determinada el nivel de abstención
será, digamos, de un 30%. Elige una muestra aleatoria de, pongamos, 500 individuos con derecho
a votar y ya puede determinar con un nivel de significación de, por ejemplo, un 0.5%, si puede
admitir el pronóstico inicial.
Resumen
Sabemos que no todos los problemas a los que se enfrenta un científico o un ingeniero se refieren
a estimar únicamente un parámetro de la población, sino que generalmente hay que formular un
proceso de decisión que está basado en datos y puede producir una conclusión acerca de algún
sistema o población. Esto es justamente lo que hemos hecho en este post, se hace una conjetura
sobre el sistema o población que queremos estudiar y el procedimiento del contraste de hipótesis
conduce a su aceptación o rechazo, basándonos en hipótesis estadísticas. La potencia de estos
modelos es enorme, y es usado para tomar decisiones en asuntos tan sensibles como la
medicina.
En siguientes posts, veremos cómo varían las distribuciones y el método dependiendo del
conocimiento que tengamos sobre la población y, lo que es muy importante, cómo obtener
muestras representativas de estas poblaciones.
Actualmente trabaja como ingeniero en Darmstadt, Alemania, en diferentes proyectos para la ESA
(European Space Agency) y EUMETSAT (European Organisation for the Exploitation of
Meteorological Satellites).
Regresión Polinómica en Python con scikit-learn
Por Jose Martinez Heras
10/02/2019
En algunas ocasiones nos encontraremos con datos que siguen una función polinómica. En estos
casos, el mejor modelo que podemos usar es la regresión polinómica. Este artículo explica la
teoría detrás de la regresión polinómica y cómo usarla en python.
Vamos a verlo con fórmulas, porque creo que va a ser más fácil de entender. Antes poníamos en X
todos nuestros atributos y usábamos el método de los mínimos cuadrados para obtener los
mejores parámetros W. Antes X era:
X = [x0 , x1 , x2 , x3 , ..., xN ]
En este ejemplo, simplemente he elevado al cuadrado cada atributo … lo que puede ser suficiente
en algunos casos. Dependiendo del grado del polinomio y si deseamos multiplicar un atributo por
otro, podemos expandir X mucho más. Afortunadamente, existen librerías de machine learning que
hacen este proceso de expansión automáticamente siguiendo nuestras instrucciones.
Datos de ejemplo
Como datos de ejemplo, he generado una función polinómica de grado 3 a la que le he añadido
ruido Gaussiano. La función que he usado es:
En vez de
y = −100 − 5x + 5x2 + 0.1x3 + N (0, 500)
Podemos ver que tiene algún error en la estimación de los parámetros, pero es normal para los
pocos datos que le hemos dado. Sólo ha aprendido con 500 muestras en el intervalo [-50, 50] … y
hay muchos polinomios compatibles con estos datos.
Como podemos ver, las medidas de evaluación del modelo son muy buenas:
Resumen
Esta es la lista de los puntos que hemos cubierto:
la regresión polinómica (también conocida como regresión polinomial) no es más que una
regresión lineal con atributos polinómicos
cómo hacer una regresión polinómica en python
evaluación con el error cuadrático medio, el coeficiente de determinación R2 y visualizando
datos
Recursos
[vídeo] donde explico la regresión lineal y polinómica (en inglés)
Regresión Lineal
Error Cuadrático Medio
Raíz Cuadrada del Error Cuadrático Medio
Coeficiente de Determinación R2
LinearRegression: Documentación de la Regresión Lineal en la librería scikit-learn
PolynomialFeatures: Documentación del preprocesado para crear atributos polinómicos en
la librería scikit-learn
Feliz San Valentín – Amor en 20 minutos
Por Jose Martinez Heras
14/02/2019
¡Feliz San Valentín! Vamos a celebrarlo haciendo un análisis de todas las noticias relacionadas
con el amor en el periódico 20 minutos. Para el análisis, usaremos técnicas de Procesamiento del
Lenguaje Natural y Visualización de datos.
Para encontrar los artículos más interesantes he usado técnicas de procesamiento del lenguaje
natural no-supervisado (modelo bolsa de palabras, tf-idf, similitud coseno, modelado de temas,
etc…). En otros posts más técnicos explicaré cómo funcionan. De momento, nos podemos quedar
con que interpreto «más interesante» como «más diferente en comparación con el resto de
artículos».
Hay tres tipos de análisis de datos que podemos realizar: descriptivo, predictivo y prescriptivo.
Veamos en qué consiste cada uno de ellos y cómo combinarlos.
Análisis Descriptivo
El análisis descriptivo se ocupa de estudiar el pasado. Como el nombre indica, el análisis
descriptivo se usa para describir lo que ha pasado. Hay varias formas de describir el pasado:
Análisis Predictivo
El análisis predictivo se refiere al uso de aprendizaje automático supervisado. A efectos prácticos,
normalmente consta de estos pasos:
Si quieres profundizar en las fases del proceso del análisis predictivo, puedes consultar este
artículo.
Como resumen, quédate con que en el análisis predictivo, lo más importante es la calidad de la
predicción.
Análisis Prescriptivo
Con el análisis prescriptivo intentamos cambiar el futuro. Es decir, vamos a usar Inteligencia
Artificial para descubrir qué tenemos que hacer para obtener los resultados que queremos.
Una forma de realizar análisis prescriptivo es usando modelos de inteligencia artificial explicables.
Por «explicables» quiero decir que podamos entender cómo el modelo de machine learning está
realizando su predicción. Actualmente los modelos de machine learning que mejor resultados dan
para predecir, son difíciles de interpretar. Por ejemplo, esto le pasa a las redes neuronales
profundas (deep learning) y a los bosques aleatorios (random forests).
Por ejemplo, para realizar el análisis de las noticias de portada de menéame, usé regresión
logística. La regresión logística es un modelo fácilmente interpretable. Así que podemos
inspeccionar lo que ha aprendido y cómo los datos de entrada influyen en los resultados.
Si conseguimos encontrar qué causa los resultados que queremos … entonces ya sabremos lo
que tenemos que hacer. Aunque con cuidado.
Tenemos que tener cuidado cuando inspeccionamos los modelos de machine learning. Aunque un
modelo sea muy bueno prediciendo, podría haber aprendido los datos de memoria. Primero hay
que asegurarse de que el modelo generaliza bien.
También ayuda mucho la Inteligencia Humana (IH). Nosotros podemos en muchos casos validar lo
que nos está diciendo la IA, especialmente si tenemos una mente abierta y sentido común.
Después de usar una IA explicable, asegurarnos que generaliza bien y usar nuestra inteligencia
humana … el último paso es realizar experimentos aleatorios (randomized tests). Estos
experimentos se usan mucho en farmacia. Son el estándar para demostrar la efectividad de un
medicamento. También se usan mucho para la optimización de sitios web y marketing. En este
contexto se les llama tests A/B.
Por ejemplo, creamos un modelo de machine learning para predecir cuánto tiempo un usuario va a
visitar un sitio web. Usamos un modelo de machine learning explicable y nos damos cuenta que
unos de los factores principales es el tamaño de letra de la página que visitan.
Podríamos concluir que lo que tenemos que hacer es aumentar el tamaño de letra de todos los
artículos. Pero hay otros factores que no estamos considerando. Por ejemplo, a lo mejor los
distintos tamaños de letra corresponden a las preferencias de los autores de los artículos. Así que,
en este casos, los visitantes del sitio web tendrían preferencia por el autor, en lugar de por el
tamaño de letra.
Para estar seguros tendríamos que realizar un experimento aleatorio. Conforme vayan llegando
usuarios, aleatoriamente les daríamos una de dos versiones: una en la que todas las páginas
tienen una fuente mayor, y otra en la que la fuente es normal. Al medir los resultados de este
experimento podríamos saber realmente si un tamaño de letra mayor es una causa del tiempo en
el sitio web.
Resumen
En este artículo hemos visto las diferencias entre los análisis descriptivo, predictivo y prescriptivo.
Una resumen rápido sería:
En este primer post de una serie de tres, hablaremos de una de las ramas más importantes del
Machine Learning y la Inteligencia Artificial, las redes neuronales. Abordaremos este tema desde
cero, empezando por la historia de las redes neuronales, sus conceptos básicos, nos
adentraremos en las matemáticas que están involucradas en ellas e implementaremos un ejemplo
de Redes Neuronales desde cero para reconocer cierto tipo de patrones en imágenes.
Introducción
Las redes neuronales (neural networks) se enmarcan dentro del campo de la Inteligencia Artificial.
En primer lugar, decir que hace unos 25 años prácticamente nadie sabía lo que era Internet ni su
significado, como podéis comprobar en este vídeo del programa Today Show de 1994. Las redes
neuronales se inventaron en los años 60, ¿qué ha ocurrido entonces?
Un poco de historia
En 1994, los ordenadores tenían una capacidad muy limitada . Este es el principal motivo por el
cual las redes neuronales no fueron usadas en esa época, a pesar de ser inventadas décadas
antes. Los ordenadores no tenían todavía la capacidad de cálculo. Tampoco la capacidad de
tratamiento y almacenamiento de datos para trabajar con redes neuronales. Sin embargo, los años
70 y 80 están caracterizados por películas futuristas con robots y máquinas que toman el control.
Sin embargo, el crecimiento en todo los sentidos de los ordenadores ha sido exponencial desde
aquella época.
con unas flechas de entrada a la izquierda, cierto cerebro las procesa y a partir de ese momento
son transformadas en datos digitales:
El padre del concepto de Deep Learning fue el británico Geoffrey Hinton. Investigó sobre el Deep
Learning en los años 80, actualmente trabaja en Google, y muchas cosas de las que hablaremos
provienen de la nomenclatura de Geoffrey Hinton. La idea principal que hay detrás del concepto
de Deep Learning es observar el cerebro humano e inspirarse en él para intentar reproducir
de forma informática su comportamiento. Por lo tanto, si lo que intentamos es imitar el cerebro
humano, tenemos que llevar ciertos elementos de la neurociencia al ordenador. Veamos cómo
hacemos esto.
La Neurona humana
En ella podemos observar una especie de masa o cuerpo más o menos redondo. Además, vemos
un núcleo o centro, y una serie de ramificaciones que se van extendiendo. En el cerebro, más o
menos, tenemos unas cien mil millones de neuronas. Por lo tanto, lo que tratamos de hacer es
trasladar el comportamiento del cerebro humano a una máquina, teniendo en cuenta que el
conocimiento que tenemos del cerebro humano es todavía muy limitado.
Redes neuronales
Veamos entonces cómo pasamos de las neuronas que hay en el cerebro humano a formar una
red neuronal en una máquina que simule su comportamiento.
La Neurona Artificial
Las neuronas artificiales se modelan de tal forma que imiten el comportamiento de una neurona
cerebral. Tendrán unas ramificaciones y un núcleo o nodo. Habrá ramificaciones de entrada al
nodo, que serán las entradas de la neurona, procedentes de otras neuronas. Esta información se
procesará en un nodo, y se generará una información de salida que se trasmitirán por las
ramificaciones de salida a otras neuronas. Podemos pensar en las conexiones entre neuronas
artificiales como en las sinapsis de las neuronas del cerebro. La imagen de una típica neurona
artificial es la siguiente.
Neurona artifical
La red neuronal
Vemos que las ramificaciones de salida de algunas neuronas son las ramificaciones de entrada de
otras, y así sucesivamente. Pero vemos un par de diferencias entre las capas. Las neuronas de
color rojo no tienen ramificaciones de entrada. Son información que vamos a dar a las neuronas
«desde el exterior», o «estímulo inicial». También vemos que las neuronas de color azul tiene
ramificaciones de salida que no están conectadas a otras neuronas. Son la información de salida
de la red neuronal o «estímulo final». Dependiendo del número de capas ocultas (amarillas)
podemos hablar de una red neuronal simple o profunda.
Los valores de salida pueden ser continuos, como el precio de una determinada compra. También
pueden ser binarios, como por ejemplo si una persona va a padecer una enfermedad o no. O
pueden ser una categoría, como la marca de coche que más se venderá el próximo año. En este
contexto, el caso binario es un caso particular donde tenemos dos categorías.
Para poder llevar a cabo el procesado, cada sinapsis tendrá asignado un valor o peso. Equivalen
a la «fuerza» de la señal que se trasmite por cada sinapsis. El ajuste de estos pesos para tener
una red neuronal que haga lo que queremos es fundamental. Hablaremos de ello ampliamente
cuando hablemos del entrenamiento de la red neuronal. Veremos métodos para ajustar estos
pesos, como el descenso de gradiente y el backpropagation. Veamos entonces cómo se
procesa la información dentro de cada neurona.
Todas las variables independientes de la capa de entrada, pertenecen a una única observación,
una única muestra, «un sólo registro de la base de datos».
En el núcleo de la neurona es donde se procesan las señales de entrada y los pesos. Una de las
formas es multiplicar cada señal de entrada por su peso y sumarlo todo, es decir, hacer una
combinación lineal de los pesos de las conexiones y las entradas
w 0 x0 + w 1 x1 + w 2 x2 + … + w N xm
como vemos en el primer paso de la siguiente imagen. Posteriormente, se aplica una determinada
función de activación al resultado del primer paso, y el resultado final se propaga a la salida, tercer
paso de la imagen.
y = ϕ(w0 x0 + w1 x1 + w2 x2 + … + wN xm )
Veamos las cuatro funciones de activación más típicas que suelen usarse.
Funciones de activación
Primero se calcula la combinación lineal de los pesos y las entradas. Las funciones de activación
no son más que la manera de trasmitir esta información por las conexiones de salida. Puede que
nos interese transmitir esa información sin modificar, por lo que usaríamos sin más la función
identidad. En otros casos, quizás no queramos que se transmita información alguna. Es decir,
transmitir un cero en las salidas de la neurona.
En general, las funciones de activación se utilizan para dar una «no linealidad» al modelo y que la
red sea capaz de resolver problemas más complejos. Si todas las funciones de activación fueran
lineales, la red resultante sería equivalente a una red sin capas ocultas.
Vamos a ver las cuatro familias de funciones de activación más usadas en redes neuronales.
Función escalón (threshold)
Como vemos en la figura de abajo, en el eje x está representado el valor ya ponderado de las
entradas y sus respectivos pesos, y en el eje y tenemos el valor de la función escalón. Esta
función propaga un 0 si el valor de x es negativo, o un 1 si es positivo. No hay casos intermedios,
y sirve para clasificar de forma muy estricta. Es la función más rígida.
Función escalón
Función sigmoide
Como en la función escalón, existe una división entre los valores negativos y positivos de x, pero
la función sigmoide no es tan estricta, el cambio se hace de manera suave. Se usa en la regresión
logística, una de las técnicas más usadas en Machine Learning. Como vemos en la figura de
abajo, la función no tiene aristas, es más suave (en términos matemáticos, es derivable). Cuanto
más positivo es el valor de x más nos acercamos a 1 y por el contrario, cuanto más negativo es x
más nos acercamos a 0.
Función sigmoide
Esta función es muy útil en la capa final de salida al final de la red neuronal, no solo para clasificar
con valores categóricos, sino también para intentar predecir las probabilidades de pertenencia a
cada categoría, donde sabemos que la probabilidad de un suceso imposible es 0 y la de un
suceso seguro es 1.
Función rectificadora (ReLU)
Volvemos a tener en esta función una arista. Vemos en la figura de abajo que su valor es 0 para
cualquier valor negativo de x. Si x es positivo la función retorna el propio valor de x. Por lo tanto,
se obvian todas aquellas entradas que una vez ponderadas tienen un valor negativo y nos
quedamos con el valor exacto de las positivas. Vemos también que, al contrario de las anteriores,
los valores no se restringen a valores entre 0 y 1.
Función rectificadora
Esta función es muy parecida a la función sigmoidea, pero en este caso, como vemos en la figura
de abajo, no empieza en 0 y termina en 1, sino que empieza en -1 y termina en 1.
Ya tenemos los ingrediente básicos para configurar una red neuronal. Una capa de neuronas de
entrada, donde pasaremos información a la red a modo de estímulos, una capa de neuronas
oculta, que se encargará del procesado de la información proporcionada por la capa de entrada, y
una capa de salida que procesará la información proporcionada por la capa oculta para obtener el
resultado final de la red neuronal para una entrada específica. Una posible configuración podría
ser como la mostrada en la figura de abajo.
Ejemplo de configuración de una red neuronal
Decir que la ponderación de las señales de salida la hemos hecho con una combinación lineal, en
la capa oculta usamos una función rectificadora y en la de salida usamos una función sigmodea.
Podéis usar en vuestras redes neuronales cualquier otro tipo de función que mejor se
ajuste al problema que hay que resolver, esto es sólo un ejemplo.
La elección un una función de activación u otra dependerá de varios factores. Uno de ellos es el
rango de valores que queremos en la salida de la neurona. Si no hay restricciones en el rango,
utilizaremos la función identidad que propagará en la salida el valor de entrada. Si la restricción es
únicamente que el valor de salida debe ser positivo, sin límite de cantidad, elegiremos una función
rectificadora. Quizás nos interese una salida binaria 1 y 0 para clasificar, por lo que elegimos, por
ejemplo, la función escalón. Puede que usemos un algoritmo de aprendizaje que hace uso de
derivadas. Entonces utilizaremos funciones de activación donde la derivada esté definida en todo
el intervalo. Por ejemplo la sigmoidal o la tangente hiperbólica, teniendo en cuenta que son más
costosas en términos computacionales.
La función de costes
Superficie
Edad de la casa
Número de dormitorios
Distancia a la ciudad
Tendremos miles de registros en una base de datos, con información sobre las casas y su valor
actual. Se inicializarán los pesos de las diferentes conexiones entre neuronas de alguna forma (ya
veremos cómo). Empezaremos a introducir en la red los registros correspondientes a cada casa y,
para cada uno de ellos, obtendremos un valor de salida que generalmente no serán iguales a los
valores reales del precio de las casas.
La función de coste es una función que mide, en cierto modo, la «diferencia» entre el valor de
salida y el valor actual. En este ejemplo usaremos el error cuadrático medio. Por supuesto,
puede ser una función más compleja.
Alimentamos en diferentes iteraciones a la red neuronal con los mismos datos de entrenamiento
que tenemos, y en cada iteración intentamos minimizar la función de coste. Es decir que la
diferencia entre los valores de salida y los reales sean cada vez menores. Como los datos de
entrada son los que son, sólo podemos conseguir esto ajustando los pesos de las conexiones
entre neuronas al final de cada iteración.
Resumiendo, al final de cada iteración, para cada piso se obtendrá un valor de salida (predicción)
de la red neuronal. Este valor diferirá en una cantidad con respecto al valor real que medirá la
función de costes.
Ahora, actualizaremos los pesos de las conexiones neuronales y retroalimentamos la red neuronal
con los datos iniciales de los pisos. Se repite el proceso de nuevo y se van ajustando los pesos de
forma que la función de costes sea cada vez menor.
Una manera de calcular la función de costes es como la que vemos en la figura de abajo.
Calculamos el cuadrado de la diferencia entre el valor de salida y el real (evitando valores
negativos) de cada casa. Luego sumamos el valor para todas las casas y dividirlo entre 2
(abordaremos las matemáticas en siguientes post).
Valores para la función de costes
Una vez finalizado el proceso, tendremos una red neuronal entrenada lista para predecir el precio
de una casa suministrando los datos de esta. En general la red hará predicciones excelentes para
datos que hemos usado para entrenarla. Pero para evaluar la calidad de predicción de la red
neuronal es necesario usar datos que no hayan sido usados para optimizar los pesos de las
conexiones de la red.
Resumen
Ya tenemos las nociones básicas de lo que es una red neuronal. Con toda la información que
tenemos sobre un determinado problema, en nuestro caso precios de pisos, construimos una red
neuronal que aprenda a partir de esos datos. Finalmente, la red será capaz de predecir
correctamente cuando preguntemos por datos que la red nunca ha visto.
En este post hemos visto algunos conceptos matemáticos sencillos, como las funciones de
activación. En el siguiente, nos adentraremos de verdad en las matemáticas que hay detrás de las
redes neuronales. Las funciones de activación de las neuronas que hemos visto son muy
importantes. Su correcta elección nos proporcionará una red neuronal que haga buenas
predicciones. Básicamente, las funciones de activación que hemos visto devuelven, o bien un
valor entre cero y uno, o bien el mismo valor de entrada si este es positivo (rectificadora).
En el siguiente post veremos cómo se ajustan los pesos de las conexiones de la red neuronal.
Para empezar a trabajar con ejemplos de redes neuronales, no es necesario conocer las
matemáticas en las que se basan. Pero hay ventajas en conocer las matemáticas que hay detrás
de cualquier algoritmo de machine learning. Cuando los resultados no sean lo suficientemente
buenos, podremos obtener ideas de cómo mejorar el rendimiento. Si no tenemos esta base
matemática, no tendremos más remedio que conformarnos con el resultado que tenemos.
Veremos que el problema del ajuste de pesos «por fuerza bruta», es decir, probando todas las
posibilidades y quedándonos con la mejor, es en la práctica imposible ya que tardaríamos
millones de años de computación en encontrar la mejor solución. Sin embargo, las
matemáticas nos permiten encontrar esta solución en un tiempo razonablemente corto.
Actualización: la segunda parte ya está disponible: Redes neuronales desde cero (II): algo de
matemáticas
Créditos
Las imágenes de este artículo han sido reproducidas, con permiso, del Curso completo de
Inteligencia Artificial con Python.
Actualmente trabaja como ingeniero en Darmstadt, Alemania, en diferentes proyectos para la ESA
(European Space Agency) y EUMETSAT (European Organisation for the Exploitation of
Meteorological Satellites).
Gradiente Descendiente para aprendizaje automático
Por Jose Martinez Heras
06/03/2019
M i=1
Cuando estamos resolviendo problemas con una sola variable, el error cuadrático medio tiene
forma de parábola. Con dos variables, de bol o de cuenco. Y con tres o más variables … es difícil
de saber qué forma tiene porque necesitaríamos 4 dimensiones para visualizarlo.
Función de Coste
La función de coste J es la función de lo que queremos optimizar. En el caso más simple, es igual
al error que queremos minimizar.
J = MSE
Ya veremos que no siempre es tan simple. En algunos casos nos interesará introducir términos de
regularización, pero eso lo dejaremos para otro artículo.
¿Qué es el Gradiente?
Creo que la mejor forma de explicar lo que es el gradiente, es diciendo que es una generalización
de la derivada. Seguramente ya sabéis lo que es una derivada. Aquí tenéis un pequeño
recordatorio.
Fuente: wikipedia
El gradiente es el conjunto de todas las derivadas parciales de una función. En el caso de machine
learning, estamos interesados en el gradiente de la función de coste.
Ejemplo intuitivo
¿Te acuerdas cuando eras pequeño y en el colegio había que hacer alguna cuenta? Y en vez de
hacerla como te habían enseñado la hacías por tanteo … o como decimos en España «por la
cuenta de la vieja». Pues justo así funciona el gradiente descendiente. Sorprendente! Sabías lo
que era aunque todavía no supieses como se llamaba.
Pongamos por ejemplo que tenemos una función f que es una línea pero no sabemos cuáles son
sus parámetros. Tenemos los datos para la x, tenemos los datos para la y … pero no sabemos los
parámetros de la función f en la expresión
y = f (x) = wx + b
En este ejemplo, para hacerlo más simple, vamos a suponer que b=0.
Podemos ir probando. Por ejemplo, para w = 1, tendríamos un error cuadrático medio (mse) de
758.37. Podemos probar con otro w para ver si aumentamos w o lo disminuimos. Si probamos
con w = 2, el mse sería 265.82. Parece que aumentar el valor para w es una buena idea. Si lo
seguimos aumentado a w = 3, el mse es de 30.02. ¡Vamos por el buen camino! vamos ahora a
aumentarlo hasta w = 4 … para 4, el mse es 50.97. Claramente nos hemos pasado, podemos
echar para atrás y probar w = 3.5 que nos da un mse de 8.40.
En esta lista resumimos los intentos que hemos hecho hasta que dar con la solución. ¿Que cómo
sabemos que w = 3.5 es la solución? Porque es la fórmula que he usado para generar los datos
de este ejemplo. Ya veremos cómo hacerlo cuando no sepamos la solución correcta.
El método del gradiente descendiente nos permite automatizar de forma más eficiente el ir
probando coeficientes de los modelos de machine learning. Se puede usar tanto con modelos
simples (como el que hemos visto en el ejemplo) como en modelos complejos (por ejemplo, redes
neuronales con muchas variables).
∂MSE
∂W
∂MSE
W ←W − α
∂W
El ratio de aprendizaje (learning rate en inglés) es necesario para asegurarnos que no vamos
dando tumbos. Me explico: si el ratio de aprendizaje es demasiado grande, los cambios en W
serán también muy grandes y será difícil encontrar los coeficientes que minimicen la función de
coste.
Por otra parte, si el ratio de aprendizaje es demasiado pequeño, el gradiente descendiente tardará
mucho en encontrar la solución adecuada.
Cuando usamos el gradiente descendiente nos arriesgamos a caer en un mínimo local. Cuando
caemos en un mínimo local, distintos valores de W’ cercanos a W tendrán un valor de la función
de coste mayor que en el punto W. El gradiente descendiente nos devolverá pues a W una y otra
vez. Así que creeremos que hemos encontrado la mejor solución. Sin embargo, el mínimo global
bien pudiera estar en otra parte.
Durante un tiempo, esto trajo de cabeza a muchos científicos de datos en la era del data mining.
Se usaron varias estrategias para mitigar el efecto de caer en un mínimo local. Una estrategia muy
popular por su simplicidad era la de empezar el gradiente descendiente en distintos puntos al azar
y elegir la mejor solución.
Fuente: wikipedia
En los puntos de silla, el gradiente disminuye hasta cero en algunas dimensiones, pero sigue
habiendo gradiente relevante en otras dimensiones.
Información adicional
Hemos visto el uso del gradiente descendiente para un problema de regresión donde la función de
coste es el error cuadrático medio. El gradiente descendiente también puede usarse para
problemas de clasificación. En estos casos, las función de coste suele ser la entropía cruzada.
También podemos usar otras funciones de coste o incluso diseñar las nuestras.
La versión del gradiente descendiente que hemos visto es la más básica y fácil de entender. Hay
varias mejoras que se han ido realizando a lo largo de los años que ya veremos en otros artículos.
Si quieres profundizar puedes leer acerca del gradiente descendiente estocástico, momentum,
AdaGrad, RMSProp, Adam, etc. Algunas de estas mejoras hace que el elegir el ratio de
aprendizaje adecuado no sea tan relevante ya que lo van adaptando sobre la marcha.
Este es un caso muy frecuente. La mayoría de los problemas que queremos resolver tienen
atributos relevantes en escalas diferentes. Por ejemplo, si queremos estimar el valor de una
propiedad inmobiliaria, los atributos «número de dormitorios» y «metros cuadrados» estarán en
dos escalas muy diferentes.
Hay varias estrategias para escalar los datos. Las más comunes son:
Estandarizado de datos: transformación de los datos para que cada atributo tenga una
media de 0 y una desviación típica de 1
Escala mínimo máximo: después del escalado, cada atributo estará en el rango [0, 1]
Escala logarítmica: transformación de los datos aplicando el operador logaritmo
Con el método de los mínimos cuadrados obtenemos una solución exacta. Está matemáticamente
demostrado que la estimación de los coeficientes W es la que minimiza el error cuadrático medio.
Con el método del gradiente descendiente obtenemos una solución aproximada y no hay
garantías. Aunque normalmente encontramos una solución que está muy cerca del mínimo teórico
siempre que usamo un ratio de aprendizaje adecuado y un número suficiente de iteraciones.
Entonces, ¿por qué vamos a usar un método aproximado cuando podemos usar uno exacto? La
respuesta es que el método del gradiente descendiente tiene otras ventajas con respecto al
método de los mínimos cuadrados.
^ = (X T X)−1 X T y
W
Las operaciones de transponer, multiplicar e invertir matrices son atómicas. Es decir, las podemos
hacer o no, pero no hay forma de transponer un poco, o invertir una matriz un 20%.
El método del gradiente descendiente sí que permite optimizar «un poco». Así que podemos
usarlo para resolver problemas del tipo «tienes 2 minuto para estimar W«. Además, el gradiente
descendiente puede encontrar soluciones casi óptimas en mucho menos tiempo que el método de
los mínimos cuadrados para problemas con muchos datos. Cuando hablamos de muchos datos
nos referimos tanto al número de muestras como al número de atributos.
Resumen
En este post hemos hablamos del gradiente descendiente. El método del gradiente descendiente
es muy usado para entrenar redes neuronales y también en aprendizaje profundo (deep learning).
En particular, nos interesa utilizar el gradiente descendiente para estimar los parámetros W que
minimizan la función de coste. También hemos visto por qué es tan importante escalar los datos
antes de utilizar este método de optimización numérica. Por último, hemos vistos que para un
conjunto de datos muy amplio, el gradiente descendiente nos puede interesar más que el uso del
método de los mínimos cuadrados.
Recursos
[vídeo] donde explico cómo funciona el gradiente descendiente para resolver regresiones
lineales (en inglés)
Regularización Lasso L1, Ridge L2 y ElasticNet
Por Jose Martinez Heras
14/03/2019
J = MSE
Cuando usamos regularización, añadimos un término que penaliza la complejidad del modelo. En
el caso del MSE, tenemos:
J = MSE + α ⋅ C
C es la medida de complejidad del modelo. Dependiendo de cómo midamos la complejidad,
tendremos distintos tipos de regularización. El hiperparámetro α indica cómo de importante es
para nosotros que el modelo sea simple en relación a cómo de importante es su rendimiento.
Cuando usamos regularización minimizamos la complejidad del modelo a la vez que minimizamos
la función de coste. Esto resulta en modelos más simples que tienden a generalizar mejor. Lo
modelos que son excesivamente complejos tienden a sobreajustar. Es decir, a encontrar una
solución que funciona muy bien para los datos de entrenamiento pero muy mal para datos
nuevos. Nos interesan los modelos que además de aprender bien, también funcionen tengan un
buen rendimiento con datos nuevos.
N j=1
Para el caso del error cuadrático medio, este es el desarrollo completo para Lasso (L1):
M N
1 1
J= ∑(reali − estimadoi )2 + α ∑ ∣wi ∣
M i=1 N j=1
¿Cuándo es efectiva Lasso (L1)?
Lasso nos va a servir de ayuda cuando sospechemos que varios de los atributos de entrada
(features) sean irrelevantes. Al usar Lasso, estamos fomentando que la solución sea poco densa.
Es decir, favorecemos que algunos de los coeficientes acaben valiendo 0. Esto puede ser útil para
descubrir cuáles de los atributos de entrada son relevantes y, en general, para obtener un modelo
que generalice mejor. Lasso nos puede ayudar, en este sentido, a hacer la selección de atributos
de entrada. Lasso funciona mejor cuando los atributos no están muy correlados entre ellos.
Para el caso del error cuadrático medio, este es el desarrollo completo para Lasso (L1):
M N
1 1
J= ∑(reali − estimadoi )2 + α ∑ w2
2N j=1 i
M i=1
Ridge nos va a servir de ayuda cuando sospechemos que varios de los atributos de entrada
(features) estén correlados entre ellos. Ridge hace que los coeficientes acaben siendo más
pequeños. Esta disminución de los coeficientes minimiza el efecto de la correlación entre los
atributos de entrada y hace que el modelo generalice mejor. Ridge funciona mejor cuando la
mayoría de los atributos son relevantes.
C = r ⋅ Lasso + (1 − r) ⋅ Ridge
Si lo desarrollamos, para el caso del error cuadrático medio tenemos:
M N N
1 1 1
J= ∑(reali − estimadoi )2 + r ⋅ α ∑ ∣wi ∣ + (1 − r) ⋅ α ∑ w2
2N j=1 i
M i=1 N j=1
Usaremos ElasticNet cuando tengamos un gran número de atributos. Algunos de ellos serán
irrelevantes y otros estarán correlados entre ellos.
Resumen
En este artículo hemos explicado qué es la regularización y cómo podemos usarla para mejorar la
capacidad de generalización de nuestros modelos de machine learning. En general, la
regularización nos va a ayudar a reducir el sobreajuste de los modelos de aprendizaje automático.
Recursos
[vídeo] donde explico la regularización Lasso L1, Ridge L2 y ElasticNet (en inglés)
Lasso: para hacer regresión lineal usando regularización L1
LassoCV: para encontrar el mejor α para Lasso
Ridge: para hacer regresión lineal usando regularización L2
RidgeCV: para encontrar el mejor α para Ridge
ElasticNet: para hacer regresión lineal usando simultáneamente las regularizaciones L1 y
L2
ElasticNetCV: para encontrar los mejores α y r para ElasticNet
scikit-learn ofrece el hiperparámetro ‘penalty’ en muchos de sus modelos. Puedes usar ‘l1’ o
‘l2’ en ‘penalty’ para elegir la regularización que más te interese.
Mejora tu Inglés con estas frases elegidas con IA
Por Jose Martinez Heras
20/03/2019
En este artículo exploramos la posibilidad de usar Machine Learning para mejorar nuestro inglés.
La premisa es que si nos aprendemos las estructuras más comunes en inglés, mejoraremos
notablemente nuestra soltura con el inglés.
Podemos pedirle a spaCy que nos de la estructura para la frase «Learn English with artificial
intelligence at iartificial.net«. Este es el resultado que obtenemos:
at IN ADP prep
Este es el significado:
Es decir,
Para encontrar cuáles son las estructuras más comunes, vamos a utilizar n-grams en el análisis
sintáctico. Los n-grams son los distintos tipos de agrupamientos posibles, de n en n. En nuestro
caso, vamos a usar n=3.
Así por ejemplo, para nuestra frase «Learn English with artificial intelligence at iartificial.net»
tendremos el análisis sintáctico: VB_VERB_ROOT NNP_PROPN_dobj IN_ADP_prep
JJ_ADJ_amod NN_NOUN_pobj IN_ADP_prep ADD_X_pobj
Para encontrar las estructuras sintácticas más comunes en inglés, necesitamos muchos textos en
inglés. Los textos que vamos a usar para este análisis vienen del corpus brown de la librería
NLTK. Este corpus contiene textos en 15 categorías: ‘adventure’, ‘belles_lettres’, ‘editorial’, ‘fiction’,
‘government’, ‘hobbies’, ‘humor’, ‘learned’, ‘lore’, ‘mystery’, ‘news’, ‘religion’, ‘reviews’, ‘romance’,
‘science_fiction’.
Haremos el análisis con los textos de la categoría ‘news’ (noticias). Para que te hagas una idea,
estas son las tres primeras frases del corpus brown para la categoría news:
1. «The Fulton County Grand Jury said Friday an investigation of Atlanta’s recent primary
election produced « no evidence » that any irregularities took place .»
2. «The jury further said in term-end presentments that the City Executive Committee , which
had over-all charge of the election , « deserves the praise and thanks of the City of Atlanta »
for the manner in which the election was conducted .»
3. «The September-October term jury had been charged by Fulton Superior Court Judge
Durwood Pye to investigate reports of possible « irregularities » in the hard-fought primary
which was won by Mayor-nominate Ivan Allen Jr. .»
Las estructuras sintácticas más comunes en news brown corpus
El siguiente gráfico muestra el número de veces que aparecen los 3-grams sintácticos en la
sección de noticias inglesas del corpus brown de NLTK. En este gráfico sólo se muestran los top
20.
Como te habrás dado cuenta, las estructuras más comunes aparece muchas, pero que muchas
más veces que las que no son tan comunes. Sigue una ley potencial que es muy común en la
forma que usamos los lenguajes. Esto es mucho más evidente si en vez de visualizar los top 20,
visualizamos los top 200 n-grams.
Encontrando las mejores frases … usando palabras
comunes
Si nuestro objetivo es familiarizarnos con las estructuras sintácticas más comunes, podríamos
elegir al azar frases que las contuviensen. El problema de esta estrategia, es que correríamos el
riesgo de que usen palabras muy raras (poco frecuentes). Por eso, además de escoger frases que
tengan palabras más o menos conocidas. Sin entrar mucho en detalles, tengo en cuenta la media
de los logaritmos de la frecuencia de cada palabra en una frase. De esta forma obtenemos las
frases que tienen palabras conocidas y que tienen estructuras sintácticas comunes.
Resumen
En este artículo hemos obtenido un listado mínimo de frases que maximiza el número de frases
con estructuras sintácticas comunes. Las estructuras sintácticas las hemos obtenido con spaCy,
con técnicas de procesado del lenguaje natural. Al requerir que el vocabulario sea común y que las
frases sean cortas, nos hacemos la vida más fácil. Si te familiarizas con estas frases, su estructura
y su significado, tu nivel de inglés mejorará mucho … al menos estadísticamente hablando!
Recursos
Librerías de Python para Machine Learning
NLTK: Natural Language Tool Kit para el corpus en inglés
spaCy: para el análisis sintáctico de una frase con técnicas de procesado del lenguaje
natural
Redes Neuronales Generativas Adversarias (GANs)
Por Jose Martinez Heras
28/03/2019
Las Redes Neuronales Generativas Adversarias son una forma nueva de usar deep learning para
generar imágenes que parecen reales. También pueden generar otro tipo de datos tales como
música. En este artículo vamos a ver qué son los modelos generativos, cómo funcionan y algunos
ejemplos recientes.
Las Redes Neuronales Generativas Adversarias también se denominan GANs por sus siglas en
inglés (Generative Adversarial Networks). También lo he visto traducido al español como Redes
Antagónicas.
Los modelos generativos usan 2 redes neuronales profundas. Estas dos redes son adversarias, es
decir, «juegan» un juego de suma cero donde lo que una red gana, la otra pierde. Me explico. Voy
a explicarlo con el ejemplo de la generación de fotos. Imagínate que queremos generar fotos de
caras de personas.
Para entrenar esta arquitectura de redes neuronales necesitamos tener un conjunto de datos
reales. En el ejemplo de las caras de personas, deberemos tener muchas fotos de personas
reales. De esta forma, cuando le demos una foto real al discriminador, sabremos que la respuesta
correcta es «real». Y cuando le demos una foto creada por el generador, la respuesta correcta es
«falso».
Al principio, es muy fácil para el discriminador acertar cuando dice cuáles fotos son reales. Esto es
así porque al principio, las fotos creadas por la red neuronal generadora parecen aleatorias. Sin
embargo, a medida que el generador mejora, la tarea de la red neuronal discriminadora se vuelve
más difícil. Así pues, tanto el generador como el discriminador van mejorando simultáneamente.
El generador crea caras distintas. Las caras son distintas porque la entrada es distinta. Como
entrada utilizamos un vector aleatorio (que llamamos Z). Usando otro vector aleatorio, tendremos
otra cara … o lo que quiera que estemos generando.
Por ejemplo, la siguiente imagen, sacada de este trabajo, muestra cómo se generan, a partir de
bocetos, fotos de carreteras, de edificios y de bolsos. Además se genera un mapa a partir de la
imagen de satélite, se convierte una foto de día a de noche y se genera una foto en color a partir
de una en blanco y negro.
10 Years Challenge
Para los que habéis participado en el 10 years challenge, a lo mejor habéis ayudado con vuestras
fotos a mejorar este otro trabajo. En la siguiente imagen puedes ver cómo el modelos generativo
crea diferentes versiones de caras condicionadas a la edad que queramos.
Generación de imágenes a partir de texto
También es posible condicionar a las redes generativas adversarias para que generen imágenes a
partir de un texto. Así podremos escribir la descripción de una imágen y el generador creará una
imagen compatible con esa descripción. Puedes obtener más información aquí.
thispersondoesnotexist.com es una web creada por nvidia que crea caras en alta definición de
personas que no existen. Aquí tienes un ejemplo de 3 caras que he obtenido. Te animo a que lo
pruebes tú también.
Style GAN
Style GAN permite cambiar estilos tales como la pose, color de pelo, texturas, etc. Pueden elegir
cómo lo cambian porque usan una forma muy novedosa de controlar el ruido que usa el generador
como entrada. Puedes mirar cómo funciona en detalle en este artículo.
Nvidia ha desarrollado una técnica nueva de compresión de vídeo que permite ahorrar ancho de
banda al mismo tiempo que mejora la calidad de imagen en videoconferencias.
Funciona tan bien porque sólo envía alguna que otra foto de la persona que aparece en la imagen.
Los cambios faciales al hablar, sonreir, moverse, etc. no se transmiten como imágenes (frames)
sino que se transmiten como puntos de referencia (landmarks) de la cara.
Cuando reciben estos puntos de referencia, una red neuronal generativa adversaria los aplica a la
imagen de la foto original. El resultado es muy convincente, mejorando la calidad de las
videoconferencias y reduciendo los requisitos de ancho de banda.
Los modelos generativos son muy nuevos en el mundo del aprendizaje profundo. Sin embargo, la
velocidad de la investigación en este campo está siendo asombrosa y sus aplicaciones son
fascinantes.
Empresas con experiencia en Inteligencia Artificial
Por Jose Martinez Heras
03/04/2019
En IArtificial.net queremos ayudar a tu empresa. Nos gustaría daros más visibilidad para que los
clientes os encuentren más fácilmente. Para ello, sólo tenemos que enseñarle al mundo lo buenos
que sois.
Para demostrarlo, lo mejor es poner algunos ejemplos de proyectos y actividades recientes con un
impacto positivo en vuestros clientes. Si te fijas, os estamos ayudando a que le enseñéis al mundo
qué clase de impacto obtienen vuestros clientes. Estamos convencidos de que si construimos una
lista de empresas que ofrecen un impacto real con Inteligencia Artificial, no van a faltaros los
clientes.
En este artículo hablamos de las máquinas de de vectores de soporte. También son conocidas con
el acrónimo SVM por sus siglas en inglés (Support Vector Machines). Se pueden usar tanto para
regresión como para clasificación.
Conceptualmente, los SVM son más fáciles de explicar para problemas de clasificación. En este
artículo vamos a dar una explicación intuitiva. La máquinas de vectores de soporte surgen para
encontrar la manera óptima de clasificar.
Datos de ejemplo
Vamos a usar estos datos de ejemplo. Suponemos que los puntos azules corresponden a la clase
«azul» y los puntos rojos a la clase «rojo». Ahora intentaremos dibujar una línea que separe los
puntos azules de los rojos. De esta forma, cuando haya un punto nuevo, podemos decir qué color
va a tener, dependiendo del lado de la línea en el que se encuentre.
Ejemplo I
En la siguiente figura, podemos decir que lo que esté a la izquierda de la línea, es azul y lo que
esté a la derecha, es rojo. Sin embargo, el punto nuevo abajo a la izquierda es clasificado como
azul. Intuitivamente, está mal clasificar este punto nuevo como azul.
Ejemplo II
La siguiente figura muestra otra forma equivocada de clasificar estos puntos. Podemos decir que
cualquier punto que esté por lo alto de la línea será azul. Cualquiera que esté por debajo será rojo.
Sin embargo, el nuevo punto a la derecha, ha sido «incorrectamente» clasificado como azul.
Intuitivamente, diríamos que debería haber sido clasificado como rojo.
Se llama «máquina» en español por la parte de «machine» learning. Los vectores de soporte son
los puntos que definen el margen máximo de separación del hiperplano que separa las clases. Se
llaman vectores, en lugar de puntos, porque estos «puntos» tienen tantos elementos como
dimensiones tenga nuestro espacio de entrada. Es decir, estos puntos multi-dimensionales se
representan con con vector de n dimensiones.
Regularización
Es bastante frecuente que los datos tenga ruido, que no estén etiquetados perfectamente, o que el
problema sea tan difícil que para unos pocos puntos, sea muy complicado clasificarlos
correctamente. Para estos casos, podemos decirle al SVM (Support Vector Machine), que
preferimos que generalice bien para la mayoría de los casos, aunque algunos pocos casos del
conjunto de entrenamiento no estén perfectamente clasificados. Recuerda que lo que
normalmente vamos buscando es la construcción de modelos de aprendizaje automático que
generalicen bien. Para controlar la cantidad de regularización, podemos usar el hiper-parámetro C,
que hace las veces del inverso del alfa que vimos en las regularizaciones Ridge, Lasso y
ElasticNet.
El truco del kernel consiste en inventar una dimensión nueva en la que podamos encontrar un
hiperplano para separar las clases. En la siguiente figura vemos cómo al añadir una dimensión
nueva, podemos separar fácilmente las dos clases con una superficie de decisión.
Actualmente, las redes neuronales profundas tienen una mayor capacidad de aprendizaje y
generalización que los SVM.
Resumen
Las Máquinas de Vectores de Soporte (Support Vector Machines) permiten encontrar la forma
óptima de clasificar entre varias clases. La clasificación óptima se realiza maximizando el margen
de separación entre las clases. Los vectores que definen el borde de esta separación son los
vectores de soporte. En el caso de que las clases no sean linealmente separables, podemos usar
el truco del kernel para añadir una dimensión nueva donde sí lo sean.
Recursos y Créditos
[vídeo] donde explico cómo funciona las máquinas de vectores de soporte (en inglés)
Tutorial de Máquinas de Vectores de Soporte en scikit-learn
La figura del kernel: http://blog.csdn.net/sinat_35257860/article/details/58226823
Regresión Logística para Clasificación
Por Jose Martinez Heras
23/04/2019
La Regresión Logística es una técnica de aprendizaje automático para clasificación. Es una red
neuronal en miniatura. De hecho, la regresión logística, se trata de una red neuronal con
exactamente una neurona.
Los valores de x corresponden los distintos atributos de nuestro problema. Por ejemplo, si
queremos saber si un correo electrónico es deseado o no deseado (spam), los valores
de x podrían corresponder con cuántas veces aparece cada palabra en un texto. La predicción y
sería la probabilidad de que el correo sea no deseado.
Así que todas las entradas se combinan con una línea con los coeficientes w. Y luego se aplica la
función logística (también llamada sigmoide) al resultado.
Función logística
1
σ(z) =
1 + e−z
Curiosidades
La parte de «regresión» en regresión logística podría dar la impresión de que se trata de una
técnica de regresión. Sin embargo, recibe este nombre por motivos históricos. Al principio de la
neurona, se hace un combinación lineal que se parece mucho a una regresión lineal. Y luego se
aplica la función logística. Así que así surgió el nombre, regresión logística.
Cuando estuvimos analizando las noticias de portada de menéame, usamos regresión logística
para predecir la probabilidad de que una noticia tuviese muchos meneos o muchas visitas. Puedes
leer el artículo entero aquí.
Resumen
La regresión logística es una técnica de aprendizaje automático relativamente sencilla. Sus
resultados son interpretables y es muy usada en industria. Funciona muy bien cuando hay
muchísimos datos y las interrelaciones entre ellos no son muy complejas. Admiten el uso de
regularización para generalizar mejor.
Recursos
Instrucciones de cómo usar la Regresión Logística en Python
[vídeo] donde explico cómo funciona la regresión logística (en inglés)
La implementación de LogisticRegression en la librería de python scikit-learn
¿Cómo usar Regresión Logística en Python?
Por Jose Martinez Heras
01/05/2019
La regresión logística es una técnica de aprendizaje supervisado para clasificación. Es muy usada
en muchas industrias debido a su escalabilidad y explicabilidad.
En este artículo vamos a ver cómo entrenar y usar un modelo de regresión logística. Si quieres
repasar la teoría de esta técnica de machine learning, puedes consultar este artículo.
Instrucciones rápidas
¿Cómo usar Regresión Logística en Python con scikit-learn?
import numpy as np
Usa el modelo entrenado para obtener las predicciones con datos nuevos
prediccion = regresion_logistica.predict(X_nuevo)
probabilidades_prediccion = regresion_logistica.predict_proba(X_nuevo)
Horas 0.50 0.75 1.00 1.25 1.50 1.75 1.75 2.00 2.25 2.50
Aprueba 0 0 0 0 0 0 1 0 1 0
Horas 2.75 3.00 3.25 3.50 4.00 4.25 4.50 4.75 5.00 5.50
Aprueba 1 0 1 0 1 1 1 1 1 1
Haciendo predicciones
Vamos a ver cómo podemos hacer predicciones una vez que el modelo está entrenado. Primero
haremos predicciones absolutas y luego predicciones relativas. Vamos a ver qué pasa si
estudiamos 1, 2, 3, 4, 5 ó 6 horas.
# Paso 6: Usa el modelo entrenado para obtener las predicciones con datos
nuevos
prediccion = regresion_logistica.predict(X_nuevo)
print(prediccion)
# produce el resultado: [0 0 1 1 1 1]
Como podemos ver, en el caso que el estudiemos 1 ó 2 horas, lo más probable es que
suspendamos para este examen. Si estudiamos 3 o más horas, lo más probable es aprobar.
Vamos a ver ahora cómo podemos calcular las probabilidades en estos casos.
# produce el resultado:
[0.3198985 0.46431705 0.61497862 0.74640921 0.84433138 0.90904908]
Recursos
Teoría sobre la regresión logística en artículos anteriores
LogisticRegression, la implementación en scikit-learn
La librería NumPy para manipulación numérica
El ejemplo que hemos visto (sin el código), viene de la wikipedia
Árboles de Decisión con ejemplos en Python
Por Jose Martinez Heras
07/05/2019
Los árboles de decisión son una técnica de aprendizaje automático supervisado muy utilizada en
muchos negocios. Como su nombre indica, esta técnica de machine learning toma una serie de
decisiones en forma de árbol. Los nodos intermedios (las ramas) representan soluciones. Los
nodos finales (las hojas) nos dan la predicción que vamos buscando.
Los árboles de decisión pueden usarse para resolver problemas tanto de clasificación como de
regresión. Veamos cómo se usan en cada caso con ejemplos.
Para explicar cómo funcionan los árboles de decisión con problemas de clasificación vamos a usar
el conjunto de datos Iris. El problema consiste en clasificar correctamente la variedad de la flor iris
a partir del ancho y largo de los pétalos y sépalos. Hay tres variedades de flor iris: setosa,
versicolor y virginica.
50 iris setosa
50 iris versicolor
50 iris virginica
cada color representa a una clase. El marrón para setosa, el verde para versicolor y el lila
para virginica.
el color es más intenso cuanto más seguros estamos que la clasificación es correcta
los nodos blancos, por tanto, evidencia la falta de certeza
Hay dos tipos de nodo:
Nodos de decisión: tienen una condición al principio y tienen más nodos debajo de
ellos
Nodos de predicción: no tienen ninguna condición ni nodos debajo de ellos. También
se denominan «nodos hijo»
La información de cada nodo es la siguiente:
Interpretación
La interpretación del árbol de este árbol de decisión sería: si la longitud del pétalo es menos de
2.45 centímetros, entonces la flor iris pertenece a la variedad setosa. Si por el contrario, la longitud
del pétalo es mayor que 2.45 centímetros, habría que mirar al ancho del pétalo. Cuando el ancho
del pétalo es menor o igual a 1.75 centímetros, pertenece a la variedad versicolor con un 91% de
probabilidad. Si no, parece que sería virginica con un 98% de probabilidad.
Gini es una medida de impureza. Cuando Gini vale 0, significa que ese nodo es totalmente puro.
La impureza se refiere a cómo de mezcladas están las clases en cada nodo. Para calcular la
impureza gini, usamos la siguiente fórmula:
n
gini = 1 − ∑ p2c
k=1
Por ejemplo, para el caso del nodo donde la clasificación es versicolor, el cálculo sería el
siguiente:
0 2 49 2 5 2
n
giniversicolor = 1 − ∑ p2c = 1 − ( ) − ( ) − ( ) = 0.168
54 54 54
k=1
Los árboles de decisión se construyen usando un algoritmo voraz que optimiza la siguiente función
de coste:
mizquierdo mderecho
J(a, la ) = Giniizquierdo +
Giniderecho
m m
a es la abreviatura de atributo (también llamado característica o feature)
la significa el límite del atributo
m se refiere al número de muestras
Por ejemplo, al comprobar si la longitud del pétalo es menor o igual a 2.45 centímetros, tenemos:
El algoritmo voraz elige qué atributos y qué límites son los mejores para tomar las decisiones. Al
usar un algoritmo voraz, no tenemos la garantía de que este sea el mejor árbol posible. Sin
embargo, en la práctica, obtenemos un árbol bastante bueno mucho más rápidamente que si
necesitáramos el «mejor árbol posible».
Para explicar cómo funcionan los árboles de decisión para problemas de regresión vamos a usar
los datos que se presentan en la siguiente gráfica. Para generarlos he usado la siguiente fórmula
en el intervalo [-5, 5]:
y = 0.1x2 + 0.2(Ruido Gaussiano)
En el caso de regresión, en lugar de usar Gini como medida de impureza, usamos MSE, el error
cuadrático medio. Para este problema, si usamos un árbol de decisión de profundidad 2,
obtenemos el siguiente árbol.
Interpretación
La interpretación del árbol de este árbol de decisión sería: si el valor de x es menor que -4.25,
predice 2.2777; si está en el intervalo (-4.25, -3.75] predict 1.5774); si está en el intervalo (-3.75,
3.05] predict 0.3566 y si es mayor que 3.05 predice 1.6273.
Los árboles de decisión para regresión también se construyen usando un algoritmo voraz. Para
regresión, la función de coste es la siguiente:
mizquierdo m
J(a, la ) = MSEizquierdo + derecho MSEderecho
m m
a es la abreviatura de atributo (también llamado característica o feature)
la significa el límite del atributo
m se refiere al número de muestras
MSE es el error cuadrático medio por sus siglas en inglés (Mean Squared Error)
Los árboles de decisión de scikit-learn no están regularizados por defecto. Esto significa que para
obtener el menor error posible, pueden crear tantos nodos como necesiten. Esto puede resultar en
un modelo muy complejo que funcione muy bien en el conjunto de entrenamiento pero muy mal
con datos nuevos.
La regularización consiste en limitar de alguna forma las capacidades del modelo para obtener un
modelo de aprendizaje automático que sea más simple y generalice mejor.
En scikit-learn podemos usar varios hiper-parámetros para configurar cómo regularizamos los
árboles de decisión. Veamos los más usados:
max_depth: la profundidad máxima del árbol. En los ejemplos anteriores hemos usado
max_depth = 2
min_samples_split: número mínimo de muestras necesarias antes de dividir este nodo.
También se puede expresar en porcentaje.
min_samples_leaf: número mínimo de muestras que debe haber en un nodo final (hoja).
También se puede expresar en porcentaje.
max_leaf_nodes: número máximo de nodos finales
El siguiente gráfico muestra los datos (en azul) y la predicción (en rojo) de dos árboles. El de la
izquierda no está regularizado. El de la derecha está regularizado. La regularización, en este caso,
consiste en que los nodos finales (las hojas del árbol) deben cubrir al menos un 5% de las
muestras. Como puedes comprobar visualmente, el árbol regularizado va a generalizar mejor y no
sufre de sobreajuste.
La principal ventaja de los árboles de decisión, como modelo no-paramétrico, es que pueden
aprender cualquier cosa. En el siguiente gráfico vemos cómo aprende sin problemas una parábola
con ruido (a la izquierda) y una función sinusoidal con ruido (a la derecha).
Por otra parte, al ser un modelo no-paramétrico, no sabe qué es lo que se supone que debe pasar
fuera del rango de entrenamiento. Al contrario que en el caso de lo modelos paramétricos, no
«sabe» extrapolar. En el siguiente gráfico vemos que aunque parece que es capaz de modelar
una función parabólica o una sinusoidal, en realidad, no «sabe» lo que está haciendo.
En realidad este problema no es tan malo como pudiera parecer en este gráfico. Normalmente, los
problemas para los que usamos aprendizaje automático, tienen muchos atributos y habrá muchos
de ellos para los que sí tendremos datos en el rango de entrenamiento. En cualquier caso,
siempre conviene asegurarnos que la distribución de los datos que queremos predecir es similar a
la distribución de datos que usamos para entrenar el modelo.
Según estos resultados, no necesitamos los datos de los sépalos. El ancho y el largo de los
pétalos son suficientes para clasificar las flores Iris en su variedad correcta.
Resumen
Los árboles de decisión son una técnica de aprendizaje automático muy utilizada. Su ventajas
principales son:
son fáciles de entender y explicar a personas que todavía no están familiarizadas con
técnicas de Inteligencia Artificial
se adaptan a cualquier tipo de datos
descubren cuáles son los atributos relevantes
También tienen sus desventajas:
Recursos
En este [vídeo] explico cómo funcionan los árboles de decisión (en inglés)
Árbol de Decisión para Clasificación en scikit-learn: DecisionTreeClassifier
Árbol de Decisión para Regressión en scikit-learn: DecisionTreeRegressor
Datos Fundamentales de Empresas Cotizadas en Bolsa
Por Jose Martinez Heras
19/05/2019
SimFin es una plataforma que proporciona datos financieros fundamentales y precios de acciones
de empresas cotizadas en mercados estadounidenses (NYSE, NASDAQ, etc.). En el momento de
escribir este artículo, SimFin ofrece datos de 2,452 empresas diferentes.
En este artículo vamos a hablar de SimFin, los datos y servicios que ofrece, cómo los puedes
descargarlo y cómo usar python para transformar los datos. Para este análisis, usaremos los datos
históricos que son gratuitos.
Buscador de acciones: permite encontrar fácilmente qué empresas cumplen con los
criterios de búsqueda que te interesen. Por ejemplo, puedes buscar qué empresas ofrecen
un dividendo mayor del 3% y que además hayan incrementado sus ventas en los últimos
años. Ofrece la posibilidad de exportar estos datos en un formato compatible con excel.
Perfiles detallados de compañías: si te interesa saber más acerca de una compañía,
puedes leer su perfil detallado. Ofrece la posibilidad de exportar estos datos en un formato
compatible con excel.
Transparencia de datos: si te interesa, puedes ver las fórmulas de cómo se calculan los
ratios y valores contables que no procede directamente de los informes financieros.
SimFin ofrece dos formas de acceder a sus datos financieros: en tiempo real o como descarga de
datos históricos
Si accedemos a los datos financieros de SimFin en tiempo real, podemos saber las últimas
novedades de las compañías que nos interesen. Por ejemplo, el precio en tiempo real y los
valores fundamentales más recientes. El acceso a estos datos se hace a través de una API
(Application Programming Interface), que en español vendría a decir: Interface de Programación
de Aplicaciones. Esta API nos va a permitir acceder tanto a los datos como al buscador de
acciones.
Para usar este interfaz en tiempo real de acceso a datos financieros necesitamos ser usuarios de
SimFin+. Es un servicio de suscripción (de pago). Sin embargo, para probar el interfaz podemos
usar la API 2,000 veces al día gratuitamente.
Los datos históricos fundamentales son ¡gratis! SimFin los ofrece gratis para que podamos
experimentar con ellos y podamos evaluar si nuestras ideas funcionan. Para acceder a estos
datos hay que registrarse en su web. Por lo demás es bastante fácil. Sólo tenemos que elegir qué
datos queremos y recibiremos un fichero comprimido como descarga directa.
En el siguiente ejemplo vemos cómo he seleccionado tantos los datos fundamentales (incluyendo
ratios) como los precios. El formato que he elegido, para este ejemplo, ha sido el del uso de los
ratios calculados al final del período, usando datos fundamentales anuales, en formato estrecho y
separados por comas.
Lectura de datos fundamentales de SimFin en python
1. # importamos las librerías
2. import pandas as pd
3.
4. # lectura del fichero
5. simfin = pd.read_csv('output-mixeddet-ttm-gaps-period-comma-narrow.zip')
6.
7. # inspeccionamos el fichero
8. simfin.head()
Ticker: el símbolo con el que cotizan en bolsa. Por ejemplo, en la bolsa americana, Apple
cotiza con el símbolo AAPL
SimFin ID: código de identificación interno a SimFin
Company Industry Classification Code: qué tipo de industria es de acuerdo con el
estándar de clasificación industrial americano
Indicator Name: el nombre del indicador. Por ejemplo, el número de acciones disponible,
retorno de los activos, etc.
date: la fecha
Indicator Value: el valor numérico correspondiente al indicador de esta fila
A lo mejor no necesitamos el identificador de SimFin (SimFin ID). Así que lo podemos eliminar.
También podemos renombrar las otras columnas para que sea más fácil trabajar con ellas y
convertir la fecha a representación de fecha en pandas.
Como te habrás dado cuenta, cada fila corresponde con un indicador para una empresa.
Dependiendo del tipo de aplicaciones que estemos desarrollando, puede ser más práctico
reestructurar los datos. Por ejemplo, podríamos reestructurar estos datos para que cada columna
correspondiese a un indicador diferente. Vamos a usar las tablas pivot en pandas para
conseguirlo.
Si te decides a hacer algún análisis con los datos fundamentales ofrecidos por SimFin, puedes
contárnoslo en los comentarios.
Actualización 29.03.2020
simfin ha cambiando el formato de los datos, por lo que los ejemplos seguramente dejen de
funcionar con el formato nuevo.
además ha empezado a cobrar por los datos más recientes. Los datos históricos antiguos
(con un retraso de 12 meses) son gratuitos. Los puedes descargar en este enlace.
Aguathon: mi solución al primer Hackathon del Agua
Por Jose Martinez Heras
20/05/2019
En este artículo explico mi solución al Aguathon: el primer Hackathon del Agua, organizado por
ITAINNOVA.
Objetivo
En concreto el modelo ganador será el que realice predicciones del nivel del río en
Zaragoza con mayor precisión. Las predicciones que debe devolver el modelo son a
24, 48 y 72 horas de antelación.
90% de peso: la media del error cuadrático medio de las predicciones a 24h, 48h y 72h
10% de peso: la novedad de los algoritmos entregados comparado con las técnicas del
estado del arte y su complejidad
Datos proporcionados
Los datos comprenden desde la fecha-hora: 2008-01-01 00:00:00 a 2018-12-07 23:00:00. En total
el archivo contiene 95857 filas. Las columnas son las siguientes:
time: fecha y hora de la medición (horas exactas, minutos y segundos igual cero).
ALAGON_NR: Nivel del río Ebro al paso por Alagón. Unidades: metros.
GRISEN_NR: Nivel del río Jalón al paso por Grisén. Unidades: metros.
NOVILLAS_NR: Nivel del río Ebro al paso por Novillas. Unidades: metros.
TAUSTE_NR: Nivel del río Arba al paso por Tauste. Unidades: metros.
TUDELA_NR: Nivel del río Ebro al paso por Tudela. Unidades: metros.
ZGZ_NR: Nivel del río Ebro al paso por Zaragoza. Unidades: metros.
RIESGO: Variable booleana representando si hubo riesgo de inundación en Zaragoza o no.
Sin unidades, es un valor lógico: True/False.
pred_24h: Nivel del río Ebro al paso por Zaragoza 24 horas después del tiempo
especificado en la variable time. Unidades: metros.
pred_48h: Nivel del río Ebro al paso por Zaragoza 48 horas después del tiempo
especificado en la variable time. Unidades: metros.
pred_72h: Nivel del río Ebro al paso por Zaragoza 72 horas después del tiempo
especificado en la variable time. Unidades: metros.
Para que os hagáis una idea, así es la forma que tienen los datos (puedes ver más información
aquí):
¿Quién está detrás del Aguathon?
No he usado todas las filas que había disponibles. Como el modelo sólo se evalúa en las filas
donde hay riesgo, sólo he usado esas filas. Además, he incluido hasta 16 filas anteriores
(correspondientes a 16 horas antes de cada “bloque de riesgo”) porque las necesito para calcular
las características.
Cálculo de todas las interacciones polinómicas de grado 2 entre los atributos originales y las
características relativas a la cantidad de agua. Sin embargo no considero cada elemento al
cuadrado.
Para todas las características calculadas anteriormente F, calculamos las diferencias a diferentes
intervalos: F(t) – F(t-1), F(t) – F(t-2), F(t) – F(t-4), F(t) – F(t-8), F(t) – F(t-16)
Para todas las características calculadas hasta ahora, además de calculan en ventanas
deslizantes de tamaño 2, 4, 8, 16 las siguientes características:
La única característica de fecha que he incluido es el día del año de cada muestra
Datos externos
La organización del hackathon permite usar datos externos. Al mismo tiempo recomienda que los
datos externos que se usen «no sean dependientes de un instante de tiempo específico». En su
lugar, recomiendan datos del tipo «media de las precipitaciones en la primera quincena de Abril en
los últimos 10 años, tiempo máximo sin precipitaciones en otoño en los últimos 50 años,
distancias, …»
Con el tipo de algoritmos de aprendizaje automático que tengo pensado utilizar, estos datos
estadísticos no serían muy relevantes porque serían constantes para cada muestra. Como estos
algoritmos pueden también aprender estos sesgos, no necesitamos este tipo de información. Así
que no he usado ningún tipo de dato externo.
Para usar este modelo necesitamos sumarle a las predicciones, el nivel actual del río Ebro a su
paso por Zaragoza. Por ejemplo, para la predicción a 24 horas, le sumamos el nivel del río Ebro a
su paso por Zaragoza actualmente más la predicción de cuánto va a subir (o bajar) el nivel en las
siguientes 24 horas.
La ventaja de usar estos dos modelos es que son complementarios. La características (features)
que son importantes para un modelo no lo son tanto para el otro, y viceversa. Esto hace que los
errores de los modelos no estén correlados y que al combinarlos sus errores se compensen,
dando lugar a resultados mejores. La siguiente tabla pone en evidencia qué características son
importantes para cada modelo y permite comprobar cómo se complementan.
Importancia de las características (features) para cada uno de los 2 modelos [10 atributos
más importantes]
Predicción del Nivel del Ebro en Predicción del cambio en el Nivel del Ebro en
Zaragoza Zaragoza
Quería utilizar alguna técnica que usara “ensembles”. La ventaja del uso de ensembles es que
mejoran la generalización. La generalización es la capacidad que tienen los modelos de machine
learning de obtener buenas predicciones con datos nuevos.
En muchas competiciones de machine learning, los bosques aleatorios (random forests) son la
elección por defecto. Es un ensemble de varios árboles de decisión que generaliza bastante bien.
He usado este conjunto de validación para ir viendo cómo mejoraba el rendimiento a medida que
iba añadiendo más características y también para ver qué otras características que había
pensando no añadían ningún valor predictivo al modelo.
Resultados de Evaluación
A continuación, muestro los resultados de evaluar los dos modelos. También podemos apreciar
cómo los resultados mejoran al combinar los dos modelos.
El modelo final consiste en la media aritmética de los dos modelos entrenados con todos los datos
disponibles (tanto los que he usado para entrenamiento como para validación).
El modelo sustituto
Nota: la única razón de usar profundidad 3 en el modelo sustituto es porque queda mejor en la
documentación. Un árbol de decisión sustituto más profundo daría mejores resultados y seguiría
siendo explicable para pocas profundidades. Podéis hacer click en el árbol para obtener una
imagen ampliada.
El árbol de decisión sustituto es muy simple y fácil de entender. Vamos a comparar el rendimiento
en el conjunto de validación de combinar los dos modelos y su modelo sustituto.
Como era de esperar, el rendimiento del modelo sustituto de caja blanca es peor. Aun así, su
rendimiento es sorprendentemente bueno si tenemos en cuenta su simplicidad. Si queremos
mejorar el rendimiento del modelo sustituto conservando la explicabilidad, podríamos aumentar su
profundidad.
A continuación vemos las predicciones del modelo sustituto en el conjunto de validación para
predicción a 24h, 48h y 72h.
Recomendaciones para mejorar la predicción del nivel del río
Ebro a su paso por Zaragoza
Uso de datos del nivel del agua en otras ciudades
Como podéis ver en el modelo sustituto de caja blanca, el nivel del Ebro a su paso por Tudela es
lo que más influencia tiene en el modelo. Esto funciona bastante bien para las predicciones a 24h
y 48h, pero no es suficiente para predicciones a 72h.
Sin ser un entendido en hidrología, me da la impresión de que el agua que hay en Tudela llega a
Zaragoza por el Ebro en menos de 2 días … y que por eso es tan difícil predecir a 3 días. Si
tuviésemos acceso al nivel del río en otros puntos del Ebro anteriores a Tudela, quizás las
predicciones serían mejores.
Recomendación 1: añadir nivel del Ebro y afluentes de Ebro en otros lugares anteriores a Tudela
Creo que el uso de datos meteorológicos (lluvia sobre todo) en distintos puntos geográficos
ayudaría a mejorar la predicción.
Una posibilidad sería usar los datos abiertos de la Agencia Estatal de Meteorología (AEMET)
disponibles como datos abiertos meteorológicos. La resolución de estos datos es diaria. Si se
pudiese establecer alguna colaboración con la AEMET, quizá se podría usar los datos por horas
Me gustaría dar las gracias al equipo de ITAINNOVA por la organización de este primer Hackathon
del Agua tan interesante.
Ensembles: voting, bagging, boosting, stacking
Por Jose Martinez Heras
31/05/2019
La ventaja que obtenemos al combinar modelos diferentes es que como cada modelo funciona de
forma diferente, sus errores tienden a compensarse. Esto resulta en un mejor error de
generalización.
Hay otra forma de combinar las votaciones. Cuando los modelos de machine learning dan una
probabilidad, podemos usar el «voto suave» (soft-voting). En el voto suave, se le da más
importancia a los resultados en los que algún modelo esté muy seguro. Es decir, cuando la
predicción está muy cercana a la probabilidad 0 ó a 1, se le da más peso a la predicción de ese
modelo.
Bagging
Cuando usamos bagging, también combinamos varios modelos de machine learning. A diferencia
del voto por mayoría, la forma de conseguir que los errores se compensen entre sí, es que cada
modelo se entrena con subconjuntos del conjunto de entrenamiento. Estos subconjuntos se
forman eligiendo muestras aleatoriamente (con repetición) del conjunto de entrenamiento.
Los resultados se combinan, para problemas de clasificación, igual que hemos visto en la votación
por mayoría, con el voto suave para los modelos que den probabilidades. Para problemas de
regresión, normalmente se utiliza la media aritmética.
Los bosques aleatorios (random forests), no son ni más ni menos, que un ensemble de árboles de
decisión combinados con bagging. Aunque bagging se puede usar con cualquier modelo, la opción
de usarlo con árboles de decisión es muy popular por motivos de rendimiento. Normalmente, es
muy rápido construir un árbol de decisión.
Boosting
En el boosting, cada modelo intenta arreglar los errores de los modelos anteriores. Por ejemplo,
en el caso de clasificación, el primer modelo tratará de aprender la relación entre los atributos de
entrada y el resultado. Seguramente cometerá algunos errores. Así que el segundo modelo
intentará reducir estos errores. Esto se consigue dándole más peso a las muestras mal
clasificadas y menos peso a las muestras bien clasificadas. Para problemas de regresión, las
predicciones con un mayor error cuadrático medio tendrán más peso para el siguiente modelo.
Hay muchas implementaciones de ensembles que usan boosting. El primero fue el AdaBoost. Los
más usados actualmente son xgboost, CatBoost y LightGBM.
Resumen de Ensembles
Los ensembles son estrategias de combinación de modelos de machine learning para mejorar su
generalización. Hemos visto los cuatro tipos de ensembles más usados: votación por mayoría,
bagging, boosting y stacking.
Recursos para Ensembles
[vídeo] donde explico voting y bagging aplicado y su aplicación a bosques aleatorios
Ensembles en scikit-learn incluyendo votación por mayoría, AdaBoost, Bagging genérico,
Bosques Aleatorios, etc.
xgboost: eXtreme Gradient Boosting
CatBoost: Yandex CatBoost
LightGBM: Light Gradient Boosting Machine
Random Forest (Bosque Aleatorio): combinando árboles
Por Jose Martinez Heras
10/06/2019
Un Random Forest (Bosque Aleatorio), es una técnica de aprendizaje automático muy popular. Los
Random Forests tienen una capacidad de generalización muy alta para muchos problemas.
Para problemas de regresión, la forma más habitual de combinar los resultados de los árboles de
decisión, es tomando su media aritmética.
Predicción (en rojo) de los 100 árboles de decisión de este bosque aleatorio. En negro puedes ver
la media aritmética.
Por ejemplo, imagínate que en vez de querer predecir un resultado, queremos predecir el rango de
valores probables en el futuro. Podemos obtener los valores mínimo y máximo de cada predicción
para definir el intervalo más probable.
Predicción del rango más probable (mínimo y máximo en rojo) y la media aritmética de las
predicciones de los 100 árboles en negro. El rango se corresponde con la predicción máxima y
mínima para cada muestra.
Dato que un random forest es un conjunto de árboles de decisión, y los árboles son modelos no-
paramétricos, los random forests tienen las mismas ventajas y desventajas de los modelos no-
paramétricos:
Recursos
En este [vídeo] explico cómo funcionan los árboles de decisión, bagging y los random
forests (en inglés)
Implementación de Random Forest en scikit-learn para clasificación y regresión:
RandomForestClassifier y RandomForestRegressor
Ventajas y desventajas de los árboles de decisión como modelos no-paramétricos
Los modelos generativos, también llamados GANs (Generative Adversarial Networks), permiten la
creación de datos (e.g. imágenes) que no existen. En un artículo anterior vimos como los modelos
generativos se habían utilizado para generar fotos de habitaciones de hoteles, caras humanas e
incluso música.
El último avance en la generación de caras nos viene de la mano de ingenieros de Samsung (en
Moscú) y del Instituto de Ciencia y Tecnología de Skolkovo.
Su trabajo es muy novedoso porque permite generar diferentes poses de la cara que queramos a
partir de muy pocas imágenes, incluso a partir de sólo una imagen. Sin embargo, han necesitado
una cantidad ingente de datos para entrenarlo de forma que sea tan genérico.
En este trabajo, primero detectan los puntos de referencia de la cara, tales como la nariz, ojos,
boca, cejas y perímetro de la cara. Estos puntos de referencia son los que van a permitir cambiar
la pose de la cara que queramos. El modelo generativo está condicionado a estos punto de
referencia.
Aunque el modelo generativo se haya entrenado con vídeos y con fotos, también funciona con
imágenes. En particular, a mi me ha gustado cómo le han dado vida a la Mona Lisa de Leonardo
da Vinci.
La Agencia Espacial Europea ha creado una competición de machine learning para predecir el
riesgo de colisión entre basura espacial y satélites de observación de la Tierra. La competición
empieza oficialmente el 16 de Octubre. A partir de ese momento será posible descargar los datos
y enviar soluciones. La competición finaliza el 16 de Diciembre de 2019.
Basura Espacial
El espacio no está tan vacío como solía estar. Más de 34.000 elementos de desechos espaciales
de más de 10 cm orbitan nuestro planeta. La Red de Vigilancia Espacial de Estados Unidos
mantiene un catálogo de unos 22.300 de estos objetos y sus trayectorias y los monitorea con
ayuda de telescopios y radares.
En órbitas con mucho tráfico, la prevención activa de colisiones se ha convertido en una tarea
rutinaria en las operaciones espaciales. Los datos de vigilancia espacial revelan riesgos
potenciales de que un satélite colisione con otro objeto espacial a varios kilómetros por segundo,
ya sea con otro satélite o con basura espacial.
Típicamente, la serie temporal de CDMs de cada posible colisión cubre una semana. En media
tiene unos 3 CDMs por día. Para cada posible colisión, el último CDM, incluyendo el riesgo
calculado, es la información más exacta que se tiene sobre la posible colisión entre los dos objetos
en cuestión. In la mayoría de los casos, la Oficina de Basura Espacial alertará a los equipos de
control 2 días antes de la colisión potencial para empezar a pensar en hacer maniobras que eviten
la colisión. La decisión final sobre la maniobra se hará típicamente 1 día antes de la posible
colisión.
En esta competición de machine learning, se pide construir un modelo que use la historia de los
CDM hasta 2 días antes de la posible colisión y se prediga cuál será el riesgo final (el riego final es
el riesgo que aparece en el último CDM antes del tiempo de colisión).
Evaluación de la solución
La calidad de la solución de mide considerando el error cuadrático medio (MSE) y F2. En
particular, con el ratio MSE / F2.
El error cuadrático medio (MSE) va a indicar cómo de cerca la predicción del riesgo en
comparación con el riesgo actual.
La medida F2 es una variante de F1 que penaliza más los falsos negativos.
En principio, el error cuadrático medio sería suficiente. Lo que ocurre, es que es el mismo error
tiene significados diferentes dependiendo en qué parte de la escala de riesgo se encuentre. Por
ejemplo, si en realidad el riesgo el 10-20 y el modelo predice que el riesgo será 10-23, no tiene
ningún impacto en la práctica. Sin embargo, si el riesgo en realidad fuera 10-3 y el modelo predice
10-6 sería más grave.
Por eso se usa F2 usando 10-6 como límite. De esta forma, resulta muy importante clasificar si
tendremos un error alto (mayor que 10-6) o bajo (menor que 10-6).
Además, el error cuadrático medio sólo se calcula para los casos en el que el riesgo real sea alto.
Participación
Para participar, sólo tienes que inscribirte (gratuitamente) en la plataforma kelvins. Es muy
parecida a kaggle en cuanto a su funcionamiento.
A tener en cuenta
Una de las dificultades de este problema es que hay muy pocos eventos que tengan un riesgo
muy alto de colisión. La mayoría de las posible colisiones conllevan poco riesgo. Esto está muy
bien para los satélites, pero supone un el conjunto de datos está muy desbalanceado.
Suerte!
Esperamos que os divirtáis tanto resolviendo este desafío como nosotros preparándolo. Como os
podéis imaginar, hemos empleado un tiempo en preparar los datos, decidiendo qué predecir,
decidiendo cómo evaluar los resultados … y también intentando resolver este problema como si
fuésemos uno de los participantes en este desafío de machine learning para asegurarnos de que
todo iba a ir estupendamente.
Actualización
La competición terminó. Puedes leer nuestro análisis de la competición y los resultados en el
paper Spacecraft Collision Avoidance Challenge: design and results of a machine learning
competition
Recursos
Web de la competición
Nota de Prensa
Precision, Recall, F1, Accuracy en clasificación
Por Jose Martinez Heras
17/11/2019
Términos es Español
Estas métricas también tienen su correspondiente nombre en español, pero es importante que
sepas su nombre en inglés porque muchas librerías (scikit-learn), las tienen ya implementadas. En
esta tabla puedes encontrar la correspondencia.
Inglés Español
Precision Precisión
Recall Exhaustividad
F1-score Valor-F
Accuracy Exactitud
Ejemplo de Marketing
Vamos a utilizar un ejemplo de marketing para entender mejor qué es lo que miden cada una de
estas métricas y su significado en el ámbito de los negocios.
Imagínate que estamos llevando la campaña de marketing para un banco. Al banco le interesa
vender un fondo de inversión a sus clientes, porque así pueden ganar dinero por la comisión de
gestión.
Podríamos contactar con todos los clientes del banco y ofrecerles el fondo de inversión. Esto es
bastante ineficiente porque la mayoría de los clientes no estarán interesados. Sería más eficiente
contactar con unos pocos, recoger datos, hacer machine learning y predecir qué otros clientes
tienen más probabilidad de aceptar la oferta del banco.
Sin embargo, (casi) ningún modelo de Machine Learning es perfecto. Esto quiere decir que:
habrá clientes con los que contactaremos porque el modelo ha predicho que aceptarían y
en realidad no lo hacen (False Positive [FP], Positivos Falsos).
habrá también clientes con los que no contactaremos porque el modelo ha predicho que no
aceptarían que en realidad si lo hubieran hecho (False Negative [FN], Negativos Falsos).
El modelo de Machine Learning también acertará (esperemos que mucho). A efectos prácticos
esto significa que:
habrá clientes con los que contactaremos porque el modelo ha predicho que aceptarían y
en realidad sí que lo hacen (True Positive [TP], Positivos Verdaderos).
habrá clientes que no contactaremos porque el modelo ha predicho que no aceptarían la
oferta y en realidad no lo hacen (True Negative [TN], Negativos Verdaderos).
Nuestro modelo (en el ejemplo) no es muy bueno, aunque dependiendo de qué métrica usemos
podría parecer que es mejor de lo que es.
0: no está interesado
1: sí está interesado
En la matriz de confusión de la izquierda podéis ver los valores para este ejemplo. En la matriz de
confusión de la derecha, los nombres genéricos cuando usamos la nomenclatura inglesa: True
Negative [TN], True Positive [TP], False Positive [FP], False Negative [FN].
Precision (Precisión)
Con la métrica de precisión podemos medir la calidad del modelo de machine learning en tareas
de clasificación. En el ejemplo, se refiere a que la precisión es la respuesta a la pregunta ¿qué
porcentaje de los clientes que contactemos estarán interesados?
TP
precision =
TP + FP
Precisión (precision)
TP 5
precision = = = 0.33
TP + FP 5 + 10
Es decir, que sólo un 33% de los clientes a los que contactemos estarán realmente interesados.
Esto significa que el modelo del ejemplo se equivocará un 66% de las veces cuando prediga que
un cliente va a estar interesado.
Recall (Exhaustividad)
La métrica de exhaustividad nos va a informar sobre la cantidad que el modelo de machine
learning es capaz de identificar. En el ejemplo, se refiere a que la exhaustividad (recall) es la
respuesta a la pregunta ¿qué porcentaje de los clientes están interesados somos capaces de
identificar?
TP
recall =
TP + FN
Exhaustividad (recall)
TP 5
recall = = = 0.25
TP + FN 5 + 15
Es decir, el modelo sólo es capaz de identificar un 25% de los clientes que estarían interesados en
adquirir el producto. Esto significa que el modelo del ejemplo sólo es capaz de identificar 1 de
cada 4 de los clientes que sí aceptarían la oferta.
F1
El valor F1 se utiliza para combinar las medidas de precision y recall en un sólo valor. Esto es
práctico porque hace más fácil el poder comparar el rendimiento combinado de la precisión y la
exhaustividad entre varias soluciones.
precision ⋅ recall
F1 = 2 ⋅
precision + recall
El valor F1 asume que nos importa de igual forma la precisión y la exhaustividad. Esto no tiene
que ser así en todos los problemas. Por ejemplo, cuando necesitamos predecir si hay riesgo de
que un trozo de basura espacial se choque con un satélite, podemos valorar más la exhaustividad
a riesgo de tener una peor precisión. Por eso elegimos F2 en lugar de F1 para esa competición de
machine learning.
En este caso podemos usar F2, que es la fórmula genérica del valor F para beta = 2. La fórmula
genérica de F es la siguiente:
precision ⋅ recall
Fβ = (1 + β 2 ) ⋅
(β 2 ⋅ precision) + recall
Accuracy (Exactitud)
La exactitud (accuracy) mide el porcentaje de casos que el modelo ha acertado. Esta es una de
las métricas más usadas y favoritas … que te recomiendo evitar! El problema con la exactitud es
que nos puede llevar al engaño, es decir, puede hacer que un modelo malo (como el del ejemplo)
parezca que es mucho mejor de lo que es.
TP + TN
accuracy =
TP + TN + FP + FN
TP + TN 5 + 70
accuracy = = = 0.75
TP + TN + FP + FN 5 + 70 + 10 + 15
Es decir, el modelo acierta el 75% de las veces. Como ves, la exactitud es una métrica muy
engañosa. De hecho, si tuviésemos un modelo que siempre predijera que el cliente nunca va a
estar interesado, su accuracy sería del 80%.
Peligro: la métrica accuracy (exactitud) no funciona bien cuando las clases están
desbalanceadas como es en este caso. La mayoría de los clientes no están interesados
en la oferta, así que es muy fácil acertar diciendo que no lo van a estar. Para problemas
con clases desbalanceadas es mucho mejor usar precision, recall y F1. Estas métricas
dan una mejor idea de la calidad del modelo.
sklearn.metrics.confusion_matrix
sklearn.metrics.precision_score
sklearn.metrics.recall_score
sklearn.metrics.f1_score
sklearn.metrics.accuracy_score
Resumen
En este artículo hemos visto cuáles son las métricas más extendidas para evaluar el rendimiento
de modelo supervisado en tareas de clasificación.
Hemos destacado que la métrica accuracy (exactitud) es engañosa cuando las clases están
desbalanceadas. Cuando decimos que es engañosa nos referimos a que nos hace creer que el
modelo es mejor de lo que en realidad es. De hecho, he puesto un ejemplo de un modelo
relativamente malo para poner de manifiesto este ejemplo.
Las medidas de precision, recall y F1 son mucho más representativas y funcionan tanto si las
clases están balanceadas como si no:
Precision nos da la calidad de la predicción: ¿qué porcentaje de los que hemos dicho que
son la clase positiva, en realidad lo son?
Recall nos da la cantidad: ¿qué porcentaje de la clase positiva hemos sido capaces de
identificar?
F1 combina Precision y Recall en una sola medida
La Matriz de Confusión indica qué tipos de errores se cometen
Recursos
Métricas en scikit-learn que incluyen las descritas y muchas más
Vídeo (en inglés) donde explico estas métricas
Artículo en la wikipedia
Error Cuadrático Medio como métrica en problemas de aprendizaje supervisado de
regresión
Clustering (Agrupamiento), K-Means con ejemplos en python
Por Jose Martinez Heras
25/01/2020
Clustering – Agrupamiento
El clustering consiste en la agrupación automática de datos. Al ser un aprendizaje no-supervisado,
no hay una respuesta correcta. Esto hace que la evaluación de los grupos identificados sea un
poco subjetiva. Vamos a verlo con un ejemplo:
Con estos datos, algunas personas dirían que hay 2 grupos, tal y como se muestra en la siguiente
figura.
Datos agrupados en 2 clusters
Sin embargo, otras personas podrían decir que, en realidad, hay 5 grupos.
Esto no significa haya alguien equivocado. Tampoco que todos tengan razón. Tan sólo que los
datos son tal y como son pero podemos elegir verlos como más nos convengan.
Las técnicas de clustering intentan descubrir cuál es el mejor agrupamiento de los datos. Algunas
de estas técnicas necesitan que especifiquemos el número de grupos de queremos encontrar.
Otras técnicas necesitan otros hiper-parámetros.
Ejemplos de Clustering
Vamos a ver 2 ejemplos en esta sección: segmentación de clientes y compresión de datos. En el
ejemplo de K-Means con python agruparemos las acciones del Dow Jones de la bolsa americana
que tengan un comportamiento similar.
Segmentación de clientes
En la segmentación de clientes intentamos comprender qué hace a los clientes diferentes para
poder ofrecerles los productos y servicios que necesiten.
En este ejemplo podemos ver cómo una técnica de agrupamiento ha encontrado 3 grupos cuando
considera 2 variables:
Fuente: https://select-statistics.co.uk/blog/customer-segmentation/
Preocupados por el precio (en verde): no son leales a la marca y son muy sensitivos al
precio
Leales a precios bajos (en negro): son leales a la marca pero sólo si es barato
Defensores de la marca (en rojo): son leales a la marca sin importar demasiado el precio
Por supuesto, el análisis de clustering no nos da ninguna de estas explicaciones. Sólo nos da los
grupos. Una persona con conocimiento del dominio del problema será la encargada de interpretar
los resultados. En el problema de segmentación de clientes, esta persona posiblemente trabajará
en marketing o ventas.
Compresión de datos
También podemos usar clustering para comprimir imágenes con pérdida de información. La
compresión, en este ejemplo, se hace en el número de colores diferentes que se usan.
Vamos a suponer que la imagen original utiliza una paleta de 255 colores. Para comprimir la
imagen, podemos decidir usar menos bits por pixel, es decir, usar menos colores.
En la siguiente figura puedes ver cómo quedaría la foto original a medida que vamos usando
menos y menos colores. Primero 10 colores, luego 3 y por último sólo 2.
La técnica de clustering nos ayuda a decidir qué nuevos colores pueden representar mejor la
imagen original cuando limitamos el número posible de colores a usar (K).
Fuente: https://rpubs.com/yujingma45/155921
Algoritmos de Clustering
La librería de python scikit-learn ofrece implementaciones eficientes de varias técnicas de
agrupamiento. Esta figura muestra cómo distintos algoritmos se comportan con varios tipos de
datos.
Fuente: https://scikit-learn.org/stable/modules/clustering.html
Scikit-learn ofrece la siguiente tabla que nos ayuda a comparar los diferentes algoritmos de
clustering. La comparación de los algoritmos de clustering está hecha en función a los parámetros
que necesitan, su escalabilidad, caso de uso y geometría (métrica usada). Algunas preguntas
útiles pueden ser:
¿Tengo una idea del número de grupos que quiero encontrar? … ¿o prefiero que el
algoritmo lo encuentre?
¿Tengo muchísimos datos? En este caso, deberemos tener en cuenta la escalabilidad del
algoritmo.
Fuente: https://scikit-learn.org/stable/modules/clustering.html
K-Means
El algoritmo de clustering más usado es K-Means. Tiene una muy buena escalabilidad con la
cantidad de datos. Para utilizar K-Means debemos especificar el número de grupos que queremos
encontrar. A este número de grupos se le denomina K.
Inicialización
Se elige la localización de los centroides de los K grupos aleatoriamente. La figura muestra los
datos como círculos y los centroides como cuadrados.
Asignación
A continuación, se asigna cada dato al centroide más cercano. En el ejemplo, los círculos cambian
de color para indicar a qué centroide han sido asignados.
Actualización
Ahora se actualiza la posición del centroide a la media aritmética de las posiciones de los datos
asignados al grupo. Observa cómo la posición de los centroides (cuadrados) cambia.
A continuación irían las fases: asignación, actualización, asignación, actualización, etc. hasta que
las posiciones de los centroides no cambien.
Recomendaciones
Normalización
A la hora de usar cualquier algoritmo de clustering, es buena idea normalizar nuestros datos. En
este contexto, «normalizar» se refiere a que los valores de cada atributo estén en escalas
similares. Normalizar ayuda al clustering porque los grupos se forman a partir de distancias. Si hay
atributos con escalas muy diferentes, los atributos de escala mayor dominarán las distancias.
Para poner un ejemplo del problema de no normalizar, imagina el caso en el que queramos
encontrar grupos de inmuebles similares. Si los atributos que tenemos son el precio en euros y el
número de habitaciones, seguramente obtendremos el mismo resultado de agrupamiento si
eliminamos el número de habitaciones. Sin embargo, al poner ambos atributos en la misma
escala, los dos se convierten en importantes.
Hay, por supuesto, más tipos de normalización. Por ejemplo: transformación logarítmica, hacer
ratios, cuantizar los datos, etc.
Selección de características
Por ejemplo, si estamos usando clustering para segmentar clientes … seguramente no es buena
idea incluir el color de los ojos de los clientes. Esta es una característica posiblemente irrelevante
que hará que las distancias entre los puntos multidimensionales que representan cada dato sea
menos informativa … excepto si estamos vendiendo lentillas para cambiar el color de ojos!
Además, siempre es buena idea usar el menor número atributos posible debido a los que se
conoce como la maldición de la dimensionalidad. En esencia se refiere a que a medida que el
número de dimensiones (atributos) aumenta, la distancia discrimina cada vez menos. Una práctica
común antes de hacer clustering es reducir la dimensionalidad del problema. Hay varias técnicas
para este propósito tales como Principal Components Analysis (PCA), auto-enconders, etc.
Número de clusters
Algunas técnicas de agrupamiento, tales como K-Means, necesitan que especifiquemos el número
de clusters (grupos) que queremos encontrar. No es obvio, a priori, saber qué número de grupos
es mejor.
Por ejemplo, si queremos encontrar grupos de tallas de ropa y elegimos tener 5 grupos,
podríamos llamarlos: XS, S, M, L, XL. Sin embargo, si buscamos 7 grupos, tendríamos: XXS, XS,
S, M, L, XL, XXL.
Si lo que estás buscando es un método más objetivo, te recomiendo que profundices en este tema
con alguna de estas dos técnicas:
Método de la silueta
Método del codo
Los datos están disponibles en kaggle. Para simplificar el problema, vamos a usar sólo las 30
acciones de están recogidas en el índice Dow Jones.
Vamos a usar datos semanales de los últimos 5 años. Este extracto muestra qué forma tienen los
datos. Cada columna representa a cada empresa.
Cada acción tiene su propio rango de valores. Por ejemplo Apple (APPL) empieza en $67.85 y
Adobe (ADBE) en $39.12.
La intención de este ejercicio es agrupar las acciones por el comportamiento de sus ganancias, en
vez de por su precio de mercado. De esta forma el rendimiento de cada acción es comparable con
los demás.
Vamos a calcular el rendimiento de cada acción desde el principio del periodo que estamos
considerando.
1. start = stocks.iloc[0] # start es el valor al principio del
periodo
2. returns = (stocks - start) / start # returns es el valor relativo al
inicio
3.
4. # dow_returns contendrá la información de returns limitada a las acciones
del Dow Jones
Ahora vamos a hacer clustering con estos datos con K-Means. Instruimos a K-Means a que use 8
grupos, es decir K=8.
1. Cluster 0:
2. - American Express Co (AXP)
3. - General Electric (GE)
4. - Goldman Sachs Group (GS)
5. - Coca-Cola Company (The) (KO)
6. - McDonald's Corp. (MCD)
7. - Pfizer Inc. (PFE)
8. - Procter & Gamble (PG)
9. - United Technologies (UTX)
10. - Verizon Communications (VZ)
11. - Wal-Mart Stores (WMT)
12.
13. Cluster 1:
14. - Apple Inc. (AAPL)
15. - 3M Company (MMM)
16.
17. Cluster 2:
18. - United Health Group Inc. (UNH)
19.
20. Cluster 3:
21. - Caterpillar Inc. (CAT)
22. - Chevron Corp. (CVX)
23. - International Business Machines (IBM)
24. - Exxon Mobil Corp. (XOM)
25.
26. Cluster 4:
27. - Home Depot (HD)
28. - Microsoft Corp. (MSFT)
29. - Visa Inc. (V)
30.
31. Cluster 5:
32. - Cisco Systems (CSCO)
33. - Intel Corp. (INTC)
34. - Johnson & Johnson (JNJ)
35. - JPMorgan Chase & Co. (JPM)
36. - Merck & Co. (MRK)
37. - The Travelers Companies Inc. (TRV)
38.
39. Cluster 6:
40. - The Walt Disney Company (DIS)
41. - Nike (NKE)
42.
43. Cluster 7:
44. - Boeing Company (BA)
Por ejemplo, la siguiente figura muestra los componentes del Cluster 4 que contiene: Home Depot,
Microsoft y Visa.
Para ver el resto de los gráficos y el código completo, puedes consultar este jupyter notebook.
Resumen
Agrupar datos es muy útil para aplicaciones tales como segmentación de clientes, compresión con
pérdida de datos. También para encontrar entidades con comportamientos similares (en mercados
bursátiles, por ejemplo).
K-Means es la técnica de clustering más usada pero hay muchas más. Te animo a usar la tabla
comparativa de los métodos de clustering que ofrece scikit-learn para decidir cuál es la más
apropiada para tu problema.
Para que el clustering sea efectivo es recomendable reducir al mínimo el número de atributos,
usar atributos relevantes y poner los datos en una escala similar.
Recursos
Video donde explico clustering y K-Means (en inglés)
Video donde explico el ejemplo de las acciones del Dow Jones (en inglés)
Jupyter Notebook con el ejemplo de las acciones del Dow Jones al completo (en inglés)
Clustering en scikit-learn
Google Dataset Search – descubre conjuntos de datos
Por Jose Martinez Heras
01/02/2020
En toda la web, hay millones de conjuntos de datos sobre casi cualquier tema que le interese.
Google DataSet Search nos pone fácil encontrar estos datos. Tiene ya acceso a casi 25 millones
de conjuntos de datos y este número sigue creciendo. Los datos no los tiene Google, sino que
DataSet Search ofrece un lugar para buscar y encontrar enlaces a los datos que buscamos.
Las técnicas de Machine Learning necesitan datos para aprender. De hecho, cuantos más datos
mejor. Cuando estemos resolviendo algún problema, podemos recurrir a DataSet Search para
encontrar datos adicionales que puedan ser relevantes y de ayuda para resolverlo.
Por ejemplo, si estamos haciendo predicciones relacionadas con el esquí, podemos encontrar
datos sobre los beneficios de las estaciones de esquí o el porcentaje de lesiones.
Algunos de los resultados de búsqueda para la consulta «skiing», que incluyen conjuntos de datos
que van desde las velocidades de los esquiadores más rápidos hasta los ingresos de las
estaciones de esquí.
Filtrado: ahora puede filtrar los resultados según los tipos de conjunto de datos que desee
(por ejemplo, tablas, imágenes, texto). Otra posibilidad es filtrar sólo los conjuntos de datos
que estén disponibles de forma gratuita.
Visualización geográfica: si un conjunto de datos se trata de un área geográfica, puede
ver el mapa.
Dispositivos móviles: ahora Google DataSet Search funciona también en dispositivos
móviles
Calidad de metadatos: la nueva versión incorpora una mejora significativa en la calidad de
las descripciones de los conjuntos de datos.
Además, Google ofrece la posibilidad de que los datos sean fácilmente indexados por Google
DataSet Search a todas las entidades que publiquen datos. Para ello, sólo hay que usar un
estándar abierto para describir las propiedades de del conjunto de datos en página web de dicha
entidad.
Las consultas más comunes incluyen educación, clima, cáncer, crimen, fútbol y perros.
Fuente: https://blog.google/products/search/discovering-millions-datasets-web/
Feliz San Valentín menéame
Por Jose Martinez Heras
13/02/2020
¡Feliz San Valentín! Vamos a celebrarlo haciendo un análisis de todas las noticias de portada de
menéame desde el último San Valentín. Para el análisis, usaremos técnicas de Procesamiento del
Lenguaje Natural y Visualización de datos.
Para encontrar los artículos más interesantes he usado técnicas de procesamiento del lenguaje
natural no-supervisado (modelo bolsa de palabras, tf-idf, similitud coseno, modelado de temas,
etc…). En otros posts más técnicos explicaré cómo funcionan. De momento, nos podemos quedar
con que interpreto «más interesante» como «más diferente en comparación con el resto de
artículos».
Estos son los 14 artículos más interesantes (diferentes):
¿Sabías que a medida que aumenta el número de dimensiones, la distancias se vuelven menos
discriminativas? A este efecto se le conoce con el nombre de la Maldición de la Dimensión (Curse
of Dimensionality) y tiene un gran impacto en técnicas de aprendizaje automático basadas en
distancias tales como K-Means y KNN (los k vecinos más cercanos).
La Maldición de la Dimensión
En Machine Learning, el número de dimensiones se puede equiparar al número de variables o
características (features) que estemos utilizando.
Vamos a verlo en detalle. Para darte una intuición gráfica he generado puntos aleatorios en varias
dimensiones siempre en el rango [0, 1].
A medida que el número de dimensiones aumenta, la distancia media entre ellos también
aumenta. Esto en sí mismo no es muy problemático para el aprendizaje automático. El siguiente
gráfico muestra este efecto (hasta 1000 dimensiones).
La variabilidad disminuye exponencialmente
El siguiente gráfico muestra el coeficiente de variación para varias dimensiones (hasta 1000). El
coeficiente de variación se utiliza para medir la variabilidad.
Esto es terrible para los métodos de aprendizaje automático basados en distancias tales como
clustering o los vecinos más cercanos. El problema es que cuando hay un gran número de
atributos (features), los datos están todos a casi la misma distancia. Es decir, no hay variabilidad
entre sus distancias.
La siguiente figura muestra la distribución de distancias euclídeas entre 10000 puntos aleatorios
en el rango [0, 1] en varias dimensiones: 1, 2, 3, 10, 50, 100, 250, 500 y 1000.
Distribución de las distancias en distintas dimensiones
En la siguiente figura podemos ver 100 puntos elegidos aleatoriamente en el rango [0,1] para 1
dimensión. Como ves, es bastante fácil encontrar puntos que estén muy cerca (por ejemplo: 0.21 y
0.25) y puntos que estén lejos (0.21 y 0.99). Para cualquier punto, en 1 dimensión, es fácil
encontrar muchos puntos que estén cerca y bastantes puntos que estén lejos.
Sin embargo, encontrar muchos puntos que estén cerca de uno dado ya no es tan fácil cuando los
100 puntos los ponemos aleatoriamente en 2 dimensiones. En 2 dimensiones, la mayoría de los
puntos están a una distancia media de otros … mientras que para 1 dimensión, la mayoría de los
puntos están cerca de otros puntos.
Estas son algunas de las técnicas de aprendizaje automático afectadas por la maldición de la
dimensión:
Las técnicas de reducción de dimensionalidad asumen que pueden capturar bastante variabilidad
de los datos en menos dimensiones. Así crean un conjunto nuevo de dimensiones que representa
nuestros mismos datos con menor dimensionalidad.
Esto permite utilizar técnicas de machine learning en una dimensionalidad menor. Para técnicas
sensibles a la maldición de la dimensión, los resultados serán probablemente mucho mejores. En
cualquier caso, al tener menos atributos, hay una mejora de rendimiento, tanto en el uso de
memoria como en el uso de la CPU.
A más dimensiones, más datos se necesitan para llenar el espacio. Cuando el número de
dimensiones es muy alto, el espacio está casi vacío. Por eso es tan difícil encontrar puntos que
estén cerca.
Resumen
La maldición de la dimensión nos enseña que la variabilidad de las distancias entre nuestros datos
disminuye exponencialmente con el número de dimensiones (features).
Esta maldición afecta a las técnicas que estén basadas en distancias tales como agrupamiento
(clustering), los vecinos más cercanos (k-NN), algunas técnicas de detección de outliers, etc.
Para mitigar los efectos de esta «maldición» podemos utilizar técnicas de reducción de la
dimensionalidad y / o aumentar (exponencialmente) la cantidad de datos.
En este segundo post de la serie nos adentraremos un poco en las matemáticas que hay detrás
de las redes neuronales. Ya vimos algo de matemáticas en el anterior post, donde hablamos sobre
las diferentes funciones de activación de las neuronas. Ahora veremos una de las partes más
importantes de las redes neuronales: la asignación de los pesos para cada conexión neuronal.
Entre los algoritmos más usados para asignar estos pesos se encuentra el llamado back
propagation (propagación hacia atrás).
Introducción
Como ya intuimos por el post anterior, la programación clásica y las redes neuronales son
aproximaciones distintas para resolver problemas. En la programación clásica, escribimos código
fuente indicando al ordenador qué decisiones han de tomarse de forma absolutamente
determinista para resolver un problema, una descripción detallada de todo lo que hay que hacer,
similar a una receta. Por ejemplo, si lo que queremos es sumar dos números, tiene sentido
programar en nuestro lenguaje favorito el algoritmo de la suma. Sin embargo, supongamos que
nuestro problema es distinguir si una fotografía es un coche o no. En principio, no parece
complicado cómo estructurar un algoritmo, un coche siempre tiene cuatro ruedas, ventanas,
parabrisas, faros.
Pero algunas de estas características pueden no aparecer en la fotografía, la cual puede mostrar
parte de coche, en lugar del coche entero. Además, diferenciar entre ruedas y ventanas, por
ejemplo, puede ser igual de complicado que reconocer el propio coche. Por lo tanto, lo que
hacemos en mostrarle a la red neuronal la mayor cantidad de coches diferentes posibles, y con
estos ejemplos lo que la máquina aprende es el algoritmo por si mismo para identificar coches. Lo
que hacemos es acudir a las redes neuronales como vimos en el post anterior. Lo único que nos
falta ahora es asignar los pesos a cada una de las conexiones entre neuronas.
Pero, ¿por qué complicarnos la vida con algoritmos de ajuste de pesos aparentemente tan
difíciles, pudiendo asignar los pesos y probar con todas las combinaciones posibles para al final
quedarnos con la que minimice el error? Esto es lo que se denomina ajuste de pesos por fuerza
bruta. Veamos como esto no es viable, incluso teniendo una red neuronal muy simple, como la
que usamos en el post anterior.
Imposible de realizar
Supongamos que tenemos 1000 valores posibles para cada uno de estos 20 pesos. Es decir, el
número de combinaciones es:
De todas estas combinaciones, tendríamos que escoger aquella que minimizara el error, por lo
que tendríamos que probar absolutamente todas ellas.
El ordenador más potente que existe sobre la faz de la Tierra mientras usted lee este post, es
Summit, capaz de realizar 200 cuatrillones de cálculos por segundo. Para probar todas las
combinaciones, Summit tardaría miles de millones de veces la edad que tiene nuestro propio
universo. Por ello, recurrimos a algoritmos complejos, como el back propagation o propagación
hacia atrás.
1. Asignamos a cada conexión neuronal un peso con un valor pequeño, pero no nulo.
2. Introducimos la primera observación de nuestro conjunto de entrenamiento por la capa
inicial de la red neuronal.
3. La información se propaga de izquierda a derecha, activando cada neurona que ahora es
afectada por el peso de cada conexión, hasta llegar a la capa de neuronas de salida,
obteniendo el resultado final para esa observación en concreto.
4. Medimos el error que hemos cometido para esa observación.
5. Comienza la propagación hacia atrás de derecha a izquierda, actualizando los pesos de
cada conexión neuronal, dependiendo de la responsabilidad del peso actualizado en el
error cometido.
6. Repetimos los pasos desde el paso 2, actualizando todos los pesos para cada observación
o conjunto de observaciones de nuestro conjunto de entrenamiento.
7. Cuando todas las observaciones del conjunto de entrenamiento ha pasado por la red
neuronal, hemos completado lo que se denomina un Epoch. Podemos realizar tantos
Epochs como creamos convenientes.
Cálculos preliminares
Partamos de una configuración inicial de una red neuronal compuesta por una capa de entrada de
una neurona, una capa oculta de dos neuronas y una capa de salida de una única neurona.
Las neuronas se indican con la letra «a» y las conexiones neuronales con la letra «w». Para las
neuronas, el superíndice entre paréntesis indica la capa a la que pertenece la neurona , y el índice
indica el número de neurona dentro de la capa. Así, por ejemplo,
a(3)
2
Sabemos que las conexiones neuronales conectan neuronas de una capa con las neuronas de la
capa siguiente. El superíndice del peso indica el número de la capa inicial de la conexión. El
subíndice está compuesto de dos números: el primero indica el número de la neurona de la capa
inicial de la conexión y el segundo el número de neurona dentro de la capa al final de la conexión,
es decir,
(2)
w21
indica que la conexión empieza en la capa 2, y conecta la segunda neurona de esta capa con la
neurona 1 de la capa siguiente.
a(3)
(3) (2) (2) (2) (2)
1 = f (u1 + w11 a1 + w21 a2 )
Ahora, hacemos lo mismo con la salida de las neuronas de la capa oculta anterior, y tenemos que:
a(2)
(2) (1) (1)
1 = f (u1 + w11 a1 )
y
(2) (2) (1) (1)
a2 = f (u2 + w12
a1 )
Generalizando la fórmula
Por lo tanto, generalizando la fórmula anterior para cualquier numero de capas k y cualquier
neurona i dentro de la capa, tenemos que:
nk − 1
+ ∑ a(k−1)
a(k)
i = f (u(k)
i
j
(k−1)
wji ), i = 1 … nk
j=1
Recordemos que las variables en toda esta expresión son los pesos, por lo que para hacer mínimo
el error tenemos que derivar con respecto de cada uno de ellos, teniendo en cuenta que estamos
usando una función de activación sigmoide, es decir, tenemos que hacer derivadas parciales con
respecto a cada peso.
Una vez obtenido el valor mínimo, repetimos el proceso tantas veces como necesitemos para que
las conexiones de la red queden ajustadas de manera óptima.
Resumen
En este post hemos visto la base de uno de los algoritmos mas utilizados para asignar pesos a las
conexiones neuronales de nuestra red. Por supuesto, este es uno de entre muchos algoritmos que
se usan para tal fin. Saber algo de las matemáticas básicas que se encuentran detrás de estos
algoritmos nos dará una ventaja extra a la hora de elegir cual de ellos es mas adecuado usar en
nuestra red neuronal. Por supuesto, aunque es un ejercicio muy conveniente y didáctico, no
tenemos que programar explícitamente estos algoritmos al construir la red neuronal,
prácticamente todas las librerías y frameworks que usamos para programar la red nos
proporcionan métodos a los cuales únicamente hay que dotarles de los parámetros adecuados, y
se encargaran de ejecutar el algoritmo por sí mismos.
Recursos
Tutorial de red neuronal perceptron con algoritmo back propagation.
Video fantástico (en ingles) sobre el algoritmo back propagation.
Créditos
Algunas de las imágenes de este artículo han sido reproducidas, con permiso, del Curso completo
de Inteligencia Artificial con Python.
Actualmente trabaja como ingeniero en Darmstadt, Alemania, en diferentes proyectos para la ESA
(European Space Agency) y EUMETSAT (European Organisation for the Exploitation of
Meteorological Satellites).
Correlación, Covarianza e IBEX-35
Por Jose Martinez Heras
29/06/2020
Tanto la correlación como la covarianza son técnicas que nos ayudan a entender mejor cómo varía
una variable en función de otra. Vamos a ver 3 tipos de correlación: Pearson, Spearman y Kendall.
Veremos qué son, cómo se calculan y en qué casos funcionan mejor. Como ejemplo en python
encontraremos qué compañías del IBEX-35 está más y menos correladas.
La correlación y la covarianza tienen muchas aplicaciones en campos tan diversos como genética,
biología molecular, finanzas, etc. Además nos ayudan a entender mejor los datos y pueden ser
útiles como características en la fase de preparación de datos.
Covarianza
La covarianza es una medida de variabilidad entre dos variables. Es decir, mide cómo varía una
variable en relación a otra variable. Para calcular la covarianza usaremos la siguiente fórmula.
Correlación
Existen varios tipos de correlación. La más conocida es, sin duda, la de Pearson. De hecho, si no
decimos cuál estamos usando, se asume que usamos la de Pearson. Además de la de Pearson
veremos también la correlación de Spearman y la de Kendall.
Correlación de Pearson
Para calcularla tendremos en cuenta la covarianza y las desviaciones típicas tanto de X como de
Y. La expresión es la siguiente:
cov(X, Y )
pearson(X, Y ) =
σX σY
La correlación de Pearson resuelve el problema de la interpretabilidad de la magnitud de la
relación entre las variables X e Y. No tiene dimensiones. Dicho de otra forma, es adimensional.
Correlación de Spearman
Por ejemplo, si X = [3.28, -4.12, 8.21, 6.65, -0.94], obtendremos su ranking rX ordenando sus
valores de menor a mayor y remplazándolos por su posición en el nuevo orden: rX = [3, 1, 5, 4, 2].
La fórmula sería:
cov(rX , rY )
spearman =
σ r X σ rY
Por ejemplo, si los valores más altos de X se corresponden con los valores de Y en todas las
situaciones obtendremos un valor de +1. La correlación de Spearman también está normalizada
en el rango [-1, +1]
Correlación de Kendall
La correlación de Kendall está indicada para encontrar relaciones entre variables que representen
secuencias tales como series temporales. Se fija en cómo varían los pares de X e Y. Para ello
define pares concordantes y discordantes:
Date cuenta que sólo tienen que aumentar o disminuir simultáneamente para que los pares sean
considerados concordantes. Es decir, no se fija para nada en la cantidad o de si son
proporcionales. Esto le permite encontrar relaciones tanto lineales como no lineales.
2
Como vemos, estos aumentos y disminuciones en valor son ideales para secuencias de datos
tales como series temporales. La correlación de Spearman también está normalizada en el rango
[-1, +1].
Su desventaja sería:
Diversificación en el IBEX35
Datos
Los datos para este ejercicio son las cotizaciones diarias de las acciones que cotizan en el IBEX35
desde 28/06/2019 hasta 28/06/2020. Es decir, justo un año de cotizaciones. Los datos los he
obtenido usando la librería investpy
https://pypi.org/project/investpy/
Transformación de datos
Para este análisis he usado las ganancias diarias, es decir, qué porcentaje ha subido (o bajado) la
cotización de una acción con respecto al precio del día anterior. Así por ejemplo, el porcentaje
diario de la cotización de Inditex quedaría de esta forma.
IBEX35 con la correlación Kendall
Me he decidido a hacer una correlación Kendall con los datos de los retornos diarios de las
cotizaciones del IBEX35 por estar optimizada para series temporales. Así podemos examinar la
relación temporal de los rendimientos diarios.
Además tiene la ventaja de no asumir ninguna distribución (esto sería un problema para Pearson
porque es sabido que la distribución de los retornos bursátiles no siguen una distribución normal).
De esta forma podremos descubrir relaciones tanto lineales como no lineales.
Para calcular la correlación en python he usado la librería pandas. Es lo más cómodo porque tenía
los datos en un DataFrame de pandas.
1. kendall = retornos_diarios.corr(method='kendall').abs()
2. #pearson = retornos_diarios.corr().abs()
3. #pearson = retornos_diarios.corr(method='pearson').abs()
4. #spearman = retornos_diarios.corr(method='spearman').abs()
Sólo vamos a usar la correlación de Kendall, pero también te he indicado en el código comentado
cómo puedes calcular la correlación de Pearson (que es la que usa pandas por defecto) y la de
Spearman.
Al final tomo el valor absoluto porque para este análisis me interesa saber qué acciones están
relacionadas con otras, independientemente de si la relación es positiva o negativa.
La correlación de Kendall de los retornos diarios de las empresas que componen el IBEX 35 se
puede ver en el siguiente gráfico.
Como puedes ver, se puede apreciar que, normalmente, las empresas que pertenecen a los
mismo sectores están más correladas entre sí que con empresas de otros sectores.
Podemos ahora encontrar cuáles son las empresas que menos correlación tienen, en media, con
el resto de empresas del IBEX 35.
Así vemos que los rendimientos diarios de Cellnex Telecom, Grifols, MásMóvil, Almirall y Red
Eléctrica están entre los menos correlados con el resto de las empresas. Sin embargo, BBVA,
Santander, AcelorMittal, Mapfre y CaixaBank están entre los más correlados.
Observación
Si quieres invertir en acciones del IBEX 35 y asegurarte que en realidad estás diversificando,
comprueba en la matriz de correlación que sus retornos no estén excesivamente correlados.
Por cierto, esto no es ningún consejo para invertir, sólo un ejercicio para demostrar los resultados
que se pueden obtener haciendo un análisis de correlación.
Te dejamos como ejercicio calcular covarianzas y los distintos tipos de correlaciones con datos
fundamentales.
Quería despedirme con esta viñeta de xkcd. Que luego no digas que no te avisé que la correlación
no sirve para determinar causalidad.
Fuente
Resumen
Hemos visto cómo estudiar la interrelación entre variables con la covarianza y los distintos tipos de
correlación. Hemos visto las ventajas y desventajas de cada técnica y cómo se han ido superando
su limitaciones.
También, a modo de ejemplo, hemos estudiado cómo están interrelacionados los retornos diarios
de las empresas del IBEX 35 y cuáles son las empresas más y menos correladas.
Por último hemos hecho hincapié en el hecho de que la correlación no implica causalidad.
Recursos
Cálculo de covarianza en: pandas, numpy
Cálculo de correlación en: pandas, numpy
Librería para descargar cotizaciones bursátiles: investpy
Correlaciones divertidas
10 Blogs de Inteligencia Artificial y Machine Learning
Por Jose Martinez Heras
16/08/2020
Hemos recopilado una lista de los blogs de Inteligencia Artificial, Machine Learning y Análisis de
Datos en español. Nuestro objetivo es poner a tu alcance la información disponible sobre IA en
castellano.
Estamos seguros que nos hemos olvidado de muchos blogs, así que si tu blog favorito en español
sobre machine learning no está en la lista, ponlo en los comentarios y lo añadiremos más tarde.
Hoy quería poneros al tanto sobre un proyecto de machine learning que estamos llevando a cabo
con la Agencia Espacial Europea. Va sobre antenas e inteligencia artificial.
Utilizamos antenas de espacio profundo para comunicarnos con satélites que estén en el «espacio
profundo», por ejemplo, en Mercurio, Venus, Marte, etc. En la foto se puede apreciar la estación
de Marlargüe. Tiene 35 metros de diámetro y para poner el tamaño en perspectiva, puedes fijarte
que abajo a la izquierda hay una persona.
Al estar estos satélites tan lejos y ser la señal de radio tan débil, además de necesitar antenas de
gran tamaño, necesitamos que el apuntamiento de estas antenas sea muy preciso, en el orden de
miligrados. Cuando el viento es muy fuerte, el apuntamiento tiene errores. Es decir, apunta a
donde no debería, aunque sea un error muy pequeño. Estos errores pueden causar que se
interrumpa el enlace y se pierdan datos.
Hemos comenzado un proyecto donde usamos machine learning para predecir el error de
apuntamiento de antenas de espacio profundo. Los primeros de resultados de nuestro prototipo,
con un horizonte de predicción de 500ms, son excelentes. Las predicciones hechas por la IA
servirán para compensar en gran medida los errores de apuntamiento. En la práctica, esto
significa que aumentará la cantidad de datos que obtengamos de los satélites científicos debido al
incremento de disponibilidad del enlace.
Estoy realizando este proyecto junto con Peter Droll en el marco de la primera copa de innovación
en operaciones espaciales (1st OPS Innovation Cup) en la Agencia Espacial Europea.
Detección de anomalías en espacio
Por Jose Martinez Heras
19/09/2020
Te presentamos los retos, una solución sin machine learning, nuestra solución con machine
learning usando aprendizaje semi-supervisado, la «salsa secreta», algún ejemplo, soluciones de
otros operadores y qué librerías de python te pueden ayudar a detectar anomalías.
A lo mejor no trabajas con satélites o con espacio. Pero seguro que este artículo te da que pensar,
y te ofrece soluciones que a lo mejor no habías tenido en cuenta. Te puede venir muy bien si
trabajas en monitorización, mantenimiento predictivo o necesitas detectar comportamientos
atípicos en datos.
El primer reto al que nos enfrentamos es la propia definición de anomalía. ¿Qué es una anomalía?
Hay varias definiciones, pero la que considero más útil es la que usamos, informalmente, en
operaciones de espacio.
También está, por supuesto, la definición complementaria «queríamos que esto hubiera pasado y
no pasó», pero en el 99% de los casos, cuando hablamos de anomalías nos referimos a «no
queríamos que esto hubiera pasado».
Es muy difícil instruir a un sistema automático sobre qué es lo que queríamos que no hubiera
pasado. Así que, en la práctica, resolvemos un problema más fácil: detectar comportamientos
inusuales («novelty detection» en la terminología de machine learning).
Localización de la anomalía
Saber cuándo hay una anomalía es muy útil. Pero también necesitamos saber dónde está
ocurriendo la anomalía.
Los satélites actuales tienen entre 20,000 y 40,000 sensores (sin tener en cuenta los datos
científicos). Estos sensores miden cosas tan diversas como el voltaje de la batería, el porcentaje
usado de la CPU de ordenador de a bordo, la velocidad a la que se mueven las ruedas de inercia,
la presión en los tanques de combustible, etc.
Cuando hay una anomalía, es muy importante que podamos indicar a los ingenieros de
operaciones dónde (en qué sensores) está la anomalía para que puedan investigarlo más a fondo.
Anomalías falsas
Hay muchas técnicas de detección de anomalías y detección de outliers. Muchas de ellas tienen el
problema de detectar demasiadas anomalías falsas. Demasiados falsos positivos.
Para ponerte un ejemplo, imagina un sistema de monitorización de comportamiento atípico que
sea correcto un 99% de las veces. Este sistema sería terrible! Tan malo, que nadie en operaciones
espaciales tendría la paciencia de usarlo. ¿Por qué? Porque un 1% de las veces daría una alarma
falsa. Con unos 30,000 sensores, esto correspondería a 300 alarmas falsas que alguien tendría
que comprobar.
Los falsos positivos en la detección de anomalías tienen un coste. Los ingenieros de operaciones
tienen que comprobarlas y esto les lleva tiempo. Sin embargo, el mayor coste es el psicológico.
Cuando hay muchos falsos positivos, los ingenieros de operaciones dejarían de confiar en estos
resultados.
Así que es mejor tener pocas detecciones pero que las pocas que se detecten sean
comportamientos inusuales que merezca la pena investigar.
Obviedad de la anomalía
Al detectar una anomalía, el sistema alerta a los ingenieros de operaciones. Ellos deben
considerar obvio por qué el sistema los ha avisado.
Lo que vamos buscando es obviedad. Que cualquier persona al ver un gráfico de la serie temporal
histórica diga, hay algo raro aquí. Cualquier persona podría hacerlo, el problema es que hay unos
30,000 sensores que comprobar.
Queremos tener esa intuición humana en un software que pueda hacer esta comprobación
automáticamente.
Las peores anomalías son las que ocurren por primera vez. Nadie esperaba que esto ocurriese.
Por supuesto, sabemos que habrá anomalías en los satélites que operamos. Esto es normal
porque muchos satélites son construidos pensando que tendrán una vida útil de cierto tiempo y se
siguen usando mucho después. Sabemos que algo fallará, lo que no sabemos es en qué parte,
cuándo y cómo.
Saber que hay un comportamiento inusual en alguno(s) de los sensores nos da la pista de que a lo
mejor vamos a tener una anomalía de aquí a poco. Esto nos da tiempo a investigar antes de que
se convierta en un problema.
En las operaciones espaciales, muchas veces sólo hay anomalías que ocurren una vez. Esto es
así porque los ingenieros de operaciones, una vez que entienden por qué ha ocurrido la anomalía,
operan el satélite de otra forma. Es decir, evitan las condiciones que harían que la anomalía
ocurriese otra vez. Algunas veces la anomalía es inevitable y tenemos que vivir con ella. Aun así,
podemos diseñar estrategias para minimizar su impacto.
Desde el punto de vista de aprendizaje automático, esto quiere decir que no podemos utilizar
aprendizaje supervisado. Al menos no en el sentido de predecir directamente si cualquier
comportamiento es anómalo.
Control de límites
El control de límites es la solución clásica en sistemas de control.
A cada sensor se le asignan límites inferiores y superiores. Se usan normalmente dos tipos de
límites: límites blandos (soft limits) y límites duros (hard limits). Cuando un sensor alcanza alguno
de estos límites decimos que está «fuera de límites» (Out-of-Limits: OOL). En este caso, el
sistema de control alerta a los operadores.
Aunque parezca simple es bastante efectivo. En su sencillez estriba su eficacia.
Puede detectar que un sensor ha salido de límites tan pronto como salga. Es muy rápido
detectando.
Los límites pueden ser condicionales. Por ejemplo, si una unidad está en el modo «A»,
aplica unos límites. Si está en el modo «B», aplica estos otros.
No todos los sensores tienen asociados control de límites. Así que hay muchos que se
quedan sin ser monitorizados.
El comportamiento de la telemetría puede ser anómalo y estar dentro de sus límites. Con el
control de límites esta anomalía pasaría desapercibida. Veremos después un ejemplo.
A medida que pasa el tiempo, los componentes del satélite se van degradando y hay que
ajustar los límites manualmente.
A continuación explico cómo lo hacemos. Puedes leer el artículo científico completo aquí:
Martínez-Heras, José-Antonio, and Alessandro Donati. «Enhanced telemetry monitoring with
novelty detection.» AI Magazine 35, no. 4 (2014): 37-46.
Preparación de datos
Los datos consisten en series temporales de miles de sensores. Para preparar los datos
calculamos estadísticas simples en periodos de tiempo (un día normalmente). Los valores
estadísticos que calculamos son: media, desviación típica, máximo y mínimo. De esta forma, cada
periodo se puede representar como un punto de 4 dimensiones.
Particionamos una serie temporal en períodos y calculamos estadísticas para
cada período
¿Por qué calculamos estas 4 dimensiones y no otras? ¿Por qué no calculamos otras
características (features)?
Resulta que tenemos en mente usar técnicas semi-supervisadas basadas en distancias. Para este
tipo de técnicas debemos intentar reducir al máximo el número de dimensiones para que la
maldición de la dimensión nos afecte lo menos posible. Además resulta que tenemos un sistema
que ofrece estas estadísticas ya precalculadas.
Calculamos dónde estaría el punto del periodo que nos interesa investigar. Normalmente las
últimas 24 horas. Representamos este punto en rojo en la figura. Podemos ver que hay dos casos:
Para dramatizar más este ejemplo, me he asegurado de que el punto rojo esté exactamente a la
misma distancia del punto azul más cercano en los dos casos (izquierda y derecha).
Esto quiere decir que no podemos poner un umbral de distancia e informar a los operadores que si
la distancia entre el punto nuevo y el más cercano conocido sobrepasa este umbral debe ser
investigado. Esto provocaría un número muy alto de alarmas falsas o que no se detectaran
comportamientos inusuales. Dicho de otra forma, cualquier umbral de distancia que escogiésemos
sería el equivocado.
En el caso de la izquierda, los puntos están muy cerca entre ellos. Así que si algún punto está un
poco más lejos, ya podemos decir que es raro. En el caso de la derecha, los puntos están más
dispersos. Así que necesitamos una distancia mayor para decir que el comportamiento es inusual.
Algunas veces, cuando he explicado esta intuición me han preguntado si se podría solucionar con
clustering. En principio, esto es diferente. No nos interesa saber que grupos hay, ni cuántos
grupos hay, ni sabríamos qué hacer con la información de los grupos. No, no es clustering.
Para calcular la probabilidad de que un dato sea atípico, primero mira a los k datos más cercanos
y calcula su densidad. Para zonas muy densas, una distancia pequeña bastará para tener una
mayor probabilidad de comportamiento inusual. Para zonas dispersas, se necesitará una mayor
distancia para una alta probabilidad de comportamiento raro.
En la figura vemos una intuición gráfica en 2 dimensiones. Los números que vemos se
corresponden a la probabilidad de que un dato sea un outlier. Las probabilidades están en el
rango [0, 1].
Técnica Local Outlier Probabilities para detección de anomalías
La técnica de Local Outlier Factors tiene muchas ventajas para nuestro problema de detección de
anomalías:
Local Outlier Probabilities es una técnica de detección de outliers. La hemos adaptado para
detectar comportamiento nuevo. La adaptación es simple: solo calculamos la probabilidad de
comportamiento atípico en los datos nuevos.
«Salsa secreta» para reducir el número de anomalías falsas
Si usaras la técnica de Local Outlier Probabilities tal y como hemos descrito hasta ahora te iría
bastante bien, pero todavía tendrías anomalías falsas. Así que ahora te revelamos la «salsa
secreta» para reducir al mínimo el número de anomalías.
Cuanto más estables sean las estadísticas, más fácil es que tengas pocas anomalías falsas con
relativamente pocos datos.
En algunos casos, elegimos para algunos satélites periodicidades de 90 – 100 minutos (que viene
a ser una órbita para los satélites de observación de la Tierra). Pero teníamos varias anomalías
falsas. Nos dimos cuenta que nos iba mucho mejor con periodos de 1 día.
Las estadísticas diarias son más estables. Además las estadísticas diarias capturan mejor la rutina
en operaciones.
Como hemos indicado anteriormente, los datos los preparamos calculando valores estadísticos
diarios. Si los datos no están completos, esto puede llevarnos a estadísticas incorrectas que
pueden interpretarse como un dato atípico.
Los datos de telemetría no están disponibles inmediatamente. Hay que esperar a que el satélite se
comunique con alguna estación de tierra. Aun así, puede que los datos que se descargen no estén
completos. Así que habrá que esperar hasta la próxima oportunidad de comunicación hasta que
los datos estén «consolidados»
Local Outlier Probabilities calcula las probabilidades estimando la densidad de los k puntos más
cercanos. El valor de k es un poco arbitrario y podemos obtener valores diferentes probabilidades
dependiendo del k que elijamos.
Queremos conseguir reducir al máximo posible el número de anomalías falsas. También queremos
que los resultados sea obvios para los operadores. Así que hemos decidido que si un
comportamiento es inusual, lo será independientemente del hiper-parámetro k que elijamos.
En la práctica, esto se traduce que calcular las probabilidades de que un dato sea atípico para
varios valores de k (por ejemplo, k={5, 10, 20, 30}). La probabilidad final será la probabilidad
mínima.
Cada vez que intentemos detectar anomalías corremos el riesgo de detectar anomalías falsas. A
riesgo de decir una obviedad, cuantas menos veces detectemos anomalías, menos oportunidades
tendremos de encontrar anomalías falsas.
En nuestro caso detectamos anomalías una vez al día. Esto es suficiente porque el tipo de
anomalías que vamos buscando son las anomalías que son difíciles de identificar con el control de
límites (out-of-limits). El control de límites detecta las anomalías tan pronto como los datos están
disponibles.
Si el número de anomalías falsas aumenta, probablemente sea hora de añadir como ejemplos de
datos nominales datos nuevos. Por ejemplo, si hay un satélite que va camino de Marte, llega a
Marte, habrá muchas cosas que cambien en la forma en la que es operado. Nos irá mejor
añadiendo ejemplos nominales orbitando alrededor de Marte y, eventualmente, eliminando los
datos nominales correspondientes a la trayectoria.
Algunos ejemplos
Termistor en XMM-Newton
Muchos de los instrumentos de los satélites necesitan estar en unas condiciones de temperatura
controladas para que funcionen correctamente. Esto se consigue usando termistores. Los
termistores permiten calentar una parte del satélite cerrando un circuito cuando la temperatura
baja de un cierto umbral inferior. Cuando la temperatura sube de un umbral superior, el termistor
abre el circuito y deja de calentar.
A continuación vamos a ver una anomalía que ocurrió en el satélite XMM-Newton, descrita por el
equipo de control de vuelo (la traducción al español y la negrita son mías):
«Notamos que el termistor T6073 empezó a tener un comportamiento extraño desde mediados de
mayo de 2009, 2 meses antes que de la anomalía se detectara. El rango del termistor redució la
temperatura cuando se abría y empezó a disminuir, un signo del deterioro del límite superior,
incluso si el límite inferior era respetado, hasta mediados de Julio, cuando el límite superior y el
inferior se situaron uno my cerca del otro.
El termistor empezó a oscilar, en una rango estrecho de temperatura, hasta que no se cerró más a
la temperatura correcta, y dejó que la temperatura bajara casi hasta los 22 grados. La primera
bajada de temperatura no fue detectada porque no generó ninguna alerta en el control de
límites. Después de esta bajada, el termistor tuvo algunos ciclos nominales, pero el 13 de julio de
2009, la temperatura bajó de nueva hasta 21.25 grados, causando una alarma en el control de
límites y permitiendo que el equipo de control de vuelo detectara el problema.»
Como vemos, nuestro sistema de detección de anomalías detectó la anomalía a finales de mayo,
2 meses antes de que el sistema de control de límites la detectara. Este ejemplo demuestra que
puede haber comportamientos anómalos aunque ocurran dentro de los límites monitorizados. De
hecho, en este caso la anomalía era que el comportamiento medido por el sensor estaba más en
límites que en el caso nominal.
En el momento de la detección no hubiésemos sabido si las lecturas del sensor hubieran salido de
límites en una semana o en 2 meses, como en este caso. Pero sí es suficiente para alertar al
equipo de control de vuelo para que investiguen si esto representa un problema.
Seguramente al mirar esta figura, y este comportamiento se te ocurran varias ideas simples para
haber detectado este anomalía. Si te está pasando, no eres el primero. El reto consiste en
encontrar un sistema de detección de anomalías que detecte todos los comportamiento inusuales,
sin saber cómo van a ser, en cualquier tipo de sensor. Y con muy pocas anomalías falsas!
Otros ejemplos
El caso de XMM-Newton fue el primero donde probamos la eficacia de este método de detección
de anomalías. Desde entonces lo hemos seguido usando en operaciones espaciales y tenemos
bastantes más ejemplos de detecciones que ha resultado en investigaciones de comportamientos
inusuales.
No los hemos publicado de forma oficial. Si alguna vez lo hacemos actualizaré este artículo.
Fuertes, Sylvain, Gilles Picart, Jean-Yves Tourneret, Lotfi Chaari, André Ferrari, and Cédric
Richard. «Improving spacecraft health monitoring with automatic anomaly detection
techniques.» In 14th International Conference on Space Operations, p. 2430. 2016.
OMeara, Corey, Leonard Schlag, Luisa Faltenbacher, and Martin Wickler. «ATHMoS:
Automated telemetry health monitoring system at GSOC using outlier detection and
supervised machine learning.» In 14th International Conference on Space Operations, p.
2347. 2016.
Verzola, Ivano, Alessandro Donati, Jose Martinez, Matthias Schubert, and Laszlo Somodi.
«Project Sibyl: A Novelty Detection System for Human Spaceflight Operations.» In 14th
International Conference on Space Operations, p. 2405. 2016.
OMeara, Corey, Leonard Schlag, and Martin Wickler. «Applications of deep learning neural
networks to satellite telemetry monitoring.» In 2018 SpaceOps Conference, p. 2558. 2018.
Hundman, Kyle, Valentino Constantinou, Christopher Laporte, Ian Colwell, and Tom
Soderstrom. «Detecting spacecraft anomalies using lstms and nonparametric dynamic
thresholding.» In Proceedings of the 24th ACM SIGKDD international conference on
knowledge discovery & data mining, pp. 387-395. 2018.
Trollope, Ed, Richard Dyer, Tiago Francisco, James Miller, Mauro Pagan Griso, and
Alessandro Argemandy. «Analysis of automated techniques for routine monitoring and
contingency detection of in-flight LEO operations at EUMETSAT.» In 2018 SpaceOps
Conference, p. 2532. 2018.
Pilastre, Barbara, Loic Boussouf, Stéphane d’Escrivan, and Jean-Yves Tourneret. «Anomaly
detection in mixed telemetry data using a sparse representation and dictionary
learning.» Signal Processing 168 (2020): 107320.
Y muchos más …
La verdad es que es difícil saberlo. El «problema» reside en que hay muy pocas anomalías en
realidad. Esto es estupendo para las operaciones espaciales, pero no está tan bien para
aprendizaje automático.
Cuando hay tan pocas anomalías es muy difícil comparar el rendimiento de distintas soluciones.
Por este motivo, estamos trabajando en la creación de un conjunto de datos de anomalías en
operaciones espaciales, posiblemente combinando datos de varios satélites, para que se convierta
en una especie de «benchmark dataset».
Recursos
[vídeo] donde explico (en inglés) cómo funciona nuestra detección de anomalías entre otras
cosas.
El artículo donde explicamos nuestra solución: Martínez-Heras, José-Antonio, and
Alessandro Donati. «Enhanced telemetry monitoring with novelty detection.» AI
Magazine 35, no. 4 (2014): 37-46.
El artículo que explica la técnica Local Outliers Probabilites: Kriegel, Hans-Peter, Peer
Kröger, Erich Schubert, and Arthur Zimek. «LoOP: local outlier probabilities.»
In Proceedings of the 18th ACM conference on Information and knowledge management,
pp. 1649-1652. 2009.
Resumen
En este artículo hemos presentado los retos que tenemos que afrontar al intentar detectar
anomalías automáticamente en operaciones espaciales y cómo los hemos afrontado. Así mismo,
proporcionamos algunas recomendaciones (la «salsa secreta»).
También hemos visto un ejemplo de detección de anomalía con el satélite XMM-Newton y hemos
listado otras soluciones usadas por diferentes operadores de satélites.
Por último hemos visto algunos recursos que incluyen cómo detectar anomalías usando librerías
en python.
TorchServe para servir modelos de PyTorch
Por Álvaro Bartolomé del Canto
21/01/2021
A lo largo de este repositorio podrás encontrar una guía sobre cómo entrenar y desplegar/servir un
modelo de transfer learning basado en una red neuronal convolucional (CNN) con ResNet como
backbone, cuyo objetivo es clasificar imágenes, del popular conjunto de datos Food101, en
categorías.
AVISO: TorchServe está aún en fase experimental y, por tanto, sujeto a cambios.
Requisitos
Antes de comenzar, tendrás que asegurarte de que tienes todas las dependencias necesarias
instaladas o, en caso de no tenerlas, instalarlas.
Primero tienes que comprobar que tienes el JDK 11 de Java instalado, ya que es un requisito de
torchserve a la hora de desplegar los modelos, ya que expone las APIs utilizando Java.
A continuación, puedes proceder con la instalación de los paquetes de Python necesarios tanto
para entrenar como para servir el modelo de PyTorch. De este modo, para instalarlo puedes
utilizar el siguiente comando:
Conjunto de Datos
El conjunto de datos a utilizar para el entrenamiento del modelo para la clasifacación de imágenes
en categorías es Food101. En este caso, dado que esto es una guía, no se utilizará el conjunto de
datos completo, sino que se utilizará un fragmento reducido del mismo, en este caso,
aproximadamente el 10% del total, abarcando tan solo 10 clases/categorías de las 101
disponibles.
El conjunto de datos original contiene imágenes de 101 categorías de comida distintas, con un
total de 101.000 imágenes. Así, para cada clase, hay 750 imágenes para el entrenamiento y 250
imágenes para la evaluación del modelo. Las imágenes del conjunto de datos de evaluación han
sido etiquetadas manualmente, mientras que en las de entrenamiento puede existir algo de ruido,
principalmente en forma de imágenes con colores intensos o etiquetas erróneas. Por último
mencionar que todas las imágenes han sido rescaladas con el fin de que tengan un tamaño
máximo de 512 píxeles (bien de largo o bien de ancho).
Modelado
Comenzaremos con la creación de un modelo de transfer learning a partir del backbone ResNet
con un conjunto pre-entrenado de pesos, entrenado y evaluado con el conjunto de datos
ImageNet, que es el estado del arte en lo que a clasificación de imágenes se refiere.
En este caso, queremos servir un modelo de PyTorch por lo que partiremos de la implementación
de ResNet de PyTorch y, más concretamente, ResNet18, que es la implementación de ResNet
que contiene 18 capas convolucionales.
Por tanto, cargaremos dicho modelo a partir de los pesos pre-entrenados desde el Hub de
PyTorch y los congelaremos puesto que no nos interesa modificarlos dado que la idea del transfer
learning es que ya se han ajustado para obtener el mejor resultado posible sobre el conjunto de
datos ImageNet. Para cargar el modelo de PyTorch desde el Hub podemos utilizar el siguiente
fragmento de código:
Una vez cargado el modelo, necesitamos actualizar la capa fc, cuyas siglas del inglés significan
Fully Connected, y es la última capa del modelo que define las neuronas de salida. En este caso
concreto, incluimos una capa secuencial que se añadirá tras las capas convolucionales del modelo
original, dado que el objetivo es optimizar los pesos de dicha capa para obtener los mejores
resultados sobre el conjunto de datos de evaluación que estamos utilizando. Así la capa
secuencial incluida es la que se muestra en el siguiente bloque de código:
1. import torch.nn as nn
2.
3. sequential_layer = nn.Sequential(
4. nn.Linear(model.fc.in_features, 128),
5. nn.ReLU(),
6. nn.Dropout(.2),
7. nn.Linear(128, 10),
8. nn.LogSoftmax(dim=1)
9. )
10.
11. model.fc = sequential_layer
Tras determinar la arquitectura de la red, se procederá a entrenar dicho modelo con el conjunto de
datos de entrenamiento que contiene 750 imágenes y que ha sido divido en dos sub-conjuntos,
uno para el entrenamiento y uno para la validación con una separación del 80-20%,
respectivamente. Dicha separación se realiza para poder estimar durante el entrenamiento del
modelo cómo se comportará el modelo ante ejemplos no vistos previamente y, por tanto, para
poder estimar como funcionará el modelo cuando se le pase el conjunto de prueba que contiene
2500 imágenes.
Nota: para más detalles en lo que a la creación y entrenamiento del modelo de transfer learning se
refiere, puedes observar el código desarrollado en notebooks/transfer-learning.ipynb a modo de
ejemplo.
Tras entrenar el modelo se procederá a exportar el modelo desde el state_dict a un fichero «.pth»,
el cual contiene el conjunto pre-entrenado de pesos que más adelante se podrá cargar de nuevo,
con el código mostrado a continuación:
1. torch.save(model.state_dict(), '../model/foodnet_resnet18.pth')
Tras generar fichero exportable del modelo ya entrenado, por lo que tenemos a asegurarnos de
que se ha exportado previamente, comprobando que se carga correctamente. Para poder realizar
esta comprobación es importante que la arquitectura del modelo esté propiamente definida, dado
que se requiere de la arquitectura de la red para poder cargar los pesos pre-entrenados sobre
dicha red.
Puesto que hemos utilizado transfer learning a partir de un modelo para clasificación de imágenes
pre-entrenado pero modificando tanto la última capa como ajustado los pesos de la misma,
tenemos que modificar también la arquitectura original de ResNet18 definida en una clase de
Python en torchvision/models/segmentation. El código original de PyTorch del modelo ResNet18
es el siguiente:
De este modo creamos una nueva clase de Python llamada ImageClassifier que hereda de la
clase base de ResNet definida por PyTorch en torchvision. Tenemos que inicializar dicha clase
con nuestra arquitectura, puesto que modificamos la última capa de la arquitectura de la red
original ResNet18, pero antes hay que definir la arquitectura base de ResNet18 aunque
modifiquemos el número clases de salida, que en este caso serán 10 clases de Food101 como se
ha mencionado previamente.
Así ahora ya podremos comprobar si los pesos del modelo que hemos exportado se pueden
cargar propiamente en la clase ImageClassifier con el siguiente fragmento de código:
1. model = ImageClassifier()
2. model.load_state_dict(torch.load("../model/foodnet_resnet18.pth"))
Así, la salida del fragmento de código anterior tras la carga del modelo, ha de ser <All keys
matched successfully>, en caso de haber tenido éxito.
Nota: el modelo ha sido entrenado con una tarjeta gráfica NVIDIA GeForce GTX 1070 8GB GPU
con CUDA 11. En caso de no conocer los requisitos de la tarjeta gráfica de tu sistema, puedes
utilizar el comando nvidia-smi, que también te indicará si los drivers de NVIDIA y CUDA están
correctamente instalados. Además, para comprobar si PyTorch está haciendo uso de la GPU
disponible en el sistema o no, puedes utilizar el fragmento de código presentado a continuación:
1. import torch
2. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
3. torch.cuda.get_device_name(0)
Despliegue
Finalmente, de cara a desplegar el modelo necesitarás reproducir la siguiente secuencia de pasos
tras haber instalado todos los requisitos previamente mencionados y disponer del modelo
entrenado, tal y como se ha descrito previamente.
1. Generar el fichero MAR
Inicialmente se ha de generar el fichero MAR, que es un fichero listo para servir y que contiene el
modelo completo generado con torch-model-archiver a partir del state_dict exportado
previamente. Para generar así el fichero MAR tienes que utilizar el siguiente comando:
--model-name: indica el nombre del modelo en formato MAR que vamos a generar.
--version: se refiere a la version del modelo, lo cual es una buena práctica a la hora de
mantener los modelos puesto que se degradan con el tiempo.
--model-file: contiene el fichero de Python que contiene la clase con la arquitectura del
modelo que vamos a servir.
--serialized-file: contiene el state dict con los pesos del modelo ya entrenado.
--handler: especifica el cómo se van a manejar los datos en las llamadas a dicho modelo,
por lo que incluye tanto el preprocesamiento como el postprocesamiento.
--extra-files: dado que este es un problema de clasificación de imágenes, se puede
incluir un fichero JSON que contenga las relaciones entre los IDs que asigna el modelo con
los nombres de las categorías o etiquetas asignadas a cada uno de los IDs.
Por último, mencionar que no se requiere crear handlers personalizados puesto que los
disponibles en TorchServeson bastante útiles, pero en caso de necesitar redefinir cualquiera de los
procesos, preprocesamiento o postprocesamiento, se podrá crear uno personalizado como el
presentado en este proyecto.
Una vez generado el fichero MAR, tienes que moverlo al directorio deployment/model-store que
contendrá tanto este modelo como el resto de modelos puesto que a TorchServe se le indica el
directorio sobre el cual ha de leer los modelos de PyTorch para servirlos más adelante.
1. mv foodnet_resnet18.mar deployment/model-store/
Puedes encontrar más información sobre torch-model-archiver en Torch Model Archiver for
TorchServe.
2. Desplegar TorchServe
Una vez que se haya generado un fichero MAR para servir, tan solo se necesita proceder con el
despliegue de TorchServe. Así el proceso de servir un modelo pre-entrenado de PyTorch en
formato MAR comienza con el despliegue de las APIs REST de TorchServe, que son las llamadas:
Inference API, Management API y Metris API, que se despliegan en el localhost o, lo que es lo
mismo, la IP 127.0.0.1, en los puertos 8080, 8081 y 8082, respectivamente.
De este modo, el comando para desplegar TorchServe junto con el modelo MAR generado
previamente, disponible en el directorio deployment/model-store/, es el siguiente:
--start: indica que el servicio de TorchServe se va a desplegar (es decir, las APIs).
--ncs: indica que se desactivará el snapshot para no hacer una copia del contenido de la
API, lo cual reduce los tiempos de despliegue, pero por seguridad se puede activar (sin
poner dicho flag).
--ts-config: especifica la configuración del despliegue a utilizar desde el fichero de
configuración.
--model-store: indica el directorio desde el cual se van a leer los ficheros MAR listos para
ser servidos (expuestos como un endpoint de las APIs).
--models: especifica los nombres de los modelos a utilizar, de modo que a cada uno de los
modelos disponibles, bajo el directorio mencionado previamente, se les podrá asignar un
alias que será a través del cual se creará el endpoint para acceder a dicho modelo desde
las APIs REST. Sino, se utilizarían los nombres por defecto del fichero, pero lo
recomendable es especificar manualmente el nombre de todos los modelos a servir con el
formato: endpoint=model_name.mar.
Nota: otra forma de proceder en el despliegue consiste en desplegar primero TorchServe sin
ningún modelo indicado en tiempo de despliegue y, en su defecto, registrar el modelo o modelos a
través de la API de Management (que también permite gestionar los workers asignados a cada
modelo entre otras cosas).
1. curl http://localhost:8080/ping
Si todo ha ido como se esperaba, debería de mostrar una salida similar a la siguiente:
1. {
2. "status": "Healthy"
3. }
Nota: si el estado del health check es "Unhealthy", deberías de comprobar los logs de
TorchServe para comprobar que el despliegue fue correctamente y, en caso de no haber ido bien,
identificar el error e intentar resolverlo.
Al desplegar o intentar desplegar TorchServe, se creará automáticamente un directorio, desde
donde se usó el comando, llamado logs/, donde poder comprobar si el despliegue ha ido como
se esperaba.
4. Parar TorchServe
Una vez se «termine» de utilizar TorchServe con idea de no utilizarlo más, puedes pararlo de
forma elegante con el siguiente comando:
1. torchserve --stop
Así la próxima vez que despliegues TorchServe, tardará menos tiempo puesto que en el primer
despliegue, tanto los modelos especificados durante el despliegue como los modelos registrados
más adelante, serán cacheados, de modo que en los siguientes despliegues de TorchServe,
dichos modelos no requerirán ser registrados de nuevo por estar ya en caché.
Docker
Con el fin de reproducir el despliegue de TorchServe, tal y como se ha descrito antes, en una
imagen de Docker sobre Ubuntu, tendrás que asegurarte de tener Docker instalado en tu máquina
y proceder con la ejecución de los comandos presentados a continuación:
Uso
Una vez que has completado con éxito todos los pasos descritos previamente, puedes probar las
APIs desplegadas por TorchServe enviando peticiones de ejemplo al modelo que está siendo
servido. En este caso, dado que es un problema de clasificación de imágenes, se utilizará una
imagen que se pueda englobar en alguna de las categorías sobre las que hace la inferencia el
modelo. De este modo, una vez dispongamos de una imagen válida, podremos enviar la petición
HTTP POST con el contenido de la imagen en el cuerpo de la petición de la forma:
1. wget https://raw.githubusercontent.com/alvarobartt/pytorch-model-
serving/master/images/sample.jpg
2. curl -X POST http://localhost:8080/predictions/foodnet -T sample.jpg
Que, si todo ha ido bien, debería de devolver una salida en formato JSON como la que se muestra
a continuación:
1. {
2. "hamburger": 0.6911126375198364,
3. "grilled_salmon": 0.11039528995752335,
4. "pizza": 0.039219316095113754,
5. "steak": 0.03642556071281433,
6. "chicken_curry": 0.03306535258889198,
7. "sushi": 0.028345594182610512,
8. "chicken_wings": 0.027532529085874557,
9. "fried_rice": 0.01296720840036869,
10. "ice_cream": 0.012180349789559841,
11. "ramen": 0.008756187744438648
12. }
Recuerda: el hecho de que la respuesta de la petición HTTP POST a TorchServe esté formateada
con los nombres originales de cada una de las categorías de comida, se debe a que durante la
creación del fichero MAR se especifico el índice al que correspondía cada categoría, en el fichero
index_to_name.json. Así TorchServe realiza la asignación de índices a categorías de forma
automática al responder a la petición a la API para la inferencia, de modo que es más clara.
Así los comandos presentados anteriormente se traducen en código de Python de la forma
presentada en el siguiente bloque:
Nota: en caso de querer ejecutar un script con el código proporcionado anteriormente, se requiren
más requisitos de los mencionados previamente en la sección de requisitos, con lo que para
instalarlos, puedes utilizar el siguiente comando:
Contacto
Se puede encontrar todo el código fuente y los recursos mencionados en: alvarobartt/serving-
pytorch-models. Y para contactar directamente conmigo podéis realizarlo bien a través de Twitter o
bien a través de GitHub.
Créditos
Finalmente, mencionar que el fragmento del conjunto de datos utilizadoa ha sido realizado por
Daniel Bourke, y algunas tips referentes a servir modelos de PyTorch basados en Transfer
Learning con TorchServe descritas por Prashant Sail.
Algoritmos Genéticos y Memoria Visual
Por Alan Lopez
26/01/2021
Los algoritmos genéticos forman parte de la llamada computación evolutiva, que a su vez suele
clasificarse dentro de las técnicas de Inteligencia Artificial. ¿Qué aplicaciones tienen los algoritmos
genéticos? En este artículo aprenderás dos cosas: 1. Cómo se construye un algoritmo genético
simple, y 2. Cómo aplicar un algoritmo genético en la creación de un mapa visual para la
navegación de robots.
En un algoritmo genético, los individuos pueden ser codificados como cadenas binarias, que
representan el cromosoma o genotipo del individuo. Por otra parte, el valor real al que codifica el
genotipo es llamado fenotipo. Por ejemplo la cadena binaria 1010 sería el genotipo, mientras que
el fenotipo sería 10.
Son las cadenas binarias las que pasan por operaciones de recombinación genética y mutaciones.
De forma más particular, un algoritmo genético simple ejecuta tres operaciones básicas:
1. Reproducción
2. Cruza
3. Mutación
Reproducción
Uno de los métodos más usado para la selección de individuos es la llamada rueda de ruleta. Este
método asigna un porcentaje de la ruleta, es decir una probabilidad, a cada individuo según su
aptitud; donde el 100% de la ruleta es la suma de las aptitudes. Como ejemplo, observa la ruleta
que se construye para una población de cuatro individuos con aptitudes: 25, 784, 441 y 961.
Cruza
La cruza es un operador que lleva a cabo el intercambio de información genética de dos individuos
de la población, a los que llamaremos padres, en el cual se combinan sus genes, que son los bits
de las cadenas binarias, para generar descendencia o hijos. Toma por ejemplo la cruza de estas
dos cadenas binarias.
10|10
⇒ 1000
11|00
Mutación
La mutación modifica bits de la cadena binaria de forma aleatoria con cierta probabilidad. Una
mutación se vería así:
1000 ⇒ 1001
El objetivo de la mutación es generar nuevos individuos o hijos que formarán parte de la nueva
población. Este operador permite la variabilidad en la población, con la finalidad de no quedar
estancado en un máximo o mínimo local. Eso contribuye a la exploración de todo el espacio de
búsqueda evitando así la convergencia prematura.
Los distintos algoritmos genéticos que se pueden formular responden a un esquema básico
común, y comparten una serie de propiedades:
Observa la gráfica para la función f(x) = x^3 + 10x^2 – 37x + 26. En este caso, x es el único
parámetro. El problema consiste en encontrar el valor de x que optimice (maximice) la función.
La gráfica representa los distintos valores de la función de aptitud también llamada función
objetivo. Como puedes observar, de los tres valores señalados, el punto rojo tiene mejor función
de aptitud.
El algoritmo elige de forma aleatoria una población inicial con individuos: 15, 31, 3 y 12, cuya
codificación, valor de aptitud y porcentaje en la ruleta se muestran en la siguiente tabla.
Observa una simulación de 4 iteraciones o generaciones.
En la primera iteración del algoritmo se encuentra una nueva población con individuos: 15, 31, 31
y 31. Se observa que la aptitud máxima se mantuvo y que los mejores individuos fueron
seleccionados para la cruza. La gráfica anterior muestra la evolución de la población, en cada
iteración de los algoritmos de reproducción y cruza la función de aptitud mejoró en términos
generales. Sin embargo, al tratarse de un algoritmo basado en la probabilidad, la población no
siempre converge al máximo en la tercera iteración. Es posible que sean necesarias más
iteraciones para ciertas funciones objetivo.
Resolvamos el primer problema relacionado con el mapeo del ambiente de navegación. Este
trabajo fue publicado en The International Symposium on Optomechatronic Technology (ISOT)
[López-Martínez, A., 2019].
En la teoría, los tipos de mapas pueden ser divididos en dos familias: las geométricas y las
topológicas.
En las geométricas, el espacio de navegación se representa en un marco de referencia euclidiano;
se tiene información de las medidas métricas del ambiente de navegación.
En las representaciones topológicas, por otra parte, el ambiente es descrito de forma cualitativa,
es decir, un mapa sin información métrica del ambiente. En esta parte del artículo, te mostraré la
construcción de un mapa topológico en la forma de una memoria visual.
Memoria Visual
Una memoria visual es un mapa topológico que usa solamente información visual [Delfin, J.,
2018]. El sensor es una cámara proyectiva a bordo del robot, y las trayectorias por las cuales el
robot tiene permitido navegar se describen con un conjunto de imágenes (imágenes clave) que
caracterizan o describen el ambiente. A esta colección de imágenes la llamamos memoria visual.
Un ejemplo común de mapa topológico son los mapas de las estaciones de metro. Cuando ves el
mapa, no observas información métrica con la distancia entre estaciones. Más bien, obtienes
información sobre la posición relativa entre estaciones. Sin embargo, esta información parcial no
te impide navegar ya sea dentro del espacio nuevo que has explorado o dentro del sistema del
metro.
Comparemos el mapa de metro con la memoria visual. En la memoria visual cada imagen clave es
como una estación de metro. En la siguiente imagen, cada círculo representa distintos frames del
video capturado por la cámara del robot. Un círculo azul indica una imagen clave dentro de la
memoria visual.
Una ventaja de este tipo de mapas topológicos está en la cantidad de información necesaria para
navegar. Es mucho menos que la información de mapas 3D por ejemplo. Entre menos datos para
procesar, mejor eficiencia de procesamiento, y de almacenamiento de información. Existen
desventajas claro está ¿puedes pensar en algunas? Comenta este artículo.
Después, este conjunto de imágenes se procesa en la etapa dos, que busca reducir el número de
imágenes que conformarán la MV. Para lograr tal reducción, se seleccionan sólo algunas de las
imágenes del conjunto, que son llamadas imágenes clave (Los círculos azules que viste en la
imagen anterior). Para ello se analiza la similitud entre imágenes, o su traslape, y se desechan las
imágenes que no cumplen ciertos criterios. Tal selección también toma en cuenta el cumplimiento
de algunas hipótesis necesarias para el control del robot durante la navegación. Es en esta etapa
donde usaremos el algoritmo genético.
Una vez que se tiene un conjunto de imágenes clave, el cual denominamos conjunto M1, se
organizan la imágenes pertenecientes a éste para formar una representación topológica del
ambiente de navegación. Esto último ocurre en la etapa tres de la construcción de la memoria
visual. La siguiente imagen ilustra estos pasos.
Construcción de una Memoria Visual con Algoritmos Genéticos
La clave está en la geometría epipolar [Zisserman, R. H. A., 2004]. Esta geometría describe la
rotación y traslación de la cámara. Se pueden conocer estos movimientos cuando una imagen
observa un punto, y después se mueve (rotación o traslación) un poco sin dejar de observar el
mismo punto.
Para usar un algoritmo genético haremos lo siguiente. Cada individuo codificará una rotación y
traslación candidata.
donde
φ ∈ [0, 2π]
θ ∈ [0, 2π]
ψ ∈ [0, 2π]
tx ∈ [−5, 5]
ty ∈ [−5, 5]
Para calcular la aptitud de cada individuo se calcula qué tan bien describe la rotación y traslación
real. ¿Cómo sabemos cuál fue el movimiento real? Se deduce indirectamente con puntos
emparejados entre imágenes. Si la rotación y traslación codificada por el individuo explica
correctamente la posición de cada punto en la imagen, entonces tendrá una buena aptitud. Desde
luego que necesitamos un valor numérico para representar la aptitud, entonces se contará la
cantidad de puntos que concuerdan con la rotación y traslación propuesta por el individuo.
Todos los individuos pasarán un número determinado de generaciones, y serán modificados con
los operadores de selección, cruza y mutación. Al final, se escoge al mejor individuo como la
solución final. Conocer cuál fue la rotación y traslación de la cámara permite saber indirectamente
la cantidad de puntos nuevos en cada frame, y en consecuencia decidir qué imágenes aportan
más información para la memoria visual.
Cuando te mostré el ejemplo simple con la función f(x) = x^2 o la función f(x) = x^3 + 10x^2 – 37x
+ 26, tal vez pensaste ¿para qué usar un algoritmo genético? Bueno para estos ejemplos sí que
era innecesario. Sin embargo, para el problema de la selección de imágenes clave, ni siquiera
podemos graficar la función de aptitud. En este caso, los algoritmos genéticos son de ayuda.
La anterior es una explicación de muy alto nivel de cómo usar un algoritmo genético para la
construcción de un mapa visual topológico.
Sobre el autor
Referencias
1. López-Martínez, A., Cuevas, F. J., & Sosa-Balderas, J. V. (2019). Visual Memory
Construction for Autonomous Humanoid Robot Navigation. In Progress in Optomechatronic
Technologies (pp. 103-109). Springer, Singapore. Este artículo describe lo presentado en
este post.
2. David E. G. (1998). Genetic Algorithms in search, optimization and machine learning. pp 1-
25. Este libro fue escrito por el inventor de los algoritmos genéticos, ilustra a mayor detalle
cómo funcionan.
3. Van Veen H., Distler H., Braun S., and Bulthoff H. (1998). Navigating through a virtual city:
Using virtual reality technology to study human action and perception. Journal, Future
Generation Computer Systems. Vol. 14. No. 3-4, pp 231-242. El artículo muestra cómo
navegamos por un ambiente nuevo los humanos.
4. Delfin, J., Becerra, H. M., & Arechavaleta, G. (2018). Humanoid navigation using a visual
memory with obstacle avoidance. Robotics and Autonomous Systems, 109, 109-124. En
este artículo se explica cómo generar las leyes de control adecuadas para permitir la
navegación autónoma dentro de una memoria visual con un robot humanoide Nao.
5. Zisserman, R. H. A. (2004). Multiple view geometry in computer vision. Este libro muestra
cómo usar información visual (a partir de imágenes) para diversas aplicaciones como
structure from motion, reconstrucción 3D o entendimiento de la escena.
Segmentación de Imágenes con Redes Convolucionales
Por Daniel Iglesias
18/04/2021
En este post vamos a hablar sobre un área muy influenciada por la inteligencia artificial como es la
visión artificial, concretamente en lo que se denomina como segmentación de imágenes, para
introducir posteriormente el uso del Deep Learning y, de forma más específica, las redes
convolucionales y su potencial uso en este ámbito.
Esto nos ahorraría muchísimo tiempo en el caso de tener, por ejemplo, 500 imágenes. En cada
imagen, la cuenta nos podría llevar 2 minutos, por poner un tiempo razonable. Ahora imagínate
escalar eso a 2 minutos por 500 imágenes. Probablemente te llevaría días e incluso semanas,
porque una tarea tan monótona te acabaría agotando y no podrías hacer todo de una tirada.
Para conseguir esto, las estrategias de visión artificial son, sin ninguna duda, lo más apropiado
para el problema. Pero… ¿cómo podríamos conseguir resolver este problema tan concreto?
Teniendo en cuenta que en una imagen del fondo marino hay muchas cosas, para el método de
visión no sería trivial encontrar los peces. Para ello, necesitaría eliminar todos los datos que no
sean relevantes y centrarse exclusivamente en aquello que sea un pez.
Ejemplo de segmentación manual de los peces en las imágenes. Las siluetas blancas se
corresponden con los píxeles que caen dentro de un pez.
Observamos que estas imágenes se caracterizan por tener a muchos peces que se superponen
sobre otros, lo cual hace difícil hacerle entender al método si ahí hay un pez o hay varios. Del
mismo modo, hay peces que quedan parcialmente ocultos por algún elemento submarino,
haciendo todavía más difícil ese conteo preciso.
Probablemente dirás «qué ejemplo tan mal escogido». Pues lo cierto es que nos ha parecido
interesante, ya que representa muy bien los problemas a los que nos enfrentamos cuando
queremos desarrollar un sistema de visión artificial. A menudo, nos encontramos ejemplos como
un caballo en un campo, en una imagen muy bien hecha, con buen contraste y con el caballo bien
encuadrado. Pero lo cierto es que, en la vida real, debemos prepararnos para cualquier problema
que pueda surgir.
Cabe destacar que los principales métodos de segmentación de imágenes se pueden encontrar ya
implementados en librerías como OpenCV o Scikit-Image, las cuales están disponibles para
Python y son muy fácilmente instalables con sistemas de gestión de paquetes como es el caso de
pip.
Ejemplo de segmentación de objetos en una imagen con un método de umbralización.
Fuente: ¿Cómo umbralizar una imagen con OpenCV en Python? – AprendiendoInformatica.net
Para que te hagas a la idea, nosotros hemos segmentado manualmente la imagen que se
mostraba más arriba de una forma bastante burda y ya nos ha resultado bastante tedioso.
Además, estamos seguros de que, durante el proceso, se nos ha escapado algún pez, que
probablemente caiga en una zona de muy bajo brillo. Nuevamente, esto es significativo de lo
complicado que resulta segmentar manualmente imágenes y, sobre todo, lo tedioso que llegaría a
ser en caso de que no fuera 1 si no muchísimas más.
Además, el Deep Learning se ha presentado como una solución mucho más óptima e inmediata
para realizar la segmentación de una imagen. En visión artificial, concretamente, una arquitectura
de red profunda muy utilizada es la de las redes convolucionales.
Esta estrategia intenta solventar el gran tamaño que podrían tener las redes totalmente
conectadas en caso de utilizar alguna arquitectura profunda con una enorme cantidad se capas.
En las redes fully connected, todas las neuronas de una capa se conectan con todas las neuronas
de la capa siguiente. En lugar de esto, las redes convolucionales utilizan un esquema de
conectividad local. Eso permite reducir el número de conexiones entre las neuronas y reducir el
tamaño de las redes profundas, que ya de por sí consumen una enorme cantidad de memoria.
La figura que se muestra más arriba, de una típica arquitectura de red convolucional, tiene unas
capas que se llaman «convolution», otras que se llaman «pooling» y una capa totalmente
conectada al final. Esto es muy común en las redes convolucionales que se usan para
clasificación.
Por una parte, las capas de «convolution» permiten extraer características de manera automática
de las imágenes. Por otra parte, las capas de «pooling» reducen la dimensionalidad de la imagen
poco a poco, para llegar finalmente a un vector de características que representará la entrada a
una red «fully connected». La ventaja de hacer esto es que, aunque tengamos una red profunda,
la única red fully connected tendrá el tamaño equiparable al de un perceptrón multicapa, es decir,
algo mucho más asumible que una red fully connected con cientos de capas.
Capas convolucionales
Este esquema de conectividad local se consigue por medio de las convoluciones (de ahí recibe el
nombre la arquitectura de red). Para simplificar, una convolución es una operación matricial que,
en el contexto de las imágenes, permite realizar un filtrado sobre las mismas. En otras palabras,
por medio de una convolución puedes realizar filtros muy útiles como eliminar toda la información
que no sea un borde o difuminar la imagen.
La idea de todo esto no es solo reducir el tamaño de la arquitectura a nivel de conexiones entre
neuronas, si no también conseguir un modelo de aprendizaje que sea capaz de aprender a filtrar
las características más relevantes de una imagen de modo totalmente automático. De hecho, las
redes convolucionales se caracterizan por tener una enorme cantidad de filtros diferentes.
A nivel de optimización de red neuronal, todo esto significa que el modelo actualizará los
coeficientes del kernel convolucional para filtrar las imágenes del modo que el modelo considera
oportuno.
Esto es muy ventajoso ya que, entre otras cosas, nos permite que el tamaño de la imagen de
entrada sea variable ya que al tener una capa totalmente conectada lo más probable es que la red
se entrene con un tamaño de imagen fijo y que solo se le pueda pasar una imagen de ese mismo
tamaño en la fase de predicción (es decir, una vez que estamos usando el modelo ya entrenado).
En los últimos años, se han hecho muchos esfuerzos para solventar ese problema. Para ello, se
pueden utilizar estrategias como el data augmentation, que básicamente pretende aumentar el
tamaño de un conjunto de imágenes de manera artificial, es decir, sin necesidad de añadir
ejemplos etiquetados nuevos.
Con todas las ideas mencionadas hasta ahora en mente y, conociendo los conceptos
fundamentales sobre redes neuronales, el entrenamiento de una red convolucional es muy trivial.
Sencillamente, le pasaremos una imagen al sistema, obtendremos una salida y la compararemos
con su correspondiente ground truth. En esa comparación, se utilizará una función de error cuyo
valor será retropropagado a los pesos de la red para que poco a poco su salida se optimice y
alcance el comportamiento deseado.
Resumen
En resumidas cuentas, la segmentación de imágenes es un proceso de la visión artificial con el
cual nos quedamos con la información que nos importa de una imagen para un problema
concreto, eliminando cualquier otra cosa. Generalmente, esta segmentación será representada
con una nueva imagen donde solo se puedan ver las siluetas de los objetos de interés.
Sin embargo, en la actualidad, el auge se encuentra en el Deep Learning que, con las
arquitecturas de red convolucionales, es capaz de recibir una imagen como entrada y devolver
directamente la segmentación a la salida.
Es muy importante disponer de datos etiquetados manualmente pero, por desgracia, es muy
común que esto no sea así. Para evitarlo, se puede recurrir a estrategias de data augmentation,
para incrementar el tamaño del conjunto de imágenes original de manera totalmente artificial, es
decir, sin necesidad de etiquetar nuevos ejemplos de imágenes.
Fuentes
(Chen et. al, 2017) – L.-C. Chen, G. Papandreou, F. Schroff, and H. Adam, “Rethinking atrous
convolution for semantic image segmentation,” arXiv preprint arXiv:1706.05587, 2017.
(LeCun et. al, 1998) – Y. LeCun, L. Bottou, Y. Bengio, P. Haffner et al., “Gradient-based learning
applied to document recognition,” Proceedings of the IEEE, vol. 86, no. 11, pp. 2278–2324, 1998.
(Badrinarayanan et. al, 2017) – V. Badrinarayanan, A. Kendall, and R. Cipolla, “Segnet: A deep
convolutional encoder-decoder architecture for image segmentation,” IEEE transactions on pattern
analysis and machine intelligence, vol. 39, no. 12, pp. 2481–2495, 2017
(Minaee et. al, 2021) – Minaee, Shervin, et al. «Image segmentation using deep learning: A
survey.» IEEE Transactions on Pattern Analysis and Machine Intelligence (2021).
Créditos
Daniel Iglesias es informático y amplio conocedor del ámbito del aprendizaje automático y la visión
artificial.
Machine Learning en Operaciones Espaciales
Por Jose Martinez Heras
13/12/2021
Patrick Fleith fue el anfitrión y ha tenido la amabilidad de poner en youtube la grabación del
evento. Así que si te lo perdiste, aquí tienes la oportunidad de verlo.
Posts Invitados
Daniel Iglesias
Daniel Iglesias es informático y amplio conocedor del ámbito del aprendizaje automático y la visión
artificial.
Post Invitados
Segmentación de Imágenes con Redes Convolucionales
Alan López
Alan es doctor en ciencias, y coordinador del área dedicada a la investigación e implementación
del Machine Learning y Ciencia de Datos en una empresa de consultoría TI. Le encanta aprender
y enseñar sobre cómo lograr sistemas de aprendizaje de máquina prácticos y funcionales. El blog
personal de Alan es: MachineLearningEnEspanol.com
Posts Invitados
Actualmente trabaja como ingeniero en Darmstadt, Alemania, en diferentes proyectos para la ESA
(European Space Agency) y EUMETSAT (European Organisation for the Exploitation of
Meteorological Satellites).
Posts Invitados
Contraste de Hipótesis 1 – ¿cómo no aceptar lo falso?
Redes neuronales desde cero (I) – Introducción
Redes neuronales desde cero (II): algo de matemáticas
¿Cómo puedo colaborar?
Una forma de colaborar en IArtificial.net es escribiendo post invitado sobre algún tema relacionado
con Inteligencia Artificial, Machine Learning, Estadística, Análisis de Datos, Visualización de Datos,
python, R, etc. Es una muy buena forma de darte a conocer a la comunidad de Inteligencia
Artificial es castellano ya que tu artículo lo leerán miles de personas.
Si quieres escribir un post invitado, o tienes otras ideas para colaborar, contacta con nosotros y
hablamos.
Sobre mí
Hola, soy José Martínez Heras y desde hace más de 15 años estoy en el mundo de la Inteligencia
Artificial y el Machine Learning. Sí, trabajo con datos antes de que el Big Data y el Análisis de
Datos estuviese de moda.
Nací en Córdoba, España y llevo ya varios años viviendo en Alemania. Trabajo en Solenix como
Senior Research Engineer, y muchos de nuestros proyectos son con la Agencia Espacial Europea,
concretamente, en el Centro de Operaciones. Mi trabajo consiste en ayudar a ejecutivos e
ingenieros a tomar mejores decisiones usando técnicas de Inteligencia Artificial.
En 2018 organicé una serie de charlas sobre Machine Learning en la Agencia Espacial Europea.
El objetivo era el ofrecer una introducción intuitiva a la Inteligencia Artificial. Estas charlas fueron
todo un éxito y contribuyeron a un mejor entendimiento de lo que la Inteligencia Artificial puede
hacer (y lo que no), y a dar una intuición de cómo funciona. Estas charlas y el material que
preparé están disponible en inglés en GitHub.
Hay mucho material sobre Inteligencia Artificial disponible en inglés. Para mi sorpresa, he visto
que hay bastante poco en español. Algunos de los artículos que he visto en español sobre
Inteligencia Artificial hablan de las implicaciones de la IA en la sociedad. Sin embargo, he
encontrado muy poco sobre cómo funciona la Inteligencia Artificial en realidad.
Si quieres saber más sobre mí, puedes conectar conmigo en LinkedIn o seguirme en Twitter.