Microsoft Cognitive Services

Conociendo el nuevo servicio Anomaly Detector

Anomaly Detector es un nuevo Servicio Cognitivo de Microsoft (en versión preliminar) que detecta patrones inusuales o “raros” en los datos que le proporcionamos ¿Interesante no?  ¡Vamos a aplicarlo a nuestra DB para detectar tramposos! 😛 

¿Dónde podemos utilizarlo?

La principal funcionalidad de Anomaly Detector (como su nombre  indica), es detectar anomalías en una serie de datos que le proporcionemos, por ejemplo, el caso que trataremos en este artículo: puede usarse para detectar fraudes en cobros de tarjetas;  en la ciberseguridad, detectando patrones extraños de inicio de sesión; monitorizando datos de IoT; incluso en la bolsa… los límites como siempre, los pone tu imaginación. 

Los Servicios cognitivos de Microsoft están enfocados a exponer de manera sencilla mediante una API, complicados mecanismos de Inteligencia Artificial que, de otra forma,nos costarían tiempo, esfuerzo y dinero implementarlos. 

En este artículo vamos a crear una web .Net Core que esté conectada a una base de datos, en ella tendremos un pequeño dashboard donde visualizaremos las “transferencias” que ha realizado nuestra empresa y detectaremos si en nuestros datos hay alguna cosa extraña o anormal. Recordad que hoy (por si alguien lee esto en el futuro) esta nueva herramienta está en versión preliminar y puede sufrir bastantes cambios 🙂 

Como siempre me gusta hacer en mis artículos, aquí tenéis el link del proyecto en github -> https://github.com/Javierif/AnomalyDetector para que podáis descargarlo y seguir el artículo de una forma mucho más sencilla.  

¡Manos a la obra!

Empezaremos por crear en Azure todas las herramientas de un tirón que necesitamos. Para este artículo vamos a necesitar lo siguiente: 

  1. Nuestro Azure Storage account, donde tendremos nuestra tabla con los datos de transacciones que ha realizado “nuestra empresa”.
  1. Anomaly Detector Cognitive Service que nos proporcionará un endpoint y una API Key a la que llamaremos para que nos analice nuestros datos.
  1. Webapp donde subiremos nuestro código .net core para mostrar en las transferencias y si hay algún dato anómalo

Comencemos creando nuestra Azure Storage account desde el portal de Azure

Cargamos unos datos preparados en un fichero .json simulando unas transacciones de transferencia bancarias y entre ellas, algunas que son fraudulentas, para ver si nuestro Anomaly Detector, las detecta.

Para ello utilizaremos Azure Storage Explorer parar crear la tabla y cargar los datos (Puedes bajarte el programa aquí https://azure.microsoft.com/es-es/features/storage-explorer/) y el .csv que vamos a usar para este artículo puedes encontrarlo en el repositorio en datos-ejemplo/transferencias.csv 

 

Para el segundo paso, la creación de un servicio cognitivo es siempre muy sencilla. Buscamos el servicio en el Portal de Azure, en este caso Anomaly Detector, le damos a crear y listo. Una vez que ya esté creado el servicio, lo que nos interesará es la API Key que lo usaremos para realizar las llamadas: 

 

Vale, vamos a por el último paso y el más complicado. Vamos a empezar a trabajar en crear nuestro sistema de detector de tramposos.  Comenzaremos por crear nuestras dos clases importantes: 

(Como no quiero enrollarme con la explicación de cómo realizar una llamada HTTP o una clase para acceder a una tabla, ya que hay cientos de artículos sobre esto, prefiero dejaros la url del código y que uséis el antiguo y confiable copiar/pegar) 

 

Ahora tenemos nuestras dos clases montadas y contamos con todo lo necesario para obtener los datos. Por otro lado tenemos la API para que nos analice nuestros datos.  Solo necesitamos algo que lo una todo en un solo propósito.  

Vamos a crear un Controller en nuestro proyecto que hará las veces de API propia que ejecutará nuestro análisis de datos. 

 Analicemos este código que es bastante sencillo, pero tiene algunos trucos que tener en cuenta a la hora de utilizar este servicio de AnomalyDetector. 

Lo primero que hacemos es llamar a nuestra clase que gestiona nuestra tabla para pedirle todos los datos de las transferencias realizadas. 

Ahora que tenemos los dato, creamos AnomalyRequest ya que (y aquí viene lo importante), el servicio de AnomalyDetector es un poco “puñetero” y quiere los datos de determinada forma. Para que el servicio funcione correctamente debemos de pasarle un json con el siguiente formato: 

 

Además de seguir este formado de datos, tenemos que enviar el timestamp ordenado de forma ascendiente o tampoco funcionará.  

Entonces ¿qué hacemos con los datos de nuestra DB? En este modelo que nos solicita el servicio no tiene ni partitionkey, ni rowkey, ni siquiera tenemos un campo que sea “money. Bueno no hay que sulfurarse, simplemente debemos de mapear nuestro objeto tableEntity a este nuevo formato para que el servicio de AnomalyDetector lo pueda entender bien: 

 Ya tenemos nuestra clase mapeada como los señores de MS quieren, es hora de utilizar un JsonConvert.SerializeObject(AnomalyRequest) para que nos lo convierta todo en un bonito string y se lo enchufamos al servicio de Anomaly 

Si todo ha salido bien, el servicio de AnomalyDetector buscará patrones dentro de nuestros datos y comprobará si cada uno de los datos sigue el patrón detectado.  

¿Qué es un patrón?

En nuestro caso, hemos programado los datos como si nuestra empresa realizara sus transferencias bancarias por la mañana y con una cantidad similar  (2000-3000€). Un patrón puede ser que siempre se realiza las transferencias por la mañana, o que la cantidad ronda cierta cifra (hay que tener en cuenta que este servicio funciona mejor cuanto más datos le proporcionamos, ya que encontrará más patrones y determinará mejor los casos anómalos). 

Nosotros para “forzar” un poco a nuestro servicio, hemos metido una transferencia por la noche y además de una cantidad muy superior a la habitual, para ver si nuestro AnomalyDetector lo detecta. 

Realizamos nuestra llamada pasándole los datos de nuestra BD y una vez que recibamos la respuesta nos vamos a fijar en dos campos: 

  • IsAnomaly -> Contiene una matriz de valores booleanos, los cuales nos servirá para indicar si alguno de nuestros datos es una anomalía.
  • ExpectedValue -> AnomalyDetector, siguiendo los patrones que ha detectado en nuestros datos, genera un valor estimado de lo que considera que debería ser la transferencia.

Ahora simplemente devolvemos los datos a nuestro frontal y mostramos nuestro resultado para ver si ha detectado nuestro “gazapo”: 

 

CONCLUSIÓN

Hemos visto un caso práctico de como usar este nuevo servicio, pero hay que tener en cuenta que actualmente está en versión preliminar, lo que quiere decir que puede fallar, no hay mucha documentación, etc.. Pese a todos estos impedimentos, el servicio ha respondido con bastante confiabilidad, encontrando nuestro gazapo 🙂 Personalmente veo de gran utilidad este nuevo servicio y creo que tendrá una gran cantidad de aplicaciones en el mundo business. 

 

Compartir
Publicado por
Javier Iniesta

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continuas navegando, estás dando tu consentimiento para aceptar las cookies y también nuestra política de cookies (esperemos que no te empaches con tanta cookie 😊)