ML.NET – Machine Learning VS R

Cuando se puso de moda los frameworks para que los desarrolladores creen modelos y aplicaciones con Machine Learning el lenguaje de programación R se volvió uno de los más populares para programar complicados modelos estadísticos, gráficos y algoritmos de entrenamiento, para analizar datos y construir modelos predictivos de todo tipo.

El lenguaje de programación R ha sido de los más usados en la investigación científica ya que tiene varias herramientas para hacer análisis estadístico, modelos lineales, no lineales, entrenamientos supervisados, no supervisados, y una serie de complicadas cosas adicionales…

El lenguaje R se volvió un paradigma, y muchos creen que cualquier aplicación con Machine Learning se debe utilizar R como único lenguaje para el análisis de datos. Pero nada más alejado de la realidad, cada vez existen más herramientas que facilitan la vida a los programadores para incluir características de Machine Learning en cualquier tipo de aplicación; móvil, web, IoT, big data y demás.

En este blog recientemente publiqué una revisión de videos de ML.NET – Machine Learning, ya que desde que comencé a utilizarlo me ha parecido el framework de desarrollo más útil para quienes no somos especialistas en inteligencia artificial pero queremos usarla y aplicarla en nuestras aplicaciones y software.

La pregunta obvia que salta ahora es: ¿Qué debo usar si quiero desarrollar una aplicación con Machine Learning? ¿ML.NET o R?

Veamos algunas características de R.

Para programar en R el IDE de desarrollo más popular es R Studio. Es un IDE gratuito y sus características son muy simples: un editor de texto y diversas ventanas para observar valores de variables y gráficos.

Imagen de rstudio.com

El IDE de R Studio no cuenta (al menos por defecto) con herramientas para administrar el código desde un repositorio de fuentes (Ej. Git). No tiene herramientas de colaboración, no tiene un administrador de paquetes y tampoco cuenta con ayudas como IntelliCode, refactor o configuración de estilos, y es por una simple razón: no se necesita. El objetivo de un proyecto en R no es construir una aplicación funcional con un front end en web o con un API para disponibilizar servicios.

Esa es la principal diferencia entre el lenguaje R y ML.NET, además ese es el principal paradigma que se debe romper entre los desarrolladores o comunidades que creen que R es la única opción para crear modelos predictivos o hacer análisis de datos.

La utilidad de crear un proyecto en R es para analizar un set de datos y encontrar diferentes patrones y descubrir diferentes modelos que se puedan construir a partir de esos datos, este análisis se puede hacer simplemente escribiendo el código en R y ejecutando las instrucciones dentro del mismo IDE, sin necesidad de crear una aplicación. Por ejemplo: si cuento una base de datos de clientes con sus datos demográficos y su historial de productos que cada cliente ha comprado, y simplemente quiero analizar qué variables demográficas se repiten en los clientes que adquirieron un determinado producto, puedo hacer ese análisis en R y descubrir esas variables pero sin crear ninguna aplicación.

Por otro lado, ¿De qué me sirve descubrir esas variables si no me sirve para crear una API que en base a los datos del cliente me recomiende un producto determinado? Es ahí donde ML.NET se vuelve más útil.

Con ML.NET se puede realizar el mismo análisis de los datos del cliente sin necesidad de aprender un nuevo lenguaje de programación si ya sabemos programar en C# y estamos familiarizados con los ambientes de desarrollo de .NET. Además nuestro esfuerzo invertido en el análisis de datos no requerirá de otro esfuerzo adicional si lo queremos utilizar dentro de una aplicación.

Una clara ventaja que tiene ML.NET para los programadores es que no se requiere ser un experto en los modelos estadísticos que se utilizan para el análisis de datos. Pero la cantidad de herramientas para ejecutar modelos estadísticos con las que cuenta el lenguaje R lo hace muy útil para estudiantes de inteligencia artificial que si requieren conocer a profundidad toda la ciencia que mueve a las diferentes ramas de la inteligencia artificial como lo es Machine Learning.

Videos de ML.NET – Machine Learning explicados en español.

Desde que empecé a interesarme y aprender sobre las diferentes herramientas y recursos para desarrollar aplicaciones con Machine Learning, ninguna me ha parecido más útil que el framework de ML.NET. Además cada vez existen más recursos para aprender a desarrollar aplicaciones y funciones con este framework de manera “rápida”.

Cuando digo “rápida” no quiero decir que se pueda aprender Machine Learning en 15 minutos. Se requiere un poco de paciencia al inicio, pero luego de probar y ensayar un par de semanas, o incluso días, se puede tener una comprensión muy buena en la teoría y en la práctica.

Uno de los limitantes que sí existe en los recursos es que todavía hay pocos tutoriales o videos en español. Por eso decidí escribir este post (y seguramente escribiré mas) explicando y detallando la serie de ocho videos de ML.NET – Machine Learning que recientemente se publicó como parte del .NET Conf 2019.

En el primer video de la serie se explica ciertos conceptos de Machine Learning. Lo interesante de esto es que no se requiere ser un experto estadístico y matemático para empezar a construir aplicaciones con ML.NET.

Como resumen del primer video podemos concluir que Machine Learning se trata de enseñar a un programa a distinguir patrones e información dentro de un conjunto de datos para poder hacer predicciones o programar funciones más “humanas” como: EsEstoUnPerro(foto_animal).

En el segundo video se explica cómo ML.NET nos provee de un framework completo de desarrollo donde podemos aprovechar todo nuestro conocimiento en el entorno de .NET para crear aplicaciones con Machine Learning sin necesidad de conocer otros lenguajes como R, Python o SPSS. Además de no requerir instalar herramientas de desarrollo adicionales.

En el tercer video de la serie lo más interesante es la explicación del flujo de toda aplicación de Machine Learning. Es un flujo sencillo de tres pasos:

Preparar los datos. Este paso siempre se lo da por hecho en casi todos los tutoriales de Machine Learning, pero es el más importante de todos y requiere de mucho esfuerzo. Los datos se deben extraer y estructurar con la mejor calidad posible para que el aprendizaje de máquina los pueda entender e interpretar.

Entrenar y construir. Con los datos preparados se puede usar un algoritmo de entrenamiento para construir un modelo que nos permitirá hacer las predicciones y clasificaciones que queremos como resultado. Más adelante explico qué es un algoritmo y un modelo.

Ejecutar. En la mayoría de tutoriales de Machine Learning solo se explica cómo construir un modelo, pero en la práctica la construcción del modelo no nos sirve de nada si no lo podemos usar dentro de una aplicación. Esta es otra de las grandes ventajas de ML.NET, como el modelo está construido dentro de un ambiente de .NET es muy sencillo utilizarlo dentro de una aplicación con pocas lineas de código.

En el cuarto video se crea ya un primer modelo de clasificación binaria (binary classification), esta es la aplicación más común en el mundo del Machine Learning, cuando queremos saber si algo simplemente es bueno o malo. Se puede utilizar para analizar un texto, pero también para analizar una tabla o conjunto de datos.

Los únicos requisitos (además de Visual Studio con .NET Core) para comenzar a crear estas aplicaciones son descargar e instalar el SDK de ML.NET y el Model Builder CLI para la construcción de los modelos. (Si usas VS Code o VS para Mac). Si usas Visual Studio para Windows solo requieres instalar el Model Builder.

Aquí vale la pena repasar otros conceptos de Machine Learning:

¿Qué son los datos de origen? Los datos de origen, o conjunto de datos, es la base de todo sistema de Machine Learning. Estos datos son los que se utilizará para enseñar a un sistema a realizar predicciones o clasificaciones con nuevos o futuros datos.

¿Qué es un modelo? Un modelo se puede concebir como un filtro que recibe y clasifica datos según sus características. Un modelo es el resultante del análisis de los datos de origen y búsqueda de patrones que permitan hacer predicciones sobre nuevos datos.

¿Qué es un algoritmo de entrenamiento? Este es el conjunto de pasos o procedimientos que se utilizará para encontrar los patrones en los datos que servirán para la construcción del modelo. Aquí está una de las grandes utilidades de ML.NET, y es que no es necesario tener bases o conocimiento de estos algoritmos ya que el framework de ML.NET evalúa y nos sugiere automáticamente el algoritmo con mejores resultados para nuestros datos.

En el quinto y sexto video se repite el proceso para crear una aplicación de Machine Learning, pero se utiliza otro tipo de modelos que son también muy comunes en aplicaciones reales.

La clasificación múltiple (multi-class classification) se utiliza para clasificar un grupo de datos en más de un conjunto, es decir, ya no solo clasificar los datos en buenos o malos sino en bueno, muy bueno, regular y malo. Ejemplo: cuando se quiere calificar a los clientes en tipo A, AA o AAA.

La regresión (regression) se utiliza para analizar datos históricos con el objetivo de predecir un valor o variable cuando las características de esto datos cambien en el tiempo. La aplicación más común de esto es la predicción de precios según el comportamiento del mercado. Otro ejemplo puede ser la predicción de crecimiento en ventas según la tendencia presentada en los datos históricos de ventas en el año.

Algunos requisitos que no se mencionan en los videos son los paquetes Nuget. En el proyecto debes agregar la referencias del paquete: Microsoft.ML de preferencia siempre la última versión.

Otra explicación adicional que no se menciona en los videos es qué parte del código corresponde a qué parte del flujo de Machine Learning que vimos en el tercer video.

La preparación de datos corresponde a la fuente de datos seleccionada, en estos ejemplos son siempre archivos de texto ya preparados, y a la carga de estos datos dentro de un objeto que será utilizado como fuente de datos para entrenar al modelo.

La etapa de entrenar y construir se ve aplicada cuando se crea el pipeline (configuración del modelo y algoritmo a utilizar) y se corre el entrenamiento del modelo, lo interesante de esto es que no requerimos tener conocimientos avanzados sobre los diferentes tipos de algoritmos ya que el Model Builder ha evaluado y seleccionado el mejor algoritmo por nosotros.

La etapa de ejecutar, como lo mencioné anteriormente, es la más interesante de todas ya que se puede usar el modelo construido en nuestra aplicación con pocas lineas de código, esta se puede ver en la aplicación de consola generada. Esta es la mayor ventaja de ML.NET sobre otros lenguajes como R y Python.

En el séptimo video se crea un modelo personalizado, no se usa el ModelBuilder y se crea una aplicación de recomendación de películas usando una clasificación binaria y un algoritmo de entrenamiento field aware factorization machine. El objetivo del ejemplo es predecir si una película le va a gustar o no a un usuario. Para esto usa como fuente de datos un archivo con información de una lista de usuarios y las películas que les gustó previamente a los usuarios.

El video no es muy explicativo en cómo se construyó la aplicación, pero sí lo es en el potencial que tiene el crear aplicaciones con modelos personalizados. La pregunta obvia ahora es: ¿Cómo puedo saber qué tipo de modelo es adecuado para mi aplicación?

Para esto les recomiendo este sitio donde se explica los principales modelos que se pueden construir con el generador de modelos (Model Builder) de ML.NET y sus aplicaciones más comunes.

En el último video de esta serie se muestra una aplicación creada para clasificar imágenes y predecir qué tipo de flor tiene la imagen. Nuevamente no es muy explicativo el video pero demuestra que también se pueden generar modelos que clasifiquen imágenes y no solo datos. Esta es otra gran diferencia con otros lenguajes como R que se especializan más en trabajar con datos pero no todavía en imágenes.

Un concepto final para repasar es el de aprendizaje profundo (Deep learning). Esto lo defino como la construcción de un modelo a partir de otro modelo previamente creado. En el ejemplo del video se construye un modelo para clasificar imágenes de flores utilizando un modelo previamente creado para la clasificación de imágenes. En el ejemplo se usa un modelo creado con TensorFlow y si quieres entender cómo crear aplicaciones con clasificación de imágenes puedes seguir este turorial.

Con eso hemos concluido la revisión de la serie de 8 videos de ML.NET Machine Learning. Como video bonus, y para ponerse ya manos a la obra, les dejo un video “end to end” mucho más detallado para crear una aplicación completamente desde cero.

Lo nuevo de Microsoft .Net Core 3.0 para principiantes (ML.NET).

Microsoft Lanzó el 23 de septiembre su nueva plataforma de desarrollo llama .Net Core 3.0. Fueron tres días de charlas durante su .Net Conference 2019, y es que la cantidad de posibilidades, usos, tecnologías y formas de aplicarse a todo tipo de negocio son muy grandes.

En este post me enfocaré en una de las tecnologías que me parecieron más útiles y de mayor potencial para transformar la forma de desarrollar aplicaciones de forma rápida e innovadoras.

Machine Learning .Net (ML.NET)

Este framework de desarrollo permite crear modelos de machine learning de forma rápida para procesar datos y clasificarlos para escenarios comunes como: evaluar los sentimientos en un texto, clasificar clientes por positivos o negativos, calificar clientes dentro de un rango (medio, bueno, muy bueno), entre otros.

Personalmente he tratado de entender cómo funcionan los modelos de machine learning durante mucho tiempo pero su teoría es un poco complicada para quienes no recordamos los conceptos matemáticos. También he tratado de aplicar ciertos modelos de forma simple en herramientas como R Studio y Azure Machine Learning; y ninguno me ha resultado tan fácil como cuando probé ML.NET

La gran ventaja de usar el framework de ML.NET es que no necesitas aprender nuevos lenguajes ni nuevos entornos de desarrollo, si te consideras un desarrollador .Net Jr. o Sr. podrás utilizar tus conocimientos en desarrollo de aplicaciones con C# para aprender a desarrollar con machine learning.

¿Qué pasos debes seguir para aprender ML.NET? Lo primero que te recomiendo es que no te desesperes, no trates de bajarte un código ya hecho y querer aprender en 20 minutos. Tomate tu tiempo para hacerlo con calma desde cero; tampoco te tomará más de un par de horas lograrlo.

El primer paso que te recomiendo es ver la charla de ML.NET en el .Net Conference, este video te dará conocimiento sobre ciertos conceptos básicos. El segundo paso es seguir este tutorial paso a paso del sitio oficial del proyecto. En el tutorial deberás bajar el SDK de desarrollo para Visual Studio o el Model Builder, el tutorial te indicará los requisitos según tu sistema operativo. Te recomiendo utilizar una máquina con Visual Studio para Windows para que no te preocupes de aprender comandos en CLI. Si solo tienes una máquina con Mac OS te recomiendo utilizar una VM en Azure, cuesta muy poco y te será muy útil para muchos otros tutoriales. En todo caso también se puede hacer en Mac OS y tiene las mismas funcionalidades que la versión en windows, simplemente tendrás que hacerlo por linea de comandos.

OJO: En el video de la charla en el .Net Conference tienen más opciones para crear modelos de clasificación de imágenes, pero esta parece ser una versión preliminar ya que esto no está disponible todavía en las versiones de Windows y Mac OS.

Una vez hayas completado el tutorial paso a paso habrás desarrollado tu primera aplicación utilizando un modelo de machine learning. La aplicación podrá recibir un texto de entrada y analizará su contenido para saber si el texto tiene un sentimiento negativo o positivo. Ahora te dejo algunos datos adicionales que pude ver explorando el código generado:

La aplicación de consola generada es muy útil para probar los resultados del modelo simplemente modificando la siguiente sección del código y reemplazando el objeto de prueba (sampleForPrediction).

La librería Model no es más que una librería con dos objetos que se crean a partir de la definición del archivo o la base de datos de origen. El objeto ModelInput sirve para crear un objeto con los datos para poder procesarlos en el modelo y obtener su predicción o resultado, en el caso de la aplicación de ejemplo, en este objeto podemos sestear el texto (SentimentText) que luego podremos procesarlo en el modelo para analizar si su contenido es positivo o negativo. Por eso es muy importante que el archivo esté bien nombrado y con datos limpios, en caso contrario el objeto se creará con propiedades basura o nombres poco descriptivos.

La clase ModelBuilder también es muy interesante explorarla. Esta clase es la que construye el modelo que finalmente es exportado a un .zip. Se puede ver que el código es relativamente corto y demuestra que no se necesita grandes conocimientos matemáticos ni de inteligencia artificial para construir un modelo que se adapte a las necesidades de tu negocio. De hecho, el modelo en .zip no es necesario saber qué contiene en su interior.

Si queremos entrenar nuevamente al modelo solo debemos ejecutar la función CreateModel() al inicio de la aplicación de consola (o desde una nueva aplicación):

Si queremos modificar el modelo o el algoritmo de entrenamiento, lo podemos hacer en la siguiente linea de código, donde además se puede explorar otras opciones de entrenamiento. Por ejemplo: Para una segmentación de clientes yo utilitaria un modelo de clasificación múltiple (multiclass-classification) y luego modificaría el código para que utilice una clasificación de tipo Clustering que en teoría funciona mejor para sementar clientes.

La última recomendación, y de la que menos se habla, es recordar la importancia de tener una base de datos de calidad para construir cualquier modelo de machine learning. En todos los tutoriales y documentación que encontremos se da por descontado la parte del origen de datos para el entrenamiento y pruebas. Pero en ambientes reales las bases de datos, por lo general, no cuentan con la calidad adecuada para utilizarla en un entrenamiento y es la tarea principal en la que se debe trabajar antes de implementar un modelo de machine learning en tu negocio. En otro post hablaremos de qué herramientas se puede utilizar para generar bases de datos de calidad y con información relevante del negocio.

¿Puede una Pyme invertir en transformación digital?

Cuando una empresa de tecnología está en búsqueda de nuevos clientes siempre es fundamental hacer una presentación de su portafolio de servicios, en esta presentación es clave mencionar a quienes han sido sus anteriores clientes y los trabajos realizados para ellos. Siempre me llamó la atención cómo en estas presentaciones se mencionan solo a las grandes empresas como clientes anteriores; bancos, aseguradoras, automotrices, entre otras. Pareciera que haber trabajado con una empresa pequeña o mediana no representa nada, es casi un desprestigio.

En el Ecuador el 95% de las empresas son Pymes y los números son muy similares en los otros países de la región. Este es un mercado desatendido que demanda las mismas necesidades tecnológicas que una empresa grande pero se deben aplicar soluciones diferenciadas y especializadas para este sector.

La transformación digital es encontrar las oportunidades de negocio que se pueden mejorar haciendo uso de la tecnología. Una Pyme no puede invertir en grandes soluciones o proyectos que demoren 6 meses en concretarse por lo que representa un gran reto encontrar la tecnología y el alcance justo que le agregue valor a su negocio sin desperdiciar recursos. A continuación menciono algunos ejemplos que una Pyme puede aplicar a su negocio sin que represente grandes inversiones de dinero.

Metodologías ágiles: Sabemos que la base de la transformación digital son las personas (Si, son las personas no la tecnología). Una buena forma de involucrar a todo el personal de una Pyme y comprometerlos con la transformación es justamente cambiar su forma de trabajo. Marcos de trabajo como Scrum son simples de aprender (y difíciles de dominar) y es más eficiente que el Project Manager. Además sus herramientas son fáciles de implementar, se puede iniciar con paneles Kanban físicos en una pared con post-it o plantillas en Excel.

Talleres de ideación: Una Pyme no podrá invertir en un costoso laboratorio de innovación, pero conozco casos de laboratorios implementados en empresas grandes cuyos resultados se pudieron conseguir con un simple taller de ideación de dos días. Lo único que se necesita es gente comprometida y una buena guía para motivar a la gente a que exprese sus ideas y ganas de transformar su negocio.

Servicios en la nube: En la actualidad se puede conseguir casi todo tipo de sistema en la nube; desde herramientas de oficina como: Office365, Google Docs, WeTransfer; hasta plataformas que eliminan la necesidad de comprar costosos centros de datos como: Microsoft Azure y Google Cloud. Estos sistemas se caracterizan por tener planes según las necesidades de la empresa, se puede iniciar con planes limitados de bajo costo y a medida que la empresa crece se amplía sus características.

En conclusión, hay grandes oportunidades de crecimiento en cada Pyme y muchas veces no se la explota por falta de conocimiento más que por falta de capital para inversión. Es cierto también que no todas las Pymes creen en conceptos como transformación digital pero es solo hasta que un competidor te comienza a quitar mercado con servicios innovadores. Pocas frases cliché son tan ciertas como esta: En la actualidad el que no invierte en tecnología esta destinado a desaparecer, es cierta y aplica para todo tipo y tamaño de empresa.

La delgada linea entre ser emprendedor y estar desempleado. ¿Cuál es la diferencia?

La tasa de desempleo en Ecuador es del 4.6% según cifras oficiales hasta marzo del 2019. En agosto de este mismo año pasé a ser parte de esta estadística. Luego de más de 11 años trabajando bajo relación de dependencia me encontré en una situación donde debía decidir si debía buscar otro empleador que me enrole en su nómina ó podía aprovechar la oportunidad para emprender un negocio propio en el mundo de la tecnología.

Los ingenieros en sistemas sufrimos de un acoso permanente cada vez que alguien escucha por primera vez tu profesión. “Ah… tú que eres de sistemas, ¿sabes cómo hacker una cuenta de Facebook?”, “Ah… tú que eres de sistemas, ¿sabes cómo borrar mis mensajes leídos de WhatsApp?” son unas de las muchas preguntas ridículas que me han hecho en reuniones o conversaciones de almuerzo. Pero este acoso puede ser también una oportunidad para emprender, claro está que, para esto la figura de tu compañera de trabajo que le preocupa los mensajes leídos por su esposo hay que cambiarla por una compañía que te pregunte cómo puede usar WhatsApp Business para mejorar el relacionamiento con sus clientes.

Pero hasta ahí nos falta resolver una gran pregunta: ¿Qué debo hacer para ser un emprendedor de verdad y no solo un desempleado más disfrazado de emprendedor para quedar bien con la gente a la que le debes dinero? Para lo cual debemos descomponer esto y contestarnos estas preguntas:

¿Soy un experto en lo que hago?  Si tienes la seguridad que muy pocas personas en el mercado pueden hacer el trabajo que tú haces y con la calidad que lo haces, eres un emprendedor. El talento no se puede delegar, tu emprendimiento o el producto que desarrolles debe tener tu firma y sello.

¿Puedo trabajar sin horarios? Si te levantas a las 10am, aunque te acuestes tarde, no eres un emprendedor, eres un desempleado. La productividad de un emprendedor es vital y no se puede desperdiciar horas del día en que la gente puede requerir de tus servicios.

¿Puedo manejar mis finanzas sin un sueldo fijo? Si te gastaste todos tus primeros ingresos en un nuevo celular o cambiar de carro, no eres un emprendedor, eres desempleado. Nunca se puede dar por seguro que tus ventas serás constantes como un sueldo fijo, el ahorro y control de los gastos es un hábito que debes adquirir.

¿Puedo vender mi trabajo? Si eres el creador de un producto innovador para el mercado, no habrá mejor vendedor que la persona que creó y conoce hasta el último detalle del producto. Las ventas nunca serán fáciles pero si eres constante y no te desanimas serás un emprendedor, caso contrario, un desempleado. 

¿Me gusta lo que hago? Esta quizá sea la pregunta más importante de todas. No hay mejor motivación para levantarte cada día que hacer lo que realmente te apasiona. La razón para emprender no debe ser la parte económica, la razón debe ser el poder hacer lo que siempre soñaste hacer.