Machine Learning | Trabajar con múltiples fuentes de datos usando ML.NET

Cuando desarrollamos modelos de machine learning normalmente debemos trabajar unificando datos de diferentes fuentes como archivos .csv, bases de datos o integraciones con APIs. Una de las ventajas de la programación orientada a objetos es que podemos desarrollar funciones para recuperar datos de múltiples fuentes e instanciarlos en un mismo objeto, sin depender de la compatibilidad de los paquetes que utilicemos. En este post veremos cómo instanciar el objeto de origen de datos (dataset) desde múltiples fuentes usando el framework ML.NET.

En la arquitectura del desarrollo de un modelo de machine learning con ML.NET debemos siempre tener un objeto que represente el origen de datos (dataset) y que por convención lo llamamos ModelInput. Este objeto se lo puede instanciar con los datos de entrenamiento, pruebas o inferencia.

Usando ML.NET podemos cargar los datos para instanciar el objeto ModelInput desde un archivo .csv, desde una tabla en SQL Server, o desde cualquier otra fuente usando un objeto Enumerable. Veamos un ejemplo de una función que utiliza estas tres funcionalidades para cargar datos para el entrenamiento de un modelo.

private static IDataView LoadDataView(string source)
{
    IDataView trainingDataView;

    if (source == "textFile")
    {
        var tmpPath = GetAbsolutePath(TRAIN_DATA_FILEPATH);
        trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
                                    path: tmpPath, hasHeader: true,
                                    separatorChar: '\t', allowQuoting: true,
                                    allowSparse: false);
    }
    else if (source == "SQL")
    {
        DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<ModelInput>();
        DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance, CONNECTION_STRING, SQL_COMMAND);
        trainingDataView = loader.Load(dbSource);
    }
    else
    {
        //Load form a json file or a rest API
        var data = File.ReadAllText("json1.json");
        var inMemoryCollection = JsonConvert.DeserializeObject<IEnumerable<ModelInput>>(data);

        trainingDataView = mlContext.Data.LoadFromEnumerable<ModelInput>(inMemoryCollection);
    }

    return trainingDataView;
}

En el código anterior se observa las tres funciones que tiene el objeto mlContext.Data para cargar datos al ModelInput

  • LoadFromTextFile() Carga datos desde cualquier archivo .csv o .tsv
  • CreateDatabaseLoader() Carga datos desde una base SQL Server o Azure SQL
  • LoadFromEnumerable() Carga datos desde cualquier lista, se puede usar para cargar datos desde una API o desde un archivo json

Con esta sencilla función podemos cargar datos tanto para el entrenamiento de un modelo o para realizar predicciones de un modelo ya entrenado.

Artículos relacionados: Cómo predecir más de una categoría usando ML.NET

Artículos relacionados: Segmentación de clientes usando ML.NET

Machine Learning | 5 ventajas de la programación orientada a objetos para la ingeniería de datos

Para quienes hemos trabajado toda nuestra vida con lenguajes orientados a objetos como Java, C# o Ruby, cuando incursionamos en el mundo de la ciencia de datos nos puede resultar muy complicado el adaptarnos a lenguajes como Python que es muy popular en este campo debido a la facilidad de aprendizaje para quienes no tienen bases de programación, pero para quienes ya tenemos fuertes conocimientos de desarrollo el usar un lenguaje de programación orientado a objetos también puede tener muchas ventajas para usarlo en la ciencia e ingeniería de datos.

A continuación veremos 5 ventajas de la POO para la ciencia e ingeniería de datos

1 Evitar duplicidad de código. La POO nos permite -y obliga- a encapsular una funcionalidad dentro de un objeto que es descrito con sus propiedades y funciones. Esto ayuda a estandarizar el desarrollo y que los programadores sepan en donde ubicar sus funciones de forma ordenada y lógica, evitando que cada programador agregue funciones específicas para sus necesidades en lugar de diseñarlas de manera reusable y dentro de un contexto adecuado. Veamos un ejemplo de una función completa para crear un modelo de clasificación binaria pero muy simple gracias al uso de funciones encapsuladas y en contexto con la clase creada.

public static class ModelBuilder
{
    // Create MLContext to be shared across the model creation workflow objects 
    // Set a random seed for repeatable/deterministic results across multiple trainings.
    private static MLContext mlContext = new MLContext(seed: 1);

    public static void CreateModel()
    {
        var tmpPath = GetAbsolutePath(TRAIN_DATA_FILEPATH);
        // Load Data
        IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
                                        path: tmpPath, hasHeader: true,
                                        separatorChar: '\t', allowQuoting: true,
                                        allowSparse: false);


        // Build training pipeline
        IEstimator<ITransformer> trainingPipeline = BuildTrainingPipeline(mlContext);

        // Evaluate quality of Model
        Evaluate(mlContext, trainingDataView, trainingPipeline);

        // Train Model
        ITransformer mlModel = TrainModel(mlContext, trainingDataView, trainingPipeline);

        tmpPath = GetAbsolutePath(MODEL_FILEPATH);
        // Save model
        SaveModel(mlContext, mlModel, tmpPath, trainingDataView.Schema);
    }
}

2 Trabajar con diferentes fuentes de datos. Ya sea para realizar una exploración de datos o para construir un modelo de Machine Learning, siempre vamos a depender de un origen de datos al que debemos acceder. En Python es muy común la práctica de trabajar con archivos .csv y copiar el archivo en cada proyecto para poder acceder a él. Cuando trabajamos con objetos tenemos la ventaja de que al objeto lo podemos instancias de diferentes formas sin importar su origen o sin depender de una librería específica para cada origen. Veamos un ejemplo para instanciar un objeto en una sola función para tres tipos de orígenes diferentes.

private static IDataView LoadDataView(string source)
{
    IDataView trainingDataView;

    if (source == "textFile")
    {
        var tmpPath = GetAbsolutePath(TRAIN_DATA_FILEPATH);
        trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
                                    path: tmpPath, hasHeader: true,
                                    separatorChar: '\t', allowQuoting: true,
                                    allowSparse: false);
    }
    else if (source == "SQL")
    {
        DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<ModelInput>();
        DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance, CONNECTION_STRING, SQL_COMMAND);
        trainingDataView = loader.Load(dbSource);
    }
    else
    {
        //Load form a json file or a rest API
        var data = File.ReadAllText("json1.json");
        var inMemoryCollection = JsonConvert.DeserializeObject<IEnumerable<ModelInput>>(data);

        trainingDataView = mlContext.Data.LoadFromEnumerable<ModelInput>(inMemoryCollection);
    }

    return trainingDataView;
}

3 Modelos fuertemente tipados. Aunque la posibilidad de no declarar variables o objetos y no especificar su tipo puede ser muy atractivo cuando recién se aprende un nuevo lenguaje, lo cierto es que en grandes proyectos esto puede causar mucha confusión sobretodo cuando el mantenimiento de un código lo tiene que hacer un desarrollador diferente al que lo creó. En la ciencia de datos este puede ser un problema en particular cuando se trabaja con diferentes tipos de modelos, en un lenguaje orientado a objetos podemos usar objetos genéricos para su creación pero instanciarlos fuertemente tipado para explorar con precisión sus características como métricas y parámetros. Veamos un ejemplo de código para instanciar un modelo multiclase.

public static IEstimator<ITransformer> BuildTrainingPipeline(MLContext mlContext)
{
    // Data process configuration with pipeline data transformations 
    var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey("reservation_status", "reservation_status")
                              .Append(mlContext.Transforms.Categorical.OneHotEncoding(new[] { new InputOutputColumnPair("hotel", "hotel"), new InputOutputColumnPair("arrival_date_month", "arrival_date_month"), new InputOutputColumnPair("meal", "meal"), new InputOutputColumnPair("country", "country") }))
                              .Append(mlContext.Transforms.Concatenate("Features", new[] { "hotel", "arrival_date_month", "meal", "country" }));
    // Set the training algorithm
    var trainer = mlContext.MulticlassClassification.Trainers.LightGbm(new LightGbmMulticlassTrainer.Options() { NumberOfIterations = 200, LearningRate = 0.2938725f, NumberOfLeaves = 60, MinimumExampleCountPerLeaf = 10, UseCategoricalSplit = true, HandleMissingValue = false, MinimumExampleCountPerGroup = 10, MaximumCategoricalSplitPointCount = 32, CategoricalSmoothing = 20, L2CategoricalRegularization = 0.5, UseSoftmax = false, Booster = new GradientBooster.Options() { L2Regularization = 0.5, L1Regularization = 1 }, LabelColumnName = "reservation_status", FeatureColumnName = "Features" })
                              .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel", "PredictedLabel"));

    var trainingPipeline = dataProcessPipeline.Append(trainer);

    return trainingPipeline;
}

4 Fácil integración con otros sistemas. Los lenguajes como C# tienen frameworks de desarrollo muy completos como .NetFramework o .NetCore que eliminan la dependencia de diferentes paquetes de diferentes creadores para las funciones más básicas, esto mejora sustancialmente la compatibilidad cuando se quiere integrar modelos y predicciones de Machine Learning con las aplicaciones de negocio o APIs de terceros. Veamos un ejemplo de un código para predecir un resultado utilizando un modelo de Machine Learning.

public static ModelOutput Predict(ModelInput input)
{
    // Create new MLContext
    MLContext mlContext = new MLContext();

    // Load model & create prediction engine
    string modelPath = @"MLModel.zip";
    ITransformer mlModel = mlContext.Model.Load(modelPath, out var modelInputSchema);
    var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

    // Use model to make prediction on input data
    ModelOutput result = predEngine.Predict(input);
    return result;
}

5 Establecer estándares de trabajo. Finalmente la programación orientada a objetos nos permite desarrollar siguiendo patrones de diseño y de trabajo como TDD, Dependency Injection, entre otros, lo cual facilita mucho el mantenimiento del código y mejora su calidad, sobre todo cuando los proyectos crecen y se tiene a varios desarrolladores compartiendo y desarrollando una misma funcionalidad.

Artículos relacionados: Machine Learning | Cómo predecir más de una categoría usando ML.NET

Machine Learning | Cómo predecir más de una categoría usando ML.NET

Una de las ventajas de usar el framework ML.NET para la ciencia e ingeniería de datos es la posibilidad de crear experimentos para la creación de modelos de Machine Learning de manera automatizada. En este post vamos a usar la clase MulticlassClassificationExperiment incluida en el paquete Microsoft.ML.AutoML para crear un modelo para predecir la probabilidad de cancelación o cambio en la reserva de un hotel.

El código fuente del proyecto se puede descargar de este repositorio en GitHub

Problema

Tenemos un dataset con el histórico de las reservas de varios hoteles y el registro de los cambios que tuvo la reserva. Con estos datos vamos a crear un modelo de Machine Learning para predecir si una reserva puede ser cancelada, modificada o no tener cambios. Este escenario puede ser útil para ofrecer un seguro de cancelación de reserva a un menor o mayor costo según el resultado de la predicción.

Dataset

Contamos con un Dataset tomado de kaggle y modificado para marcar tres categorías en la columna de reservation_status, esta puede tener los valores: Booking-Changed; Canceled; Check-Out

Solución

Crearemos un modelo de Machine Learning usando el framework ML.NET. Ya que son tres categorías las que queremos predecir (Booking-Changed; Canceled; Check-Out) debemos crear un modelo de clasificación multiclase (multiclass classification). Lo haremos de forma automática para que el framework seleccione el mejor algoritmo y los mejores parámetros para nuestro dataset, no tendremos que preocuparnos por la parte matemática, estadística o el tipo de algoritmo a utilizar.

Ya que nuestro modelo debe ser de clasificación multiclase (multiclass classification) usaremos el método CreateMulticlassClassificationExperiment para crear el modelo de forma automática.

Como en toda solución de Machine Learning seguiremos los siguientes pasos para crear el modelo.

  • Preparar y cargar los datos de entrenamiento y prueba
  • Entrenar el modelo para le predicción de los valores deseados
  • Evaluar la precisión del modelo
  • Consumir el modelo desde una aplicación

Los datos los cargaremos en un objeto IDataView desde un archivo de texto con el siguiente código

// Load Data
var tmpPath = GetAbsolutePath(TRAIN_DATA_FILEPATH);
IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
                                path: tmpPath,
                                hasHeader: true,
                                separatorChar: '\t',
                                allowQuoting: true,
                                allowSparse: false);

var splitData = mlContext.Data
    .TrainTestSplit(trainingDataView, testFraction: 0.15);

El método mlContext.Data.TrainTestSplit() nos sirve para tomar una muestra de nuestro dataset que será usado para probar el modelo creado

Para entrenar el modelo usaremos el método CreateMulticlassClassificationExperiment, al invocarlo necesitamos especificar el tiempo en segundos que queremos que dure el experimento, dependiendo del tamaño de nuestro dataset mientras más tiempo dure el entrenamiento más algoritmos serán probados hasta encontrar el de mejor precisión. El código para crear el experimento es el siguiente.

// STEP 2: Run AutoML experiment
Console.WriteLine($"Running AutoML Multiclass classification experiment for {ExperimentTime} seconds...");
ExperimentResult<MulticlassClassificationMetrics> experimentResult = mlContext.Auto()
         .CreateMulticlassClassificationExperiment(ExperimentTime)                .Execute(trainingDataView, labelColumnName: "reservation_status");

Para usar este método dentro del objeto de contexto mlContext debemos instalar el paquete nuget Microsoft.ML.Auto

using Microsoft.ML.AutoML;

Hasta ahí ese es todo el código que necesitamos para crear nuestro modelo de clasificación multiclase. Pero antes de poder usarlo debemos conocer sus métricas y su precisión para hacer predicciones. Lo primero que podemos observar es el algoritmo seleccionado para el modelo y las métricas que lo calificaron como el mejor algoritmo para nuestros datos. Esto lo podemos hacer con este código

// STEP 3: Print metric from the best model
RunDetail<MulticlassClassificationMetrics> bestRun = experimentResult.BestRun;
Console.WriteLine($"Total models produced: {experimentResult.RunDetails.Count()}");
Console.WriteLine($"Best model's trainer: {bestRun.TrainerName}");
Console.WriteLine($"Metrics of best model from validation data --");
PrintMulticlassClassificationMetrics(bestRun.ValidationMetrics);

El siguiente paso es probar el modelo con datos de prueba no incluidos en el entrenamiento y ver si las métricas son similares a las métricas del entrenamiento del modelo.

// STEP 4: Evaluate test data
IDataView testDataViewWithBestScore = bestRun.Model.Transform(splitData.TestSet);
var testMetrics = mlContext.MulticlassClassification.CrossValidate(testDataViewWithBestScore, bestRun.Estimator, numberOfFolds: 5, labelColumnName: "reservation_status");
Console.WriteLine($"Metrics of best model on test data --");
PrintMulticlassClassificationFoldsAverageMetrics(testMetrics);

Los resultados de este experimento en resumen son los siguientes

  • Mejor algoritmo seleccionado: LightGbmMulti. Una de las ventajas de generar un modelo de forma automática es que la selección del algoritmo no está sesgada por la preferencia del data scientist, durante el experimento se han probado varios algoritmos y configuraciones
  • Precisión del modelo: 97%
  • Con los datos de prueba se obtuvo en promedio un 97% de precision en las predicciones lo que nos una confianza bastante buena para poder usar nuestro modelo generado

El siguiente paso es guardar el modelo en un archivo .zip para luego usarlo desde una aplicación

// Save model
SaveModel(mlContext, bestRun.Model, MODEL_FILEPATH, trainingDataView.Schema);

Como último paso crearemos una clase ConsumeModel y un método Predict() para consumir el modelo y probar una predicción con los datos de una nueva reserva de hotel.

// Create new MLContext
MLContext mlContext = new MLContext();

// Load model & create prediction engine
string modelPath = @"MLModel.zip";
ITransformer mlModel = mlContext.Model.Load(modelPath, out var modelInputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel, modelInputSchema);

// Use model to make prediction on input data
ModelOutput result = predEngine.Predict(input);
return result;

Una recomendación de diseño es crear las clases ConsumeModel, ModelInput y ModelOutput en un solo proyecto, puede ser el mismo en el que creamos y entrenamos el modelo, de esa forma, En la aplicación para consumir el modelo y hacer una predicción con nuevos datos solo deberemos referencias el proyecto con la clase ConsumeModel y no será necesario instalar los paquetes de Microsoft.ML.

El código en la aplicación para predecir el cambio de estado en una reserva de hotel se verá así.

Console.WriteLine("Tiempo de anticipacion: ");
string leadTime = Console.ReadLine();
Console.WriteLine("Cuarto reservado: ");
string cuartoReservado = Console.ReadLine();
Console.WriteLine("Precio promedio: ");
string adr = Console.ReadLine();
Console.WriteLine("Pais: ");
string country = Console.ReadLine();
Console.WriteLine("Cambios previos: ");
string cambiosPrevios = Console.ReadLine();


ModelInput bookingData = CreateBookingData(leadTime, cuartoReservado, cambiosPrevios, adr, country);

ModelOutput bookingPredict = PredecirCambioReserva(bookingData);

Console.WriteLine($"\n\nActual Reservation_status: {bookingData.Reservation_status} \nPredicted Reservation_status value {bookingPredict.Prediction} \nPredicted Reservation_status scores: [{String.Join(",", bookingPredict.Score)}]\n\n");

En este caso simulamos la entrada de solo cinco variables de todo el dataset, realizamos la predicción y además vemos la métrica de cada categoría.

El código fuente del proyecto se puede descargar de este repositorio en GitHub

Artículos Relacionados

Segmentación de clientes usando ML.NET

¿Cómo Scrum puede ayudarnos a gestionar los nuevos equipos remotos?

La gestión de equipos remotos requiere las mismas habilidades e instrucciones que cualquier equipo presencial: Objetivos claros, retroalimentación, interacción, enfoque. Pero la distancia añade retos adicionales, la adopción de un marco de trabajo ágil como Scrum puede ayudarnos a superar estos retos.

En el mercado existen muchas herramientas tecnológicas que nos ayudan a mantenernos conectados y ¨”cercanos” y son altamente recomendadas como Microsoft Teams, Google Meet, Slack y por supuesto la estrella de las reuniones Zoom. Pero estas herramientas no nos ayudan a superar ciertos retos culturales y relacionadas al comportamiento humano. Veamos algunos de estos retos que se presentan en equipos remotos.

1 Perdida de identidad con la compañía. Este es un problema crítico y crece cada día sin que nos demos cuenta. Los humanos tendemos a socializar en grupo. En la oficina se forman amistades entre las personas. Todos son parte de un mismo equipo en la compañía. Cuando la gente trabaja remotamente, y ya nos e comparte un café o un desayuno, se forma una sensación extraña. Se pierden los nexos y conexiones con las personas que ya no conocemos. La consecuencia es que la compañía se divide en grupos y estos grupos van a tener mayor dificultad para trabajar en conjunto.

2 El conocimiento no llega a los equipos. Aún en equipos que han trabajado juntos por muchos años, enfrentan retos en la transferencia de conocimiento. En muchos casos, el equipo de desarrollo está alejado del product owner. Además, el equipo de desarrollo está alejado de los usuarios del producto que están creando y dependen del product owner para entender los requerimientos.

3 Pérdida de comunicación. Cuando un equipo trabaja de forma presencial, conversa. almuerzan, se toman un café juntos, y las reuniones son más frecuentes. pero en un equipo remoto esto no sucede. El problema es que un equipo remoto necesita aún más comunicación. La comunicación es clave para superar los retos que hemos visto. Así que tenemos que encontrar los mecanismos para aumentar la comunicación en equipos remotos.

4 La caja negra. Cuando el equipo remoto está alejado, no vemos lo que está haciendo ni quién está trabajando en nuestro producto. El equipo remoto se convierte en una caja negra, Enviamos requerimientos y esperamos una salida. En este entorno se vuelve más necesario la adopción del agilismo. Los miembros del equipo remoto tienen que ser vistos como un solo equipo, tenemos que saber cómo cada miembro aporta al equipo, la caja negra tiene que ser abierta

Ya conocemos los retos, ahora respondamos la pregunta ¿Cómo Scrum puede ayudarnos a gestionar los nuevos equipos remotos?

El Scrum Master toma más importancia en una organización.

El Scrum Master es el rol por excelencia para remover los impedimentos del equipo y hay algunas recomendaciones que puede seguir para mantener al equipo comunicado y unido.

Adaptar y mantener una disciplina en el uso de herramientas. Pasar de las herramientas físicas como paneles Kanban y las reuniones diarias presenciales a herramientas digitales y reuniones virtuales tomará tiempo de adaptación. Para esto el Scrum Master deberá generar el hábito de uso de las herramientas para el trabajo remoto.

Sprints más cortos para mantener los objetivos simples. Sprints y retrospectivas cada semana pueden ser más efectivos en equipos remotos para no descuidar el enfoque en los objetivos y avances del proyecto.

Reuniones más interactivas y en equipos más pequeños. Es de vital importancia mantener el interés en las reuniones remotas y esto se puede perder si hay muchos participantes, la recomendación es que se armen equipos más pequeños para que todos puedan -y deban- participar activamente en la reunión y que todos aporten algo.

El Product Owner debe conocer las nuevas necesidades de los clientes

En la llamada “nueva normalidad” las necesidades de los clientes no van a ser las mismas. El valor que las empresas y sus servicios aportan a la sociedad van a tomar mucha más importante que antes. El Product Owner debe conocer esas nuevas necesidades para definir con más prioridad los productos que tengan estén alineados con estas nuevas necesidades. Además el Product Owner debe convertirse en un experto en experiencia del cliente ya que en la actualidad esto hace la diferencia entre el éxito o fracaso de un producto.

Estas habilidades deben ser reforzadas en el Product Owner ya que en equipos remotos es quizá el único punto de contacto entre el negocio y el equipo de desarrollo, de esta manera evitamos la dependencia de involucrar a usuarios o más miembros al equipo del proyecto.

El conocimiento tiene que estar más disponible para todos.

El objetivo es asegurarse que todos los miembros del equipo tengan acceso igualitario a información crucial del proyecto, hay que romper el paradigma de “información reservada” o el miedo a que “se van a llevar el conocimiento”.

Un equipo presencial tiene más interacciones con el usuario y Product Owners. EN equipos remotos se necesita un plan para acceder a esa información. Reuniones de planificación más efectivas, más involucramiento del Product Owner en estas reuniones y pensamiento creativo para obtener mejor feedback de los usuarios en las etapas del proyecto.

Fallar rápido y barato

Una de las bases de Scrum y el agilismo es tomar decisiones más rápidas, con la premisa de que demasiado análisis puede ser más costoso que ejecutar una idea aunque esta sea fallida. Esto toma más relevancia en momentos de cambio o de incertidumbre. En tiempos en que muchos negocios tienen que reinventarse o cambiar la propuesta de sus negocios, no podemos pasar demasiado tiempo esperando encontrar la solución perfecta. Un producto más simple con objetivos claros puede determinar el éxito o fracaso en la adaptación de nuestro negocio.

Artículos relacionados: ¿El Coronavirus acelerará la transformación digital de las empresas?

¿El Coronavirus acelerará la transformación digital de las empresas?

La transformación digital ha potenciado las estrategias de negocio de pequeñas, medianas y grandes empresas mediante el uso de plataformas digitales para cumplir con las expectativas de sus clientes.

Las plataformas digitales se encuentran disponibles desde hace varios años pero muchas compañías no las han implementado para transformar sus negocios y encontrar mayores oportunidades para crecer, ser más eficientes y diferenciarse de la competencia.

La llegada del coronavirus ha puesto a prueba a miles de compañías en el mundo que no estaban preparadas para afrontar una pandemia económica y menos para operar en tiempos de confinamiento preventivo decretado por muchos países en el mundo, poniendo en jaque la economía mundial y por ende a muchas compañías que no han empezado a implementar la transformación digital.

Ahora los negocios están obligadas a transformarse y estas son 4 razones por las que el Coronavirus acelerará la transformación digital en las empresas

1. El teletrabajo se volverá parte de la cultura empresarial.

Según Forbes el 29% de los trabajadores remotos dicen que son más felices que los trabajadores que deben estar en un lugar fijo.

El teletrabajo puede ser mucho más productivo que el trabajo presencial si se lo realiza con las herramientas y el liderazgo adecuado. En teletrabajo pierde sentido la evaluación por tiempo de trabajo y gana prioridad la evaluación por objetivos y resultados. Es verdad que no todas las funciones se pueden adecuar al trabajo remoto de la misma forma, pero aquellas que funciones que se pueden cumplir de forma remota sin impacto al cliente deberán seguir siendo impulsadas por las empresas aún cuando se levanten las medidas de confinamiento.

2. Las empresas adoptarán las tecnologías en la nube como estrategia para adaptarse a los cambios.

Migrar los procesos a servicios en la nube como AWS o Microsoft Azure permite a las empresas usar herramientas tecnológicas más actualizadas, seguras y flexibles a los cambios, sin embargo los líderes de las compañías deben asegurarse que esta transición sea de manera gradual y bien estratégica donde puedan garantizar que los empleados y el equipo de la compañía en general tenga todos los conocimientos para empezar a operar de una manera más digital.

Los servicios en la nube también ayudan a que las empresas adopten el teletrabajo de forma más rápida. Empresas como Google, Microsoft y Zoom están ofreciendo funciones gratuitas para sus herramientas de comunicación y colaboración, lo que permite crear una política de trabajo remoto para llevar los registros diarios, trabajos basados en tareas y diferentes planes individuales para que las personas se adapten a esta forma de hacer teletrabajo.

3. El e-commerce está cambiando el paradigma de la interacción entre el cliente y la empresa.

Según Marc Benioff, CEO de Salesforce, “cada transformación digital comenzará y terminará con el cliente”, es así como muchas nuevas empresas están adoptando modelos similares, encontrando en el e-commerce y las plataformas digitales una nueva forma de hacer negocios de manera más remota, eficaz, reduce los costos y mejora la experiencia de los clientes.

El e-commerce también trae el reto a las empresas de conocer más a sus clientes para brindarle servicios y experiencias personalizadas, utilizar modelos de machine learning para recomendaciones y digitalizar todos los puntos de interacción con el cliente tanto en la preventa como en postventa.

4. El agilismo será la principal forma de trabajo para desarrollar productos.

Muchos expertos coinciden en que luego de la pandemia enfrentaremos una “nueva normalidad” pero todavía el panorama es muy incierto. Las empresas deben estar mejor preparadas para adaptarse a los cambios de forma rápida y responder a las nuevas necesidades de los clientes. Los marcos de trabajo ágiles como Scrum deberán ser adoptados por todas las áreas de la empresa, ya no será una característica solo de las áreas de tecnología. La colaboración y el trabajo en equipos multidisciplinarios harán la diferencia entre las empresas que puedan adaptarse a diferentes modelos de negocio y desarrollar productos adecuados a la “nueva normalidad”

Artículo relacionado: Scrum explicado con Masterchef

Data Storytelling | La importancia de saber contar historias

En estos días de confinamiento debido al Coronavirus Covid19 vemos tantos números a diario de casos en todo el mundo, Las noticias en la mañana actualizan los datos, la cadena de televisión de la tarde repite los datos, y todas las cuentan en RRSS repiten y repiten los mismos datos. ¿De qué nos ha servido repetir y actualizar tanto los números de contagios en el país y el mundo? ¿Qué historia nos está contando esos datos?

Cuando trabajamos con datos debemos recordar siempre una cosa: dato que no cuenta algo no sirve de nada, absolutamente de nada. Por eso desde hace un tiempo se viene hablando de esta tendencia del Data Storytelling que busca cambiar la forma de presentar los datos para que tengan sentido dentro de una historia, que muestre las métricas clave, las comparaciones entre fechas o diagramas de dispersión, es decir, en mensajes persuasivos y efectivos que sean difíciles de olvidar.

¿Qué es Storytelling?

Aunque el concepto de Data Storytelling parezca novedoso, en realidad el Storytelling no es más que el arte de contar historias. Este concepto se ha usado en el mundo de la comunicación y el marketing desde hace mucho tiempo para mejorar la narración de historias en libros, comunicaciones y campañas comerciales.

Lo interesante del Data Storytelling es que combina el mundo del análisis de datos -donde no somos expertos en contar historias- y el mundo de la comunicación -donde no somos expertos en analizar datos. Por suerte para ustedes en este post veremos un poco de los dos mundos.

¿Por qué es importante?

El storytelling en marketing se usa como una técnica en la que cuentas una historia a tu comunidad con el objetivo de lograr una mejor conexión con ellos a través de las emociones.

Según Forbes, en un minuto se ven más de 4 millones de videos de Youtube en el mundo, se postean más de 46 mil fotos en Instagram y se hacen más de 500 mil comentarios en Facebook. En este mundo plagado de datos e información solo las historias son capaces de destacar por encima del resto de mensajes y generan un vínculo profundo con su audiencia.

Veamos un ejemplo claro

En este ejemplo de Johnie Walker, que nos muestra la historia de éxito del caminante que se convirtió en el ícono de la marca, podemos resaltar algunas características claves de una buena historia y que nos servirán para aplicarlo al Data Storytelling.

Características del Storytelling

#1 Personaje: La historia debe ser narrada con un personaje central, puede ser real o ficticio, el tener un personaje hace que la historia sea más humana y genera empatía con la audiencia. En el caso de Johnie Walker todos los valores de la empresa son un reflejo de los valores de su personaje principal. Su historia cuenta el éxito pero también las dificultades que tuvo que superar, esto genera la empatía y la conexión con la audiencia.

#2 Objetivo: Se debe plantear claramente qué queremos comunicar con nuestra historia, qué queremos vender, qué necesidad vamos a solucionar. Las personas van a escuchar nuestra historia porque lo que vamos a contar les interesa para solucionar algún problema o les deja una enseñanza que les va a ser útil.

#3 Experiencia: Las experiencias personales generan una conexión emocional muy fuerte y poderosa con la audiencia. En el caso de Johnie Walker esto está narrado como una aventura que nos enseña cómo superar retos con valores que se mantienen en el tiempo, al final nos están vendiendo eso, los valores de su marca.

Vista esta introducción al Storytelling, ahora debemos plantearnos ¿Cómo empato estos conceptos con el Data Storytelling? Para esto debemos recordar las características que tiene la teoría del Data Storytelling

Características del Data Storytelling

#1 Narrativa y datos: la combinación de ambos sirve para ofrecer a la audiencia una explicación sobre los mismos.

#2 Visualización y datos: como ves en la imagen, la palabra enlighten (que significa iluminar) es el resultado de la combinación de ambos. Añadir una visualización a los datos ayuda informar de forma entretenida e inteligible.

#3 Narrativa y visualización: esta combinación tiene como resultado la captación de clientes.

El problema al momento de estudiar Data Storytelling es que su teoría se centra mucho en la parte de datos y de visualización, pero la clave está en saber hacer una buena narrativa, y aquí es donde podemos aplicar todos los conceptos que vimos del Storytelling.

Recordemos lo mencionado al inicio del post: dato que no cuenta algo no sirve de nada, absolutamente de nada.

Ejemplos en casos de Coronavirus

Volvamos al ejemplo coyuntural del Coronavirus, ¿De qué nos sirve repetir estos datos todos los días?

Datos Coronavirus Ecuador

Las gráficas de arriba no contestan ni las preguntas más básicas ¿Cómo avanza la curva de contagios? ¿Los contagios nuevos son mayores o menores a los del día anterior? ¿Cuándo se verán resultados de las medidas de aislamiento tomadas?

Comparemos con las siguientes gráficas.

Gráficos avance coronavirus

El gráfico de arriba parece simple, pero revelaba lo que a muchos sorprendió en los últimos días cuando los casos en Italia comenzaron a desacelerar. Para quienes seguíamos estas gráficas sabíamos que lo más probable era que el crecimiento exponencial dure 31 días, tal cual sucedió en China.

Claro, esto está lejos de contar una historia todavía, veamos otros ejemplos

La gráfica de arriba ya se parece más a una historia, vemos la relación de las medidas de aislamiento tomadas en China con el crecimiento de casos diarios.

Para ver un ejemplo mejor elaborado podemos citar el caso del Financial Times que ha publicado un sitio con muchos gráficos que muestran tendencias y desagrega los datos de contagios a nivel mundial.

Grafico Coronavirus Financial Times

¿Qué importancia tiene el análisis de datos? En este reportaje de la BBC sobre el caso de Singapore demuestra que su clave para contener los contagios no fueron los hashtags, ni la compra de papel higiénico o las críticas al gobierno, la clave fueron los DATOS, Singapore aprendió de la crisis del SARS en 2003 y sabía que la clave para contener los contagios era recopilar todos los datos de los visitantes al país para poder reconstruir su historia de contactos desde su ingreso al país.

Pero no todas las historias tienen que ser con datos super elaborados y luego de grandes análisis matemáticos. Para concluir este post les dejo un ejemplo excelente de cómo contar una historia corta pero muy interesante en estos tiempos de confinamiento.

Artículo relacionado: Introducing the Timeline Storyteller custom visual for Microsoft Power BI

QnA Chatbot con las preguntas más frecuentes sobre Coronavirus COVID19

Durante la pandemia que está viviendo el mundo, hasta la fecha de publicación de este post, la OMS ha recibido más de 5000 preguntas relacionadas con el Coronavirus. En una época donde las noticias falsas o fake news se propagan más rápido que el mismo virus COVID19, es importante informarse por medios confiables y no dar nada por hecho sin antes contrastarlo o confirmar la fuente.

En mi afán de contribuir a frenar la desinformación -y entretenerme mientras pasan estos días de incertidumbre- tomé las preguntas más frecuentes publicadas en el sitio de la OMS y desarrollé un Chatbot para que pueda contestar estas preguntas de la gente.

Para crear un chatbot desde cero y publicarlo en un sitio web usaremos tres componentes.

  • El servicio cognitivo de Microsoft QnA Maker para crear la base de conocimientos.
  • Un Bot Service de Azure para el chatbot como tal.
  • Un App service en Azure para publicar el chatbot en un sitio web.

Primero debemos crear un recurso QnA Maker en el portal de Azure.

Crear QnA Maker Service

Luego de creado el recurso lo utilizaremos en el portal del servicio cognitivo QnA Maker. Debemos entrar al portal, iniciar sesión con la misma cuenta con la que creamos el recurso en el portal de Azure, y crear una nueva base de conocimientos.

El sitio nos guiará por cinco pasos.

El paso 1 lo vamos a omitir ya que el QnA service lo acabamos de crear en el portal de Azure previamente.

En el paso 2 vamos a seleccionar justamente el QnA service creado y el idioma en el que vamos a crear la base de conocimientos.

En el paso 3 le damos un nombre a la base y en el paso 4 vamos a ingresar los documentos con los que se creará la base de conocimientos y se entrenará nuestro chatbot. En este caso usaremos dos páginas de la OMS como documentos fuentes para crear la base de conocimientos y entrenar nuestro chatbot. No es necesario que la página o el documento tenga un formato específico, siempre y cuando la información contenida en él esté clara y bien redactada el servicio lo entenderá.

Azure QnA Maker

En el paso 5 finalmente terminamos de crear la base de conocimientos.

A continuación veremos todas las respuestas que el servicio logró detectar. En este paso podemos ver qué partes del texto el servicio lo entendió y qué partes no. También lo podemos mejorar ingresando nuevas frases similares para las preguntas y enlazar la respuesta de una pregunta con otra.

Una vez preparadas las preguntas y respuestas podemos grabar y entrenar la base de conocimiento, también podemos probar los resultados en el mismo portal.

Una vez tengamos lista la base publicamos el servicio y creamos un bot conectado al mismo.

Chatbot Coronavirus
Chatbot Coronavirus

En este punto nuestro chatbot sobre el Coronavirus ya está creado y listo para usarse un cualquier canal. Si queremos personalizarlo o agregarle más funcionalidad podemos descargar el código y modificarlo usando el Bot Framework de Microsoft

En este caso publicaré el chatbot en un sitio web y lo publicaré en un App service de Azure.

Existen dos formas para publicar el chatbot en un sitio web. La primera es agregar el Web Chat en un iFrame y la segunda es agregar una linea directa para poder llamarla desde el sitio con más opciones de personalización.

El código en JavaScript para invocar al chatbot por linea siguiente es el siguiente:

<!DOCTYPE html>
<html>
   <head>
      <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
      <style>
         html,
         body {
            height: 100%;
         }
         body {
            margin: 0;
         }

         #webchat {
            height: 100%;
            width: 100%;
         }
      </style>
   </head>
   <body>
      <div id="webchat" role="main"></div>
      <script>
         window.WebChat.renderWebChat(
            {
               directLine: window.WebChat.createDirectLine({
                  token: 'YOUR_DIRECT_LINE_TOKEN'
               }),
               userID: 'YOUR_USER_ID',
               username: 'Web Chat User',
               locale: 'en-US',
               botAvatarInitials: 'WC',
               userAvatarInitials: 'WW'
            },
            document.getElementById('webchat')
         );
      </script>
   </body>
</html>

Al código debemos especificarle el código secreto de la linea directa que se puede consultar en el portal.

El paso final es crear un App service en Azure y publicar un sitio web simple con el chatbot implementado con Web Chat o Direct Line.

Nuestro chatbot luce de la siguiente manera y está publicado en esta url.

Chatbot preguntas frecuentes sobre el Coronavirus COVID19

Machine Learning | Clasificación de imágenes con ML.NET y Visual Studio for Mac

ML.NET y .Net Core funcionan muy bien en Mac OS y Visual Studio for Mac, pero a veces requiere la corrección de ciertas excepciones. En este post explico cómo ejecutar un proyecto de clasificación de imágenes con ML.NET 1.4 y .Net Core 3.0 en Visual Studio for Mac.

El proyecto no es necesario desarrollarlo desde cero, para este ejercicio podemos descargar el ejemplo de clasificación de imágenes publicado en el GitHub de Machine Learning Samples. Y desde mi cuenta de GitHub se puede descargar el proyecto actualizado para Visual Studio for Mac.

El proyecto se descarga completo incluyendo el modelo Inception de TensorFlow. TensorFlow es una plataforma con recursos para proyectos de Machine Learning, en este caso usamos un modelo que nos ayuda a obtener las características de una imagen para luego poder clasificarla.

Como en casi toda solución de Machine Learning encontraremos dos proyectos, uno para realizar el entrenamiento del modelo (ImageClassification.Train) y otro para realizar la predicción con nuevas imágenes (ImageClassification.Predict), ambos son proyectos de consola.

La explicación completa del código está en la misma página de GitHub del proyecto.

Machine Learning Visual Studio

La parte más compleja de comprender, y que vale la pena explicarlo, es la construcción del Pipeline. A diferencia de cuando usamos el AutoML para la selección del algoritmo de clasificación, en este proyecto se especifica de forma manual el algoritmo de clasificación a utilizar.

var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: LabelAsKey, inputColumnName: "Label")
                .Append(mlContext.Transforms.LoadImages(outputColumnName: "image_object", imageFolder: imagesFolder, inputColumnName: nameof(DataModels.ImageData.ImagePath)))
                .Append(mlContext.Transforms.ResizeImages(outputColumnName: "image_object_resized", 
                                                         imageWidth: ImageSettingsForTFModel.imageWidth, imageHeight: ImageSettingsForTFModel.imageHeight, 
                                                          inputColumnName: "image_object"))
                .Append(mlContext.Transforms.ExtractPixels(outputColumnName:"input", inputColumnName:"image_object_resized", 
                                                           interleavePixelColors:ImageSettingsForTFModel.channelsLast, 
                                                           offsetImage:ImageSettingsForTFModel.mean, 
                                                           scaleImage:ImageSettingsForTFModel.scale))  //for Inception v3 needs scaleImage: set to 1/255f. Not needed for InceptionV1. 
                .Append(mlContext.Model.LoadTensorFlowModel(inputTensorFlowModelFilePath).
                     ScoreTensorFlowModel(outputColumnNames: new[] { "InceptionV3/Predictions/Reshape" }, 
                                          inputColumnNames: new[] { "input" }, 
                                          addBatchDimensionInput: false));  // (For Inception v1 --> addBatchDimensionInput: true)  (For Inception v3 --> addBatchDimensionInput: false)

// 3. Set the training algorithm and convert back the key to the categorical values                            
var trainer = mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: LabelAsKey, featureColumnName: "InceptionV3/Predictions/Reshape");  //"softmax2_pre_activation" for Inception v1
var trainingPipeline = dataProcessPipeline.Append(trainer)
                                          .Append(mlContext.Transforms.Conversion.MapKeyToValue(PredictedLabelValue, "PredictedLabel"));

Al revisar el código lo primero que vemos es que los datos necesitan una transformación previa con el método MapValueToKey que sirve para transformar los valores en storing de las categorías a valores numéricos, esto mejora el entrenamiento del algoritmo que vamos a usar para la clasificación.

Los pasos para cargar el modelo de TensorFlow son necesarios para que este “caracterice los datos”, es decir, agregue las características que puede detectar en las imágenes en los datos de entrenamiento.

La tarea a utilizar es la de clasificación multiclase (MulticlassClassification) y el algoritmo seleccionado es LbfgsMaximumEntropy, se puede probar el entrenamiento con otros algoritmos pero siempre que sean de la tarea MulticlassClassification.

Una vez que tengamos nuestro proyecto listo y compilado tendremos problemas al ejecutar el proyecto ImageClassification.Train ya que Mac OS requiere de ciertos paquetes para poder usar el modelo de TensorFlow. El error que arroja es el siguiente:

The type initializer for ‘System.Drawing.GDIPlus’ threw an exception. — -> System.DllNotFoundException: Unable to load DLL ‘gdiplus’: The specified module or one of its dependencies could not be found.

Para que el Mac OS reconozca la libreria faltante primero se debe instalar el gestor de paquetes Homebrew con el siguiente commando:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Una vez instalado el gestor de paquetes instalamos la libreria faltante con el siguiente commando.

brew install mono-libgdiplus

Luego de actualizar el proyecto a .Net Core 3.0 y ML.NET 1.4 podemos ejecutar el proyecto ImageClassification.Predict para consumir el modelo creado y realizar las predicciones pero al momento de cargar una imagen arroja la siguiente excepción:

"DllNotFoundException: Unable to load DLL 'tensorflow': The specified module could not be found"

Esto se debe a un bug en las referencias que guarda ML.NET luego de actualizar la versión a la 1.4.0. Para solventar este error de referencias debemos agregar el siguiente paquete Nuget al proyecto ImageClassification.Predict

dotnet add package SciSharp.TensorFlow.Redist

Con estos ajustes se puede ejecutar el proyecto y probar las predicciones con el proyecto de consola.

Artículo relacionado: Segmentación de clientes usando ML.NET

Innovación | 5 tendencias de analítica de datos que toda empresa debe conocer

La analítica de datos, la Big Data y tecnologías relacionadas, se ha convertido en una de las estrategias más importantes para las empresas que buscan digitalizarse y convertirse en empresas centradas en el valor del dato, es decir, su activo más importante será su información. Para esto necesitan desarrollar capacidades para almacenar, procesar y analizar sus datos, las empresas que mejor desarrollen estas capacidades tendrán una ventaja analítica sobre su competencia.

El desarrollo de estas tecnologías estará guiada durante los próximos años por una serie de tendencias relacionadas con la inteligencia artificial y las nuevas capacidades de infraestructuras digitales.

Analítica aumentada

La analítica aumentada hace que la información de la empresa esté disponible para todas las áreas de la empresa, además todos los perfiles deben contribuir a construir la Big Data de la compañía y a analizarla con la ayuda de algoritmos de inteligencia artificial. Las empresas deben invertir en la formación de estos perfiles para no depender de un grupo especialista en análisis de datos, y que son escasos en el mercado.

Para la formación de estos perfiles es importante el trabajo colaborativo y el manejo de herramientas para este propósito, saber de Excel solamente ya no es necesario, la información se debe compartir entre equipos y debe ser visible de forma clara y estandarizada. Herramientas como Teams y Power BI pueden cumplir este propósito y ayudan a democratizar la ciencia de datos.

Gestión de datos aumentada

Para que las empresas puedan construir su Big Data deben automatizar las tareas de administración y gestión de los datos. Aquí entra en juego la inteligencia artificial y el Machine Learning, la implementación de esta tecnología permitirá a las personas a enfocarse en la información que más relevancia tiene para su negocio.

La calidad de los datos automática es un ejemplo de gestión de datos aumentada, cuando queremos depurar grandes cantidades de datos no es necesario hacerlo todo de forma manual, se puede depurar una cantidad representativa de los datos y dejar que un proceso de Machine Learning depure el resto de la base con lo aprendido en la depuración manual, además el mismo proceso puede ser aplicado para cuidar la calidad de nuevos datos que ingresen a la base.

Almacenamiento y procesamiento de datos en la nube

A medida que las empresas van generando su Big Data necesitarán aumentar sus capacidades de almacenamiento y procesamiento de datos, realizarlo en un data center propio puede ser muy costoso y de mucho esfuerzo de administración. Las soluciones en nube proporcionan todas estas capacidades a un bajo costo y además proveen de diversas herramientas para analizar los datos, crear flujos de trabajo, visualizar los datos y seguridades.

Las herramientas de analítica de datos de Azure son un claro ejemplo de cómo la nube puede solucionar el principal reto que tienen las empresas para implementar analítica de datos.

Retos de la analítica de datos.
Tomado de estudio de Gratner
Hiper foco en el cliente

La segmentación por datos demográficos ya debe ser cosa del pasado. Los datos que genera un cliente en cada interacción con la empresa debe servir para generar experiencias únicas. Los cliente cada vez exigen más autoservicio y automatización, quieren más inmediatez y más personalización.

Según Gartner los clientes cada vez más prefieren la atención de bots o por canales menos invasivos como WhatsApp. Los datos nos deben ayudar a dirigir la atención al cliente por el canal y el lenguaje que él prefiera.

Empresas Data Driven

Las tendencias que hemos visto hasta aquí nos ayudarán a que las empresas se conviertan en empresas data driven, donde la cultura del dato esté presente en todos los perfiles y las personas, además de generar datos, sepan cómo contar historias con esos datos. Los datos que no cuentan algo no sirven para nada, esta tendencia es conocida como el data storytelling.

Las empresas digitales van a nacer, crecer y desarrollarse basadas en datos. Por eso muchos expertos hablan de que los datos serán el nuevo petróleo o que la nueva moneda será el conocimiento.

Artículo relacionado: Videos de Machine Learning explicados en español.