Machine Learning | Cómo generar nuevos datasets usando bootstrap y ML.NET

Bootstrap es una técnica de remuestreo utilizada para estimar estadísticas de una población mediante el muestreo de un conjunto de datos con reemplazo. En palabras más simples; imaginemos que tenemos una muestra de datos en un dataset y queremos generar una nueva muestra de igual o menor tamaño, entonces tomamos un dato del dataset original de manera aleatoria y la colocamos en un nuevo dataset, a la vez que devolvemos el dato seleccionado al dataset original, y repetimos el proceso hasta generar la nueva muestra deseada. Este enfoque de muestreo se llama muestreo con reemplazo (sampling with replacement).

Fuente: Bootstrap aggregating bagging

Lo interesante de esta técnica es que permite que un dato sea parte de una nueva muestra más de una vez o ni una sola vez. Esto tiene algunas ventajas estadísticas para que las nuevas muestras generadas tengan una mejor distribución que las muestra original.

Esta técnica de bootstrap puede ser muy útil en los siguientes casos.

Cuando se quiere mejorar la distribución de los datos. En el caso de ML.NET la técnica de bootstrap utiliza una distribución de Poisson(1) para generar el nuevo dataset.

Cuando se tiene un dataset muy pequeño y se necesitan más muestras. Ya que los nuevos dataset que genera el remuestreo con bootstrap tiene una valides estadística, estos se pueden usar para entrenar varios modelos con los nuevos dataset o inclusive combinarlos para generar un nuevo dataset con un mayor número de datos.

Para probar un modelo con los datos “fuera de la bolsa” (out-of-bag). Ya que un dato dentro de un dataset puede no ser seleccionado para formar parte del remuestreo, estos datos no seleccionados se los puede usar para generar un nuevo dataset llamado “out-of-bag¨” y usarlo como dataset de prueba para evaluar un modelo generado con un dataset de entrenamiento.

Bootstrap con ML.NET

El código de ejemplo del uso de bootstrap con ml.net, al igual que otros ejemplos está disponible en GitHub.

Primero, y como siempre, iniciamos nuestro objeto mlContext, en este caso no especificamos un seed ya que variaremos ese dato en el método BootstrapSample. Luego cargaremos un dataset con 1000 registros desde un archivo de texto, en este caso son datos de reservas de hotel y su precio.

MLContext mlContext = new MLContext();

            //Cargamos el dataset original
            string dataPath = GetAbsolutePath("../../../data/HotelBookingsRate.tsv");
            var data = mlContext.Data.LoadFromTextFile<ModelInput>(dataPath,
                                                    separatorChar: '\t', hasHeader: true);

En el primer ejemplo crearemos dos remuestreos (bags), cada uno con una semilla diferente (seed), y veremos los resultados en consola.

//Creamos dos remuestreos (bags)
            for (int i = 0; i < 2; i++)
            {
                //generamos el nuevo dataset usando Bootstrap
                var resample = mlContext.Data.BootstrapSample(data, seed: i);

                var enumerable = mlContext.Data
                    .CreateEnumerable<ModelInput>(resample, reuseRowObject: false);

                Console.WriteLine($"Print sample preview out of {enumerable.Count()}");
                PrintHeaders(typeof(ModelInput));

                //ver los datos del nuevo dataset
                //estos dataset los podemos usar para entrenar un modelo
                foreach (var row in enumerable.Take(10))
                {
                    PrintValues(row);
                }
                Console.WriteLine();
            }

En el segundo ejemplo vemos como crear un dataset “out-of-bag” con los datos no seleccionados en el remuestreo, esta técnica nos sirve para usar este dataset como dataset de pruebas para evaluar un modelo generado, nótese en el resultado que el tamaño de este dataset es mucho menor.

//Creamos un remuestreo y un dataset out-of-bag
            //Este dataset lo podemos usar para probar o evaluar un modelo
            var resampleOob = mlContext.Data.BootstrapSample(data, 1, complement: true);

            var enumerableOob = mlContext.Data
                    .CreateEnumerable<ModelInput>(resampleOob, reuseRowObject: false);

            Console.WriteLine($"Print sample preview out of {enumerableOob.Count()}");
            PrintHeaders(typeof(ModelInput));
            foreach (var row in enumerableOob.Take(10))
            {
                PrintValues(row);
            }
Artículos relacionados

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

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

Publicado por Diego Zumarraga Mera

Experto en transformación digital, Machine Learning, Desarrollo Web, Arquitecto Azure

A %d blogueros les gusta esto: