0% encontró este documento útil (0 votos)
29 vistas480 páginas

Guía de ML.NET: Generador de Modelos

El documento proporciona una guía sobre el uso de ML.NET para crear modelos de aprendizaje automático personalizados, incluyendo tutoriales y ejemplos de código. Se detalla el funcionamiento del Generador de modelos, que permite a los usuarios sin experiencia previa en aprendizaje automático entrenar y desplegar modelos utilizando datos específicos. Además, se explican los diferentes escenarios y tareas de aprendizaje automático que se pueden abordar con ML.NET, así como las métricas para evaluar el rendimiento de los modelos.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
29 vistas480 páginas

Guía de ML.NET: Generador de Modelos

El documento proporciona una guía sobre el uso de ML.NET para crear modelos de aprendizaje automático personalizados, incluyendo tutoriales y ejemplos de código. Se detalla el funcionamiento del Generador de modelos, que permite a los usuarios sin experiencia previa en aprendizaje automático entrenar y desplegar modelos utilizando datos específicos. Además, se explican los diferentes escenarios y tareas de aprendizaje automático que se pueden abordar con ML.NET, así como las métricas para evaluar el rendimiento de los modelos.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Díganos qué opina sobre la experiencia de descarga del PDF.

Documentación de [Link]
Obtenga información sobre cómo usar [Link] de código abierto para compilar
modelos de aprendizaje automático personalizados e integrarlos en las aplicaciones. Los
tutoriales, ejemplos de código, entre otros, le muestran cómo hacerlo.

Aspectos básicos de [Link]

e INFORMACIÓN GENERAL

¿Qué es [Link]?

¿Qué es el generador de modelos?

q VIDEO

Conceptos básicos de Machine Learning

p CONCEPTO

Algoritmos y tareas de aprendizaje automático

Elección de un algoritmo

b INTRODUCCIÓN

[Link] en Q&A

Empezar a trabajar en 10 minutos

f INICIO RÁPIDO

Introducción a la API de [Link] (code-first)

Configuración de Model Builder en Visual Studio (low-code)

Instalación de la CLI en macOS, Windows o Linux (low-code)

Tutoriales

d CURSOS
Mantenimiento predictivo (Model Builder)

g TUTORIAL

Análisis de opiniones de los comentarios del sitio web (generador de modelos)

Predicción de los precios (generador de modelos)

Categorización de infracciones sanitarias (Generador de modelos y SQL Server)

Categorización de los problemas de soporte técnico (API)

Clasificación de imágenes con la API de clasificación de imágenes (API)

Uso de la detección de objetos para reconocer señales de tráfico (Model Builder)

Detección de objetos en imágenes (API)

Detección de anomalías en las ventas de productos (API)

Previsión de la demanda de alquiler de bicicletas (API y SQL Server)

Creación de un elemento de recomendación de películas (API)

Guías paso a paso

c GUÍA PASO A PASO

Carga de datos desde varios orígenes

Preparación de los datos para la compilación de un modelo

Entrenamiento y evaluación de un modelo

Realizar predicciones con un modelo entrenado

Guardar y cargar un modelo entrenado

Volver a entrenar un modelo

Referencia

i REFERENCIA

Referencia de API de [Link]

Ejemplos de [Link]
¿Qué es el Generador de modelos y
cómo funciona?
Artículo • 09/05/2023

El Generador de modelos de [Link] es una extensión gráfica intuitiva de Visual Studio


para compilar, entrenar e implementar modelos de Machine Learning personalizados.

El Generador de modelos usa aprendizaje automático automatizado (AutoML) para


explorar distintos algoritmos y configuraciones de aprendizaje automático a fin de
ayudar a encontrar el más adecuado a cada escenario.

Para usar el Generador de modelos no se necesita experiencia previa con el aprendizaje


automático. Lo único que se necesita son algunos datos y un problema para resolver. El
Generador de modelos genera el código para agregar el modelo a la aplicación de .NET.

Creación de un proyecto de Model Builder


La primera vez que inicie Model Builder, le pedirá que asigne un nombre al proyecto.
Esto creará un archivo de configuración mbconfig dentro del proyecto.

El archivo mbconfig realiza el seguimiento de todo lo que hace en Model Builder para
permitirle volver a abrir la sesión.
Después del entrenamiento, se generan tres archivos en el archivo *.mbconfig:

[Link]: este archivo contiene los esquemas ModelInput y


ModelOutput , así como la función Predict generada para consumir el modelo.

[Link]: este archivo contiene la canalización de entrenamiento


(transformaciones de datos, algoritmos, hiperparámetros de algoritmo) elegida por
Model Builder para entrenar el modelo. Puede usar esta canalización para volver a
entrenar el modelo.
[Link]: se trata de un archivo ZIP serializado que representa el modelo de
[Link] entrenado.

Al crear el archivo mbconfig , se le pedirá un nombre. Este nombre se aplica a los


archivos de consumo, entrenamiento y modelo. En este caso, el nombre que se usa es
Model.

Escenario
Se pueden incorporar muchos escenarios diferentes al Generador de modelos a fin de
generar un modelo de Machine Learning para la aplicación.

Un escenario es una descripción del tipo de predicción que se quiere realizar usando los
datos. Por ejemplo:

predecir el volumen futuro de ventas de productos en función de los datos de


ventas históricos
clasificar opiniones como positivas o negativas en función de las revisiones de los
clientes
detectar si una transacción bancaria es fraudulenta
dirigir problemas de comentarios de clientes al equipo correcto de la empresa

Cada escenario se asigna a una tarea de Machine Learning diferente, entre las que se
incluyen las siguientes:

Tarea Escenario

Clasificación binaria Clasificación de los datos

Clasificación multiclase Clasificación de los datos

Clasificación de imágenes Clasificación de imágenes

Clasificación de textos Clasificación de textos

Regresión Predicción de valores


Tarea Escenario

Recomendación Recomendación

Previsión Previsión

Por ejemplo, el escenario de clasificación de opiniones como positivas o negativas se


correspondería a la tarea de clasificación binaria.

Para obtener más información sobre las distintas tareas de ML admitidas por [Link],
vea Tareas de aprendizaje automático en [Link].

¿Qué escenario de aprendizaje automático es el más


adecuado en cada caso?
En el Generador de modelos, debe seleccionar un escenario. El tipo de escenario
depende del tipo de predicción que esté intentando realizar.

Tabular

Clasificación de datos

La clasificación se utiliza para clasificar los datos en categorías.

Entrada de ejemplo

Salida de ejemplo

Longitud del sépalo Ancho del sépalo Longitud del pétalo Ancho del pétalo Especie

5,1 3,5 1.4 0,2 setosa

Especie prevista

setosa

Predicción de valores

La predicción de valores, que se corresponde a la tarea de regresión, se usa para


predecir números.
Entrada de ejemplo

Salida de ejemplo

vendor_id rate_code passenger_count trip_time_in_secs trip_distance payment_type

CMT 1 1 1271 3.8 CRD

Tarifa prevista

4.5.

Recomendación

El escenario de recomendaciones predice una lista de elementos sugeridos para un


usuario determinado, en función de la similitud y la diferencia entre los usuarios de
otros usuarios.

Puede usar el escenario de recomendación cuando tenga un conjunto de usuarios y un


conjunto de "productos", como artículos para comprar, películas, libros o programas de
TV, junto con un conjunto de "clasificaciones" de los usuarios de esos productos.
Entrada de ejemplo

Salida de ejemplo

UserId ProductId Rating

1 2 4,2

Clasificación prevista

4.5.

Previsión

El escenario de previsión usa datos históricos con un componente de serie temporal o


estacional.

Puede usar el escenario de previsión para predecir la demanda o la venta de un


producto.

Entrada de ejemplo

Salida de ejemplo

Fecha Cant. de venta

1/1/1970 1000

Previsión de 3 días

[1000,1001,1002]

Computer Vision

Clasificación de la imagen

La clasificación de imágenes se usa para identificar imágenes de distintas categorías. Por


ejemplo, diferentes tipos de terreno, animales o defectos de fabricación.

Puede usar el escenario de clasificación de la imagen si tiene un conjunto de imágenes y


desea clasificar las imágenes en distintas categorías.
Entrada de ejemplo

Salida de ejemplo

Etiqueta prevista

Perro

Detección de objetos

La detección de objetos se usa para ubicar y categorizar entidades dentro de las


imágenes. Por ejemplo, para buscar e identificar automóviles y personas en una imagen.

Puede usar la detección de objetos cuando las imágenes contengan varios objetos de
tipos diferentes.

Entrada de ejemplo

Salida de ejemplo
Procesamiento de lenguaje natural

Clasificación de textos

La clasificación de texto clasifica la entrada de texto sin formato.

El escenario de clasificación de texto se puede usar si tiene un conjunto de documentos


o comentarios y quiere clasificarlos en distintas categorías.

Entrada de ejemplo

Salida de ejemplo

Revisar

¡Cómo me gusta este filete!

Opinión

Positivo

Entorno
Puede entrenar el modelo de Machine Learning localmente en el equipo o en la nube en
Azure, en función del escenario.

Al entrenar localmente, se trabaja dentro de las restricciones de los recursos del equipo
(CPU, memoria y disco). Al entrenar en la nube, puede escalar verticalmente los recursos
para satisfacer las demandas de su escenario, especialmente para grandes conjuntos de
valores.

Escenario CPU local GPU local Azure

Clasificación de datos ✔️ ❌ ❌

Predicción de valores ✔️ ❌ ❌

Recomendación ✔️ ❌ ❌

Previsión ✔️ ❌ ❌

Clasificación de imágenes ✔️ ✔️ ✔️

Detección de objetos ❌ ❌ ✔️
Escenario CPU local GPU local Azure

Clasificación de textos ✔️ ✔️ ❌

Datos
Una vez que ha elegido el escenario, el generador de modelos pide que se proporcione
un conjunto de datos. Los datos se usan para entrenar, evaluar y elegir el mejor modelo
para el escenario.

El generador de modelos admite conjuntos de datos en formatos. tsv,. csv,. txt, así como
en el formato de base datos SQL. Si tiene un archivo .txt, las columnas se deben separar
con , , ; o \t .

Si el conjunto de archivos se compone de imágenes, los tipos de archivo admitidos son


.jpg y .png .

Para obtener más información, vea Carga de datos de entrenamiento en el Generador


de modelos.

Selección del resultado que se va a predecir (etiqueta)


Un conjunto de datos es una tabla de filas de ejemplos de entrenamiento y columnas de
atributos. Cada fila tiene:

una etiqueta (el atributo que se quiere predecir)


características (atributos que se usan como entradas para predecir la etiqueta).

En el escenario de predicción del precio de las viviendas, las características podrían ser:

los metros cuadrados de la vivienda


el número de dormitorios y baños
el código postal
La etiqueta es el precio histórico de la vivienda para esa fila de valores de metros
cuadrados, baños y dormitorios y el código postal.

Conjuntos de datos de ejemplo


Si aún no tiene datos propios, pruebe uno de estos conjuntos de datos:

Escenario Ejemplo Datos Etiqueta Características

Clasificación Predicción de datos de Ventas de productos Mes


anomalías de ventas ventas de
productos

Predicción de datos de Etiqueta (0 si la Comentario,


sentimiento de comentarios opinión es negativa, año
comentarios de de sitio 1 si es positiva)
sitios web web

Predicción de datos de Clase (1 si es Cantidad, V1-


transacciones de tarjetas de fraudulenta, en caso V28
tarjetas de crédito crédito contrario, 0) (características
fraudulentas anónimas)

Predecir el tipo de datos de Área Título,


problema en un problemas de descripción
repositorio de GitHub
GitHub

Predicción de Predicción del datos de Carrera Tiempo de


valores precio de los taxis carreras de viaje, distancia
taxi
Escenario Ejemplo Datos Etiqueta Características

Clasificación de Predicción de la imágenes de El tipo de flor: Los propios


la imagen categoría de una flor flores margarita, diente de datos de la
león, rosas, girasoles imagen
o tulipanes

Recomendación Predicción de clasificaciones Usuarios, películas Clasificaciones


películas que le de
gusten a alguien películas

Entrenamiento
Una vez que se seleccionan el escenario, el entorno, los datos y la etiqueta, el Generador
de modelos entrena el modelo.

¿Qué es el entrenamiento?
El entrenamiento es un proceso automático mediante el cual el Generador de modelos
enseña al modelo a responder a preguntas del escenario. Una vez entrenado, el modelo
puede realizar predicciones con datos de entrada que no ha visto antes. Por ejemplo, si
está prediciendo los precios de la vivienda y se pone en el mercado un nuevo inmueble,
puede predecir su precio de venta.

Dado que el Generador de modelos usa aprendizaje automático automatizado


(AutoML), no requiere ninguna entrada ni ajuste por parte del usuario durante el
entrenamiento.

¿Durante cuánto tiempo debe entrenarse?


El generador de modelos usa AutoML para explorar varios modelos y encontrar el mejor
modelo de rendimiento.

Los períodos de entrenamiento más largos permiten a AutoML explorar más modelos
con una mayor variedad de opciones de configuración.

En la tabla siguiente se resume el tiempo promedio necesario para obtener un buen


rendimiento en un conjunto de conjuntos de valores de ejemplo, en un equipo local.

Tamaño del conjunto de datos Promedio de tiempo para entrenar

0-10 MB 10 s
Tamaño del conjunto de datos Promedio de tiempo para entrenar

10-100 MB 10 min

100-500 MB 30 min

500-1 GB 60 min

1 GB o más 3 horas o más

Estos números son solo una guía. La duración exacta del entrenamiento depende de
varios factores:

El número de características (columnas) que se usan como entrada para el modelo


El tipo de columnas
La tarea de ML
El rendimiento de la CPU, el disco y la memoria de la máquina usada para el
entrenamiento

Por lo general, se aconseja usar más de 100 filas, ya que es posible que los conjuntos de
datos con una cantidad menor no generen ningún resultado.

Evaluate
La evaluación es el proceso por el que se mide el grado de calidad del modelo. El
Generador de modelo usa el modelo entrenado para realizar predicciones con nuevos
datos de prueba y luego mide la calidad de las predicciones.

El Generador de modelos divide los datos de entrenamiento en un conjunto de


entrenamiento y un conjunto de prueba. Los datos de entrenamiento (80 %) se usan
para entrenar el modelo y los datos de prueba (20 %) se incluyen para evaluar el
modelo.

¿Cómo puedo interpretar el rendimiento de mi modelo?


Un escenario se asigna a una tarea de aprendizaje automático. Cada tarea de ML tiene
su propio conjunto de métricas de evaluación.

Predicción de valores

La métrica predeterminada para los problemas de predicción de valores es RSquared, y


el valor de RSquared oscila entre 0 y 1. 1 es el mejor valor posible o, en otras palabras,
cuanto más se acerque el valor de RSquared a 1, mejor será el rendimiento del modelo.
Otras métricas notificadas, como pérdida absoluta, pérdida al cuadrado y pérdida RMS
son métricas adicionales, que pueden usarse para comprender el rendimiento del
modelo y compararlo con otros modelos de predicción de valores.

Clasificación (2 categorías)
La métrica predeterminada para los problemas de clasificación es la precisión. La
precisión define la proporción de predicciones correctas que realiza el modelo en el
conjunto de datos de prueba. Cuanto más cerca esté del 100 % o 1.0, mejor será el
modelo.

Otras métricas notificadas, como AUC (área bajo la curva), que mide la tasa de positivos
verdaderos frente a la tasa de falsos positivos, deben ser superiores a 0,50 para que los
modelos sean aceptables.

Se pueden usar métricas adicionales como la puntuación F1 para controlar el equilibrio


entre la precisión y la coincidencia.

Clasificación (3 categorías)
La métrica predeterminada para la clasificación multiclase es la microprecisión. Cuanto
más se acerque la microprecisión al 100 % o 1,0, mejor será el modelo.

Otra métrica importante para la clasificación multiclase es la macroprecisión, que, de


forma similar a la de la microprecisión, cuanto más se acerque a 1,0 mejor será el
modelo. Una buena manera de imaginarse estos dos tipos de precisión es el siguiente:

Microprecisión: ¿con qué frecuencia se clasifica una incidencia entrante en el


equipo adecuado?
Macroprecisión: para un equipo promedio, ¿con qué frecuencia es correcta una
incidencia entrante para su equipo?

Más información sobre las métricas de evaluación


Para obtener más información, vea Métricas de evaluación de modelos.

Mejora
Si la puntuación de rendimiento del modelo no es tan buena como se quiere que sea, se
puede:
Entrenar durante más tiempo. Con más tiempo, el motor de aprendizaje
automático automatizado experimenta con más algoritmos y configuraciones.

Agregar más datos. A veces la cantidad de datos no es suficiente para entrenar un


modelo de Machine Learning de alta calidad. Esto es especialmente cierto en el
caso de conjuntos de datos que tienen un número de ejemplos menor.

Equilibrar los datos. En las tareas de clasificación, asegúrese de que el conjunto de


entrenamiento esté equilibrado entre las categorías. Por ejemplo, si tiene cuatro
clases de 100 ejemplos de entrenamiento y las dos primeras (etiqueta1 y
etiqueta2) se usan para 90 registros, pero las otras dos (etiqueta3 y etiqueta4) solo
se usan en los 10 registros restantes, la falta de datos equilibrados puede hacer
que el modelo se esfuerce por predecir correctamente etiqueta3 o etiqueta4.

Consumo
Después de la fase de evaluación, el Generador de modelos genera un archivo de
modelo y el código que se puede usar para agregar el modelo a la aplicación. Los
modelos de [Link] se guardan como un archivo zip. El código para cargar y usar el
modelo se agrega como un nuevo proyecto a la solución. El Generador de modelos
también agrega una aplicación de consola de ejemplo que se puede ejecutar para ver el
modelo en acción.

Además, Model Builder ofrece la opción de crear proyectos que consumen el modelo.
Actualmente, Model Builder creará los proyectos siguientes:

Aplicación de consola: crea una aplicación de consola de .NET Core para realizar
predicciones a partir del modelo.
API web: crea una API web de [Link] Core que permite consumir el modelo por
Internet.

Pasos adicionales
Instalar la extensión de Visual Studio del generador de modelos

Pruebe la predicción de precios o cualquier escenario de regresión


Automatizar el entrenamiento del
modelo con la CLI de [Link]
Artículo • 05/06/2023

La CLI de [Link] automatiza la generación de modelos para desarrolladores de .NET.

Para usar la API de [Link] por sí misma (sin la CLI de AutoML de [Link]) debe elegir
un instructor (implementación de un algoritmo de aprendizaje automático para una
tarea determinada) y el conjunto de transformaciones de datos (ingeniería de
características) para aplicar a los datos. La canalización óptima puede variar para cada
conjunto de datos y seleccionar el algoritmo óptimo entre todas las opciones agrega
complejidad. Aún más, cada algoritmo tiene un conjunto de hiperparámetros que se
deben optimizar. Por lo tanto, puede ahorrar semanas y a veces meses en la
optimización del modelo de Machine Learning intentando encontrar las mejores
combinaciones de ingeniería de características, algoritmos de aprendizaje e
hiperparámetros.

La CLI de [Link] simplifica este proceso mediante el aprendizaje automático


automatizado (AutoML).

7 Nota

Este tema hace referencia a la CLI de [Link] y AutoML de [Link], que se


encuentran actualmente en versión preliminar, por lo que el material está sujeto a
cambios.

¿Qué es la herramienta de la interfaz de la línea


de comandos (CLI) de [Link]?
La CLI de [Link] es una herramienta de .NET Core. Una vez instalada, se proporciona
una tarea de aprendizaje automático y un conjunto de datos de entrenamiento, y
genera un modelo de [Link], así como el código de C# que se va a ejecutar para usar
el modelo en la aplicación.

Tal y como se muestra en la siguiente imagen, es fácil generar un modelo de [Link] de


alta calidad (archivo .zip del modelo serializado) además del código de C# de ejemplo
para ejecutar o calificar dicho modelo. Además, el código de C# para crear o entrenar
dicho modelo también se genera automáticamente para que pueda investigar e iterar
en el algoritmo y la configuración que se usan para ese "mejor modelo" generado.
Puede generar dichos recursos desde sus propios conjuntos de datos sin necesidad de
codificarlos usted, lo cual mejora también su productividad incluso si ya conoce [Link].

Actualmente, las tareas de Machine Learning compatibles con la CLI de [Link] son:

clasificación
Regresión
recomendación
clasificación de imágenes
pronóstico
entrenar

La CLI de [Link] se puede instalar en función del sistema operativo y su arquitectura


con el siguiente comando:

Consola

dotnet tool install --global mlnet-<OS>-<ARCH>

Por ejemplo, la versión x64 de Windows se puede instalar con:

Consola

dotnet tool install --global mlnet-win-x64

Para más información, consulte la guía paso a paso Instalación de la CLI de [Link].

Ejemplo de uso (escenario de clasificación):

Consola
mlnet classification --dataset "yelp_labelled.txt" --label-col 1 --has-
header false --train-time 10

Se puede ejecutar de la misma manera en Windows PowerShell, macOS/Linux bash o


Windows CMD. Sin embargo, Autocompletar tabular (sugerencias de parámetro) no
funcionará en Windows CMD.

Recursos de salida generados


Los comandos de tarea de ML de la CLI generan los siguientes recursos en la carpeta de
salida:

Un archivo .zip de modelo serializado ("mejor modelo") listo para usarse en la


ejecución de predicciones.
Solución de C# con:
El código de C# para ejecutar o calificar dicho modelo generado (para realizar
predicciones en las aplicaciones del usuario final con ese modelo).
El código de C# con el código de entrenamiento utilizado para generar ese
modelo (con fines de aprendizaje o posibilidad de volver a entrenar el modelo).
Archivo de registro con información de todas las iteraciones o barridos en varios
algoritmos evaluados, incluida su canalización o configuración detallada.

Los dos primeros recursos se pueden usar directamente en las aplicaciones de usuario
final (aplicación web [Link] Core, servicios, aplicación de escritorio, etc.) para realizar
predicciones con dicho modelo de ML generado.

El tercer recurso, el código de aprendizaje, le muestra el código de la API de [Link]


que utilizó la CLI para entrenar el modelo generado, de modo que pueda volver a
entrenar el modelo e investigar e iterar en qué hiperparámetros y algoritmos o
instructores específicos seleccionó la CLI y AutoML en el interior.
Descripción de la calidad del modelo
Al generar un "modelo mejor" con la herramienta de la CLI, verá métricas de calidad
(como precisión y R cuadrado) según corresponda a la tarea de ML que tiene como
destino.

Aquí se resumen esas métricas agrupadas por tareas de ML para que pueda
comprender la calidad de su "mejor modelo" autogenerado.

Métricas para modelos de clasificación


En la imagen siguiente se muestra la lista de métricas de clasificación para los cinco
modelos principales encontrados por la CLI:

La precisión es una métrica popular en los problemas de clasificación, pero no siempre


es la mejor métrica para seleccionar el mejor modelo, tal y como se explica en las
siguientes referencias. Hay casos donde es necesario evaluar la calidad del modelo con
métricas adicionales.

Para explorar y comprender las métricas que son el resultado de la CLI, consulte
Métricas de evaluación de clasificación.

Métricas para modelos de regresión y recomendación


Un modelo de regresión se ajusta bien a los datos si las diferencias entre los valores
observados y los valores de predicción del modelo son pequeñas y no están sesgadas.
La regresión se puede evaluar con determinadas métricas.

Verá una lista similar de métricas para los cinco modelos de calidad principales
encontrados por la CLI, pero en este caso, están relacionados con una tarea de ML de
regresión:

Para explorar y comprender las métricas que son el resultado de la CLI, consulte
Métricas de evaluación de regresión.
Vea también
Cómo instalar la herramienta de la CLI de [Link]
Tutorial: Análisis de opiniones mediante la CLI de [Link]
Referencia de comandos de la CLI de [Link]
Telemetría en la CLI de [Link]
¿Qué es [Link] y cómo funciona?
Artículo • 09/05/2023

[Link] ofrece la posibilidad de agregar aprendizaje automático en aplicaciones de


.NET, ya sea en escenarios en línea o sin conexión. Con esta funcionalidad, puede
realizar predicciones automáticas con los datos disponibles para su aplicación. Las
aplicaciones de aprendizaje automático usan los patrones en los datos para realizar
predicciones en lugar de tener que programarse de manera explícita.

La base de [Link] es un modelo de aprendizaje automático. El modelo especifica los


pasos necesarios para transformar los datos de entrada en una predicción. Con [Link],
puede entrenar un modelo personalizado mediante la especificación de un algoritmo, o
bien puede importar modelos TensorFlow y ONNX previamente entrenados.

Una vez que tiene un modelo, puede agregarlo a la aplicación para realizar las
predicciones.

[Link] se ejecuta en Windows, Linux y macOS con .NET Core o en Windows mediante
.NET Framework. La versión de 64 bits es compatible con todas las plataformas. La
versión de 32 bits es compatible con Windows, salvo para la funcionalidad relacionada
con TensorFlow, LightGBM y ONNX.

Algunos ejemplos del tipo de predicciones que puede hacer con [Link]:

Clasificación y categorización

División automática de los comentarios de los clientes en categorías positivas y


negativas

Regresión o predicción de valores continuos

Predicción del precio de viviendas en función del tamaño y la ubicación

Detección de anomalías

Detección de transacciones bancarias fraudulentas

Recomendaciones

Sugerencias de productos que pueden interesar a los compradores en Internet en


función de compras anteriores
Series temporales y datos secuenciales

Haga una previsión del tiempo y de las ventas de productos

Clasificación de imágenes

Clasifique las patologías de imágenes médicas

Clasificación de textos

Clasifique los documentos en función de su contenido.

Similitud de oraciones

Mide la similitud de dos oraciones.

Hello [Link] World


El código en el siguiente fragmento muestra la aplicación de [Link] más sencilla. En
este ejemplo se crea un modelo de regresión lineal para predecir los precios de la
vivienda con información sobre el tamaño y el precio de la vivienda.

C#

using System;
using [Link];
using [Link];

class Program
{
public class HouseData
{
public float Size { get; set; }
public float Price { get; set; }
}

public class Prediction


{
[ColumnName("Score")]
public float Price { get; set; }
}

static void Main(string[] args)


{
MLContext mlContext = new MLContext();

// 1. Import or create training data


HouseData[] houseData = {
new HouseData() { Size = 1.1F, Price = 1.2F },
new HouseData() { Size = 1.9F, Price = 2.3F },
new HouseData() { Size = 2.8F, Price = 3.0F },
new HouseData() { Size = 3.4F, Price = 3.7F } };
IDataView trainingData =
[Link](houseData);

// 2. Specify data preparation and model training pipeline


var pipeline = [Link]("Features", new[]
{ "Size" })
.Append([Link](labelColumnName:
"Price", maximumNumberOfIterations: 100));

// 3. Train model
var model = [Link](trainingData);

// 4. Make a prediction
var size = new HouseData() { Size = 2.5F };
var price = [Link]<HouseData,
Prediction>(model).Predict(size);

[Link]($"Predicted price for size: {[Link]*1000} sq


ft= {[Link]*100:C}k");

// Predicted price for size: 2500 sq ft= $261.98k


}
}

Flujo de trabajo del código


El siguiente diagrama representa la estructura del código de aplicación, así como el
proceso iterativo de desarrollo de modelos:

Recopilar y cargar datos de entrenamiento en un objeto IDataView


Especificar una canalización de operaciones para extraer características y aplicar un
algoritmo de aprendizaje automático
Entrenar un modelo mediante una llamada a Fit() en la canalización
Evaluar el modelo e iterar para mejorar
Guardar el modelo en formato binario, para su uso en una aplicación
Cargar el modelo en un objeto ITransformer
Realizar predicciones mediante una llamada a [Link]()
Vamos a profundizar un poco más en estos conceptos.

Modelo de Machine Learning


Un modelo de [Link] es un objeto que contiene las transformaciones que se realizarán
en los datos de entrada para llegar a los resultados previstos.

Básico
El modelo más básico es una regresión lineal bidimensional, donde una cantidad
continua es proporcional a otra, como se muestra en el ejemplo anterior del precio de la
vivienda.

El modelo es simplemente: P recio = b + T ama ño ∗ w. Los parámetros b y w se


calculan ajustando una línea en un conjunto de pares (tamaño, precio). Los datos que se
usan para buscar los parámetros del modelo se denominan datos de aprendizaje. Las
entradas de un modelo de Machine Learning se denominan características. En este
ejemplo, T amaño es la única característica. Los valores de datos reales en el terreno
que se usan para entrenar un modelo de Machine Learning se denominan etiquetas. En
este caso, los valores de P recio en el conjunto de datos de entrenamiento son las
etiquetas.

Más complejo
Un modelo más complejo clasifica las transacciones financieras en categorías utilizando
la descripción de texto de la transacción.

La descripción de cada transacción se divide en un conjunto de características quitando


palabras y caracteres redundantes, y contando combinaciones de palabras y caracteres.
El conjunto de características se utiliza para entrenar un modelo lineal según el conjunto
de categorías en los datos de aprendizaje. Cuanto más similar es una nueva descripción
a las del conjunto de entrenamiento, más probabilidades tiene de que se le asigne la
misma categoría.
Tanto el modelo de precios de vivienda como el modelo de clasificación de textos son
modelos lineales. Según la naturaleza de los datos y el problema que se va a resolver,
también puede usar modelos de árbol de decisión y modelos aditivos generalizados,
entre otros. Para obtener más información sobre los modelos, vea Tareas.

Preparación de datos
En la mayoría de los casos, los datos que tiene a su disposición no son aptos para usarse
directamente en el entrenamiento de un modelo de Machine Learning. Los datos sin
procesar deben prepararse o procesarse previamente antes de que se puedan usar para
buscar los parámetros del modelo. Es posible que los datos deban convertirse de
valores de cadena a una representación numérica. Puede que tenga información
redundante en los datos de entrada. Tal vez necesite reducir o expandir las dimensiones
de los datos de entrada. Puede que los datos deban normalizarse o escalarse.

Los tutoriales de [Link] le proporcionan información sobre las diferentes


canalizaciones de procesamiento de datos para texto, imágenes, datos numéricos y de
series temporales que se usan en tareas específicas de aprendizaje automático.
Cómo preparar los datos le explica cómo aplicar la preparación de datos de manera más
general.

Encontrará un apéndice de todas las transformaciones disponibles en la sección de


recursos.

Evaluación de modelo
Una vez que ha entrenado el modelo, ¿cómo sabe hasta qué punto realizará
predicciones futuras? Con [Link], puede evaluar su modelo con algunos datos de
prueba nuevos.

Cada tipo de tarea de aprendizaje automático tiene métricas que se usan para evaluar la
precisión y exactitud del modelo en el conjunto de datos de prueba.

En nuestro ejemplo de precios de vivienda, hemos usado la tarea Regresión. Para


evaluar el modelo, agregue el código siguiente en el ejemplo original.

C#

HouseData[] testHouseData =
{
new HouseData() { Size = 1.1F, Price = 0.98F },
new HouseData() { Size = 1.9F, Price = 2.1F },
new HouseData() { Size = 2.8F, Price = 2.9F },
new HouseData() { Size = 3.4F, Price = 3.6F }
};

var testHouseDataView =
[Link](testHouseData);
var testPriceDataView = [Link](testHouseDataView);

var metrics = [Link](testPriceDataView,


labelColumnName: "Price");

[Link]($"R^2: {[Link].##}");
[Link]($"RMS error:
{[Link].##}");

// R^2: 0.96
// RMS error: 0.19

Las métricas de evaluación indican que el error es bastante bajo y que la correlación
entre la salida de predicción y la salida de prueba es alta. ¡Qué sencillo! En los ejemplos
reales, se necesitan más ajustes para lograr las métricas del modelo adecuado.
Arquitectura de [Link]
En esta sección, veremos los patrones arquitectónicos de [Link]. Si es un desarrollador
experimentado de .NET, algunos de estos patrones le resultarán familiares y otros serán
menos conocidos. ¡Sujétese bien mientras nos sumergimos!

Una aplicación de [Link] se inicia con un objeto MLContext. Este objeto singleton
contiene catálogos. Un catálogo es una fábrica para cargar y guardar datos,
transformaciones, instructores y componentes de la operación de modelos. Cada objeto
de catálogo tiene métodos para crear los diferentes tipos de componentes:

Carga y guardado de datos

DataOperationsCatalog

Preparación de datos

TransformsCatalog

Algoritmos de entrenamiento

Clasificación binaria

BinaryClassificationCatalog

Clasificación multiclase

MulticlassClassificationCatalog

Detección de anomalías

AnomalyDetectionCatalog

Agrupación en clústeres

ClusteringCatalog

Previsión

ForecastingCatalog

Clasificación
RankingCatalog

Regresión

RegressionCatalog

Recomendación

RecommendationCatalog

Agregue el paquete NuGet [Link] .

TimeSeries

TimeSeriesCatalog

Agregue el paquete NuGet [Link] .

Uso del modelo

ModelOperationsCatalog

Puede navegar a los métodos de creación en cada una de las categorías anteriores. Con
Visual Studio, los catálogos se muestran a través de IntelliSense.

Crear la canalización
Dentro de cada catálogo hay un conjunto de métodos de extensión. Echemos un vistazo
a la forma en que se usan los métodos de extensión para crear una canalización de
entrenamiento.

C#

var pipeline = [Link]("Features", new[] {


"Size" })
.Append([Link](labelColumnName: "Price",
maximumNumberOfIterations: 100));

En el fragmento de código, Concatenate y Sdca son métodos en el catálogo. Cada uno


crea un objeto IEstimator que se anexa a la canalización.

En este momento, solo se crean los objetos. No se ha producido ninguna ejecución.

Entrenar el modelo
Una vez que se han creado los objetos en la canalización, se pueden usar datos para
entrenar el modelo.

C#

var model = [Link](trainingData);

Una llamada a Fit() usa los datos de entrenamiento de entrada para calcular los
parámetros del modelo. Esto se conoce como entrenar el modelo. Recuerde que el
modelo de regresión lineal anterior tenía dos parámetros de modelo: sesgo y peso.
Después de la llamada de Fit() , se conocen los valores de los parámetros. La mayoría
de los modelos tendrá muchos más parámetros que esto.

Puede obtener más información acerca del entrenamiento del modelo en Cómo
entrenar el modelo.

El objeto del modelo resultante implementa la interfaz ITransformer. Es decir, el modelo


transforma datos de entrada en predicciones.

C#

IDataView predictions = [Link](inputData);

Uso del modelo


Puede transformar datos de entrada en predicciones de forma masiva o una entrada a la
vez. En el ejemplo de precios de vivienda, lo hicimos de ambas maneras: de forma
masiva con el fin de evaluar el modelo y de uno en uno para realizar una predicción
nueva. Echemos un vistazo a la realización de predicciones únicas.

C#
var size = new HouseData() { Size = 2.5F };
var predEngine = [Link]<HouseData, Prediction>
(model);
var price = [Link](size);

El método CreatePredictionEngine() toma una clase de entrada y una clase de salida.


Los atributos de código o los nombres de campo determinan los nombres de las
columnas de datos utilizadas durante el entrenamiento del modelo y la predicción. Para
obtener más información, vea Realización de predicciones con un modelo entrenado.

Esquema y modelos de datos


En el núcleo de una canalización de aprendizaje automático de [Link] están los
objetos DataView.

Cada transformación en la canalización tiene un esquema de entrada (nombres, tipos y


tamaños de datos que la transformación espera ver en su entrada), así como un
esquema de salida (nombres, tipos y tamaños de datos que la transformación produce
después de la misma).

Si el esquema de salida de una transformación en la canalización no coincide con el


esquema de entrada de la siguiente transformación, [Link] producirá una excepción.

Un objeto de vista de datos tiene columnas y filas. Cada columna tiene un nombre, un
tipo y una longitud. Por ejemplo, las columnas de entrada en el ejemplo de precios de
vivienda son Tamaño y Precio. Ambas son tipos y cantidades escalares, en lugar de
vectores.
Todos los algoritmos [Link] buscan una columna de entrada que sea un vector. De
forma predeterminada, esta columna de vector se denomina Características. Este es el
motivo por el que concatenamos la columna Tamaño en una nueva columna
denominada Características en nuestro ejemplo de precios de vivienda.

C#

var pipeline = [Link]("Features", new[] {


"Size" })

Todos los algoritmos también crean nuevas columnas una vez que han realizado una
predicción. Los nombres fijos de estas nuevas columnas dependen del tipo de algoritmo
de aprendizaje automático. Para la tarea de regresión, una de las nuevas columnas se
denomina Puntuación. Este es el motivo por el que atribuimos nuestros datos de
precios con este nombre.

C#

public class Prediction


{
[ColumnName("Score")]
public float Price { get; set; }
}

Si desea obtener más información acerca de las columnas de salida de diferentes tareas
de aprendizaje automático, vea la guía Tareas de Machine Learning.

Una propiedad importante de los objetos DataView es que se evalúan de forma


diferida. Las vistas de datos solo se cargan y utilizan en las operaciones durante el
entrenamiento del modelo, la evaluación y la predicción de datos. Mientras escribe y
prueba la aplicación de [Link], puede utilizar el depurador de Visual Studio para echar
un vistazo a cualquier objeto de vista de datos llamando al método Preview.

C#

var debug = [Link]();

Puede ver la variable debug en el depurador y examinar su contenido. No utilice el


método Preview en el código de producción, ya que reduce significativamente el
rendimiento.

Implementación de modelos
En las aplicaciones de la vida real, el código de entrenamiento y evaluación del modelo
será independiente de la predicción. De hecho, estas dos actividades las realizan a
menudo equipos diferentes. El equipo de desarrollo del modelo puede guardar el
modelo para su uso en la aplicación de predicción.

C#

[Link](model, [Link],"[Link]");

Pasos siguientes
Aprenda a crear aplicaciones mediante diferentes tareas de aprendizaje
automático con conjuntos de datos más realistas en los tutoriales.

Obtenga información más detallada sobre temas específicos en las guías de


instrucciones.

Si está muy interesado, puede sumergirse directamente en la documentación de


referencia de la API.
Tutorial: Predicción de precios mediante
regresión con Model Builder
Artículo • 10/05/2023

Obtenga información sobre cómo usar el Generador de modelos de [Link] con el fin
de compilar un modelo de regresión para predecir precios. La aplicación de consola de
.NET que desarrolla en este tutorial predice las tarifas de taxi en función de los datos
históricos de tarifas de taxi de Nueva York.

La plantilla de predicción de precios del Generador de modelos puede usarse para


cualquier escenario que requiera la predicción de un valor numérico. Algunos escenarios
de ejemplo son: predicción del precio de la vivienda, predicción de la demanda y
previsión de ventas.

En este tutorial aprenderá a:

" Preparar y entender los datos


" Creación de un archivo de configuración de Model Builder
" Elección de un escenario
" Carga de los datos
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Requisitos previos
Para obtener una lista de los requisitos previos e instrucciones de instalación, visite la
Guía de instalación del Generador de modelos.

Creación de una aplicación de consola


1. Cree una aplicación de consola .NET Core de C# denominada "TaxiFarePrediction".
Asegúrese de que Colocar la solución y el proyecto en el mismo directorio esté
desactivada (VS 2019).

Preparar y entender los datos


1. Cree un directorio denominado Datos en el proyecto para almacenarlos archivos
del conjunto de datos.
2. El conjunto de datos que se usa para entrenar y evaluar el modelo de Machine
Learning procede originalmente del conjunto de datos NYC TLC Taxi Trip.

a. Para descargar el conjunto de datos, vaya al vínculo de descarga de taxi-fare-


[Link] .

b. Cuando se cargue la página, haga clic con el botón derecho en cualquier parte
de la página y seleccione Guardar como.

c. Use el cuadro de diálogo Guardar como para guardar el archivo en la carpeta


Data que creó en el paso anterior.

3. En el Explorador de soluciones, haga clic con el botón derecho en el archivo taxi-


[Link] y seleccione Propiedades. En Avanzadas, cambie el valor de Copiar
en el directorio de salida por Copiar si es posterior.

Cada fila del conjunto de datos [Link] contiene los detalles de los viajes
realizados por un taxi.

1. Abra el conjunto de datos [Link] de taxi y tarifas.

El conjunto de datos proporcionado contiene las columnas siguientes:

vendor_id: el identificador del taxista es una característica.


rate_code: el tipo de tarifa del viaje en taxi es una característica.
passenger_count: el número de pasajeros en el recorrido es una
característica.
trip_time_in_secs: la cantidad de tiempo que tardó el viaje. Por ejemplo, si
quiere calcular la tarifa del viaje antes de que termine y aún no conoce la
duración del viaje, el tiempo del viaje no es una característica, por lo que
deberá excluir esta columna del modelo.
trip_distance: la distancia del viaje es una característica.
payment_type: el método de pago (efectivo o tarjeta de crédito) es una
característica.
fare_amount: la tarifa de taxi total pagada es la etiqueta.

label es la columna que quiere predecir. Al realizar una tarea de regresión, el objetivo

es predecir un valor numérico. En este escenario de predicción de precio, se predice el


coste de un viaje de taxi. Por lo tanto, fare_amount es la etiqueta. Los valores de
features identificados son las entradas que se proporcionan al modelo para predecir
label . En este cas, el resto de las columnas, con la excepción de trip_time_in_secs, se

usan como características o entradas para predecir el importe de la tarifa.


Creación del archivo de configuración de
Model Builder
La primera vez que agregue Model Builder a la solución, se le pedirá que cree un archivo
mbconfig . El archivo mbconfig realiza el seguimiento de todo lo que hace en Model
Builder para permitirle volver a abrir la sesión.

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto


TaxiFarePrediction y seleccione Agregar>Modelo de Machine Learning...
2. Asigne el nombre mbconfig TaxiFarePredictional proyecto y haga clic en el botón
Agregar.

Elección de un escenario

Para entrenar el modelo, deberá seleccionarlo en la lista de escenarios de aprendizaje


automático disponibles proporcionada por el Generador de modelos. En este caso, el
escenario es Value prediction .

1. En el paso del escenario de la herramienta Model Builder, seleccione el escenario


Predicción de valores.

Selección del entorno


Model Builder ejecutar el entrenamiento en distintos entornos, en función del escenario
seleccionado.

1. Confirme que el elemento Local (CPU) esté seleccionado y haga clic en el botón
Paso siguiente.

Carga de los datos


El Generador de modelos acepta datos de dos orígenes, una base de datos de
SQL Server o un archivo local en formato .csv o .tsv.

1. En el paso de datos de la herramienta Model Builder, elija Archivo en la selección


del tipo de origen de datos.
2. Seleccione el botón Examinar junto al cuadro de texto y use el Explorador de
archivos para examinar y seleccionar [Link] en el directorio Datos.
3. Elija fare_amount en el menú desplegable Column to Predict (Label) (Columna
para la predicción [etiqueta]).
4. Haga clic en el vínculo Opciones avanzadas de datos.
5. En la pestaña Configuración de columnas, seleccione la lista desplegable
Propósito para la columna trip_time_in_secs, y seleccione Omitir para excluirla
como característica durante el entrenamiento. Haga clic en el botón Guardar para
cerrar el cuadro de diálogo.
6. Haga clic en el botón Paso siguiente.

Entrenamiento del modelo


La tarea de aprendizaje automático que se usa para entrenar el modelo de predicción
de precio en este tutorial es la regresión. Durante el proceso de entrenamiento de
modelos, el Generador de modelos entrena modelos independientes usando diferentes
opciones y algoritmos de regresión para encontrar el modelo con mejor rendimiento
para el conjunto de datos.

El tiempo necesario para el entrenamiento del modelo es proporcional a la cantidad de


datos. El generador de modelos selecciona automáticamente un valor predeterminado
para Tiempo de entrenamiento (segundos) en función del tamaño del origen de datos.

1. Deje el valor predeterminado como está para Tiempo de entrenamiento (segundos),


a menos que prefiera entrenar durante más tiempo.
2. Seleccione Iniciar entrenamiento.

Durante el proceso de entrenamiento, los datos de progreso se muestran en la sección


Training results del paso de entrenamiento.
En Estado se muestra el grado de finalización del proceso de entrenamiento.
En Mejor precisión se muestra la precisión del modelo con mejor rendimiento que
ha encontrado el Generador de modelos hasta el momento. Una mayor precisión
significa que el modelo realiza una predicción más correcta de los datos de
prueba.
En Mejor algoritmo se muestra el nombre del algoritmo con mejor rendimiento
que ha encontrado el Generador de modelos hasta el momento.
En Último algoritmo se muestra el nombre del algoritmo que ha usado más
recientemente el Generador de modelos para entrenar el modelo.

Una vez completado el entrenamiento, el archivo mbconfig tendrá el modelo generado


denominado [Link] después del entrenamiento y dos archivos de C#
con él:

[Link]: Este archivo tiene un método público que cargará el


modelo y creará un motor de predicción con él y devolverá la predicción.
[Link]: Este archivo consta de la canalización de entrenamiento que
Model Builder generó para crear el mejor modelo, incluidos los hiperparámetros
que usó.

Haga clic en el botón Paso siguiente para ir al paso de evaluación.

Evaluación del modelo


El resultado del paso de entrenamiento será un modelo que tenga el mejor rendimiento.
En el paso de evaluación de la herramienta Model Builder, la sección Mejor modelo
contendrá el algoritmo usado por el modelo con el mejor rendimiento en la entrada
Modelo, junto con las métricas para ese modelo en RSquared.

Además, en la ventana Salida de Visual Studio, habrá una tabla de resumen que
contiene los modelos principales y sus métricas.

Esta sección también le permitirá probar el modelo mediante una única predicción.
Ofrecerá cuadros de texto para rellenar los valores, y puede hacer clic en el botón
Predecir para obtener una predicción del mejor modelo. De manera predeterminada, se
rellenará con una fila aleatoria del conjunto de datos.

Si no está satisfecho con las métricas de precisión, una forma sencilla de intentar
mejorar la precisión del modelo es aumentar la cantidad de tiempo para entrenar el
modelo o usar más datos. De lo contrario, haga clic en Paso siguiente para ir al paso de
consumo.
(Opcional) Consumo del modelo
Este paso tendrá plantillas de proyecto que puede usar para consumir el modelo. Es
opcional y puede elegir el método que mejor se adapte a sus necesidades sobre cómo
atender el modelo.

Aplicación de consola
API Web

Aplicación de consola
Al agregar una aplicación de consola a la solución, se le pedirá que asigne un nombre al
proyecto.

1. Asigne al proyecto de consola el nombre TaxiFare_Console.

2. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

La salida generada por el programa debe ser similar al siguiente fragmento de


código:

Bash

Predicted Fare: 15.020833

API Web
Al agregar una API web a la solución, se le pedirá que asigne un nombre al proyecto.

1. Asigne al proyecto de API web el nombre TaxiFare_API.

2. Haga clic en Agregar a la solución* para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

4. Abra PowerShell y escriba el código siguiente, donde PORT es el puerto donde


escuchar la aplicación.

PowerShell

$body = @{
Vendor_id="CMT"
Rate_code=1.0
Passenger_count=1.0
Trip_distance=3.8
Payment_type="CRD"
}

Invoke-RestMethod "[Link] -Method Post -Body


($body | ConvertTo-Json) -ContentType "application/json"

5. Si se realiza correctamente, la salida debería ser similar al texto siguiente:

PowerShell

score
-----
15.020833

Pasos siguientes
En este tutorial ha aprendido a:

" Preparar y entender los datos


" Elección de un escenario
" Carga de los datos
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Recursos adicionales
Para más información sobre los temas mencionados en este tutorial, visite estos
recursos:

Escenarios del Generador de modelos


Regresión
Métricas de regresión del modelo
Conjunto de datos NYC TLC Taxi Trip
Análisis de opiniones mediante la CLI de
[Link]
Artículo • 05/06/2023

Aprenda a usar la CLI de [Link] para generar automáticamente un modelo de [Link]


y el código de C# subyacente. Usted proporciona el conjunto de datos y la tarea de
aprendizaje automático que quiere implementar, y la CLI utiliza el motor de AutoML
para crear el código fuente de implementación y generación de modelos, así como el
modelo de clasificación.

En este tutorial, llevará a cabo los pasos siguientes:

" Preparar los datos para la tarea de aprendizaje automático seleccionada


" Ejecución del comando "mlnet classification" desde la CLI
" Revisar los resultados de métrica de calidad
" Comprender el código de C# generado para usar el modelo en la aplicación
" Explorar el código de C# generado que se usó para entrenar el modelo

7 Nota

Este tema hace referencia a la herramienta de la CLI de [Link], que se encuentra


actualmente en versión preliminar, por lo que el material está sujeto a cambios.
Para obtener más información, visite la página de [Link] .

La CLI de [Link] forma parte de [Link] y su objetivo principal es "democratizar"


[Link] para desarrolladores de .NET durante el aprendizaje de [Link], por lo que no
es necesario codificar desde cero para empezar a trabajar.

Puede ejecutar la CLI de [Link] en cualquier símbolo del sistema (Windows, Mac o
Linux) para generar modelos de [Link] de buena calidad y el código fuente basado en
los conjuntos de datos de entrenamiento que proporcione.

Requisitos previos
SDK de .NET Core 6 o versiones posteriores.
(Opcional) Visual Studio
CLI de [Link]

Puede ejecutar los proyectos del código de C# generado desde Visual Studio o con
dotnet run (CLI de .NET).
Preparar los datos
Vamos a usar un conjunto de datos existente utilizado para un escenario de "análisis de
sentimiento", que es una tarea de aprendizaje automático de clasificación binaria. Puede
usar su propio conjunto de datos de forma similar, y el modelo y el código se generarán
automáticamente.

1. Descargue el archivo ZIP del conjunto de datos UCI Sentiment Labeled Sentences
(vea la referencia en la nota siguiente) y descomprímalo en la carpeta de su
elección.

7 Nota

Los conjuntos de datos que se utilizan en este tutorial provienen de "From


Group to Individual Labels using Deep Features", Kotzias et. al., KDD 2015, and
hosted at the UCI Machine Learning Repository - Dua, D. and Karra
Taniskidou, E. (2017). UCI Machine Learning Repository
[[Link] ]. Irvine, CA: University of California, School of
Information and Computer Science.

2. Copie el archivo yelp_labelled.txt en cualquier carpeta que haya creado


anteriormente (como /cli-test ).

3. Abra su símbolo del sistema preferido y muévalo a la carpeta donde copió el


archivo del conjunto de datos. Por ejemplo:

Consola

cd /cli-test

Con cualquier editor de texto como Visual Studio Code, puede abrir y explorar el
archivo del conjunto de datos yelp_labelled.txt . Puede ver la estructura de la
siguiente manera:

El archivo no tiene encabezado. Usará el índice de la columna.

Solo hay dos columnas:

Texto (índice de la columna 0) Etiqueta (índice de la


columna 1)

¡Anda! Me encantó el lugar. 1


Texto (índice de la columna 0) Etiqueta (índice de la
columna 1)

La corteza no es buena. 0

No es sabrosa y la textura era simplemente 0


desagradable.

...MUCHAS MÁS FILAS DE TEXTO... ...(1 o 0)...

Asegúrese de cerrar el archivo del conjunto de datos desde el editor.

Ya está listo para empezar a usar la CLI en este escenario de "análisis de


sentimiento".

7 Nota

Al finalizar este tutorial, también puede probar con sus propios conjuntos de
datos, siempre que estén listos para usarse en cualquiera de las tareas de ML
compatibles actualmente con la versión preliminar de la CLI de [Link], que
son "Clasificación binaria", "Clasificación", "Regresión" y "Recomendación" .

Ejecución del comando "mlnet classification"


1. Ejecute el siguiente comando de la CLI de [Link]:

Consola

mlnet classification --dataset "yelp_labelled.txt" --label-col 1 --has-


header false --train-time 10

Este comando ejecuta el comando mlnet classification :

para la Tarea de Machine Learning de clasificación


usa el archivo del conjunto de datos yelp_labelled.txt como conjunto de
datos de entrenamiento y pruebas (internamente la CLI utilizará la validación
cruzada o lo dividirá en dos conjuntos de datos: uno para el entrenamiento y
otro para las pruebas)
donde la columna de objetivo/destino que desea predecir (comúnmente
denominada "etiqueta" ) es la columna con el índice 1 (que es la segunda
columna, ya que el índice es de base cero)
no usa un encabezado de archivo con nombres de columna, puesto que este
archivo de conjunto de datos concreto no tiene un encabezado
el tiempo de exploración/entrenamiento de destino del experimento es de
10 segundos

Verá la salida de la CLI, similar a:

En este caso en concreto, en solo 10 segundos y con el pequeño conjunto de


datos proporcionado, la herramienta de la CLI fue capaz de ejecutar varias
iteraciones, lo que implica entrenar varias veces según diferentes combinaciones
de algoritmos o la configuración con diferentes transformaciones de datos
internos e hiperparámetros del algoritmo.

Por último, el modelo de "mejor calidad" que se encontró en 10 segundos es un


modelo que usa un instructor o algoritmo concreto con cualquier configuración
específica. Según el tiempo de exploración, el comando puede generar un
resultado diferente. La selección se basa en las diversas métricas que se muestran,
como Accuracy .

Descripción de las métricas de calidad del modelo

La primera métrica y la más sencilla para evaluar un modelo de clasificación binaria


es la precisión, la cual es muy fácil de entender. "La precisión es la proporción de
predicciones correctas con un conjunto de datos de prueba". Cuanto más cerca del
100 % (1,00), mejor.

Sin embargo, hay casos en los que solo medir con la métrica de precisión no es
suficiente, especialmente cuando la etiqueta (0 y 1 en este caso) está
desequilibrada en el conjunto de datos de prueba.

Para ver métricas adicionales e información más detallada acerca de las métricas,
como la precisión, AUC, AUCPR y la puntuación F1 utilizada para evaluar los
distintos modelos, lea Descripción de las métricas de [Link].

7 Nota
Puede probar este mismo conjunto de datos y especificar unos minutos para
--max-exploration-time (por ejemplo, tres minutos, por lo que se especifican
180 segundos) que encontrará un "mejor modelo" con una configuración de
canalización de entrenamiento distinta para este conjunto de datos (que es
bastante pequeño: 1000 filas).

Para encontrar un modelo de "mejor o buena calidad" que sea un "modelo listo
para la producción" dirigido a conjuntos de datos grandes, debe realizar
experimentos con la CLI normalmente especificando mucho más tiempo de
exploración según el tamaño del conjunto de datos. De hecho, en muchos casos es
posible que necesite varias horas de exploración, sobre todo si el conjunto de
datos es de gran tamaño en filas y columnas.

2. La ejecución del comando anterior ha generado los siguientes recursos:

Un .zip de modelo serializado ("mejor modelo") listo para usarse.


El código de C# para ejecutar o calificar dicho modelo generado (para
realizar predicciones en las aplicaciones del usuario final con ese modelo).
El código de entrenamiento de C# utilizado para generar ese modelo (con
fines de aprendizaje).
Un archivo de registro con todas las iteraciones exploradas con información
detallada específica acerca de cada algoritmo que se ha intentado con su
combinación de hiperparámetros y transformaciones de datos.

Los dos primeros recursos (modelo de archivo ZIP y el código de C# para ejecutar
ese modelo) se pueden usar directamente en las aplicaciones de usuario final
(aplicación web [Link] Core, servicios, aplicación de escritorio, etc.) para realizar
predicciones con dicho modelo de ML generado.

El tercer recurso, el código de aprendizaje, le muestra el código de la API de


[Link] que utilizó la CLI para entrenar el modelo generado, de modo que pueda
investigar qué hiperparámetros y algoritmos o instructores específicos seleccionó
la CLI.

Esos recursos enumerados se explican en los pasos siguientes del tutorial.

Explorar el código de C# generado que se


usará para ejecutar el modelo a fin de realizar
predicciones
1. En Visual Studio, abra la solución generada en la carpeta denominada
SampleClassification dentro de la carpeta de destino original (denominada /cli-
test en el tutorial). Debería ver una solución similar a esta:

7 Nota

En el tutorial, se recomienda usar Visual Studio, pero también puede explorar


el código de C# generado (dos proyectos) con cualquier editor de texto y
ejecutar la aplicación de consola generada con la dotnet CLI en macOS,
máquina Linux o Windows.

La aplicación de consola generada contiene un código de ejecución que


debe revisar. Después, normalmente reutiliza el "código de puntuación" (el
código que ejecuta el modelo de ML para realizar predicciones) moviendo
ese código sencillo (unas cuantas líneas) a la aplicación del usuario final en la
que quiere realizar las predicciones.
El archivo mbconfig generado es un archivo de configuración que se puede
usar para volver a entrenar el modelo, ya sea a través de la CLI o de Model
Builder. Esto también tendrá dos archivos de código asociados con él y un
archivo ZIP.
El archivo de entrenamiento contiene el código para compilar la
canalización de modelo mediante la API de [Link].
El archivo de consumo contiene el código para consumir el modelo.
El archivo ZIP es el modelo generado a partir de la CLI.

2. Abra el archivo [Link] en el archivo mbconfig. Verá


que hay clases de entrada y salida. Estas son clases de datos, o clases POCO, que
se usan para contener datos. Las clases contienen código reutilizable que resulta
útil si el conjunto de datos tiene decenas o incluso cientos de columnas.

La clase ModelInput se usa al leer los datos del conjunto de datos.


La clase ModelOutput se utiliza para obtener el resultado de la predicción
(datos de predicción).
3. Abra el archivo [Link] y explore el código. En unas cuantas líneas, podrá
ejecutar el modelo y realizar una predicción de ejemplo.

C#

static void Main(string[] args)


{
// Create single instance of sample data from first line of dataset
for model input
ModelInput sampleData = new ModelInput()
{
Col0 = @"Wow... Loved this place.",
};

// Make a single prediction on the sample data and print results


var predictionResult = [Link](sampleData);

[Link]("Using model to make single prediction --


Comparing actual Col1 with predicted Col1 from sample data...\n\n");
[Link]($"Col0: {sampleData.Col0}");
[Link]($"\n\nPredicted Col1 value
{[Link]} \nPredicted Col1 scores:
[{[Link](",", [Link])}]\n\n");
[Link]("=============== End of process, hit any key to
finish ===============");
[Link]();
}

Las primeras líneas de código crean datos de ejemplo únicos, en este caso
basados en la primera fila del conjunto de datos que se va a usar para la
predicción. También puede crear sus propios datos "codificados de forma
rígida" si actualiza el código:

C#

ModelInput sampleData = new ModelInput()


{
Col0 = "The [Link] CLI is great for getting started. Very
cool!"
};

La siguiente línea de código usa el método [Link]()


en los datos de entrada especificados para crear una predicción y devolver
los resultados (según el esquema [Link]).

Las últimas líneas de código imprimen las propiedades de los datos de


ejemplo (en este caso, el comentario), así como la predicción de opiniones y
las puntuaciones correspondientes para la opinión positiva (1) y la opinión
negativa (2).

4. Ejecute el proyecto, ya sea mediante los datos de ejemplo originales cargados


desde la primera fila del conjunto de datos o proporcionando sus propios datos de
ejemplo codificados de forma rígida y personalizados. Debería obtener una
predicción comparable a esta:

1. Pruebe a cambiar los datos de ejemplo codificados de forma rígida a otras frases
con diferentes opiniones y vea cómo el modelo predice opiniones positivas o
negativas.

Incorporar las aplicaciones del usuario final con


predicciones del modelo de ML
Puede usar un "código de puntuación del modelo de ML" similar para ejecutar el
modelo en la aplicación del usuario final y realizar predicciones.

Por ejemplo, podría mover directamente ese código a cualquier aplicación de escritorio
de Windows como WPF y WinForms y ejecutar el modelo de la misma manera que se
realizó en la aplicación de consola.

Sin embargo, la forma de implementar esas líneas de código para ejecutar un modelo
de ML debe optimizarse (es decir, copie en caché el archivo .zip del modelo y cárguelo
una vez) y debe tener objetos singleton en lugar de crearlos en cada solicitud,
especialmente si la aplicación debe ser escalable como una aplicación web o un servicio
distribuido, tal como se explica en la sección siguiente.

Ejecución de modelos de [Link] en aplicaciones web y


servicios escalables de [Link] Core (aplicaciones
multiproceso)
La creación del objeto de modelo ( ITransformer cargado desde el archivo .zip de un
modelo) y el objeto PredictionEngine debe optimizarse especialmente cuando se
ejecuta en aplicaciones web escalables y servicios distribuidos. En el primer caso, el
objeto de modelo ( ITransformer ), la optimización es sencilla. Puesto que el objeto
ITransformer es seguro para subprocesos, puede copiar en caché el objeto como un

singleton o un objeto estático para cargar el modelo una vez.

En el segundo objeto, el objeto PredictionEngine , no es tan fácil porque el objeto


PredictionEngine no es seguro para subprocesos, por lo que no se puede crear una

instancia de este objeto como singleton u objeto estático en una aplicación de [Link]
Core. Este problema de escalabilidad y seguridad para subprocesos se describe
detalladamente en esta entrada de blog .

Sin embargo, las cosas ahora son mucho más fáciles de lo que se explica en esa entrada
de blog. Hemos trabajado en un enfoque más sencillo para usted y hemos creado un
buen "paquete de integración de .NET Core" que puede usar fácilmente en sus
servicios y aplicaciones de [Link] Core registrándolos en los servicios de DI de la
aplicación (servicios de inserción de dependencias) y usándolos directamente desde el
código. Consulte el siguiente tutorial y ejemplo para hacerlo:

Tutorial: Ejecución de modelos de [Link] en aplicaciones web escalables de


[Link] Core y WebAPI
Ejemplo: Modelo de [Link] escalable en [Link] Core WebAPI

Explorar el código de C# generado que se usó


para entrenar el modelo de "mejor calidad"
Para fines de aprendizaje más avanzados, también puede explorar el código de C#
generado que utilizó la herramienta de la CLI para entrenar el modelo generado.

Dicho código de modelo de entrenamiento se genera en el archivo denominado


[Link] para que pueda investigar ese código de
entrenamiento.

Más importante aún, para este escenario en particular (modelo de análisis de


sentimiento) también puede comparar dicho código de entrenamiento generado con el
código que se explica en el tutorial siguiente:

Comparación: Tutorial: Uso de [Link] en un escenario de clasificación binaria de


análisis de sentimiento.
Resulta interesante comparar el algoritmo elegido y la configuración de canalización en
el tutorial con el código generado por la herramienta de la CLI. Según cuánto tiempo
dedique a iterar y buscar modelos mejores, el algoritmo elegido podría ser diferente,
junto con su configuración de canalización e hiperparámetros determinados.

En este tutorial ha aprendido a:

" Preparar los datos para la tarea de ML seleccionada (problema para resolver)


" Ejecución del comando "mlnet classification" en la herramienta de la CLI
" Revisar los resultados de métrica de calidad
" Comprender el código de C# generado para ejecutar el modelo (código para usar
en la aplicación del usuario final)
" Exploración del código de C# generado que se usó para entrenar el modelo de
"mejor calidad" (con fines de aprendizaje)

Vea también
Automatizar el entrenamiento del modelo con la CLI de [Link]
Tutorial: Ejecución de modelos de [Link] en aplicaciones web escalables de
[Link] Core y WebAPI
Ejemplo: Modelo de [Link] escalable en [Link] Core WebAPI
Guía de referencia de comandos de entrenamiento automático de la CLI de
[Link]
Telemetría en la CLI de [Link]
Tutorial: Análisis del sentimiento de los
comentarios del sitio web en una
aplicación web con el Generador de
modelos de [Link]
Artículo • 10/05/2023

Aprenda a analizar la opinión de los comentarios en tiempo real dentro de una


aplicación web.

En este tutorial se muestra cómo crear una aplicación Razor Pages de [Link] Core que
clasifica las opiniones de los comentarios del sitio web en tiempo real.

En este tutorial aprenderá a:

" Crear una aplicación Razor Pages de [Link] Core


" Preparar y entender los datos
" Elección de un escenario
" Carga de los datos
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Puede encontrar el código fuente para este tutorial en el repositorio


dotnet/machinelearning-samples .

Requisitos previos
Para obtener una lista de los requisitos previos e instrucciones de instalación, visite la
Guía de instalación del Generador de modelos.

Creación de una aplicación Razor Pages


Cree una aplicación Razor Pages de [Link] Core.

1. En Visual Studio, abra el cuadro de diálogo Crear un proyecto.


2. En el cuadro de diálogo "Crear un proyecto", seleccione la plantilla de proyecto
Aplicación web de [Link] Core.
3. En el cuadro de texto Nombre, escriba "SentimentRazor" y seleccione el botón
Siguiente.
4. En el cuadro de diálogo Información adicional, deje todos los valores
predeterminados tal y como están y seleccione el botón Crear.

Preparar y entender los datos


Descargue el conjunto de datos detox de Wikipedia . Cuando se abra la página web,
haga clic con el botón derecho en la página, seleccione Guardar como y guarde el
archivo en cualquier parte del equipo.

Cada fila del conjunto de datos [Link] presenta una opinión


distinta que un usuario deja en Wikipedia. La primera columna representa el sentimiento
del texto (0 indica no tóxico, 1 indica tóxico) y la segunda columna representa el
comentario que deja el usuario. Las columnas están separadas por tabulaciones. Los
datos tienen un aspecto similar al siguiente:

Opinión SentimentText

1 ==RUDE== Dude, you are rude upload that carl picture back, or else. (Oye, vuelve a
subir esa foto de Carl o te las verás conmigo).

1 == OK! == IM GOING TO VANDALIZE WILD ONES WIKI THEN!!! (BUENO, ENTONCES


VOY A VANDALIZAR ALGUNAS WIKI).

0 I hope this helps. (Espero que esto ayude).

Crear un archivo de configuración de Model


Builder
Al agregar por primera vez un modelo de Machine Learning a la solución, se le pedirá
que cree un archivo mbconfig . El archivo mbconfig realiza el seguimiento de todo lo que
hace en Model Builder para permitirle volver a abrir la sesión.

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto


SentimentRazor y seleccione Agregar>Modelo de Machine Learning.
2. En el cuadro de diálogo, asigne al proyecto de Model Builder el nombre
[Link] y seleccione Agregar.

Elección de un escenario

Para entrenar el modelo, deberá seleccionarlo en la lista de escenarios de aprendizaje


automático disponibles proporcionada por el Generador de modelos.

En este ejemplo, la tarea es la clasificación de texto. En el paso Escenario de la extensión


Model Builder, seleccione el escenario Clasificación de imágenes.

Selección de un entorno
Model Builder puede entrenar en diferentes entornos en función del escenario
seleccionado.

Seleccione Local (GPU) como entorno y haga clic en el botón Siguiente paso.

7 Nota

En este escenario, se usan técnicas de aprendizaje profundo que funcionan mejor


en entornos de GPU. Si no tiene una GPU, elija el entorno Local (CPU), pero tenga
en cuenta que el tiempo esperado para el entrenamiento será significativamente
más largo. Para obtener más información sobre el uso de GPU con Model Builder,
consulte la Instalación de la compatibilidad con GPU en Model Builder.

Carga de los datos


El Generador de modelos acepta datos de dos orígenes, una base de datos de
SQL Server o un archivo local en formato csv o tsv .

1. En el paso de datos de la herramienta Model Builder, seleccione Archivo en las


opciones de origen de datos.
2. Seleccione el botón junto al cuadro de texto Seleccionar un archivo y use el
Explorador de archivos para examinar y seleccionar el archivo wikipedia-detox-250-
[Link].
3. Seleccione Sentimiento en el menú desplegable Columna para predecir
(etiqueta).
4. Elija SentimentText en la lista desplegable Columna de texto.
5. Seleccione el botón Siguiente paso para ir al paso siguiente en Model Builder.

Entrenar el modelo
La tarea de aprendizaje automático que se usa para entrenar el modelo de análisis de
sentimiento en este tutorial es la clasificación de texto. Durante el proceso de
entrenamiento del modelo, Model Builder entrena un modelo de clasificación de texto
para el conjunto de datos mediante la arquitectura de red neuronal NAS-BERT .

1. Seleccione Iniciar entrenamiento.

2. Una vez completado el entrenamiento, los resultados del proceso de


entrenamiento se muestran en la sección Resultados del entrenamiento de la
pantalla Entrenar. Además de proporcionar los resultados del entrenamiento, se
crean tres archivos de código subyacente en el archivo
[Link].

[Link]: este archivo contiene los esquemas


ModelInput y ModelOutput , así como la función Predict generada para
consumir el modelo.
[Link]: este archivo contiene la canalización de
entrenamiento (transformaciones de datos, entrenador, hiperparámetros del
entrenador) elegida por Model Builder para entrenar el modelo. Puede usar
esta canalización para volver a entrenar el modelo.
*[Link]: archivo ZIP serializado que representa el modelo de
[Link] entrenado.

3. Seleccione el botón Siguiente paso para ir al paso siguiente.

Evaluar el modelo
El resultado del paso de entrenamiento será un modelo que tiene el mejor rendimiento.
En el paso de evaluación de la herramienta Model Builder, la sección de salida
contendrá el entrenador utilizado por el modelo de mejor rendimiento así como las
métricas de evaluación.

Si no está satisfecho con las métricas de evaluación, algunas maneras fáciles de intentar
mejorar el rendimiento del modelo consisten en usar más datos.

En caso contrario, seleccione el botón Siguiente paso para avanzar al paso Consumo de
Model Builder.

Adición de plantillas de proyecto de consumo


(opcional)
En el paso Consumo, Model Builder proporciona plantillas de proyecto que puede usar
para consumir el modelo. Este paso es opcional y puede elegir el método que mejor se
adapte a sus necesidades para usar el modelo.

Aplicación de consola
Web API

Incorporación del código para hacer


predicciones

Configuración del grupo PredictionEngine


Para realizar una sola predicción, tendrá que crear un objeto
PredictionEngine<TSrc,TDst>. PredictionEngine<TSrc,TDst> no es seguro para
subprocesos. Además, tiene que crear una instancia en cualquier lugar en que se
necesite dentro de la aplicación. A medida que crece la aplicación, este proceso puede
volverse difícil de administrar. Para mejorar el rendimiento y la seguridad para
subprocesos, use una combinación de inserción de dependencias y el servicio
PredictionEnginePool , que crea un elemento ObjectPool<T> de objetos

PredictionEngine<TSrc,TDst> para usarlo en toda la aplicación.

1. Instale el paquete [Link] de NuGet:


a. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y
seleccione Administrar paquetes NuGet.
b. Elija "[Link]" como origen del paquete.
c. Seleccione la pestaña Examinar y busque [Link].
d. Seleccione el paquete en la lista y haga clic en el botón Instalar.
e. Haga clic en el botón Aceptar en el cuadro de diálogo Vista previa de los
cambios.
f. Haga clic en el botón Acepto en el cuadro de diálogo Aceptación de la licencia
si está de acuerdo con los términos de licencia de los paquetes que aparecen.

2. Abra el archivo [Link] del proyecto SentimentRazor.

3. Agregue las instrucciones USING siguientes para hacer referencia al paquete de


NuGet [Link] y al proyecto [Link]:

C#

using [Link];
using static [Link];

4. Configure el elemento PredictionEnginePool<TData,TPrediction> de la aplicación


en el archivo [Link]:

C#

[Link]<ModelInput, ModelOutput>()
.FromFile("[Link]");

Creación de un controlador de análisis de sentimiento


Las predicciones se realizarán dentro de la página principal de la aplicación. Por tanto,
se necesita un método que tome las entradas del usuario y use
PredictionEnginePool<TData,TPrediction> para devolver una predicción.

1. Abra el archivo [Link] ubicado en el directorio Pages y agregue las


instrucciones USING siguientes:

C#

using [Link];
using static [Link];

Para usar el elemento PredictionEnginePool<TData,TPrediction> configurado en el


archivo [Link], debe insertarlo en el constructor del modelo donde quiere
usarlo.
2. Agregue una variable para hacer referencia a
PredictionEnginePool<TData,TPrediction> dentro de la clase IndexModel dentro
del archivo Pages/[Link].

C#

private readonly PredictionEnginePool<ModelInput, ModelOutput>


_predictionEnginePool;

3. Modifique el constructor en la clase IndexModel e inserte el servicio


PredictionEnginePool<TData,TPrediction> en él.

C#

public IndexModel(ILogger<IndexModel> logger,


PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool)
{
_logger = logger;
_predictionEnginePool = predictionEnginePool;
}

4. Cree un controlador de método que use PredictionEnginePool para hacer


predicciones a partir de la información proporcionada por el usuario recibida
desde la página web.

a. Debajo del método OnGet , cree un método nuevo denominado


OnGetAnalyzeSentiment .

C#

public IActionResult OnGetAnalyzeSentiment([FromQuery] string text)


{

b. Dentro del método OnGetAnalyzeSentiment , devuelva un sentimiento neutral si


la información ingresada por el usuario es nula o está en blanco.

C#

if ([Link](text)) return Content("Neutral");

c. Dada una entrada válida, cree una instancia nueva de ModelInput .


C#

var input = new ModelInput { SentimentText = text };

d. Use PredictionEnginePool<TData,TPrediction> para predecir el sentimiento.

C#

var prediction = _predictionEnginePool.Predict(input);

e. Convierta el valor bool de predicción en Tóxico o No tóxico con el código


siguiente.

C#

var sentiment = [Link]([Link]) ?


"Toxic" : "Not Toxic";

f. Por último, devuelva el sentimiento a la página web.

C#

return Content(sentiment);

Configuración de la página web


Los resultados que devuelve el OnGetAnalyzeSentiment se mostrarán de manera
dinámica en la página web Index .

1. Abra el archivo [Link] del directorio Pages y reemplace su contenido por el


código siguiente:

CSHTML

@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}

<div class="text-center">
<h2>Live Sentiment</h2>

<p><textarea id="Message" cols="45" placeholder="Type any text like


a short review"></textarea></p>
<div class="sentiment">
<h4>Your sentiment is...</h4>
<p>😡 😐 😍</p>

<div class="marker">
<div id="markerPosition" style="left: 45%;">
<div>▲</div>
<label id="markerValue">Neutral</label>
</div>
</div>
</div>
</div>

2. A continuación, agregue el código de estilo CSS al final de la página [Link] en el


directorio wwwroot\css:

css

/* Style for sentiment display */

.sentiment {
background-color: #eee;
position: relative;
display: inline-block;
padding: 1rem;
padding-bottom: 0;
border-radius: 1rem;
}

.sentiment h4 {
font-size: 16px;
text-align: center;
margin: 0;
padding: 0;
}

.sentiment p {
font-size: 50px;
}

.sentiment .marker {
position: relative;
left: 22px;
width: calc(100% - 68px);
}

.sentiment .marker > div {


transition: 0.3s ease-in-out;
position: absolute;
margin-left: -30px;
text-align: center;
}
.sentiment .marker > div > div {
font-size: 50px;
line-height: 20px;
color: green;
}

.sentiment .marker > div label {


font-size: 30px;
color: gray;
}

3. Después, agregue código para enviar entradas desde la página web al controlador
OnGetAnalyzeSentiment .

a. En el archivo [Link] que se encuentra en el directorio wwwroot\js, cree una


función llamada getSentiment para realizar una solicitud HTTP GET con la
entrada del usuario al controlador OnGetAnalyzeSentiment .

JavaScript

function getSentiment(userInput) {
return fetch(`Index?handler=AnalyzeSentiment&text=${userInput}`)
.then((response) => {
return [Link]();
})
}

b. A continuación, agregue otra función llamada updateMarker para actualizar


dinámicamente la posición del marcador en la página web cuando se predice el
sentimiento.

JavaScript

function updateMarker(markerPosition, sentiment) {


$("#markerPosition").attr("style", `left:${markerPosition}%`);
$("#markerValue").text(sentiment);
}

c. Cree una función de controlador de eventos llamada updateSentiment para


obtener la entrada del usuario, envíela a la función OnGetAnalyzeSentiment
mediante la función getSentiment y actualice el marcador con la función
updateMarker .

JavaScript
function updateSentiment() {

var userInput = $("#Message").val();

getSentiment(userInput)
.then((sentiment) => {
switch (sentiment) {
case "Not Toxic":
updateMarker(100.0, sentiment);
break;
case "Toxic":
updateMarker(0.0, sentiment);
break;
default:
updateMarker(45.0, "Neutral");
}
});
}

d. Por último, registre el controlador de eventos y enlácelo al elemento textarea


con el atributo id=Message .

JavaScript

$("#Message").on('change input paste', updateSentiment)

Ejecutar la aplicación
Ahora que la aplicación está configurada, ejecútela. Se debería iniciar en el explorador.

Cuando se inicie la aplicación, escriba Este modelo no tiene suficientes datos en el área
de texto. El sentimiento previsto que aparece debe ser Tóxico.
7 Nota

PredictionEnginePool<TData,TPrediction> crea varias instancias de


PredictionEngine<TSrc,TDst>. Debido al tamaño del modelo, la primera vez que se
usa para realizar una predicción, puede tardar un par de segundos. Las
predicciones posteriores deben ser instantáneas.

Pasos siguientes
En este tutorial ha aprendido a:

" Crear una aplicación Razor Pages de [Link] Core


" Preparar y entender los datos
" Elección de un escenario
" Carga de los datos
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Recursos adicionales
Para más información sobre los temas mencionados en este tutorial, visite estos
recursos:

Escenarios del Generador de modelos


Métricas de evaluación para clasificación de varias clases y clasificación de texto
Tutorial: Clasificación de la gravedad de
las infracciones sanitarias en
restaurantes con Model Builder
Artículo • 10/05/2023

Aprenda a crear un modelo de clasificación multiclase mediante el generador de


modelos para categorizar el nivel de riesgo de las infracciones de restaurantes
detectadas durante inspecciones sanitarias.

En este tutorial aprenderá a:

" Preparar y entender los datos


" Crear un archivo de configuración de Model Builder
" Elección de un escenario
" Cargar datos desde una base de datos
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Prerrequisitos
Para obtener una lista de los requisitos previos e instrucciones de instalación, visite la
Guía de instalación del Generador de modelos.

Información general de clasificación multiclase


del Generador de modelos
En este ejemplo se crea una aplicación de consola .NET Core de C# que categoriza el
riesgo de las infracciones sanitarias mediante un modelo de aprendizaje automático
creado con el Generador de modelos. Puede encontrar el código fuente para este
tutorial en el repositorio dotnet/machinelearning-samples de GitHub.

Creación de una aplicación de consola


1. Cree una aplicación de consola .NET Core de C# denominada
"RestaurantViolations".
Preparar y entender los datos
El conjunto de datos que se usa para entrenar y evaluar el modelo de aprendizaje
automático proviene originalmente de San Francisco Department of Public Health
Restaurant Safety Scores (Puntuaciones de seguridad de restaurantes del
Departamento de Sanidad Pública de San Francisco). Para mayor comodidad, el
conjunto de datos se ha condensado para incluir solo las columnas relevantes a fin
de entrenar el modelo y realizar las predicciones. Visite el sitio web siguiente para
obtener más información sobre el conjunto de datos .

Descargue el conjunto de datos Restaurant Safety Scores y descomprímalo.

Cada fila del conjunto de datos contiene información relacionada con las infracciones
observadas durante una inspección del Departamento de Sanidad y una evaluación del
riesgo de la amenaza de esas infracciones para la salud pública y la seguridad.

InspectionType ViolationDescription RiskCategory

Rutina: no Superficies de contacto para alimentos limpiadas o Riesgo


programada desinfectadas incorrectamente moderado

Nuevo Riesgo alto de infestación por parásitos Riesgo alto


propietario

Rutina: no Paños de limpieza sucios o incorrectamente almacenados o Riesgo bajo


programada desinfectados

InspectionType: el tipo de inspección. Esto puede ser una inspección inicial de un


nuevo establecimiento, una inspección rutinaria, una inspección de quejas y otros
muchos tipos.
ViolationDescription: descripción de la infracción detectada durante la inspección.
RiskCategory: gravedad del riesgo que supone una infracción para la seguridad y
la sanidad pública.

label es la columna que quiere predecir. Al realizar una tarea de clasificación, el


objetivo es asignar una categoría (de texto o numérica). En este escenario de
clasificación, se asigna a la gravedad de la infracción el valor de riesgo bajo, moderado o
alto. Por tanto, RiskCategory es la etiqueta. Los valores de features son las entradas
que se proporcionan al modelo para predecir label . En este caso, InspectionType y
ViolationDescription se usan como características o entradas para predecir el valor de
RiskCategory.
Creación del archivo de configuración de
Model Builder
La primera vez que agregue Model Builder a la solución, se le pedirá que cree un archivo
mbconfig . El archivo mbconfig realiza el seguimiento de todo lo que hace en Model
Builder para permitirle volver a abrir la sesión.

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto


RestaurantViolations y seleccione Agregar>Modelo de Machine Learning... .
2. Asigne el nombre mbconfig RestaurantViolationsPredictional proyecto y haga clic
en el botón Agregar.

Elección de un escenario

Para entrenar el modelo, seleccione en la lista de escenarios de aprendizaje automático


disponibles proporcionada por el Generador de modelos. En este caso, el escenario es
de Clasificación de datos.

1. Para este ejemplo, la tarea es una clasificación multiclase. En el paso Escenario del
Generador de modelos, seleccione el escenario Clasificación de datos.

Carga de los datos


Model Builder acepta datos de una base de datos SQL Server o un archivo local en
formato csv , tsv o txt .

1. En el paso de datos de la herramienta Model Builder, elija SQL Server en la


selección de tipo de origen de datos.
2. Seleccione el botón Elegir origen de datos.
a. En el cuadro de diálogo Elegir origen de datos, seleccione Archivo de base de
datos de Microsoft SQL Server.
b. Desactive la casilla Usar siempre esta selección y haga clic en Continuar.
c. En el cuadro de diálogo Propiedades de conexión, seleccione Examinar y
después el archivo [Link] descargado.
d. Seleccione Aceptar.
3. Elija Infracciones en el menú desplegable Tabla.
4. Elija RiskCategory en el menú desplegable Column to predict (Label) (Columna
para la predicción [etiqueta]).
5. Deje las selecciones predeterminadas en Opciones avanzadas de datos.
6. Haga clic en el botón Paso siguiente para ir al paso de entrenamiento en Model
Builder.

Entrenamiento del modelo


La tarea de aprendizaje automático que se usa para entrenar el modelo de clasificación
de problemas de este tutorial es la clasificación multiclase. Durante el proceso de
entrenamiento del modelo, el Generador de modelos entrena modelos independientes
con diferentes opciones y algoritmos de clasificación multiclase para encontrar el
modelo con mejor rendimiento para el conjunto de datos.

El tiempo necesario para el entrenamiento del modelo es proporcional a la cantidad de


datos. El generador de modelos selecciona automáticamente un valor predeterminado
para Tiempo de entrenamiento (segundos) en función del tamaño del origen de datos.

1. Model Builder establezca el valor de Tiempo de entrenamiento (segundos) en


60 segundos. El entrenamiento durante un período de tiempo más prolongado
permite que el Generador de modelos explore un mayor número de algoritmos y
combinación de parámetros en la búsqueda del mejor modelo.
2. Haga clic en Iniciar entrenamiento.

Durante el proceso de entrenamiento, los datos de progreso se muestran en la sección


Training results del paso de entrenamiento.

En Estado se muestra el grado de finalización del proceso de entrenamiento.


En Mejor precisión se muestra la precisión del modelo con mejor rendimiento que
ha encontrado el Generador de modelos hasta el momento. Una mayor precisión
significa que el modelo realiza una predicción más correcta de los datos de
prueba.
En Mejor algoritmo se muestra el nombre del algoritmo con mejor rendimiento
que ha encontrado el Generador de modelos hasta el momento.
En Último algoritmo se muestra el nombre del algoritmo que ha usado más
recientemente el Generador de modelos para entrenar el modelo.

Una vez completado el entrenamiento, el archivo mbconfig tendrá el modelo generado


denominado [Link] después del entrenamiento y dos
archivos de C# con él:

[Link]: Este archivo tiene un método


público que cargará el modelo y creará un motor de predicción con él y devolverá
la predicción.
[Link]: Este archivo consta de la canalización
de entrenamiento que Model Builder generó para crear el mejor modelo, incluidos
los hiperparámetros que usó.

Haga clic en el botón Paso siguiente para ir al paso de evaluación.

Evaluación del modelo


El resultado del paso de entrenamiento será un modelo que tenga el mejor rendimiento.
En el paso de evaluación de la herramienta Model Builder, la sección Mejor modelo
contendrá el algoritmo usado por el modelo con el mejor rendimiento en la entrada
Modelo, junto con las métricas para ese modelo en Accuracy.

Además, en la ventana Salida de Visual Studio, habrá una tabla de resumen que
contiene los modelos principales y sus métricas.

Esta sección también le permitirá probar el modelo mediante una única predicción.
Ofrecerá cuadros de texto para rellenar los valores, y puede hacer clic en el botón
Predecir para obtener una predicción del mejor modelo. De manera predeterminada, se
rellenará con una fila aleatoria del conjunto de datos.

(Opcional) Consumo del modelo


Este paso tendrá plantillas de proyecto que puede usar para consumir el modelo. Es
opcional y puede elegir el método que mejor se adapte a sus necesidades sobre cómo
atender el modelo.
Aplicación de consola
API Web

Aplicación de consola
Al agregar una aplicación de consola a la solución, se le pedirá que asigne un nombre al
proyecto.

1. Asigne al proyecto de consola el nombre RestaurantViolationsPrediction_Console.

2. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

La salida generada por el programa debe ser similar al siguiente fragmento de


código:

Bash

InspectionType: Routine - Unscheduled


ViolationDescription: Moderate risk food holding temperature

Predicted RiskCategory: Moderate Risk

API Web
Al agregar una API web a la solución, se le pedirá que asigne un nombre al proyecto.

1. Asigne al proyecto de API web el nombre RestaurantViolationsPrediction_API.

2. Haga clic en Agregar a la solución* para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

4. Abra PowerShell y escriba el código siguiente, donde PORT es el puerto donde


escuchar la aplicación.

PowerShell

$body = @{
InspectionType="Reinspection/Followup"
ViolationDescription="Inadequately cleaned or sanitized food
contact surfaces"
}

Invoke-RestMethod "[Link] -Method Post -Body


($body | ConvertTo-Json) -ContentType "application/json"
5. Si se realiza correctamente, la salida debería ser similar al texto siguiente. La salida
tiene la RiskCategory predicha como Moderate Risk y tiene las puntuaciones de
cada una de las etiquetas de entrada: Low Risk, High Risk y Moderate Risk.

PowerShell

prediction score
---------- -----
Moderate Risk {0.055566575, 0.058012854, 0.88642055}

¡Enhorabuena! Ha creado correctamente un modelo de aprendizaje automático para


categorizar el riesgo de infracciones sanitarias mediante el Generador de modelos.
Puede encontrar el código fuente para este tutorial en el repositorio
dotnet/machinelearning-samples de GitHub.

Recursos adicionales
Para más información sobre los temas mencionados en este tutorial, visite estos
recursos:

Escenarios del Generador de modelos


Clasificación multiclase
Métricas de modelos de clasificación multiclase
Entrenamiento de un modelo de
clasificación de imágenes en Azure
mediante Model Builder
Artículo • 10/05/2023

Aprenda a entrenar un modelo de clasificación de imágenes en Azure mediante Model


Builder para clasificar el uso del terreno a partir de imágenes satélite.

En este tutorial se muestra cómo crear una biblioteca de clases de C# para clasificar el
uso del terreno en función de imágenes satélite con Model Builder.

En este tutorial, hizo lo siguiente:

" Preparar y entender los datos


" Crear un archivo de configuración de Model Builder
" Elección de un escenario
" Carga de los datos
" Crear un experimento en Azure
" Entrenar el modelo
" Evaluar el modelo
" Consumir el modelo

Prerrequisitos
Para obtener una lista de los requisitos previos e instrucciones de instalación, visite
la Guía de instalación del Generador de modelos.
Cuenta de Azure. En caso de no tener ninguna, cree una cuenta gratuita de
Azure .
Carga de trabajo Desarrollo web y [Link].

Información general de clasificación de


imágenes de Model Builder
En este ejemplo se crea una biblioteca de clases de C# que clasifica el uso del terreno a
partir de imágenes de satélite de mapa mediante un modelo de aprendizaje profundo
entrenado en Azure con Model Builder. Puede encontrar el código fuente para este
tutorial en el repositorio dotnet/machinelearning-samples de GitHub.
Creación de una biblioteca de clases de C#
Cree una Biblioteca de clases de C# con el nombre "LandUse".

Preparar y entender los datos

7 Nota

Los datos de este tutorial provienen de:

Eurosat: un conjunto de datos y un punto de referencia de aprendizaje


profundo nuevos para el uso del terreno y la clasificación de la cobertura del
terreno. Patrick Helber, Benjamin Bischke, Andreas Dengel, Damian Borth. IEEE
Journal of Selected Topics in Applied Earth Observations and Remote Sensing,
2019.
Introducing EuroSAT: A Novel Dataset and Deep Learning Benchmark for Land
Use and Land Cover Classification. Patrick Helber, Benjamin Bischke, Andreas
Dengel. 2018 IEEE International Geoscience and Remote Sensing Symposium,
2018.

El conjunto de datos EuroSAT contiene una colección de imágenes de satélite divididas


en 10 categorías (rural, industrial, ríos, etc.) El conjunto de datos original contiene
27 000 imágenes. Para mayor comodidad, en este tutorial solo se usan 2000 de esas
imágenes.
1. Descargue el subconjunto del conjunto de datos EuroSAT y guárdelo en
cualquier lugar del equipo.
2. Descomprímalo.

Crear un archivo de configuración Model


Builder
La primera vez que agregue Model Builder a la solución, se le pedirá que cree un archivo
mbconfig . El archivo mbconfig realiza el seguimiento de todo lo que hace en Model

Builder para permitirle volver a abrir la sesión.

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto


LandUse y seleccione Agregar > Modelo de Machine Learning...
2. En el cuadro de diálogo, asigne el nombre LandUse al proyecto de Model Builder y
haga clic en Agregar.

Elección de un escenario

Para entrenar el modelo, deberá seleccionarlo en la lista de escenarios de aprendizaje


automático disponibles proporcionada por el Generador de modelos.

En este ejemplo, la tarea es la clasificación de imágenes. En el paso de escenario de la


herramienta Model Builder, seleccione el escenario Clasificación de imágenes.

Selección de un entorno
Model Builder ejecutar el entrenamiento en distintos entornos, en función del escenario
seleccionado.

Seleccione Azure como entorno y haga clic en el botón Configurar área de trabajo.

Creación de un experimento en Azure


Un experimento de Azure Machine Learning es un recurso que debe crearse antes de
ejecutar el entrenamiento del generador de modelos en Azure.

El experimento encapsula la configuración y los resultados de una o más ejecuciones de


entrenamiento de aprendizaje automático. Los experimentos pertenecen a un área de
trabajo específica. La primera vez que se crea un experimento, su nombre se registra en
el área de trabajo. Todas las ejecuciones posteriores: si se usa el mismo nombre de
experimento, se registran como parte del mismo experimento. De lo contrario, se crea
un nuevo experimento.
En el cuadro de diálogo Create New Experiment (Crear experimento), elija la suscripción
en la lista desplegable Suscripción.

Creación del espacio de trabajo


Un área de trabajo es un recurso de Azure Machine Learning que proporciona una
ubicación central para todos los artefactos y recursos de Azure Machine Learning
creados como parte de una ejecución de entrenamiento.

1. En el cuadro de diálogo Create New Experiment (Crear experimento), seleccione el


vínculo Nuevo situado junto a la lista desplegable Machine Learning Workspace
name (Nombre del área de trabajo de Machine Learning).

2. En el cuadro de diálogo Create A New Workspace (Crear un área de trabajo),


escriba "landuse-wkspc" en el cuadro de texto Machine Learning Workspace
name (Nombre del área de trabajo de Machine Learning).

3. Elija Este de EE. UU. en la lista desplegable Regiones. Una región es la ubicación
geográfica del centro de datos en el que se implementan el área de trabajo y los
recursos. Se recomienda que elija una ubicación cercana a donde se encuentren
usted o sus clientes.

4. Seleccione el vínculo Nuevo situado junto a la lista desplegable Grupos de


recursos.
a. En el cuadro de diálogo Crear nuevo grupo de recursos, escriba "landuse-rg" en
el cuadro de texto Nombre del grupo de recursos.
b. Seleccione Aceptar.

5. Elija el grupo de recursos recién creado en la lista desplegable Grupos de recursos.

6. Seleccione Crear.

El proceso de aprovisionamiento tarda varios minutos. Se realiza una solicitud a


Azure para aprovisionar los siguientes recursos en la nube:

Área de trabajo de Azure Machine Learning


Cuenta de Azure Storage
Azure Application Insights
Azure Container Registry
Azure Key Vault

7. Una vez que complete el proceso de aprovisionamiento, elija el área de trabajo


recién creada en la lista desplegable Machine Learning Workspace name (Nombre
del área de trabajo de Machine Learning) del cuadro de diálogo Create New
Experiment (Crear experimento).

Creación del proceso


Un proceso de Azure Machine Learning es una máquina virtual Linux basada en la nube
que se usa para el entrenamiento.

1. En el cuadro de diálogo Create New Experiment (Crear experimento), seleccione el


vínculo Nuevo situado junto a la lista desplegable Nombre del proceso.
2. En el cuadro de diálogo Create New Compute (Crear proceso), escriba "landuse-
cpt" en el cuadro de texto Nombre del proceso.
3. Elija Standard_NC24 en la lista desplegable Tamaño de proceso. Model Builder usa
tipos de proceso optimizados para GPU. Consulte la documentación de máquinas
virtuales Linux de la serie NC para obtener más detalles sobre los tipos de proceso
optimizados para GPU.
4. Seleccione Crear. Los recursos de proceso pueden tardar unos minutos en
aprovisionarse.
5. Una vez que se complete el proceso de aprovisionamiento, elija el área de trabajo
recién creada en la lista desplegable Nombre del proceso del cuadro de diálogo
Create New Experiment (Crear experimento).
6. Seleccione el botón Paso siguiente para cargar los datos.

Carga de los datos


1. En el paso de datos de la herramienta Model Builder, seleccione el botón situado
junto al cuadro de texto Seleccionar una carpeta.
2. Use el Explorador de archivos para examinar y seleccionar el directorio
descomprimido que contiene las imágenes.
3. Seleccione el botón Paso siguiente para ir al paso siguiente de la herramienta
Model Builder.

Entrenamiento del modelo


El entrenamiento en Azure solo está disponible para el escenario de clasificación de
imágenes del generador de modelos. El algoritmo usado para entrenar estos modelos
es una red neuronal profunda basada en la arquitectura ResNet50. Durante el proceso
de entrenamiento de modelos, Model Builder entrena modelos independientes
mediante el algoritmo ResNet50 y valores para encontrar el modelo con mejor
rendimiento para el conjunto de datos.
Inicio del entrenamiento
Una vez que haya configurado el área de trabajo y el tipo de proceso, es el momento de
terminar de crear el experimento e iniciar el entrenamiento.

1. Haga clic en el botón Iniciar entrenamiento.

El proceso de entrenamiento tarda algún tiempo, y la duración puede variar en


función del tamaño del proceso seleccionado, así como de la cantidad de datos. La
primera vez que se entrena un modelo, es probable que el tiempo de
entrenamiento sea ligeramente mayor porque se deben aprovisionar los recursos.
Puede realizar el seguimiento del progreso de las ejecuciones si selecciona el
vínculo Monitor current run in Azure Portal (Supervisar la ejecución actual en
Azure Portal) en Visual Studio.

Durante el proceso de entrenamiento, los datos de progreso se muestran en la


sección Progreso del paso de entrenamiento.

En Estado se muestra el grado de finalización del proceso de entrenamiento.


En Mejor precisión se muestra la precisión del modelo con mejor rendimiento
que ha encontrado el Generador de modelos hasta el momento. Una mayor
precisión significa que el modelo realiza una predicción más correcta de los
datos de prueba.
En Algoritmo se muestra el nombre del algoritmo con mejor rendimiento que
Model Builder ha encontrado hasta el momento.

2. Una vez que se complete el entrenamiento, seleccione el botón Paso siguiente.

Evaluación del modelo


El resultado del paso de entrenamiento es un modelo que ha tenido el mejor
rendimiento. En el paso de evaluación de la herramienta Model Builder, la pestaña
Detalles de la sección de salida contendrá el algoritmo que ha usado el modelo con el
mejor rendimiento en la entrada Algoritmo junto con las métricas de en la entrada
Precisión de los detalles Best model (Mejor modelo).

Si no está satisfecho con las métricas de precisión, puede intentar mejorar la precisión
del modelo si usa más datos o aumenta la cantidad de datos existentes. En caso
contrario, seleccione el botón Paso siguiente para ir al paso final de la herramienta
Model Builder.

(Opcional) Consumo del modelo


Este paso tendrá plantillas de proyecto que puede usar para consumir el modelo. Es
opcional y puede elegir el método que mejor se adapte a sus necesidades sobre cómo
atender el modelo.

Aplicación de consola
API Web

Aplicación de consola
Al agregar una aplicación de consola a la solución, se le pedirá que asigne un nombre al
proyecto.

1. Asigne el nombre LandUse_Console al proyecto.

2. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

La salida generada por el programa debe ser similar al siguiente fragmento de


código:

Bash

Predicted Label value: AnnualCrop

Predicted Label scores: [0.9941197,3.3146807E-06,4.4344174E-


06,0.000101028825,7.763133E-06,0.0015898133,0.0040994748,1.6308518E-
06,6.265567E-05,1.0236401E-05]

API Web
Al agregar una API web a la solución, se le pedirá que asigne un nombre al proyecto.

1. Asigne el nombre LandUse_API al proyecto de API web.

2. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

4. Abra PowerShell y escriba el código siguiente, donde PORT es el puerto donde


escuchar la aplicación.

PowerShell

$body = @{
ImageSource = <Image location on your local machine>
}

Invoke-RestMethod "[Link] -Method Post -


Body ($body | ConvertTo-Json) -ContentType "application/json"

5. Si se realiza correctamente, la salida debería ser similar al texto a continuación.

PowerShell

output1 prediction score


------- ---------- -----
{9.508701, -3.1025503, -2.8115153, 0.31449434...} AnnualCrop
{0.9941197, 3.3146807E-06, 4.4344174E-06, 0.00010102882...

Limpieza de recursos
Si ya no va a usar los recursos de Azure que ha creado, elimínelos. Esto le evitará cargos
por recursos no utilizados que todavía se están ejecutando.

1. Vaya a Azure Portal y seleccione Grupos de recursos en el menú del portal.


2. En la lista de grupos de recursos, seleccione el grupo de recursos que ha creado.
En este caso, "landuse-rg".
3. Seleccione Eliminar grupo de recursos.
4. Escriba el nombre del grupo de recursos, "landuse-rg", en el cuadro de texto y,
después, seleccione Entrar .

Pasos siguientes
En este tutorial, ha aprendido cómo:

" Preparar y entender los datos


" Crear un archivo de configuración de Model Builder
" Elección de un escenario
" Carga de los datos
" Crear un experimento en Azure
" Entrenar el modelo
" Evaluar el modelo
" Consumir el modelo

Pruebe uno de los otros escenarios de Model Builder:

Predicción de tarifas de taxi de Nueva York


Análisis de opiniones de comentarios de sitios web en una aplicación Razor Pages
Clasificación de la gravedad de las infracciones sanitarias en restaurantes
Tutorial: Detección de señales de
detención en imágenes con Model
Builder
Artículo • 10/05/2023

Aprenda a crear un modelo de detección de objetos con [Link] Model Builder y


Azure Machine Learning para detectar y localizar señales de detención en las imágenes.

En este tutorial aprenderá a:

" Preparar y entender los datos


" Crear un archivo de configuración Model Builder
" Elegir el escenario
" Elegir el entorno de entrenamiento
" Carga de los datos
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Prerrequisitos
Para obtener una lista de los requisitos previos e instrucciones de instalación, visite la
Guía de instalación del Generador de modelos.

Información general sobre la detección de


objetos con Model Builder
La detección de objetos es un problema de visión informática. Si bien está
estrechamente relacionada con la clasificación de imágenes, la detección de objetos
realiza la clasificación de imágenes a una escala más granular. La detección de objetos
ubica y categoriza entidades dentro de las imágenes. Los modelos de detección de
objetos se entrenan normalmente mediante el aprendizaje profundo y las redes
neuronales. Consulte Aprendizaje profundo frente a aprendizaje automático para
obtener más información.

Use la detección de objetos cuando las imágenes contengan varios objetos de tipos
diferentes.
Entre algunos casos de uso para la detección de objetos se incluyen:

Automóviles sin conductor


Robótica
Detección facial
Seguridad en el lugar de trabajo
Recuento de objetos
Reconocimiento de actividades

En este ejemplo se crea una aplicación de consola en C# de .NET Core que detecta
señales de detención en las imágenes mediante un modelo de aprendizaje automático
creado con Model Builder. Puede encontrar el código fuente para este tutorial en el
repositorio dotnet/machinelearning-samples de GitHub.

Preparar y entender los datos


El conjunto de datos de señales de detención consta de 50 imágenes descargadas de
Unsplash , cada una de las cuales contiene al menos una señal de detención.

Creación de un proyecto de VoTT


1. Descargue el conjunto de datos de 50 imágenes de señales de detención y
descomprímalo.

2. Descargue VoTT (Visual Object Tagging Tool).

3. Abra VoTT y seleccione New Project (Nuevo proyecto).


4. En Project Settings (Configuración del proyecto), cambie el nombre para mostrar
(Display Name) a "StopSignObjDetection".

5. Cambie el valor de Security Token (Token de seguridad) a Generate New Security


Token (Generar un token de seguridad).

6. Junto a Source Connection (Conexión de origen), seleccione Add Connection


(Agregar conexión).

7. En Connection Settings (Configuración de conexión), cambie el nombre para


mostrar (Display Name) de la conexión de origen a "StopSignImages" y seleccione
Local File System (Sistema de archivos local) en Provider (Proveedor). En la Folder
Path (Ruta de la carpeta), seleccione la carpeta Stop-Signs que contiene las
50 imágenes de entrenamiento y, a continuación, seleccione Save Connection
(Guardar conexión).
8. En Project Settings (Configuración del proyecto), cambie el valor de Source
Connection (Conexión de origen) a StopSignImages (la conexión que acaba de
crear).

9. Cambie también el valor de Target Connection (Conexión de destino) a


StopSignImages. La configuración del proyecto debería tener ahora un aspecto
similar al de esta captura de pantalla:
10. Seleccione Save Project (Guardar proyecto).

Incorporación de etiquetas y etiquetado de imágenes


Ahora debería ver una ventana con imágenes de vista previa de todas las imágenes de
entrenamiento a la izquierda, una vista previa de la imagen seleccionada en el centro y
una columna Tags (Etiquetas) a la derecha. Esta pantalla es el editor de etiquetas.

1. Seleccione el primer icono (con forma de más) en la barra de herramientas Tags


(Etiquetas) para agregar una nueva etiqueta.

2. Asigne el nombre "STOP-Sign" a la etiqueta y presione Entrar en el teclado.


3. Haga clic y arrastre para dibujar un rectángulo alrededor de cada señal de
detención de la imagen. Si el cursor no permite dibujar un rectángulo, intente
seleccionar la herramienta Draw Rectangle (Dibujar rectángulo) en la barra de
herramientas de la parte superior o use el método abreviado de teclado R .

4. Después de dibujar el rectángulo, seleccione la etiqueta Stop-Sign que creó en los


pasos anteriores para agregar la etiqueta al rectángulo de selección.

5. Haga clic en la imagen de vista previa en la imagen siguiente del conjunto de


datos y repita este proceso.

6. Siga repitiendo los pasos 3 y 4 en cada señal de detención y en cada imagen.

Exportación del archivo JSON de VoTT


Una vez que haya etiquetado todas las imágenes de entrenamiento, puede exportar el
archivo que usará Model Builder para el entrenamiento.
1. Seleccione el cuarto icono en la barra de herramientas izquierda (el que tiene la
flecha diagonal en un cuadro) para ir a Export Settings (Configuración de
exportación).

2. Deje el valor de Provider (Proveedor) como VoTT JSON (JSON de VoTT).

3. Cambie Asset State (Estado del recurso) a Only tagged Assets (Solo los recursos
etiquetados).

4. Desactive la casilla Include Images (Incluir imágenes). Si incluye las imágenes, las
imágenes de entrenamiento se copiarán en la carpeta de exportación que se
genera, lo cual no es necesario.

5. Seleccione Save Export Settings (Guardar configuración de exportación).

6. Vuelva al editor de etiquetas (el segundo icono de la barra de herramientas


izquierda con forma de cinta). En la barra de herramientas superior, seleccione el
icono de Export Project (Exportar proyecto) (el último icono con forma de flecha
en un cuadro) o use el método abreviado de teclado Ctrl + E .

Esta exportación creará una nueva carpeta denominada vott-json-export en la carpeta


Stop-Sign-Images y generará un archivo JSON denominado StopSignObjDetection-export
en esa nueva carpeta. Usará este archivo JSON en los pasos siguientes para entrenar un
modelo de detección de objetos en Model Builder.

Creación de una aplicación de consola


En Visual Studio, cree una aplicación de consola en C# de .Net Core denominada
StopSignDetection.
Creación de un archivo mbconfig
1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto
StopSignDetection y seleccione Agregar>Modelo de Machine Learning... para
abrir la interfaz de usuario de Model Builder.
2. En el cuadro de diálogo, asigne el nombre StopSignDetection al proyecto de
Model Builder y haga clic en Agregar.

Elección de un escenario
En este ejemplo, el escenario es la detección de objetos. En el paso Escenario de Model
Builder, seleccione el escenario Detección de objetos.

Si no ve Detección de objetos en la lista de escenarios, es posible que tenga que


actualizar la versión de Model Builder .

Selección del entorno de entrenamiento


Actualmente, Model Builder solo admite modelos de detección de objetos de
entrenamiento con Azure Machine Learning (Azure ML), por lo que el entorno de
entrenamiento de Azure está seleccionado de forma predeterminada.
Para entrenar un modelo con Azure ML, debe crear un experimento de Azure ML desde
Model Builder.

Un experimento de Azure ML es un recurso que encapsula la configuración y los


resultados de una o varias ejecuciones de aprendizaje automático.

Para crear un experimento de Azure ML, primero debe configurar el entorno en Azure.
Un experimento necesita los siguientes componentes para ejecutarse:

Una suscripción de Azure


Un área de trabajo, que es un recurso de Azure ML que proporciona una ubicación
central para todos los artefactos y recursos de Azure ML creados como parte de la
ejecución de entrenamiento.
Un proceso de Azure ML, que es una máquina virtual Linux basada en la nube que
se usa para el entrenamiento. Obtenga más información sobre los tipos de
proceso que admite Model Builder.

Configuración de un área de trabajo de Azure ML


Para configurar el entorno, siga estos pasos:

1. Seleccione el botón Set up workspace (Configurar área de trabajo).

2. En el cuadro de diálogo Create new experiment (Crear experimento), seleccione su


suscripción de Azure.

3. Cree un área de trabajo de Azure ML o seleccione una que ya exista.

Al crear un área de trabajo, se aprovisionan automáticamente los siguientes


recursos:

Área de trabajo de Azure Machine Learning


Azure Storage
Azure Application Insights
Azure Container Registry
Azure Key Vault

Como resultado, este proceso puede tardar unos minutos.

4. Cree un proceso de Azure ML o seleccione uno que ya exista. Este proceso puede
tardar unos minutos.

5. Deje el nombre del experimento y seleccione Create (Crear).

La primera vez que se crea un experimento, su nombre se registra en el área de trabajo.


Todas las ejecuciones posteriores (si se usa el mismo nombre del experimento) se
registran como parte del mismo experimento. De lo contrario, se crea un nuevo
experimento.

Si le parece bien la configuración, seleccione el botón Next step (Siguiente paso) en


Model Builder para desplazarse al paso Data (Pasos).

Carga de los datos


En el paso Data (Datos) de Model Builder, seleccionará el conjunto de datos de
entrenamiento.
) Importante

Model Builder solo acepta actualmente el formato JSON generado por VoTT.

1. Seleccione el botón situado en la sección Entrada y use el Explorador de archivos


para buscar [Link] , que debería estar en el directorio
Stop-Signs/vott-json-export.

2. Si los datos parecen correctos en Data Preview(Vista previa de datos), seleccione


Next step (Siguiente paso) para avanzar al paso Train (Entrenar).

Entrenamiento del modelo


El siguiente paso consiste en entrenar el modelo.

En la pantalla Train (Entrenar) de Model Builder, seleccione el botón Start training


(Iniciar entrenamiento).

En este punto, los datos se cargan en Azure Storage y el proceso de entrenamiento


comienza en Azure ML.
El proceso de entrenamiento tarda algún tiempo, y la duración puede variar en
función del tamaño del proceso seleccionado, así como de la cantidad de datos. La
primera vez que se entrena un modelo en Azure, es probable que el tiempo de
entrenamiento sea ligeramente mayor porque se deben aprovisionar los recursos.
Para este ejemplo de 50 imágenes, el entrenamiento tardó aproximadamente
16 minutos.

Puede realizar un seguimiento del progreso de las ejecuciones en Azure Machine


Learning seleccionando el vínculo Monitor current run in Azure portal (Supervisar la
ejecución actual en Azure Portal) en Visual Studio.

Una vez completado el entrenamiento, seleccione el botón Next step (Siguiente paso)
para avanzar al paso Evaluate (Evaluar).

Evaluación del modelo


En la pantalla Evaluate (Evaluar), obtendrá información general sobre los resultados del
proceso de entrenamiento, incluida la precisión del modelo.

En este caso, se indica que la precisión es del 100 %, lo que significa que lo más
probable es que el modelo se sobreajuste debido a que hay demasiadas imágenes en el
conjunto de datos.

Puede usar la experiencia Try your model (Probar el modelo) para comprobar
rápidamente si el modelo funciona según lo previsto.
Seleccione Browse an image (Examinar una imagen) y proporcione una imagen de
prueba, preferiblemente una que el modelo no haya utilizado como parte del
entrenamiento.

La puntuación mostrada en cada rectángulo de selección detectado indica la confianza


del objeto detectado. Por ejemplo, en la captura de pantalla anterior, la puntuación del
rectángulo de selección alrededor de la señal de detención indica que hay un 99 % de
probabilidades en el modelo de que el objeto detectado sea una señal de detención.

El umbral de puntuación, cuyo valor puede aumentarse o disminuirse con el control


deslizante, agregará y quitará objetos detectados según las puntuaciones. Por ejemplo,
si el umbral es 0,51, el modelo solo mostrará los objetos que tengan una puntuación de
confianza de 0,51 o superior. A medida que aumente el umbral, verá menos objetos
detectados y, a medida que lo disminuya, verá más objetos detectados.

Si no le parecen bien las métricas de precisión, una forma sencilla de intentar mejorar la
precisión del modelo es usar más datos. En caso contrario, seleccione el vínculo Paso
siguiente para avanzar al paso Consumir de Model Builder.

(Opcional) Consumo del modelo


Este paso tendrá plantillas de proyecto que puede usar para consumir el modelo. Es
opcional y puede elegir el método que mejor se adapte a sus necesidades sobre cómo
atender el modelo.

Aplicación de consola
API Web

Aplicación de consola
Al agregar una aplicación de consola a la solución, se le pedirá que asigne un nombre al
proyecto.

1. Asigne el nombre StopSignDetection_Console al proyecto de consola.

2. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

La salida generada por el programa debe ser similar al siguiente fragmento de


código:

Bash

Predicted Boxes:

Top: 73.225296, Left: 256.89764, Right: 533.8884, Bottom: 484.24243,


Label: stop-sign, Score: 0.9970765

API Web
Al agregar una API web a la solución, se le pedirá que asigne un nombre al proyecto.

1. Asigne el nombre StopSignDetection_API al proyecto de API web.

2. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

3. Ejecute la aplicación.

4. Abra PowerShell y escriba el código siguiente, donde PORT es el puerto donde


escuchar la aplicación.

PowerShell

$body = @{
ImageSource = <Image location on your local machine>
}
Invoke-RestMethod "[Link] -Method Post -
Body ($body | ConvertTo-Json) -ContentType "application/json"

5. Si se realiza correctamente, la salida debería ser similar al texto a continuación.

PowerShell

boxes labels scores


boundingBoxes
----- ------ ------ --------
-----
{339.97797, 154.43184, 472.6338, 245.0796} {1} {0.99273646} {}

En la columna boxes se proporcionan las coordenadas del rectángulo


delimitador del objeto que se ha detectado. Los valores de aquí pertenecen a
las coordenadas izquierda, superior, derecha e inferior, respectivamente.
labels son el índice de las etiquetas predichas. En este caso, el valor 1 es una

señal de stop.
scores define la confianza del modelo en que el rectángulo de selección

pertenece a esa etiqueta.

7 Nota

(Opcional) Las coordenadas del rectángulo de selección se normalizan para


un ancho de 800 píxeles y un alto de 600 píxeles. Para modificar la escala de
las coordenadas del rectángulo de selección de la imagen en un
posprocesamiento adicional, debe hacer lo siguiente:
a. Multiplique las coordenadas superior e inferior por el alto de la imagen
original y multiplique las coordenadas izquierda y derecha por el ancho.
b. Divida las coordenadas superior e inferior entre 600 y las coordenadas
izquierda y derecha entre 800.

Por ejemplo, dadas las dimensiones de la imagen original, actualImageHeight


y actualImageWidth , y un objeto ModelOutput denominado prediction , en el
siguiente fragmento de código se muestra cómo modificar la escala de las
coordenadas BoundingBox :

C#

var top = originalImageHeight * [Link] / 600;


var bottom = originalImageHeight * [Link] / 600;
var left = originalImageWidth * [Link] / 800;
var right = originalImageWidth * [Link] / 800;

Una imagen puede tener más de un rectángulo de selección, por lo que se


debe aplicar el mismo proceso a cada uno de los rectángulos de selección de
la imagen.

¡Enhorabuena! Ha creado correctamente un modelo de aprendizaje automático para


detectar señales de detención en imágenes mediante Model Builder. Puede encontrar el
código fuente para este tutorial en el repositorio dotnet/machinelearning-samples de
GitHub.

Recursos adicionales
Para más información sobre los temas mencionados en este tutorial, visite estos
recursos:

Escenarios del Generador de modelos


Detección de objetos mediante ONNX en [Link]
Entrenamiento de un modelo de
recomendaciones con Model Builder
Artículo • 10/05/2023

Aprenda a entrenar un modelo de recomendación de películas mediante Model Builder.

En este tutorial, hizo lo siguiente:

" Preparar y entender los datos


" Crear un archivo de configuración de Model Builder
" Elección de un escenario
" Carga de los datos
" Entrenar el modelo
" Evaluar el modelo
" Consumir el modelo

Prerrequisitos
Para obtener una lista de los requisitos previos e instrucciones de instalación, visite la
Guía de instalación del Generador de modelos.

Creación de una biblioteca de clases de C#


Cree una biblioteca de clases de C# llamada "MovieRecommender".

Preparar y entender los datos


Hay varias maneras de enfocar los problemas vinculados a las recomendaciones, como
recomendar una lista de películas o recomendar una lista de productos relacionados. En
este caso, predecirá qué clasificación (de 1 a 5) asignará un usuario a una película
concreta y recomendará esa película si es superior a un umbral definido (cuanto mayor
sea la clasificación, más probable será que a un usuario le guste una película concreta).

Haga clic con el botón derecho en [Link] y seleccione


"Save Link (or Target) As…" ("Guardar vínculo (o destino) como…").

Cada fila del conjunto de datos contiene información sobre una calificación de una
película.
userId movieId rating timestamp

1 1 4 964982703

userId: el identificador del usuario.


movieId: el identificador de la película.
rating: la calificación que el usuario dio a la película.
timestamp: la marca de tiempo de cuando se hizo la reseña.

Crear un archivo de configuración Model


Builder
La primera vez que agregue Model Builder a la solución, se le pedirá que cree un archivo
mbconfig . El archivo mbconfig realiza el seguimiento de todo lo que hace en Model
Builder para permitirle volver a abrir la sesión.

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto


MovieRecommender y seleccione Agregar >Modelo de Machine Learning....
2. En el cuadro de diálogo, asigne al proyecto el nombre MovieRecommender y
haga clic en Agregar.

Elección de un escenario


Para entrenar el modelo, deberá seleccionarlo en la lista de escenarios de aprendizaje
automático disponibles proporcionada por el Generador de modelos.

En este ejemplo, se recomienda la tarea. En el paso de escenario de la herramienta


Model Builder, seleccione el escenario Recommendation (Recomendación).

Selección de un entorno
Model Builder ejecutar el entrenamiento en distintos entornos, en función del escenario
seleccionado.

Seleccione Local como entorno y haga clic en el botón Next step (Siguiente paso).

Carga de los datos


1. En el paso de datos de la herramienta Model Builder, seleccione el botón situado
junto al cuadro de texto Seleccionar una carpeta.
2. Use el Explorador de archivos para examinar y seleccionar el archivo descargado:
[Link].
3. Seleccione el botón Paso siguiente para ir al paso siguiente de la herramienta
Model Builder.
4. Una vez cargados los datos, en la lista desplegable Column to predict (Columna
para predecir), seleccione Rating (Calificación).
5. En la lista desplegable User column (Columna de usuario), seleccione userId.
6. En la lista desplegable Item column (Columna de elemento), seleccione movieId.

Entrenamiento del modelo


El algoritmo de aprendizaje automático que se usa para entrenar el modelo de
recomendación es Factorización matricial. Durante el proceso de entrenamiento de
modelos, Model Builder usa distintas configuraciones para el algoritmo a fin de
encontrar el modelo con mejor rendimiento para el conjunto de datos.

El tiempo necesario para el entrenamiento del modelo es proporcional a la cantidad de


datos. El generador de modelos selecciona automáticamente un valor predeterminado
para Tiempo de entrenamiento (segundos) en función del tamaño del origen de datos.

1. Model Builder establezca el valor de Tiempo de entrenamiento (segundos) en


60 segundos. El entrenamiento durante un período de tiempo más prolongado
permite que el Generador de modelos explore un mayor número de algoritmos y
combinación de parámetros en la búsqueda del mejor modelo.
2. Haga clic en Iniciar entrenamiento.

Durante el proceso de entrenamiento, los datos de progreso se muestran en la sección


Training results del paso de entrenamiento.

En Estado se muestra el grado de finalización del proceso de entrenamiento.


En Mejor calidad, se muestra el coeficiente de determinación del modelo con el
mejor rendimiento que ha encontrado Model Builder hasta el momento. Un
coeficiente de determinación bajo significa que la predicción del modelo fue mejor
en los datos de prueba.
En Mejor algoritmo se muestra el nombre del algoritmo con mejor rendimiento
que Model Builder ha encontrado hasta el momento.
En Último algoritmo se muestra el nombre del algoritmo que ha usado más
recientemente el Generador de modelos para entrenar el modelo.

Una vez completado el entrenamiento, el archivo mbconfig tendrá el modelo generado


denominado [Link] después del entrenamiento y dos archivos de C#
con él:

[Link]: este archivo tiene un método público


Predict que carga el modelo y crea una API PredictionEngine para hacer
predicciones. PredictionEngine es una práctica API para hacer predicciones sobre
una sola instancia de datos.
[Link]: este archivo consta de la canalización de
entrenamiento que Model Builder generó para crear el mejor modelo, incluidos los
hiperparámetros que usó.

Haga clic en el botón Paso siguiente para ir al paso de evaluación.

Evaluación del modelo


El resultado del paso de entrenamiento será un modelo que tenga el mejor rendimiento.
En el paso de evaluación de la herramienta Model Builder, la sección Mejor modelo
contendrá el algoritmo usado por el modelo con el mejor rendimiento en la entrada
Modelo, junto con las métricas para ese modelo en RSquared.

Además, en la ventana Salida de Visual Studio, habrá una tabla de resumen que
contiene los modelos principales y sus métricas.

Esta sección también le permite probar el modelo mediante una única predicción.
Proporciona cuadros de texto para introducir valores para cada una de las columnas de
características y puede seleccionar el botón Predecir para obtener una predicción con el
mejor modelo. De forma predeterminada, la primera fila del conjunto de datos los
rellenará.

(Opcional) Consumo del modelo


Este paso tendrá plantillas de proyecto que puede usar para consumir el modelo. Es
opcional y puede elegir el método que mejor se adapte a sus necesidades sobre cómo
atender el modelo.

Aplicación de consola
API Web

Aplicación de consola
Al agregar una aplicación de consola a la solución, se le pedirá que asigne un nombre al
proyecto.

1. Seleccione Agregar a la solución para la plantilla de consola.

2. Asigne al proyecto de la consola el nombre MovieRecommender_Console.

3. Haga clic en Agregar a la solución para agregar el proyecto a la solución actual.

4. Ejecute la aplicación.

La salida generada por el programa debe ser similar al siguiente fragmento de


código:

Bash

UserId: 1
MovieId: 1
Rating: 4

Predicted Rating: 4.577113

API Web
Al agregar una API web a la solución, se le pedirá que asigne un nombre al proyecto.

1. Seleccione Agregar a la solución para la plantilla de API web.

2. Asigne al proyecto de API web el nombre MovieRecommender_WebApi.


3. Haga clic en Agregar a la solución* para agregar el proyecto a la solución actual.

4. Ejecute la aplicación.

5. Abra PowerShell y escriba el código siguiente, donde PORT es el puerto donde


escuchar la aplicación.

PowerShell

$body = @{
UserId=1.0
MovieId=1.0
}

Invoke-RestMethod "[Link] -Method Post -Body


($body | ConvertTo-Json) -ContentType "application/json"

6. Si se realiza correctamente, la salida debería ser similar al texto a continuación. La


salida de puntuación será la calificación predicha para el identificador de usuario y
el identificador de película solicitados.

PowerShell

score
-----
4.577113

¡Enhorabuena! Ha creado correctamente un modelo de aprendizaje automático para


categorizar el riesgo de infracciones sanitarias mediante el Generador de modelos.
Puede encontrar el código fuente para este tutorial en el repositorio
dotnet/machinelearning-samples de GitHub.

Recursos adicionales
Para más información sobre los temas mencionados en este tutorial, visite estos
recursos:

Escenarios del Generador de modelos


Recomendación de películas en la API [Link]
Tutoriales de [Link]
Artículo • 15/02/2023

Los tutoriales siguientes permiten obtener información sobre cómo usar [Link] para
crear soluciones de Machine Learning personalizadas e integrarlas en las aplicaciones
.NET:

Análisis de sentimiento: muestra cómo aplicar una tarea de clasificación binaria


mediante [Link].
Clasificación de problema de GitHub: muestra cómo aplicar una tarea de
clasificación multiclase mediante [Link].
Predictor de precios: muestra cómo aplicar una tarea de regresión mediante
[Link].
Agrupación en clústeres de Iris: muestra cómo aplicar una tarea de agrupación en
clústeres mediante [Link].
Recomendación: genere recomendaciones de películas basadas en las
calificaciones de usuarios anteriores
Clasificación de imágenes: muestra cómo volver a entrenar un modelo de
TensorFlow existente para crear un clasificador de imágenes personalizado
mediante [Link].
Detección de anomalías: muestra cómo crear una aplicación de detección de
anomalías para el análisis de los datos de ventas de productos.
Detección de objetos en imágenes: muestra cómo detectar objetos en imágenes
mediante un modelo de ONNX previamente entrenado.
Clasificación de opiniones en reseñas de películas: aprenda a cargar un modelo de
TensorFlow entrenado previamente para clasificar opiniones en reseñas de
películas.

Pasos siguientes
Para obtener más ejemplos en los que se usa [Link], consulte el repositorio de GitHub
dotnet/machinelearning-samples .
Tutorial: Análisis de opinión de los
comentarios del sitio web con
clasificación binaria de [Link]
Artículo • 10/05/2023

En este tutorial se muestra cómo crear una aplicación de consola de .NET Core que
clasifica las opiniones de los comentarios del sitio web y toma las medidas oportunas. El
clasificador binario de opiniones usa C# en Visual Studio 2022.

En este tutorial aprenderá a:

" Creación de una aplicación de consola


" Preparar los datos
" Carga de los datos
" Creación y entrenamiento del modelo
" Evaluar el modelo
" Uso del modelo para realizar una predicción
" Ver los resultados

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Requisitos previos
Visual Studio 2022 .

Conjunto de datos de frases con etiqueta de opinión de UCI (archivo ZIP)

Creación de una aplicación de consola


1. Cree una aplicación de consola de C# denominada "SentimentAnalysis". Haga clic
en el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Cree un directorio denominado Datos en el proyecto para guardar los archivos del
conjunto de datos.

4. Instale el paquete NuGet [Link]:


7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en Administrar


paquetes NuGet. Elija "[Link]" como origen del paquete y luego seleccione la
pestaña Examinar. Busque [Link], seleccione el paquete que desee y luego,
el botón Instalar. Acepte los términos de licencia del paquete que elija para
continuar con la instalación.

Preparar los datos

7 Nota

Los conjuntos de datos de este tutorial proceden de «From Group to Individual


Labels using Deep Features», Kotzias et. al. KDD 2015, and hosted at the UCI
Machine Learning Repository - Dua, D. and Karra Taniskidou, E. (2017). UCI Machine
Learning Repository [[Link] ]. Irvine, CA: University of
California, School of Information and Computer Science.

1. Descargue el archivo ZIP de conjunto de datos de frases con etiqueta de opinión


de UCI y descomprímalo.

2. Copie el archivo yelp_labelled.txt en el directorio Datos que ha creado.

3. En el Explorador de soluciones, haga clic con el botón derecho en el archivo


yelp_labeled.txt y seleccione Propiedades. En Avanzadas, cambie el valor de

Copiar en el directorio de salida por Copiar si es posterior.

Crear clases y definir rutas de acceso


1. Agregue las siguientes instrucciones using adicionales a la parte superior del
archivo [Link]:

C#

using [Link];
using [Link];
using SentimentAnalysis;
using static [Link];
2. Agregue el código siguiente a la línea justo debajo de las instrucciones using para
crear un campo que incluya la ruta de acceso del archivo del conjunto de datos
descargado recientemente:

C#

string _dataPath = [Link]([Link], "Data",


"yelp_labelled.txt");

3. Luego, cree clases para los datos de entrada y las predicciones. Agregue una nueva
clase a su proyecto:

En el Explorador de soluciones, haga clic con el botón derecho en el


proyecto y, a continuación, seleccione Agregar>Nuevo elemento.

En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie


el campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

4. Se abre el archivo [Link] en el editor de código. Agregue la siguiente


instrucción using a la parte superior de [Link]:

C#

using [Link];

5. Quite la definición de clase existente y agregue el código siguiente, que tiene dos
clases SentimentData y SentimentPrediction , al archivo [Link]:

C#

public class SentimentData


{
[LoadColumn(0)]
public string? SentimentText;

[LoadColumn(1), ColumnName("Label")]
public bool Sentiment;
}

public class SentimentPrediction : SentimentData


{

[ColumnName("PredictedLabel")]
public bool Prediction { get; set; }
public float Probability { get; set; }

public float Score { get; set; }


}

¿Cómo se han preparado los datos?


La clase de conjunto de datos de entrada, SentimentData , tiene un string para
comentarios del usuario ( SentimentText ) y un valor bool ( Sentiment ) de 1 (positivo) o
de 0 (negativo) para las opiniones. Ambos campos tienen atributos LoadColumn
adjuntos a ellos, que describe el orden de archivo de datos de cada campo. Además, la
propiedad Sentiment tiene un atributo ColumnName que lo designa como campo
Label . El archivo de ejemplo siguiente no tiene una fila de encabezado y se ve así:

SentimentText Opinión (etiqueta)

La camarera era algo lenta en el servicio. 0

La corteza no es buena. 0

¡Ah! Me encantó el lugar. 1

El servicio fue muy rápido. 1

SentimentPrediction es la clase de predicción que se utiliza tras el entrenamiento del

modelo. Hereda de SentimentData para que la entrada SentimentText pueda mostrarse


junto con la predicción de salida. El booleano Prediction es el valor que predice el
modelo cuando se proporciona con la nueva entrada SentimentText .

La clase de salida SentimentPrediction contiene otras dos propiedades calculadas por el


modelo: Score , el resultado sin formato calculado por el modelo y Probability , la
puntuación calibrada de la probabilidad de que el texto tenga un sentimiento positivo.

Para este tutorial, la propiedad más importante es Prediction .

Carga de los datos


Los datos de [Link] se representan como una interfaz IDataView. IDataView es una
manera flexible y eficiente de describir datos tabulares (numéricos y de texto). Los datos
se pueden cargar desde un archivo de texto o en tiempo real (por ejemplo, archivos de
registro o base de datos SQL) en un objeto IDataView .
La clase MLContext es un punto de partida para todas las operaciones de [Link]. La
inicialización de mlContext crea un entorno de [Link] que se puede compartir entre los
objetos del flujo de trabajo de creación de modelos. Como concepto, se parece a
DBContext en Entity Framework.

Prepare la aplicación y luego cargue datos:

1. Reemplace la línea [Link]("Hello World!") por el siguiente código


para declarar e inicializar la variable mlContext:

C#

MLContext mlContext = new MLContext();

2. Agregue lo siguiente como la siguiente línea de código:

C#

TrainTestData splitDataView = LoadData(mlContext);

3. Cree un método LoadData() al final del archivo [Link] mediante el código


siguiente:

C#

TrainTestData LoadData(MLContext mlContext)


{

El método LoadData() ejecuta las tareas siguientes:

Carga los datos.


Divide el conjunto de datos cargado en conjuntos de datos de entrenamiento
y prueba.
Devuelve los conjuntos de datos divididos en entrenamiento y prueba.

4. Agregue el código siguiente a la primera línea del método LoadData() :

C#

IDataView dataView = [Link]<SentimentData>


(_dataPath, hasHeader: false);
El método LoadFromTextFile() define el esquema de datos y lee en el archivo. Toma
las variables de ruta de acceso de datos y devuelve IDataView .

División del conjunto de datos para el entrenamiento y la


prueba del modelo
Al preparar un modelo, se utiliza parte del conjunto de datos para entrenarlo y parte del
conjunto de datos para probar la precisión del modelo.

1. Para dividir los datos cargados en los conjuntos de datos necesarios, agregue el
código siguiente como la siguiente línea en el método LoadData() :

C#

TrainTestData splitDataView = [Link](dataView,


testFraction: 0.2);

El código anterior usa el método TrainTestSplit() para dividir el conjunto de datos


cargado en conjuntos de datos de entrenamiento y de prueba, que devuelve en la
clase [Link]. Especifique el porcentaje de datos del
conjunto de prueba con el parámetro testFraction . El valor predeterminado es
10 %; en este caso se usa 20 % para evaluar más datos.

2. Devuelva el splitDataView al final del método LoadData() :

C#

return splitDataView;

Creación y entrenamiento del modelo


1. Agregue la siguiente llamada al método BuildAndTrainModel debajo de la llamada
al método LoadData :

C#

ITransformer model = BuildAndTrainModel(mlContext,


[Link]);

El método BuildAndTrainModel() ejecuta las tareas siguientes:

Extrae y transforma los datos.


Entrena el modelo.
Predice sentimientos en función de datos de prueba.
Devuelve el modelo.

2. Cree el método BuildAndTrainModel() debajo del método LoadData() mediante el


código siguiente:

C#

ITransformer BuildAndTrainModel(MLContext mlContext, IDataView


splitTrainSet)
{

Extraer y transformar los datos


1. Llame a FeaturizeText como siguiente línea de código:

C#

var estimator =
[Link](outputColumnName: "Features",
inputColumnName: nameof([Link]))

El método FeaturizeText() del código anterior convierte la columna de texto


( SentimentText ) en una columna de tipo de clave numérico Features que el
algoritmo de aprendizaje automático utiliza y agrega como nueva columna de
conjunto de datos:

SentimentText Opinión Características

La camarera era algo lenta en el servicio. 0 [0,76, 0,65, 0,44, …]

La corteza no es buena. 0 [0,98, 0,43, 0,54, …]

¡Ah! Me encantó el lugar. 1 [0,35, 0,73, 0,46, …]

El servicio fue muy rápido. 1 [0,39, 0, 0,75, …]

Incorporación de un algoritmo de aprendizaje


Esta aplicación usa un algoritmo de clasificación que clasifica elementos o filas de datos.
La aplicación clasifica los comentarios del sitio web como positivos o negativos, así que
use la tarea de clasificación binaria.

Anexe la tarea de aprendizaje automático a las definiciones de transformación de datos


agregando lo siguiente como siguiente línea de código en BuildAndTrainModel() :

C#

.Append([Link](label
ColumnName: "Label", featureColumnName: "Features"));

SdcaLogisticRegressionBinaryTrainer es el algoritmo de entrenamiento de clasificación.


Se anexa a estimator y acepta SentimentText ( Features ) caracterizado y los parámetros
de entrada Label para aprender de los datos históricos.

Entrenar el modelo
Ajuste el modelo a los datos splitTrainSet y devuelva el modelo entrenado. Para ello,
agregue lo que se indica a continuación como la siguiente línea de código en el método
BuildAndTrainModel() :

C#

[Link]("=============== Create and Train the Model


===============");
var model = [Link](splitTrainSet);
[Link]("=============== End of training ===============");
[Link]();

El método Fit() entrena el modelo al transformar el conjunto de datos y aplicar el


aprendizaje.

Devolución del modelo entrenado para su uso para la


evaluación
Devuelva el modelo al final del método BuildAndTrainModel() :

C#

return model;

Evaluar el modelo
Cuando el modelo haya sido entrenado, use los datos de prueba para validar su
rendimiento.

1. Cree el método Evaluate() , justo después de BuildAndTrainModel() , con el código


siguiente:

C#

void Evaluate(MLContext mlContext, ITransformer model, IDataView


splitTestSet)
{

El método Evaluate() ejecuta las tareas siguientes:

Carga el conjunto de datos de prueba.


Crea el evaluador BinaryClassification.
Evalúa el modelo y crea las métricas.
Muestra las métricas.

2. Agregue una llamada al nuevo método debajo de la llamada de método


BuildAndTrainModel mediante el código siguiente:

C#

Evaluate(mlContext, model, [Link]);

3. Transforme los datos splitTestSet mediante la adición del código siguiente a


Evaluate() :

C#

[Link]("=============== Evaluating Model accuracy with Test


data===============");
IDataView predictions = [Link](splitTestSet);

El código anterior usa el método Transform() para realizar predicciones para varias
filas de entrada de un conjunto de datos de prueba especificado.

4. Para evaluar el modelo, agregue lo que se indica a continuación como la siguiente


línea de código en el método Evaluate() :

C#
CalibratedBinaryClassificationMetrics metrics =
[Link](predictions, "Label");

Cuando haya establecido el conjunto de predicción ( predictions ), el método Evaluate()


evalúa el modelo, que compara los valores de predicción con el valor real de Labels en
el conjunto de datos de prueba y devuelve un objeto
CalibratedBinaryClassificationMetrics sobre cómo se ejecuta el modelo.

Mostrar las métricas para la validación del modelo


Use el siguiente código para mostrar las métricas:

C#

[Link]();
[Link]("Model quality metrics evaluation");
[Link]("--------------------------------");
[Link]($"Accuracy: {[Link]:P2}");
[Link]($"Auc: {[Link]:P2}");
[Link]($"F1Score: {metrics.F1Score:P2}");
[Link]("=============== End of model evaluation
===============");

La métrica Accuracy obtiene la precisión de un modelo, que corresponde a la


proporción de predicciones correctas en el conjunto de pruebas.

La métrica AreaUnderRocCurve indica el nivel de confianza del modelo en clasificar


correctamente las clases positivas y negativas. Se desea que AreaUnderRocCurve
esté lo más cerca de uno posible.

La métrica F1Score obtiene la puntuación F1 del modelo, que es una medida del
equilibrio entre precisión y recuperación. Se desea que F1Score esté lo más cerca
de uno posible.

Predicción del resultado de datos de prueba


1. Cree el método UseModelWithSingleItem() , justo después del método Evaluate() ,
mediante el código siguiente:

C#

void UseModelWithSingleItem(MLContext mlContext, ITransformer model)


{
}

El método UseModelWithSingleItem() ejecuta las tareas siguientes:

Crea un único comentario de datos de prueba.


Predice sentimientos en función de datos de prueba.
Combina datos de prueba y predicciones para la generación de informes.
Muestra los resultados de la predicción.

2. Agregue una llamada al nuevo método justo debajo de la llamada al método


Evaluate() mediante el código siguiente:

C#

UseModelWithSingleItem(mlContext, model);

3. Agregue el código siguiente como primera línea en el


método UseModelWithSingleItem() :

C#

PredictionEngine<SentimentData, SentimentPrediction> predictionFunction


= [Link]<SentimentData,
SentimentPrediction>(model);

PredictionEngine es una API de conveniencia, que le permite realizar una


predicción en una única instancia de datos. PredictionEngine no es seguro para
subprocesos. Es aceptable usarlo en entornos de un solo subproceso o prototipo.
Para mejorar el rendimiento y la seguridad para subprocesos en entornos de
producción, use el servicio PredictionEnginePool , que crea un ObjectPool de
objetos de PredictionEngine para su uso en toda la aplicación. Consulte esta guía
sobre cómo usar PredictionEnginePool en una API web de [Link] Core.

7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

4. Agregue un comentario para probar la predicción del modelo entrenado en el


método UseModelWithSingleItem() mediante la creación de una instancia de
SentimentData :
C#

SentimentData sampleStatement = new SentimentData


{
SentimentText = "This was a very bad steak"
};

5. Pase los datos del comentario de prueba a PredictionEngine agregando lo


siguiente como siguientes líneas de código al método UseModelWithSingleItem() :

C#

var resultPrediction = [Link](sampleStatement);

La función Predict() realiza una predicción sobre una sola fila de datos.

6. Muestre SentimentText y la predicción de opiniones correspondiente con el


código siguiente:

C#

[Link]();
[Link]("=============== Prediction Test of model with a
single sample and test dataset ===============");

[Link]();
[Link]($"Sentiment: {[Link]} |
Prediction: {([Link]([Link]) ?
"Positive" : "Negative")} | Probability: {[Link]}
");

[Link]("=============== End of Predictions


===============");
[Link]();

Uso del modelo de predicción

Implementación y predicción de elementos por lotes


1. Cree el método UseModelWithBatchItems() , justo después del método
UseModelWithSingleItem() , mediante el código siguiente:

C#
void UseModelWithBatchItems(MLContext mlContext, ITransformer model)
{

El método UseModelWithBatchItems() ejecuta las tareas siguientes:

Crea datos de prueba por lotes.


Predice sentimientos en función de datos de prueba.
Combina datos de prueba y predicciones para la generación de informes.
Muestra los resultados de la predicción.

2. Agregue una llamada al nuevo método justo debajo de la llamada al método


UseModelWithSingleItem() mediante el código siguiente:

C#

UseModelWithBatchItems(mlContext, model);

3. Agregue algunos comentarios para probar las predicciones del modelo entrenado
en el método UseModelWithBatchItems() :

C#

IEnumerable<SentimentData> sentiments = new[]


{
new SentimentData
{
SentimentText = "This was a horrible meal"
},
new SentimentData
{
SentimentText = "I love this spaghetti."
}
};

Predicción de opiniones de comentarios


Use el modelo para predecir la opinión de datos de comentario con el método
Transform():

C#

IDataView batchComments = [Link](sentiments);


IDataView predictions = [Link](batchComments);

// Use model to predict whether comment data is Positive (1) or Negative


(0).
IEnumerable<SentimentPrediction> predictedResults =
[Link]<SentimentPrediction>(predictions,
reuseRowObject: false);

Combinación y presentación de las predicciones


Cree un encabezado para las predicciones con el código siguiente:

C#

[Link]();

[Link]("=============== Prediction Test of loaded model with


multiple samples ===============");

Dado que SentimentPrediction se hereda de SentimentData , el método Transform()


rellena SentimentText con los campos de predicción. A medida que el proceso [Link]
se ejecuta, cada componente agrega columnas, y esto facilita la presentación de los
resultados:

C#

foreach (SentimentPrediction prediction in predictedResults)


{
[Link]($"Sentiment: {[Link]} | Prediction:
{([Link]([Link]) ? "Positive" : "Negative")} |
Probability: {[Link]} ");
}
[Link]("=============== End of predictions ===============");

Resultados
Los resultados deberían ser similares a los indicados a continuación. Durante el
procesamiento, se muestran mensajes. Puede ver las advertencias o mensajes de
procesamiento. Se han quitado de los siguientes resultados para mayor claridad.

Consola

Model quality metrics evaluation


--------------------------------
Accuracy: 83.96%
Auc: 90.51%
F1Score: 84.04%

=============== End of model evaluation ===============

=============== Prediction Test of model with a single sample and test


dataset ===============

Sentiment: This was a very bad steak | Prediction: Negative | Probability:


0.1027377
=============== End of Predictions ===============

=============== Prediction Test of loaded model with a multiple samples


===============

Sentiment: This was a horrible meal | Prediction: Negative | Probability:


0.1369192
Sentiment: I love this spaghetti. | Prediction: Positive | Probability:
0.9960636
=============== End of predictions ===============

=============== End of process ===============


Press any key to continue . . .

¡Enhorabuena! Ya ha creado correctamente un modelo de aprendizaje automático para


clasificar y predecir los sentimientos de los mensajes.

La creación de modelos correctos es un proceso iterativo. Este modelo tiene una calidad
inicial más baja, ya que el tutorial utiliza pequeños conjuntos de datos para
proporcionar un entrenamiento rápido del modelo. Si no está satisfecho con la calidad
del modelo, puede intentar mejorarlo proporcionando conjuntos de datos de
entrenamiento más grandes o eligiendo distintos algoritmos de entrenamiento con
distintos hiperparámetros para cada algoritmo.

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Pasos siguientes
En este tutorial ha aprendido a:

" Creación de una aplicación de consola


" Preparar los datos
" Carga de los datos
" Creación y entrenamiento del modelo
" Evaluar el modelo
" Uso del modelo para realizar una predicción
" Ver los resultados

Siga con el siguiente tutorial para obtener más información

Clasificación de problemas
Tutorial: Clasificación multiclase de
incidencias de soporte técnico con
[Link]
Artículo • 05/06/2023

Este tutorial de ejemplo ilustra el uso de [Link] para crear un clasificador de problemas
de GitHub para entrenar un modelo que clasifica y predice la etiqueta de área para un
problema de GitHub a través de una aplicación de consola de .NET Core con C# en
Visual Studio.

En este tutorial aprenderá a:

" Preparar los datos


" Transformar los datos
" Entrenar el modelo
" Evaluar el modelo
" Predecir con el modelo entrenado
" Implementar y predecir con un modelo cargado

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Requisitos previos
Visual Studio 2022 con la carga de trabajo "Desarrollo de escritorio de .NET"
instalada.
Archivo de problemas de GitHub delimitado por pestañas (issues_train.tsv) .
Prueba de problemas de GitHub delimitado por pestañas (issues_test.tsv) .

Creación de una aplicación de consola

Crear un proyecto
1. Cree una aplicación de consola en C# denominada "GitHubIssueClassification".
Seleccione Siguiente.

2. Seleccione .NET 7 como marco de trabajo. Seleccione Crear.

3. Cree un directorio denominado Datos en el proyecto para guardar los archivos del
conjunto de datos:
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y
seleccione Agregar>Nueva carpeta. Escriba "Datos" y presione Entrar .

4. En el proyecto, cree un directorio denominado Modelos para guardar el modelo:

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar>Nueva carpeta. Escriba "Modelos" y presione Entrar .

5. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en Administrar


paquetes NuGet. Elija "[Link]" como origen del paquete, seleccione la pestaña
Examinar, busque [Link] y seleccione el botón Instalar. Seleccione el botón
Aceptar en el cuadro de diálogo Vista previa de cambios y, a continuación,
seleccione el botón Acepto del cuadro de diálogo Aceptación de la licencia en
caso de que esté de acuerdo con los términos de licencia de los paquetes
mostrados.

Preparar los datos


1. Descargue los conjuntos de datos issues_train.tsv e issues_test.tsv y guárdelos
en la carpeta Datos que ha creado anteriormente. El primer conjunto de datos
entrena el modelo de aprendizaje automático y el segundo puede usarse para
evaluar su grado de precisión.

2. En el Explorador de soluciones, haga clic con el botón derecho en cada uno de los
archivos *.tsv y seleccione Propiedades. En Avanzadas, cambie el valor de Copiar
en el directorio de salida por Copiar si es posterior.

Crear clases y definir rutas de acceso


Agregue las siguientes instrucciones using adicionales a la parte superior del archivo
[Link]:

C#

using [Link];
using GitHubIssueClassification;
Cree tres campos globales para contener las rutas de acceso a los archivos descargados
recientemente y variables globales para MLContext , DataView y PredictionEngine :

_trainDataPath tiene la ruta de acceso al conjunto de datos utilizado para entrenar


el modelo.
_testDataPath tiene la ruta de acceso al conjunto de datos utilizado para evaluar

el modelo.
_modelPath tiene la ruta de acceso donde se guarda el modelo entrenado.

_mlContext es el elemento MLContext que proporciona el contexto de


procesamiento.
_trainingDataView es el elemento IDataView que se usa para procesar el conjunto

de datos de entrenamiento.
_predEngine es el elemento PredictionEngine<TSrc,TDst> que se usa para las

predicciones únicas.

Agregue el código siguiente a la línea directamente debajo de las instrucciones using


para especificar esas rutas de acceso y las otras variables:

C#

string _appPath = [Link]([Link]()[0])


?? ".";
string _trainDataPath = [Link](_appPath, "..", "..", "..", "Data",
"issues_train.tsv");
string _testDataPath = [Link](_appPath, "..", "..", "..", "Data",
"issues_test.tsv");
string _modelPath = [Link](_appPath, "..", "..", "..", "Models",
"[Link]");

MLContext _mlContext;
PredictionEngine<GitHubIssue, IssuePrediction> _predEngine;
ITransformer _trainedModel;
IDataView _trainingDataView;

Cree algunas clases para los datos de entrada y las predicciones. Agregue una nueva
clase a su proyecto:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, a


continuación, seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.
Se abre el archivo [Link] en el editor de código. Agregue la siguiente
instrucción using a la parte superior de [Link]:

C#

using [Link];

Quite la definición de clase existente y agregue el código siguiente, que tiene dos clases
GitHubIssue y IssuePrediction , al archivo [Link]:

C#

public class GitHubIssue


{
[LoadColumn(0)]
public string? ID { get; set; }
[LoadColumn(1)]
public string? Area { get; set; }
[LoadColumn(2)]
public required string Title { get; set; }
[LoadColumn(3)]
public required string Description { get; set; }
}

public class IssuePrediction


{
[ColumnName("PredictedLabel")]
public string? Area;
}

label es la columna que quiere predecir. Los valores de Features identificados son las

entradas que se proporcionan al modelo para predecir la etiqueta.

Use LoadColumnAttribute para especificar los índices de las columnas de origen en el


conjunto de datos.

GitHubIssue es la clase de conjunto de datos de entrada y contiene los siguientes

campos de String:

ID , la primera columna (id. de problema de GitHub).


Area , la segunda columna (la predicción para el entrenamiento).

Title , la tercera columna (título del problema de GitHub) es el primer feature


usado para predecir el Area
Description , la cuarta columna, es el segundo objeto feature que se usa para la

predicción de Area
IssuePrediction es la clase usada para la predicción una vez entrenado el modelo.

Tiene un solo elemento string ( Area ) y un atributo PredictedLabel ColumnName .


PredictedLabel se usa durante la predicción y la evaluación. Para la evaluación, se utiliza

una entrada con los datos de entrenamiento, los valores de predicción y el modelo.

Todas las operaciones de [Link] se inician en la clase MLContext. La inicialización de


mlContext crea un entorno de [Link] que se puede compartir entre los objetos del

flujo de trabajo de creación de modelos. Es similar, conceptualmente, al DBContext en


Entity Framework .

Inicialización de variables
Inicialice la variante global _mlContext con una nueva instancia de MLContext con una
inicialización aleatoria ( seed: 0 ) para obtener resultados repetibles o deterministas en
varios entrenamientos. Reemplace la línea [Link]("Hello World!") por el
código siguiente:

C#

_mlContext = new MLContext(seed: 0);

Carga de los datos


[Link] usa la interfaz IDataView como una forma flexible y eficaz de describir datos
tabulares de texto o numéricos. IDataView puede cargar archivos de texto o en tiempo
real (por ejemplo, una base de datos SQL o archivos de registro).

Para inicializar y cargar la variable global _trainingDataView con el fin de volver a usarla
para la canalización, agregue el código siguiente después de la inicialización de
mlContext :

C#

_trainingDataView = _mlContext.[Link]<GitHubIssue>
(_trainDataPath,hasHeader: true);

LoadFromTextFile() define el esquema de datos y lee en el archivo. Toma las variables de


ruta de acceso de datos y devuelve IDataView .

Agregue el método siguiente después de la llamada al método LoadFromTextFile() :


C#

var pipeline = ProcessData();

El método ProcessData ejecuta las tareas siguientes:

Extrae y transforma los datos.


Devuelve la canalización de procesamiento.

Cree el método ProcessData al final del archivo [Link] con el código siguiente:

C#

IEstimator<ITransformer> ProcessData()
{

Extracción de características y transformación


de datos
Como quiere predecir la etiqueta de GitHub de área para un GitHubIssue , utilice el
método MapValueToKey() para transformar la columna Area en una columna Label de
tipo de clave numérico (un formato admitido por los algoritmos de clasificación) y
agréguela como nueva columna de conjunto de datos:

C#

var pipeline =
_mlContext.[Link](inputColumnName: "Area",
outputColumnName: "Label")

Después, llame a [Link] que transforma las


columnas de texto ( Title y Description ) en un vector numérico para cada una de
nombre TitleFeaturized y DescriptionFeaturized . Anexe la caracterización para ambas
columnas a la canalización usando el siguiente código:

C#

.Append(_mlContext.[Link](inputColumnName: "Title",
outputColumnName: "TitleFeaturized"))
.Append(_mlContext.[Link](inputColumnName:
"Description", outputColumnName: "DescriptionFeaturized"))
El último paso de preparación de datos combina todas las columnas de característica en
la columna Características con el método Concatenate(). De forma predeterminada, un
algoritmo de aprendizaje solo procesa las características de la columna Features. Anexe
esta transformación a la canalización usando el siguiente código:

C#

.Append(_mlContext.[Link]("Features", "TitleFeaturized",
"DescriptionFeaturized"))

A continuación, anexe AppendCacheCheckpoint para almacenar en caché el objeto


DataView, de modo que pueda obtener un mayor rendimiento al iterar los datos varias
veces con la caché, como se muestra en el código siguiente:

C#

.AppendCacheCheckpoint(_mlContext);

2 Advertencia

Use AppendCacheCheckpoint para conjuntos de datos pequeños o medianos para


reducir el tiempo de entrenamiento. NO lo use (quite. AppendCacheCheckpoint())
al tratar con grandes conjuntos de datos.

Devuelva la canalización al final del método ProcessData .

C#

return pipeline;

En este paso se controla el preprocesamiento y la caracterización. El uso de


componentes adicionales disponibles en [Link] permite conseguir mejores resultados
con el modelo.

Creación y entrenamiento del modelo


Agregue la siguiente llamada al método BuildAndTrainModel junto a la siguiente línea
después de la llamada al método ProcessData() :

C#
var trainingPipeline = BuildAndTrainModel(_trainingDataView, pipeline);

El método BuildAndTrainModel ejecuta las tareas siguientes:

Crea la clase de algoritmo de entrenamiento.


Entrena el modelo.
Predice el área según los datos de entrenamiento.
Devuelve el modelo.

Cree el método BuildAndTrainModel , justo después de la declaración del método


ProcessData() , mediante el código siguiente:

C#

IEstimator<ITransformer> BuildAndTrainModel(IDataView trainingDataView,


IEstimator<ITransformer> pipeline)
{

Acerca de la tarea de clasificación


La clasificación es una tarea de aprendizaje automático que usa datos para determinar
la categoría, el tipo o la clase de un elemento o fila de datos y suele ser uno de los
siguientes tipos:

Binario: A o B.
Multiclase: varias categorías que se pueden predecir mediante el uso de un único
modelo.

Para este tipo de problema, use un algoritmo de aprendizaje de clasificación multiclase,


ya que la predicción de categoría de problema puede ser una de varias categorías
(multiclase) en lugar de solo dos (binaria).

Anexe el algoritmo de aprendizaje automático a las definiciones de transformación de


datos agregando lo siguiente como primera línea de código en BuildAndTrainModel() :

C#

var trainingPipeline =
[Link](_mlContext.[Link]
opy("Label", "Features"))

.Append(_mlContext.[Link]("PredictedLabel"));
SdcaMaximumEntropy es el algoritmo de entrenamiento de clasificación multiclase. Se
anexa a pipeline y acepta Title y Description ( Features ) caracterizados y los
parámetros de entrada Label para aprender de los datos históricos.

Entrenar el modelo
Ajuste el modelo a los datos splitTrainSet y devuelva el modelo entrenado. Para ello,
agregue lo que se indica a continuación como la siguiente línea de código en el método
BuildAndTrainModel() :

C#

_trainedModel = [Link](trainingDataView);

El método Fit() entrena el modelo transformando el conjunto de datos y aplicando el


entrenamiento.

PredictionEngine es una API de conveniencia, que le permite pasar datos y luego realizar
una predicción en una única instancia de datos. Agregue esto como siguiente línea en el
método BuildAndTrainModel() :

C#

_predEngine = _mlContext.[Link]<GitHubIssue,
IssuePrediction>(_trainedModel);

Predecir con el modelo entrenado


Agregue un problema de GitHub para probar la predicción del modelo entrenado en el
método Predict mediante la creación de una instancia de GitHubIssue :

C#

GitHubIssue issue = new GitHubIssue() {


Title = "WebSockets communication is slow in my machine",
Description = "The WebSockets communication used under the covers by
SignalR looks like is going slow in my development machine.."
};

El uso de la función Predict() realiza una predicción en una sola fila de datos:

C#
var prediction = _predEngine.Predict(issue);

Uso del modelo: resultados de la predicción


Muestre GitHubIssue y la predicción de la etiqueta Area correspondiente para
compartir los resultados y actuar en consecuencia. Cree una visualización para los
resultados mediante el código [Link]() siguiente:

C#

[Link]($"=============== Single Prediction just-trained-model -


Result: {[Link]} ===============");

Devolución del modelo entrenado para su uso para la


evaluación
Devuelva el modelo al final del método BuildAndTrainModel .

C#

return trainingPipeline;

Evaluar el modelo
Ahora que ha creado y entrenado el modelo, debe evaluarlo con otro conjunto de datos
para el control de calidad y la validación. En el método Evaluate , el modelo creado en
BuildAndTrainModel se pasa para ser evaluado. Cree el método Evaluate , justo después

de BuildAndTrainModel , como en el código siguiente:

C#

void Evaluate(DataViewSchema trainingDataViewSchema)


{

El método Evaluate ejecuta las tareas siguientes:

Carga el conjunto de datos de prueba.


Crea el evaluador multiclase.
Evalúa el modelo y crea métricas.
Muestra las métricas.

Agregue una llamada al nuevo método justo debajo de la llamada al método


BuildAndTrainModel mediante el código siguiente:

C#

Evaluate(_trainingDataView.Schema);

Como hizo anteriormente con el conjunto de datos de entrenamiento, cargue el


conjunto de datos de prueba agregando el código siguiente al método Evaluate :

C#

var testDataView = _mlContext.[Link]<GitHubIssue>


(_testDataPath,hasHeader: true);

El método Evaluate() calcula las métricas de calidad del modelo utilizando el conjunto
de datos especificado. Devuelve un objeto MulticlassClassificationMetrics que contiene
las métricas totales calculadas por evaluadores de clasificación multiclase. Para mostrar
las métricas a fin de determinar la calidad del modelo, primero tendrá que obtenerlas.
Observe el uso del método Transform() de la variable global _trainedModel de
aprendizaje automático (una ITransformer) que da entrada a las características y
devuelve predicciones. Agregue el código siguiente al método Evaluate como la
siguiente línea:

C#

var testMetrics =
_mlContext.[Link](_trainedModel.Transform(testDat
aView));

Las siguientes métricas se evalúan para la clasificación multiclase:

Microprecisión: todos los pares de ejemplo y clase contribuyen del mismo modo a
la métrica de precisión. Quiere que la microprecisión esté lo más cerca posible de
1.

Macroprecisión: todas las clases contribuyen del mismo modo a la métrica de


precisión. Las clases minoritarias tienen el mismo peso que las clases más grandes.
Quiere que la macroprecisión esté lo más cerca posible de 1.
Pérdida de registro: vea Pérdida de registro. Le recomendamos que la pérdida
logarítmica esté lo más cerca posible de 0.

Reducción de la pérdida de registro: parte de [-inf, 1.00], donde 1.00 equivale a


una predicción perfecta, y 0 indica una predicción aproximada. Le recomendamos
que la reducción de la pérdida de registro esté lo más cerca posible de 1.

Visualización de las métricas para la validación del


modelo
Utilice el código siguiente para mostrar las métricas, compartir los resultados y, a
continuación, trabajar con ellos:

C#

[Link]($"********************************************************
*****************************************************");
[Link]($"* Metrics for Multi-class Classification model -
Test Data ");
[Link]($"*-------------------------------------------------------
-----------------------------------------------------");
[Link]($"* MicroAccuracy:
{[Link].###}");
[Link]($"* MacroAccuracy:
{[Link].###}");
[Link]($"* LogLoss: {[Link]:#.###}");
[Link]($"* LogLossReduction:
{[Link]:#.###}");
[Link]($"********************************************************
*****************************************************");

Guardar el modelo en un archivo


Una vez que esté satisfecho con el modelo, guárdelo en un archivo para hacer
predicciones más adelante o en otra aplicación. Agregue el código siguiente al método
Evaluate .

C#

SaveModelAsFile(_mlContext, trainingDataViewSchema, _trainedModel);

Cree el método SaveModelAsFile debajo del método Evaluate .

C#
void SaveModelAsFile(MLContext mlContext,DataViewSchema
trainingDataViewSchema, ITransformer model)
{

Agregue el código siguiente al método SaveModelAsFile . Este código usa el método


Save para serializar y almacenar el modelo entrenado como archivo ZIP.

C#

[Link](model, trainingDataViewSchema, _modelPath);

Implementación y predicción con un modelo


Agregue una llamada al nuevo método justo debajo de la llamada al método Evaluate
mediante el código siguiente:

C#

PredictIssue();

Cree el método PredictIssue , justo después del método Evaluate (y justo antes del
método SaveModelAsFile ) con el código siguiente:

C#

void PredictIssue()
{

El método PredictIssue ejecuta las tareas siguientes:

Carga el modelo guardado


Crea un único problema de datos de prueba.
Predice el área según los datos de prueba.
Combina datos de prueba y predicciones para la generación de informes.
Muestra los resultados de la predicción.

Cargue el modelo guardado en la aplicación agregando el código siguiente al método


PredictIssue :
C#

ITransformer loadedModel = _mlContext.[Link](_modelPath, out var


modelInputSchema);

Agregue un problema de GitHub para probar la predicción del modelo entrenado en el


método Predict mediante la creación de una instancia de GitHubIssue :

C#

GitHubIssue singleIssue = new GitHubIssue() { Title = "Entity Framework


crashes", Description = "When connecting to the database, EF is crashing" };

Como hizo anteriormente, cree una instancia de PredictionEngine con el código


siguiente:

C#

_predEngine = _mlContext.[Link]<GitHubIssue,
IssuePrediction>(loadedModel);

PredictionEngine es una API de conveniencia, que le permite realizar una predicción en


una única instancia de datos. PredictionEngine no es seguro para subprocesos. Es
aceptable usarlo en entornos de un solo subproceso o prototipo. Para mejorar el
rendimiento y la seguridad para subprocesos en entornos de producción, use el servicio
PredictionEnginePool , que crea un ObjectPool de objetos de PredictionEngine para su

uso en toda la aplicación. Consulte esta guía sobre cómo usar PredictionEnginePool en
una API web de [Link] Core.

7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

Use PredictionEngine para predecir la etiqueta de GitHub de área agregando el código


siguiente al método PredictIssue para la predicción:

C#

var prediction = _predEngine.Predict(singleIssue);


Uso del modelo cargado para la predicción
Muestre Area para poder categorizar el problema y actuar en consecuencia. Cree una
visualización para los resultados mediante el código [Link]() siguiente:

C#

[Link]($"=============== Single Prediction - Result:


{[Link]} ===============");

Resultados
Los resultados deberían ser similares a los indicados a continuación. A medida que la
canalización procesa, muestra mensajes. Puede ver las advertencias o mensajes de
procesamiento. Estos mensajes se han quitado de los resultados siguientes para mayor
claridad.

Consola

=============== Single Prediction just-trained-model - Result: area-


[Link] ===============
****************************************************************************
*********************************
* Metrics for Multi-class Classification model - Test Data
*---------------------------------------------------------------------------
---------------------------------
* MicroAccuracy: 0.738
* MacroAccuracy: 0.668
* LogLoss: .919
* LogLossReduction: .643
****************************************************************************
*********************************
=============== Single Prediction - Result: [Link] ===============

¡Enhorabuena! Ya ha creado correctamente un modelo de aprendizaje automático para


clasificar y predecir una etiqueta Área de un problema de GitHub. Puede encontrar el
código fuente para este tutorial en el repositorio dotnet/samples .

Pasos siguientes
En este tutorial ha aprendido a:

" Preparar los datos


" Transformar los datos
" Entrenar el modelo
" Evaluar el modelo
" Predecir con el modelo entrenado
" Implementar y predecir con un modelo cargado

Siga con el siguiente tutorial para obtener más información

Predictor de tarifa de taxi


Tutorial: Predicción de precios mediante
regresión con [Link]
Artículo • 10/05/2023

En este tutorial se muestra cómo compilar un modelo de regresión con [Link] para
predecir precios, en concreto, las tarifas de taxi de Nueva York.

En este tutorial aprenderá a:

" Preparar y entender los datos


" Cargar y transformar los datos
" Elegir un algoritmo de aprendizaje
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Requisitos previos
Visual Studio 2022 con la carga de trabajo "Desarrollo de escritorio de .NET"
instalada.

Creación de una aplicación de consola


1. Cree una aplicación de consola en C# llamada "TaxiFarePrediction".

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Cree un directorio denominado Datos en el proyecto para almacenar el conjunto


de datos y los archivos de modelo.

4. Instale los paquetes NuGet [Link] y [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Administrar paquetes NuGet. Elija "[Link]" como origen del
paquete, seleccione la pestaña Examinar, busque [Link], seleccione el
paquete en la lista y seleccione el botón Instalar. Seleccione el botón Aceptar en el
cuadro de diálogo Vista previa de cambios y, a continuación, seleccione el botón
Acepto del cuadro de diálogo Aceptación de la licencia en caso de que esté de
acuerdo con los términos de licencia de los paquetes mostrados. Haga lo mismo
con el paquete NuGet [Link].

Preparar y entender los datos


1. Descargue los conjuntos de datos [Link] y [Link] y
guárdelos en la carpeta Datos que ha creado en el paso anterior. Usaremos estos
conjuntos de datos para entrenar el modelo de aprendizaje automático y, después,
evaluar su precisión. Estos conjuntos de datos proceden originalmente del
conjunto de datos NYC TLC Taxi Trip .

2. En el Explorador de soluciones, haga clic con el botón derecho en cada uno de los
archivos .csv y seleccione Propiedades. En Avanzadas, cambie el valor de Copiar
en el directorio de salida por Copiar si es posterior.

3. Abra el conjunto de datos [Link] y consulte los encabezados de


columna de la primera fila. Eche un vistazo a cada una de las columnas. Estudie los
datos y decida qué columnas son características y cuál es la etiqueta.

label es la columna que quiere predecir. Las Features identificadas son las entradas
que proporciona al modelo para predecir la Label .

El conjunto de datos proporcionado contiene las columnas siguientes:

vendor_id: el identificador del taxista es una característica.


rate_code: el tipo de tarifa del viaje en taxi es una característica.
passenger_count: el número de pasajeros en el recorrido es una característica.
trip_time_in_secs: la cantidad de tiempo que tardó el viaje. Por ejemplo, si quiere
calcular la tarifa del viaje antes de que termine y aún no conoce la duración del
viaje, el tiempo del viaje no es una característica, por lo que deberá excluir esta
columna del modelo.
trip_distance: la distancia del viaje es una característica.
payment_type: el método de pago (efectivo o tarjeta de crédito) es una
característica.
fare_amount: la tarifa de taxi total pagada es la etiqueta.

Crear clases de datos


Cree clases para los datos de entrada y las predicciones:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, a


continuación, seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

3. Agregue las siguientes directivas using al nuevo archivo:

C#

using [Link];

Quite la definición de clase existente y agregue el código siguiente, que tiene dos clases
TaxiTrip y TaxiTripFarePrediction , al archivo [Link]:

C#

public class TaxiTrip


{
[LoadColumn(0)]
public string? VendorId;

[LoadColumn(1)]
public string? RateCode;

[LoadColumn(2)]
public float PassengerCount;

[LoadColumn(3)]
public float TripTime;

[LoadColumn(4)]
public float TripDistance;

[LoadColumn(5)]
public string? PaymentType;

[LoadColumn(6)]
public float FareAmount;
}

public class TaxiTripFarePrediction


{
[ColumnName("Score")]
public float FareAmount;
}
TaxiTrip es la clase de datos de entrada y tiene definiciones para cada una de las

columnas del conjunto de datos. Use el atributo LoadColumnAttribute para especificar


los índices de las columnas de origen en el conjunto de datos.

La clase TaxiTripFarePrediction representa los resultados predichos. Tiene un único


campo flotante, FareAmount , con un atributo Score ColumnNameAttribute aplicado. En
el caso de la tarea de regresión, la columna Score contiene valores de etiqueta
predichos.

7 Nota

Use el tipo float para representar los valores de punto flotante en las clases de
entrada y predicción de datos.

Definir rutas de acceso de datos y modelos


Agregue las siguientes instrucciones using adicionales a la parte superior del archivo
[Link]:

C#

using [Link];
using TaxiFarePrediction;

Deberá crear tres campos que contengan las rutas de acceso a los archivos con los
conjuntos de datos y el archivo para guardar el modelo:

_trainDataPath contiene la ruta de acceso al archivo con el conjunto de datos

utilizado para entrenar el modelo.


_testDataPath contiene la ruta de acceso al archivo con el conjunto de datos

utilizado para evaluar el modelo.


_modelPath contiene la ruta de acceso al archivo en el que se almacena el modelo
entrenado.

Agregue el código siguiente justo debajo de la sección usings para especificar esas rutas
de acceso y para la variable _textLoader :

C#

string _trainDataPath = [Link]([Link], "Data",


"[Link]");
string _testDataPath = [Link]([Link], "Data",
"[Link]");
string _modelPath = [Link]([Link], "Data",
"[Link]");

Todas las operaciones de [Link] se inician en la clase MLContext. La inicialización de


mlContext crea un entorno de [Link] que se puede compartir entre los objetos del
flujo de trabajo de creación de modelos. Como concepto, se parece a DBContext en
Entity Framework.

Inicialización de variables
Reemplace la línea [Link]("Hello World!") por el siguiente código para
declarar e inicializar la variable mlContext :

C#

MLContext mlContext = new MLContext(seed: 0);

Agregue lo siguiente como la siguiente línea de código para llamar al método Train :

C#

var model = Train(mlContext, _trainDataPath);

El método Train() ejecuta las tareas siguientes:

Carga los datos.


Extrae y transforma los datos.
Entrena el modelo.
Devuelve el modelo.

El método Train entrena el modelo. Cree ese método justo debajo mediante el código
siguiente:

C#

ITransformer Train(MLContext mlContext, string dataPath)


{

Cargar y transformar datos


[Link] usa la interfaz IDataView como una forma flexible y eficaz de describir datos
tabulares de texto o numéricos. IDataView puede cargar archivos de texto o en tiempo
real (por ejemplo, una base de datos SQL o archivos de registro). Agregue el código
siguiente a la primera línea del método Train() :

C#

IDataView dataView = [Link]<TaxiTrip>(dataPath,


hasHeader: true, separatorChar: ',');

Como quiere predecir la tarifa de carreras de taxi, la columna FareAmount es la Label


que va a predecir (la salida del modelo). Para ello, use la clase de transformación
CopyColumnsEstimator para copiar FareAmount y agregue el código siguiente:

C#

var pipeline = [Link](outputColumnName: "Label",


inputColumnName:"FareAmount")

El algoritmo que entrena el modelo requiere características numéricas, por lo que debe
transformar los datos de categorías ( VendorId , RateCode y PaymentType ) en números
( VendorIdEncoded , RateCodeEncoded y PaymentTypeEncoded ). Para ello, use la clase de
transformación OneHotEncodingTransformer, que asigna diferentes valores de clave
numéricos a los distintos valores de cada una de las columnas y agregue el código
siguiente:

C#

.Append([Link](outputColumnName:
"VendorIdEncoded", inputColumnName:"VendorId"))
.Append([Link](outputColumnName:
"RateCodeEncoded", inputColumnName: "RateCode"))
.Append([Link](outputColumnName:
"PaymentTypeEncoded", inputColumnName: "PaymentType"))

En el último paso para la preparación de los datos, se combinan todas las columnas de
característica en la columna Características mediante la clase de transformación
[Link] . De forma predeterminada, un algoritmo de
aprendizaje solo procesa las características de la columna Features. Agregue el código
siguiente:

C#
.Append([Link]("Features", "VendorIdEncoded",
"RateCodeEncoded", "PassengerCount", "TripDistance", "PaymentTypeEncoded"))

Elegir un algoritmo de aprendizaje


Este problema consiste en predecir la tarifa de una carrera de taxi en la ciudad de Nueva
York. A primera vista, puede parecer que simplemente depende de la distancia recorrida.
Sin embargo, los taxistas de Nueva York cobran distintas cantidades por otros factores,
como llevar pasajeros adicionales o pagar con tarjeta de crédito en lugar de efectivo.
Quiere predecir el valor de precio, que es un valor real, en función de los demás factores
del conjunto de datos. Para ello, se elige una tarea de aprendizaje automático de
regresión.

Anexe la tarea de aprendizaje automático FastTreeRegressionTrainer a las definiciones


de transformación de datos al agregar esto como siguiente línea de código de Train() :

C#

.Append([Link]());

Entrenar el modelo
Ajuste el modelo a la dataview de entrenamiento y devuelva el modelo entrenado
agregando la siguiente línea de código en el método Train() :

C#

var model = [Link](dataView);

El método Fit() entrena el modelo al transformar el conjunto de datos y aplicar el


aprendizaje.

Devuelva el modelo entrenado con la siguiente línea de código en el método Train() :

C#

return model;

Evaluar el modelo
Luego evalúe el rendimiento del modelo con los datos de prueba de control de calidad
y validación. Cree el método Evaluate() , justo después de Train() , con el código
siguiente:

C#

void Evaluate(MLContext mlContext, ITransformer model)


{

El método Evaluate ejecuta las tareas siguientes:

Carga el conjunto de datos de prueba.


Crea el evaluador de regresión.
Evalúa el modelo y crea las métricas.
Muestra las métricas.

Agregue una llamada al nuevo método justo debajo de la llamada al método Train
mediante el código siguiente:

C#

Evaluate(mlContext, model);

Cargue el conjunto de datos de prueba con el método LoadFromTextFile(). Evalúe el


modelo con este conjunto de datos como control de calidad al agregar el código
siguiente en el método Evaluate :

C#

IDataView dataView = [Link]<TaxiTrip>


(_testDataPath, hasHeader: true, separatorChar: ',');

Luego transforme los datos de Test al agregar el código siguiente a Evaluate() :

C#

var predictions = [Link](dataView);

El método Transform() realiza predicciones para las filas de entrada del conjunto de
datos de prueba.
El método [Link] calcula las métricas de calidad para
PredictionModel mediante el conjunto de datos especificado. Devuelve un objeto
RegressionMetrics que contiene las métricas totales calculadas por evaluadores de
regresión.

Para mostrar estos elementos a fin de determinar la calidad del modelo, debe obtener
primero las métricas. Agregue el siguiente código como la siguiente línea en el método
Evaluate :

C#

var metrics = [Link](predictions, "Label", "Score");

Una vez que se ha establecido la predicción, el método Evaluate() valora el modelo, que
compara los valores predichos con las Labels reales del conjunto de datos de prueba y
devuelve métricas sobre el rendimiento del modelo.

Agregue el código siguiente para evaluar el modelo y generar las métricas de


evaluación:

C#

[Link]();
[Link]($"*************************************************");
[Link]($"* Model quality metrics evaluation ");
[Link]($"*------------------------------------------------");

RSquared es otra métrica de evaluación de modelos de regresión. RSquared muestra


valores comprendidos entre 0 y 1. Cuanto más se acerque el valor a 1, mejor será el
modelo. Agregue el código siguiente al método Evaluate para mostrar el valor de
RSquared:

C#

[Link]($"* RSquared Score: {[Link].##}");

RMS es una de las métricas de evaluación del modelo de regresión. Cuanto menor sea
su valor, mejor será el modelo. Agregue el código siguiente al método Evaluate para
mostrar el valor de RMS:

C#

[Link]($"* Root Mean Squared Error:


{[Link]:#.##}");
Usar el modelo para las predicciones
Cree el método TestSinglePrediction , justo después del método Evaluate , mediante el
código siguiente:

C#

void TestSinglePrediction(MLContext mlContext, ITransformer model)


{

El método TestSinglePrediction ejecuta las tareas siguientes:

Crea un único comentario de datos de prueba.


Predice la tarifa según los datos de prueba.
Combina datos de prueba y predicciones para la generación de informes.
Muestra los resultados de la predicción.

Agregue una llamada al nuevo método justo debajo de la llamada al método Evaluate
mediante el código siguiente:

C#

TestSinglePrediction(mlContext, model);

Use PredictionEngine para predecir la tarifa al agregar el código siguiente


a TestSinglePrediction() :

C#

var predictionFunction = [Link]<TaxiTrip,


TaxiTripFarePrediction>(model);

PredictionEngine es una API de conveniencia, que le permite realizar una predicción en


una única instancia de datos. PredictionEngine no es seguro para subprocesos. Es
aceptable usarlo en entornos de un solo subproceso o prototipo. Para mejorar el
rendimiento y la seguridad para subprocesos en entornos de producción, use el servicio
PredictionEnginePool , que crea un ObjectPool de objetos de PredictionEngine para su

uso en toda la aplicación. Consulte esta guía sobre cómo usar PredictionEnginePool en
una API web de [Link] Core.
7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

En este tutorial se utiliza un viaje de prueba en esta clase. Más adelante, puede agregar
otros escenarios para experimentar con el modelo. Agregue un viaje para probar la
predicción de costo del modelo entrenado en el método TestSinglePrediction()
mediante la creación de una instancia de TaxiTrip :

C#

var taxiTripSample = new TaxiTrip()


{
VendorId = "VTS",
RateCode = "1",
PassengerCount = 1,
TripTime = 1140,
TripDistance = 3.75f,
PaymentType = "CRD",
FareAmount = 0 // To predict. Actual/Observed = 15.5
};

Luego, prediga el importe del servicio según una instancia única de los datos de carreras
de taxi y páselo a la clase PredictionEngine agregando lo siguiente como próximas
líneas de código en el método TestSinglePrediction() :

C#

var prediction = [Link](taxiTripSample);

La función Predict() realiza una predicción sobre una única instancia de datos.

Para mostrar la tarifa prevista del viaje especificado, agregue el código siguiente al
método TestSinglePrediction :

C#

[Link]($"********************************************************
**************");
[Link]($"Predicted fare: {[Link].####}, actual
fare: 15.5");
[Link]($"********************************************************
**************");
Ejecute el programa para ver la tarifa de taxi predicha para su caso de prueba.

¡Enhorabuena! Ya ha creado correctamente un modelo de aprendizaje automático para


predecir tarifas de viajes en taxi, ha evaluado su precisión y lo ha usado para hacer
predicciones. Puede encontrar el código fuente de este tutorial en el repositorio
dotnet/samples de GitHub.

Pasos siguientes
En este tutorial ha aprendido a:

" Preparar y entender los datos


" Crear una canalización de aprendizaje
" Cargar y transformar los datos
" Elegir un algoritmo de aprendizaje
" Entrenar el modelo
" Evaluar el modelo
" Usar el modelo para las predicciones

Siga con el siguiente tutorial para obtener más información.

Agrupación en clústeres de iris


Tutorial: Clasificación de flores de iris
mediante la agrupación en clústeres k-
means con [Link]
Artículo • 10/05/2023

En este tutorial se muestra cómo usar [Link] para crear un modelo de agrupación en
clústeres para el conjunto de datos de flores de iris .

En este tutorial aprenderá a:

" Entender el problema
" Seleccionar la tarea de aprendizaje automático adecuada
" Preparar los datos
" Cargar y transformar los datos
" Elegir un algoritmo de aprendizaje
" Entrenar el modelo
" Usar el modelo para las predicciones

Requisitos previos
Visual Studio 2022 .

Entender el problema
Este problema consiste en dividir el conjunto de flores de iris en grupos diferentes
según las características de la flor. Esas características son la longitud y el ancho del
sépalo, y la longitud y ancho del pétalo. Para este tutorial, se supone que el tipo de cada
flor es desconocido. Le interesa conocer la estructura de un conjunto de datos a partir
de las características y predecir cómo se ajusta una instancia de datos a esta estructura.

Seleccionar la tarea de aprendizaje automático


adecuada
Como no se sabe a qué grupo pertenece cada flor, seleccione la tarea de aprendizaje
automático no supervisado. Para dividir un conjunto de datos en grupos de manera que
los elementos del mismo grupo sean más similares entre sí que con los de otros grupos,
use una tarea de aprendizaje automático de agrupación en clústeres.
Creación de una aplicación de consola
1. Cree una aplicación de consolaen C# llamada "IrisFlowerClustering". Haga clic en
el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Cree un directorio denominado Datos en el proyecto para almacenar el conjunto


de datos y los archivos del modelo:

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar>Nueva carpeta. Escriba "Datos" y presione Entrar.

4. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Administrar paquetes NuGet. Elija "[Link]" como origen del
paquete, seleccione la pestaña Examinar, busque [Link] y seleccione el
botón Instalar. Seleccione el botón Aceptar en el cuadro de diálogo Vista previa
de cambios y, a continuación, seleccione el botón Acepto del cuadro de diálogo
Aceptación de la licencia en caso de que esté de acuerdo con los términos de
licencia de los paquetes mostrados.

Preparar los datos


1. Descargue el conjunto de datos [Link] y guárdelo en la carpeta Datos que ha
creado en el paso anterior. Para obtener más información sobre el conjunto de
datos de iris, vea la página de Wikipedia Conjunto de datos de flor de Iris y la
página Iris Data Set (Conjunto de datos Iris), que es el origen del conjunto de
datos.

2. En el Explorador de soluciones, haga clic con el botón derecho en el archivo


[Link] y seleccione Propiedades. En Avanzadas, cambie el valor de Copiar en el
directorio de salida por Copiar si es posterior.

El archivo [Link] contiene cinco columnas que representan lo siguiente:


La longitud del sépalo en centímetros
El ancho del sépalo en centímetros
La longitud del pétalo en centímetros
El ancho del pétalo en centímetros
El tipo de flor de iris.

Para el ejemplo de agrupación en clústeres, en este tutorial se ignora la última columna.

Crear clases de datos


Cree clases para los datos de entrada y las predicciones:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, a


continuación, seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

3. Agregue la directiva using siguiente al archivo nuevo:

C#

using [Link];

Quite la definición de clase existente y agregue el código siguiente, que define dos
clases IrisData y ClusterPrediction , al archivo [Link]:

C#

public class IrisData


{
[LoadColumn(0)]
public float SepalLength;

[LoadColumn(1)]
public float SepalWidth;

[LoadColumn(2)]
public float PetalLength;

[LoadColumn(3)]
public float PetalWidth;
}

public class ClusterPrediction


{
[ColumnName("PredictedLabel")]
public uint PredictedClusterId;

[ColumnName("Score")]
public float[]? Distances;
}

IrisData es la clase de datos de entrada y tiene definiciones para cada una de las

características del conjunto de datos. Use el atributo LoadColumn para especificar los
índices de las columnas de origen en el archivo de conjunto de datos.

La clase ClusterPrediction representa el resultado del modelo de agrupación en


clústeres aplicado a una instancia de IrisData . Use el atributo ColumnName para
enlazar los campos PredictedClusterId y Distances a las columnas PredictedLabel y
Score respectivamente. En el caso de la tarea de agrupación en clústeres, esas columnas
tienen el significado siguiente:

La columna PredictedLabel contiene el identificador del clúster previsto.


La columna Score contiene una matriz con las distancias euclidianas cuadradas a
los centroides de clúster. La longitud de la matriz es igual al número de clústeres.

7 Nota

Use el tipo float para representar los valores de punto flotante en las clases de
entrada y predicción de datos.

Definir rutas de acceso de datos y modelos


Vuelva al archivo [Link] y agregue dos campos para contener las rutas de acceso al
archivo de conjuntos de datos y al archivo en el que se guarda el modelo:

_dataPath contiene la ruta de acceso al archivo con el conjunto de datos utilizado

para entrenar el modelo.


_modelPath contiene la ruta de acceso al archivo en el que se almacena el modelo

entrenado.

Agregue el código siguiente en las instrucciones using para especificar esas rutas de
acceso:

C#

string _dataPath = [Link]([Link], "Data",


"[Link]");
string _modelPath = [Link]([Link], "Data",
"[Link]");

Creación del contexto de ML


Agregue las directivas using adicionales siguientes a la parte superior del archivo
[Link]:

C#

using [Link];
using IrisFlowerClustering;

Reemplace la línea [Link]("Hello World!"); por el código siguiente:

C#

var mlContext = new MLContext(seed: 0);

La clase [Link] representa el entorno de aprendizaje automático y


proporciona mecanismos para puntos de entrada y de registro para la carga de datos,
entrenamiento del modelo, predicción y otras tareas. Esto es comparable
conceptualmente a usar DbContext en Entity Framework.

Configuración de la carga de datos


Agregue el código siguiente al método MLContext para configurar la manera de cargar
los datos:

C#

IDataView dataView = [Link]<IrisData>(_dataPath,


hasHeader: false, separatorChar: ',');

El [Link] método de extensión genérico deduce el esquema


del conjunto de datos del tipo IrisData proporcionado y devuelve IDataView, que se
puede usar como entrada para los transformadores.

Crear una canalización de aprendizaje


Para este tutorial, la canalización de aprendizaje de la tarea de agrupación en clústeres
consta de los dos pasos siguientes:

concatenar las columnas cargadas en una columna Características, que usa un


instructor de agrupación en clústeres;
usar un instructor KMeansTrainer para entrenar el modelo mediante el algoritmo
de agrupación en clústeres k-means++.

Agregue lo siguiente después de cargar los datos:

C#

string featuresColumnName = "Features";


var pipeline = [Link]
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth",
"PetalLength", "PetalWidth")
.Append([Link](featuresColumnName,
numberOfClusters: 3));

En el código se especifica que el conjunto de datos se debe dividir en tres clústeres.

Entrenar el modelo
Los pasos que se agregaron en las secciones anteriores prepararon la canalización para
el aprendizaje, pero no se ha ejecutado ninguno. Agregue la siguiente línea al final del
archivo para realizar la carga de datos y el entrenamiento del modelo:

C#

var model = [Link](dataView);

Guardado del modelo


En este punto, tiene un modelo que se puede integrar en cualquiera de las aplicaciones
de .NET nuevas o existentes. Para guardar el modelo en un archivo .zip, agregue el
código siguiente debajo de la llamada al método Fit :

C#

using (var fileStream = new FileStream(_modelPath, [Link],


[Link], [Link]))
{
[Link](model, [Link], fileStream);
}
Usar el modelo para las predicciones
Para realizar predicciones, use la clase PredictionEngine<TSrc,TDst>, que toma
instancias del tipo de entrada a través de la canalización de transformador y genera
instancias del tipo de salida. Agregue la línea siguiente para crear una instancia de esa
clase:

C#

var predictor = [Link]<IrisData,


ClusterPrediction>(model);

PredictionEngine es una API de conveniencia, que le permite realizar una predicción en


una única instancia de datos. PredictionEngine no es seguro para subprocesos. Es
aceptable usarlo en entornos de un solo subproceso o prototipo. Para mejorar el
rendimiento y la seguridad para subprocesos en entornos de producción, use el servicio
PredictionEnginePool , que crea un ObjectPool de objetos de PredictionEngine para su
uso en toda la aplicación. Consulte esta guía sobre cómo usar PredictionEnginePool en
una API web de [Link] Core.

7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

Cree la clase TestIrisData para guardar las instancias de datos de prueba:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, a


continuación, seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

3. Modifique la clase para que sea estática, como en el ejemplo siguiente:

C#

static class TestIrisData

En este tutorial se presenta una instancia de datos de iris dentro de esta clase. Puede
agregar otros escenarios para experimentar con el modelo. Agregue el código siguiente
a la clase TestIrisData :

C#

internal static readonly IrisData Setosa = new IrisData


{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};

Para determinar a qué clúster pertenece el elemento especificado, vuelva al archivo


[Link] y agregue el código siguiente al final:

C#

var prediction = [Link]([Link]);


[Link]($"Cluster: {[Link]}");
[Link]($"Distances: {[Link](" ", [Link] ??
[Link]<float>())}");

Ejecute el programa para ver qué clúster contiene la instancia de datos especificada y
las distancias cuadradas desde esa instancia a los centroides de clúster. Los resultados
deberían ser similares a los indicados a continuación:

text

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

¡Enhorabuena! Ha creado correctamente un modelo de aprendizaje automático para la


agrupación en clústeres de iris y lo ha usado para realizar predicciones. Puede encontrar
el código fuente de este tutorial en el repositorio dotnet/samples de GitHub.

Pasos siguientes
En este tutorial ha aprendido a:

" Entender el problema
" Seleccionar la tarea de aprendizaje automático adecuada
" Preparar los datos
" Cargar y transformar los datos
" Elegir un algoritmo de aprendizaje
" Entrenar el modelo
" Usar el modelo para las predicciones

Visite nuestro repositorio de GitHub para obtener más información y encontrar más
ejemplos.

Repositorio de GitHub de dotnet/machinelearning


Tutorial: Creación de un recomendador
de películas mediante factorización
matricial con [Link]
Artículo • 10/05/2023

Este tutorial muestra cómo compilar una recomendación de películas con [Link] en
una consola de aplicación de .NET Core. Los pasos utilizan C# y Visual Studio 2019.

En este tutorial aprenderá a:

" Seleccionar un algoritmo de Machine Learning


" Preparar y cargar los datos
" Compilar y entrenar un modelo
" Evaluar un modelo
" Implementar y consumir un modelo

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Flujo de trabajo del aprendizaje automático


Usará los pasos siguientes para realizar la tarea, así como cualquier otra tarea de
[Link]:

1. Cargar los datos


2. Compilar y entrenar el modelo
3. Evaluar el modelo
4. Usar el modelo

Requisitos previos
Visual Studio 2022 .

Seleccionar la tarea de aprendizaje automático


adecuada
Hay varias maneras de enfocar los problemas vinculados a las recomendaciones, como
recomendar una lista de películas o recomendar una lista de productos relacionados. En
este caso, predecirá qué clasificación (de 1 a 5) asignará un usuario a una película
concreta y recomendará esa película si es superior a un umbral definido (cuanto mayor
sea la clasificación, más probable será que a un usuario le guste una película concreta).

Creación de una aplicación de consola

Crear un proyecto
1. Cree una aplicación de consola en C# llamada "MovieRecommender". Haga clic en
el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Cree un directorio denominado Datos en el proyecto para almacenar el conjunto


de datos:

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar>Nueva carpeta. Escriba "Datos" y presione Entrar.

4. Instale los paquetes NuGet [Link] y [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Administrar paquetes NuGet. Elija "[Link]" como origen del
paquete, seleccione la pestaña Examinar, busque [Link], seleccione el
paquete en la lista y seleccione el botón Instalar. Seleccione el botón Aceptar en el
cuadro de diálogo Vista previa de cambios y, a continuación, seleccione el botón
Acepto del cuadro de diálogo Aceptación de la licencia en caso de que esté de
acuerdo con los términos de licencia de los paquetes mostrados. Repita estos
pasos para [Link].

5. Agregue las instrucciones using siguientes en la parte superior del archivo


[Link]:

C#

using [Link];
using [Link];
using MovieRecommendation;
Descarga de los datos
1. Descargue los dos conjuntos de datos y guárdelos en la carpeta Datos que creó
anteriormente:

Haga clic con el botón derecho en [Link] y


seleccione "Save Link (or Target) As…" ("Guardar vínculo (o destino) como…").

Haga clic con el botón derecho en [Link] y


seleccione "Save Link (or Target) As…" ("Guardar vínculo (o destino) como…").

Asegúrese de guardar los archivos *.csv en la carpeta Datos. Si los guarda en


otro lugar, recuerde que debe mover los archivos *.csv a la carpeta Datos.

2. En el Explorador de soluciones, haga clic con el botón derecho en cada uno de los
archivos *.csv y seleccione Propiedades. En Avanzadas, cambie el valor de Copiar
en el directorio de salida por Copiar si es posterior.

Carga de los datos


El primer paso en el proceso de [Link] consiste en preparar y cargar los datos de
entrenamiento y prueba del modelo.
Los datos de las clasificaciones de recomendación se dividen en conjuntos de datos
Train y Test . Los datos Train se usan para ajustar el modelo, mientras que los datos
Test sirven para realizar predicciones con el modelo entrenado y evaluar el rendimiento

del modelo. Los datos Train y Test suelen dividirse con una proporción de 80/20.

A continuación se muestra una vista previa de los datos de los archivos *.csv:

En los archivos *.csv, hay cuatro columnas:

userId

movieId
rating

timestamp

En Machine Learning, las columnas que se usan para realizar una predicción se
denominan Features (Características), mientras que la columna con la predicción
devuelta recibe el nombre de Label (Etiqueta).

En su caso, quiere predecir clasificaciones de películas, por lo que la columna de


clasificación es Label . Las otras tres columnas ( userId , movieId y timestamp ) son
Features que se usan para predecir la Label .

Características Etiqueta

userId rating

movieId

timestamp

Usted decide qué Features se usan para predecir la Label . También puede usar
métodos como la importancia de la característica de permutación para ayudar a
seleccionar las mejores Features .

En este caso, debe eliminar la columna timestamp como Feature porque la marca de
tiempo no afecta realmente a la manera en que un usuario clasifica una película
determinada y, por tanto, no contribuye a realizar una predicción más exacta:

Características Etiqueta

userId rating

movieId

Después, debe definir la estructura de datos para la clase de entrada.

Agregue una nueva clase a su proyecto:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar > Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

Se abre el archivo [Link] en el editor de código. Agregue la siguiente


instrucción using a la parte superior de [Link]:

C#

using [Link];

Cree una clase denominada MovieRating . Para ello, quite la definición de clase existente
y agregue el siguiente código en [Link]:

C#

public class MovieRating


{
[LoadColumn(0)]
public float userId;
[LoadColumn(1)]
public float movieId;
[LoadColumn(2)]
public float Label;
}
MovieRating especifica una clase de datos de entrada. El atributo LoadColumn especifica

qué columnas (por índice de columna) del conjunto de datos se deben cargar. Las
columnas userId y movieId son las Features (las entradas que proporcionará al modelo
para predecir la Label ), y la columna de clasificación es la Label que predecirá (la salida
del modelo).

Cree otra clase ( MovieRatingPrediction ) para representar los resultados predichos. Para
ello, agregue el código siguiente después de la clase MovieRating en
[Link]:

C#

public class MovieRatingPrediction


{
public float Label;
public float Score;
}

En [Link], reemplace [Link]("Hello World!") por el código siguiente:

C#

MLContext mlContext = new MLContext();

La clase MLContext es un punto de partida para todas las operaciones de [Link]. Al


inicializar mlContext , se crea un entorno de [Link] que se puede compartir entre los
objetos del flujo de trabajo de creación de modelos. Como concepto, se parece a
DBContext en Entity Framework.

En la parte inferior del archivo, cree un método llamado LoadData() :

C#

(IDataView training, IDataView test) LoadData(MLContext mlContext)


{

7 Nota

Este método generará un error hasta que agregue una instrucción return en los
pasos siguientes.
Inicialice las variables de ruta de acceso de datos, cargue los datos de los archivos *.csv
y devuelva los datos Train y Test como objetos IDataView . Para ello, agregue lo que se
indica a continuación como la siguiente línea de código en LoadData() :

C#

var trainingDataPath = [Link]([Link], "Data",


"[Link]");
var testDataPath = [Link]([Link], "Data",
"[Link]");

IDataView trainingDataView = [Link]<MovieRating>


(trainingDataPath, hasHeader: true, separatorChar: ',');
IDataView testDataView = [Link]<MovieRating>
(testDataPath, hasHeader: true, separatorChar: ',');

return (trainingDataView, testDataView);

Los datos de [Link] se representan como una interfaz IDataView. IDataView es una
manera flexible y eficiente de describir datos tabulares (numéricos y de texto). Los datos
se pueden cargar desde un archivo de texto o en tiempo real (por ejemplo, archivos de
registro o base de datos SQL) en un objeto IDataView .

LoadFromTextFile() define el esquema de datos y lee en el archivo. Toma las variables de


ruta de acceso de datos y devuelve IDataView . En este caso, usted proporciona la ruta
de acceso a los archivos Test y Train e indica el encabezado del archivo de texto (para
que pueda usar correctamente los nombres de columna) y el separador de datos de
caracteres de coma (el separador predeterminado es el tabulador).

Agregue el siguiente código para llamar al método LoadData() y devolver los datos de
Train y Test :

C#

(IDataView trainingDataView, IDataView testDataView) = LoadData(mlContext);

Compilación y entrenamiento del modelo


Cree el método BuildAndTrainModel() , justo después del método LoadData() , mediante
el código siguiente:

C#
ITransformer BuildAndTrainModel(MLContext mlContext, IDataView
trainingDataView)
{

7 Nota

Este método generará un error hasta que agregue una instrucción return en los
pasos siguientes.

Defina las transformaciones de datos mediante la adición del código siguiente a


BuildAndTrainModel() :

C#

IEstimator<ITransformer> estimator =
[Link](outputColumnName:
"userIdEncoded", inputColumnName: "userId")
.Append([Link](outputColumnName:
"movieIdEncoded", inputColumnName: "movieId"));

Puesto que userId y movieId representan usuarios y títulos de películas, en lugar de


valores reales, debe usar el método MapValueToKey() para transformar cada userId y
movieId en una columna Feature de tipo de clave numérica (un formato que aceptan

los algoritmos de recomendación) y agregarlos como nuevas columnas del conjunto de


datos:

userId movieId Etiqueta userIdEncoded movieIdEncoded

1 1 4 userKey1 movieKey1

1 3 4 userKey1 movieKey2

1 6 4 userKey1 movieKey3

Elija el algoritmo de Machine Learning y anéxelo a las definiciones de transformación de


datos. Para ello, agregue lo que se indica a continuación como la siguiente línea de
código en BuildAndTrainModel() :

C#

var options = new [Link]


{
MatrixColumnIndexColumnName = "userIdEncoded",
MatrixRowIndexColumnName = "movieIdEncoded",
LabelColumnName = "Label",
NumberOfIterations = 20,
ApproximationRank = 100
};

var trainerEstimator =
[Link]([Link]().[Link](opt
ions));

MatrixFactorizationTrainer es el algoritmo de entrenamiento de recomendación. La


factorización matricial es una manera común de enfocar la recomendación cuando se
dispone de datos que muestran cómo los usuarios clasificaron anteriormente los
productos, que es el caso de los conjuntos de datos de este tutorial. Existen otros
algoritmos de recomendación para cuando se dispone de datos diferentes (vea más
adelante la sección Otros algoritmos de recomendación para obtener más información).

En este caso, el algoritmo Matrix Factorization usa un método denominado "filtrado


de colaboración", que presupone que si el Usuario 1 tiene la misma opinión que el
Usuario 2 en un tema determinado, lo más probable es que el Usuario 1 piense lo
mismo que el Usuario 2 sobre otro tema.

Por ejemplo, si el Usuario 1 y el Usuario 2 clasifican las películas de forma similar, lo más
probable es que el Usuario 2 disfrute de una película que el Usuario 1 ha visto y ha
clasificado con una puntuación alta:

Incredibles 2 (2018) The Avengers (2012) Guardians of the Galaxy


(2014)

Usuario 1 Ha visto la película y le Ha visto la película y le Ha visto la película y le ha


ha gustado ha gustado gustado

Usuario 2 Ha visto la película y le Ha visto la película y le No ha visto la película.


ha gustado ha gustado RECOMENDARLA

El instructor Matrix Factorization tiene varias opciones, sobre las que puede
informarse más adelante en la sección Hiperparámetros de algoritmo.

Ajuste el modelo a los datos Train y devuelva el modelo entrenado. Para ello, agregue
lo que se indica a continuación como la siguiente línea de código en el método
BuildAndTrainModel() :

C#
[Link]("=============== Training the model ===============");
ITransformer model = [Link](trainingDataView);

return model;

El método Fit() entrena el modelo con el conjunto de datos de entrenamiento


proporcionado. Técnicamente, ejecuta las definiciones de Estimator , para lo que
transforma los datos y aplica el entrenamiento, y devuelve el modelo entrenado, que es
un Transformer .

Para obtener más información sobre el flujo de trabajo de entrenamiento de modelos


en [Link], vea ¿Qué es [Link] y cómo funciona?.

Agregue lo que se indica a continuación como la siguiente línea de código debajo del
método LoadData() para llamar al método BuildAndTrainModel() y devolver el modelo
entrenado:

C#

ITransformer model = BuildAndTrainModel(mlContext, trainingDataView);

Evaluación del modelo


Una vez que haya entrenado el modelo, use los datos de prueba para evaluar el
rendimiento del modelo.

Cree el método EvaluateModel() , justo después del método BuildAndTrainModel() ,


mediante el código siguiente:

C#

void EvaluateModel(MLContext mlContext, IDataView testDataView, ITransformer


model)
{

Transforme los datos Test mediante la adición del código siguiente a EvaluateModel() :

C#

[Link]("=============== Evaluating the model ===============");


var prediction = [Link](testDataView);
El método Transform() realiza predicciones para varias filas de entrada proporcionadas
de un conjunto de datos de prueba.

Para evaluar el modelo, agregue lo que se indica a continuación como la siguiente línea
de código en el método EvaluateModel() :

C#

var metrics = [Link](prediction, labelColumnName:


"Label", scoreColumnName: "Score");

Una vez que se ha establecido la predicción, el método Evaluate() valora el modelo, que
compara los valores predichos con las Labels reales del conjunto de datos de prueba y
devuelve métricas sobre el rendimiento del modelo.

Imprima las métricas de evaluación en la consola. Para ello, agregue lo que se indica a
continuación como la siguiente línea de código en el método EvaluateModel() :

C#

[Link]("Root Mean Squared Error : " +


[Link]());
[Link]("RSquared: " + [Link]());

Agregue lo que se indica a continuación como la siguiente línea de código debajo del
método BuildAndTrainModel() para llamar al método EvaluateModel() :

C#

EvaluateModel(mlContext, testDataView, model);

Por el momento, la salida debe ser similar a la del texto siguiente:

Consola

=============== Training the model ===============


iter tr_rmse obj
0 1.5403 3.1262e+05
1 0.9221 1.6030e+05
2 0.8687 1.5046e+05
3 0.8416 1.4584e+05
4 0.8142 1.4209e+05
5 0.7849 1.3907e+05
6 0.7544 1.3594e+05
7 0.7266 1.3361e+05
8 0.6987 1.3110e+05
9 0.6751 1.2948e+05
10 0.6530 1.2766e+05
11 0.6350 1.2644e+05
12 0.6197 1.2541e+05
13 0.6067 1.2470e+05
14 0.5953 1.2382e+05
15 0.5871 1.2342e+05
16 0.5781 1.2279e+05
17 0.5713 1.2240e+05
18 0.5660 1.2230e+05
19 0.5592 1.2179e+05
=============== Evaluating the model ===============
Rms: 0.994051469730769
RSquared: 0.412556298844873

En esta salida, hay 20 iteraciones. En cada iteración, la medida de error disminuye y


converge cada vez más hacia 0.

El valor root of mean squared error (RMS o RMSE) se usa para medir las diferencias
entre los valores previstos por un modelo y los valores observados en un conjunto de
datos de prueba. Técnicamente, es la raíz cuadrada de la media de los cuadrados de los
errores. Cuanto menor sea su valor, mejor será el modelo.

R Squared indica en qué grado los datos se ajustan a un modelo. Va de 0 a 1. Un valor

de 0 significa que los datos son aleatorios o no pueden ajustarse al modelo. Un valor de
1 significa que el modelo coincide exactamente con los datos. Le interesa que la
puntuación de R Squared esté lo más cerca posible de 1.

La creación de modelos correctos es un proceso iterativo. Este modelo tiene una calidad
inicial más baja, ya que el tutorial utiliza pequeños conjuntos de datos para
proporcionar un entrenamiento rápido del modelo. Si no está satisfecho con la calidad
del modelo, puede intentar mejorarlo proporcionando conjuntos de datos de
entrenamiento más grandes o eligiendo algoritmos de entrenamiento distintos con
diferentes hiperparámetros para cada algoritmo. Para más información, revise la sección
Mejora del modelo a continuación.

Uso del modelo


Ahora puede usar el modelo entrenado para realizar predicciones sobre datos nuevos.

Cree el método UseModelForSinglePrediction() , justo después del método


EvaluateModel() , mediante el código siguiente:

C#
void UseModelForSinglePrediction(MLContext mlContext, ITransformer model)
{

Use PredictionEngine para predecir la clasificación. Para ello, agregue el código


siguiente a UseModelForSinglePrediction() :

C#

[Link]("=============== Making a prediction ===============");


var predictionEngine = [Link]<MovieRating,
MovieRatingPrediction>(model);

PredictionEngine es una API de conveniencia, que le permite realizar una predicción en


una única instancia de datos. PredictionEngine no es seguro para subprocesos. Es
aceptable usarlo en entornos de un solo subproceso o prototipo. Para mejorar el
rendimiento y la seguridad para subprocesos en entornos de producción, use el servicio
PredictionEnginePool , que crea un ObjectPool de objetos de PredictionEngine para su

uso en toda la aplicación. Consulte esta guía sobre cómo usar PredictionEnginePool en
una API web de [Link] Core.

7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

Cree una instancia de MovieRating denominada testInput y pásela al motor de


predicción. Para ello, agregue lo que se indica a continuación como las siguientes líneas
de código en el método UseModelForSinglePrediction() :

C#

var testInput = new MovieRating { userId = 6, movieId = 10 };

var movieRatingPrediction = [Link](testInput);

La función Predict() realiza una predicción en una sola columna de datos.

Después, puede usar Score , o la clasificación predicha, para determinar si quiere


recomendar la película con el movieId 10 al usuario 6. Cuanto más alto sea Score , más
probable será que a un usuario le guste una película concreta. En este caso,
supongamos que recomienda películas con una clasificación predicha superior a 3,5.

Para imprimir los resultados, agregue lo que se indica a continuación como las
siguientes líneas de código en el método UseModelForSinglePrediction() :

C#

if ([Link]([Link], 1) > 3.5)


{
[Link]("Movie " + [Link] + " is recommended for
user " + [Link]);
}
else
{
[Link]("Movie " + [Link] + " is not recommended
for user " + [Link]);
}

Agregue lo que se indica a continuación como siguiente línea de código después de la


llamada al método EvaluateModel() para llamar al método
UseModelForSinglePrediction() :

C#

UseModelForSinglePrediction(mlContext, model);

La salida de este método debe ser similar a la del texto siguiente:

Consola

=============== Making a prediction ===============


Movie 10 is recommended for user 6

Guardado del modelo


Para usar el modelo con el objeto de realizar predicciones en aplicaciones de usuario
final, primero debe guardarlo.

Cree el método SaveModel() , justo después del método UseModelForSinglePrediction() ,


mediante el código siguiente:

C#
void SaveModel(MLContext mlContext, DataViewSchema trainingDataViewSchema,
ITransformer model)
{

Para guardar el modelo entrenado, agregue el código siguiente en el método


SaveModel() :

C#

var modelPath = [Link]([Link], "Data",


"[Link]");

[Link]("=============== Saving the model to a file


===============");
[Link](model, trainingDataViewSchema, modelPath);

Este método guarda el modelo entrenado en un archivo .zip (en la carpeta "Datos"), que
puede usarse después en otras aplicaciones .NET para realizar predicciones.

Agregue lo que se indica a continuación como siguiente línea de código después de la


llamada al método UseModelForSinglePrediction() para llamar al método SaveModel() :

C#

SaveModel(mlContext, [Link], model);

Uso del modelo guardado


Una vez que haya guardado el modelo entrenado, puede usarlo en entornos diferentes.
Consulte Guardar y cargar modelos entrenados para obtener información sobre cómo
poner en marcha un modelo de aprendizaje automático entrenado en aplicaciones.

Resultados
Después de seguir los pasos anteriores, ejecute la aplicación de consola (CTRL + F5). Los
resultados de la predicción anterior deben ser similares a lo que se indica a
continuación. Es posible que vea advertencias o mensajes de procesamiento, si bien se
han quitado de los resultados siguientes para mayor claridad.

Consola
=============== Training the model ===============
iter tr_rmse obj
0 1.5382 3.1213e+05
1 0.9223 1.6051e+05
2 0.8691 1.5050e+05
3 0.8413 1.4576e+05
4 0.8145 1.4208e+05
5 0.7848 1.3895e+05
6 0.7552 1.3613e+05
7 0.7259 1.3357e+05
8 0.6987 1.3121e+05
9 0.6747 1.2949e+05
10 0.6533 1.2766e+05
11 0.6353 1.2636e+05
12 0.6209 1.2561e+05
13 0.6072 1.2462e+05
14 0.5965 1.2394e+05
15 0.5868 1.2352e+05
16 0.5782 1.2279e+05
17 0.5713 1.2227e+05
18 0.5637 1.2190e+05
19 0.5604 1.2178e+05
=============== Evaluating the model ===============
Rms: 0.977175077487166
RSquared: 0.43233349213192
=============== Making a prediction ===============
Movie 10 is recommended for user 6
=============== Saving the model to a file ===============

¡Enhorabuena! Ha compilado correctamente un modelo de Machine Learning para la


recomendación de películas. Puede encontrar el código fuente para este tutorial en el
repositorio dotnet/samples .

Mejora del código


Hay varias maneras de mejorar el rendimiento del modelo para obtener predicciones
más precisas.

Datos
El hecho de agregar más datos de entrenamiento con suficientes ejemplos para cada
usuario e identificador de película puede ayudar a mejorar la calidad del modelo de
recomendación.

La validación cruzada es una técnica para evaluar modelos que divide aleatoriamente los
datos en subconjuntos (en lugar de extraer datos de prueba del conjunto de datos,
como ha hecho en este tutorial) y toma algunos grupos como datos de entrenamiento y
otros como datos de prueba. Este método supera en lo que respecta a la calidad del
modelo la división en entrenamiento/prueba.

Características
En este tutorial, solo ha usado las tres Features ( user id , movie id y rating ) que
proporciona el conjunto de datos.

Aunque es un buen comienzo, tal vez le interese agregar otros atributos o Features
(por ejemplo, edad, sexo, ubicación geográfica, etc.) si se incluyen en el conjunto de
datos. El hecho de agregar Features más pertinentes puede ayudar a mejorar el
rendimiento del modelo de recomendación.

Si no está seguro de qué Features pueden ser más pertinentes para la tarea de
aprendizaje automático, puede usar el Cálculo de la contribución de las características
(FCC) y la importancia de la característica de permutación, que proporciona [Link] para
descubrir las Features más influyentes.

Hiperparámetros de algoritmo
Aunque [Link] proporciona algoritmos de entrenamiento predeterminados de calidad,
puede ajustar aún más el rendimiento si cambia los hiperparámetros del algoritmo.

Para Matrix Factorization , puede experimentar con hiperparámetros como


NumberOfIterations y ApproximationRank para ver si así obtiene mejores resultados.

Por ejemplo, en este tutorial, las opciones de algoritmo son las siguientes:

C#

var options = new [Link]


{
MatrixColumnIndexColumnName = "userIdEncoded",
MatrixRowIndexColumnName = "movieIdEncoded",
LabelColumnName = "Label",
NumberOfIterations = 20,
ApproximationRank = 100
};

Otros algoritmos de recomendación


El algoritmo de factorización matricial con filtrado de colaboración es solo un enfoque
para realizar recomendaciones de películas. En muchos casos, es posible que no tenga a
su disposición los datos de las clasificaciones y que solo cuente con el historial de
películas de los usuarios. En otros casos, podría disponer de más datos que la
clasificación del usuario.

Algoritmo Escenario Ejemplo

Factorización Úselo cuando solo tenga los valores userId y movieId. Este tipo >Probarlo
matricial de de recomendación se basa en el escenario de compra conjunta,
una clase es decir, en los productos que se suelen comprar juntos. Esto
significa que se recomendará a los clientes un conjunto de
productos en función de su propio historial de pedidos de
compra.

Máquinas de Úselo para realizar recomendaciones cuando disponga de más >Probarlo


factorización características que userId, productId y la clasificación (por
con ejemplo, la descripción o el precio del producto). Este método
reconocimiento también usa un enfoque de filtrado de colaboración.
de campo

Escenario de nuevo usuario


Un problema común en el filtrado de colaboración es el "arranque en frío", que es
cuando tiene un nuevo usuario sin ningún dato anterior a partir del cual pueda realizar
inferencias. Por lo general, para solucionarlo se les pide a los nuevos usuarios que creen
un perfil y, por ejemplo, clasifiquen películas que ya han visto. Aunque este método
supone una relativa carga para el usuario, proporciona algunos datos iniciales para los
usuarios nuevos que carecen de historial de clasificaciones.

Recursos
Los datos que se han usado en este tutorial se han tomado del conjunto de datos
MovieLens .

Pasos siguientes
En este tutorial ha aprendido a:

" Seleccionar un algoritmo de Machine Learning


" Preparar y cargar los datos
" Compilar y entrenar un modelo
" Evaluar un modelo
" Implementar y consumir un modelo
Siga con el siguiente tutorial para obtener más información

Análisis de sentimiento
Tutorial: Inspección visual automatizada
mediante el aprendizaje de
transferencia con la API Image
Classification de [Link]
Artículo • 09/05/2023

Obtenga información sobre cómo entrenar un modelo de aprendizaje profundo


personalizado mediante el aprendizaje de transferencia, un modelo TensorFlow
previamente entrenado y la API Image Classification de [Link] para clasificar las
imágenes de superficies de hormigón como con grietas o sin grietas.

En este tutorial aprenderá a:

" Entender el problema
" Obtener información sobre la API Image Classification de [Link]
" Comprender el modelo entrenado previamente
" Usar el aprendizaje de transferencia para entrenar un modelo de clasificación de
imágenes de TensorFlow personalizado
" Clasificar imágenes con el modelo personalizado

Requisitos previos
Visual Studio 2022 .

Información general del ejemplo de


transferencia de aprendizaje de clasificación de
imágenes
Este ejemplo es una aplicación de consola de .NET Core de C# que clasifica imágenes
mediante un modelo TensorFlow de aprendizaje profundo entrenado previamente. El
código de este ejemplo se puede encontrar en el explorador ed ejemplos.

Entender el problema
La clasificación de imágenes es un problema de visión informática. La clasificación de
imágenes toma una imagen como entrada y la categoriza en una clase prescrita. Los
modelos de clasificación de imágenes se entrenan normalmente mediante el
aprendizaje profundo y las redes neuronales. Consulte Aprendizaje profundo frente a
aprendizaje automático para obtener más información.

A continuación se muestran algunos escenarios en los que la clasificación de imágenes


es útil:

Reconocimiento facial
Detección de emociones
Diagnóstico médico
Detección de puntos de referencia

En este tutorial se entrena un modelo de clasificación de imágenes personalizado para


realizar una inspección visual automatizada de los tableros de puente con el fin de
identificar las estructuras dañadas por las grietas.

API Image Classification de [Link]


[Link] proporciona varias formas de realizar la clasificación de imágenes. En este
tutorial se aplica el aprendizaje de transferencia mediante la API Image Classification. La
API Image Classification utiliza [Link] , una biblioteca de bajo nivel que
proporciona enlaces de C# para la API C++ de TensorFlow.

¿Qué es el aprendizaje de transferencia?


El aprendizaje de transferencia aplica los conocimientos obtenidos de la resolución de
un problema a otro problema relacionado.

Entrenar un modelo de aprendizaje profundo desde cero requiere establecer varios


parámetros, una enorme cantidad de datos de entrenamiento etiquetados y una gran
cantidad de recursos informáticos (cientos de horas de GPU). El uso de un modelo
entrenado previamente, junto con el aprendizaje de transferencia, permite acceso
directo al proceso de entrenamiento.

Proceso de entrenamiento
La API Image Classification inicia el proceso de entrenamiento mediante la carga de un
modelo TensorFlow previamente entrenado. El proceso de entrenamiento consta de dos
pasos:

1. Fase de cuello de botella


2. Fase de entrenamiento

Fase de cuello de botella


Durante la fase de cuello de botella, se carga el conjunto de imágenes de aprendizaje y
los valores de píxeles se usan como entrada, o características, para las capas
inmovilizadas del modelo previamente entrenado. Las capas inmovilizadas incluyen
todas las capas de la red neuronal hasta la penúltima capa, que se conoce como capa
de cuello de botella. Estas capas se denominan inmovilizadas porque en ellas no se
producirá ningún aprendizaje y las operaciones son de paso a través. En estas capas
inmovilizadas es donde se calculan los patrones de nivel inferior que ayudan a un
modelo a diferenciar entre las distintas clases. Cuanto mayor sea el número de capas,
más intensiva a nivel de computación será este paso. Afortunadamente, puesto que se
trata de un cálculo que se realiza una sola vez, los resultados se pueden almacenar en
caché y usar en ejecuciones posteriores cuando se experimente con parámetros
distintos.

Fase de entrenamiento
Una vez calculados los valores de salida de la fase de cuello de botella, se usan como
entrada para volver a entrenar la capa final del modelo. Este proceso es iterativo y se
ejecuta durante el número de veces que especifican los parámetros del modelo. Durante
cada ejecución, se evalúan la pérdida y la precisión. Después, se realizan los ajustes
adecuados para mejorar el modelo con el objetivo de minimizar la pérdida y maximizar
la precisión. Una vez finalizado el entrenamiento, se generan dos formatos del modelo.
Uno de ellos es la versión .pb del modelo y el otro es la versión serializada de [Link]
.zip . Cuando se trabaja en entornos compatibles con [Link], se recomienda usar la

versión .zip del modelo. Sin embargo, en entornos en los que no se admite [Link], se
tiene la opción de usar la versión .pb .

Descripción del modelo entrenado previamente


El modelo previamente entrenado que se usa en este tutorial es la variante de capa 101
del modelo de Residual Network v2 (ResNet). El modelo original se ha entrenado para
clasificar las imágenes en mil categorías. El modelo toma como entrada una imagen de
tamaño 224 x 224 y genera las probabilidades de clase para cada una de las clases en
las que se ha entrenado. Parte de este modelo se usa para entrenar un nuevo modelo
mediante imágenes personalizadas con el fin de realizar predicciones entre dos clases.

Creación de una aplicación de consola


Ahora que tiene conocimientos generales del aprendizaje de transferencia y de la API
Image Classification, es momento de compilar la aplicación.

1. Cree una aplicación de consola en C# llamada


"DeepLearning_ImageClassification_Binary". Haga clic en el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

a. En el Explorador de soluciones, haga clic con el botón derecho en Administrar


paquetes NuGet.
b. Elija "[Link]" como origen del paquete.
c. Seleccione la pestaña Examinar.
d. Active la casilla Incluir versión preliminar.
e. Busque [Link].
f. Seleccione el botón Instalar.
g. Seleccione el botón Aceptar en el cuadro de diálogo Vista previa de cambios y,
a continuación, seleccione el botón Acepto del cuadro de diálogo Aceptación
de la licencia en caso de que esté de acuerdo con los términos de licencia de
los paquetes mostrados.
h. Repita estos pasos para los paquetes [Link],
[Link] versión 2.3.1 y [Link].

Preparar y entender los datos

7 Nota

Los conjuntos de valores de este tutorial están tomados del documento


"SDNET2018: A concrete crack image dataset for machine learning applications"
(2018) (SDNET2018: Un conjunto de datos de imágenes de hormigón descifradas
para aplicaciones de aprendizaje automático) de Marc Maguire, Sattar Dorafshan y
Robert J. Thomas. Examinar todos los conjuntos de datos. Documento 48.
[Link]

SDNET2018 es un conjunto de datos de imágenes que contiene anotaciones para


estructuras de hormigón con grietas y sin grietas (tableros de puente, muros y
pavimento).

Los datos se organizan en tres subdirectorios:

D contiene imágenes de tableros de puente


P contiene imágenes de pavimentos
W contiene imágenes de muros

Cada uno de estos subdirectorios contiene a su vez dos subdirectorios adicionales con
prefijos:
C es el prefijo usado para las superficies con grietas.
U es el prefijo usado para las superficies sin grietas.

En este tutorial, solo se usan imágenes de tableros de puente.

1. Descargue el conjunto de datos y descomprímalo.


2. Cree un directorio llamado "recursos" en el proyecto para guardar los archivos del
conjunto de datos.
3. Copie los subdirectorios CD y UD del directorio descomprimido recientemente en
el directorio recursos.

Creación de las clases de entrada y salida


1. Abra el archivo [Link] y reemplace las instrucciones using existentes en la
parte superior del archivo por las siguientes:

C#

using System;
using [Link];
using [Link];
using [Link];
using [Link];
using static [Link];
using [Link];

2. Debajo de la clase Program en [Link], cree una clase llamada ImageData . Esta
clase se utiliza para representar los datos cargados inicialmente.

C#

class ImageData
{
public string ImagePath { get; set; }

public string Label { get; set; }


}

ImageData contiene las propiedades siguientes:

ImagePath es la ruta de acceso completa donde se almacena la imagen.

Label es la categoría a la que pertenece la imagen. Este es el valor que se va

a predecir.

3. Cree clases para los datos de entrada y salida.


a. Debajo de la clase ImageData , defina el esquema de los datos de entrada en una
nueva clase llamada ModelInput .

C#

class ModelInput
{
public byte[] Image { get; set; }

public UInt32 LabelAsKey { get; set; }

public string ImagePath { get; set; }

public string Label { get; set; }


}

ModelInput contiene las propiedades siguientes:

Image es la representación byte[] de la imagen. El modelo espera que los


datos de la imagen sean de este tipo para el entrenamiento.
LabelAsKey es la representación numérica de Label .
ImagePath es la ruta de acceso completa donde se almacena la imagen.

Label es la categoría a la que pertenece la imagen. Este es el valor que se

va a predecir.

Solo se usan Image y LabelAsKey para entrenar el modelo y hacer predicciones.


Las propiedades ImagePath y Label se conservan por comodidad para tener
acceso al nombre y categoría del archivo de imagen original.

b. Después, debajo de la clase ModelInput , defina el esquema de los datos de


salida en una nueva clase llamada ModelOutput .

C#

class ModelOutput
{
public string ImagePath { get; set; }

public string Label { get; set; }

public string PredictedLabel { get; set; }


}

ModelOutput contiene las propiedades siguientes:

ImagePath es la ruta de acceso completa donde se almacena la imagen.


Label es la categoría original a la que pertenece la imagen. Este es el valor

que se va a predecir.
PredictedLabel es el valor que predice el modelo.

De forma similar a ModelInput , solo se requiere PredictedLabel para realizar


predicciones, ya que contiene la predicción que realiza el modelo. Las
propiedades ImagePath y Label se conservan por comodidad para tener acceso
al nombre y categoría del archivo de imagen original.

Creación del directorio del área de trabajo


Cuando los datos de entrenamiento y validación no cambian a menudo, se recomienda
almacenar en caché los valores de cuello de botella calculados para las ejecuciones
posteriores.

1. En el proyecto, cree un directorio llamado workspace para almacenar los valores de


cuello de botella calculados y la versión .pb del modelo.

Definición de rutas de acceso e inicialización de variables


1. Debajo de las instrucciones using, defina la ubicación de los recursos, los valores
de cuello de botella calculados y la versión .pb del modelo.

C#

var projectDirectory =
[Link]([Link]([Link], "../../../"));
var workspaceRelativePath = [Link](projectDirectory,
"workspace");
var assetsRelativePath = [Link](projectDirectory, "assets");

2. Inicialice la variable mlContext con una instancia nueva de MLContext.

C#

MLContext mlContext = new MLContext();

La clase MLContext es un punto de partida para todas las operaciones de [Link].


Al inicializar mlContext se crea un entorno de [Link] que se puede compartir
entre los objetos del flujo de trabajo de creación de modelos. Como concepto, se
parece a DbContext en Entity Framework.
Carga de los datos

Creación de un método de utilidad de carga de datos


Las imágenes se almacenan en dos subdirectorios. Antes de cargar los datos, se debe
dar formato a una lista de objetos de ImageData . Para ello, llame al método
LoadImagesFromDirectory .

C#

IEnumerable<ImageData> LoadImagesFromDirectory(string folder, bool


useFolderNameAsLabel = true)
{

1. En LoadImagesFromDirectory , agregue el código siguiente para obtener todas las


rutas de acceso de archivo de los subdirectorios:

C#

var files = [Link](folder, "*",


searchOption: [Link]);

2. Luego, recorra en iteración cada uno de los archivos mediante una instrucción
foreach .

C#

foreach (var file in files)


{

3. En la instrucción foreach , compruebe que se admiten las extensiones de archivo.


La API Image Classification admite formatos JPEG y PNG.

C#

if (([Link](file) != ".jpg") && ([Link](file) !=


".png"))
continue;
4. Después, obtenga la etiqueta del archivo. Si el parámetro useFolderNameAsLabel
está establecido en true , el directorio principal donde se guarda el archivo se usa
como etiqueta. De lo contrario, espera que la etiqueta sea un prefijo del nombre
de archivo o el propio nombre de archivo.

C#

var label = [Link](file);

if (useFolderNameAsLabel)
label = [Link](file).Name;
else
{
for (int index = 0; index < [Link]; index++)
{
if (![Link](label[index]))
{
label = [Link](0, index);
break;
}
}
}

5. Por último, cree una nueva instancia de ModelInput .

C#

yield return new ImageData()


{
ImagePath = file,
Label = label
};

Preparar los datos


1. Llame al método de utilidad LoadImagesFromDirectory , para obtener la lista de
imágenes que se usan para el entrenamiento después de la inicialización de la
variable mlContext .

C#

IEnumerable<ImageData> images = LoadImagesFromDirectory(folder:


assetsRelativePath, useFolderNameAsLabel: true);

2. Luego, cargue las imágenes en un elemento IDataView con el método


LoadFromEnumerable.
C#

IDataView imageData = [Link](images);

3. Los datos se cargan en el orden en que se han leído desde los directorios. Para
equilibrar los datos, ordénelos aleatoriamente mediante el método ShuffleRows.

C#

IDataView shuffledData = [Link](imageData);

4. Los modelos de Machine Learning esperan que la entrada esté en formato


numérico. Por lo tanto, es necesario realizar algún procesamiento previo en los
datos antes del entrenamiento. Cree un elemento EstimatorChain formado por las
transformaciones MapValueToKey y LoadRawImageBytes . La transformación
MapValueToKey toma el valor de categoría en la columna Label , lo convierte en un
valor KeyType numérico y lo almacena en una nueva columna llamada LabelAsKey .
LoadImages toma los valores de la columna ImagePath , junto con el parámetro
imageFolder , con el fin de cargar las imágenes para el entrenamiento.

C#

var preprocessingPipeline =
[Link](
inputColumnName: "Label",
outputColumnName: "LabelAsKey")
.Append([Link](
outputColumnName: "Image",
imageFolder: assetsRelativePath,
inputColumnName: "ImagePath"));

5. Use el método Fit para aplicar los datos a preprocessingPipeline EstimatorChain


seguido del método Transform, que devuelve un elemento IDataView que contiene
los datos procesados previamente.

C#

IDataView preProcessedData = preprocessingPipeline


.Fit(shuffledData)
.Transform(shuffledData);

6. Para entrenar un modelo, es importante tener un conjunto de datos de


entrenamiento, así como un conjunto de datos de validación. El modelo se entrena
en el conjunto de entrenamiento. La calidad de las predicciones en los datos no
vistos la mide el rendimiento en el conjunto de validación. En función de los
resultados de ese rendimiento, el modelo realiza ajustes sobre lo que ha aprendido
en un esfuerzo por mejorar. El conjunto de validación puede proceder de dividir el
conjunto de datos original o de otro origen que ya se haya reservado para esta
finalidad. En este caso, el conjunto de datos procesado previamente se divide en
conjuntos de entrenamiento, validación y pruebas.

C#

TrainTestData trainSplit = [Link](data:


preProcessedData, testFraction: 0.3);
TrainTestData validationTestSplit =
[Link]([Link]);

En el ejemplo de código anterior se realizan dos divisiones. En primer lugar, los


datos procesados previamente se dividen y el 70 % de estos se usa para el
entrenamiento, mientras que el 30 % restante se utiliza para la validación. Después,
30 % perteneciente al conjunto de validación se divide en conjuntos de validación
y pruebas, donde el 90 % se usa para la validación y el 10 % se usa para las
pruebas.

Una manera de pensar en la finalidad de estas particiones de datos es hacer un


examen. Al estudiar para un examen, se revisan las notas, libros u otros recursos
para obtener una idea sobre los conceptos que hay que preparar para el examen.
Esto es para lo que sirve el conjunto de entrenamiento. Después, se puede realizar
un examen ficticio para poner a prueba los conocimientos. Aquí es donde el
conjunto de validación es práctico. Se quiere comprobar si se tiene una idea
correcta de los conceptos antes de realizar el examen real. En función de estos
resultados, tome nota de lo que no haya acertado o de lo que no haya entendido
bien e incorpore los cambios a medida que repasa para el examen real. Por último,
realice el examen. Esto es para lo que se usa el conjunto de prueba. Nunca ha visto
las preguntas que aparecen en el examen y ahora puede usar lo que ha aprendido
a partir del entrenamiento y la validación para aplicar sus conocimientos a la tarea
que nos ocupa.

7. Asigne a las particiones sus respectivos valores para los datos de entrenamiento,
validación y prueba.

C#

IDataView trainSet = [Link];


IDataView validationSet = [Link];
IDataView testSet = [Link];
Definición de la canalización de entrenamiento
El entrenamiento del modelo consta de un par de pasos. En primer lugar, se usa la API
Image Classification para entrenar el modelo. Luego, las etiquetas codificadas de la
columna PredictedLabel se convierten de nuevo a su valor de categoría original
mediante la transformación MapKeyToValue .

1. Cree una variable para almacenar un conjunto de parámetros obligatorios y


opcionales para un ImageClassificationTrainer.

C#

var classifierOptions = new [Link]()


{
FeatureColumnName = "Image",
LabelColumnName = "LabelAsKey",
ValidationSet = validationSet,
Arch = [Link].ResnetV2101,
MetricsCallback = (metrics) => [Link](metrics),
TestOnTrainSet = false,
ReuseTrainSetBottleneckCachedValues = true,
ReuseValidationSetBottleneckCachedValues = true
};

ImageClassificationTrainer admite varios parámetros opcionales:

FeatureColumnName es la columna que se utiliza como entrada del modelo.

LabelColumnName es la columna del valor que se va a predecir.

ValidationSet es IDataView que contiene los datos de validación.


Arch define la arquitectura de modelo previamente entrenada que se va a

usar. En este tutorial se usa la variante de capa 101 del modelo ResNetv2.
MetricsCallback enlaza una función para realizar un seguimiento del

progreso durante el entrenamiento.


TestOnTrainSet indica al modelo que mida el rendimiento en el conjunto de
entrenamiento cuando no haya ningún conjunto de validación.
ReuseTrainSetBottleneckCachedValues indica al modelo si se deben usar los
valores almacenados en caché de la fase de cuello de botella en las
ejecuciones posteriores. La fase de cuello de botella es un cálculo de paso a
través único que es intensiva a nivel de computación la primera vez que se
realiza. Si los datos de entrenamiento no cambian y quiere experimentar con
un número distinto de épocas o tamaño de lote, el uso de los valores
almacenados en caché reduce considerablemente la cantidad de tiempo
necesario para entrenar un modelo.
ReuseValidationSetBottleneckCachedValues es parecido a

ReuseTrainSetBottleneckCachedValues solo que, en este caso, se usa para el


conjunto de validación.
WorkspacePath define el directorio donde se almacenan los valores de cuello
de botella calculados y la versión .pb del modelo.

2. Defina la canalización de entrenamiento EstimatorChain que consta de


mapLabelEstimator y ImageClassificationTrainer.

C#

var trainingPipeline =
[Link](classif
ierOptions)

.Append([Link]("PredictedLabel")
);

3. Use el método Fit para entrenar el modelo.

C#

ITransformer trainedModel = [Link](trainSet);

Uso del modelo


Ahora que se ha entrenado el modelo, es el momento de usarlo para clasificar las
imágenes.

Cree un método de utilidad llamado OutputPrediction para mostrar información de


predicción en la consola.

C#

private static void OutputPrediction(ModelOutput prediction)


{
string imageName = [Link]([Link]);
[Link]($"Image: {imageName} | Actual Value:
{[Link]} | Predicted Value: {[Link]}");
}

Clasificación de una sola imagen


1. Cree un método llamado ClassifySingleImage para crear y generar una predicción
de una sola imagen.

C#

void ClassifySingleImage(MLContext mlContext, IDataView data,


ITransformer trainedModel)
{

2. Cree un elemento PredictionEngine en el método ClassifySingleImage .


PredictionEngine es una API de conveniencia, que permite pasar datos y luego
realizar una predicción en una única instancia de datos.

C#

PredictionEngine<ModelInput, ModelOutput> predictionEngine =


[Link]<ModelInput, ModelOutput>
(trainedModel);

3. Para acceder a una única instancia de ModelInput , convierta IDataView de data en


un elemento IEnumerable mediante el método CreateEnumerable y, después,
obtenga la primera observación.

C#

ModelInput image = [Link]<ModelInput>


(data,reuseRowObject:true).First();

4. Use el método Predict para clasificar la imagen.

C#

ModelOutput prediction = [Link](image);

5. Genere la predicción en la consola con el método OutputPrediction .

C#

[Link]("Classifying single image");


OutputPrediction(prediction);
6. Llame a ClassifySingleImage debajo de la llamada al método Fit mediante el
conjunto de prueba de imágenes.

C#

ClassifySingleImage(mlContext, testSet, trainedModel);

Clasificación de varias imágenes


1. Agregue un método nuevo llamado ClassifyImages debajo del método
ClassifySingleImage para realizar y generar varias predicciones de imágenes.

C#

void ClassifyImages(MLContext mlContext, IDataView data, ITransformer


trainedModel)
{

2. Cree un elemento IDataView que contenga las predicciones mediante el método


Transform. Agregue el código siguiente dentro del método ClassifyImages .

C#

IDataView predictionData = [Link](data);

3. Para recorrer en iteración las predicciones, convierta IDataView de predictionData


en un elemento IEnumerable con el método CreateEnumerable y, después,
obtenga las diez primeras observaciones.

C#

IEnumerable<ModelOutput> predictions =
[Link]<ModelOutput>(predictionData,
reuseRowObject: true).Take(10);

4. Recorra en iteración y genere las etiquetas originales y previstas de las


predicciones.

C#

[Link]("Classifying multiple images");


foreach (var prediction in predictions)
{
OutputPrediction(prediction);
}

5. Por último, llame a ClassifyImages debajo del método ClassifySingleImage()


mediante el conjunto de prueba de imágenes.

C#

ClassifyImages(mlContext, testSet, trainedModel);

Ejecutar la aplicación
Ejecute la aplicación de consola. La salida debe ser similar a la siguiente. Es posible que
vea advertencias o mensajes de procesamiento, si bien se han quitado de los resultados
siguientes para mayor claridad. Por motivos de brevedad, la salida se ha resumido.

Fase de cuello de botella

No se imprime ningún valor para el nombre de la imagen porque las imágenes se


cargan como un elemento byte[] y, por lo tanto, no hay ningún nombre de imagen
para mostrar.

test

Phase: Bottleneck Computation, Dataset used: Train, Image Index: 279


Phase: Bottleneck Computation, Dataset used: Train, Image Index: 280
Phase: Bottleneck Computation, Dataset used: Validation, Image Index: 1
Phase: Bottleneck Computation, Dataset used: Validation, Image Index: 2

Fase de entrenamiento

text

Phase: Training, Dataset used: Validation, Batch Processed Count: 6,


Epoch: 21, Accuracy: 0.6797619
Phase: Training, Dataset used: Validation, Batch Processed Count: 6,
Epoch: 22, Accuracy: 0.7642857
Phase: Training, Dataset used: Validation, Batch Processed Count: 6,
Epoch: 23, Accuracy: 0.7916667

Salida de clasificación de imágenes

text
Classifying single image
Image: [Link] | Actual Value: UD | Predicted Value: UD

Classifying multiple images


Image: [Link] | Actual Value: UD | Predicted Value: UD
Image: [Link] | Actual Value: UD | Predicted Value: UD
Image: [Link] | Actual Value: UD | Predicted Value: UD

Al inspeccionar la imagen [Link], puede ver que, de hecho, no tiene grietas.

¡Enhorabuena! Ha compilado correctamente un modelo de aprendizaje profundo para la


clasificación de imágenes.

Mejora del modelo


Si no está satisfecho con los resultados del modelo, puede intentar mejorar su
rendimiento probando algunos de los enfoques siguientes:

Más datos: cuanto mayor sea el número de ejemplos de los que pueda aprender
un modelo, mejor funcionará. Descargue el conjunto de datos SDNET2018
completo y úselo para entrenar.
Aumentar los datos: Una técnica común para agregar diversidad a los datos es
aumentarlos tomando una imagen y aplicando distintas transformaciones (girar,
voltear, desplazar o recortar). Esto agrega ejemplos más variados para que el
modelo aprenda de ellos.
Entrenar durante más tiempo: cuanto más tiempo se entrene, más ajustado estará
el modelo. Aumentar el número de épocas puede mejorar el rendimiento del
modelo.
Experimentar con otros hiperparámetros: además de los parámetros que se usan
en este tutorial, se pueden ajustar otros parámetros para mejorar potencialmente
el rendimiento. Cambiar la velocidad de aprendizaje, que determina el tamaño de
las actualizaciones realizadas en el modelo después de cada época, puede mejorar
el rendimiento.
Usar una arquitectura de modelo diferente: en función de lo que parezcan los
datos, puede variar el modelo que sea capaz de aprender mejor sus características.
Si no está satisfecho con el rendimiento del modelo, intente cambiar la
arquitectura.

Pasos siguientes
En este tutorial, se ha obtenido información sobre cómo compilar un modelo de
aprendizaje profundo personalizado mediante el aprendizaje de transferencia, un
modelo TensorFlow de clasificación de imágenes previamente entrenado y la API Image
Classification de [Link] para clasificar las imágenes de superficies de hormigón como
con grietas o sin grietas.

Siga con el siguiente tutorial para obtener más información.

Detección de objetos
Tutorial: entrenamiento de un modelo
[Link] de clasificación para clasificar
imágenes
Artículo • 09/05/2023

Aprenda a entrenar un modelo de clasificación para clasificar imágenes mediante un


modelo de TensorFlow entrenado previamente para el procesamiento de imágenes.

El modelo de TensorFlow se entrenó para clasificar las imágenes en mil categorías. Dado
que el modelo de TensorFlow sabe cómo reconocer patrones en imágenes, el modelo
[Link] puede hacer uso de parte de él en su canalización para convertir imágenes sin
procesar en características o entradas para entrenar un modelo de clasificación.

En este tutorial aprenderá a:

" Entender el problema
" Incorporación del modelo de TensorFlow entrenado previamente en la canalización
de [Link]
" Entrenamiento y evaluación del modelo de [Link]
" Clasificación de una imagen de prueba

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .


De forma predeterminada, la configuración del proyecto de .NET de este tutorial tiene
como destino .NET Core 2.2.

Requisitos previos
Visual Studio 2022
El archivo ZIP del directorio de recursos del tutorial
El modelo de Machine Learning de InceptionV1

Selección de la tarea de aprendizaje


automático adecuada

Aprendizaje profundo
El aprendizaje profundo es un subconjunto de Machine Learning, que está
revolucionando áreas como Computer Vision y reconocimiento de voz.
Los modelos de aprendizaje profundo se entrenan mediante el uso de grandes
conjuntos de datos etiquetados y redes neuronales que contienen varias capas de
conocimiento. Aprendizaje profundo:

Funciona mejor en algunas tareas como Computer Vision.


Requiere enormes cantidades de datos de entrenamiento.

La clasificación de imágenes es una tarea que nos permite clasificar imágenes


automáticamente en categorías como:

Detectar o no una cara humana en una imagen.


Detectar gatos o perros.

O bien, como en las imágenes siguientes, determinar si una imagen es un alimento, un


juguete o un dispositivo:

7 Nota

Las imágenes anteriores pertenecen a Wikimedia Commons y tienen los siguientes


atributos:

"220px-Pepperoni_pizza.jpg" de dominio público,


[Link] ,
"119px-Nalle_-_a_small_brown_teddy_bear.jpg" de Jonik , autofotografía, CC
BY-SA 2.0, [Link] .
"[Link]" de [Link] , trabajo propio, CC BY-SA 3.0,
[Link]

Entrenar un modelo de clasificación de imágenes desde cero requiere establecer


millones de parámetros, una enorme cantidad de datos de aprendizaje etiquetados y
una gran cantidad de recursos informáticos (cientos de horas de GPU). Si bien no es tan
eficaz como entrenar un modelo entrenado previamente, el aprendizaje por
transferencia permite acortar este proceso al trabajar con miles de imágenes frente a
millones de imágenes etiquetadas y crear un modelo personalizado con bastante
rapidez (menos de una hora en una máquina sin GPU). En este tutorial se amplía aún
más ese proceso, con solo una docena de imágenes de aprendizaje.

Inception model está entrenado para clasificar imágenes en miles de categorías, pero,

en este tutorial, el usuario deberá clasificar las imágenes en un conjunto de categorías


más pequeño y solo en esas categorías. Puede usar la capacidad de Inception model
para reconocer y clasificar imágenes en las nuevas categorías limitadas del clasificador
personalizado de imágenes.

Alimentos
Juguetes
Dispositivos

En este tutorial se usa el modelo de aprendizaje profundo del Inicio de TensorFlow, un


modelo de reconocimiento de imágenes popular entrenado en el conjunto de datos
ImageNet . El modelo de TensorFlow clasifica imágenes completas en miles de clases

como "Paraguas", "Jersey" y "Lavavajillas".

Como Inception model se ha entrenado previamente en miles de imágenes distintas,


contiene internamente las características de imagen necesarias para la identificación
de imágenes. Podemos usar estas características de imagen internas en el modelo para
entrenar un modelo nuevo con muchas menos clases.

Como se muestra en el diagrama siguiente, puede agregar una referencia a los paquetes
NuGet de [Link] en las aplicaciones de .NET Core o .NET Framework. En segundo
plano, [Link] incluye y hace referencia a la biblioteca nativa de TensorFlow que
permite escribir código que carga un archivo de modelo de TensorFlow entrenado
existente.

Clasificación multiclase
Después de usar el modelo de inicio de TensorFlow para extraer características
adecuadas como entrada para un algoritmo de aprendizaje automático clásico, se
agrega un clasificador multiclase de [Link].

El entrenador específico que se usa en este caso es el algoritmo de regresión logística


multinomial .

El algoritmo que implementa este entrenador funciona con un gran número de


características, que es el caso de un modelo de aprendizaje profundo que funciona con
datos de imagen.

Consulte Aprendizaje profundo frente a aprendizaje automático para obtener más


información.

Datos
Hay dos orígenes de datos: el archivo .tsv y los archivos de imagen. El archivo
[Link] contiene dos columnas: la primera está definida como ImagePath y la segunda

es la Label que corresponde a la imagen. El archivo de ejemplo siguiente no tiene una


fila de encabezado y se ve así:

tsv

[Link] food
[Link] food
[Link] food
[Link] toy
[Link] toy
[Link] toy
[Link] appliance
[Link] appliance

Las imágenes de entrenamiento y prueba se encuentran en las carpetas de recursos que


descargará en un archivo ZIP. Estas imágenes pertenecen a Wikimedia Commons.

Wikimedia Commons , el repositorio multimedia gratuito. Recuperado a las 10:48


del 17 de octubre de 2018 desde:
[Link] [Link]
aster [Link]

Programa de instalación

Crear un proyecto
1. Cree una aplicación de consola en C# llamada "TransferLearningTF". Haga clic en
el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en


Administrar paquetes NuGet.
Elija "[Link]" como origen del paquete, seleccione la pestaña Examinar y
busque [Link].
Seleccione el botón Instalar.
Seleccione el botón Aceptar en el cuadro de diálogo Vista previa de los
cambios.
Haga clic en el botón Acepto en el cuadro de diálogo Aceptación de la
licencia si está de acuerdo con los términos de licencia de los paquetes que
aparecen.
Repita estos pasos para [Link],
[Link] y [Link].

Descarga de activos
1. Descargue el archivo ZIP del directorio de recursos del proyecto y
descomprímalo.

2. Copie el directorio assets en el directorio de proyecto TransferLearningTF. Este


directorio y sus subdirectorios contienen los datos y los archivos auxiliares
(excepto los del modelo de inicio, que descargará y agregará en el paso siguiente)
que se necesitan en este tutorial.

3. Descargue el modelo de inicio y descomprímalo.

4. Copie el contenido del directorio inception5h que acaba de descomprimir en el


directorio assets/inception del proyecto TransferLearningTF. En este directorio
está el modelo y los archivos auxiliares adicionales que se necesitan en este
tutorial, tal como se muestra en la imagen siguiente:
5. En el Explorador de soluciones, haga clic con el botón derecho en cada uno de los
archivos del directorio de recursos y los subdirectorios y seleccione Propiedades.
En Avanzadas, cambie el valor de Copiar en el directorio de salida por Copiar si es
posterior.

Crear clases y definir rutas de acceso


1. Agregue las siguientes instrucciones using adicionales a la parte superior del
archivo [Link]:

C#

using [Link];
using [Link];

2. Agregue el código siguiente a la línea justo debajo de las instrucciones using para
especificar las rutas de acceso del recurso:

C#

string _assetsPath = [Link]([Link],


"assets");
string _imagesFolder = [Link](_assetsPath, "images");
string _trainTagsTsv = [Link](_imagesFolder, "[Link]");
string _testTagsTsv = [Link](_imagesFolder, "[Link]");
string _predictSingleImage = [Link](_imagesFolder,
"[Link]");
string _inceptionTensorFlowModel = [Link](_assetsPath,
"inception", "tensorflow_inception_graph.pb");

3. Cree clases para los datos de entrada y las predicciones.


C#

public class ImageData


{
[LoadColumn(0)]
public string? ImagePath;

[LoadColumn(1)]
public string? Label;
}

ImageData es la clase de datos de imagen de entrada y tiene los campos String


siguientes:

ImagePath contiene el nombre del archivo de imagen.

Label contiene un valor para la etiqueta de imagen.

4. Agregue una clase nueva al proyecto para ImagePrediction :

C#

public class ImagePrediction : ImageData


{
public float[]? Score;

public string? PredictedLabelValue;


}

ImagePrediction es la clase de predicción de imagen y tiene los campos


siguientes:

Score contiene el porcentaje de confianza de una clasificación de imágenes

determinada.
PredictedLabelValue contiene un valor para la etiqueta de clasificación de

imágenes prevista.

ImagePrediction es la clase usada para la predicción una vez entrenado el modelo.

Tiene una string ( ImagePath ) para la ruta de acceso a la imagen. Label se usa
para reutilizar y entrenar el modelo. PredictedLabelValue se usa durante la
predicción y la evaluación. Para la evaluación, se utiliza una entrada con los datos
de entrenamiento, los valores de predicción y el modelo.

Inicialización de variables
1. Inicialice la variable mlContext con una instancia nueva de MLContext . Reemplace
la línea [Link]("Hello World!") por el código siguiente:

C#

MLContext mlContext = new MLContext();

La clase MLContext es un punto de partida para todas las operaciones de [Link].


Al inicializar mlContext se crea un entorno de [Link] que se puede compartir
entre los objetos del flujo de trabajo de creación de modelos. Como concepto, se
parece a DBContext en Entity Framework.

Creación de una estructura para los parámetros del


modelo de inicio
1. El modelo de inicio tiene varios parámetros que se deben transmitir. Cree una
estructura para asignar los valores de parámetros a nombres descriptivos con el
código siguiente, justo después de inicializar la variable mlContext :

C#

struct InceptionSettings
{
public const int ImageHeight = 224;
public const int ImageWidth = 224;
public const float Mean = 117;
public const float Scale = 1;
public const bool ChannelsLast = true;
}

Crear un método de utilidad para mostrar


Dado que se mostrarán los datos de imagen y las predicciones relacionadas más de una
vez, cree un método de utilidad para mostrar a fin de controlar la visualización de los
resultados de la imagen y la predicción.

1. Cree el método DisplayResults() justo después de la estructura


InceptionSettings con el código siguiente:

C#

void DisplayResults(IEnumerable<ImagePrediction> imagePredictionData)


{
}

2. Rellene el cuerpo del método DisplayResults :

C#

foreach (ImagePrediction prediction in imagePredictionData)


{
[Link]($"Image: {[Link]([Link])}
predicted as: {[Link]} with score:
{[Link]?.Max()} ");
}

Creación de un método para hacer una predicción


1. Cree el método ClassifySingleImage() , justo antes del método DisplayResults() ,
mediante el código siguiente:

C#

void ClassifySingleImage(MLContext mlContext, ITransformer model)


{

2. Cree un objeto ImageData que contenga la ruta de acceso completa y el nombre


del archivo de imagen para la ImagePath única. Agregue el código siguiente como
las siguientes líneas en el método ClassifySingleImage() :

C#

var imageData = new ImageData()


{
ImagePath = _predictSingleImage
};

3. Para hacer una predicción única, agregue el código siguiente como la línea
siguiente en el método ClassifySingleImage :

C#

// Make prediction function (input = ImageData, output =


ImagePrediction)
var predictor = [Link]<ImageData,
ImagePrediction>(model);
var prediction = [Link](imageData);

Para obtener la predicción, use el método Predict(). PredictionEngine es una API de


conveniencia, que le permite realizar una predicción en una única instancia de
datos. PredictionEngine no es seguro para subprocesos. Es aceptable usarlo en
entornos de un solo subproceso o prototipo. Para mejorar el rendimiento y la
seguridad para subprocesos en entornos de producción, use el servicio
PredictionEnginePool , que crea un ObjectPool de objetos de PredictionEngine

para su uso en toda la aplicación. Consulte esta guía sobre cómo usar
PredictionEnginePool en una API web de [Link] Core.

7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

4. Muestre el resultado de la predicción como la línea de código siguiente en el


método ClassifySingleImage() :

C#

[Link]($"Image: {[Link]([Link])}
predicted as: {[Link]} with score:
{[Link]?.Max()} ");

Construcción de la canalización del modelo de


[Link]
Una canalización del modelo de [Link] es una cadena de estimadores. No se produce
ninguna ejecución durante la construcción de la canalización. Se crean los objetos del
estimador, pero no se ejecutan.

1. Agregue un método para generar el modelo

Este método es la parte central del tutorial. Crea una canalización para el modelo y
entrena la canalización para generar el modelo de [Link]. También evalúa el
modelo con respecto a algunos datos de prueba previamente desconocidos.

Cree el método GenerateModel() justo después de la estructura InceptionSettings


y antes del método DisplayResults() con el código siguiente:
C#

ITransformer GenerateModel(MLContext mlContext)


{

2. Agregue los estimadores para cargar, cambiar el tamaño y extraer los píxeles de
los datos de la imagen:

C#

IEstimator<ITransformer> pipeline =
[Link](outputColumnName: "input", imageFolder:
_imagesFolder, inputColumnName: nameof([Link]))
// The image transforms transform the images into the
model's expected format.

.Append([Link](outputColumnName: "input",
imageWidth: [Link], imageHeight:
[Link], inputColumnName: "input"))

.Append([Link](outputColumnName: "input",
interleavePixelColors: [Link], offsetImage:
[Link]))

Los datos de la imagen se deben procesar en el formato que el modelo de


TensorFlow espera. En este caso, las imágenes se cargan en la memoria, se cambia
el tamaño a un tamaño coherente y los píxeles se extraen en un vector numérico.

3. Agregue el estimador para cargar el modelo de TensorFlow y puntúelo:

C#

.Append([Link](_inceptionTensorFlowModel).
ScoreTensorFlowModel(outputColumnNames: new[] {
"softmax2_pre_activation" }, inputColumnNames: new[] { "input" },
addBatchDimensionInput: true))

Esta fase de la canalización carga el modelo de TensorFlow en la memoria y, a


continuación, procesa el vector de valores de píxeles a través de la red del modelo
de TensorFlow. La aplicación de entradas a un modelo de aprendizaje profundo y
la generación de una salida mediante el modelo se conoce como Puntuación. Al
utilizar el modelo en su totalidad, la puntuación hace una inferencia o predicción.

En este caso, se usa todo el modelo de TensorFlow, excepto la última capa, que es
la que realiza la inferencia. El resultado de la penúltima capa tiene la etiqueta
softmax_2_preactivation . La salida de esta capa es, de hecho, un vector de las

características que caracterizan las imágenes de entrada originales.

Este vector de características generado por el modelo de TensorFlow se usará


como entrada para un algoritmo de aprendizaje de [Link].

4. Agregue el estimador para asignar las etiquetas de cadena en los datos de


entrenamiento a los valores de clave entera:

C#

.Append([Link](outputColumnName:
"LabelKey", inputColumnName: "Label"))

El entrenador de [Link] que se anexa a continuación requiere que sus etiquetas


estén en formato key en lugar de cadenas arbitrarias. Una clave es un número que
tiene una asignación de uno a uno a un valor de cadena.

5. Agregue el algoritmo de aprendizaje de [Link]:

C#

.Append([Link]
(labelColumnName: "LabelKey", featureColumnName:
"softmax2_pre_activation"))

6. Agregue el estimador para asignar el valor de clave de predicción a una cadena:

C#

.Append([Link]("PredictedLabelVa
lue", "PredictedLabel"))
.AppendCacheCheckpoint(mlContext);

Entrenar el modelo
1. Cargue los datos de entrenamiento con el contenedor LoadFromTextFile. Agregue
el siguiente código como la siguiente línea en el método GenerateModel() :

C#

IDataView trainingData = [Link]<ImageData>


(path: _trainTagsTsv, hasHeader: false);
Los datos de [Link] se representan como una interfaz IDataView. IDataView es
una manera flexible y eficiente de describir datos tabulares (numéricos y de texto).
Los datos se pueden cargar desde un archivo de texto o en tiempo real (por
ejemplo, archivos de registro o base de datos SQL) en un objeto IDataView .

2. Entrene el modelo con los datos cargados anteriormente:

C#

ITransformer model = [Link](trainingData);

El método Fit() entrena el modelo mediante la aplicación del conjunto de datos


de entrenamiento a la canalización.

Evaluación de la precisión del modelo


1. Cargue y transforme los datos de prueba agregando el código siguiente a la
siguiente línea del método GenerateModel :

C#

IDataView testData = [Link]<ImageData>(path:


_testTagsTsv, hasHeader: false);
IDataView predictions = [Link](testData);

// Create an IEnumerable for the predictions for displaying results


IEnumerable<ImagePrediction> imagePredictionData =
[Link]<ImagePrediction>(predictions, true);
DisplayResults(imagePredictionData);

Hay algunas imágenes de ejemplo que puede usar para evaluar el modelo. Al igual
que los datos de entrenamiento, deben cargarse en IDataView , de modo que el
modelo pueda transformarlos.

2. Agregue el código siguiente al método GenerateModel() para evaluar el modelo:

C#

MulticlassClassificationMetrics metrics =
[Link](predictions,
labelColumnName: "LabelKey",
predictedLabelColumnName: "PredictedLabel");

Una vez que establece la predicción, el método Evaluate():


Evalúa el modelo (compara los valores previstos con el conjunto de datos
labels de prueba).
Devuelve las métricas de rendimiento del modelo.

3. Visualización de las métricas de precisión del modelo

Utilice el código siguiente para mostrar las métricas, compartir los resultados y, a
continuación, trabajar con ellos:

C#

[Link]($"LogLoss is: {[Link]}");


[Link]($"PerClassLogLoss is: {[Link](" , ",
[Link](c => [Link]()))}");

Las siguiente métricas se evalúan para la clasificación de imágenes:

Log-loss : consulte Pérdida de registro. Le recomendamos que la pérdida

logarítmica esté lo más cerca posible de 0.


Per class Log-loss . Le recomendamos que la pérdida logarítmica por clase

esté lo más cerca posible de 0.

4. Agregue el siguiente código para devolver el modelo entrenado, como la siguiente


línea:

C#

return model;

Ejecución de la aplicación
1. Agregue la llamada a GenerateModel después de la creación de la clase MLContext:

C#

ITransformer model = GenerateModel(mlContext);

2. Agregue la llamada al método ClassifySingleImage() después de la llamada al


método GenerateModel() :

C#

ClassifySingleImage(mlContext, model);
3. Ejecute la aplicación de consola ( Ctrl + F5 ). Los resultados deberían ser similares
a la salida siguiente. (Es posible que vea advertencias o mensajes de
procesamiento, si bien se han quitado de los resultados siguientes para mayor
claridad).

Consola

=============== Training classification model ===============


Image: [Link] predicted as: food with score: 0.8955513
Image: [Link] predicted as: food with score: 0.9667718
Image: [Link] predicted as: toy with score: 0.9797683
=============== Classification metrics ===============
LogLoss is: 0.0653774699265059
PerClassLogLoss is: 0.110315812569315 , 0.0204391272836966 , 0
=============== Making single image classification ===============
Image: [Link] predicted as: appliance with score: 0.9646884

¡Enhorabuena! Ahora ha creado correctamente un modelo de clasificación en [Link]


para clasificar imágenes mediante un TensorFlow entrenado previamente para el
procesamiento de imágenes.

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

En este tutorial ha aprendido a:

" Entender el problema
" Incorporación del modelo de TensorFlow entrenado previamente en la canalización
de [Link]
" Entrenamiento y evaluación del modelo de [Link]
" Clasificación de una imagen de prueba

Consulte el repositorio de GitHub con ejemplos de Machine Learning para explorar un


ejemplo expandido de clasificación de imágenes.

Repositorio dotnet/machinelearning-samples de GitHub


Tutorial: Previsión de la demanda de
servicio de alquiler de bicicletas con
análisis de serie temporal y [Link]
Artículo • 09/05/2023

Obtenga información sobre cómo prever la demanda de un servicio de alquiler de


bicicletas mediante el análisis de serie temporal de variable única en los datos
almacenados en una base de datos SQL Server con [Link].

En este tutorial aprenderá a:

" Entender el problema
" Cargar datos desde una base de datos
" Crear un modelo de previsión
" Evaluar un modelo de previsión
" Guardar un modelo de previsión
" Usar un modelo de previsión

Requisitos previos
Visual Studio 2022 con la carga de trabajo "Desarrollo de escritorio de .NET"
instalada.

Información general de un ejemplo de


previsión de serie temporal
Este ejemplo es una aplicación de consola de .NET Core de C# que prevé la demanda
de alquileres de bicicletas con un algoritmo de análisis de serie temporal de variable
única conocido como "análisis de un solo espectro". El código de este ejemplo se puede
encontrar en el repositorio dotnet/machinelearning-samples en GitHub.

Entender el problema
Para ejecutar una operación eficaz, la administración de inventario desempeña un rol
clave. Tener en existencia una cantidad excesiva de un producto significa que los
productos no vendidos que se encuentran en las estanterías no generan ingresos. Tener
una cantidad reducida de un producto hace que se pierdan ventas y que los clientes
compren a la competencia. Por lo tanto, la pregunta constante es ¿cuál es la cantidad
óptima de inventario que debe mantenerse a mano? El análisis de serie temporal lo
ayuda a proporcionar una respuesta a estas preguntas examinando los datos históricos,
identificando patrones y usando esta información para prever valores en el futuro.

La técnica para analizar los datos que usa este tutorial es el análisis de serie temporal de
variable única. El análisis de serie temporal de variante única examina una única
observación numérica durante un período de tiempo a intervalos específicos, como las
ventas mensuales.

El algoritmo que se usa en este tutorial es el análisis de un solo espectro (SSA) . SSA
sirve para descomponer una serie temporal en un conjunto de componentes principales.
Estos componentes se pueden interpretar como partes de una señal que corresponde a
tendencias, ruido, estacionalidad y muchos otros factores. Después, estos componentes
se reconstruyen y se usan para pronosticar valores en el futuro.

Creación de una aplicación de consola


1. Cree una aplicación de consola en C# llamada "BikeDemandForecasting". Haga
clic en el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Instale el paquete NuGet versión [Link].

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

a. En el Explorador de soluciones, haga clic con el botón derecho en Administrar


paquetes NuGet.
b. Elija "[Link]" como origen del paquete, seleccione la pestaña Examinar y
busque [Link].
c. Active la casilla Incluir versión preliminar.
d. Seleccione el botón Instalar.
e. Seleccione el botón Aceptar en el cuadro de diálogo Vista previa de cambios y,
a continuación, seleccione el botón Acepto del cuadro de diálogo Aceptación
de la licencia en caso de que esté de acuerdo con los términos de licencia de los
paquetes mostrados.
f. Repita estos pasos para [Link] y [Link].
Preparar y entender los datos
1. Cree un directorio denominado Data.
2. Descargue el archivo de base de datos [Link] y guárdelo en el
directorio Data.

7 Nota

Los datos que se usan en este tutorial provienen del conjunto de datos UCI Bike
Sharing Dataset . Fanaee-T, Hadi, and Gama, Joao, "Event labeling combining
ensemble detectors and background knowledge", Progress in Artificial Intelligence
(2013): pp. 1-15, Springer Berlin Heidelberg, vínculo web .

El conjunto de datos original contiene varias columnas correspondientes a la


estacionalidad y al clima. Con el fin de ser breves y como el algoritmo que se usa en
este tutorial solo requiere los valores de una columna numérica única, el conjunto de
datos original se ha condensado para incluir solo las columnas siguientes:

dteday: la fecha de la observación.


year: el año codificado de la observación (0=2011, 1=2012).
cnt: el número total de alquileres de bicicletas para ese día.

El conjunto de datos original se asigna a una tabla de base de datos con el esquema
siguiente en una base de datos de SQL Server.

SQL

CREATE TABLE [Rentals] (


[RentalDate] DATE NOT NULL,
[Year] INT NOT NULL,
[TotalRentals] INT NOT NULL
);

A continuación se muestra un ejemplo de los datos:

RentalDate Año TotalRentals

1/1/2011 0 985

1/2/2011 0 801

1/3/2011 0 1349

Creación de las clases de entrada y salida


1. Abra el archivo [Link] y reemplace las instrucciones using existentes por las
siguientes:

C#

using [Link];
using [Link];
using [Link];
using [Link];

2. Cree la clase ModelInput . Debajo de la clase Program , agregue el código siguiente.

C#

public class ModelInput


{
public DateTime RentalDate { get; set; }

public float Year { get; set; }

public float TotalRentals { get; set; }


}

La clase ModelInput contiene las columnas siguientes:

RentalDate: la fecha de la observación.


Year: el año codificado de la observación (0=2011, 1=2012).
TotalRentals: el número total de alquileres de bicicletas para ese día.

3. Cree la clase ModelOutput debajo de la clase ModelInput recién creada.

C#

public class ModelOutput


{
public float[] ForecastedRentals { get; set; }

public float[] LowerBoundRentals { get; set; }

public float[] UpperBoundRentals { get; set; }


}

La clase ModelOutput contiene las columnas siguientes:

ForecastedRentals: los valores de predicción del período previsto.


LowerBoundRentals: los valores mínimos de predicción del período previsto.
UpperBoundRentals: los valores máximos de predicción del período previsto.
Definición de rutas de acceso e inicialización de variables
1. Debajo de las instrucciones using, defina variables para almacenar la ubicación de
los datos, la cadena de conexión y dónde guardar el modelo entrenado.

C#

string rootDir =
[Link]([Link]([Link],
"../../../"));
string dbFilePath = [Link](rootDir, "Data", "[Link]");
string modelPath = [Link](rootDir, "[Link]");
var connectionString = $"Data Source=
(LocalDB)\\MSSQLLocalDB;AttachDbFilename={dbFilePath};Integrated
Security=True;Connect Timeout=30;";

2. Inicialice la variable mlContext con una instancia nueva de MLContext mediante la


incorporación de la línea siguiente después de definir las rutas de acceso.

C#

MLContext mlContext = new MLContext();

La clase MLContext es un punto inicial para todas las operaciones de [Link]. Al


inicializar mlContext, se crea un entorno de [Link] que se puede compartir entre
los objetos del flujo de trabajo de creación de modelos. Como concepto, se parece
a DBContext en Entity Framework.

Carga de los datos


1. Cree DatabaseLoader que cargue los registros de tipo ModelInput .

C#

DatabaseLoader loader = [Link]<ModelInput>


();

2. Defina la consulta para cargar los datos de la base de datos.

C#

string query = "SELECT RentalDate, CAST(Year as REAL) as Year,


CAST(TotalRentals as REAL) as TotalRentals FROM Rentals";
Los algoritmos de [Link] esperan que los datos sean de tipo Single. Por lo tanto,
los valores numéricos que provienen de la base de datos que no son de tipo Real,
un valor de punto flotante de precisión sencilla, se deben convertir en Real.

Las columnas Year y TotalRental son tipos enteros en la base de datos. Con la
función integrada CAST , ambos se convierten en Real .

3. Cree un DatabaseSource para conectarse a la base de datos y ejecutar la consulta.

C#

DatabaseSource dbSource = new DatabaseSource([Link],


connectionString,
query);

4. Cargue los datos en un IDataView .

C#

IDataView dataView = [Link](dbSource);

5. El conjunto de datos contiene datos de dos años. Solo se usan los datos del primer
año para el entrenamiento, el segundo año se mantiene para comparar los valores
reales con el pronóstico generado por el modelo. Filtre los datos con la
transformación FilterRowsByColumn.

C#

IDataView firstYearData = [Link](dataView,


"Year", upperBound: 1);
IDataView secondYearData = [Link](dataView,
"Year", lowerBound: 1);

Para el primer año, se seleccionan solo los valores de la columna Year menores
que 1 al establecer el parámetro upperBound en 1. A la inversa, para el segundo
año, se seleccionan los valores mayores o iguales que 1 al establecer el parámetro
lowerBound en 1.

Definición de la canalización de análisis de


serie temporal
1. Defina una canalización que use SsaForecastingEstimator para pronosticar valores
en un conjunto de datos de serie temporal.

C#

var forecastingPipeline = [Link](


outputColumnName: "ForecastedRentals",
inputColumnName: "TotalRentals",
windowSize: 7,
seriesLength: 30,
trainSize: 365,
horizon: 7,
confidenceLevel: 0.95f,
confidenceLowerBoundColumn: "LowerBoundRentals",
confidenceUpperBoundColumn: "UpperBoundRentals");

forecastingPipeline toma 365 puntos de datos para el primer año y muestrea o

divide el conjunto de datos de serie temporal en intervalos de 30 días


(mensualmente) según lo especificado en el parámetro seriesLength . Cada uno de
estos ejemplos se analiza durante una ventana semanal o de 7 días. A la hora de
determinar cuál es el valor de previsión para el período siguiente, se usan los
valores de los siete días anteriores para realizar una predicción. El modelo se
establece para pronosticar siete períodos en el futuro, tal como se define en el
parámetro horizon . Como una previsión es una estimación informada, no siempre
es 100 precisa. Por lo tanto, es conveniente conocer el intervalo de valores en los
mejores y peores escenarios, tal como se define en los límites superior e inferior.
En este caso, el nivel de confianza de los límites inferior y superior se establece en
95 %. El nivel de confianza se puede aumentar o reducir en consecuencia. Cuanto
mayor sea el valor, más amplio será el intervalo entre los límites superior e inferior
para lograr el nivel de confianza deseado.

2. Use el método Fit para entrenar el modelo y ajustar los datos a la


forecastingPipeline definida previamente.

C#

SsaForecastingTransformer forecaster =
[Link](firstYearData);

Evaluar el modelo
Evalúe el rendimiento del modelo al prever los datos del año siguiente y comparándolos
con los valores reales.
1. Cree un método de utilidad llamado Evaluate al final del archivo [Link].

C#

Evaluate(IDataView testData, ITransformer model, MLContext mlContext)


{

2. Dentro del método Evaluate , prevea los datos del segundo año a través del
método Transform con el modelo entrenado.

C#

IDataView predictions = [Link](testData);

3. Obtenga los valores reales de los datos a través del método CreateEnumerable.

C#

IEnumerable<float> actual =
[Link]<ModelInput>(testData, true)
.Select(observed => [Link]);

4. Use el método CreateEnumerable para obtener los valores de previsión.

C#

IEnumerable<float> forecast =
[Link]<ModelOutput>(predictions, true)
.Select(prediction => [Link][0]);

5. Calcule la diferencia entre los valores reales y los de previsión, lo que se conoce a
menudo como "error".

C#

var metrics = [Link](forecast, (actualValue, forecastValue) =>


actualValue - forecastValue);

6. Para medir el rendimiento, calcule los valores de error medio absoluto y medio y
error cuadrático medio.

C#
var MAE = [Link](error => [Link](error)); // Mean Absolute
Error
var RMSE = [Link]([Link](error => [Link](error, 2))); //
Root Mean Squared Error

Para evaluar el rendimiento, se usan las métricas siguientes:

Error medio absoluto: mide la cercanía de las predicciones respecto del valor
real. Este valor va de 0 a infinito. Cuanto más se acerque a 0, mejor es la
calidad del modelo.
Error cuadrático medio: resume el error del modelo. Este valor va de 0 a
infinito. Cuanto más se acerque a 0, mejor es la calidad del modelo.

7. Genere las métricas en la consola.

C#

[Link]("Evaluation Metrics");
[Link]("---------------------");
[Link]($"Mean Absolute Error: {MAE:F3}");
[Link]($"Root Mean Squared Error: {RMSE:F3}\n");

8. Llame al método Evaluate debajo de la llamada al método Fit() .

C#

Evaluate(secondYearData, forecaster, mlContext);

Guardado del modelo


Si está satisfecho con el modelo, guárdelo para usarlo más adelante en otras
aplicaciones.

1. Debajo del método Evaluate() , cree un elemento TimeSeriesPredictionEngine.


TimeSeriesPredictionEngine es un método útil para hacer predicciones únicas.

C#

var forecastEngine = [Link]<ModelInput,


ModelOutput>(mlContext);

2. Guarde el modelo en un archivo denominado [Link] , según lo especificado


en la variable modelPath definida anteriormente. Use el método Checkpoint para
guardar el modelo.

C#

[Link](mlContext, modelPath);

Uso del modelo para pronosticar la demanda


1. Debajo del método Evaluate , cree un método de utilidad denominado Forecast .

C#

void Forecast(IDataView testData, int horizon,


TimeSeriesPredictionEngine<ModelInput, ModelOutput> forecaster,
MLContext mlContext)
{

2. En el método Forecast , use el método Predict para pronosticar los alquileres


durante los próximos siete días.

C#

ModelOutput forecast = [Link]();

3. Alinee los valores reales y los valores de previsión durante siete períodos.

C#

IEnumerable<string> forecastOutput =
[Link]<ModelInput>(testData,
reuseRowObject: false)
.Take(horizon)
.Select((ModelInput rental, int index) =>
{
string rentalDate = [Link]();
float actualRentals = [Link];
float lowerEstimate = [Link](0,
[Link][index]);
float estimate = [Link][index];
float upperEstimate = [Link][index];
return $"Date: {rentalDate}\n" +
$"Actual Rentals: {actualRentals}\n" +
$"Lower Estimate: {lowerEstimate}\n" +
$"Forecast: {estimate}\n" +
$"Upper Estimate: {upperEstimate}\n";
});

4. Recorra en iteración la salida del pronóstico y muéstrela en la consola.

C#

[Link]("Rental Forecast");
[Link]("---------------------");
foreach (var prediction in forecastOutput)
{
[Link](prediction);
}

Ejecutar la aplicación
1. Debajo de la llamada al método Checkpoint() , llame al método Forecast .

C#

Forecast(secondYearData, 7, forecastEngine, mlContext);

2. Ejecute la aplicación. En la consola debería aparecer una salida similar a la


siguiente. Por motivos de brevedad, la salida se ha resumido.

text

Evaluation Metrics
---------------------
Mean Absolute Error: 726.416
Root Mean Squared Error: 987.658

Rental Forecast
---------------------
Date: 1/1/2012
Actual Rentals: 2294
Lower Estimate: 1197.842
Forecast: 2334.443
Upper Estimate: 3471.044

Date: 1/2/2012
Actual Rentals: 1951
Lower Estimate: 1148.412
Forecast: 2360.861
Upper Estimate: 3573.309

La inspección de los valores reales y previstos muestra las relaciones siguientes:


Aunque los valores pronosticados no predicen el número exacto de alquileres, sí
proporcionan un intervalo más acotado de valores que permite que una operación
optimice el uso de los recursos.

¡Enhorabuena! Creó correctamente un modelo de Machine Learning de serie temporal


para predecir la demanda de alquileres de bicicletas.

Puede encontrar el código fuente para este tutorial en el repositorio


dotnet/machinelearning-samples .

Pasos siguientes
Tareas de aprendizaje automático en [Link]
Mejora de la precisión del modelo
Tutorial: Detección de anomalías en
series temporales con [Link]
Artículo • 05/06/2023

Aprenda a crear una aplicación de detección de anomalías para los datos de series
temporales. En este tutorial se va a crear una aplicación de consola de .NET Core
mediante C# en Visual Studio 2019.

En este tutorial aprenderá a:

" Carga de los datos


" Detectar el período para una serie temporal
" Detectar anomalías para una serie temporal periódica

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Requisitos previos
Visual Studio 2022 con la carga de trabajo "Desarrollo de escritorio de .NET"
instalada.

Conjunto de datos [Link] .

Creación de una aplicación de consola


1. Cree una aplicación de consola en C# llamada "PhoneCallsAnomalyDetection".
Haga clic en el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Cree un directorio denominado Datos en el proyecto para guardar los archivos del
conjunto de datos.

4. Instale el paquete NuGet [Link], versión 1.5.2:


a. En el Explorador de soluciones, haga clic con el botón derecho en Administrar
paquetes NuGet.
b. Elija "[Link]" como origen del paquete.
c. Seleccione la pestaña Examinar.
d. Busque [Link].
e. Seleccione [Link] de la lista de paquetes y elija la versión 1.5.2 de la lista
desplegable Versión.
f. Seleccione el botón Instalar.
g. Seleccione el botón Aceptar en el cuadro de diálogo Vista previa de cambios y,
a continuación, seleccione el botón Acepto del cuadro de diálogo Aceptación
de la licencia en caso de que esté de acuerdo con los términos de licencia de
los paquetes mostrados.

Repita estos pasos para [Link], versión 1.5.2.

5. Agregue las instrucciones using siguientes en la parte superior del archivo


[Link]:

C#

using [Link];
using [Link];
using PhoneCallsAnomalyDetection;

Descarga de los datos


1. Descargue el conjunto de datos y guárdelo en la carpeta Datos que creó
anteriormente:

Haga clic con el botón derecho en [Link] y seleccione "Guardar vínculo


(o destino) como...".

Asegúrese de que guarda el archivo *.csv en la carpeta Datos o de que, después de


guardarlo en otro lugar, lo mueve a la carpeta Datos.

2. En el Explorador de soluciones, haga clic con el botón derecho en el archivo *.csv y


seleccione Propiedades. En Avanzadas, cambie el valor de Copiar en el directorio
de salida por Copiar si es posterior.

La siguiente tabla es una vista previa de datos del archivo *.csv:

timestamp value

2018/9/3 36.69670857

2018/9/4 35.74160571

..... .....

2018/10/3 34.49893429
timestamp value

... ....

Este archivo representa una serie temporal. Cada fila del archivo es un punto de datos.
Cada punto de datos tiene dos atributos, es decir, timestamp y value , para representar
el número de llamadas telefónicas de cada día. El número de llamadas telefónicas se
marca como no confidencial.

Crear clases y definir rutas de acceso


A continuación, defina las estructuras de datos de la clase de entrada y de predicción.

Agregue una nueva clase a su proyecto:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar > Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a s. A continuación, seleccione el botón Agregar.

El archivo [Link] se abre en el editor de código.

3. Agregue la siguiente instrucción using al principio de [Link]:

C#

using [Link];

4. Quite la definición de clase existente y agregue el código siguiente, que tiene dos
clases PhoneCallsData y PhoneCallsPrediction , al archivo [Link]:

C#

public class PhoneCallsData


{
[LoadColumn(0)]
public string? timestamp;

[LoadColumn(1)]
public double value;
}

public class PhoneCallsPrediction


{
// Vector to hold anomaly detection results, including isAnomaly,
anomalyScore,
// magnitude, expectedValue, boundaryUnits, upperBoundary and
lowerBoundary.
[VectorType(7)]
public double[]? Prediction { get; set; }
}

PhoneCallsData especifica una clase de datos de entrada. El atributo LoadColumn

especifica qué columnas (por índice de columna) del conjunto de datos se deben
cargar. Tiene dos atributos timestamp y value que se corresponden con los
mismos atributos en el archivo de datos.

PhoneCallsPrediction especifica la clase de datos de predicción. Para el detector

de SR-CNN, la predicción depende del modo de detección especificado. En este


ejemplo, se selecciona el modo AnomalyAndMargin . La salida contiene siete
columnas. En la mayoría de los casos, IsAnomaly , ExpectedValue , UpperBoundary y
LowerBoundary son lo suficientemente informativas. Indican si un punto es una
anomalía, el valor esperado del punto y la región del límite inferior y superior del
punto.

5. Agregue el código siguiente a la línea justo debajo de las instrucciones using para
especificar la ruta de acceso al archivo de datos:

C#

string _dataPath = [Link]([Link], "Data",


"[Link]");

Inicialización de variables
1. Reemplace la línea [Link]("Hello World!") por el siguiente código
para declarar e inicializar la variable mlContext :

C#

MLContext mlContext = new MLContext();

La clase MLContext es un punto de partida para todas las operaciones de [Link].


Al inicializar mlContext , se crea un entorno de [Link] que se puede compartir
entre los objetos del flujo de trabajo de creación de modelos. Como concepto, se
parece a DBContext en Entity Framework.

Carga de los datos


Los datos de [Link] se representan como una interfaz IDataView. IDataView es una
manera flexible y eficiente de describir datos tabulares (numéricos y de texto). Los datos
se pueden cargar desde un archivo de texto o u otros orígenes (por ejemplo, archivos
de registro o base de datos SQL) en un objeto IDataView .

1. Agregue el código siguiente debajo de la creación de la variable mlContext :

C#

IDataView dataView = [Link]<PhoneCallsData>


(path: _dataPath, hasHeader: true, separatorChar: ',');

LoadFromTextFile() define el esquema de datos y lee en el archivo. Toma las


variables de ruta de acceso de datos y devuelve IDataView .

Detección de anomalías en una serie temporal


La detección de anomalías en una serie temporal es el proceso de detectar valores
atípicos de datos de series temporales, puntos en determinada serie temporal de
entrada donde el comportamiento no es lo que se esperaba o es "extraño". Estas
anomalías son normalmente indicativas de algunos eventos de interés en el dominio del
problema: un ciberataque en las cuentas de usuario, una interrupción del suministro
eléctrico, una ráfaga de solicitudes por segundo en un servidor, una fuga de memoria,
etc.

Para buscar anomalías en una serie temporal, primero debe determinar el período de la
serie. Después, la serie temporal se puede descomponer en varios componentes como Y
= T + S + R , donde Y es la serie original, T es el componente de tendencia, S es el

componente estacional y R es el componente residual de la serie. Este paso se


denomina descomposición . Por último, se realiza la detección en el componente
residual para encontrar las anomalías. En [Link], el algoritmo SR-CNN es un algoritmo
avanzado nuevo que se basa en la red neuronal residual (SR) y la red neuronal de
circunvolución (CNN) para detectar anomalías en la serie temporal. Para obtener más
información sobre este algoritmo, consulte Servicio de detección de anomalías en una
serie temporal en Microsoft .

En este tutorial, verá que estos procedimientos se pueden llevar a cabo con dos
funciones.

Detección del período


En el primer paso, se invoca la función DetectSeasonality para determinar el período de
la serie.

Creación del método DetectPeriod


1. Cree el método DetectPeriod al final del archivo [Link] con el código
siguiente:

C#

int DetectPeriod(MLContext mlContext, IDataView phoneCalls)


{

2. Utilice la función DetectSeasonality para detectar el período. Agréguelo a un


método DetectPeriod en el siguiente código:

C#

int period = [Link](phoneCalls,


nameof([Link]));

3. Muestre el valor del período agregando lo que se indica a continuación como la


siguiente línea de código en el método DetectPeriod :

C#

[Link]("Period of the series is: {0}.", period);

4. Devuelva el valor del período.

C#

// <SnippetSetupSrCnnParameters>

5. Agregue la siguiente llamada al método DetectPeriod debajo de la llamada al


método LoadFromTextFile() :

C#

int period = DetectPeriod(mlContext, dataView);


Resultados de la detección del período
Ejecute la aplicación. Los resultados deberían ser similares a los indicados a
continuación.

Consola

Period of the series is: 7.

Detección de anomalías
En este paso, usará el método DetectEntireAnomalyBySrCnn para buscar anomalías.

Creación del método DetectAnomaly


1. Cree el método DetectAnomaly , justo debajo del método DetectPeriod , mediante
el código siguiente:

C#

void DetectAnomaly(MLContext mlContext, IDataView phoneCalls, int


period)
{

2. Configure el método SrCnnEntireAnomalyDetectorOptions en el método


DetectAnomaly con el código siguiente:

C#

var options = new SrCnnEntireAnomalyDetectorOptions()


{
Threshold = 0.3,
Sensitivity = 64.0,
DetectMode = [Link],
Period = period,
};

3. Detecte anomalías mediante el algoritmo SR-CNN agregando la siguiente línea de


código en el método DetectAnomaly :

C#
var outputDataView =
[Link](phoneCalls,
nameof([Link]), nameof([Link]),
options);

4. Convierta la vista de datos de salida en un IEnumerable fuertemente tipado para


mostrar fácilmente mediante el método CreateEnumerable con este código:

C#

var predictions = [Link]<PhoneCallsPrediction>


(
outputDataView, reuseRowObject: false);

5. Cree un encabezado de visualización con el siguiente código como la siguiente


línea en el método DetectAnomaly :

C#

[Link]("Index,Data,Anomaly,AnomalyScore,Mag,ExpectedValue,Bo
undaryUnit,UpperBoundary,LowerBoundary");

Se mostrará la siguiente información en los resultados de detección de puntos de


cambio:

Index es el índice de cada punto.

Anomaly es el indicador de si cada punto se detecta como anomalía.

ExpectedValue es el valor estimado de cada punto.


LowerBoundary es el valor más bajo que puede tener cada punto sin que sea

una anomalía.
UpperBoundary es el valor más alto que puede tener cada punto sin que sea

una anomalía.

6. Itere en predictions IEnumerable y muestre los resultados con el siguiente código:

C#

var index = 0;

foreach (var p in predictions)


{
if ([Link] is not null)
{
string output;
if ([Link][0] == 1)
output = "{0},{1},{2},{3},{4}, <-- alert is on! detected
anomaly";
else
output = "{0},{1},{2},{3},{4}";

[Link](output, index, [Link][0],


[Link][3], [Link][5], [Link][6]);
}
++index;
}

[Link]("");

7. Agregue la siguiente llamada al método DetectAnomaly debajo de la llamada al


método DetectPeriod() :

C#

DetectAnomaly(mlContext, dataView, period);

Resultados de detección de anomalías


Ejecute la aplicación. Los resultados deberían ser similares a los indicados a
continuación. Durante el procesamiento, se muestran mensajes. Puede ver las
advertencias o mensajes de procesamiento. Algunos de los mensajes se han quitado de
los resultados siguientes para mayor claridad.

Consola

Detect period of the series


Period of the series is: 7.
Detect anomaly points in the series
Index Data Anomaly AnomalyScore Mag ExpectedValue BoundaryUnit
UpperBoundary LowerBoundary
0,0,36.841787256739266,41.14206982401966,32.541504689458876
1,0,35.67303618137362,39.97331874865401,31.372753614093227
2,0,34.710132999891826,39.029491313022824,30.390774686760828
3,0,33.44765248883495,37.786086547816545,29.10921842985335
4,0,28.937110922276364,33.25646923540736,24.61775260914537
5,0,5.143895892785781,9.444178460066171,0.843613325505391
6,0,5.163325228419392,9.463607795699783,0.8630426611390014
7,0,36.76414836240396,41.06443092968435,32.46386579512357
8,0,35.77908590657007,40.07936847385046,31.478803339289676
9,0,34.547259536635245,38.847542103915636,30.246976969354854
10,0,33.55193524820608,37.871293561337076,29.23257693507508
11,0,29.091800129624648,33.392082696905035,24.79151756234426
12,0,5.154836630338823,9.455119197619213,0.8545540630584334
13,0,5.234332502492464,9.534615069772855,0.934049935212073
14,0,36.54992549471526,40.85020806199565,32.24964292743487
15,0,35.79526470980883,40.095547277089224,31.494982142528443
16,0,34.34099013096804,38.64127269824843,30.040707563687647
17,0,33.61201516582131,37.9122977331017,29.31173259854092
18,0,29.223563320561812,33.5238458878422,24.923280753281425
19,0,5.170512168851533,9.470794736131923,0.8702296015711433
20,0,5.2614938889462834,9.561776456226674,0.9612113216658926
21,0,36.37103858487317,40.67132115215356,32.07075601759278
22,0,35.813544599026855,40.113827166307246,31.513262031746464
23,0,34.05600492733225,38.356287494612644,29.755722360051863
24,0,33.65828319077884,37.95856575805923,29.358000623498448
25,0,29.381125690882463,33.681408258162854,25.080843123602072
26,0,5.261543539820418,9.561826107100808,0.9612609725400283
27,0,5.4873712582971805,9.787653825577571,1.1870886910167897
28,1,36.504694001629254,40.804976568909645,32.20441143434886 <-- alert is
on, detected anomaly
...

¡Enhorabuena! Ya ha creado correctamente los modelos de aprendizaje automático para


detectar períodos y anomalías en series periódicas.

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

En este tutorial ha aprendido a:

" Carga de los datos


" Detectar períodos en datos de una serie temporal
" Detectar anomalías en datos de una serie temporal

Pasos siguientes
Consulte el repositorio de GitHub con ejemplos de Machine Learning para explorar un
ejemplo de detección de anomalías de consumo de energía.

Repositorio dotnet/machinelearning-samples de GitHub


Tutorial: Detección de anomalías en
ventas de productos con [Link]
Artículo • 10/05/2023

Aprenda a crear una aplicación de detección de anomalías para los datos de ventas de
productos. En este tutorial se va a crear una aplicación de consola de .NET Core
mediante C# en Visual Studio.

En este tutorial aprenderá a:

" Carga de los datos


" Crear una transformación para la detección de anomalías de picos
" Detectar anomalías de picos con la transformación
" Crear una transformación para la detección de anomalías de puntos de cambio
" Detectar anomalías de puntos de cambio con la transformación

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Requisitos previos
Visual Studio 2022 con la carga de trabajo "Desarrollo de escritorio de .NET"
instalada.

El conjunto de datos [Link]

7 Nota

El formato de datos en [Link] se basa en el conjunto de datos


"Shampoo Sales Over a Three Year Period" (Ventas de champú en un período de
tres años) procedente originalmente de DataMarket y proporcionado por Time
Series Data Library (TSDL), creado por Rob Hyndman. Conjunto de datos "Shampoo
Sales Over a Three Year Period" con una licencia de conjunto de datos que se
concede de acuerdo con DataMarket Default Open License.

Creación de una aplicación de consola


1. Cree una aplicación de consola en C# llamada "ProductSalesAnomalyDetection".
Haga clic en el botón Next (Siguiente).
2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Cree un directorio denominado Datos en el proyecto para guardar los archivos del
conjunto de datos.

4. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en Administrar


paquetes NuGet. Elija "[Link]" como origen del paquete, seleccione la pestaña
Examinar, busque [Link] y seleccione el botón Instalar. Seleccione el botón
Aceptar en el cuadro de diálogo Vista previa de cambios y, a continuación,
seleccione el botón Acepto del cuadro de diálogo Aceptación de la licencia en
caso de que esté de acuerdo con los términos de licencia de los paquetes
mostrados. Repita estos pasos para [Link].

5. Agregue las instrucciones using siguientes en la parte superior del archivo


[Link]:

C#

using [Link];
using ProductSalesAnomalyDetection;

Descarga de los datos


1. Descargue el conjunto de datos y guárdelo en la carpeta Datos que creó
anteriormente:

Haga clic con el botón derecho en [Link] y seleccione "Guardar


vínculo (o destino) como...".

Asegúrese de que guarda el archivo *.csv en la carpeta Datos o de que,


después de guardarlo en otro lugar, lo mueve a la carpeta Datos.

2. En el Explorador de soluciones, haga clic con el botón derecho en el archivo *.csv y


seleccione Propiedades. En Avanzadas, cambie el valor de Copiar en el directorio
de salida por Copiar si es posterior.
La siguiente tabla es una vista previa de datos del archivo *.csv:

Mes ProductSales

1 - Ene 271

2 - Ene 150,9

..... .....

1 - Feb 199,3

..... .....

Crear clases y definir rutas de acceso


A continuación, defina las estructuras de datos de la clase de entrada y de predicción.

Agregue una nueva clase a su proyecto:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar > Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

El archivo [Link] se abre en el editor de código.

3. Agregue la siguiente instrucción using al principio de [Link]:

C#

using [Link];

4. Quite la definición de clase existente y agregue el código siguiente, que tiene dos
clases, ProductSalesData y ProductSalesPrediction , al archivo [Link]:

C#

public class ProductSalesData


{
[LoadColumn(0)]
public string? Month;

[LoadColumn(1)]
public float numSales;
}

public class ProductSalesPrediction


{
//vector to hold alert,score,p-value values
[VectorType(3)]
public double[]? Prediction { get; set; }
}

ProductSalesData especifica una clase de datos de entrada. El atributo


LoadColumn especifica qué columnas (por índice de columna) del conjunto de
datos se deben cargar.

ProductSalesPrediction especifica la clase de datos de predicción. En la detección


de anomalías, la predicción consiste en una alerta que indica si hay una anomalía,
una puntuación sin procesar y un valor p. Cuanto más se acerque el valor p a 0,
más probable es que se haya producido una anomalía.

5. Cree dos campos globales para contener la ruta de acceso del archivo de conjunto
de datos recientemente descargado y la ruta de acceso del archivo de modelo
guardado:

_dataPath tiene la ruta de acceso al conjunto de datos utilizado para


entrenar el modelo.
_docsize tiene el número de registros en el archivo de conjunto de datos.

Usará _docSize para calcular pvalueHistoryLength .

6. Agregue el código siguiente a la línea justo debajo de las instrucciones using para
especificar esas rutas de acceso:

C#

string _dataPath = [Link]([Link], "Data",


"[Link]");
//assign the Number of records in dataset file to constant variable
const int _docsize = 36;

Inicialización de variables
1. Reemplace la línea [Link]("Hello World!") por el siguiente código
para declarar e inicializar la variable mlContext :

C#

MLContext mlContext = new MLContext();


La clase MLContext es un punto de partida para todas las operaciones de [Link].
Al inicializar mlContext , se crea un entorno de [Link] que se puede compartir
entre los objetos del flujo de trabajo de creación de modelos. Como concepto, se
parece a DBContext en Entity Framework.

Carga de los datos


Los datos de [Link] se representan como una interfaz IDataView. IDataView es una
manera flexible y eficiente de describir datos tabulares (numéricos y de texto). Los datos
se pueden cargar desde un archivo de texto o u otros orígenes (por ejemplo, archivos
de registro o base de datos SQL) en un objeto IDataView .

1. Agregue el código siguiente después de crear la variable mlContext :

C#

IDataView dataView = [Link]<ProductSalesData>


(path: _dataPath, hasHeader: true, separatorChar: ',');

LoadFromTextFile() define el esquema de datos y lee en el archivo. Toma las


variables de ruta de acceso de datos y devuelve IDataView .

Detección de anomalías en una serie temporal


La detección de anomalías marca comportamientos o eventos inesperados o poco
habituales. Proporciona pistas sobre dónde buscar problemas y ayuda a responder la
pregunta "¿es extraño esto?".
La detección de anomalías es el proceso de detectar valores atípicos de datos de series
temporales, puntos en determinada serie temporal de entrada donde el
comportamiento no es lo que se esperaba o es "extraño".

La detección de anomalías puede ser útil de muchas maneras. Por ejemplo:

Si tiene un automóvil, tal vez desee saber: ¿Es normal la lectura del medidor de gasolina
o tengo una fuga? Si está supervisando el consumo de energía, desearía saber: ¿Hay
una interrupción?

Hay dos tipos de anomalías de series temporales que se pueden detectar:

Los picos indican ráfagas temporales de comportamiento anómalo en el sistema.

Los puntos de cambio indican el inicio de cambios persistentes con el tiempo en


el sistema.

En [Link], los algoritmos de la detección de picos de IID o de la detección de puntos


de cambio de IID son adecuados para los conjuntos de datos independientes y
distribuidos de manera idéntica . Se supone que los datos de entrada son una
secuencia de puntos de datos que se muestrean independientemente de una
distribución fija .

A diferencia de los modelos de los otros tutoriales, las transformaciones del detector de
anomalías de series temporales funcionan directamente en los datos de entrada. El
método [Link]() no necesita datos de entrenamiento para generar la
transformación. Sin embargo, necesita el esquema de datos, que se proporciona
mediante una vista de datos generada a partir de una lista vacía de ProductSalesData .

Analizará los mismos datos de ventas de productos para detectar los picos y los puntos
de cambio. El proceso de modelo de entrenamiento y compilación es el mismo para la
detección de picos y la detección de puntos de cambio. La principal diferencia es el
algoritmo de detección específico que se utiliza.

Detección de picos
El objetivo de la detección de picos es identificar ráfagas repentinas pero temporales
que difieren significativamente de la mayoría de los valores de datos de las series
temporales. Es importante detectar estos elementos, eventos u observaciones poco
frecuentes y sospechosos de manera oportuna con el fin de minimizarlos. El siguiente
enfoque puede utilizarse para detectar una variedad de anomalías, como interrupciones,
ciberataques o contenido web viral. La siguiente imagen es un ejemplo de los picos de
un conjunto de datos de serie temporal:
Agregar el método CreateEmptyDataView()
Agregue el método siguiente a [Link] :

C#

IDataView CreateEmptyDataView(MLContext mlContext) {


// Create empty DataView. We just need the schema to call Fit() for the
time series transforms
IEnumerable<ProductSalesData> enumerableData = new
List<ProductSalesData>();
return [Link](enumerableData);
}

CreateEmptyDataView() genera un objeto de vista de datos vacío con el esquema

correcto que se va a usar como entrada para el método [Link]() .

Crear el método DetectSpike()


El método DetectSpike() realiza las acciones siguientes:

Crea la transformación desde el estimador.


Detecta picos en función de los datos históricos de ventas.
Muestra los resultados.

1. Cree el método DetectSpike() al final del archivo [Link] con el código


siguiente:

C#
DetectSpike(MLContext mlContext, int docSize, IDataView productSales)
{

2. Use IidSpikeEstimator para entrenar el modelo para la detección de picos.


Agréguelo a un método DetectSpike() en el siguiente código:

C#

var iidSpikeEstimator =
[Link](outputColumnName:
nameof([Link]), inputColumnName:
nameof([Link]), confidence: 95d,
pvalueHistoryLength: docSize / 4);

3. Para crear la transformación de detección de picos, agregue lo que se indica a


continuación como la siguiente línea de código en el método DetectSpike() :

 Sugerencia

Los parámetros confidence y pvalueHistoryLength afectan a cómo se


detectan los picos. confidence determina la sensibilidad del modelo a los
picos. Cuanto menor sea la confianza, más probabilidades hay de que el
algoritmo detecte picos "más pequeños". El parámetro pvalueHistoryLength
define el número de puntos de datos en una ventana deslizante. El valor de
este parámetro suele ser un porcentaje de todo el conjunto de datos. Cuanto
menor sea pvalueHistoryLength , con más rapidez se olvida el modelo de los
picos grandes anteriores.

C#

ITransformer iidSpikeTransform =
[Link](CreateEmptyDataView(mlContext));

4. Agregue la siguiente línea de código para transformar los datos productSales


como la siguiente línea en el método DetectSpike() :

C#

IDataView transformedData = [Link](productSales);


El código anterior usa el método Transform() para hacer predicciones para varias
filas de entrada de un conjunto de datos.

5. Convierta transformedData en IEnumerable fuertemente tipado para mostrar


fácilmente mediante el método CreateEnumerable() con este código:

C#

var predictions =
[Link]<ProductSalesPrediction>
(transformedData, reuseRowObject: false);

6. Cree una línea de encabezado de visualización mediante el código


[Link]() siguiente:

C#

[Link]("Alert\tScore\tP-Value");

Se mostrará la siguiente información en los resultados de detección de picos:

Alert indica una alerta de pico para determinado punto de datos.

Score es el valor ProductSales para determinado punto de datos en el


conjunto de datos.
P-Value La "P" significa probabilidad. Cuanto más se acerque el valor p a 0,
más probable es que el punto de datos sea una anomalía.

7. Use el siguiente código para iterar en predictions IEnumerable y mostrar los


resultados:

C#

foreach (var p in predictions)


{
if ([Link] is not null)
{
var results = $"
{[Link][0]}\t{[Link][1]:f2}\t{[Link][2]:F2}";

if ([Link][0] == 1)
{
results += " <-- Spike detected";
}

[Link](results);
}
}
[Link]("");

8. Agregue la llamada al método DetectSpike() debajo de la llamada al método


LoadFromTextFile() :

C#

DetectSpike(mlContext, _docsize, dataView);

Resultados de la detección de picos


Los resultados deberían ser similares a los indicados a continuación. Durante el
procesamiento, se muestran mensajes. Puede ver las advertencias o mensajes de
procesamiento. Algunos de los mensajes se han quitado de los resultados siguientes
para mayor claridad.

Consola

Detect temporary changes in pattern


=============== Training the model ===============
=============== End of training process ===============
Alert Score P-Value
0 271.00 0.50
0 150.90 0.00
0 188.10 0.41
0 124.30 0.13
0 185.30 0.47
0 173.50 0.47
0 236.80 0.19
0 229.50 0.27
0 197.80 0.48
0 127.90 0.13
1 341.50 0.00 <-- Spike detected
0 190.90 0.48
0 199.30 0.48
0 154.50 0.24
0 215.10 0.42
0 278.30 0.19
0 196.40 0.43
0 292.00 0.17
0 231.00 0.45
0 308.60 0.18
0 294.90 0.19
1 426.60 0.00 <-- Spike detected
0 269.50 0.47
0 347.30 0.21
0 344.70 0.27
0 445.40 0.06
0 320.90 0.49
0 444.30 0.12
0 406.30 0.29
0 442.40 0.21
1 580.50 0.00 <-- Spike detected
0 412.60 0.45
1 687.00 0.01 <-- Spike detected
0 480.30 0.40
0 586.30 0.20
0 651.90 0.14

Detección de puntos de cambio


Change points son cambios permanentes en una distribución de valores de secuencia

de eventos de serie temporal, como los cambios de nivel y las tendencias. Estos cambios
persistentes duran mucho más tiempo que spikes y podrían indicar eventos
catastróficos. Change points no son normalmente visibles a simple vista, pero se pueden
detectar en los datos mediante enfoques como el del siguiente método. La siguiente
imagen es un ejemplo de una detección de puntos de cambio:

Crear el método DetectChangepoint()


El método DetectChangepoint() ejecuta las tareas siguientes:

Crea la transformación desde el estimador.


Detecta puntos de cambio en función de los datos históricos de ventas.
Muestra los resultados.
1. Cree el método DetectChangepoint() , justo después de la declaración del método
DetectSpike() , mediante el código siguiente:

C#

void DetectChangepoint(MLContext mlContext, int docSize, IDataView


productSales)
{

2. Cree iidChangePointEstimator en el método DetectChangepoint() con el código


siguiente:

C#

var iidChangePointEstimator =
[Link](outputColumnName:
nameof([Link]), inputColumnName:
nameof([Link]), confidence: 95d,
changeHistoryLength: docSize / 4);

3. Como hizo anteriormente, cree la transformación desde el estimador agregando la


siguiente línea de código en el método DetectChangePoint() :

 Sugerencia

La detección de puntos de cambio se produce con un ligero retraso, ya que el


modelo debe asegurarse de que la desviación actual es un cambio persistente
y no solo algunos picos aleatorios antes de crear una alerta. La cantidad de
este retraso es igual al parámetro changeHistoryLength . Al aumentar el valor
de este parámetro, la detección de cambios alerta sobre cambios más
persistentes, pero el resultado sería un retraso más largo.

C#

var iidChangePointTransform =
[Link](CreateEmptyDataView(mlContext));

4. Use el método Transform() para transformar los datos mediante la adición del
código siguiente a DetectChangePoint() :

C#
IDataView transformedData =
[Link](productSales);

5. Como hizo antes, convierta transformedData en IEnumerable fuertemente tipado


para mostrar fácilmente mediante el método CreateEnumerable() con este código:

C#

var predictions =
[Link]<ProductSalesPrediction>
(transformedData, reuseRowObject: false);

6. Cree un encabezado de visualización con el siguiente código como la siguiente


línea en el método DetectChangePoint() :

C#

[Link]("Alert\tScore\tP-Value\tMartingale value");

Se mostrará la siguiente información en los resultados de detección de puntos de


cambio:

Alert indica una alerta de punto de cambio para determinado punto de

datos.
Score es el valor ProductSales para determinado punto de datos en el

conjunto de datos.
P-Value La "P" significa probabilidad. Cuanto más se acerque el valor P a 0,
más probable es que el punto de datos sea una anomalía.
Martingale value se usa para identificar cuán "extraño" es un punto de
datos, en función de la secuencia de valores de P.

7. Itere en predictions IEnumerable y muestre los resultados con el siguiente código:

C#

foreach (var p in predictions)


{
if ([Link] is not null)
{
var results = $"
{[Link][0]}\t{[Link][1]:f2}\t{[Link][2]:F2}\t{[Link]
ction[3]:F2}";

if ([Link][0] == 1)
{
results += " <-- alert is on, predicted changepoint";
}
[Link](results);
}
}
[Link]("");

8. Agregue la siguiente llamada al método DetectChangepoint() después de la


llamada al método DetectSpike() :

C#

DetectChangepoint(mlContext, _docsize, dataView);

Resultados de la detección de puntos de


cambio
Los resultados deberían ser similares a los indicados a continuación. Durante el
procesamiento, se muestran mensajes. Puede ver las advertencias o mensajes de
procesamiento. Algunos de los mensajes se han quitado de los resultados siguientes
para mayor claridad.

Consola

Detect Persistent changes in pattern


=============== Training the model Using Change Point Detection
Algorithm===============
=============== End of training process ===============
Alert Score P-Value Martingale value
0 271.00 0.50 0.00
0 150.90 0.00 2.33
0 188.10 0.41 2.80
0 124.30 0.13 9.16
0 185.30 0.47 9.77
0 173.50 0.47 10.41
0 236.80 0.19 24.46
0 229.50 0.27 42.38
1 197.80 0.48 44.23 <-- alert is on, predicted changepoint
0 127.90 0.13 145.25
0 341.50 0.00 0.01
0 190.90 0.48 0.01
0 199.30 0.48 0.00
0 154.50 0.24 0.00
0 215.10 0.42 0.00
0 278.30 0.19 0.00
0 196.40 0.43 0.00
0 292.00 0.17 0.01
0 231.00 0.45 0.00
0 308.60 0.18 0.00
0 294.90 0.19 0.00
0 426.60 0.00 0.00
0 269.50 0.47 0.00
0 347.30 0.21 0.00
0 344.70 0.27 0.00
0 445.40 0.06 0.02
0 320.90 0.49 0.01
0 444.30 0.12 0.02
0 406.30 0.29 0.01
0 442.40 0.21 0.01
0 580.50 0.00 0.01
0 412.60 0.45 0.01
0 687.00 0.01 0.12
0 480.30 0.40 0.08
0 586.30 0.20 0.03
0 651.90 0.14 0.09

¡Enhorabuena! Ya ha creado correctamente los modelos de aprendizaje automático para


detectar anomalías de picos y puntos de cambio en los datos de ventas.

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

En este tutorial ha aprendido a:

" Carga de los datos


" Entrenar el modelo para la detección de anomalías de picos
" Detectar anomalías de picos con el modelo entrenado
" Entrenar el modelo para la detección de anomalías de puntos de cambio
" Detectar anomalías de puntos de cambio con el modelo entrenado

Pasos siguientes
Consulte el repositorio de GitHub con ejemplos de Machine Learning para explorar un
ejemplo de detección de anomalías de datos de estacionalidad.

Repositorio dotnet/machinelearning-samples de GitHub


Tutorial: Detección de objetos con
ONNX en [Link]
Artículo • 05/06/2023

Aprenda a usar en [Link] un modelo ONNX previamente entrenado para detectar


objetos en imágenes.

Entrenar un modelo de detección de objetos desde cero requiere establecer millones de


parámetros, una enorme cantidad de datos de aprendizaje etiquetados y una gran
cantidad de recursos informáticos (cientos de horas de GPU). El uso de un modelo
entrenado previamente le permite abreviar el proceso de entrenamiento.

En este tutorial aprenderá a:

" Entender el problema
" Conocer qué es ONNX y cómo funciona con [Link]
" Entender el modelo
" Volver a usar el modelo entrenado previamente
" Detectar objetos con un modelo cargado

Requisitos previos
Visual Studio 2022 .
Paquete NuGet de [Link]
Paquete NuGet de [Link]
Paquete NuGet de [Link]
Modelo previamente entrenado de Tiny YOLOv2
Netron (opcional)

Información general del ejemplo de detección


de objetos de ONNX
En este ejemplo se crea una aplicación de consola de .NET Core que detecta objetos
dentro de una imagen mediante un modelo de aprendizaje profundo de ONNX
previamente entrenado. El código de este ejemplo se puede encontrar en el repositorio
dotnet/machinelearning-samples en GitHub.

¿Qué es la detección de objetos?


La detección de objetos es un problema de visión informática. Si bien está
estrechamente relacionada con la clasificación de imágenes, la detección de objetos
realiza la clasificación de imágenes a una escala más granular. La detección de objetos
ubica y categoriza entidades dentro de las imágenes. Los modelos de detección de
objetos se entrenan normalmente mediante el aprendizaje profundo y las redes
neuronales. Consulte Aprendizaje profundo frente a aprendizaje automático para
obtener más información.

Use la detección de objetos cuando las imágenes contengan varios objetos de tipos
diferentes.

Entre algunos casos de uso para la detección de objetos se incluyen:

Automóviles sin conductor


Robótica
Detección facial
Seguridad en el lugar de trabajo
Recuento de objetos
Reconocimiento de actividades

Selección de un modelo de aprendizaje


profundo
El aprendizaje profundo es un subconjunto del aprendizaje automático. Para entrenar
modelos de aprendizaje profundo, se necesitan grandes cantidades de datos. Los
patrones de los datos se representan mediante una serie de capas. Las relaciones de los
datos se codifican como conexiones entre las capas, que contienen ponderaciones.
Cuanto mayor sea la ponderación, más fuerte será la relación. En conjunto, esta serie de
capas y conexiones se conocen como redes neuronales artificiales. Cuantas más capas
haya en una red, "más profunda" será, lo que la convierte en una red neuronal profunda.

Hay diferentes tipos de redes neuronales, las más comunes son perceptrón multicapa
(MLP), red neuronal circunvolucional (CNN) y red neuronal recurrente (RNN). La más
básica es MLP, que asigna un conjunto de entradas a un conjunto de salidas. Esta red
neuronal es la adecuada cuando los datos no tienen un componente espacial ni
temporal. CNN aprovecha las capas circunvolucionales para procesar la información
espacial contenida en los datos. Un buen caso de uso de las CNN es el procesamiento
de imágenes para detectar la presencia de una característica en una región de una
imagen (por ejemplo, ¿hay una nariz en el centro de una imagen?). Por último, las RNN
permiten la persistencia del estado o la memoria que se va a usar como entrada. Las
RNN se usan para el análisis de series temporales, donde la ordenación secuencial y el
contexto de eventos son importantes.

Entender el modelo
La detección de objetos es una tarea de procesamiento de imágenes. Por lo tanto, la
mayoría de los modelos de aprendizaje profundo entrenados para solucionar este
problema son CNN. El modelo que se usa en este tutorial es el Tiny YOLOv2, una versión
más compacta del modelo YOLOv2 que se describe en el documento: "YOLO9000:
Better, Faster, Stronger" de Redmon y Farhadi . Tiny YOLOv2 se entrena en el conjunto
de datos Pascal VOC y se compone de 15 capas que pueden predecir 20 clases
diferentes de objetos. Dado que Tiny YOLOv2 es una versión comprimida del modelo
YOLOv2 original, se logra velocidad a cambio de precisión. Los diferentes niveles que
componen el modelo se pueden visualizar mediante herramientas como Netron. Al
inspeccionar el modelo, se produciría una asignación de las conexiones entre todas las
capas que componen la red neuronal, donde cada capa contendría el nombre de la
capa, junto con las dimensiones de la entrada y la salida correspondientes. Las
estructuras de datos que se usan para describir las entradas y salidas del modelo se
conocen como tensores. Los tensores se pueden considerar como contenedores que
almacenan datos en N dimensiones. En el caso de Tiny YOLOv2, el nombre de la capa de
entrada es image y espera un tensor de dimensiones 3 x 416 x 416 . El nombre de la
capa de salida es grid y genera un tensor de salida de dimensiones 125 x 13 x 13 .
El modelo YOLO toma una imagen 3(RGB) x 416px x 416px . El modelo toma esta
entrada y la pasa a través de las diferentes capas para generar una salida. El resultado
divide la imagen de entrada en una cuadrícula de 13 x 13 , y cada celda de la cuadrícula
consta de 125 valores.

¿Qué es un modelo de ONNX?


Open Neural Network Exchange (ONNX) es un formato de código abierto para los
modelos de IA. ONNX admite la interoperabilidad entre marcos. Esto significa que
puede entrenar un modelo en uno de los muchos marcos de aprendizaje automático
populares, como PyTorch, convertirlo en formato ONNX y consumir el modelo ONNX en
otro marco, como [Link]. Para más información, visite el sitio web de ONNX .
El modelo Tiny YOLOv2 entrenado previamente se almacena en formato ONNX, una
representación serializada de las capas y los patrones aprendidos de esas capas. En
[Link], la interoperabilidad con ONNX se logra con los paquetes NuGet
ImageAnalytics y OnnxTransformer. El paquete ImageAnalytics contiene una serie de
transformaciones que toman una imagen y la codifican en valores numéricos que se
pueden usar como entrada en una canalización de entrenamiento o de predicción. El
paquete OnnxTransformer aprovecha el tiempo de ejecución de ONNX para cargar un
modelo de ONNX y usarlo para hacer predicciones basadas en la entrada
proporcionada.

Configuración del proyecto de consola de .NET


Ahora que tiene un conocimiento general de lo que es ONNX y de cómo funciona Tiny
YOLOv2, es el momento de compilar la aplicación.
Creación de una aplicación de consola
1. Cree una aplicación de consola en C# llamada "ObjectDetection". Haga clic en el
botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.

3. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en


Administrar paquetes NuGet.
Elija "[Link]" como origen del paquete, seleccione la pestaña Examinar y
busque [Link].
Seleccione el botón Instalar.
Seleccione el botón Aceptar en el cuadro de diálogo Vista previa de cambios
y, a continuación, seleccione el botón Acepto del cuadro de diálogo
Aceptación de la licencia en caso de que esté de acuerdo con los términos
de licencia de los paquetes mostrados.
Repita estos pasos para [Link],
[Link], [Link] y
[Link].

Preparar los datos y el modelo entrenado previamente


1. Descargue el archivo ZIP del directorio de recursos del proyecto y
descomprímalo.

2. Copie el directorio assets en el directorio de proyecto ObjectDetection. Este


directorio y sus subdirectorios contienen los archivos de imagen (excepto los del
modelo de Tiny YOLOv2, que descargará y agregará en el paso siguiente) que se
necesitan en este tutorial.

3. Descargue el modelo de Tiny YOLOv2 de ONNX Model Zoo .

4. Copie el archivo [Link] en el directorio assets\Model del proyecto


ObjectDetection y cámbiele el nombre a TinyYolo2_model.onnx . Este directorio
contiene el modelo necesario para este tutorial.

5. En el Explorador de soluciones, haga clic con el botón derecho en cada uno de los
archivos del directorio de recursos y los subdirectorios y seleccione Propiedades.
En Avanzadas, cambie el valor de Copiar en el directorio de salida por Copiar si es
posterior.

Crear clases y definir rutas de acceso


Abra el [Link] y agregue las instrucciones using adicionales siguientes a la
parte superior del archivo:

C#

using [Link];
using [Link].Drawing2D;
using [Link];
using [Link];
using ObjectDetection;
using [Link];

A continuación, defina las rutas de acceso de los distintos recursos.

1. Primero, cree el método GetAbsolutePath al final del archivo [Link].

C#

string GetAbsolutePath(string relativePath)


{
FileInfo _dataRoot = new
FileInfo(typeof(Program).[Link]);
string assemblyFolderPath = _dataRoot.[Link];

string fullPath = [Link](assemblyFolderPath, relativePath);

return fullPath;
}

2. A continuación, debajo de las instrucciones using, cree campos para almacenar la


ubicación de los recursos.

C#

var assetsRelativePath = @"../../../assets";


string assetsPath = GetAbsolutePath(assetsRelativePath);
var modelFilePath = [Link](assetsPath, "Model",
"TinyYolo2_model.onnx");
var imagesFolder = [Link](assetsPath, "images");
var outputFolder = [Link](assetsPath, "images", "output");

Agregue un nuevo directorio al proyecto para almacenar los datos de entrada y las
clases de predicción.

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, luego,


seleccione Agregar>Nueva carpeta. Cuando la nueva carpeta aparezca en el Explorador
de soluciones, asígnele el nombre "DataStructures".

Cree la clase de datos de entrada en el directorio DataStructures recién creado.

1. En el Explorador de soluciones, haga clic con el botón derecho en el directorio


DataStructures y luego seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

El archivo [Link] se abre en el editor de código. Agregue la instrucción


using siguiente al principio del archivo [Link]:

C#

using [Link];
using [Link];
using [Link];
using [Link];

Quite la definición de clase existente y agregue el código siguiente para la clase


ImageNetData al archivo [Link]:

C#

public class ImageNetData


{
[LoadColumn(0)]
public string ImagePath;

[LoadColumn(1)]
public string Label;

public static IEnumerable<ImageNetData> ReadFromFile(string


imageFolder)
{
return Directory
.GetFiles(imageFolder)
.Where(filePath => [Link](filePath) != ".md")
.Select(filePath => new ImageNetData { ImagePath =
filePath, Label = [Link](filePath) });
}
}

ImageNetData es la clase de datos de imagen de entrada y tiene los campos String

siguientes:

ImagePath contiene la ruta de acceso donde se almacena la imagen.

Label contiene el nombre del archivo.

Además, ImageNetData contiene un método ReadFromFile que carga varios


archivos de imagen almacenados en la ruta imageFolder especificada y los
devuelve como una colección de objetos ImageNetData .

Cree la clase de predicción en el directorio DataStructures.

1. En el Explorador de soluciones, haga clic con el botón derecho en el directorio


DataStructures y luego seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

El archivo [Link] se abre en el editor de código. Agregue la


instrucción using siguiente al principio del archivo [Link]:

C#

using [Link];

Quite la definición de clase existente y agregue el código siguiente para la clase


ImageNetPrediction al archivo [Link]:

C#

public class ImageNetPrediction


{
[ColumnName("grid")]
public float[] PredictedLabels;
}

ImageNetPrediction es la clase de datos de predicción y tiene el campo float[]

siguiente:
PredictedLabels contiene las dimensiones, la puntuación de calidad de

objeto y las probabilidades de clase para cada uno de los cuadros de límite
detectados en una imagen.

Inicialización de variables
La clase MLContext es un punto de partida para todas las operaciones de [Link]. Al
inicializar mlContext , se crea un entorno de [Link] que se puede compartir entre los
objetos del flujo de trabajo de creación de modelos. Como concepto, se parece a
DBContext en Entity Framework.

Inicialice la variable mlContext con una instancia nueva de MLContext mediante la


incorporación de la línea siguiente debajo del método outputFolder .

C#

MLContext mlContext = new MLContext();

Crear un analizador para el procesamiento


posterior de las salidas del modelo
El modelo segmenta una imagen en una cuadrícula 13 x 13 , donde cada celda de la
cuadrícula mide 32px x 32px . Cada celda de la cuadrícula contiene 5 rectángulos
delimitadores de objeto posibles. Un rectángulo delimitador tiene 25 elementos:

x , posición x del centro del rectángulo delimitador relativo a la celda de la

cuadrícula a la que está asociada.


y , posición y del centro del rectángulo delimitador relativo a la celda de la

cuadrícula a la que está asociada.


w , ancho del rectángulo delimitador.

h , altura del rectángulo delimitador.


o , valor de confianza de que existe un objeto dentro del rectángulo delimitador,

también conocido como puntuación de calidad de objeto.


p1-p20 , probabilidades de clase para cada una de las 20 clases previstas por el
modelo.

En total, los 25 elementos que describen cada uno de los 5 rectángulos delimitadores
constituyen los 125 elementos contenidos en cada celda de la cuadrícula.

La salida generada por el modelo ONNX entrenado previamente es una matriz float de
longitud 21125 , que representa los elementos de un tensor con dimensiones 125 x 13 x
13 . Para transformar las predicciones generadas por el modelo en un tensor, se requiere

algún trabajo posterior al procesamiento. Para ello, cree un conjunto de clases que
ayuden a analizar la salida.

Agregue un nuevo directorio al proyecto para organizar el conjunto de clases de


analizador.

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y,


luego, seleccione Agregar>Nueva carpeta. Cuando la nueva carpeta aparezca en
el Explorador de soluciones, asígnele el nombre "YoloParser".

Crear rectángulos delimitadores y dimensiones


La salida de datos del modelo contiene las coordenadas y las dimensiones de los
rectángulos delimitadores de los objetos dentro de la imagen. Cree una clase base para
las dimensiones.

1. En el Explorador de soluciones, haga clic con el botón derecho en el directorio


YoloParser y luego seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

Se abre el archivo [Link] en el editor de código. Quite todas las


instrucciones using y la definición de clase existente.

Agregue el código siguiente para la clase DimensionsBase al archivo


[Link]:
C#

public class DimensionsBase


{
public float X { get; set; }
public float Y { get; set; }
public float Height { get; set; }
public float Width { get; set; }
}

DimensionsBase tiene las siguientes propiedades float :

X contiene la posición del objeto en el eje x.

Y contiene la posición del objeto en el eje y.


Height contiene la altura del objeto.

Width contiene el ancho del objeto.

A continuación, cree una clase para los rectángulos delimitadores.

1. En el Explorador de soluciones, haga clic con el botón derecho en el directorio


YoloParser y luego seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

Se abre el archivo [Link] en el editor de código. Agregue la


instrucción using siguiente al principio del archivo [Link]:

C#

using [Link];

Justo encima de la definición de clase existente, agregue una nueva definición de


clase denominada BoundingBoxDimensions que herede de la clase DimensionsBase
para que contenga las dimensiones del rectángulo delimitador correspondiente.

C#

public class BoundingBoxDimensions : DimensionsBase { }

Quite la definición de clase YoloBoundingBox existente y agregue el código


siguiente para la clase YoloBoundingBox al archivo [Link]:
C#

public class YoloBoundingBox


{
public BoundingBoxDimensions Dimensions { get; set; }

public string Label { get; set; }

public float Confidence { get; set; }

public RectangleF Rect


{
get { return new RectangleF(Dimensions.X, Dimensions.Y,
[Link], [Link]); }
}

public Color BoxColor { get; set; }


}

YoloBoundingBox tiene las siguientes propiedades:

Dimensions contiene las dimensiones del rectángulo delimitador.

Label contiene la clase de objeto detectado en el rectángulo delimitador.


Confidence contiene la confianza de la clase.

Rect contiene la representación del rectángulo de las dimensiones del


rectángulo delimitador.
BoxColor contiene el color asociado a la clase correspondiente usada para

dibujar en la imagen.

Crear el analizador
Ahora que se han creado las clases para las dimensiones y los rectángulos
delimitadores, es el momento de crear el analizador.

1. En el Explorador de soluciones, haga clic con el botón derecho en el directorio


YoloParser y luego seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

Se abre el archivo [Link] en el editor de código. Agregue la


instrucción using siguiente al principio del archivo [Link]:

C#
using System;
using [Link];
using [Link];
using [Link];

Dentro de la definición de clase YoloOutputParser existente, agregue una clase


anidada que contenga las dimensiones de cada una de las celdas de la imagen.
Agregue el código siguiente para la clase CellDimensions que hereda de la clase
DimensionsBase en la parte superior de la definición de la clase YoloOutputParser .

C#

class CellDimensions : DimensionsBase { }

3. Dentro de la definición de la clase YoloOutputParser , agregue la constante y los


campos siguientes.

C#

public const int ROW_COUNT = 13;


public const int COL_COUNT = 13;
public const int CHANNEL_COUNT = 125;
public const int BOXES_PER_CELL = 5;
public const int BOX_INFO_FEATURE_COUNT = 5;
public const int CLASS_COUNT = 20;
public const float CELL_WIDTH = 32;
public const float CELL_HEIGHT = 32;

private int channelStride = ROW_COUNT * COL_COUNT;

ROW_COUNT es el número de filas de la cuadrícula en la que se divide la

imagen.
COL_COUNT es el número de columnas de la cuadrícula en la que se divide la
imagen.
CHANNEL_COUNT es el número total de valores contenidos en una celda de la
cuadrícula.
BOXES_PER_CELL es el número de rectángulos delimitadores de una celda.
BOX_INFO_FEATURE_COUNT es el número de características contenidas en un

rectángulo (x,y,altura,ancho,confianza).
CLASS_COUNT es el número de predicciones de clase que contiene cada
rectángulo delimitador.
CELL_WIDTH es el ancho de una celda de la cuadrícula de imagen.
CELL_HEIGHT es la altura de una celda de la cuadrícula de imagen.
channelStride es la posición inicial de la celda actual en la cuadrícula.

Cuando el modelo realiza una predicción, también conocida como puntuación,


divide la imagen de entrada 416px x 416px en una cuadrícula de celdas del
tamaño de 13 x 13 . El contenido de cada celda mide 32px x 32px . Dentro de cada
celda, hay 5 rectángulos delimitadores, donde cada uno contiene 5 características
(x,y,ancho,altura,confianza). Además, cada rectángulo delimitador contiene la
probabilidad de cada una de las clases, que, en este caso, es 20. Por lo tanto, cada
celda contiene 125 piezas de información (5 características + 20 probabilidades de
clase).

Cree una lista de delimitadores a continuación de channelStride para los 5 rectángulos


delimitadores:

C#

private float[] anchors = new float[]


{
1.08F, 1.19F, 3.42F, 4.41F, 6.63F, 11.38F, 9.42F, 5.11F, 16.62F, 10.52F
};

Los delimitadores son proporciones predefinidas de altura y ancho de los rectángulos


delimitadores. La mayoría de los objetos o clases detectados por un modelo tienen
relaciones similares. Esto resulta útil cuando se trata de crear rectángulos delimitadores.
En lugar de predecir los rectángulos delimitadores, se calcula el desplazamiento de las
dimensiones predefinidas; por lo que se reducen los cálculos necesarios para predecir el
rectángulo delimitador. Normalmente, estas proporciones de delimitador se calculan en
función del conjunto de datos usado. En este caso, dado que el conjunto de datos es
conocido y los valores se han calculado previamente, los delimitadores se pueden
codificar de forma rígida.

A continuación, defina las etiquetas o clases que el modelo predecirá. Este modelo
predice 20 clases, que es un subconjunto del número total de clases que predice el
modelo de YOLOv2 original.

Agregue la lista de etiquetas debajo de anchors .

C#

private string[] labels = new string[]


{
"aeroplane", "bicycle", "bird", "boat", "bottle",
"bus", "car", "cat", "chair", "cow",
"diningtable", "dog", "horse", "motorbike", "person",
"pottedplant", "sheep", "sofa", "train", "tvmonitor"
};

Hay colores asociados a cada una de las clases. Asigne los colores de clase debajo de
labels :

C#

private static Color[] classColors = new Color[]


{
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link],
[Link]
};

Crear funciones auxiliares


La fase posterior al procesamiento implica una serie de pasos. Para ayudar con esto, se
pueden emplear varios métodos auxiliares.

Los métodos auxiliares que usa el analizador son los siguientes:

Sigmoid aplica la función sigmoidea que da como resultado un número entre 0 y

1.
Softmax normaliza un vector de entrada en una distribución de probabilidad.
GetOffset asigna los elementos de la salida del modelo unidimensional a la

posición correspondiente en un tensor de 125 x 13 x 13 .


ExtractBoundingBoxes extrae las dimensiones del rectángulo delimitador mediante

el método GetOffset de la salida del modelo.


GetConfidence extrae el valor de confianza que indica cómo de seguro está el

modelo de que ha detectado un objeto y usa la función Sigmoid para convertirlo


en porcentaje.
MapBoundingBoxToCell usa las dimensiones del rectángulo delimitador y las asigna
a su celda correspondiente dentro de la imagen.
ExtractClasses extrae las predicciones de clase para el rectángulo delimitador de

la salida del modelo usando el método GetOffset y las convierte en una


distribución de probabilidad mediante el método Softmax .
GetTopResult selecciona la clase de la lista de clases predichas con la probabilidad
más alta.
IntersectionOverUnion filtra los rectángulos delimitadores superpuestos con

probabilidades más bajas.

Agregue el código para todos los métodos auxiliares debajo de la lista de classColors .

C#

private float Sigmoid(float value)


{
var k = (float)[Link](value);
return k / (1.0f + k);
}

private float[] Softmax(float[] values)


{
var maxVal = [Link]();
var exp = [Link](v => [Link](v - maxVal));
var sumExp = [Link]();

return [Link](v => (float)(v / sumExp)).ToArray();


}

private int GetOffset(int x, int y, int channel)


{
// YOLO outputs a tensor that has a shape of 125x13x13, which
// WinML flattens into a 1D array. To access a specific channel
// for a given (x,y) cell position, we need to calculate an offset
// into the array
return (channel * [Link]) + (y * COL_COUNT) + x;
}

private BoundingBoxDimensions ExtractBoundingBoxDimensions(float[]


modelOutput, int x, int y, int channel)
{
return new BoundingBoxDimensions
{
X = modelOutput[GetOffset(x, y, channel)],
Y = modelOutput[GetOffset(x, y, channel + 1)],
Width = modelOutput[GetOffset(x, y, channel + 2)],
Height = modelOutput[GetOffset(x, y, channel + 3)]
};
}

private float GetConfidence(float[] modelOutput, int x, int y, int channel)


{
return Sigmoid(modelOutput[GetOffset(x, y, channel + 4)]);
}

private CellDimensions MapBoundingBoxToCell(int x, int y, int box,


BoundingBoxDimensions boxDimensions)
{
return new CellDimensions
{
X = ((float)x + Sigmoid(boxDimensions.X)) * CELL_WIDTH,
Y = ((float)y + Sigmoid(boxDimensions.Y)) * CELL_HEIGHT,
Width = (float)[Link]([Link]) * CELL_WIDTH *
anchors[box * 2],
Height = (float)[Link]([Link]) * CELL_HEIGHT *
anchors[box * 2 + 1],
};
}

public float[] ExtractClasses(float[] modelOutput, int x, int y, int


channel)
{
float[] predictedClasses = new float[CLASS_COUNT];
int predictedClassOffset = channel + BOX_INFO_FEATURE_COUNT;
for (int predictedClass = 0; predictedClass < CLASS_COUNT;
predictedClass++)
{
predictedClasses[predictedClass] = modelOutput[GetOffset(x, y,
predictedClass + predictedClassOffset)];
}
return Softmax(predictedClasses);
}

private ValueTuple<int, float> GetTopResult(float[] predictedClasses)


{
return predictedClasses
.Select((predictedClass, index) => (Index: index, Value:
predictedClass))
.OrderByDescending(result => [Link])
.First();
}

private float IntersectionOverUnion(RectangleF boundingBoxA, RectangleF


boundingBoxB)
{
var areaA = [Link] * [Link];

if (areaA <= 0)
return 0;

var areaB = [Link] * [Link];


if (areaB <= 0)
return 0;

var minX = [Link]([Link], [Link]);


var minY = [Link]([Link], [Link]);
var maxX = [Link]([Link], [Link]);
var maxY = [Link]([Link], [Link]);

var intersectionArea = [Link](maxY - minY, 0) * [Link](maxX - minX,


0);

return intersectionArea / (areaA + areaB - intersectionArea);


}

Una vez que haya definido todos los métodos auxiliares, es el momento de usarlos para
procesar la salida del modelo.

Debajo del método IntersectionOverUnion , cree el método ParseOutputs para procesar


la salida generada por el modelo.

C#

public IList<YoloBoundingBox> ParseOutputs(float[] yoloModelOutputs, float


threshold = .3F)
{

Cree una lista para almacenar los rectángulos delimitadores y defina las variables dentro
del método ParseOutputs .

C#

var boxes = new List<YoloBoundingBox>();

Cada imagen se divide en una cuadrícula de 13 x 13 celdas. Cada celda contiene cinco
rectángulos delimitadores. Debajo de la variable boxes , agregue código para procesar
todos los rectángulos de cada una de las celdas.

C#

for (int row = 0; row < ROW_COUNT; row++)


{
for (int column = 0; column < COL_COUNT; column++)
{
for (int box = 0; box < BOXES_PER_CELL; box++)
{
}
}
}

Dentro del bucle más interno, calcule la posición inicial del rectángulo actual dentro de
la salida del modelo unidimensional.

C#

var channel = (box * (CLASS_COUNT + BOX_INFO_FEATURE_COUNT));

Justo debajo de eso, use el método ExtractBoundingBoxDimensions para obtener las


dimensiones del rectángulo delimitador actual.

C#

BoundingBoxDimensions boundingBoxDimensions =
ExtractBoundingBoxDimensions(yoloModelOutputs, row, column, channel);

Luego, use el método GetConfidence para obtener la confianza del rectángulo


delimitador actual.

C#

float confidence = GetConfidence(yoloModelOutputs, row, column, channel);

Después de eso, use el método MapBoundingBoxToCell para asignar el rectángulo


delimitador actual a la celda actual que se está procesando.

C#

CellDimensions mappedBoundingBox = MapBoundingBoxToCell(row, column, box,


boundingBoxDimensions);

Antes de realizar cualquier procesamiento adicional, compruebe si el valor de confianza


es mayor que el umbral proporcionado. Si no es así, procese el siguiente rectángulo
delimitador.

C#

if (confidence < threshold)


continue;
De lo contrario, continúe procesando la salida. El paso siguiente consiste en obtener la
distribución de probabilidad de las clases previstas para el rectángulo delimitador actual
mediante el método ExtractClasses .

C#

float[] predictedClasses = ExtractClasses(yoloModelOutputs, row, column,


channel);

A continuación, use el método GetTopResult para obtener el valor y el índice de la clase


con la probabilidad más alta para el rectángulo actual y calcular su puntuación.

C#

var (topResultIndex, topResultScore) = GetTopResult(predictedClasses);


var topScore = topResultScore * confidence;

Use topScore para conservar una vez más solo aquellos rectángulos delimitadores que
estén por encima del umbral especificado.

C#

if (topScore < threshold)


continue;

Por último, si el rectángulo delimitador actual supera el umbral, cree un nuevo objeto
BoundingBox y agréguelo a la lista boxes .

C#

[Link](new YoloBoundingBox()
{
Dimensions = new BoundingBoxDimensions
{
X = (mappedBoundingBox.X - [Link] / 2),
Y = (mappedBoundingBox.Y - [Link] / 2),
Width = [Link],
Height = [Link],
},
Confidence = topScore,
Label = labels[topResultIndex],
BoxColor = classColors[topResultIndex]
});

Una vez que se hayan procesado todas las celdas de la imagen, devuelva la lista boxes .
Agregue la siguiente instrucción return debajo del bucle for más exterior en el método
ParseOutputs .

C#

return boxes;

Filtrar los rectángulos superpuestos


Ahora que todos los rectángulos delimitadores de gran confianza se han extraído de la
salida del modelo, es necesario realizar un filtrado adicional para quitar las imágenes
superpuestas. Agregue un método denominado FilterBoundingBoxes debajo del
método ParseOutputs :

C#

public IList<YoloBoundingBox> FilterBoundingBoxes(IList<YoloBoundingBox>


boxes, int limit, float threshold)
{

Dentro del método FilterBoundingBoxes , empiece por crear una matriz igual al tamaño
de los rectángulos detectados, y marque todas las ranuras como activas o listas para su
procesamiento.

C#

var activeCount = [Link];


var isActiveBoxes = new bool[[Link]];

for (int i = 0; i < [Link]; i++)


isActiveBoxes[i] = true;

Después, ordene la lista que contiene los rectángulos delimitadores en orden


descendente en función de la confianza.

C#

var sortedBoxes = [Link]((b, i) => new { Box = b, Index = i })


.OrderByDescending(b => [Link])
.ToList();

Luego de eso, cree una lista que contenga los resultados filtrados.
C#

var results = new List<YoloBoundingBox>();

Comience a procesar cada rectángulo delimitador iterando cada uno de los rectángulos
delimitadores.

C#

for (int i = 0; i < [Link]; i++)


{

Dentro de este bucle for, compruebe si se puede procesar el rectángulo delimitador


actual.

C#

if (isActiveBoxes[i])
{

Si es así, agregue el rectángulo delimitador a la lista de resultados. Si los resultados


superan el límite de rectángulos especificado que se van a extraer, interrumpa el bucle.
Agregue el código siguiente dentro de la instrucción if.

C#

var boxA = sortedBoxes[i].Box;


[Link](boxA);

if ([Link] >= limit)


break;

De lo contrario, fíjese en los rectángulos delimitadores adyacentes. Agregue el código


siguiente debajo de la comprobación del límite del rectángulo.

C#

for (var j = i + 1; j < [Link]; j++)


{

}
Al igual que el primer rectángulo, si el rectángulo adyacente está activo o listo para
procesarse, use el método IntersectionOverUnion para comprobar si el primer
rectángulo y el segundo rectángulo superan el umbral especificado. Agregue el código
siguiente a su bucle for más interno.

C#

if (isActiveBoxes[j])
{
var boxB = sortedBoxes[j].Box;

if (IntersectionOverUnion([Link], [Link]) > threshold)


{
isActiveBoxes[j] = false;
activeCount--;

if (activeCount <= 0)
break;
}
}

Fuera del bucle for más interno que comprueba los rectángulos delimitadores
adyacentes, compruebe si hay rectángulos delimitadores restantes para procesar. En
caso contrario, interrumpa el bucle for externo.

C#

if (activeCount <= 0)
break;

Por último, fuera del bucle for inicial del método FilterBoundingBoxes , devuelva los
resultados:

C#

return results;

Perfecto. Ahora es el momento de usar este código junto con el modelo para la
puntuación.

Uso del modelo para puntuación


Al igual que con el procesamiento posterior, hay algunos pasos en el procedimiento de
puntuación. Para ayudarlo con esto, agregue al proyecto una clase que contendrá la
lógica de puntuación.
1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, a
continuación, seleccione Agregar>Nuevo elemento.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar.

El archivo [Link] se abre en el editor de código. Agregue las


instrucciones using siguientes al principio del archivo [Link]:

C#

using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];

Dentro de la definición de la clase OnnxModelScorer , agregue las variables


siguientes.

C#

private readonly string imagesFolder;


private readonly string modelLocation;
private readonly MLContext mlContext;

private IList<YoloBoundingBox> _boundingBoxes = new


List<YoloBoundingBox>();

Justo debajo de eso, cree un constructor para la clase OnnxModelScorer que


inicializará las variables definidas anteriormente.

C#

public OnnxModelScorer(string imagesFolder, string modelLocation,


MLContext mlContext)
{
[Link] = imagesFolder;
[Link] = modelLocation;
[Link] = mlContext;
}

Una vez creado el constructor, defina un par de estructuras que contengan


variables relacionadas con la configuración de la imagen y el modelo. Cree una
estructura denominada ImageNetSettings para que contenga la altura y el ancho
esperados como entrada para el modelo.

C#

public struct ImageNetSettings


{
public const int imageHeight = 416;
public const int imageWidth = 416;
}

Después, cree otra estructura denominada TinyYoloModelSettings que contenga


los nombres de las capas de entrada y salida del modelo. Para visualizar el nombre
de las capas de entrada y salida del modelo, puede usar una herramienta como
Netron.

C#

public struct TinyYoloModelSettings


{
// for checking Tiny yolo2 Model input and output parameter
names,
//you can use tools like Netron,
// which is installed by Visual Studio AI Tools

// input tensor name


public const string ModelInput = "image";

// output tensor name


public const string ModelOutput = "grid";
}

A continuación, cree el primer conjunto de métodos que usará para la puntuación.


Cree el método LoadModel dentro de la clase OnnxModelScorer .

C#

private ITransformer LoadModel(string modelLocation)


{

Dentro del método LoadModel , agregue el código siguiente para el registro.

C#
[Link]("Read model");
[Link]($"Model location: {modelLocation}");
[Link]($"Default parameters: image size=
({[Link]},{[Link]})");

Es necesario que las canalizaciones [Link] conozcan el esquema de datos en el


que van a funcionar cuando se llame al método Fit. En este caso, se usará un
proceso similar al de entrenamiento. Sin embargo, dado que no se está
produciendo ningún entrenamiento real, es aceptable usar un IDataView vacío.
Cree un nuevo IDataView para la canalización a partir de una lista vacía.

C#

var data = [Link](new List<ImageNetData>());

Luego de eso, defina la canalización. La canalización constará de cuatro


transformaciones.

LoadImages carga la imagen como mapa de bits.


ResizeImages cambia la escala de la imagen al tamaño especificado (en este
caso, 416 x 416 ).
ExtractPixels cambia la representación en píxeles de la imagen de un mapa de
bits a un vector numérico.
ApplyOnnxModel carga el modelo de ONNX y lo usa para puntuar los datos
proporcionados.

Defina la canalización en el método LoadModel debajo de la variable data .

C#

var pipeline = [Link](outputColumnName:


"image", imageFolder: "", inputColumnName:
nameof([Link]))

.Append([Link](outputColumnName: "image",
imageWidth: [Link], imageHeight:
[Link], inputColumnName: "image"))

.Append([Link](outputColumnName: "image"))
.Append([Link](modelFile:
modelLocation, outputColumnNames: new[] {
[Link] }, inputColumnNames: new[] {
[Link] }));
Ahora es el momento de crear una instancia del modelo para la puntuación. Llame
al método Fit en la canalización y devuélvalo para seguir procesándolo.

C#

var model = [Link](data);

return model;

Una vez que el modelo esté cargado, podrá usarse para hacer predicciones. Para facilitar
este proceso, cree un método denominado PredictDataUsingModel debajo del método
LoadModel .

C#

private IEnumerable<float[]> PredictDataUsingModel(IDataView testData,


ITransformer model)
{

Dentro de PredictDataUsingModel , agregue el código siguiente para el registro.

C#

[Link]($"Images location: {imagesFolder}");


[Link]("");
[Link]("=====Identify the objects in the images=====");
[Link]("");

A continuación, use el método Transform para puntuar los datos.

C#

IDataView scoredData = [Link](testData);

Extraiga las probabilidades previstas y devuélvalas para su procesamiento adicional.

C#

IEnumerable<float[]> probabilities = [Link]<float[]>


([Link]);

return probabilities;
Ahora que ambos pasos están configurados, combínelos en un único método. Debajo
del método PredictDataUsingModel , agregue un nuevo método denominado Score .

C#

public IEnumerable<float[]> Score(IDataView data)


{
var model = LoadModel(modelLocation);

return PredictDataUsingModel(data, model);


}

Ya casi lo tenemos. Ahora es el momento de ponerlo todo en práctica.

Detectar objetos
Ahora que ha completado toda la configuración, es el momento de detectar algunos
objetos.

Resultados del modelo de puntuación y análisis


Debajo de la creación de la variable mlContext , agregue una instrucción try-catch.

C#

try
{

}
catch (Exception ex)
{
[Link]([Link]());
}

Dentro del bloque try , empiece a implementar la lógica de detección de objetos. En


primer lugar, cargue los datos en un IDataView.

C#

IEnumerable<ImageNetData> images = [Link](imagesFolder);


IDataView imageDataView = [Link](images);

Luego, cree una instancia de OnnxModelScorer y úsela para puntuar los datos cargados.

C#
// Create instance of model scorer
var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath,
mlContext);

// Use model to score data


IEnumerable<float[]> probabilities = [Link](imageDataView);

Ahora es el momento de completar el paso de procesamiento posterior. Cree una


instancia de YoloOutputParser y úsela para procesar la salida del modelo.

C#

YoloOutputParser parser = new YoloOutputParser();

var boundingBoxes =
probabilities
.Select(probability => [Link](probability))
.Select(boxes => [Link](boxes, 5, .5F));

Una vez que se haya procesado la salida del modelo, es el momento de dibujar los
rectángulos delimitadores en las imágenes.

Visualización de predicciones
Una vez que el modelo ha puntuado las imágenes y se han procesado los resultados,
hay que dibujar los rectángulos delimitadores en la imagen. Para ello, agregue un
método denominado DrawBoundingBox debajo del método GetAbsolutePath dentro de
[Link].

C#

void DrawBoundingBox(string inputImageLocation, string outputImageLocation,


string imageName, IList<YoloBoundingBox> filteredBoundingBoxes)
{

En primer lugar, cargue la imagen y obtenga las dimensiones de altura y ancho en el


método DrawBoundingBox .

C#

Image image = [Link]([Link](inputImageLocation, imageName));


var originalImageHeight = [Link];
var originalImageWidth = [Link];

A continuación, cree un bucle for-each para iterar por cada uno de los rectángulos
delimitadores detectados por el modelo.

C#

foreach (var box in filteredBoundingBoxes)


{

Dentro del bucle for-each, obtenga las dimensiones del rectángulo delimitador.

C#

var x = (uint)[Link]([Link].X, 0);


var y = (uint)[Link]([Link].Y, 0);
var width = (uint)[Link](originalImageWidth - x, [Link]);
var height = (uint)[Link](originalImageHeight - y, [Link]);

Dado que las dimensiones del rectángulo delimitador corresponden a la entrada del
modelo de 416 x 416 , escale las dimensiones del rectángulo delimitador para que
coincidan con el tamaño real de la imagen.

C#

x = (uint)originalImageWidth * x /
[Link];
y = (uint)originalImageHeight * y /
[Link];
width = (uint)originalImageWidth * width /
[Link];
height = (uint)originalImageHeight * height /
[Link];

Luego, defina una plantilla para el texto que aparecerá sobre cada rectángulo
delimitador. El texto contendrá la clase del objeto dentro del rectángulo delimitador
correspondiente, así como la confianza.

C#

string text = $"{[Link]} ({([Link] * 100).ToString("0")}%)";

Para dibujar en la imagen, conviértala en un objeto Graphics.


C#

using (Graphics thumbnailGraphic = [Link](image))


{

Dentro del bloque de código using , ajuste la configuración del objeto Graphics del
gráfico.

C#

[Link] = [Link];
[Link] = [Link];
[Link] = [Link];

Luego de eso, establezca las opciones de fuente y color para el texto y el rectángulo
delimitador.

C#

// Define Text Options


Font drawFont = new Font("Arial", 12, [Link]);
SizeF size = [Link](text, drawFont);
SolidBrush fontBrush = new SolidBrush([Link]);
Point atPoint = new Point((int)x, (int)y - (int)[Link] - 1);

// Define BoundingBox options


Pen pen = new Pen([Link], 3.2f);
SolidBrush colorBrush = new SolidBrush([Link]);

Cree y rellene un rectángulo sobre el rectángulo delimitador para que contenga el texto
mediante el método FillRectangle. Esto le ayudará a contrastar el texto y mejorar la
legibilidad.

C#

[Link](colorBrush, (int)x, (int)(y - [Link] -


1), (int)[Link], (int)[Link]);

A continuación, dibuje el texto y el rectángulo delimitador en la imagen con los


métodos DrawString y DrawRectangle.

C#
[Link](text, drawFont, fontBrush, atPoint);

// Draw bounding box on image


[Link](pen, x, y, width, height);

Fuera del bucle for-each, agregue código para guardar las imágenes en outputFolder .

C#

if (![Link](outputImageLocation))
{
[Link](outputImageLocation);
}

[Link]([Link](outputImageLocation, imageName));

Para recibir comentarios adicionales de que la aplicación está haciendo predicciones


según lo esperado en tiempo de ejecución, agregue un método denominado
LogDetectedObjects debajo del método DrawBoundingBox en el archivo [Link] a fin
de generar los objetos detectados en la consola.

C#

void LogDetectedObjects(string imageName, IList<YoloBoundingBox>


boundingBoxes)
{
[Link]($".....The objects in the image {imageName} are
detected as below....");

foreach (var box in boundingBoxes)


{
[Link]($"{[Link]} and its Confidence score:
{[Link]}");
}

[Link]("");
}

Ahora que tiene métodos auxiliares para crear comentarios visuales a partir de las
predicciones, agregue un bucle for para iterar en cada una de las imágenes puntuadas.

C#

for (var i = 0; i < [Link](); i++)


{

}
Dentro del bucle for, obtenga el nombre del archivo de imagen y los rectángulos
delimitadores asociados a él.

C#

string imageFileName = [Link](i).Label;


IList<YoloBoundingBox> detectedObjects = [Link](i);

A continuación, use el método DrawBoundingBox para dibujar los rectángulos


delimitadores en la imagen.

C#

DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects);

Por último, use el método LogDetectedObjects para generar predicciones en la consola.

C#

LogDetectedObjects(imageFileName, detectedObjects);

Después de la instrucción try-catch, agregue lógica adicional para indicar que el proceso
ha terminado de ejecutarse.

C#

[Link]("========= End of Process..Hit any Key ========");

Ya está.

Resultados
Después de seguir los pasos anteriores, ejecute la aplicación de consola (Ctrl + F5). Los
resultados deberían ser similares a la salida siguiente. Es posible que vea advertencias o
mensajes de procesamiento, si bien se han quitado de los resultados siguientes para
mayor claridad.

Consola

=====Identify the objects in the images=====

.....The objects in the image [Link] are detected as below....


car and its Confidence score: 0.9697262
car and its Confidence score: 0.6674225
person and its Confidence score: 0.5226039
car and its Confidence score: 0.5224892
car and its Confidence score: 0.4675332

.....The objects in the image [Link] are detected as below....


cat and its Confidence score: 0.6461141
cat and its Confidence score: 0.6400049

.....The objects in the image [Link] are detected as below....


chair and its Confidence score: 0.840578
chair and its Confidence score: 0.796363
diningtable and its Confidence score: 0.6056048
diningtable and its Confidence score: 0.3737402

.....The objects in the image [Link] are detected as below....


dog and its Confidence score: 0.7608147
person and its Confidence score: 0.6321323
dog and its Confidence score: 0.5967442
person and its Confidence score: 0.5730394
person and its Confidence score: 0.5551759

========= End of Process..Hit any Key ========

Para ver las imágenes con rectángulos delimitadores, desplácese hasta el directorio
assets/images/output/ . A continuación se muestra un ejemplo de una de las imágenes

procesadas.

¡Enhorabuena! Ha creado correctamente un modelo de Machine Learning para la


detección de objetos al reutilizar un modelo de ONNX entrenado previamente en
[Link].

Puede encontrar el código fuente para este tutorial en el repositorio


dotnet/machinelearning-samples .

En este tutorial ha aprendido a:

" Entender el problema
" Conocer qué es ONNX y cómo funciona con [Link]
" Entender el modelo
" Volver a usar el modelo entrenado previamente
" Detectar objetos con un modelo cargado

Consulte el repositorio de GitHub con ejemplos de Machine Learning para explorar un


ejemplo expandido de detección de objetos.

Repositorio dotnet/machinelearning-samples de GitHub


Tutorial: Análisis de la opinión de
reseñas de películas con un modelo de
TensorFlow entrenado previamente en
[Link]
Artículo • 10/05/2023

En este tutorial se muestra cómo usar un modelo de TensorFlow previamente entrenado


para clasificar la opinión en comentarios de sitios Web. El clasificador binario de
opiniones es una aplicación de consola de C# desarrollada con Visual Studio.

El modelo de TensorFlow que se usa en este tutorial se entrenó con reseñas de películas
procedentes de la base de datos de IMDB. Cuando haya terminado de desarrollar la
aplicación, podrá proporcionar el texto de la reseña de la película y la aplicación le
indicará si la reseña tiene una opinión positiva o negativa.

En este tutorial aprenderá a:

" Carga de un modelo de TensorFlow entrenado previamente


" Transformación del texto de comentario del sitio web en características adecuadas
para el modelo
" Uso del modelo para realizar una predicción

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

Requisitos previos
Visual Studio 2022 con la carga de trabajo "Desarrollo de escritorio de .NET"
instalada.

Programa de instalación

Crear la aplicación
1. Cree una aplicación de consola en C# llamada "TextClassificationTF". Haga clic en
el botón Next (Siguiente).

2. Seleccione .NET 6 como marco de trabajo que va a usarse. Haga clic en el botón
Crear.
3. Cree un directorio denominado Datos en el proyecto para guardar los archivos del
conjunto de datos.

4. Instale el paquete NuGet [Link]:

7 Nota

En este ejemplo se usa la versión estable más reciente de los paquetes NuGet
mencionados, a menos que se indique lo contrario.

En el Explorador de soluciones, haga clic con el botón derecho en Administrar


paquetes NuGet. Elija "[Link]" como origen del paquete y luego seleccione la
pestaña Examinar. Busque [Link], seleccione el paquete que desee y luego,
el botón Instalar. Acepte los términos de licencia del paquete que elija para
continuar con la instalación. Repita estos pasos para [Link],
[Link] y [Link].

Adición del modelo TensorFlow al proyecto

7 Nota

El modelo de este tutorial procede del repositorio de GitHub,


dotnet/machinelearning-testdata . El modelo tiene el formato TensorFlow
SavedModel.

1. Descargue el archivo zip sentiment_model y descomprímalo.

El archivo zip contiene:

saved_model.pb : el propio modelo de TensorFlow. El modelo toma una matriz


de enteros de longitud fija (tamaño 600) de características que representan el
texto de una cadena de reseña de IMDB y genera dos probabilidades que
suman 1: la probabilidad de que la reseña de entrada tenga una opinión
positiva y la probabilidad de que la reseña de entrada tenga una opinión
negativa.
imdb_word_index.csv : una asignación de palabras individuales a un valor

entero. La asignación se usa para generar las características de entrada para


el modelo de TensorFlow.

2. Copie el contenido del directorio sentiment_model más interno en el directorio


sentiment_model del proyecto TextClassificationTF. En este directorio está el
modelo y los archivos auxiliares adicionales que se necesitan en este tutorial, tal
como se muestra en la imagen siguiente:

3. En el Explorador de soluciones, haga clic con el botón derecho en cada uno de los
archivos del directorio sentiment_model y los subdirectorios y seleccione
Propiedades. En Avanzadas, cambie el valor de Copiar en el directorio de salida
por Copiar si es posterior.

Adición de instrucciones Using y variables globales


1. Agregue las siguientes instrucciones using adicionales a la parte superior del
archivo [Link]:

C#

using [Link];
using [Link];
using [Link];

2. Cree una variable global justo después de las instrucciones using que contenga la
ruta de acceso del archivo de modelo guardado.

C#

string _modelPath = [Link]([Link],


"sentiment_model");

_modelPath es la ruta de acceso del archivo del modelo entrenado.

Modelado de los datos


Las reseñas de películas son texto de forma libre. La aplicación convierte el texto en el
formato de entrada que el modelo espera en varias fases discretas.
La primera consiste en dividir el texto en palabras independientes y usar el archivo de
asignación proporcionado para asignar cada palabra a una codificación de enteros. El
resultado de esta transformación es una matriz de enteros de longitud variable cuya
longitud corresponde al número de palabras de la oración.

Propiedad. Value Tipo

ReviewText Esta película es realmente buena cadena

VariableLengthFeatures 14,22,9,66,78,... int[]

El tamaño de la matriz de características de longitud variable se cambia a una longitud


fija de 600. Esta es la longitud que espera el modelo de TensorFlow.

Propiedad. Value Tipo

ReviewText Esta película es realmente buena cadena

VariableLengthFeatures 14,22,9,66,78,... int[]

Características 14,22,9,66,78,... int[600]

1. Cree una clase para los datos de entrada en la parte inferior del archivo
[Link]:

C#

/// <summary>
/// Class to hold original sentiment data.
/// </summary>
public class MovieReview
{
public string? ReviewText { get; set; }
}

La clase de datos de entrada, MovieReview , tiene un objeto string para


comentarios de usuario ( ReviewText ).

2. Cree una clase para las características de longitud variable, después de la clase
MovieReview :

C#

/// <summary>
/// Class to hold the variable length feature vector. Used to define
the
/// column names used as input to the custom mapping action.
/// </summary>
public class VariableLength
{
/// <summary>
/// This is a variable length vector designated by VectorType
attribute.
/// Variable length vectors are produced by applying operations
such as 'TokenizeWords' on strings
/// resulting in vectors of tokens of variable lengths.
/// </summary>
[VectorType]
public int[]? VariableLengthFeatures { get; set; }
}

La propiedad VariableLengthFeatures tiene un atributo VectorType para designarla


como vector. Todos los elementos de vector deben ser del mismo tipo. En
conjuntos de datos con un gran número de columnas, la carga de varias columnas
como un único vector reduce el número de pasadas de datos cuando se aplican
transformaciones de datos.

Esta clase se usa en la acción ResizeFeatures . Los nombres de sus propiedades (en
este caso, solo una) se usan para indicar las columnas de DataView que se pueden
usar como entrada de la acción de asignación personalizada.

3. Cree una clase para las características de longitud fija, después de la clase
VariableLength :

C#

/// <summary>
/// Class to hold the fixed length feature vector. Used to define the
/// column names used as output from the custom mapping action,
/// </summary>
public class FixedLength
{
/// <summary>
/// This is a fixed length vector designated by VectorType
attribute.
/// </summary>
[VectorType([Link])]
public int[]? Features { get; set; }
}

Esta clase se usa en la acción ResizeFeatures . Los nombres de sus propiedades (en
este caso, solo una) se usan para indicar las columnas de DataView que se pueden
usar como salida de la acción de asignación personalizada.
Tenga en cuenta que el nombre de la propiedad Features viene determinado por
el modelo de TensorFlow. Este nombre de propiedad no se puede cambiar.

4. Cree una clase para la predicción después de la clase FixedLength :

C#

/// <summary>
/// Class to contain the output values from the transformation.
/// </summary>
public class MovieReviewSentimentPrediction
{
[VectorType(2)]
public float[]? Prediction { get; set; }
}

MovieReviewSentimentPrediction es la clase de predicción que se utiliza tras el


entrenamiento del modelo. MovieReviewSentimentPrediction tiene una sola matriz
float ( Prediction ) y un atributo VectorType .

5. Cree otra clase que contenga valores de configuración, como la longitud del vector
de características:

C#

static class Config


{
public const int FeatureLength = 600;
}

Creación de la clase MLContext, el diccionario de


búsqueda y la acción para cambiar el tamaño de las
características
La clase MLContext es un punto de partida para todas las operaciones de [Link]. La
inicialización de mlContext crea un entorno de [Link] que se puede compartir entre los
objetos del flujo de trabajo de creación de modelos. Como concepto, se parece a
DBContext en Entity Framework.

1. Reemplace la línea [Link]("Hello World!") por el siguiente código


para declarar e inicializar la variable mlContext:

C#
MLContext mlContext = new MLContext();

2. Cree un diccionario para codificar palabras como enteros mediante el método


LoadFromTextFile para cargar los datos de asignación de un archivo, como se
aprecia en la tabla siguiente:

Palabra Índice

niños 362

quiero 181

incorrecto 355

efectos 302

sentimiento 547

Agregue el código siguiente para crear la asignación de búsqueda:

C#

var lookupMap =
[Link]([Link](_modelPath,
"imdb_word_index.csv"),
columns: new[]
{
new [Link]("Words", [Link], 0),
new [Link]("Ids", DataKind.Int32, 1),
},
separatorChar: ','
);

3. Agregue un objeto Action para cambiar el tamaño de la matriz de enteros de


palabras de longitud variable a una matriz de enteros de tamaño fijo, con las
siguientes líneas de código:

C#

Action<VariableLength, FixedLength> ResizeFeaturesAction = (s, f) =>


{
var features = [Link];
[Link](ref features, [Link]);
[Link] = features;
};
Carga del modelo de TensorFlow entrenado
previamente
1. Agregue código para cargar el modelo de TensorFlow:

C#

TensorFlowModel tensorFlowModel =
[Link](_modelPath);

Una vez cargado el modelo, puede extraer su esquema de entrada y de salida. Los
esquemas se muestran solo a efectos de interés y aprendizaje. No necesita este
código para que la aplicación final funcione:

C#

DataViewSchema schema = [Link]();


[Link](" =============== TensorFlow Model Schema
=============== ");
var featuresType = (VectorDataViewType)schema["Features"].Type;
[Link]($"Name: Features, Type:
{[Link]}, Size:
({[Link][0]})");
var predictionType =
(VectorDataViewType)schema["Prediction/Softmax"].Type;
[Link]($"Name: Prediction/Softmax, Type:
{[Link]}, Size:
({[Link][0]})");

El esquema de entrada es la matriz de longitud fija de palabras codificadas en


enteros. El esquema de salida es una matriz float de probabilidades que indica si la
opinión de una reseña es negativa o positiva. Estos valores suman 1, ya que la
probabilidad de que sea positiva es el complemento de la probabilidad de que la
opinión sea negativa.

Creación de la canalización de [Link]


1. Cree la canalización y divida el texto de entrada en palabras con la transformación
TokenizeIntoWords para dividir el texto en palabras como la siguiente línea de
código:

C#
IEstimator<ITransformer> pipeline =
// Split the text into individual words
[Link]("TokenizedWords",
"ReviewText")

La transformación TokenizeIntoWords usa espacios para analizar el texto o la


cadena por palabras. Crea otra columna y divide cada cadena de entrada en un
vector de subcadenas según el separador definido por el usuario.

2. Asigne las palabras a su codificación de enteros con la tabla de búsqueda que


declaró anteriormente:

C#

// Map each word to an integer value. The array of integer makes up the
input features.
.Append([Link]("VariableLengthFeature
s", lookupMap,
[Link]["Words"], [Link]["Ids"],
"TokenizedWords"))

3. Cambie el tamaño de las codificaciones de enteros de longitud variable al de


longitud fija que requiere el modelo:

C#

// Resize variable length vector to fixed length vector.


.Append([Link](ResizeFeaturesAction,
"Resize"))

4. Clasifique la entrada con el modelo de TensorFlow cargado:

C#

// Passes the data to TensorFlow for scoring


.Append([Link]("Prediction/Softmax",
"Features"))

La salida del modelo de TensorFlow se denomina Prediction/Softmax . Tenga en


cuenta que el nombre Prediction/Softmax viene determinado por el modelo de
TensorFlow. Este nombre no se puede cambiar.

5. Cree otra columna para la predicción de salida:

C#
// Retrieves the 'Prediction' from TensorFlow and copies to a column
.Append([Link]("Prediction",
"Prediction/Softmax"));

Tiene que copiar la columna Prediction/Softmax en otra cuyo nombre pueda


usarse como propiedad en una clase de C#: Prediction . El carácter / no está
permitido en un nombre de propiedad de C#.

Creación del modelo de [Link] a partir de la


canalización
1. Agregue el código para crear el modelo a partir de la canalización:

C#

// Create an executable model from the estimator pipeline


IDataView dataView = [Link](new
List<MovieReview>());
ITransformer model = [Link](dataView);

Un modelo de [Link] se crea a partir de la cadena de estimadores de la


canalización llamando al método Fit . En este caso, no se adaptan los datos para
crear el modelo, puesto que el modelo de TensorFlow ya se ha entrenado
previamente. Proporcionamos un objeto de vista de datos vacío para satisfacer los
requisitos del método Fit .

Uso del modelo para realizar una predicción


1. Agregue el método PredictSentiment encima de la clase MovieReview :

C#

void PredictSentiment(MLContext mlContext, ITransformer model)


{

2. Agregue el código siguiente para crear PredictionEngine como la primera línea en


el método PredictSentiment() :

C#
var engine = [Link]<MovieReview,
MovieReviewSentimentPrediction>(model);

PredictionEngine es una API de conveniencia, que le permite realizar una


predicción en una única instancia de datos. PredictionEngine no es seguro para
subprocesos. Es aceptable usarlo en entornos de un solo subproceso o prototipo.
Para mejorar el rendimiento y la seguridad para subprocesos en entornos de
producción, use el servicio PredictionEnginePool , que crea un ObjectPool de
objetos de PredictionEngine para su uso en toda la aplicación. Consulte esta guía
sobre cómo usar PredictionEnginePool en una API web de [Link] Core.

7 Nota

La extensión del servicio PredictionEnginePool está actualmente en versión


preliminar.

3. Agregue un comentario para probar la predicción del modelo entrenado en el


método Predict() mediante la creación de una instancia de MovieReview :

C#

var review = new MovieReview()


{
ReviewText = "this film is really good"
};

4. Pase los datos del comentario de prueba a Prediction Engine agregando las líneas
de código siguientes al método PredictSentiment() :

C#

var sentimentPrediction = [Link](review);

5. La función Predict() realiza una predicción sobre una sola fila de datos:

Propiedad. Value Tipo

Predicción [0.5459937, 0.454006255] float[]

6. Muestre la predicción de opiniones con el código siguiente:

C#
[Link]($"Number of classes:
{[Link]?.Length}");
[Link]($"Is sentiment/review positive?
{([Link]?[1] > 0.5 ? "Yes." : "No.")}");

7. Agregue una llamada a PredictSentiment después de la llamada al método Fit() :

C#

PredictSentiment(mlContext, model);

Resultados
Compile y ejecute su aplicación.

Los resultados deberían ser similares a los indicados a continuación. Durante el


procesamiento, se muestran mensajes. Puede ver las advertencias o mensajes de
procesamiento. Estos mensajes se han quitado de los resultados siguientes para mayor
claridad.

Consola

Number of classes: 2
Is sentiment/review positive ? Yes

¡Enhorabuena! Ha creado correctamente un modelo de Machine Learning para clasificar


y predecir la opinión de los mensajes reutilizando un modelo de TensorFlow entrenado
previamente en [Link].

Puede encontrar el código fuente para este tutorial en el repositorio dotnet/samples .

En este tutorial ha aprendido a:

" Carga de un modelo de TensorFlow entrenado previamente


" Transformación del texto de comentario del sitio web en características adecuadas
para el modelo
" Uso del modelo para realizar una predicción
Creación de una aplicación de listas de
enfrentamientos en juegos con
[Link] y programación probabilística
Artículo • 09/05/2023

Esta guía paso a paso le enseña la programación probabilística mediante [Link]. La


programación probabilística es un enfoque de aprendizaje automático donde los
modelos personalizados se expresan como programas. Permite la incorporación del
conocimiento del dominio en los modelos y hace que el sistema de aprendizaje
automático sea más interpretable. También admite la inferencia en línea (proceso de
aprendizaje a medida que llegan nuevos datos). [Link] se usa en varios productos de
Microsoft, como Azure, Xbox y Bing.

¿Qué es la programación probabilística?


La programación probabilística permite crear modelos estadísticos de los procesos
reales.

Prerrequisitos
Configuración del entorno de desarrollo local

En esta guía paso a paso se supone que cuenta con una máquina que puede usar
para el desarrollo. El tutorial de .NET Hola mundo en 10 minutos cuenta con
instrucciones para configurar el entorno de desarrollo local en MacOS, Windows o
Linux.

Creación de la aplicación
1. Abra un nuevo símbolo del sistema y ejecute los siguientes comandos:

CLI de .NET

dotnet new console -o myApp


cd myApp

El comando dotnet crea una aplicación new de tipo console . El parámetro -o crea un
directorio denominado myApp donde se almacena la aplicación y la rellena con los
archivos necesarios. El comando cd myApp le coloca en el directorio de aplicación recién
creada.

Instalación del paquete de [Link]


Para usar [Link], deberá instalar el paquete [Link] . En
el símbolo del sistema, ejecute el siguiente comando:

CLI de .NET

dotnet add package [Link]

Diseño del modelo


En el ejemplo se usan las partidas de tenis de mesa o futbolín jugadas en la oficina.
Cuenta con los participantes y el resultado de cada partida. Quiere deducir las
habilidades del jugador a partir de estos datos. Suponga que cada jugador tiene una
habilidad latente normalmente distribuida y su rendimiento en una partida determinada
es una versión con ruido de esta habilidad. Los datos limitan el rendimiento del ganador
para que sea mayor que el rendimiento del perdedor. Se trata de una versión
simplificada del popular modelo de TrueSkill , que también admite equipos, dibujos y
otras extensiones. Un versión avanzada de este modelo se utiliza para el
emparejamiento en los títulos de juego más vendidos Halo y Gears of War.

Necesita enumerar las habilidades del jugador deducidas, junto con su desviación (la
medida de incertidumbre en torno a las habilidades).

Datos de ejemplo del resultado de las partidas

Juego Ganador Perdedor

1 Jugador 0 Jugador 1

2 Jugador 0 Jugador 3

3 Jugador 0 Jugador 4

4 Jugador 1 Jugador 2

5 Jugador 3 Jugador 1

6 Jugador 4 Jugador 2
Examinando más detalladamente los datos de ejemplo, observará que los jugadores 3 y
4 tienen una victoria y una derrota. Veamos las clasificaciones mediante programación
probabilística. Observe que también hay un jugador cero porque incluso las listas de
enfrentamientos de la oficina son cero según nuestros desarrolladores.

Escritura de algo de código


Una vez diseñado el modelo, es el momento de expresarlo como un programa
probabilístico mediante la API de modelado de [Link]. Abra [Link] en el editor
de texto que prefiera y reemplace todo su contenido por el código siguiente:

C#

namespace myApp

{
using System;
using [Link];
using [Link];
using [Link];
using [Link];

class Program
{

static void Main(string[] args)


{
// The winner and loser in each of 6 samples games
var winnerData = new[] { 0, 0, 0, 1, 3, 4 };
var loserData = new[] { 1, 3, 4, 2, 1, 2 };

// Define the statistical model as a probabilistic program


var game = new Range([Link]);
var player = new Range([Link](loserData).Max() + 1);
var playerSkills = [Link]<double>(player);
playerSkills[player] = [Link](6,
9).ForEach(player);

var winners = [Link]<int>(game);


var losers = [Link]<int>(game);

using ([Link](game))
{
// The player performance is a noisy version of their skill
var winnerPerformance =
[Link](playerSkills[winners[game]], 1.0);
var loserPerformance =
[Link](playerSkills[losers[game]], 1.0);

// The winner performed better in this game


[Link](winnerPerformance >
loserPerformance);
}

// Attach the data to the model


[Link] = winnerData;
[Link] = loserData;

// Run inference
var inferenceEngine = new InferenceEngine();
var inferredSkills = [Link]<Gaussian[]>
(playerSkills);

// The inferred skills are uncertain, which is captured in their


variance
var orderedPlayerSkills = inferredSkills
.Select((s, i) => new { Player = i, Skill = s })
.OrderByDescending(ps => [Link]());

foreach (var playerSkill in orderedPlayerSkills)


{
[Link]($"Player {[Link]} skill:
{[Link]}");
}
}
}
}

Ejecutar la aplicación
En el símbolo del sistema, ejecute el siguiente comando:

CLI de .NET

dotnet run

Results
Los resultados deberían ser similares a los indicados a continuación:

Consola

Compiling model...done.
Iterating:
.........|.........|.........|.........|.........| 50
Player 0 skill: Gaussian(9.517, 3.926)
Player 3 skill: Gaussian(6.834, 3.892)
Player 4 skill: Gaussian(6.054, 4.731)
Player 1 skill: Gaussian(4.955, 3.503)
Player 2 skill: Gaussian(2.639, 4.288)

En los resultados, observe que el jugador 3 está clasificado ligeramente por encima del
jugador 4 según nuestro modelo. Eso es porque la victoria del jugador 3 sobre el
jugador 1 es más importante que la victoria del jugador 4 sobre el jugador 2 (tenga en
cuenta que el jugador 1 venció al jugador 2). ¡El jugador 0 es el campeón general!

Mantenimiento del aprendizaje


El diseño de modelos estadísticos es una habilidad por sí mismo. El equipo de Microsoft
Research Cambridge ha escrito un libro en línea gratuito , que ofrece una breve
introducción al artículo. El capítulo 3 de este libro trata sobre el modelo TrueSkill con
más detalle. Cuando tenga un modelo en mente, puede transformarlo en código
mediante la amplia documentación existente en el sitio web de [Link].

Pasos siguientes
Visite el repositorio de GitHub de [Link] para seguir aprendiendo y encontrar más
ejemplos.

Repositorio de GitHub de dotnet e infer


Tareas de aprendizaje automático en
[Link]
Artículo • 10/05/2023

Una tarea de aprendizaje automático es el tipo de predicción o inferencia que se está


realizando, en función del problema o la pregunta que se está formulando, y los datos
disponibles. Por ejemplo, la tarea de clasificación asigna datos a categorías y la tarea de
agrupación en clústeres agrupa datos según su similitud.

Las tareas de aprendizaje automático se basan en patrones de los datos en lugar de


programarse explícitamente.

En este artículo se describen las diferentes tareas de aprendizaje automático que puede
elegir en [Link] y algunos casos de uso comunes.

Cuando haya decidido qué tarea funciona en su escenario, debe elegir el mejor
algoritmo para entrenar el modelo. Los algoritmos disponibles se muestran en la
sección correspondiente a cada tarea.

Clasificación binaria
Una tarea de aprendizaje automatizado supervisado que se usa para predecir a cuál de
las dos clases (categorías) pertenece una instancia de datos. La entrada de un algoritmo
de clasificación es un conjunto de ejemplos con etiqueta, donde cada etiqueta es un
número entero de 0 o 1. El resultado de un algoritmo de clasificación binaria es un
clasificador, que puede usar para predecir la clase de nuevas instancias sin etiqueta.
Entre los ejemplos de escenarios de clasificación binaria están los siguientes:

Comprensión del sentimiento de comentarios de Twitter en tanto que "positivos" o


"negativos".
Diagnosticar si un paciente tiene una determinada enfermedad o no.
Tomar una decisión para marcar un correo electrónico como no deseado o no.
Determinar si una fotografía contiene un elemento determinado o no, como un
perro o una fruta.

Para obtener más información, consulte el artículo de Wikipedia Binary classification


(Clasificación binaria).

Instructores de clasificación binaria


Puede entrenar un modelo de clasificación binaria mediante los algoritmos siguientes:

AveragedPerceptronTrainer
SdcaLogisticRegressionBinaryTrainer
SdcaNonCalibratedBinaryTrainer
SymbolicSgdLogisticRegressionBinaryTrainer
LbfgsLogisticRegressionBinaryTrainer
LightGbmBinaryTrainer
FastTreeBinaryTrainer
FastForestBinaryTrainer
GamBinaryTrainer
FieldAwareFactorizationMachineTrainer
PriorTrainer
LinearSvmTrainer

Entradas y salidas de clasificación binaria


Para obtener los mejores resultados con la clasificación binaria, los datos de
entrenamiento deben estar equilibrados (es decir, igual número de datos de
entrenamiento positivos y negativos). Los valores que faltan se deben controlar antes
del entrenamiento.

Los datos de la columna de etiquetas de entrada deben ser Boolean. Los datos de la
columna de características de entrada deben ser un vector de tamaño fijo de Single.

Estos instructores generan las columnas siguientes:

Nombre de Tipo de Descripción


columna de columna
salida

Score Single Puntuación sin procesar calculada por el modelo

PredictedLabel Boolean Etiqueta de predicción, según el signo de la puntuación. Una


puntuación negativa se asigna a false y una positiva a true .

Clasificación multiclase
Una tarea de aprendizaje automatizado supervisado que se usa para predecir la clase
(categoría) de una instancia de datos. La entrada de un algoritmo de clasificación es un
conjunto de ejemplos con etiqueta. Cada etiqueta se inicia normalmente como texto.
Luego se ejecuta mediante TermTransform, que lo convierte al tipo de clave (numérico).
El resultado de un algoritmo de clasificación es un clasificador, que puede usar para
predecir la clase de nuevas instancias sin etiqueta. Entre los ejemplos de escenarios de
clasificación multiclase están los siguientes:

Clasificar los vuelos como "anticipados", "puntuales" o "retrasados".


Comprender las críticas de películas como "positivas", "neutrales" o "negativas".
Categorizar las reseñas de hoteles en función de factores como "ubicación",
"precio", "limpieza", etc.

Para obtener más información, consulte el artículo de Wikipedia Multiclass


classification (Clasificación multiclase).

7 Nota

Uno frente a todos actualiza los mecanismos de aprendizaje de clasificación


binaria para que actúen en conjuntos de datos multiclase. Más información en
Wikipedia .

Instructores de clasificación multiclase


Puede entrenar un modelo de clasificación multiclase mediante los siguientes
algoritmos de aprendizaje:

LightGbmMulticlassTrainer
SdcaMaximumEntropyMulticlassTrainer
SdcaNonCalibratedMulticlassTrainer
LbfgsMaximumEntropyMulticlassTrainer
NaiveBayesMulticlassTrainer
OneVersusAllTrainer
PairwiseCouplingTrainer

Entradas y salidas de clasificación multiclase


Los datos de la columna de etiquetas de entrada deben ser de tipo de clave. La columna
de características debe ser un vector de tamaño fijo de Single.

Este instructor produce lo siguiente:

Nombre de Tipo Descripción


archivo de
salida
Nombre de Tipo Descripción
archivo de
salida

Score Vector Puntuaciones de todas las clases. Un valor más alto indica mayor
de probabilidad de que caigan en la clase asociada. Si el elemento i-th
Single tiene el valor más grande, el índice de la etiqueta de predicción sería i.
Tenga en cuenta que i es el índice de base cero.

PredictedLabel Tipo Índice de la etiqueta de predicción. Si su valor es i, la etiqueta real


de sería la categoría de i-th en el tipo de etiqueta de entrada con valores
clave de clave.

Regresión
Una tarea de aprendizaje automatizado supervisado que se usa para predecir el valor de
la etiqueta a partir de un conjunto de características relacionadas. La etiqueta puede
tener cualquier valor real y no proviene de un conjunto finito de valores como en las
tareas de clasificación. Los algoritmos de regresión modelan la dependencia de la
etiqueta de sus características relacionadas para determinar cómo cambiará la etiqueta
a medida que varíen los valores de las características. La entrada de un algoritmo de
regresión es un conjunto de ejemplos con etiquetas de valores conocidos. El resultado
de un algoritmo de regresión es una función, que puede utilizar para predecir el valor
de etiqueta para cualquier nuevo conjunto de características de entrada. Estos son
algunos ejemplos de escenarios de regresión:

Predecir los precios de la vivienda según los atributos de la casa, como el número
de habitaciones, la ubicación o el tamaño.
Predecir los precios de las acciones futuras en función de los datos históricos y las
tendencias del mercado actual.
Predecir las ventas de un producto en función del presupuesto para publicidad.

Instructores de regresión
Puede entrenar un modelo de regresión mediante los siguientes algoritmos:

LbfgsPoissonRegressionTrainer
LightGbmRegressionTrainer
SdcaRegressionTrainer
OlsTrainer
OnlineGradientDescentTrainer
FastTreeRegressionTrainer
FastTreeTweedieTrainer
FastForestRegressionTrainer
GamRegressionTrainer

Entradas y salidas de regresión


Los datos de la columna de etiquetas de entrada deben ser Single.

Los instructores para esta tarea producen lo siguiente:

Nombre de archivo de salida Tipo Descripción

Score Single Puntuación sin procesar que el modelo predijo

Agrupación en clústeres
Una tarea de aprendizaje automático no supervisado que se usa para agrupar instancias
de datos en clústeres que contienen características similares. La agrupación en clústeres
también se puede utilizar para identificar relaciones en un conjunto de datos que
podrían no detectarse lógicamente mediante la exploración o la simple observación. Las
entradas y salidas de un algoritmo de agrupación en clústeres dependen de la
metodología elegida. Puede tomar un enfoque de distribución, centroide, de
conectividad o de densidad. [Link] admite actualmente un enfoque basado en
centroide mediante la agrupación en clústeres K-Means. Entre los ejemplos de
escenarios de agrupación en clústeres están los siguientes:

Comprender los segmentos de los huéspedes de un hotel según los hábitos y las
características de las opciones de hotel.
Identificar segmentos y datos demográficos de clientes para ayudar a crear
campañas publicitarias específicas.
Categorizar un inventario tomando como base las métricas de fabricación.

Instructor de agrupación en clústeres


Puede entrenar un modelo de agrupación en clústeres mediante el siguiente algoritmo:

KMeansTrainer

Entradas y salidas de agrupación en clústeres


Los datos de las características de entrada deben ser Single. No se necesita ninguna
etiqueta.
Este instructor produce lo siguiente:

Nombre de archivo Tipo Descripción


de salida

Score Vector de Distancias del punto de datos especificado a los centroides


Single de todos los clústeres

PredictedLabel Tipo de El índice del clúster más cercano predicho por el modelo.
clave

Detección de anomalías
Esta tarea crea un modelo de detección de anomalías mediante el uso de análisis de
componentes principales (PCA). La detección de anomalías basada en PCA le permite
generar un modelo en escenarios donde resulta sencillo obtener datos de
entrenamiento de una clase, como transacciones válidas, pero difícil obtener muestras
suficientes de las anomalías de destino.

Una técnica establecida en aprendizaje automático, el PCA se suele usar en el análisis de


datos exploratorios porque revela la estructura interna de los datos y explica la variación
en los datos. El PCA funciona analizando datos que contienen varias variables. Busca
correlaciones entre las variables y determina la combinación de valores que mejor
recoge las diferencias en los resultados. Estos valores de características combinados se
usan para crear un espacio de características más compactas llamadas componentes
principales.

La detección de anomalías engloba muchas tareas importantes de aprendizaje


automático:

La identificación de transacciones potencialmente fraudulentas.


El aprendizaje de patrones que indican que se ha producido una intrusión de red.
La búsqueda de clústeres anómalos de pacientes.
La comprobación de los valores especificados en un sistema.

Dado que las anomalías son eventos excepcionales por definición, puede ser difícil
recopilar una muestra representativa de datos que usar en el modelado. Los algoritmos
que se incluyen en esta categoría se han diseñado especialmente para abordar los
principales desafíos de compilar y entrenar modelos mediante el uso de conjuntos de
datos desequilibrados.

Instructor de detección de anomalías


Puede entrenar un modelo de detección de anomalías mediante el siguiente algoritmo:

RandomizedPcaTrainer

Salidas y entradas de detección de anomalías


Las características de entrada deben ser un vector de tamaño fijo de Single.

Este instructor produce lo siguiente:

Nombre de Tipo Descripción


archivo de salida

Score Single Puntuación no negativa sin enlazar que ha calculado el modelo de


detección de anomalías

PredictedLabel Boolean Un valor true o false que representa si la entrada es una anomalía
(PredictedLabel=true) o no (PredictedLabel=false)

Clasificación
Una tarea de clasificación construye un clasificador a partir de un conjunto de ejemplos
etiquetados. Este conjunto de ejemplos consta de grupos de instancias que se pueden
puntuar con un criterio determinado. Las etiquetas de clasificación son {0, 1, 2, 3, 4} para
cada instancia. El clasificador está entrenado para clasificar nuevos grupos de instancias
con puntuaciones desconocidas para cada instancia. Los mecanismos de aprendizaje de
clasificación de [Link] se basan en la clasificación aprendida automáticamente .

Algoritmos de aprendizaje de clasificación


Puede entrenar un modelo de clasificación mediante los algoritmos siguientes:

LightGbmRankingTrainer
FastTreeRankingTrainer

Salidas y entradas de clasificación


El tipo de datos de la etiqueta de entrada debe ser de tipo de clave o Single. El valor de
la etiqueta determina la relevancia, donde los valores más altos indican mayor
relevancia. Si la etiqueta es de tipo de clave, entonces el índice de la clave es el valor de
relevancia, donde el índice más pequeño es el menos relevante. Si la etiqueta es un
Single, los valores mayores indican mayor relevancia.
Los datos de la característica deben ser un vector de tamaño fijo de Single y la columna
de grupo de filas de entrada debe ser de tipo de clave.

Este instructor produce lo siguiente:

Nombre de archivo de Tipo Descripción


salida

Score Single Puntuación sin enlazar que ha calculado el modelo para


determinar la predicción

Recomendación
Una tarea de recomendación permite generar una lista de productos o servicios
recomendados. [Link] utiliza la factorización matricial (MF) , un algoritmo de filtrado
de colaboración de las recomendaciones cuando hay datos históricos de clasificación
de productos en el catálogo. Por ejemplo, tiene datos históricos de clasificación de
películas para los usuarios y quiere recomendar otras películas que puedan ver a
continuación.

Algoritmos de aprendizaje de recomendación


Puede entrenar un modelo de recomendación mediante el siguiente algoritmo:

MatrixFactorizationTrainer

Previsión
La tarea de previsión usa datos de serie temporal pasados para realizar predicciones
sobre el comportamiento futuro. Los escenarios aplicables a la previsión incluyen
previsiones meteorológicas, predicciones de ventas estacionales y mantenimiento
predictivo.

Instructores de previsión
Puede entrenar un modelo de previsión con el algoritmo siguiente:

ForecastBySsa

Clasificación de imágenes
Una tarea de aprendizaje automatizado supervisado que se usa para predecir la clase
(categoría) de una imagen. La entrada es un conjunto de ejemplos con etiqueta. Cada
etiqueta se inicia normalmente como texto. Luego se ejecuta mediante TermTransform,
que lo convierte al tipo de clave (numérico). El resultado de un algoritmo de
clasificación de imágenes es un clasificador, que puede usar para predecir la clase de
nuevas imágenes. La tarea de clasificación de imágenes es un tipo de clasificación
multiclase. Entre los ejemplos de escenarios de clasificación de imágenes destacan los
siguientes:

Determinar la raza de un perro como "husky siberiano", "labrador", "caniche", etc.


Determinar si un producto de fabricación es defectuoso o no.
Determinar los tipos de flores, como "rosa", "girasol", etc.

Instructores de clasificación de imágenes


Puede entrenar un modelo de clasificación de imágenes mediante los siguientes
algoritmos de aprendizaje:

ImageClassificationTrainer

Entradas y salidas de clasificación de imágenes


Los datos de la columna de etiquetas de entrada deben ser de tipo de clave. La columna
de características debe ser un vector de tamaño variable de Byte.

Este instructor genera las siguientes columnas:

Nombre de Tipo Descripción


archivo de
salida

Score Single Puntuaciones de todas las clases. Un valor más alto indica mayor
probabilidad de que caigan en la clase asociada. Si el elemento i-th
tiene el valor más grande, el índice de la etiqueta de predicción sería i.
Tenga en cuenta que i es el índice de base cero.

PredictedLabel Tipo Índice de la etiqueta de predicción. Si su valor es i, la etiqueta real sería


de la categoría de i-th en el tipo de etiqueta de entrada con valores de
clave clave.

Detección de objetos
Una tarea de aprendizaje automático supervisado que se usa para predecir la clase
(categoría) de una imagen, pero que también proporciona un rectángulo de selección
donde esa categoría está dentro de la imagen. En lugar de clasificar un único objeto en
una imagen, la detección de objetos puede detectar varios objetos dentro de una
imagen. Entre los ejemplos de detección de objetos se incluyen:

Detectar automóviles, señales o personas en las imágenes de una carretera.


Detectar defectos en las imágenes de productos.
Detectar áreas de interés en las imágenes de rayos X.

Actualmente, el entrenamiento del modelo de detección de objetos solo está disponible


en Model Builder mediante Azure Machine Learning.
Cómo elegir un algoritmo de [Link]
Artículo • 10/05/2023

Para cada tarea de [Link], existen varios algoritmos de entrenamiento de donde elegir.
La elección depende del problema que intenta resolver, las características de los datos y
los recursos de proceso y almacenamiento que tiene a su disposición. Es importante
tener en cuenta que entrenar un modelo de Machine Learning es un proceso iterativo.
Es posible que deba probar varios algoritmos para encontrar el que mejor funcione.

Los algoritmos funcionan con características. Las características son valores numéricos
calculados a partir de los datos de entrada. Son entradas óptimas para los algoritmos de
aprendizaje automático. Transforme sus datos de entrada sin formato en características
mediante una o varias de las transformaciones de datos. Por ejemplo, los datos de texto
se transforman en un conjunto de recuentos de palabras y recuentos de combinación de
palabras. Una vez extraídas las características de un tipo de datos sin formato mediante
transformaciones de datos, se dice que están caracterizadas. Por ejemplo, texto
caracterizado o datos de imagen caracterizados.

Instructor = algoritmo + tarea


Un algoritmo es la expresión matemática que se ejecuta para generar un modelo.
Diferentes algoritmos generan modelos con diferentes características.

Con [Link], se puede aplicar el mismo algoritmo a distintas tareas. Por ejemplo, se
puede usar el ascenso coordinado dual estocástico para la clasificación binaria, la
clasificación multiclase y la regresión. La diferencia radica en cómo se interpreta la salida
del algoritmo para que coincida con la tarea.

Para cada combinación de tarea o algoritmo, [Link] proporciona un componente que


ejecuta el algoritmo de entrenamiento y hace la interpretación. Estos componentes se
denominan instructores. Por ejemplo, SdcaRegressionTrainer usa el algoritmo
StochasticDualCoordinatedAscent que se aplica a la tarea de regresión.

Algoritmos lineales
Los algoritmos lineales generan un modelo que calcula puntuaciones desde una
combinación lineal de los datos de entrada y un conjunto de pesos. Los pesos son
parámetros del modelo estimado durante el entrenamiento.
Los algoritmos lineales funcionan bien para las características que se pueden separar de
manera lineal .

Antes del entrenamiento con un algoritmo lineal, se deben normalizar las características.
Esto evita que una característica tenga más influencia sobre el resultado que otros.

En general, los algoritmos lineales son escalables, rápidos y baratos de entrenar y


predecir. Se escalan por el número de características y aproximadamente por el tamaño
del conjunto de datos de entrenamiento.

Los algoritmos lineales realizan varios recorridos por los datos de entrenamiento. Si el
conjunto de datos cabe en la memoria, la adición de un punto de control de memoria
caché a la canalización de [Link] antes de anexar el instructor hará que el
entrenamiento se ejecute más rápidamente.

Perceptrón promedio
Ideal para la clasificación de textos.

Formador Tarea ONNX Exportable

AveragedPerceptronTrainer Clasificación binaria Sí

Ascenso coordinado dual estocástico


No es necesario optimizar para obtener un buen rendimiento predeterminado.

Formador Tarea ONNX Exportable

SdcaLogisticRegressionBinaryTrainer Clasificación binaria Sí

SdcaNonCalibratedBinaryTrainer Clasificación binaria Sí

SdcaMaximumEntropyMulticlassTrainer Clasificación multiclase Sí

SdcaNonCalibratedMulticlassTrainer Clasificación multiclase Sí

SdcaRegressionTrainer Regresión Sí

L-BFGS
Se utiliza cuando el número de características es grande. Genera estadísticas de
entrenamiento de regresión logística, pero no se escala tan bien como
AveragedPerceptronTrainer.
Formador Tarea ONNX Exportable

LbfgsLogisticRegressionBinaryTrainer Clasificación binaria Sí

LbfgsMaximumEntropyMulticlassTrainer Clasificación multiclase Sí

LbfgsPoissonRegressionTrainer Regresión Sí

Descenso de gradiente estocástico simbólico


Instructor de clasificación binaria lineal más rápido y más preciso. Se escala bien con el
número de procesadores.

Formador Tarea ONNX Exportable

SymbolicSgdLogisticRegressionBinaryTrainer Clasificación binaria Sí

El descenso de gradiente en línea


Implementa el descenso de gradiente estocástico estándar (no por lotes), con una
selección de funciones de pérdida, y una opción para actualizar el vector de peso
usando el promedio de los vectores detectados a lo largo del tiempo.

Formador Tarea ONNX Exportable

OnlineGradientDescentTrainer Regresión Sí

Algoritmos de árbol de decisión


Los algoritmos de árbol de decisión crean un modelo que contiene una serie de
decisiones: eficazmente un diagrama de flujo a través de los valores de datos.

Para usar este tipo de algoritmo, no es necesario poder separar las características de
forma lineal. Tampoco es necesario normalizar las características, porque los valores
individuales en el vector de la característica se usan de forma independiente en el
proceso de toma de decisiones.

Los algoritmos de árbol de decisión normalmente son muy precisos.

Salvo por los modelos aditivos generalizados (GAM), los modelos de árbol carecen de
explicación cuando el número de características es grande.
Los algoritmos de árbol de decisión consumen más recursos y no se escalan tan bien
como los lineales. Se desempeñan bien en los conjuntos de datos que pueden caber en
la memoria.

Los árboles de decisión potenciados son un conjunto de árboles pequeños, donde cada
árbol asigna una puntuación a los datos de entrada y pasa la puntuación al árbol
siguiente para generar una mejor puntuación y así sucesivamente, donde cada árbol en
el conjunto mejora al anterior.

Máquina potenciada de degradado ligero


Instructores de árbol de clasificación binaria más rápidos y más precisos. Altamente
optimizable.

Formador Tarea ONNX Exportable

LightGbmBinaryTrainer Clasificación binaria Sí

LightGbmMulticlassTrainer Clasificación multiclase Sí

LightGbmRegressionTrainer Regresión Sí

LightGbmRankingTrainer Clasificación No

Árbol rápido
Se usa para los datos de imagen caracterizados. Resistente a los datos no equilibrados.
Altamente optimizable.

Formador Tarea ONNX Exportable

FastTreeBinaryTrainer Clasificación binaria Sí

FastTreeRegressionTrainer Regresión Sí

FastTreeTweedieTrainer Regresión Sí

FastTreeRankingTrainer Clasificación No

Bosque rápido
Funciona bien con datos ruidosos.

Formador Tarea ONNX Exportable


Formador Tarea ONNX Exportable

FastForestBinaryTrainer Clasificación binaria Sí

FastForestRegressionTrainer Regresión Sí

Modelo aditivo generalizado (GAM)


Ideal para problemas que funcionan bien con los algoritmos de árbol, pero en los que la
explicación es una prioridad.

Formador Tarea ONNX Exportable

GamBinaryTrainer Clasificación binaria No

GamRegressionTrainer Regresión No

Factorización matricial

Factorización matricial
Se utiliza para el filtrado colaborativo en la recomendación.

Formador Tarea ONNX Exportable

MatrixFactorizationTrainer Recomendación No

Máquinas de factorización con reconocimiento de campo


Ideal para datos categóricos dispersos, con grandes conjuntos de datos.

Formador Tarea ONNX Exportable

FieldAwareFactorizationMachineTrainer Clasificación binaria No

Meta-algoritmos
Estos instructores crean un instructor multiclase a partir de un instructor binario. Usar
con AveragedPerceptronTrainer, LbfgsLogisticRegressionBinaryTrainer,
SymbolicSgdLogisticRegressionBinaryTrainer, LightGbmBinaryTrainer,
FastTreeBinaryTrainer, FastForestBinaryTrainer, GamBinaryTrainer.
Uno frente a todos
Este clasificador multiclase entrena un clasificador binario para cada clase, que distingue
esa clase de todas las demás. Está limitado en la escala por el número de clases para
clasificar.

Formador Tarea ONNX Exportable

OneVersusAllTrainer Clasificación multiclase Sí

Acoplamiento en pares
Este clasificador multiclase entrena un algoritmo de clasificación binaria en cada par de
clases. Está limitado en la escala por el número de clases, ya que cada combinación de
dos clases debe entrenarse.

Formador Tarea ONNX Exportable

PairwiseCouplingTrainer Clasificación multiclase No

K-Means
Se usa para la agrupación en clústeres.

Formador Tarea ONNX Exportable

KMeansTrainer Agrupación en clústeres Sí

Análisis de componentes principales


Se usa para la detección de anomalías.

Formador Tarea ONNX Exportable

RandomizedPcaTrainer Detección de anomalías No

Bayes naive
Use este algoritmo de clasificación multiclase cuando las características sean
independientes y el conjunto de datos de entrenamiento sea pequeño.
Formador Tarea ONNX Exportable

NaiveBayesMulticlassTrainer Clasificación multiclase Sí

Instructor anterior
Use este algoritmo de clasificación binaria para marcar el rendimiento de otros
instructores. Para ser eficaces, las métricas de los otros instructores deben ser mejores
que el instructor anterior.

Formador Tarea ONNX Exportable

PriorTrainer Clasificación binaria Sí

Máquina de vectores de soporte


Las máquinas de vectores de soporte (SVM) son una clase muy popular y contrastada de
modelos de aprendizaje supervisados, que se puede usar en tareas de clasificación lineal
y no lineal.

Las investigaciones recientes se han centrado en maneras de optimizar estos modelos


para escalar de forma eficaz a conjuntos de entrenamiento más grandes.

SVM lineal
Predice un destino mediante un modelo de clasificación binaria lineal entrenado a través
de datos de etiqueta booleanos. Alterna entre pasos de descenso de gradiente
estocástico y pasos de proyección.

Formador Tarea ONNX Exportable

LinearSvmTrainer Clasificación binaria Sí

Modelo SVM profundo local


Predice un objetivo utilizando un modelo de clasificación binaria no lineal. Reduce el
costo de tiempo de predicción; el costo de predicción aumenta logarítmicamente con el
tamaño del conjunto de entrenamiento, en lugar de linealmente, con una pérdida
tolerable en la precisión de la clasificación.

Formador Tarea ONNX Exportable


Formador Tarea ONNX Exportable

LdSvmTrainer Clasificación binaria Sí

Ordinaria de mínimos cuadrados


La ordinaria de mínimos cuadrados es una de las técnicas que se emplean con más
frecuencia en regresión lineal.

Los mínimos cuadrados hacen referencia a la función de pérdida, que calcula el error
como la suma del cuadrado de la distancia entre el valor real y la línea predicha, y ajusta
el modelo minimizando el error cuadrático. Este método presupone una sólida relación
lineal entre las entradas y la variable dependiente.

Formador Tarea ONNX Exportable

OlsTrainer Regresión Sí
Transformaciones de datos
Artículo • 10/05/2023

Las transformaciones de datos se usan para:

Preparar datos para el entrenamiento de modelos.


Aplicar un modelo importado en formato de TensorFlow o de ONNX.
Realizar el procesamiento posterior de los datos una vez pasados a través de un
modelo.

Las transformaciones de esta guía devuelven clases que implementan la interfaz


IEstimator. Las transformaciones de datos se pueden encadenar juntas. Cada
transformación espera y genera datos de tipos y formatos específicos, que se
especifican en la documentación de referencia vinculada.

Algunas transformaciones de datos requieren datos de aprendizaje para calcular sus


parámetros. Por ejemplo, el transformador NormalizeMeanVariance calcula el medio y la
varianza de los datos de aprendizaje durante la operación Fit() y usa esos parámetros
en la operación Transform() .

Otras transformaciones de datos no requieren datos de aprendizaje. Por ejemplo, la


transformación ConvertToGrayscale puede realizar la operación Transform() sin haber
visto ningún dato de aprendizaje durante la operación Fit() .

Agrupación y asignación de columnas


Transformación Definición ONNX
Exportable

Concatenate Concatenar una o más columnas de entrada en una columna Sí


de salida nueva

CopyColumns Copiar y cambiar el nombre de una o más columnas de Sí


entrada

DropColumns Quitar una o más columnas de entrada Sí

SelectColumns Seleccionar una o más columnas para conservar a partir de Sí


los datos de entrada

Normalización y escalado
Transformación Definición ONNX
Exportable

NormalizeMeanVariance Restar la media (de los datos de aprendizaje) y Sí


dividir por la varianza (de los datos de aprendizaje)

NormalizeLogMeanVariance Normalizar en función del logaritmo de los datos de Sí


aprendizaje

NormalizeLpNorm Escalar los vectores de entrada por su lp-norm , Sí


donde p es 1, 2 o infinito. Se establece de manera
predeterminada en la norma l2 (distancia euclidiana)

NormalizeGlobalContrast Escalar cada valor de una fila al restar la media de Sí


los datos de la fila y dividir por la desviación
estándar o la norma l2 (de los datos de la fila) y
multiplicar por un factor de escala configurable
(valor predeterminado 2)

NormalizeBinning Asignar el valor de entrada a un índice de Sí


discretización por el número de discretizaciones
para generar un valor flotante entre 0 y 1. Los
límites de discretización se calculan para distribuir
de manera uniforme los datos de aprendizaje entre
las discretizaciones

NormalizeSupervisedBinning Asignar el valor de entrada a una discretización en Sí


función de su correlación con la columna de
etiqueta

NormalizeMinMax Escalar la entrada por la diferencia entre los valores Sí


mínimo y máximo de los datos de aprendizaje

NormalizeRobustScaling Escalar cada valor mediante estadísticas sólidas a Sí


valores atípicos que centren los datos en torno a 0 y
escalar los datos según el intervalo de cuantiles.

Conversiones entre los tipos de datos


Transformación Definición ONNX
Exportable

ConvertType Convertir el tipo de una columna de entrada en un tipo Sí


nuevo

MapValue Asignar valores a claves (categorías) en función del No


diccionario de asignaciones suministrado
Transformación Definición ONNX
Exportable

MapValueToKey Asignar valores a claves (categorías) mediante la creación Sí


de la asignación a partir de los datos de entrada

MapKeyToValue Convertir claves de vuelta a sus valores originales Sí

MapKeyToVector Convertir claves de vuelta a vectores de los valores Sí


originales

MapKeyToBinaryVector Convertir claves de vuelta a un vector binario de valores No


originales

Hash Aplicar un algoritmo hash al valor de la columna de Sí


entrada

Transformaciones de texto
Transformación Definición ONNX
Exportable

FeaturizeText Transformar una columna de texto en una matriz No


flotante de recuentos de n-gramas y char-gramas
normalizados

TokenizeIntoWords Dividir una o más columnas de texto en palabras Sí


individuales

TokenizeIntoCharactersAsKeys Dividir una o más columnas de texto en flotantes Sí


de caracteres individuales sobre un conjunto de
temas

NormalizeText Cambiar mayúsculas y minúsculas, quitar marcas Sí


diacríticas, signos de puntuación y números

ProduceNgrams Transformar una columna de texto en un Sí


contenedor de recuentos de n-gramas (secuencias
de palabras consecutivas)

ProduceWordBags Transformar una columna de texto en un Sí


contenedor de recuentos de vector de n-gramas

ProduceHashedNgrams Transformar una columna de texto en un vector de No


recuentos de n-gramas con algoritmo hash

ProduceHashedWordBags Transformar una columna de texto en un Sí


contenedor de recuentos de n-gramas con
algoritmo hash
Transformación Definición ONNX
Exportable

RemoveDefaultStopWords Quitar las palabras irrelevantes predeterminadas Sí


para el idioma especificado de las columnas de
entrada

RemoveStopWords Quitar las palabras irrelevantes especificadas de las Sí


columnas de entrada

LatentDirichletAllocation Transformar un documento (representado como Sí


vector de flotantes) en un vector de flotantes sobre
un conjunto de temas

ApplyWordEmbedding Convertir vectores de tokens de texto en vectores Sí


de oraciones con un modelo entrenado
previamente

Transformaciones de imagen
Transformación Definición ONNX
Exportable

ConvertToGrayscale Convertir una imagen en escala de grises No

ConvertToImage Convertir un vector de píxeles en ImageDataViewType No

ExtractPixels Convertir píxeles de una imagen de entrada en un vector de No


números

LoadImages Cargar imágenes de una carpeta en memoria No

LoadRawImageBytes Carga imágenes de bytes sin procesar en una nueva No


columna.

ResizeImages Cambiar el tamaño de imágenes No

DnnFeaturizeImage Aplicar un modelo de red neuronal profunda (DNN) No


previamente entrenado para transformar una imagen de
entrada en un vector de características

Transformaciones de datos categóricos


Transformación Definición ONNX
Exportable
Transformación Definición ONNX
Exportable

OneHotEncoding Convertir una o más columnas de texto en vectores Sí


codificados one-hot

OneHotHashEncoding Convertir una o más columnas de texto en vectores No


codificados one-hot basados en hash

Transformaciones de datos de serie temporal


Transformación Definición ONNX
Exportable

DetectAnomalyBySrCnn Detectar anomalías en los datos de serie temporal No


de entrada con el algoritmo de valor residual
espectral (SR)

DetectChangePointBySsa Detectar puntos de cambio en los datos de serie No


temporal con el análisis de espectro singular (SSA)

DetectIidChangePoint Detectar puntos de cambio en los datos de serie No


temporal independientes y distribuidos de manera
idéntica (IID) con puntuaciones de Martingala y
estimaciones de densidad de kernel adaptable

ForecastBySsa Pronosticar los datos de serie temporal con el No


análisis de espectro singular (SSA)

DetectSpikeBySsa Detectar picos en los datos de serie temporal con el No


análisis de espectro singular (SSA)

DetectIidSpike Detectar picos en los datos de serie temporal No


independientes y distribuidos de manera idéntica
(IID) con puntuaciones de Martingala y
estimaciones de densidad de kernel adaptable

DetectEntireAnomalyBySrCnn Detectar anomalías para todos los datos de entrada No


mediante el algoritmo SRCNN.

DetectSeasonality Detectar la estacionalidad mediante el análisis de No


Fourier.

LocalizeRootCause Localizar la causa principal de la entrada de serie No


temporal mediante un algoritmo de árbol de
decisión.

LocalizeRootCauses Localizar las causas principales de la entrada de la No


serie de vinculación.
Valores que faltan
Transformación Definición ONNX
Exportable

IndicateMissingValues Crear una columna de salida booleana nueva cuyo valor es Sí


true cuando falta el valor en la columna de entrada

ReplaceMissingValues Crear una columna de salida nueva cuyo valor se establece Sí


en un valor predeterminado si falta el valor de la columna
de entrada y, de otro modo, el valor de entrada

Selección de características
Transformación Definición ONNX
Exportable

SelectFeaturesBasedOnCount Seleccionar las características con Sí


valores no predeterminados que
sobrepasan un umbral

SelectFeaturesBasedOnMutualInformation Seleccionar las características de las Sí


que más dependen los datos de la
columna de etiqueta

Transformaciones de características
Transformación Definición ONNX
Exportable

ApproximatedKernelMap Asignar cada vector de entrada a un espacio de No


característica dimensional inferior, donde los
productos internos se aproximan a una función
kernel, para que las características se puedan usar
como entradas en los algoritmos lineales

ProjectToPrincipalComponents Reducir las dimensiones del vector de


característica de entrada mediante la aplicación
del algoritmo Análisis de componentes principales

Transformaciones de explicación
Transformación Definición ONNX
Exportable

CalculateFeatureContribution Calcular las puntuaciones de contribución para No


cada elemento de un vector de característica

Transformaciones de calibración
Transformación Definición ONNX
Exportable

Platt(String, Transforma la puntuación sin procesar de un clasificador binario Sí


String, String) en una probabilidad de clase mediante la regresión logística con
parámetros estimados usando los datos de entrenamiento

Platt(Double, Transforma la puntuación sin procesar de un clasificador binario Sí


Double, String) en una probabilidad de clase mediante la regresión logística con
parámetros fijos

Naive Transforma la puntuación sin procesar de un clasificador binario Sí


en una probabilidad de clase mediante la asignación de
puntuaciones a los intervalos y el cálculo de la probabilidad
según la distribución entre los intervalos

Isotonic Transforma la puntuación sin procesar de un clasificador binario No


en una probabilidad de clase mediante la asignación de
puntuaciones a los intervalos, donde la posición de los límites y
el tamaño de los intervalos se calculan usando los datos de
entrenamiento

Transformaciones de aprendizaje profundo


Transformación Definición ONNX
Exportable

ApplyOnnxModel Transforma los datos de entrada con un modelo No


importado de ONNX

LoadTensorFlowModel Transforma los datos de entrada con un modelo No


importado de TensorFlow

Transformaciones personalizadas
Transformación Definición ONNX
Exportable

FilterByCustomPredicate Quitar las filas en las que un predicado No


especificado devuelve true

FilterByStatefulCustomPredicate Quitar las filas en las que un predicado No


especificado devuelve true, pero permitir un
estado especificado.

CustomMapping Transformar las columnas existentes en columnas No


nuevas con una asignación definida por el
usuario

Expression Aplicar una expresión para transformar columnas No


en otras nuevas
Evaluación de su modelo de [Link] con
métricas
Artículo • 13/03/2023

Comprenda las métricas empleadas para evaluar un modelo de [Link].

Las métricas de evaluación son específicas del tipo de tarea de aprendizaje automático
que realiza un modelo.

Por ejemplo, para la tarea de clasificación, el modelo se evalúa midiendo el grado de


coincidencia de una categoría predicha con la categoría real. Y, para la agrupación en
clústeres, la evaluación se basa en lo próximos que están unos de otros los elementos
agrupados y en el grado de separación existente entre los clústeres.

Métricas de evaluación para la clasificación


binaria
Métricas Descripción Buscar

Precisión La precisión es la Cuanto más cerca de 1,00, mejor. Pero exactamente


proporción de predicciones 1,00 indica un problema (normalmente: fuga de
correctas con un conjunto etiqueta/destino, sobreajuste o pruebas con datos
de datos de prueba. Es la de entrenamiento). Cuando los datos de prueba
relación entre el número de están desequilibrados (donde la mayoría de las
predicciones correctas y el instancias pertenece a una de las clases), el
número total de ejemplos de conjunto de datos es pequeño o las puntuaciones
entrada. Funciona bien si hay se acercan a 0,00 o 1,00, la precisión no captura
un número similar de realmente la eficacia de un clasificador y es
muestras que pertenecen a necesario comprobar métricas adicionales.
cada clase.

AUC aucROC o Área bajo la Cuanto más cerca de 1,00, mejor. Debe ser mayor
curva mide el área bajo la que 0,50 para que un modelo sea aceptable. Un
curva que se creó limpiando modelo con AUC de 0,50 o menos no tiene ningún
la tasa de positivos valor.
verdaderos frente a la tasa
de falsos positivos.
Métricas Descripción Buscar

AUCPR aucPR o Área bajo la curva Cuanto más cerca de 1,00, mejor. Las puntuaciones
de una curva de precisión- altas cercanas a 1,00 muestran que el clasificador
recuperación: Medida útil de devuelve resultados precisos (alta precisión), así
éxito de predicción cuando como una mayoría de todos los resultados positivos
las clases están poco (recuperación alta).
equilibradas (conjuntos de
datos muy sesgados).

Puntuación La puntuación F1 también Cuanto más cerca de 1,00, mejor. Una puntuación
F1 se denomina puntuación F F1 alcanza el mejor valor en 1,00 y la peor
equilibrada o F medida F. Es puntuación en 0,00. Indica cuán preciso es el
la media armónica de la clasificador.
precisión y la recuperación.
La puntuación F1 resulta útil
cuando desea buscar un
equilibrio entre la precisión y
la recuperación.

Para obtener más información sobre las métricas de clasificación binaria, lea los artículos
siguientes:

¿Exactitud, precisión, recuperación o F1?


Clase de métricas para la clasificación binaria
La relación entre precisión-recuperación y curvas de ROC

Métricas de evaluación para clasificación de


varias clases y clasificación de texto
Métricas Descripción Buscar

Microprecisión La precisión de micropromedio agrega las Cuanto más cerca de 1,00,


contribuciones de todas las clases para calcular la mejor. En una tarea de
métrica promedio. Es la fracción de instancias que clasificación de varias
se predijeron correctamente. El micropromedio no clases, la microprecisión
tiene en cuenta la pertenencia a una clase. es preferible a la
Básicamente, todos los pares de ejemplo y clase macroprecisión si se
contribuyen del mismo modo a la métrica de sospecha que podría
precisión. haber desequilibrio de
clases (es decir, podría
haber muchos más
ejemplos de una clase que
de otras clases).
Métricas Descripción Buscar

Macroprecisión La precisión de macropromedio es la precisión Cuanto más cerca de 1,00,


promedio en el nivel de clase. La precisión de mejor. Calcula la métrica
cada clase se calcula y la macroprecisión es el de forma independiente
promedio de estas precisiones. Básicamente, para cada clase y, a
todas las clases contribuyen del mismo modo a la continuación, toma la
métrica de precisión. Las clases minoritarias tienen media (por lo tanto, se
el mismo peso que las clases más grandes. La consideran todas las
métrica de macropromedio proporciona el mismo clases de igual forma)
peso a cada clase, independientemente de
cuántas instancias de esa clase contiene el
conjunto de datos.

Pérdida de La pérdida logarítmica mide el rendimiento de un Cuanto más cerca de


registro modelo de clasificación donde la entrada de 0,00, mejor. Un modelo
predicción es un valor de probabilidad de entre perfecto tendría una
0,00 y 1,00. La pérdida de registro aumenta a pérdida de registro de
medida que la probabilidad de predicción difiere 0,00. El objetivo de
de la etiqueta real. nuestros modelos de
Machine Learning es
minimizar este valor.

Reducción de La reducción de pérdida logarítmica se puede Parte de -inf y 1,00,


pérdida interpretar como la ventaja del clasificador sobre donde 1,00 equivale a una
logarítmica una predicción aleatoria. predicción perfecta, y
0,00 indica una
predicción aproximada.
Por ejemplo, si el valor
equivale a 0,20, se puede
interpretar como "la
probabilidad de que una
predicción correcta sea
20 % mejor que el cálculo
aleatorio"

Por lo general, la microprecisión se alinea mejor con las necesidades empresariales de


predicciones de ML. Si desea seleccionar una sola métrica para elegir la calidad de una
tarea de clasificación multiclase, normalmente debería ser la de microprecisión.

Ejemplo, para una tarea de clasificación de incidencias de soporte técnico: (asigna


incidencias entrantes a los equipos de soporte técnico)

Microprecisión: ¿con qué frecuencia se clasifica una incidencia entrante en el


equipo adecuado?
Macroprecisión: en un equipo medio, ¿con qué frecuencia es correcta una
incidencia entrante para su equipo?
La macroprecisión proporciona más peso a los equipos pequeños en este ejemplo: un
equipo pequeño que obtiene solo 10 incidencias al año cuenta tanto como un equipo
grande con 10 000 incidencias al año. En este caso, la microprecisión se correlaciona
mejor con la necesidad empresarial que se pregunta "cuánto tiempo y dinero puede
ahorrar la compañía automatizando mi proceso de enrutamiento de incidencias".

Para obtener más información sobre las métricas de clasificación multiclase, lea los
artículos siguientes:

Micropromedio y macropromedio de precisión, recuperación y puntuación F


Clasificación multiclase con un conjunto de datos desequilibrado

Métricas de evaluación de regresión y


recomendación
Las tareas de regresión y las de recomendación predicen un número. En caso de
regresión, el número puede ser cualquier propiedad de salida influida por las
propiedades de entrada. En caso de recomendación, el número suele ser un valor de
clasificación (entre 1 y 5, por ejemplo) o una recomendación de sí/no (representada por
1 y 0, respectivamente).

Métrica Descripción Buscar

R R cuadrado (R2) , o el coeficiente de determinación Cuanto más cerca de 1,00, es


cuadrado representan la eficacia predictiva del modelo como mejor la calidad. Sin
un valor comprendido entre -inf y 1,00. 1,00 significa embargo, a veces valores
que hay un ajuste perfecto y, dado que el ajuste bajos de R cuadrado (por
puede ser arbitrariamente deficiente, las ejemplo, 0,50) pueden ser
puntuaciones pueden ser negativas. Una puntuación completamente normales o
de 0,00 significa que el modelo consiste en adivinar lo suficientemente buenos
el valor esperado para la etiqueta. Un valor R2 en un escenario, y los valores
negativo indica que el ajuste no sigue la tendencia altos de R cuadrado no
de los datos y el modelo funciona peor que el siempre son buenos y
cálculo aleatorio. Esto solo es posible con modelos pueden ser sospechosos.
de regresión no lineal o con regresión lineal
restringida. R2 mide la proximidad de los valores de
datos de prueba reales a los valores de predicción.
Métrica Descripción Buscar

Pérdida La pérdida absoluta o la desviación media (MAE) Cuanto más cerca de 0,00,
absoluta mide la proximidad de las predicciones a los es mejor la calidad. La
resultados reales. Se trata de la media de todos los desviación media utiliza la
errores del modelo, donde el error del modelo es la misma escala que los datos
distancia absoluta entre el valor de la etiqueta que se van a medir (no se
predicho y el valor de la etiqueta correcto. Este error normaliza en un intervalo
de predicción se calcula para cada registro del específico). La pérdida
conjunto de datos de prueba. Por último, el valor absoluta, la pérdida
medio se calcula para todas las desviaciones medias cuadrática y la pérdida de
registradas. RMS solo pueden usarse
para realizar comparaciones
entre los modelos del mismo
conjunto de datos o el
conjunto de datos y una
distribución de valores de
etiqueta similar.

Pérdida La pérdida cuadrática o error cuadrático medio Siempre es un valor no


cuadrática (MSE), también conocido como desviación cuadrática negativo y los valores
media (MSD), indica la proximidad de una línea de próximos a 0,00 son
regresión con respecto a un conjunto de valores de mejores. En función de los
datos de prueba al medir las distancias desde los datos, puede resultar
puntos a la línea de regresión (estas distancias son imposible obtener un valor
los errores E) y elevarlas al cuadrado. El cuadrado muy pequeño para el error
proporciona más peso a las grandes diferencias. cuadrático medio.

Pérdida La pérdida de RMS o el error de raíz cuadrada Siempre es un valor no


de RMS media (RMSE) (también denominado desviación de negativo y los valores
raíz cuadrada media, RMSD), mide la diferencia entre próximos a 0,00 son
los valores predichos por un modelo y los valores mejores. RMSD es una
que se observan en el entorno que se está medida de precisión para
modelando. La pérdida de RMS es la raíz cuadrada comparar errores de
de la pérdida cuadrática y tiene las mismas unidades previsión de diferentes
de la etiqueta, similar a la pérdida absoluta aunque modelos en determinado
proporciona más peso a las grandes diferencias. El conjunto de datos y no entre
error de raíz cuadrada media se usa habitualmente conjuntos de datos, ya que
en la climatología, la previsión y el análisis de es dependiente de la escala.
regresión para comprobar resultados
experimentales.

Para obtener más información sobre las métricas de regresión, lea los artículos
siguientes:

Análisis de regresión: ¿Cómo se puede interpretar el R cuadrado y evaluar la


adecuación del ajuste?
Cómo interpretar el R cuadrado en el análisis de regresión
Definición de R cuadrado
El coeficiente de determinación y las hipótesis de los modelos de regresión
lineal
Definición de error de raíz cuadrada media
¿Qué son el error cuadrático medio y el error de raíz cuadrada media?

Métricas de evaluación para la agrupación en


clústeres
Métrica Descripción Buscar

Distancia Promedio de la distancia entre los puntos Los valores más próximos a 0 son
media de datos y el centro de su clúster asignado. mejores. Cuanto más se acerque a
La distancia media es una medida de cero la distancia media, más
proximidad de los puntos de datos a los agrupados estarán los datos. Tenga
centroides de clúster. Es una medida del en cuenta, sin embargo, que esta
grado de "ajuste" del clúster. métrica disminuirá si se aumenta el
número de clústeres y, en el caso
extremo (en el que cada uno de los
distintos puntos de datos es su
propio clúster) será igual a cero.

Índice de La relación media entre las distancias dentro Los valores más próximos a 0 son
Davies del clúster y las distancias entre clústeres. mejores. Los clústeres que estén
Bouldin Cuanto más ajustado sea el clúster y más más separados y menos dispersos
separados estén los clústeres, más bajo será generarán una mejor puntuación.
este valor.

Información Se puede usar si los datos de Los valores más próximos a 1 son
mutua entrenamiento usados para entrenar el mejores
normalizada modelo de agrupación en clústeres se
incluyen también con etiquetas verdaderas
(es decir, agrupación en clústeres
supervisada). La métrica de información
mutua normalizada mide si se asignan
puntos de datos similares al mismo clúster y
puntos de datos dispares a clústeres
distintos. La información mutua
normalizada es un valor entre 0 y 1

Métricas de evaluación para la clasificación


Métrica Descripción Buscar
Métrica Descripción Buscar

Ganancias Las ganancias acumuladas descontadas (DCG) son una medida de Los
acumuladas calidad de la clasificación. Se derivan de dos suposiciones. Una: los valores
descontadas elementos altamente pertinentes resultan más útiles si aparecen más más altos
arriba en orden de clasificación. Dos: la utilidad realiza un son
seguimiento de la pertinencia, es decir, cuanto mayor es la mejores
pertinencia, más útil es un artículo. Las ganancias acumuladas
descontadas se calculan para conseguir una posición determinada en
el orden de clasificación. Suma la calificación de pertinencia dividida
por el logaritmo del índice de clasificación hasta la posición de
rel i
p
interés. Se calcula mediante ∑ i = 0 log i+1
Las calificaciones de
e

pertinencia se proporcionan a un algoritmo de entrenamiento de


clasificación como etiquetas verdaderas. Un valor de DCG se
proporciona para cada posición de la tabla de clasificación, de ahí el
nombre de ganancias acumuladas descontadas.

Ganancias La normalización de DCG permite la comparación de la métrica para Los


acumuladas las listas de clasificación de diferentes longitudes valores
descontadas más
normalizadas próximos
a 1 son
mejores

Métricas de evaluación de detección de


anomalías
Métrica Descripción Buscar

Área bajo El área bajo la curva receptor-operador mide el Los valores más próximos a 1 son
la curva grado de eficacia del modelo al separar los mejores. Solo los valores mayores
de ROC puntos de datos anómalos y los habituales. que 0,5 muestran la eficacia del
modelo. Los valores de 0,5 o
menos indican que el modelo no
es mejor que la asignación
aleatoria de las entradas a
categorías anómalas y habituales

Tasa de La tasa de detección en el recuento de falsos Los valores más próximos a 1 son
detección positivos es la relación entre el número de mejores. Si no hay ningún falso
en el anomalías identificadas correctamente y el positivo, este valor será 1
recuento número total de anomalías de un conjunto de
de falsos prueba, indexada por cada falso positivo. Es
positivos decir, hay un valor de la tasa de detección en el
recuento de falsos positivos para cada
elemento de falsos positivos.
Métricas de evaluación para similitud de
oraciones
Metric Descripción Buscar

Correlación La correlación de Pearson , Los valores absolutos más cercanos a 1 son más
de Pearson también conocida como similares. Esta métrica va de -1 a 1. Un valor
coeficiente de correlación, absoluto de 1 implica que los conjuntos de datos
mide la dependencia o son idénticos. Un valor de 0 implica que no hay
relación entre dos conjuntos ninguna relación entre los dos conjuntos de datos.
de datos.
Mejora del modelo [Link]
Artículo • 10/05/2023

Aprenda a mejorar el modelo [Link].

Replantear el problema
En ocasiones, es posible que mejorar un modelo no tenga nada que ver con los datos o
las técnicas utilizadas para entrenar el modelo. En su lugar, puede que solo se esté
haciendo la pregunta incorrecta. Considere la posibilidad de abordar el problema desde
distintos ángulos y aproveche los datos para extraer los indicadores latentes y las
relaciones ocultas para refinar la pregunta.

Proporcionar más ejemplos de datos


Como los humanos, cuantos más algoritmos de aprendizaje se obtengan, mayor es la
probabilidad de que aumente el rendimiento. Una manera de mejorar el rendimiento
del modelo es proporcionar más ejemplos de datos de entrenamiento para los
algoritmos. Cuanto mayor sea el número de datos del que se aprende, más casos será
capaz de identificar correctamente.

Agregar contexto a los datos


El significado de un único punto de datos puede ser difícil de interpretar. Crear contexto
en torno a los puntos de datos ayuda a los algoritmos, así como a los expertos en la
materia a tomar mejores decisiones. Por ejemplo, el solo hecho de que una casa tenga
tres dormitorios no es un buen indicador de su precio. Sin embargo, si agrega el
contexto y ahora ya sabe que se encuentra en un vecindario suburbano de las afueras
de un área metropolitana importante donde la edad media es de 38 años, los ingresos
medios por hogar son de 80 000 dólares y las escuelas están en el percentil 20 superior,
el algoritmo proporciona más información en la cual poder basar sus decisiones. Todo
este contexto se puede agregar como entrada al modelo de Machine Learning como
características.

Usar características y datos significativos


Aunque más muestras de datos y características pueden ayudar a mejorar la precisión
del modelo, también es posible introducir ruido ya que no todos los datos y las
características son significativos. Por lo tanto, es importante entender qué características
son las que tienen mayor impacto en las decisiones que toma el algoritmo. El uso de
técnicas como la importancia de características de permutación (PFI) puede ayudar a
identificar esas características más destacadas y no solo ayuda a explicar el modelo, sino
también a usar la salida como un método de selección de características para reducir la
cantidad de características ruidosas que entran en el proceso de entrenamiento.

Para obtener más información sobre cómo usar PFI, consulte Explicación de las
predicciones del modelo mediante la importancia de características de permutación.

Validación cruzada
La validación cruzada es una técnica de evaluación de modelos y entrenamiento que
divide los datos en diversas particiones y entrena varios algoritmos en estas particiones.
Esta técnica mejora la estabilidad del modelo que contiene datos del proceso de
entrenamiento. Además de mejorar el rendimiento en observaciones no vistas y en
entornos con limitaciones de datos, puede ser una herramienta eficaz para el
entrenamiento de modelos con un conjunto de datos más pequeño.

Visite el siguiente vínculo para obtener información sobre cómo utilizar la validación
cruzada en [Link]

Ajuste de hiperparámetros
El entrenamiento de modelos de aprendizaje automático es un proceso iterativo y
exploratorio. Por ejemplo, ¿cuál es el número óptimo de clústeres al entrenar un modelo
con el algoritmo K-Means? La respuesta depende de muchos factores, como la
estructura de los datos. Para buscar ese número se necesitaría experimentar con
diferentes valores de k y después evaluar el rendimiento para determinar qué valor es el
mejor. La práctica de ajustar los parámetros que guían el proceso de entrenamiento
para encontrar un modelo óptimo se conoce como ajuste de hiperparámetros.

Elegir un algoritmo diferente


Las tareas de aprendizaje automático, como la clasificación y la regresión, contienen
diversas implementaciones de algoritmos. Puede ser el caso de que el problema que
intenta resolver y la manera en que sus datos están estructurados no se ajusten bien en
el algoritmo actual. En este caso, considere el uso de un algoritmo diferente en la tarea
para ver si aprende mejor de los datos.

El siguiente vínculo proporciona más ayuda sobre qué algoritmo elegir.


Carga de datos de entrenamiento en el
Generador de modelos
Artículo • 10/05/2023

Obtenga información sobre cómo cargar los conjuntos de datos de entrenamiento


desde un archivo o una base de datos de SQL Server para su uso en uno de los
escenarios del Generador de modelos para [Link]. Los escenarios del generador de
modelos pueden usar bases de datos de SQL Server, archivos de imagen y formatos de
archivo CSV o TSV como datos de entrenamiento.

Model Builder solo acepta archivos TSV, CSV y TXT con delimitadores de coma,
tabulación y punto y coma, e imágenes PNG y JPG.

Escenarios del Generador de modelos


El Generador de modelos ayuda a crear modelos para los siguientes escenarios de
aprendizaje automático:

Clasificación de datos (clasificación binaria y multiclase &): clasifique los datos de


texto en dos o más categorías.
Predicción de valores (regresión): predice un valor numérico.
Clasificación de imágenes (aprendizaje profundo): clasifique las imágenes en dos o
más categorías.
Recomendación (recomendación): genere una lista de elementos sugeridos para
un usuario determinado.
Detección de objetos (aprendizaje profundo): detecte e identifique el objeto en las
imágenes. Puede encontrar uno o varios objetos y etiquetarlos en consecuencia.

En este artículo se describen los escenarios de clasificación y regresión con datos


textuales o numéricos, los de clasificación de imágenes y los de detección de objetos.

Carga de texto o datos numéricos desde un


archivo
Puede cargar texto o datos numéricos desde un archivo al Generador de modelos.
Acepta formatos de archivo delimitados por comas (CSV) o delimitado por
tabulaciones(TSV).
1. En el paso de datos de Model Builder, seleccione Archivo como tipo de origen de
datos.

2. Seleccione el botón Examinar situado junto al cuadro de texto y use el Explorador


de archivos para examinar y seleccionar el archivo de datos.

3. Elija una categoría en el menú desplegable Column to Predict (Label) [Columna


para la predicción (etiqueta)].

7 Nota

(Opcional) Escenarios de clasificación de datos: si el tipo de datos de la


columna de etiqueta (el valor de la lista desplegable "Column to predict
(Label)") [Columna para la predicción (etiqueta)] está establecido en Booleano
(True/False), se usa un algoritmo de clasificación binaria en la canalización de
entrenamiento del modelo. De lo contrario, se usa un instructor de
clasificación multiclase. Use Opciones avanzadas de datos para modificar el
tipo de datos de la columna de etiqueta e informar a Model Builder sobre el
tipo de instructor que debe usar para los datos.

4. Actualice los datos en el vínculo Opciones avanzadas de datos para establecer la


configuración de columna o para actualizar el formato de los datos.

Ha terminado de configurar el archivo de origen de datos para el Generador de


modelos. Haga clic en el botón Paso siguiente para ir al paso siguiente en Model
Builder.

Carga de datos desde una base de datos de SQL Server


El Generador de modelos admite la carga de datos desde bases de datos de SQL Server
locales y remotas.

Archivo de base de datos local


Para cargar datos desde un archivo de base de datos de SQL Server en Model Builder,
haga lo siguiente:

1. En el paso de datos de Model Builder, seleccione SQL Server como tipo de origen
de datos.

2. Seleccione el botón Elegir origen de datos.


a. En el cuadro de diálogo Elegir origen de datos, seleccione Archivo de base de
datos de Microsoft SQL Server.
b. Desactive la casilla Usar siempre esta selección y seleccione Continuar.
c. En el cuadro de diálogo Propiedades de conexión, seleccione Examinar y
después el archivo .MDF descargado.
d. Seleccione Aceptar.

3. Elija el nombre del conjunto de datos en la lista desplegable Table Name (Nombre
de la tabla).

4. En la lista desplegable Column to Predict (Label) [Columna para la predicción


(etiqueta)], elija la categoría de datos en la que quiere crear una predicción.

7 Nota

(Opcional) Escenarios de clasificación de datos: si el tipo de datos de la


columna de etiqueta (el valor de la lista desplegable "Column to predict
(Label)") [Columna para la predicción (etiqueta)] está establecido en Booleano
(True/False), se usa un algoritmo de clasificación binaria en la canalización de
entrenamiento del modelo. De lo contrario, se usa un instructor de
clasificación multiclase. Use Opciones avanzadas de datos para modificar el
tipo de datos de la columna de etiqueta e informar a Model Builder sobre el
tipo de instructor que debe usar para los datos.

5. Actualice los datos en el vínculo Opciones avanzadas de datos para establecer la


configuración de columna o para actualizar el formato de los datos.

Base de datos remota


Para cargar datos desde una conexión de base de datos en Model Builder:

1. En el paso de datos de Model Builder, seleccione SQL Server como tipo de origen
de datos.

2. Seleccione el botón Elegir origen de datos.


a. En el cuadro de diálogo Elegir origen de datos, seleccione
Microsoft SQL Server.

3. En el cuadro de diálogo Propiedades de conexión, escriba las propiedades de la


base de datos Microsoft SQL.
a. Indique el nombre del servidor que tiene la tabla a la que quiere conectarse.
b. Configure la autenticación en el servidor. Si Autenticación de SQL Server está
seleccionada, escriba el nombre de usuario y la contraseña del servidor.
c. Seleccione a qué base de datos conectarse en la lista desplegable Seleccionar o
escribir el nombre de la base de datos. Debería rellenarse automáticamente si
el nombre del servidor y la información de inicio de sesión son correctos.
d. Seleccione Aceptar.

4. Elija el nombre del conjunto de datos en la lista desplegable Table Name (Nombre
de la tabla).

5. En la lista desplegable Column to Predict (Label) [Columna para la predicción


(etiqueta)], elija la categoría de datos en la que quiere crear una predicción.

7 Nota

(Opcional) Escenarios de clasificación de datos: si el tipo de datos de la


columna de etiqueta (el valor de la lista desplegable "Column to predict
(Label)") [Columna para la predicción (etiqueta)] está establecido en Booleano
(True/False), se usa un algoritmo de clasificación binaria en la canalización de
entrenamiento del modelo. De lo contrario, se usa un instructor de
clasificación multiclase. Use Opciones avanzadas de datos para modificar el
tipo de datos de la columna de etiqueta e informar a Model Builder sobre el
tipo de instructor que debe usar para los datos.

6. Actualice los datos en el vínculo Opciones avanzadas de datos para establecer la


configuración de columna o para actualizar el formato de los datos.

Ha terminado de configurar el archivo de origen de datos para el Generador de


modelos. Haga clic en el vínculo del botón Paso siguiente para ir al paso siguiente en
Model Builder.

Configuración de archivos de datos de


clasificación de imágenes
Model Builder espera que los datos de clasificación de imágenes sean archivos JPG o
PNG organizados en carpetas que se corresponden con las categorías de la clasificación.

Para cargar imágenes al Generador de modelos, proporcione la ruta de acceso a un


único directorio de nivel superior:
Este directorio de nivel superior contiene una subcarpeta para cada una de las
categorías que se van a predecir.
Cada subcarpeta contiene los archivos de imagen que pertenecen a su categoría.

En la estructura de carpetas que se muestra a continuación, el directorio de nivel


superior es flower_photos. Hay cinco subdirectorios que se corresponden con las
categorías que quiere predecir: daisy, dandelion, roses, sunflowers y tulips. Cada uno de
estos subdirectorios contiene imágenes que pertenecen a su categoría correspondiente.

text

\---flower_photos
+---daisy
| 100080576_f52e8ee070_n.jpg
| 102841525_bd6628ae3c.jpg
| 105806915_a9c13e2106_n.jpg
|
+---dandelion
| 10443973_aeb97513fc_m.jpg
| 10683189_bd6e371b97.jpg
| 10919961_0af657c4e8.jpg
|
+---roses
| 102501987_3cdb8e5394_n.jpg
| 110472418_87b6a3aa98_m.jpg
| 118974357_0faa23cce9_n.jpg
|
+---sunflowers
| 127192624_afa3d9cb84.jpg
| 145303599_2627e23815_n.jpg
| 147804446_ef9244c8ce_m.jpg
|
\---tulips
100930342_92e8746431_n.jpg
107693873_86021ac4ea_n.jpg
10791227_7168491604.jpg

Configuración de archivos de datos de imagen


para detección de objetos
Model Builder espera que los datos de imagen para detección de objetos tengan el
formato JSON generado a partir de VoTT . El archivo JSON se encuentra en la carpeta
vott-json-export de la Ubicación de destino que se especifica en la configuración del
proyecto.

El archivo JSON consta de la siguiente información generada a partir de VoTT:


Todas las etiquetas que se crearon.
Las ubicaciones de los archivos de imagen.
La información del cuadro de límite de la imagen.
La etiqueta asociada a la imagen.

Para más información sobre cómo preparar los datos para la detección de objetos,
consulte Generación de datos de detección de objetos a partir de VoTT.

Pasos siguientes
Siga estos tutoriales para crear aplicaciones de aprendizaje automático con el
Generador de modelos:

Generación de datos de detección de objetos a partir de VoTT


Predicción de precios mediante regresión
Análisis de sentimiento en una aplicación web mediante la clasificación binaria

Si va a entrenar un modelo mediante código, aprenda a cargar datos mediante la API de


[Link].
Etiquetado de imágenes para la
detección de objetos mediante VoTT
Artículo • 08/06/2023

Obtenga información sobre cómo usar VoTT (Visual Object Tagging Tool) a fin de
etiquetar imágenes para la detección de objetos que se usarán en Model Builder.

Creación de un proyecto de VoTT


1. Descargue VoTT (Visual Object Tagging Tool).

2. Abra VoTT y seleccione New Project (Nuevo proyecto).

3. En Project Settings (Configuración del proyecto), cambie Display Name (Nombre


para mostrar) por el que elija.

4. Cambie el valor de Security Token (Token de seguridad) a Generate New Security


Token (Generar un token de seguridad).

5. Junto a Source Connection (Conexión de origen), seleccione Add Connection


(Agregar conexión).

6. En Connection Settings (Configuración de conexión), cambie Display Name


(Nombre para mostrar) de la conexión de origen por el que elija y seleccione Local
File System (Sistema de archivos local) en Provider (Proveedor). En Folder Path
(Ruta de la carpeta), seleccione la carpeta que contiene las imágenes de
entrenamiento y, a continuación, Save Connection (Guardar conexión).

7. En Project Settings (Configuración del proyecto), cambie el valor Source


Connection (Conexión de origen) a la conexión que acaba de crear.

8. Cambie también el valor Target Connection (Conexión de destino) a la misma


conexión.

9. Seleccione Save Project (Guardar proyecto).

Incorporación de etiquetas y etiquetado de


imágenes
Ahora debería ver una ventana con imágenes de vista previa de todas las imágenes de
entrenamiento a la izquierda, una vista previa de la imagen seleccionada en el centro y
una columna Tags (Etiquetas) a la derecha. Esta pantalla es el editor de etiquetas.

1. Seleccione el primer icono (con forma de más) en la barra de herramientas Tags


(Etiquetas) para agregar una nueva etiqueta.

2. Asigne un nombre a la etiqueta y presione Entrar en el teclado.

3. Haga clic y arrástrela para dibujar un rectángulo alrededor de cada elemento de la


imagen que desea etiquetar. Si el cursor no permite dibujar un rectángulo, intente
seleccionar la herramienta Draw Rectangle (Dibujar rectángulo) en la barra de
herramientas de la parte superior o use el método abreviado de teclado R .

4. Después de dibujar el rectángulo, seleccione la etiqueta apropiada que creó en los


pasos anteriores para agregar la etiqueta al rectángulo de selección.

5. Haga clic en la imagen de vista previa en la imagen siguiente del conjunto de


datos y repita este proceso.

6. Siga repitiendo los pasos 3 y 4 para cada imagen.

Exportación del archivo JSON de VoTT


Una vez que haya etiquetado todas las imágenes de entrenamiento, puede exportar el
archivo que usará Model Builder para el entrenamiento.
1. Seleccione el cuarto icono en la barra de herramientas izquierda (el que tiene la
flecha diagonal en un cuadro) para ir a Export Settings (Configuración de
exportación).

2. Deje el valor de Provider (Proveedor) como VoTT JSON (JSON de VoTT).

3. Cambie Asset State (Estado del recurso) a Only tagged Assets (Solo los recursos
etiquetados).

4. Desactive la casilla Include Images (Incluir imágenes). Si incluye las imágenes, las
imágenes de entrenamiento se copiarán en la carpeta de exportación que se
genera, lo cual no es necesario.

5. Seleccione Save Export Settings (Guardar configuración de exportación).

Esta exportación creará una carpeta con el nombre vott-json-export en la carpeta del
proyecto y generará un archivo JSON con el nombre ProjectName-export en esa nueva
carpeta. Usará este archivo JSON para entrenar un modelo de detección de objetos en
Model Builder.

Pasos siguientes
Para usar VoTT con un escenario de detección de objetos en Model Builder,
consulte Detección de señales de detención en imágenes con Model Builder.
Cómo instalar el Generador de modelos
de [Link]
Artículo • 09/05/2023

Obtenga información sobre cómo instalar el Generador de modelos de [Link] para


agregar aprendizaje automático a las aplicaciones. NET.

Prerrequisitos
Visual Studio 2022 o Visual Studio 2019.
SDK de .NET Core 3.1 o versiones posteriores.

Limitaciones
La extensión Generador de modelos de [Link] solo funciona actualmente en
Visual Studio para Windows.

Instalación de un generador de modelos


[Link] Model Builder está integrado en Visual Studio. Para habilitarla:

Visual Studio 2022

1. Abra el instalador de Visual Studio.

2. Seleccione Modificar para modificar la versión actual de Visual Studio.

3. En el Instalador de Visual Studio, seleccione la pestaña Componentes


individuales.

4. En la lista de componentes de .NET, active la casilla [Link] Model Builder.


Desinstalación de Model Builder


[Link] Model Builder está integrado en Visual Studio. Para deshabilitarlo:

Visual Studio 2022

1. Abra el instalador de Visual Studio.

2. Seleccione Modificar para modificar la versión actual de Visual Studio.

3. En el Instalador de Visual Studio, seleccione la pestaña Componentes


individuales.

4. En la lista de componentes de .NET, desactive la casilla [Link] Model


Builder.

Actualización de Model Builder


Model Builder se actualiza automáticamente cuando hay una nueva versión.

Sin embargo, si prefiere instalar manualmente la versión más reciente, descárguela


desde Visual Studio Marketplace o use el Administrador de extensiones de
Visual Studio. Consulte cómo actualizar una extensión de Visual Studio para obtener
más información.
Procedimiento para instalar la
compatibilidad con GPU en Model
Builder
Artículo • 09/03/2023

Aprenda a instalar los controladores de GPU para usar la GPU con Model Builder.

Requisitos de hardware
Al menos una GPU compatible con CUDA. Para obtener una lista de las GPU
compatibles, vea la guía de NVIDIA .
Al menos 6 GB de memoria de GPU dedicada.

Prerrequisitos
Extensión Model Builder de Visual Studio. La extensión se integra en Visual Studio
a partir de la versión 16.6.1.
Asegúrese de que el controlador adecuado está instalado para la GPU.

Solo clasificación de imágenes


Cuenta de desarrollador de NVIDIA. En caso de no tener ninguna, cree una cuenta
gratuita .
Instalar dependencias
Instale CUDA v10.1 . Asegúrese de instalar CUDA v10.1, y no cualquier otra
versión más reciente.
Instale cuDNN v7.6.4 para CUDA 10.1 . No puede tener varias versiones de
cuDNN instaladas. Después de descargar el archivo ZIP de cuDNN v7.6.4 y
desempaquetarlo, copie <CUDNN_zip_files_path>\cuda\bin\cudnn64_7.dll en
<YOUR_DRIVE>\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin .

Solución de problemas
¿Qué ocurre si no tengo una GPU instalada en el entorno local?

Los escenarios de aprendizaje profundo tienden a ejecutarse más rápido en las GPU.
Algunos escenarios, como la clasificación de imágenes, admiten el entrenamiento en
máquinas virtuales de GPU de Azure.

Sin embargo, si las GPU locales o Azure no son una opción para usted, estos escenarios
también se ejecutan en la CPU. Tenga en cuenta que los tiempos de entrenamiento son
significativamente más largos.

¿Cómo puedo saber qué GPU tengo?

1. Haga clic con el botón derecho en el escritorio.


2. Si ve "Panel de control de NVIDIA" o "Pantalla de NVIDIA" en la ventana
emergente, significa que tiene una GPU de NVIDIA.
3. Haga clic en "Panel de control de NVIDIA" o en "Pantalla de NVIDIA" en la ventana
emergente.
4. Consulte "Información de tarjeta gráfica".
5. Verá el nombre de la GPU de NVIDIA.

No veo el panel de control de NVIDIA (o no se abre), pero sé que tengo una GPU de
NVIDIA.

1. Abra el Administrador de dispositivos


2. Consulte los adaptadores de pantalla.
3. Instale el controlador adecuado para la GPU.

¿Cómo puedo ver qué versión de CUDA tengo?

1. Abra una ventana de PowerShell o de línea de comandos


2. Tipo en nvcc --version

cuda no está disponible, confirme que tiene una GPU compatible con cuda.

1. Abra la aplicación GeForce Experience .


2. La aplicación debe mostrar las actualizaciones de los controladores instaladas y
disponibles. Si tiene problemas para ver las actualizaciones, en
[Link] encontrará los controladores más
recientes.
3. Instale los controladores más recientes.
Cómo instalar la herramienta de la
interfaz de la línea de comandos (CLI)
de [Link]
Artículo • 13/03/2023

Obtenga información sobre cómo instalar la CLI (interfaz de la línea de comandos) de


[Link] en Windows, Mac o Linux.

La CLI de [Link] genera código fuente y modelos de [Link] de buena calidad


mediante el aprendizaje automático automatizado (AutoML) y un conjunto de datos de
entrenamiento.

7 Nota

Este tema hace referencia a la CLI de [Link] y AutoML de [Link], que se


encuentran actualmente en versión preliminar, por lo que el material está sujeto a
cambios.

Requisitos previos
SDK de .NET 6

(Opcional) Visual Studio 2022

Puede ejecutar los proyectos del código de C# generado con Visual Studio presionando
la tecla F5 o con dotnet run (CLI de .NET).

Nota: Si después de instalar el SDK de .NET el comando dotnet tool no funciona, cierre
la sesión de Windows y vuelva a iniciarla.

Instalar
La CLI de [Link] se instala como cualquier otra herramienta global de dotnet. Debe
usar el comando dotnet tool install --global de la CLI de .NET.

La CLI de [Link] está disponible para Windows, macOS y Linux. En función de la


arquitectura del procesador, elija la versión x64 o ARM.
7 Nota

Las versiones basadas en ARM de la CLI de [Link] no admiten escenarios de


clasificación de imágenes.

Windows

x64

CLI de .NET

dotnet tool install --global mlnet-win-x64

ARM

CLI de .NET

dotnet tool install --global mlnet-win-arm64

Si la herramienta no se puede instalar (es decir, si no está disponible con la fuente de


NuGet predeterminada), se muestran mensajes de error. Verifique que se comprueban
las fuentes que esperaba.

Si la instalación es correcta, se muestra un mensaje similar al siguiente con el comando


que se usa para llamar a la herramienta y la versión instalada:

Consola

You can invoke the tool using the following command: mlnet
Tool 'mlnet-<OS>-<ARCH>' (version 'X.X.X') was successfully installed.

En este caso, OS y ARCH deben coincidir con los valores del sistema operativo y la
arquitectura del procesador que seleccionó al instalar la CLI de [Link].

Para confirmar que la instalación se realizó correctamente, escriba el comando siguiente:

Consola

mlnet
Debería ver la Ayuda correspondiente a los comandos disponibles para la herramienta
de mlnet, como el comando "classification".

) Importante

Si ejecuta Linux o macOS y usa una consola que no sea Bash (por ejemplo, zsh, que
es el nuevo valor predeterminado para macOS), tendrá que conceder permisos
ejecutables mlnet e incluir mlnet en la ruta del sistema. En general, puede hacerlo
con los siguientes comandos:

Consola

chmod +x <PATH-TO-MLNET-CLI-EXECUTABLE>

Deben aparecer instrucciones más detalladas sobre cómo hacerlo en el terminal al


instalar mlnet (o cualquier herramienta global).

Como alternativa, puede intentar usar el comando siguiente para ejecutar la


herramienta mlnet:

Consola

~/.dotnet/tools/mlnet

Instalar una versión de lanzamiento específica


Si está intentando instalar una versión preliminar o una versión específica de la
herramienta, puede especificar el sistema operativo, la arquitectura del procesador y el
marco con el formato siguiente:

CLI de .NET

dotnet tool install -g mlnet-<OS>-<ARCH> --framework <FRAMEWORK>

También puede comprobar si el paquete está instalado correctamente. Para ello, escriba
el comando siguiente:

CLI de .NET

dotnet tool list -g


Desinstalar el paquete de la CLI
Para desinstalar la CLI de [Link], use el identificador de paquete que obtendrá al
ejecutar el comando dotnet tool list --global . Después, use el comando dotnet tool
uninstall --global .

Windows

x64

CLI de .NET

dotnet tool uninstall --global mlnet-win-x64

ARM

CLI de .NET

dotnet tool uninstall --global mlnet-win-arm64

Actualizar el paquete de la CLI


Para actualizar la CLI de [Link], use el identificador de paquete que obtendrá al
ejecutar el comando dotnet tool list --global . Después, use el comando dotnet tool
update --global .

Windows

x64

CLI de .NET

dotnet tool update --global mlnet-win-x64

ARM
CLI de .NET

dotnet tool update --global mlnet-win-arm64

Directorio de instalación
La CLI de [Link] puede instalarse en el directorio predeterminado o en una ubicación
específica. Los directorios predeterminados son:

SO Ruta de acceso

Linux/macOS $HOME/.dotnet/tools

Windows %USERPROFILE%\.dotnet\tools

Estas ubicaciones se agregan a la ruta de acceso del usuario cuando se ejecuta el SDK
por primera vez, permitiendo así llamar directamente a las herramientas globales allí
instaladas.

Nota: Las herramientas globales son específicas del usuario, no de la máquina. Específica
del usuario significa que no se puede instalar una herramienta global que está
disponible para todos los usuarios de la máquina. La herramienta solo está disponible
para cada perfil de usuario en el que se instaló la herramienta.

Las herramientas globales también pueden instalarse en un directorio específico.


Cuando se instalan en un directorio específico, el usuario debe incluir el directorio en la
ruta de acceso a fin de asegurarse de que el comando está disponible. Hay dos maneras
de hacerlo: llamar al comando con el directorio especificado, o llamar a la herramienta
desde el directorio especificado. En este caso, la CLI de .NET no agrega esta ubicación
automáticamente a la variable de entorno PATH.

Vea también
Información general sobre la CLI de [Link]
Tutorial: Análisis de opiniones mediante la CLI de [Link]
Guía de referencia de comandos de entrenamiento automático de la CLI de
[Link]
Telemetría en la CLI de [Link]
Cómo usar la API de ML automatizado de
[Link] (AutoML)
Artículo • 10/05/2023

En este artículo aprenderá a usar el ML automatizado de [Link] (API AutoML).

Puede encontrar ejemplos para la API AutoML en el repositorio dotnet/machinelearning-


samples .

Instalación
Para usar la API AutoML, instale el paquete de NuGet [Link] en el proyecto de
.NET en el que quiere hacer referencia.

7 Nota

En esta guía se usa la versión 0.20.0 y posteriores del paquete de NuGet


[Link] . Aunque los ejemplos y el código de versiones anteriores siguen

funcionando, se recomienda encarecidamente usar las API presentadas en esta versión


para nuevos proyectos.

Para obtener más información sobre cómo instalar paquetes de NuGet, consulte las siguientes
guías:

Instalación y uso de un paquete NuGet en Visual Studio


Instalación y uso de un paquete en Visual Studio para Mac
Instalar y usar un paquete (CLI de dotnet)

Inicio rápido
AutoML proporciona varios valores predeterminados para entrenar rápidamente modelos de
aprendizaje automático. En esta sección aprenderá a:

Carga de los datos


Definir la canalización
Configuración del experimento
Ejecutar el experimento
Usar el mejor modelo para realizar predicciones

Definir el problema
Dado un conjunto de datos almacenado en un archivo separado por comas denominado taxi-
[Link] que tiene el siguiente aspecto:

vendor_id rate_code passenger_count trip_time_in_secs trip_distance payment_type fare_amount

CMT 1 1 1271 3.8 CRD 17.5

CMT 1 1 474 1.5 CRD 8

CMT 1 1 637 1.4 CRD 8.5

Carga de los datos


Empiece por inicializar MLContext. MLContext es un punto de partida para todas las operaciones
de [Link]. La inicialización de mlContext crea un nuevo entorno de [Link] que se puede
compartir entre los objetos del flujo de trabajo de creación de modelos. Como concepto, se
parece a DBContext en Entity Framework.

A continuación, para cargar los datos, use el método InferColumns.

C#

// Initialize MLContext
MLContext ctx = new MLContext();

// Define data path


var dataPath = [Link](@"..\..\..\..\Data\[Link]");

// Infer column information


ColumnInferenceResults columnInference =
[Link]().InferColumns(dataPath, labelColumnName: "fare_amount", groupColumns:
false);

InferColumns carga algunas filas desde el conjunto de datos. A continuación, inspecciona los
datos e intenta adivinar o deducir el tipo de datos para cada una de las columnas en función de
su contenido.

El comportamiento predeterminado es agrupar columnas del mismo tipo en vectores de


características o matrices que contienen los elementos para cada una de las columnas
individuales. Establecer groupColumns en false invalida ese comportamiento predeterminado y
solo realiza la inferencia de columnas sin agrupar columnas. Al mantener separadas las
columnas, permite aplicar diferentes transformaciones de datos al preprocesar los datos en el
nivel de columna individual en lugar de la agrupación de columnas.

El resultado de InferColumns es un objeto ColumnInferenceResults que contiene las opciones


necesarias para crear una TextLoader así como la información de columna.

Para el conjunto de datos de ejemplo de [Link], la información de columna puede


tener el siguiente aspecto:
LabelColumnName: fare_amount
CategoricalColumnNames: vendor_id, payment_type
NumericColumnNames: rate_code, passenger_count, trip_time_in_secs, trip_distance

Una vez que tenga la información de columna, use la [Link] definida por
ColumnInferenceResults para crear una TextLoader para cargar los datos en una IDataView.

C#

// Create text loader


TextLoader loader = [Link]([Link]);

// Load data into IDataView


IDataView data = [Link](dataPath);

A menudo, se recomienda dividir los datos en conjuntos de entrenamiento y validación. Use


TrainTestSplit para crear una división del conjunto de datos de un 80 % para entrenamiento y un
20 % para validación.

C#

TrainTestData trainValidationData = [Link](data, testFraction:


0.2);

Definir la canalización
La canalización define los pasos del procesamiento de datos y la canalización del aprendizaje
automático que se van a usar para entrenar el modelo.

C#

SweepablePipeline pipeline =
[Link]().Featurizer(data, columnInformation:
[Link])
.Append([Link]().Regression(labelColumnName:
[Link]));

SweepablePipeline es una colección de SweepableEstimator. SweepableEstimator es una clase


Estimator de [Link] con una clase SearchSpace.

Featurizer es una API útil que crea una canalización de estimadores de procesamiento de datos
que pueden rastrearse por barrido en función de la información de columna que proporcione.
En lugar de compilar una canalización desde cero, Featurizer automatiza el paso de
preprocesamiento de datos. Para obtener más información sobre las transformaciones
admitidas por [Link], consulte la guía de transformaciones de datos.

La salida Featurizer es una sola columna que contiene un vector de características numérico que
representa los datos transformados para cada una de las columnas. A continuación, este vector
de características se usa como entrada para los algoritmos que se usan para entrenar un
modelo de aprendizaje automático.

Si desea un control más preciso sobre el preprocesamiento de los datos, puede crear una
canalización con cada uno de los pasos de preprocesamiento individuales. Para obtener más
información, consulte la guía de preparación de datos para compilar un modelo.

 Sugerencia

Use Featurizer con ColumnInferenceResults para maximizar la utilidad de AutoML.

Para el entrenamiento, AutoML proporciona una canalización rastreable por barrido con
instructores predeterminados y configuraciones de espacio de búsqueda para las siguientes
tareas de aprendizaje automático:

BinaryClassification
MultiClassification
Regression

Para el problema de la predicción de tarifas de taxi, dado que el objetivo es predecir un valor
numérico, use Regression . Para obtener más información sobre cómo elegir una tarea,
consulteTareas de aprendizaje automático en [Link]

Configuración del experimento


En primer lugar, cree un experimento de AutoML. AutoMLExperiment es una colección de
TrialResult.

C#

AutoMLExperiment experiment = [Link]().CreateExperiment();

Una vez creado el experimento, use los métodos de extensión que proporciona para configurar
diferentes opciones.

C#

experiment
.SetPipeline(pipeline)
.SetRegressionMetric([Link], labelColumn:
[Link])
.SetTrainingTimeInSeconds(60)
.SetDataset(trainValidationData);

En este ejemplo, puede:


Establecer la canalización rastreable por barrido para que se ejecute durante el
experimento llamando a SetPipeline.
Elegir RSquared como métrica para optimizar durante el entrenamiento llamando a
SetRegressionMetric. Para más información sobre las métricas de evaluación, consulte la
guía de evaluación del modelo de [Link] con métricas.
Establezca 60 segundos como la cantidad de tiempo que desea entrenar llamando
aSetTrainingTimeInSeconds. Una buena heurística para determinar cuánto tiempo se va a
entrenar es el tamaño de los datos. Normalmente, los conjuntos de datos más grandes
requieren más tiempo de entrenamiento. Para obtener más información, vea la guía de
tiempo de entrenamiento.
Proporcione los conjuntos de datos de entrenamiento y validación que se usarán llamando
a SetDataset.

Una vez definido el experimento, querrá realizar el seguimiento de su progreso de alguna


manera. La forma más rápida de realizar un seguimiento del progreso es modificando el evento
Log desde MLContext.

C#

// Log experiment trials


[Link] += (_, e) => {
if ([Link]("AutoMLExperiment"))
{
[Link]([Link]);
}
};

Ejecutar el experimento
Ahora que ha definido el experimento, use el método RunAsync para iniciar el experimento.

C#

TrialResult experimentResults = await [Link]();

Una vez que expire el tiempo de entrenamiento, el resultado es una TrialResult para el mejor
modelo encontrado durante el entrenamiento.

En este punto, puede guardar el modelo o usarlo para realizar predicciones. Para obtener más
información sobre cómo usar un modelo de [Link], consulte las siguientes guías:

Guardar y cargar modelos entrenados


Realizar predicciones con un modelo entrenado
Modificación de los resultados de la columna de
inferencias
Dado que InferColumns solo carga un subconjunto de los datos, es posible que los casos
extremos contenidos fuera de las muestras usadas para inferir columnas no se detecten, y que
se hayan establecidos tipos de datos incorrectos para las columnas. Puede actualizar las
propiedades de ColumnInformation para tener en cuenta esos casos en los que los resultados
de la columna de inferencias no son correctos.

Por ejemplo, en el conjunto de datos de tarifas de taxi, los datos en la columna rate_code son
un número. Sin embargo, ese valor numérico representa una categoría. De forma
predeterminada, llamar a InferColumns colocará rate_code en la propiedad NumericColumnNames
en lugar de CategoricalColumnNames . Dado que estas propiedades son colecciones de .NET,
puede usar operaciones estándar para agregar y quitar elementos de ellas.

Puede hacer lo siguiente para actualizar ColumnInformation para rate_code .

C#

[Link]("rate_code");
[Link]("rate_code");

Excluir instructores
De forma predeterminada, AutoML prueba varios instructores como parte del proceso de
entrenamiento para ver cuál funciona mejor con los datos. Sin embargo, a lo largo del proceso
de entrenamiento, es posible que descubra que hay algunos instructores que usan demasiados
recursos de procesamiento o que no proporcionan buenas métricas de evaluación. Tiene la
opción de excluir instructores del proceso de entrenamiento. Qué instructores se usan depende
de la tarea. Para obtener una lista de los instructores admitidos en [Link], consulte la guía de
tareas de aprendizaje automático en [Link].

Por ejemplo, en el escenario de regresión de tarifas de taxi, para excluir el algoritmo LightGBM,
establezca el parámetro useLgbm en false .

C#

[Link]().Regression(labelColumnName:
[Link], useLgbm:false)

El proceso para excluir instructores en otras tareas, como la clasificación binaria y multiclase,
funciona de la misma manera.
Personalización de un estimador rastreable por
barrido
Cuando quiera una personalización más pormenorizada de las opciones del estimador incluidas
como parte de la canalización rastreable por barrido, debe hacer lo siguiente:

1. Inicializar un espacio de búsqueda


2. Usar el espacio de búsqueda para definir un generador personalizado
3. Crear un estimador rastreable por barrido
4. Agregar el estimador rastreable por barrido a la canalización rastreable por barrido

AutoML proporciona un conjunto de espacios de búsqueda preconfigurados para instructores


en las siguientes tareas de aprendizaje automático:

BinaryClassification
MultiClassification
Regression

En este ejemplo, el espacio de búsqueda usado es para SdcaRegressionTrainer. Inicialícelo


mediante SdcaOption.

C#

var sdcaSearchSpace = new SearchSpace<SdcaOption>();

A continuación, use el espacio de búsqueda para definir un método generador personalizado


para crear SdcaRegressionTrainer. En este ejemplo, los valores de L1Regularization y
L2Regularization se establecen en algo distinto del valor predeterminado. Para
L1Regularization , el valor establecido viene determinado por el optimizador durante cada

prueba. L2Regularization se fija para cada prueba de acuerdo con el valor codificado de forma
rígida. Durante cada prueba, la salida del generador personalizado es SdcaRegressionTrainer
con los hiperparámetros configurados.

C#

// Use the search space to define a custom factory to create an


SdcaRegressionTrainer
var sdcaFactory = (MLContext ctx, SdcaOption param) =>
{
var sdcaOption = new [Link]();
sdcaOption.L1Regularization = param.L1Regularization;
sdcaOption.L2Regularization = 0.02f;

[Link] = [Link];

return [Link](sdcaOption);
};
Un estimador rastreable por barrido es la combinación de un estimador y un espacio de
búsqueda. Ahora que ha definido un espacio de búsqueda y lo ha usado para crear un método
generador personalizado para generar instructores, use el método CreateSweepableEstimator
para crear un nuevo estimador rastreable por barrido.

C#

// Define Sdca sweepable estimator (SdcaRegressionTrainer + SdcaOption search


space)
var sdcaSweepableEstimator = [Link]().CreateSweepableEstimator(sdcaFactory,
sdcaSearchSpace);

Para usar el estimador rastreable por barrido en el experimento, agréguelo a la canalización


rastreable por barrido.

C#

SweepablePipeline pipeline =
[Link]().Featurizer(data, columnInformation:
[Link])
.Append(sdcaSweepableEstimator);

Dado que las canalizaciones rastreables por barrido son una colección de estimadores
rastreables por barrido, puede configurar y personalizar tantos de estos estimadores rastreables
por barrido como necesite.

Personalización del espacio de búsqueda


Hay escenarios en los que desea ir más allá de personalizar los estimadores rastreables por
barrido usados en el experimento y desea controlar el intervalo del espacio de búsqueda. Para
ello, puede acceder a las propiedades del espacio de búsqueda mediante claves. En este caso, el
parámetro L1Regularization es un parámetro float . Por lo tanto, para personalizar el intervalo
de búsqueda, use UniformSingleOption.

C#

sdcaSearchSpace["L1Regularization"] = new UniformSingleOption(min: 0.01f, max:


2.0f, logBase: false, defaultValue: 0.01f);

En función del tipo de datos del hiperparámetro que desee establecer, puede elegir entre las
siguientes opciones:

Números
UniformIntOption
UniformSingleOption
UniformDoubleOption
Booleanos y cadenas
ChoiceOption

Los espacios de búsqueda también pueden contener espacios de búsqueda anidados.

C#

var searchSpace = new SearchSpace();


searchSpace["SingleOption"] = new UniformSingleOption(min:-10f, max:10f,
defaultValue=0f)
var nestedSearchSpace = new SearchSpace();
nestedSearchSpace["IntOption"] = new UniformIntOption(min:-10, max:10,
defaultValue=0);
searchSpace["Nest"] = nestedSearchSpace;

Otra opción para personalizar los intervalos de búsqueda es ampliarlos. Por ejemplo,
SdcaOption solo proporciona los parámetros L1Regularization y L2Regularization . Sin
embargo, SdcaRegressionTrainer tiene más parámetros que puede establecer, como
BiasLearningRate .

Para ampliar el espacio de búsqueda, cree una nueva clase, como SdcaExtendedOption , que
hereda de SdcaOption.

C#

public class SdcaExtendedOption : SdcaOption


{
[Range(0.10f, 1f, 0.01f)]
public float BiasLearningRate {get;set;}
}

Para especificar el intervalo del espacio de búsqueda use RangeAttribute, que es equivalente a
[Link].

A continuación, en cualquier lugar en el que use el espacio de búsqueda, haga referencia a


SdcaExtendedOption en lugar de SdcaOption.

Por ejemplo, al inicializar el espacio de búsqueda, puede hacerlo de la siguiente manera:

C#

var sdcaSearchSpace = new SearchSpace<SdcaExtendedOption>();

Creación de su propio ejecutor de prueba


De forma predeterminada, AutoML admite la clasificación binaria, la clasificación multiclase y la
regresión. Sin embargo, [Link] admite muchos más escenarios, como:

Recomendación
Previsión
Clasificación
Clasificación de imágenes
Clasificación de textos
Similitud de oraciones

Para escenarios que no tienen espacios de búsqueda preconfigurados y estimadores rastreables


por barrido, puede crearlos y usar un ejecutor de prueba para habilitar AutoML para ese
escenario.

Por ejemplo, dados los datos de opiniones de restaurantes que tienen el siguiente aspecto:

¡Anda! Me encantó el lugar.

La corteza no es buena.

Quiere usar el instructor TextClassificationTrainer para analizar la opinión, donde 0 es negativo y


1 es positivo. Sin embargo, no hay ninguna configuración [Link]().TextClassification() .

Para usar AutoML con el instructor de clasificación de texto, tendrá que:

1. Crear su propio espacio de búsqueda.

C#

// Define TextClassification search space


public class TCOption
{
[Range(64, 128, 32)]
public int BatchSize { get; set; }
}

En este caso, AutoML buscará configuraciones diferentes del hiperparámetro BatchSize .

2. Cree un estimador rastreable por barrido y agréguelo a la canalización.

C#

// Initialize search space


var tcSearchSpace = new SearchSpace<TCOption>();

// Create factory for Text Classification trainer


var tcFactory = (MLContext ctx, TCOption param) =>
{
return [Link](
sentence1ColumnName: textColumnName,
batchSize:[Link]);
};

// Create text classification sweepable estimator


var tcEstimator =
[Link]().CreateSweepableEstimator(tcFactory, tcSearchSpace);

// Define text classification pipeline


var pipeline =

[Link]([Link]
lColumnName)
.Append(tcEstimator);

En este ejemplo, se usan el espacio de búsqueda TCOption y un generador


TextClassificationTrainer personalizado para crear un estimador rastreable por barrido.

3. Creación de un ejecutor de prueba personalizado

Para crear un ejecutor de prueba personalizado, implemente ITrialRunner:

C#

public class TCRunner : ITrialRunner


{
private readonly MLContext _context;
private readonly TrainTestData _data;
private readonly IDataView _trainDataset;
private readonly IDataView _evaluateDataset;
private readonly SweepablePipeline _pipeline;
private readonly string _labelColumnName;
private readonly MulticlassClassificationMetric _metric;

public TCRunner(
MLContext context,
TrainTestData data,
SweepablePipeline pipeline,
string labelColumnName = "Label",
MulticlassClassificationMetric metric =
[Link])
{
_context = context;
_data = data;
_trainDataset = [Link];
_evaluateDataset = [Link];
_labelColumnName = labelColumnName;
_pipeline = pipeline;
_metric = metric;
}

public void Dispose()


{
return;
}

// Run trial asynchronously


public Task<TrialResult> RunAsync(TrialSettings settings,
CancellationToken ct)
{
try
{
return [Link](() => Run(settings));
}
catch (Exception ex) when ([Link])
{
throw new OperationCanceledException([Link],
[Link]);
}
catch (Exception)
{
throw;
}
}

// Helper function to define trial run logic


private TrialResult Run(TrialSettings settings)
{
try
{
// Initialize stop watch to measure time
var stopWatch = new Stopwatch();
[Link]();

// Get pipeline parameters


var parameter = [Link]["_pipeline_"];

// Use parameters to build pipeline


var pipeline = _pipeline.BuildFromOption(_context, parameter);

// Train model
var model = [Link](_trainDataset);

// Evaluate the model


var predictions = [Link](_evaluateDataset);

// Get metrics
var evaluationMetrics =
_context.[Link](predictions, labelColumnName:
_labelColumnName);
var chosenMetric = GetMetric(evaluationMetrics);

return new TrialResult()


{
Metric = chosenMetric,
Model = model,
TrialSettings = settings,
DurationInMilliseconds = [Link]
};
}
catch (Exception)
{
return new TrialResult()
{
Metric = [Link],
Model = null,
TrialSettings = settings,
DurationInMilliseconds = 0,
};
}
}

// Helper function to choose metric used by experiment


private double GetMetric(MulticlassClassificationMetrics metric)
{
return _metric switch
{
[Link] =>
[Link],
[Link] =>
[Link],
[Link] => [Link],
[Link] =>
[Link],
[Link] =>
[Link],
_ => throw new NotImplementedException(),
};
}
}

La implementación TCRunner en este ejemplo:

Extrae los hiperparámetros elegidos para esa prueba


Usa los hiperparámetros para crear una canalización de [Link]
Usa la canalización de [Link] para entrenar un modelo
Evalúa el modelo
Devuelve un objeto TrialResult con la información de esa prueba

4. Inicializar el ejecutor de prueba personalizado

C#

var tcRunner = new TCRunner(context: ctx, data: trainValidationData, pipeline:


pipeline);

5. Crear y configurar el experimento. Use el método de extensión SetTrialRunner para


agregar el ejecutor de prueba personalizado al experimento.

C#

AutoMLExperiment experiment = [Link]().CreateExperiment();

// Configure AutoML experiment


experiment
.SetPipeline(pipeline)

.SetMulticlassClassificationMetric([Link]
y, labelColumn: [Link])
.SetTrainingTimeInSeconds(120)
.SetDataset(trainValidationData)
.SetTrialRunner(tcRunner);
6. Ejecutar el experimento

C#

var tcCts = new CancellationTokenSource();


TrialResult textClassificationExperimentResults = await
[Link]([Link]);

Elegir un optimizador diferente


AutoML admite diversos algoritmos de optimización para recorrer en iteración el espacio de
búsqueda, en busca de los hiperparámetros óptimos. De forma predeterminada, usa el
optimizador Eci Cost Frugal. Con métodos de extensión de experimento puede elegir otro
optimizador que se adapte mejor a su escenario.

Use los métodos siguientes para establecer el optimizador:

SMAC - SetSmacTuner
Búsqueda de cuadrícula - SetGridSearchTuner
Búsqueda aleatoria - SetRandomSearchTuner
Cost Frugal - SetCostFrugalTuner
Eci Cost Frugal - SetEciCostFrugalTuner

Por ejemplo, para usar el optimizador de búsqueda de cuadrícula, el código podría ser similar al
siguiente:

C#

[Link]();

Configuración de la supervisión de experimentos


La forma más rápida de supervisar el progreso de un experimento es definir el evento Log
desde MLContext. Sin embargo, el evento Log genera un volcado sin procesar de los registros
generados por AutoML durante cada prueba. Debido a la gran cantidad de información sin
formato, esto es difícil.

Para obtener una experiencia de supervisión más controlada, implemente una clase con la
interfaz IMonitor.

C#

public class AutoMLMonitor : IMonitor


{
private readonly SweepablePipeline _pipeline;
public AutoMLMonitor(SweepablePipeline pipeline)
{
_pipeline = pipeline;
}

public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;

public void ReportBestTrial(TrialResult result)


{
return;
}

public void ReportCompletedTrial(TrialResult result)


{
var trialId = [Link];
var timeToTrain = [Link];
var pipeline = _pipeline.ToString([Link]);
[Link]($"Trial {trialId} finished training in {timeToTrain}ms
with pipeline {pipeline}");
}

public void ReportFailTrial(TrialSettings settings, Exception exception = null)


{
if ([Link]("Operation was canceled."))
{
[Link]($"{[Link]} cancelled. Time budget
exceeded.");
}
[Link]($"{[Link]} failed with exception
{[Link]}");
}

public void ReportRunningTrial(TrialSettings setting)


{
return;
}
}

La interfaz IMonitor tiene cuatro eventos de ciclo de vida:

ReportBestTrial
ReportCompletedTrial
ReportFailTrial
ReportRunningTrial

 Sugerencia

Aunque no es necesario, incluya SweepablePipeline en la supervisión para poder


inspeccionar la canalización que se generó para una prueba mediante la propiedad
Parameter de TrialSettings.

En este ejemplo, solo se implementan ReportCompletedTrial y ReportFailTrial.


Una vez implementada la supervisión, establézcala como parte de la configuración del
experimento mediante SetMonitor.

C#

var monitor = new AutoMLMonitor(pipeline);


[Link](monitor);

A continuación, ejecute el experimento:

C#

var cts = new CancellationTokenSource();


TrialResult experimentResults = await [Link]([Link]);

Al ejecutar el experimento con esta implementación, la salida debe ser similar a la siguiente:

text

Trial 0 finished training in 5835ms with pipeline


ReplaceMissingValues=>OneHotEncoding=>Concatenate=>FastForestRegression
Trial 1 finished training in 15080ms with pipeline
ReplaceMissingValues=>OneHotEncoding=>Concatenate=>SdcaRegression
Trial 2 finished training in 3941ms with pipeline
ReplaceMissingValues=>OneHotHashEncoding=>Concatenate=>FastTreeRegression

Persistencia de las pruebas


De forma predeterminada, AutoML solo almacena TrialResult para el mejor modelo. Sin
embargo, si desea conservar cada una de las pruebas, puede hacerlo desde el monitor.

Dentro del monitor:

1. Defina una propiedad para las pruebas completadas y un método para acceder a ellas.

C#

private readonly List<TrialResult> _completedTrials;

public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;

2. Inicialícelo en el constructor

C#

public AutoMLMonitor(SweepablePipeline pipeline)


{
//...
_completedTrials = new List<TrialResult>();
//...
}

3. Anexe cada resultado de prueba dentro del método de ciclo de vida


ReportCompletedTrial.

C#

public void ReportCompletedTrial(TrialResult result)


{
//...
_completedTrials.Add(result);
}

4. Cuando se complete el entrenamiento, puede acceder a todas las pruebas completadas


llamando a GetCompletedTrials

C#

var completedTrials = [Link]();

En este momento, puede realizar un procesamiento adicional en la colección de pruebas


completadas. Por ejemplo, puede elegir un modelo distinto del seleccionado por AutoML,
registrar los resultados de prueba en una base de datos o recompilar la canalización a partir de
cualquiera de las pruebas completadas.

Cancelación de experimentos
Al ejecutar experimentos de forma asincrónica, asegúrese de finalizar el proceso de forma
limpia. Para ello, use CancellationToken.

2 Advertencia

La cancelación de un experimento no guardará ninguno de los resultados intermedios.


Establezca un punto de control para guardar los resultados intermedios.

C#

var cts = new CancellationTokenSource();


TrialResult experimentResults = await [Link]([Link]);

Establecimiento de puntos de control


Los puntos de control proporcionan una manera de guardar los resultados intermedios del
proceso de entrenamiento en caso de que se produzca una terminación anticipada o un error.
Para establecer un punto de control, use el método de extensión SetCheckpoint y proporcione
un directorio para almacenar los resultados intermedios.

C#

var checkpointPath = [Link]([Link](), "automl");


[Link](checkpointPath);

Determinar la importancia de características


A medida que el aprendizaje automático se introduce en otros aspectos de la vida diaria como
la asistencia sanitaria, es de vital importancia comprender por qué un modelo de Machine
Learning toma esas decisiones. La importancia de la característica de permutación (PFI) es una
técnica que se usa para explicar los modelos de clasificación, orden y regresión. En un nivel alto,
esto funciona de manera es revolviendo los datos de manera aleatoria en una característica a la
vez para todo el conjunto de datos y calculando cuánto se reduce la métrica de rendimiento de
interés. Cuanto mayor sea el cambio, más importante será esa característica. Para obtener más
información sobre PFI, consulte Interpretación de las predicciones del modelo mediante la
importancia de características de permutación.

7 Nota

El cálculo de PFI puede ser una operación que consume mucho tiempo. Cuánto tiempo se
tarda en calcular es proporcional al número de columnas de características que tiene.
Cuantos más características, la PFI más larga tardará en ejecutarse.

Para determinar la importancia de las características mediante AutoML:

1. Obtenga el mejor modelo.

C#

var bestModel = [Link];

2. Aplique el modelo al conjunto de datos.

C#

var transformedData = [Link]([Link]);

3. Calcule la importancia de las características mediante PermutationFeatureImportance

En este caso, la tarea es regresión, pero el mismo concepto se aplica a otras tareas, como
clasificación y clasificación.
C#

var pfiResults =
[Link](bestModel,
transformedData, permutationCount:3);

4. Ordene la importancia de las características mediante cambios en las métricas de


evaluación.

C#

var featureImportance =
[Link](x => [Link]([Link], [Link]))
.OrderByDescending(x => x.Item2);
Instalación de dependencias adicionales
de [Link]
Artículo • 10/05/2023

En la mayoría de los casos, en todos los sistemas operativos, la instalación de [Link] es


tan simple como hacer referencia al paquete NuGet adecuado.

CLI de .NET

dotnet add package [Link]

Aunque, en algunos casos, existen requisitos de instalación adicionales, especialmente


cuando se requieren componentes nativos. En este documento se describen los
requisitos de instalación para esos casos. Las secciones se dividen por el paquete NuGet
de [Link].* específico que tiene la dependencia adicional.

[Link], [Link]
Ambos paquetes tienen una dependencia en [Link] , que tiene una
dependencia en libomp .

Windows
No se requieren pasos de instalación adicionales. La biblioteca se instala cuando se
agrega el paquete NuGet al proyecto.

Linux
1. Instalar la clave GPG para el repositorio

Bash

sudo bash
# <type your user password when prompted. this will put you in a root
shell>
# cd to /tmp where this shell has write permission
cd /tmp
# now get the key:
wget [Link]
[Link]
# now install that key
apt-key add [Link]
# now remove the public key file exit the root shell
rm [Link]
exit

2. Agregar el repositorio APT para MKL

Bash

sudo sh -c 'echo deb [Link] all main >


/etc/apt/[Link].d/[Link]'

3. Actualizar paquetes

Bash

sudo apt-get update

4. Instalar MKL

Bash

sudo apt-get install <COMPONENT>-<VERSION>.<UPDATE>-<BUILD_NUMBER>

Por ejemplo:

Bash

sudo apt-get install intel-mkl-64bit-2020.0-088

Determinar la ubicación de [Link]

Bash

find /opt -name "[Link]"

Por ejemplo:

Resultados

/opt/intel/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel6
4_lin/[Link]

5. Agregue esta ubicación a la ruta de acceso de la biblioteca de carga:


Bash

sudo ldconfig
/opt/intel/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel6
4_lin

Mac
1. Instalar la biblioteca con Homebrew

Bash

wget [Link]
core/fb8323f2b170bd4ae97e1bac9bf3e2983af3fdb0/Formula/[Link] && brew
install ./[Link] && brew link libomp --force
Carga de datos de archivos y otros
orígenes
Artículo • 10/05/2023

Obtenga información sobre cómo cargar datos para su procesamiento y entrenamiento


en [Link] con la API. Los datos originalmente se almacenan en archivos u otros
orígenes de datos, como colecciones en memoria, JSON, XML o bases de datos.

Si utiliza el generador de modelos, vea Carga de datos de entrenamiento en el


Generador de modelos.

Crear el modelo de datos


[Link] permite definir los modelos de datos mediante clases. Por ejemplo, dado los
siguientes datos de entrada:

text

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3


($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000

Cree un modelo de datos que represente el fragmento de código siguiente:

C#

public class HousingData


{
[LoadColumn(0)]
public float Size { get; set; }

[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }

[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}

Anotar el modelo de datos con atributos de columna


Los atributos proporcionan a [Link] más información sobre el modelo de datos y el
origen de datos.

El atributo LoadColumn especifica los índices de columna de las propiedades.

) Importante

LoadColumn solo es necesario cuando se cargan datos desde un archivo.

Cargar columnas como:

Columnas individuales como Size y CurrentPrices en la clase HousingData .


Varias columnas a la vez en forma de un vector como HistoricalPrices en la clase
HousingData .

Si tiene una propiedad de vector, aplique el atributo VectorType a la propiedad en el


modelo de datos. Es importante tener en cuenta que todos los elementos del vector
deben ser del mismo tipo. Mantener las columnas separadas ofrece facilidad y
flexibilidad para la ingeniería de características, pero para un gran número de columnas,
el funcionamiento de las columnas individuales provoca un impacto en la velocidad del
entrenamiento.

[Link] funciona a través de los nombres de columna. Si desea cambiar el nombre de


una columna a otro nombre que no sea el de la propiedad, utilice el atributo
ColumnName. Al crear objetos en memoria, debe crear todavía objetos mediante el
nombre de la propiedad. Sin embargo, para el procesamiento de datos y la compilación
de modelos de aprendizaje automático, [Link] invalida la propiedad y hace referencia
a esta con el valor proporcionado en el atributo ColumnName.

Carga de datos desde un archivo único


Para cargar datos desde un archivo, utilice el método LoadFromTextFile junto con el
modelo de datos para que se carguen los datos. Puesto que el parámetro
separatorChar está delimitado por tabulaciones de forma predeterminada, cámbielo

para el archivo de datos según sea necesario. Si el archivo tiene un encabezado,


establezca el parámetro hasHeader en true para omitir la primera línea en el archivo y
comenzar a cargar datos de la segunda línea.

C#

//Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = [Link]<HousingData>("my-data-
[Link]", separatorChar: ',', hasHeader: true);

Carga de datos de varios archivos


En caso de que los datos se almacenen en varios archivos, siempre y cuando el esquema
de datos sea el mismo, [Link] permite cargar datos desde varios archivos que están en
el mismo directorio o en varios directorios.

Carga de archivos en un único directorio


Cuando todos los archivos de datos se encuentran en el mismo directorio, utilice
caracteres comodín en el método LoadFromTextFile.

C#

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

//Load Data File


IDataView data = [Link]<HousingData>("Data/*",
separatorChar: ',', hasHeader: true);

Carga de archivos en varios directorios


Para cargar datos desde varios directorios, utilice el método CreateTextLoader para crear
un TextLoader. A continuación, utilice el método [Link] y especifique las rutas
de acceso de archivo individuales (no se pueden usar caracteres comodín).

C#

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

// Create TextLoader
TextLoader textLoader = [Link]<HousingData>
(separatorChar: ',', hasHeader: true);

// Load Data
IDataView data = [Link]("DataFolder/SubFolder1/[Link]",
"DataFolder/SubFolder2/[Link]");
Cargar datos desde una base de datos
relacional
[Link] admite la carga de datos desde una variedad de bases de datos relacionales
admitidas por [Link], entre las que se incluyen SQL Server, Azure SQL Database,
Oracle, SQLite, PostgreSQL, Progress, IBM DB2 y muchas más.

7 Nota

Para usar DatabaseLoader , haga referencia al paquete NuGet


[Link] .

Dada una base de datos con una tabla denominada House y el esquema siguiente:

SQL

CREATE TABLE [House] (


[HouseId] INT NOT NULL IDENTITY,
[Size] INT NOT NULL,
[NumBed] INT NOT NULL,
[Price] REAL NOT NULL
CONSTRAINT [PK_House] PRIMARY KEY ([HouseId])
);

Los datos se pueden modelar mediante una clase como HouseData .

C#

public class HouseData


{
public float Size { get; set; }

public float NumBed { get; set; }

public float Price { get; set; }


}

Después, dentro de la aplicación, cree un DatabaseLoader .

C#

MLContext mlContext = new MLContext();

DatabaseLoader loader = [Link]<HouseData>();


Defina la cadena de conexión, así como el comando SQL que se va a ejecutar en la base
de datos y cree una instancia DatabaseSource . En este ejemplo se utiliza una base de
datos de SQL Server LocalDB con una ruta de acceso de archivo. Pero DatabaseLoader
admite cualquier otra cadena de conexión válida para bases de datos locales y en la
nube.

C#

string connectionString = @"Data Source=


(LocalDB)\MSSQLLocalDB;AttachDbFilename=<YOUR-DB-FILEPATH>;Database=<YOUR-
DB-NAME>;Integrated Security=True;Connect Timeout=30";

string sqlCommand = "SELECT CAST(Size as REAL) as Size, CAST(NumBed as REAL)


as NumBed, Price FROM House";

DatabaseSource dbSource = new DatabaseSource([Link],


connectionString, sqlCommand);

Los datos numéricos que no son del tipo Real deben convertirse en Real. El tipo Real se
representa como un valor de punto flotante de precisión sencilla o Single, el tipo de
entrada que esperan los algoritmos de [Link]. En este ejemplo, las columnas Size y
NumBed son enteros en la base de datos. Con la función integrada CAST , se convierte en
Real. Como la propiedad Price ya es del tipo Real se carga tal cual.

Use el método Load para cargar los datos en IDataView.

C#

IDataView data = [Link](dbSource);

Carga de datos desde otros orígenes


Además de cargar los datos almacenados en archivos, [Link] admite la carga de datos
desde orígenes entre los que se incluyen, aunque sin carácter restrictivo:

Colecciones en memoria
JSON/XML

Tenga en cuenta que al trabajar con orígenes de transmisión, [Link] espera que la
entrada tenga la forma de una colección en memoria. Por lo tanto, cuando se trabaja
con orígenes como JSON o XML, asegúrese de dar a los datos el formato de una
colección en memoria.

Dada la siguiente colección en memoria:


C#

HousingData[] inMemoryCollection = new HousingData[]


{
new HousingData
{
Size =700f,
HistoricalPrices = new float[]
{
100000f, 3000000f, 250000f
},
CurrentPrice = 500000f
},
new HousingData
{
Size =1000f,
HistoricalPrices = new float[]
{
600000f, 400000f, 650000f
},
CurrentPrice=700000f
}
};

Cargue la colección en memoria en un IDataView con el método LoadFromEnumerable:

) Importante

LoadFromEnumerable supone que IEnumerable de donde se carga es seguro para


subprocesos.

C#

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

//Load Data
IDataView data = [Link]<HousingData>
(inMemoryCollection);

Pasos siguientes
Para limpiar o de otro modo procesar datos, vea Preparación de los datos para la
compilación de un modelo.
Cuando esté listo para crear un modelo, vea Entrenamiento y evaluación de un
modelo.
Preparación de los datos para la
compilación de un modelo
Artículo • 05/06/2023

Aprenda cómo utilizar [Link] para preparar datos para el procesamiento adicional o la
creación de un modelo.

Los datos suelen estar dispersos o sin limpiar. Los algoritmos de aprendizaje automático
de [Link] esperan que las entradas o características estén en un vector numérico
único. Del mismo modo, el valor que se va a predecir (etiqueta), especialmente cuando
se trata de datos categóricos, debe estar codificado. Por lo tanto, uno de los objetivos
de la preparación de datos es obtener los datos en el formato esperado por los
algoritmos de [Link].

División de los datos en conjuntos de


entrenamiento y prueba
En la sección siguiente se describen los problemas comunes al entrenar un modelo
conocidos como sobreajuste e infraajuste. Dividir los datos y validar los modelos
mediante un conjunto mantenido puede ayudarle a identificar y mitigar estos
problemas.

Sobreajuste e infraajuste
El sobreajuste y el infraajuste son los dos problemas más comunes que se producen al
entrenar un modelo. El infraajuste significa que el entrenador seleccionado no es lo
suficientemente capaz de ajustarse al conjunto de datos de entrenamiento y
normalmente da lugar a una pérdida alta durante el entrenamiento y una puntuación o
métrica baja en el conjunto de datos de prueba. Para resolverlo, debe seleccionar un
modelo más eficaz o realizar más ingeniería de características. El sobreajuste es lo
contrario, lo que sucede cuando el modelo aprende demasiado bien los datos de
entrenamiento. Esto suele producir una métrica de baja pérdida durante el
entrenamiento, pero una pérdida alta en el conjunto de datos de prueba.

Una buena analogía para estos conceptos es estudiar para un examen. Supongamos
que conocía las preguntas y respuestas con antelación. Después de estudiar, hace el
examen y obtiene una puntuación perfecta. Buenas noticias Pero cuando se le vuelve a
dar el examen con las preguntas reorganizadas y con un texto ligeramente diferente,
obtendrá una puntuación inferior. Eso sugiere que memorizó las respuestas y no
aprendió realmente los conceptos sobre los que se le estaba examinando. Este es un
ejemplo de sobreajuste. El infraajuste es lo contrario, cuando los materiales de estudio
que se le han dado no representan con precisión lo que se evalúa en el examen. Como
resultado, recurre a adivinar las respuestas, ya que no tiene suficiente conocimiento para
contestar correctamente.

División de los datos


Tome los siguientes datos de entrada y cárguelos en un elemento IDataView
denominado data :

C#

var homeDataList = new HomeData[]


{
new()
{
NumberOfBedrooms = 1f,
Price = 100_000f
},
new()
{
NumberOfBedrooms = 2f,
Price = 300_000f
},
new()
{
NumberOfBedrooms = 6f,
Price = 600_000f
},
new()
{
NumberOfBedrooms = 3f,
Price = 300_000f
},
new()
{
NumberOfBedrooms = 2f,
Price = 200_000f
}
};

Para dividir los datos en conjuntos de entrenamiento y pruebas, use el método


TrainTestSplit(IDataView, Double, String, Nullable<Int32>).

C#

// Apply filter
TrainTestData dataSplit = [Link](data, testFraction:
0.2);

El parámetro testFraction se usa para tomar el 0,2 o el 20 % del conjunto de datos


para hacer pruebas. El 80 % restante se usa para el entrenamiento.

El resultado es [Link] con dos IDataViews a los que


puede acceder mediante TrainSet y TestSet.

Filtrado de los datos


En ocasiones, no todos los datos de un conjunto de datos son relevantes para el análisis.
Un método para quitar los datos irrelevantes es el filtrado. DataOperationsCatalog
contiene un conjunto de operaciones de filtro que recibe un IDataView que contiene
todos los datos y devuelve un IDataView que contiene únicamente los puntos de datos
de interés. Es importante tener en cuenta que dado que las operaciones de filtro no son
un IEstimator o un ITransformer como las de TransformsCatalog, no pueden incluirse
como parte de una canalización de preparación de datos de EstimatorChain o
TransformerChain.

Tome los siguientes datos de entrada y cárguelos en un elemento IDataView


denominado data :

C#

HomeData[] homeDataList = new HomeData[]


{
new ()
{
NumberOfBedrooms=1f,
Price=100000f
},
new ()
{
NumberOfBedrooms=2f,
Price=300000f
},
new ()
{
NumberOfBedrooms=6f,
Price=600000f
}
};

Para filtrar datos según el valor de una columna, use el método FilterRowsByColumn.

C#
// Apply filter
IDataView filteredData = [Link](data, "Price",
lowerBound: 200000, upperBound: 1000000);

El ejemplo anterior toma filas del conjunto de datos con un precio entre 200 000 y
1 000 000. El resultado de aplicar este filtro podría devolver solo las dos últimas filas de
los datos y excluir la primera fila porque su precio es de 100 000 y no está dentro del
intervalo especificado.

Reemplazar los valores que faltan


En los conjuntos de datos suelen haber valores ausentes. Un enfoque para tratar con los
valores ausentes es reemplazarlos por el valor predeterminado para el tipo especificado,
si lo hay, o por otro valor significativo como, por ejemplo, el valor medio de los datos.

Tome los siguientes datos de entrada y cárguelos en un elemento IDataView


denominado data :

C#

HomeData[] homeDataList = new HomeData[]


{
new ()
{
NumberOfBedrooms=1f,
Price=100000f
},
new ()
{
NumberOfBedrooms=2f,
Price=300000f
},
new ()
{
NumberOfBedrooms=6f,
Price=[Link]
}
};

Tenga en cuenta que el último elemento de nuestra lista tiene un valor ausente para
Price . Para reemplazar los valores ausentes en la columna Price , use el método

ReplaceMissingValues para rellenar ese valor ausente.

) Importante
ReplaceMissingValue solo funciona con datos numéricos.

C#

// Define replacement estimator


var replacementEstimator =
[Link]("Price", replacementMode:
[Link]);

// Fit data to estimator


// Fitting generates a transformer that applies the operations of defined by
estimator
ITransformer replacementTransformer = [Link](data);

// Transform data
IDataView transformedData = [Link](data);

[Link] admite varios modos de reemplazo. El ejemplo anterior usa el modo de


reemplazo Mean que rellena el valor ausente con el valor medio de esa columna. El
resultado del reemplazo se rellena en la propiedad Price para el último elemento en
nuestros datos con 200 000, ya que es la media de 100 000 y 300 000.

Usar normalizadores
La normalización es una técnica de procesamiento previo de datos que se usa para
escalar características de forma que estén en el mismo intervalo, normalmente entre 0 y
1, para que un algoritmo de aprendizaje automático pueda procesarlas con más
precisión. Por ejemplo, los intervalos de edad e ingresos varían significativamente, ya
que la edad suele estar en el intervalo de 0 a 100 y los ingresos suelen estar en el
intervalo de cero a miles. Visite la página de transformaciones para ver una lista más
detallada y una descripción de las transformaciones de normalización.

Normalización mínima-máxima
Tome los siguientes datos de entrada y cárguelos en un elemento IDataView
denominado data :

C#

HomeData[] homeDataList = new HomeData[]


{
new ()
{
NumberOfBedrooms = 2f,
Price = 200000f
},
new ()
{
NumberOfBedrooms = 1f,
Price = 100000f
}
};

La normalización se puede aplicar a las columnas con valores numéricos individuales, así
como a los vectores. Normalice los datos de la columna Price mediante la
normalización mínima-máxima con el método NormalizeMinMax.

C#

// Define min-max estimator


var minMaxEstimator = [Link]("Price");

// Fit data to estimator


// Fitting generates a transformer that applies the operations of defined by
estimator
ITransformer minMaxTransformer = [Link](data);

// Transform data
IDataView transformedData = [Link](data);

Los valores originales del precio [200000,100000] se convierten en [ 1, 0.5 ] mediante


la fórmula de normalización MinMax que genera valores de salida en el intervalo entre 0
y 1.

Discretización
La discretización convierte valores continuos en una representación discreta de la
entrada. Por ejemplo, suponga que una de sus características es la edad. En lugar de
usar el valor de edad real, la discretización crea intervalos para ese valor. 0-18 puede ser
un rango, otro podría ser 19-35 y así sucesivamente.

Tome los siguientes datos de entrada y cárguelos en un elemento IDataView


denominado data :

C#

HomeData[] homeDataList = new HomeData[]


{
new ()
{
NumberOfBedrooms=1f,
Price=100000f
},
new ()
{
NumberOfBedrooms=2f,
Price=300000f
},
new ()
{
NumberOfBedrooms=6f,
Price=600000f
}
};

Normalice los datos en rangos con el método NormalizeBinning. El parámetro


maximumBinCount permite especificar el número de rangos necesarios para clasificar los

datos. En este ejemplo, los datos se colocarán en dos rangos.

C#

// Define binning estimator


var binningEstimator = [Link]("Price",
maximumBinCount: 2);

// Fit data to estimator


// Fitting generates a transformer that applies the operations of defined by
estimator
var binningTransformer = [Link](data);

// Transform Data
IDataView transformedData = [Link](data);

El resultado de la discretización crea límites de rangos de [0,200000,Infinity] . Por lo


tanto, los rangos resultantes son [0,1,1] porque la primera observación está
comprendida entre 0 y 200 000 y las demás son mayores que 200 000, pero menores
que infinito.

Trabajar con datos categóricos


Uno de los tipos de datos más comunes son los datos categóricos. Los datos
categóricos tienen un número finito de categorías. Por ejemplo, los estados de EE. UU. o
una lista de los tipos de animales que se encuentran en un conjunto de imágenes. Si los
datos categóricos son características o etiquetas, deben asignarse a un valor numérico
para que se puedan usar para generar un modelo de aprendizaje automático. Hay varias
maneras de trabajar con datos categóricos en [Link], en función del problema que
quiera resolver.
Asignación de valores de clave
En [Link], una clave es un valor entero que representa una categoría. La asignación de
valores de clave se usa con más frecuencia para asignar etiquetas de cadena en valores
enteros únicos para el entrenamiento y, después, volver a sus valores de cadena cuando
el modelo se utilice para realizar una predicción.

Las transformaciones utilizadas para realizar la asignación de valores de clave son


MapValueToKey y MapKeyToValue.

MapValueToKey agrega un diccionario de asignaciones en el modelo, de modo que

MapKeyToValue pueda realizar la transformación inversa al realizar una predicción.

Codificación frecuente
Una codificación frecuente toma un conjunto finito de valores y los asigna a enteros
cuya representación binaria tiene un valor 1 único en posiciones únicas en la cadena.
Una codificación frecuente puede ser la mejor opción si no hay una ordenación implícita
de los datos categóricos. En la tabla siguiente se muestra un ejemplo con códigos
postales como valores sin formato.

Valor sin formato Valor codificado frecuente

98052 00...01

98100 00...10

... ...

98109 10...00

La transformación para convertir los datos categóricos en números codificados de


acceso frecuente es OneHotEncoding.

Aplicación de algoritmo hash


La aplicación de algoritmo hash es otra manera de convertir los datos categóricos en
números. Una función hash asigna datos de tamaño arbitrario (una cadena de texto, por
ejemplo) a un número con un intervalo fijo. La aplicación de algoritmo hash puede ser
una forma rápida y eficaz de vectorizar las características. Un ejemplo importante de
aplicación de algoritmo hash en el aprendizaje automático es el filtrado de correo no
deseado, donde, en lugar de mantener un diccionario de palabras conocidas, se aplica
un algoritmo hash a cada palabra del correo electrónico y se agrega a un vector de
características grande. Este uso de la aplicación de algoritmo hash evita el problema de
la elusión de filtrado del correo no deseado malintencionado mediante el uso de
palabras que no están en el diccionario.

[Link] proporciona transformación hash para realizar operaciones de aplicación de


algoritmo hash en texto, fechas y datos numéricos. Al igual que la asignación de claves
de valor, las salidas de la transformación hash son tipos de clave.

Trabajar con datos de texto


Al igual que los datos categóricos, los datos de texto deben transformarse en
características numéricas antes de usarlos para crear un modelo de aprendizaje
automático. Visite la página de transformaciones para ver una lista más detallada y una
descripción de las transformaciones de texto.

Uso de datos, como los datos siguientes que se han cargado en un IDataView:

C#

ReviewData[] reviews = new ReviewData[]


{
new ReviewData
{
Description="This is a good product",
Rating=4.7f
},
new ReviewData
{
Description="This is a bad product",
Rating=2.3f
}
};

[Link] proporciona la transformación FeaturizeText, que toma el valor de cadena de un


texto y crea un conjunto de características a partir del texto, aplicando una serie de
transformaciones individuales.

C#

// Define text transform estimator


var textEstimator = [Link]("Description");

// Fit data to estimator


// Fitting generates a transformer that applies the operations of defined by
estimator
ITransformer textTransformer = [Link](data);
// Transform data
IDataView transformedData = [Link](data);

La transformación resultante convierte los valores de texto en la columna Description


en un vector numérico que es similar a la salida siguiente:

text

[ 0.2041241, 0.2041241, 0.2041241, 0.4082483, 0.2041241, 0.2041241,


0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241,
0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241, 0.2041241,
0.2041241, 0, 0, 0, 0, 0.4472136, 0.4472136, 0.4472136, 0.4472136,
0.4472136, 0 ]

Las transformaciones que componen FeaturizeText también pueden aplicarse


individualmente para conseguir un mayor control de la generación de características.

C#

// Define text transform estimator


var textEstimator = [Link]("Description")
.Append([Link]("Description"))
.Append([Link]("Description"))
.Append([Link]("Description"))
.Append([Link]("Description"))
.Append([Link]("Description"));

textEstimator contiene un subconjunto de operaciones realizadas por el método

FeaturizeText. La ventaja de una canalización más compleja es el control y la visibilidad


sobre las transformaciones aplicadas a los datos.

Con la primera entrada como ejemplo, la siguiente es una descripción detallada de los
resultados producidos por los pasos de transformación definidos por textEstimator :

Texto original: Se trata de un buen producto

Transformación Descripción Resultado

1. NormalizeText Convierte todas las letras en este es un buen producto


minúsculas de forma
predeterminada

2. TokenizeWords Divide la cadena en palabras ["este","es","un","buen","producto"]


individuales

3. Quita las palabras irrelevantes, ["buen","producto"]


RemoveDefaultStopWords como es y un.
Transformación Descripción Resultado

4. MapValueToKey Asigna los valores a las claves [1,2]


(categorías), según los datos
de entrada

5. ProduceNGrams Transforma texto en secuencia [1,1,1,0,0]


de palabras consecutivas

6. NormalizeLpNorm Escala las entradas por su valor [ 0.577350529, 0.577350529,


lp-norm 0.577350529, 0, 0 ]
Entrenamiento y evaluación de un
modelo
Artículo • 09/05/2023

Obtenga más información sobre cómo compilar modelos de aprendizaje automático,


recopilar métricas y medir el rendimiento con [Link]. Aunque este ejemplo entrena un
modelo de regresión, los conceptos se aplican en casi todos los demás algoritmos.

Dividir datos para entrenamiento y pruebas


El objetivo de un modelo de aprendizaje automático es identificar patrones en los datos
de entrenamiento. Estos patrones se usan para realizar predicciones con datos nuevos.

Los datos se pueden modelar mediante una clase como HousingData .

C#

public class HousingData


{
[LoadColumn(0)]
public float Size { get; set; }

[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }

[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}

Empleando los siguientes datos que se cargan en un IDataView.

C#

HousingData[] housingData = new HousingData[]


{
new HousingData
{
Size = 600f,
HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
CurrentPrice = 170000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
CurrentPrice = 225000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
CurrentPrice = 195000f
},
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f,175000f,210000f },
CurrentPrice = 205000f
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
CurrentPrice = 210000f
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
CurrentPrice = 180000f
}
};

Use el método TrainTestSplit para dividir los datos en conjuntos de entrenamiento y


pruebas. El resultado será un objeto TrainTestData que contiene dos miembros de
IDataView: uno para el conjunto de entrenamiento y otro para el conjunto de pruebas.
El porcentaje de división de datos viene determinado por el parámetro testFraction . El
siguiente fragmento está reteniendo el 20 por ciento de los datos originales para el
conjunto de pruebas.

C#

[Link] dataSplit =
[Link](data, testFraction: 0.2);
IDataView trainData = [Link];
IDataView testData = [Link];

Preparar los datos


Los datos deben procesarse antes de entrenar un modelo de aprendizaje automático.
Puede encontrar más información sobre la preparación de los datos en el artículo de
procedimientos de preparación de datos, así como en la transforms page.
Los algoritmos de [Link] tienen restricciones en los tipos de columna de entrada.
Además, se usan valores predeterminados para los nombres de columna de entrada y
salida cuando no se especifica ningún valor.

Trabajar con tipos de columna esperados


Los algoritmos de aprendizaje automático en [Link] esperan un vector de punto
flotante de tamaño conocido como entrada. Aplique el atributo VectorType al modelo
de datos cuando todos los datos ya están en formato numérico y están pensados para
procesarse juntos (es decir, píxeles de imagen).

Si todos los datos no son numéricos y desea aplicar diferentes transformaciones de


datos en cada una de las columnas individualmente, utilice el método Concatenate
después de que todas las columnas se hayan procesado para combinar todas las
columnas individuales en un vector de característica única que se genera en una nueva
columna.

El siguiente fragmento de código combina las columnas Size y HistoricalPrices en un


vector de característica única cuya salida es una nueva columna denominada Features .
Dado que hay una diferencia en escalas, NormalizeMinMax se aplica a la columna
Features para normalizar los datos.

C#

// Define Data Prep Estimator


// 1. Concatenate Size and Historical into a single feature vector output to
a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
[Link]("Features", "Size", "HistoricalPrices")
.Append([Link]("Features"));

// Create data prep transformer


ITransformer dataPrepTransformer = [Link](trainData);

// Apply transforms to training data


IDataView transformedTrainingData =
[Link](trainData);

Trabajar con nombres de columna predeterminados


Los algoritmos de [Link] utilizan nombres de columna predeterminados cuando no se
especifica ninguno. Todos los instructores tienen un parámetro denominado
featureColumnName para las entradas del algoritmo y, si corresponde, también tienen un
parámetro para el valor esperado labelColumnName . De forma predeterminada, estos
valores son Features y Label , respectivamente.

Mediante el uso del método Concatenate durante el preprocesamiento para crear una
nueva columna denominada Features , no es necesario especificar el nombre de
columna de característica en los parámetros del algoritmo porque ya existe en el
IDataView procesado previamente. La columna de etiqueta es CurrentPrice , pero dado

que el atributo ColumnName se usa en el modelo de datos, [Link] cambia el nombre


de la columna CurrentPrice a Label , lo cual elimina la necesidad de proporcionar el
parámetro labelColumnName para el estimador de algoritmo de aprendizaje automático.

Si no desea usar los nombres de columna predeterminada, pase los nombres de las
columnas de característica y etiqueta como parámetros al definir el estimador de
algoritmo de aprendizaje automático, tal como se demuestra en el fragmento de código
siguiente:

C#

var UserDefinedColumnSdcaEstimator =
[Link](labelColumnName: "MyLabelColumnName",
featureColumnName: "MyFeatureColumnName");

Almacenamiento de datos en caché


De forma predeterminada, cuando se procesan los datos se cargan o transmiten de
forma diferida, lo que significa que los formadores pueden cargar los datos desde el
disco e iterar varias veces durante el entrenamiento. Por lo tanto, se recomienda el
almacenamiento en caché para los conjuntos de datos que quepan en la memoria a fin
de reducir el número de veces que los datos se cargan desde el disco. El
almacenamiento en caché se realiza como parte de un elemento EstimatorChain
mediante el uso de AppendCacheCheckpoint.

Se recomienda usar AppendCacheCheckpoint antes que los formadores de la


canalización.

Con el elemento EstimatorChain siguiente, agregar AppendCacheCheckpoint antes que


el formador de StochasticDualCoordinateAscent almacena en caché los resultados de
los estimadores anteriores para su uso posterior por parte del formador.

C#

// 1. Concatenate Size and Historical into a single feature vector output to


a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
[Link]("Features", "Size", "HistoricalPrices")
.Append([Link]("Features"))
.AppendCacheCheckpoint(mlContext);
.Append([Link]());

Entrenar el modelo de Machine Learning


Una vez que se hayan procesado previamente los datos, utilice el método Fit para
entrenar el modelo de aprendizaje automático con el algoritmo de regresión
StochasticDualCoordinateAscent.

C#

// Define StochasticDualCoordinateAscent regression algorithm estimator


var sdcaEstimator = [Link]();

// Build machine learning model


var trainedModel = [Link](transformedTrainingData);

Extraer parámetros del modelo


Una vez entrenado el modelo, extraiga el elemento ModelParameters aprendido para su
inspección o para volver a entrenarlo. Los parámetros
LinearRegressionModelParameters proporcionan los coeficientes aprendidos y de sesgo,
o los pesos del modelo entrenado.

C#

var trainedModelParameters = [Link] as


LinearRegressionModelParameters;

7 Nota

Otros modelos disponen de parámetros que son específicos para sus tareas. Por
ejemplo, el algoritmo K-Means coloca datos en clúster en función de centroides y
KMeansModelParameters contiene una propiedad que almacena estos centroides
aprendidos. Para obtener más información, visite la [Link]
documentación de la API y busque las clases que contienen ModelParameters en su
nombre.

Evaluar la calidad del modelo


Para ayudar a elegir el mejor modelo de rendimiento, es esencial evaluar su rendimiento
en datos de prueba. Use el método Evaluate para medir diversas métricas para el
modelo entrenado.

7 Nota

El método Evaluate genera diferentes métricas en función de la tarea de


aprendizaje automático que se realizó. Para obtener más información, visite la
[Link] documentación de la API y busque las clases que contienen
Metrics en su nombre.

C#

// Measure trained model performance


// Apply data prep transformer to test data
IDataView transformedTestData = [Link](testData);

// Use trained model to make inferences on test data


IDataView testDataPredictions = [Link](transformedTestData);

// Extract model metrics and get RSquared


RegressionMetrics trainedModelMetrics =
[Link](testDataPredictions);
double rSquared = [Link];

En el ejemplo de código anterior:

1. El conjunto de datos de prueba está procesado previamente mediante


transformaciones de preparación de datos definidas con anterioridad.
2. El modelo de aprendizaje automático entrenado se utiliza para realizar
predicciones sobre los datos de prueba.
3. En el método Evaluate , los valores de la columna CurrentPrice del conjunto de
datos de prueba se comparan con la columna Score de las predicciones
recientemente generadas para calcular las métricas del modelo de regresión, una
de las cuales, R cuadrado, se almacena en la variable rSquared .
7 Nota

En este pequeño ejemplo, el valor de R cuadrado es un número que no está


comprendido entre 0 y 1, debido al tamaño limitado de los datos. En un escenario
real, debería ver un valor comprendido entre 0 y 1.
Entrenamiento de un modelo de
aprendizaje automático con validación
cruzada
Artículo • 09/05/2023

Obtenga información sobre cómo usar la validación cruzada para entrenar modelos de
aprendizaje automático más eficaces en [Link].

La validación cruzada es una técnica de evaluación de modelos y entrenamiento que


divide los datos en diversas particiones y entrena varios algoritmos en estas particiones.
Esta técnica mejora la estabilidad del modelo que contiene datos del proceso de
entrenamiento. Además de mejorar el rendimiento en observaciones no vistas y en
entornos con limitaciones de datos, puede ser una herramienta eficaz para el
entrenamiento de modelos con un conjunto de datos más pequeño.

Los datos y el modelo de datos


Dados los datos desde un archivo que tiene el formato siguiente:

text

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3


($), Current Price ($)
620.00, 148330.32, 140913.81, 136686.39, 146105.37
550.00, 557033.46, 529181.78, 513306.33, 548677.95
1127.00, 479320.99, 455354.94, 441694.30, 472131.18
1120.00, 47504.98, 45129.73, 43775.84, 46792.41

Los datos se pueden modelar mediante una clase como HousingData y cargarlos en
IDataView.

C#

public class HousingData


{
[LoadColumn(0)]
public float Size { get; set; }

[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }

[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}

Preparación de los datos


Procese previamente los datos antes de usarlos para compilar el modelo de aprendizaje
automático. En este ejemplo, las columnas Size y HistoricalPrices se combinan en un
vector de característica única, que se muestra en una nueva columna denominada
Features con el método Concatenate. Además, para obtener los datos en el formato

esperado por los algoritmos de [Link], la concatenación de columnas optimiza las


operaciones posteriores en la canalización aplicando la operación una vez para la
columna concatenada, en lugar de cada una de las columnas independientes.

Una vez que se han combinado las columnas en un vector único, NormalizeMinMax se
aplica a la columna Features para obtener Size y HistoricalPrices en el mismo
intervalo entre 0 y 1.

C#

// Define data prep estimator


IEstimator<ITransformer> dataPrepEstimator =
[Link]("Features", new string[] { "Size",
"HistoricalPrices" })
.Append([Link]("Features"));

// Create data prep transformer


ITransformer dataPrepTransformer = [Link](data);

// Transform data
IDataView transformedData = [Link](data);

Entrenamiento de modelos con validación


cruzada
Una vez que se han procesado previamente los datos, es hora de entrenar el modelo. En
primer lugar, seleccione el algoritmo que mejor se adapte a la tarea de aprendizaje
automático que debe realizarse. Dado que el valor de predicción es un valor numérico
continuo, la tarea es la regresión. Uno de los algoritmos de regresión implementados
por [Link] es el algoritmo StochasticDualCoordinateAscentCoordinator. Para entrenar
el modelo con la validación cruzada, use el método CrossValidate.
7 Nota

Aunque en este ejemplo se usa un modelo de regresión lineal, la validación cruzada


se aplica a las demás tareas de aprendizaje automático en [Link], excepto la
detección de anomalías.

C#

// Define StochasticDualCoordinateAscent algorithm estimator


IEstimator<ITransformer> sdcaEstimator =
[Link]();

// Apply 5-fold cross validation


var cvResults = [Link](transformedData,
sdcaEstimator, numberOfFolds: 5);

CrossValidate lleva a cabo las operaciones siguientes:

1. Divide los datos en un número de particiones iguales al valor especificado en el


parámetro numberOfFolds . El resultado de cada partición es un objeto
TrainTestData.
2. Se entrena un modelo en cada una de las particiones con el estimador del
algoritmo de aprendizaje automático especificado en el conjunto de datos de
entrenamiento.
3. El rendimiento de cada modelo se evalúa con el método Evaluate en el conjunto
de datos de prueba.
4. El modelo, junto con sus métricas, se devuelve para cada uno de los modelos.

El resultado almacenado en cvResults es una colección de objetos


CrossValidationResult. Este objeto incluye el modelo entrenado, así como las métricas
que son accesibles desde las propiedades Model y Metrics respectivamente. En este
ejemplo, la propiedad Model es de tipo ITransformer y la propiedad Metrics es de tipo
RegressionMetrics.

Evaluar el modelo
Las métricas de los diferentes modelos entrenados se pueden acceder a través de la
propiedad Metrics del objeto CrossValidationResult individual. En este caso, la métrica
de R cuadrado se accede y almacena en la variable rSquared .

C#
IEnumerable<double> rSquared =
cvResults
.Select(fold => [Link]);

Si examina el contenido de la variable rSquared , la salida debe tener cinco valores


comprendidos entre 0 y 1, donde el valor más cercano a 1 es mejor. Mediante métricas
como R cuadrado, seleccione los modelos de mejor a peor rendimiento. A continuación,
seleccione el mejor modelo con el que realizará predicciones u operaciones adicionales.

C#

// Select all models


ITransformer[] models =
cvResults
.OrderByDescending(fold => [Link])
.Select(fold => [Link])
.ToArray();

// Get Top Model


ITransformer topModel = models[0];
Inspección de los datos intermedios
durante el procesamiento
Artículo • 09/05/2023

Obtenga información sobre cómo inspeccionar los datos intermedios durante los pasos
de entrenamiento del modelo, procesamiento y carga en [Link]. Los datos intermedios
son el resultado de cada fase de la canalización de aprendizaje automático.

Los datos intermedios, como los representados a continuación, que se cargan en un


IDataView, pueden inspeccionarse de varias maneras en [Link].

C#

HousingData[] housingData = new HousingData[]


{
new HousingData
{
Size = 600f,
HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
CurrentPrice = 170000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
CurrentPrice = 225000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
CurrentPrice = 195000f
},
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f,175000f,210000f },
CurrentPrice = 205000f
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
CurrentPrice = 210000f
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
CurrentPrice = 180000f
}
};

Conversión de IDataView en IEnumerable


Una de las formas más rápidas de inspeccionar una clase IDataView es convertirla en
una clase IEnumerable. Para convertir una clase IDataView en IEnumerable, utilice el
método CreateEnumerable.

Para optimizar el rendimiento, establezca reuseRowObject en true . De esta forma, se


rellenará de forma diferida el mismo objeto con los datos de la fila actual a medida que
se evalúa, en lugar de crear un nuevo objeto para cada fila del conjunto de datos.

C#

// Create an IEnumerable of HousingData objects from IDataView


IEnumerable<HousingData> housingDataEnumerable =
[Link]<HousingData>(data, reuseRowObject:
true);

// Iterate over each row


foreach (HousingData row in housingDataEnumerable)
{
// Do something (print out Size property) with current Housing Data
object being evaluated
[Link]([Link]);
}

Obtener acceso a índices específicos con


IEnumerable
Si solo necesita acceder a parte de los datos o a índices específicos, use
CreateEnumerable y establezca el valor del parámetro reuseRowObject en false para
que se cree un objeto por cada una de las filas solicitadas del conjunto de datos.
Después, convierta IEnumerable en una matriz o lista.

2 Advertencia

Al convertir el resultado de CreateEnumerable en una matriz o lista, se cargarán


todas las filas de IDataView solicitadas en la memoria, lo que puede afectar al
rendimiento.
Cuando se haya creado la colección, podrá realizar operaciones en los datos. El
siguiente fragmento de código toma las tres primeras filas del conjunto de datos y
calcula el promedio de precio actual.

C#

// Create an Array of HousingData objects from IDataView


HousingData[] housingDataArray =
[Link]<HousingData>(data, reuseRowObject:
false)
.Take(3)
.ToArray();

// Calculate Average CurrentPrice of First Three Elements


HousingData firstRow = housingDataArray[0];
HousingData secondRow = housingDataArray[1];
HousingData thirdRow = housingDataArray[2];
float averageCurrentPrice = ([Link] + [Link]
+ [Link]) / 3;

Inspección de valores de una sola columna


En cualquier momento del proceso de compilación del modelo, se puede acceder a los
valores de una sola columna de una IDataView con el método GetColumn. El método
GetColumn devuelve todos los valores en una sola columna como una IEnumerable.

C#

IEnumerable<float> sizeColumn = [Link]<float>("Size").ToList();

Inspección de valores de IDataView fila por fila


IDataView se evalúa de forma diferida. Para recorrer en iteración las filas de una
IDataView sin convertirla en una IEnumerable como se ha mostrado en las secciones
anteriores de este documento, cree una clase DataViewRowCursor usando el método
GetRowCursor y pasando la clase DataViewSchema de su IDataView como parámetro.
Luego, para recorrer las filas en iteración, utilice el método de cursor MoveNext junto
con delegados de ValueGetter para extraer los valores correspondientes de cada una de
las columnas.

) Importante
A efectos de rendimiento, los vectores en [Link] utilizan VBuffer en lugar de los
tipos de colección nativos (es decir, Vector , float[] ).

C#

// Get DataViewSchema of IDataView


DataViewSchema columns = [Link];

// Create DataViewCursor
using (DataViewRowCursor cursor = [Link](columns))
{
// Define variables where extracted values will be stored to
float size = default;
VBuffer<float> historicalPrices = default;
float currentPrice = default;

// Define delegates for extracting values from columns


ValueGetter<float> sizeDelegate = [Link]<float>(columns[0]);
ValueGetter<VBuffer<float>> historicalPriceDelegate =
[Link]<VBuffer<float>>(columns[1]);
ValueGetter<float> currentPriceDelegate = [Link]<float>
(columns[2]);

// Iterate over each row


while ([Link]())
{
//Get values from respective columns
[Link](ref size);
[Link](ref historicalPrices);
[Link](ref currentPrice);
}
}

Vista previa de los resultados de


preprocesamiento o entrenamiento en un
subconjunto de los datos

2 Advertencia

No use Preview en código de producción porque está pensado para depuración y


puede reducir el rendimiento.

El proceso de compilación de modelos es experimental e iterativo. Para obtener una


vista previa de los datos después del preprocesamiento o entrenamiento de un modelo
de Machine Learning en un subconjunto de los datos, utilice el método Preview que
devuelve una DataDebuggerPreview. El resultado es un objeto con las propiedades
ColumnView y RowView que son ambas una IEnumerable y contienen los valores de una
fila o columna en particular. Especifique el número de filas a las que se aplicará la
transformación con el parámetro maxRows .

El resultado de inspeccionar una IDataView tendría un aspecto similar al siguiente:


Interpretación de las predicciones del
modelo mediante la importancia de
características de permutación
Artículo • 05/06/2023

Con la importancia de características de permutación (PFI), aprenda a interpretar las


predicciones del modelo de aprendizaje automático de [Link]. PFI proporciona la
contribución relativa que cada característica aporta a una predicción.

A menudo se piensa en los modelos de Machine Learning como cajas opacas que
toman entradas y generan salidas. Rara vez se entienden los pasos intermedios o las
interacciones entre las características que afectan a la salida. A medida que el
aprendizaje automático se introduce en otros aspectos de la vida diaria como la
asistencia sanitaria, es de vital importancia comprender por qué un modelo de Machine
Learning toma esas decisiones. Por ejemplo, si un modelo de Machine Learning realiza
diagnósticos, los profesionales sanitarios necesitan una forma de buscar en los factores
que se incluyeron en la realización de dicho diagnóstico. Proporcionar el diagnóstico
correcto puede marcar una gran diferencia en el hecho de que un paciente tenga una
recuperación rápida o no. Por lo tanto, cuanto mayor sea el nivel de explicación en un
modelo, mayor será la confianza que tengan los profesionales sanitarios para aceptar o
rechazar las decisiones tomadas por el modelo.

Se utilizan diversas técnicas para explicar modelos, una de los cuales es PFI. PFI es una
técnica utilizada para explicar los modelos de clasificación y regresión que se inspira en
el artículo Random Forests de Breiman (consulte la sección 10). En un nivel alto, esto
funciona de manera es revolviendo los datos de manera aleatoria en una característica a
la vez para todo el conjunto de datos y calculando cuánto se reduce la métrica de
rendimiento de interés. Cuanto mayor sea el cambio, más importante será esa
característica.

Además, al resaltar las características más importantes, los compiladores del modelo
pueden centrarse en el uso de un subconjunto de características más significativas que
potencialmente pueden reducir el ruido y el tiempo de entrenamiento.

Carga de los datos


Las características del conjunto de datos que se usa para este ejemplo están en las
columnas 1 a 12. El objetivo es predecir Price .
Columna Característica Descripción

1 CrimeRate Tasa de criminalidad per cápita

2 ResidentialZones Zonas residenciales en la ciudad

3 CommercialZones Zonas no residenciales en la ciudad

4 NearWater Proximidad a un cuerpo de agua

5 ToxicWasteLevels Niveles de toxicidad (PPM)

6 AverageRoomNumber Número promedio de salas en casa

7 HomeAge Antigüedad de la casa

8 BusinessCenterDistance Distancia al distrito comercial más cercano

9 HighwayAccess Proximidad a las autopistas

10 TaxRate Tasa de impuestos sobre la propiedad

11 StudentTeacherRatio Proporción de alumnos por profesores

12 PercentPopulationBelowPoverty Porcentaje de la población que vive por debajo de


pobreza

13 Price Precio de la vivienda

A continuación, se muestra un ejemplo del conjunto de datos:

text

1,24,13,1,0.59,3,96,11,23,608,14,13,32
4,80,18,1,0.37,5,14,7,4,346,19,13,41
2,98,16,1,0.25,10,5,1,8,689,13,36,12

Los datos en este ejemplo se pueden modelar mediante una clase como
HousingPriceData y se pueden cargar en IDataView.

C#

class HousingPriceData
{
[LoadColumn(0)]
public float CrimeRate { get; set; }

[LoadColumn(1)]
public float ResidentialZones { get; set; }

[LoadColumn(2)]
public float CommercialZones { get; set; }

[LoadColumn(3)]
public float NearWater { get; set; }

[LoadColumn(4)]
public float ToxicWasteLevels { get; set; }

[LoadColumn(5)]
public float AverageRoomNumber { get; set; }

[LoadColumn(6)]
public float HomeAge { get; set; }

[LoadColumn(7)]
public float BusinessCenterDistance { get; set; }

[LoadColumn(8)]
public float HighwayAccess { get; set; }

[LoadColumn(9)]
public float TaxRate { get; set; }

[LoadColumn(10)]
public float StudentTeacherRatio { get; set; }

[LoadColumn(11)]
public float PercentPopulationBelowPoverty { get; set; }

[LoadColumn(12)]
[ColumnName("Label")]
public float Price { get; set; }
}

Entrenar el modelo
El ejemplo de código siguiente ilustra el proceso de entrenamiento de un modelo de
regresión lineal para predecir los precios de la vivienda.

C#

// 1. Get the column name of input features.


string[] featureColumnNames =
[Link]
.Select(column => [Link])
.Where(columnName => columnName != "Label").ToArray();

// 2. Define training pipeline


IEstimator<ITransformer> sdcaEstimator =
[Link]("Features", featureColumnNames)
.Append([Link]("Features"))
.Append([Link]());

// 3. Train machine learning model


var sdcaModel = [Link](data);

Explicar el modelo con la importancia de


características de permutación (PFI)
En [Link], use el método PermutationFeatureImportance para la tarea correspondiente.

C#

// Use the model to make predictions


var transformedData = [Link](data);

// Calculate feature importance


ImmutableArray<RegressionMetricsStatistics> permutationFeatureImportance =
mlContext
.Regression
.PermutationFeatureImportance(sdcaModel, transformedData,
permutationCount:3);

El resultado del uso de PermutationFeatureImportance en el conjunto de datos de


entrenamiento es un ImmutableArray de objetos RegressionMetricsStatistics.
RegressionMetricsStatistics proporciona estadísticas de resumen, como desviación
media y estándar para diversas observaciones de RegressionMetrics equivalentes al
número de permutaciones especificadas por el parámetro permutationCount .

La métrica que se usa para medir la importancia de las características depende de la


tarea de aprendizaje automático que se usa para resolver el problema. Por ejemplo, las
tareas de regresión pueden usar una métrica de evaluación común, como R cuadrado,
para medir la importancia. Para más información sobre las métricas de evaluación de
modelos, vea Evaluación de su modelo de [Link] con métricas.

La importancia o, en este caso, la disminución de la media absoluta de la métrica de R


cuadrado calculada con PermutationFeatureImportance, se puede ordenar de las más
importante a la menos importante.

C#

// Order features by importance


var featureImportanceMetrics =
permutationFeatureImportance
.Select((metric, index) => new { index, [Link] })
.OrderByDescending(myFeatures =>
[Link]([Link]));

[Link]("Feature\tPFI");

foreach (var feature in featureImportanceMetrics)


{
[Link]($"
{featureColumnNames[[Link]],-20}|\t{[Link]:F6}");
}

Imprimir los valores para cada una de las características de featureImportanceMetrics


generaría resultados similares a los siguientes. Tenga en cuenta que debe esperar para
ver resultados diferentes porque estos valores varían en función de los datos que se
proporcionan.

Característica Cambiar a R cuadrado

HighwayAccess -0,042731

StudentTeacherRatio -0,012730

BusinessCenterDistance -0,010491

TaxRate -0,008545

AverageRoomNumber -0,003949

CrimeRate -0,003665

CommercialZones 0,002749

HomeAge -0,002426

ResidentialZones -0,002319

NearWater 0,000203

PercentPopulationLivingBelowPoverty 0,000031

ToxicWasteLevels -0,000019

Al echar un vistazo a las cinco características más importantes de este conjunto de


datos, el precio de una casa previsto por este modelo viene determinado por su
proximidad a las autopistas, la proporción de alumnos por profesores en la zona, la
proximidad a los principales centros de empleo, la tasa de impuestos sobre la propiedad
y el número promedio de dormitorios en una casa.

Pasos siguientes
Uso de la importancia de la característica de permutación (PFI) con AutoML
Realizar predicciones con un modelo entrenado
Volver a entrenar un modelo
Implementación de un modelo en una [Link] Core Web API
Guardar y cargar modelos entrenados
Artículo • 10/05/2023

Obtenga información sobre cómo guardar y cargar modelos entrenados en la


aplicación.

En todo el proceso de compilación de modelos, un modelo se encuentra en la memoria


y es accesible a lo largo del ciclo de vida de la aplicación. Sin embargo, una vez que la
aplicación deja de ejecutarse, si el modelo no se guarda en algún lugar local o
remotamente, ya no es accesible. Normalmente, los modelos se utilizan en algún
momento después de su entrenamiento en otras aplicaciones, ya sea por inferencia o al
volver a entrenar. Por lo tanto, es importante almacenar el modelo. Guarde y cargue
modelos mediante los pasos descritos en las secciones siguientes de este documento,
cuando use la preparación de datos y las canalizaciones de aprendizaje del modelo,
como la que se detalla a continuación. Aunque en este ejemplo se usa un modelo de
regresión lineal, el mismo proceso se aplica a otros algoritmos de [Link].

C#

HousingData[] housingData = new HousingData[]


{
new HousingData
{
Size = 600f,
HistoricalPrices = new float[] { 100000f, 125000f, 122000f },
CurrentPrice = 170000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
CurrentPrice = 225000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
CurrentPrice = 195000f
}
};

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

// Load Data
IDataView data = [Link]<HousingData>
(housingData);
// Define data preparation estimator
EstimatorChain<RegressionPredictionTransformer<LinearRegressionModelParamete
rs>> pipelineEstimator =
[Link]("Features", new string[] { "Size",
"HistoricalPrices" })
.Append([Link]("Features"))
.Append([Link]());

// Train model
ITransformer trainedModel = [Link](data);

// Save model
[Link](trainedModel, [Link], "[Link]");

Dado que la mayoría de los modelos y canalizaciones de preparación de datos se


heredan del mismo conjunto de clases, las firmas del método de guardado y carga para
estos componentes es el mismo. Según el caso de uso, puede combinar la canalización
de preparación de datos y el modelo en un solo EstimatorChain que generaría un único
ITransformer o los separaría creando así un ITransformer independiente para cada uno.

Guardar un modelo de forma local


Al guardar un modelo, se necesitan dos cosas:

1. El ITransformer del modelo.


2. El DataViewSchema de la entrada esperada del ITransformer.

Después de entrenar el modelo, use el método Save para guardar el modelo entrenado
en un archivo denominado [Link] con el DataViewSchema de los datos de entrada.

C#

// Save Trained Model


[Link](trainedModel, [Link], "[Link]");

Guardar un modelo ONNX localmente


Para guardar una versión de ONNX del modelo localmente, necesitará tener instalado el
paquete NuGet [Link].

Con el paquete OnnxConverter instalado, podemos usarlo para guardar el modelo en el


formato ONNX. Esto requiere un objeto Stream que se puede proporcionar como
FileStream mediante el método [Link] . El método [Link] adopta una

cadena como parámetro que será la ruta de acceso del modelo ONNX.
C#

using FileStream stream = [Link]("./onnx_model.onnx");

Con la secuencia creada, podemos llamar al método ConvertToOnnx y proporcionarle el


modelo entrenado, los datos usados para entrenar el modelo y la secuencia. Sin
embargo, no todos los instructores y transformadores son exportables a ONNX. Para ver
una lista completa, visite las guías Transformaciones y Cómo elegir un algoritmo de
[Link].

C#

[Link](trainedModel, data, stream);

Cargar un modelo almacenado localmente


Los modelos almacenados localmente se pueden usar en otros procesos o aplicaciones,
como [Link] Core y Serverless Web Applications . Consulte los artículos de
procedimientos Uso de [Link] en la API Web e Implementación de la aplicación web
sin servidor de [Link] para obtener más información.

En una aplicación o proceso independiente, use el método Load junto con la ruta de
acceso al archivo para obtener el modelo entrenado en la aplicación.

C#

//Define DataViewSchema for data preparation pipeline and trained model


DataViewSchema modelSchema;

// Load trained model


ITransformer trainedModel = [Link]("[Link]", out
modelSchema);

Cargar un modelo ONNX localmente


Para cargar un modelo ONNX para predicciones, necesitará el paquete NuGet
[Link].

Con el paquete OnnxTransformer instalado, puede cargar un modelo ONNX existente


con el método ApplyOnnxModel. El parámetro necesario es una cadena que es la ruta
de acceso del modelo ONNX local.
C#

OnnxScoringEstimator estimator =
[Link]("./onnx_model.onnx");

El método ApplyOnnxModel devuelve un objeto OnnxScoringEstimator . En primer lugar,


es necesario cargar los nuevos datos.

C#

HousingData[] newHousingData = new HousingData[]


{
new()
{
Size = 1000f,
HistoricalPrices = new[] { 300_000f, 350_000f, 450_000f },
CurrentPrice = 550_00f
}
};

Con los nuevos datos, podemos cargar IDataView con el método LoadFromEnumerable .

C#

IDataView newHousingDataView =
[Link](newHousingData);

Ahora podemos usar el nuevo elemento IDataView para adaptarlo a los nuevos datos.

C#

[Link](newHousingDataView);

Después de usar el método Fit en un estimador de ApplyOnnxModel , después se puede


guardar como un nuevo modelo con el método Save mencionado en la sección de
guardar un modelo localmente.

Cargar un modelo almacenado remotamente


Para cargar canalizaciones de preparación de datos y modelos almacenados en una
ubicación remota de la aplicación, use Stream en lugar de una ruta de acceso al archivo
en el método Load.

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

// Define DataViewSchema and ITransformers


DataViewSchema modelSchema;
ITransformer trainedModel;

// Load data prep pipeline and trained model


using (HttpClient client = new HttpClient())
{
Stream modelFile = await [Link]("<YOUR-REMOTE-FILE-
LOCATION>");

trainedModel = [Link](modelFile, out modelSchema);


}

Trabajar con una preparación de datos


independiente y canalizaciones de modelo

7 Nota

Trabajar con una preparación de datos independiente y canalizaciones de


entrenamiento de modelos es opcional. La separación de canalizaciones facilita la
inspección de parámetros de modelos aprendidos. Para las predicciones, es más
fácil guardar y cargar una sola canalización que incluye la preparación de datos y
las operaciones de entrenamiento del modelo.

Al trabajar con modelos y canalizaciones de preparación de datos independientes, se


aplica el mismo proceso que con las canalizaciones únicas; excepto que ahora ambas
canalizaciones deben guardarse y cargarse al mismo tiempo.

Dada la preparación de datos independiente y las canalizaciones de entrenamiento de


modelos:

C#

// Define data preparation estimator


IEstimator<ITransformer> dataPrepEstimator =
[Link]("Features", new string[] { "Size",
"HistoricalPrices" })
.Append([Link]("Features"));

// Create data preparation transformer


ITransformer dataPrepTransformer = [Link](data);
// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = [Link]();

// Pre-process data using data prep operations


IDataView transformedData = [Link](data);

// Train regression model


RegressionPredictionTransformer<LinearRegressionModelParameters>
trainedModel = [Link](transformedData);

Guardar la canalización de preparación de datos y el


modelo entrenado
Para guardar la canalización de preparación de datos y el modelo entrenado, use los
siguientes comandos:

C#

// Save Data Prep transformer


[Link](dataPrepTransformer, [Link],
"data_preparation_pipeline.zip");

// Save Trained Model


[Link](trainedModel, [Link], "[Link]");

Cargar la canalización de preparación de datos y el


modelo entrenado
En una aplicación o proceso independiente, cargue la canalización de preparación de
datos y el modelo entrenado simultáneamente de la siguiente manera:

C#

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

// Define data preparation and trained model schemas


DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline and trained model


ITransformer dataPrepPipeline =
[Link]("data_preparation_pipeline.zip",out
dataPrepPipelineSchema);
ITransformer trainedModel = [Link]("[Link]", out
modelSchema);
Realizar predicciones con un modelo
entrenado
Artículo • 09/05/2023

Obtenga información sobre cómo usar un modelo entrenado para realizar predicciones

Creación de modelos de datos

Datos de entrada
C#

public class HousingData


{
[LoadColumn(0)]
public float Size { get; set; }

[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }

[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}

Datos de salida
Al igual que los nombres de las columnas de entrada Features y Label , [Link] tiene
nombres predeterminados para las columnas de valores de predicción que genera un
modelo. En función de la tarea, el nombre puede ser diferente.

Dado que el algoritmo utilizado en este ejemplo es un algoritmo de regresión lineal, el


nombre predeterminado de la columna de salida es Score , que se define mediante el
atributo ColumnName en la propiedad PredictedPrice .

C#

class HousingPrediction
{
[ColumnName("Score")]
public float PredictedPrice { get; set; }
}
Configuración de una canalización de
predicción
Independientemente de si se crea una predicción única o por lotes, la canalización de
predicción necesita cargarse en la aplicación. Esta canalización contiene las
transformaciones del procesamiento previo de datos, así como el modelo entrenado. El
siguiente fragmento de código carga la canalización de predicción desde un archivo
denominado [Link] .

C#

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

// Load Trained Model


DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = [Link]("[Link]", out
predictionPipelineSchema);

Predicción única
Para realizar una sola predicción, cree un PredictionEngine mediante la canalización de
la predicción cargada.

C#

// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine =
[Link]<HousingData, HousingPrediction>
(predictionPipeline);

A continuación, utilice el método Predict y pase los datos de entrada como un


parámetro. Tenga en cuenta que el uso del método Predict no requiere que la entrada
sea un IDataView). Esto se debe a que interioriza cómodamente la manipulación del tipo
de datos de entrada para que pueda pasar un objeto del tipo de datos de entrada.
Además, dado que CurrentPrice es el destino o la etiqueta que intenta predecir
mediante datos nuevos, se asume que en este momento no hay ningún valor para este.

C#
// Input Data
HousingData inputData = new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};

// Get Prediction
HousingPrediction prediction = [Link](inputData);

Si accede a la propiedad Score del objeto prediction , debe obtener un valor similar a
150079 .

 Sugerencia

PredictionEngine no es seguro para subprocesos. Además, tiene que crear una


instancia de ella en cualquier lugar en que se necesite dentro de la aplicación. A
medida que crece la aplicación, este proceso puede volverse difícil de administrar.
Para mejorar el rendimiento y la seguridad para subprocesos, use una combinación
de inserción de dependencias y el servicio PredictionEnginePool, que crea un
elemento ObjectPool de objetos PredictionEngine para usarlo en toda la
aplicación.

Para obtener ejemplos sobre cómo usar el servicio PredictionEnginePool, consulte


Implementación de un modelo en una API web e Implementación de un modelo
en Azure Functions.

Para más información, consulte Inserción de dependencias en [Link] Core.

Varias predicciones (IDataView)


Dados los siguientes datos, cárguelos en un IDataView. En este caso, el nombre de la
IDataView es inputData . Dado que CurrentPrice es el destino o la etiqueta que intenta
predecir mediante datos nuevos, se asume que en este momento no hay ningún valor
para este.

C#

// Actual data
HousingData[] housingData = new HousingData[]
{
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f, 175000f, 210000f }
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f }
}
};

A continuación, utilice el método Transform para aplicar las transformaciones de datos y


generar predicciones.

C#

// Predicted Data
IDataView predictions = [Link](inputData);

Inspeccione los valores de predicción mediante el método GetColumn.

C#

// Get Predictions
float[] scoreColumn = [Link]<float>("Score").ToArray();

Los valores de predicción en la columna de puntuación deben ser similares a los


siguientes:

Observación Predicción

1 144638.2

2 150079.4

3 107789.8

Varias predicciones (PredictionEnginePool)


Para realizar varias predicciones mediante PredictionEnginePool, puede tomar una
interfaz IEnumerable que contenga varias instancias de la entrada del modelo. Por
ejemplo, IEnumerable<HousingInput> y aplique el método Predict a cada elemento
mediante el método Select de LINQ.

En este ejemplo de código se da por supuesto que tiene una clase PredictionEnginePool
denominada predictionEnginePool , y una IEnumerable<HousingData> denominada
housingData .

C#

IEnumerable<HousingPrediction> predictions = [Link](input =>


[Link](input));

El resultado es una interfaz IEnumerable que contiene instancia de las predicciones. En


este caso, IEnumerable<HousingPrediction> .
Nuevo entrenamiento de un modelo
Artículo • 10/05/2023

Obtenga información sobre cómo volver a entrenar un modelo de Machine Learning en


[Link].

El mundo y los datos alrededor de este cambian a un ritmo constante. Por lo tanto, los
modelos también deben cambiar y actualizarse. [Link] proporciona funcionalidad para
modelos de nuevo entrenamiento mediante parámetros de modelo aprendidos como
un punto inicial para compilar continuamente en la experiencia anterior, en lugar de
hacerlo cada vez desde el principio.

Los algoritmos siguientes se pueden volver a entrenar en [Link]:

AveragedPerceptronTrainer
FieldAwareFactorizationMachineTrainer
LbfgsLogisticRegressionBinaryTrainer
LbfgsMaximumEntropyMulticlassTrainer
LbfgsPoissonRegressionTrainer
LinearSvmTrainer
OnlineGradientDescentTrainer
SgdCalibratedTrainer
SgdNonCalibratedTrainer
SymbolicSgdLogisticRegressionBinaryTrainer

Carga del modelo previamente entrenado


En primer lugar, cargue el modelo previamente entrenado en la aplicación. Para obtener
más información sobre la carga de modelos y canalizaciones de entrenamiento, consulte
Guardar y cargar modelos entrenados.

C#

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

// Define DataViewSchema of data prep pipeline and trained model


DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline


ITransformer dataPrepPipeline =
[Link]("data_preparation_pipeline.zip", out
dataPrepPipelineSchema);
// Load trained model
ITransformer trainedModel = [Link]("ogd_model.zip", out
modelSchema);

Extracción de parámetros del modelo


previamente entrenado
Una vez que se ha cargado el modelo, extraiga los parámetros del modelo entrenado
accediendo a la propiedad Model del modelo previamente entrenado. El modelo
previamente entrenado se ha entrenado con el modelo de regresión lineal
OnlineGradientDescentTrainer, que crea un objeto RegressionPredictionTransformer que
genera LinearRegressionModelParameters. Estos parámetros del modelo contienen el
sesgo aprendido, y pesos o coeficientes del modelo. Estos valores se usarán como
punto inicial para el nuevo modelo entrenado.

C#

// Extract trained model parameters


LinearRegressionModelParameters originalModelParameters =
((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as
LinearRegressionModelParameters;

7 Nota

La salida de los parámetros del modelo depende del algoritmo utilizado. Por
ejemplo, OnlineGradientDescentTrainer usa LinearRegressionModelParameters,
mientras que LbfgsMaximumEntropyMulticlassTrainer genera una salida
MaximumEntropyModelParameters. Al extraer parámetros del modelo, se
convierte al tipo adecuado.

Volver a entrenar el modelo


El proceso para volver a entrenar un modelo es similar al de entrenamiento de un
modelo. La única diferencia es que el método Fit, además de los datos, también toma
como entrada los parámetros del modelo entrenado original y los usa como punto
inicial en el proceso de nuevo entrenamiento.

C#

// New Data
HousingData[] housingData = new HousingData[]
{
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f,175000f,210000f },
CurrentPrice = 205000f
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
CurrentPrice = 210000f
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
CurrentPrice = 180000f
}
};

//Load New Data


IDataView newData = [Link]<HousingData>
(housingData);

// Preprocess Data
IDataView transformedNewData = [Link](newData);

// Retrain model
RegressionPredictionTransformer<LinearRegressionModelParameters>
retrainedModel =
[Link]()
.Fit(transformedNewData, originalModelParameters);

En este momento, se puede guardar el modelo que se ha vuelto a entrenar y usarlo en


la aplicación. Para obtener más información, vea las guías Guardar y cargar un modelo
entrenado y Realizar predicciones con un modelo entrenado.

Comparar parámetros del modelo


¿Cómo saber si realmente se produjo el nuevo entrenamiento? Una manera sería
comparar si los parámetros del modelo entrenado son diferentes a los del modelo
original. El siguiente ejemplo de código compara el original con los pesos del modelo
que se volvió a entrenar y los genera en la consola.

C#

// Extract Model Parameters of re-trained model


LinearRegressionModelParameters retrainedModelParameters =
[Link] as LinearRegressionModelParameters;
// Inspect Change in Weights
var weightDiffs =
[Link](
[Link], (original, retrained) => original
- retrained).ToArray();

[Link]("Original | Retrained | Difference");


for(int i=0;i < [Link]();i++)
{
[Link]($"{[Link][i]} |
{[Link][i]} | {weightDiffs[i]}");
}

En la siguiente tabla se muestra el aspecto que podría tener la salida.

Original Vuelto a entrenar Diferencia

33039.86 56293.76 -23253.9

29099.14 49586.03 -20486.89

28938.38 48609.23 -19670.85

30484.02 53745.43 -23261.41


Implementación de un modelo en Azure
Functions
Artículo • 10/05/2023

Aprenda cómo implementar un modelo de Machine Learning de [Link] previamente


entrenado para realizar predicciones por HTTP a través de un entorno sin servidor de
Azure Functions.

Prerrequisitos
Visual Studio 2022 con las cargas de trabajo desarrollo de escritorio de .NET y
desarrollo de Azure instaladas. El SDK de .NET 6 se instala automáticamente al
seleccionar esta carga de trabajo.
Herramientas de Azure Functions
PowerShell
Modelo previamente entrenado. Descargue este modelo de aprendizaje
automático de análisis de sentimiento entrenado previamente o use el tutorial
de Análisis de sentimiento de [Link] para crear su propio modelo.

Introducción a un ejemplo de Azure Functions


Este ejemplo es una aplicación de desencadenador HTTP de C# de Azure Functions
que utiliza un modelo de clasificación binaria previamente entrenado para clasificar la
opinión del texto como positiva o negativa. Azure Functions proporciona una manera
sencilla de ejecutar pequeños fragmentos de código a escala en un entorno sin servidor
administrado en la nube. El código de este ejemplo se puede encontrar en el repositorio
dotnet/machinelearning-samples en GitHub.

Creación de un proyecto de Azure Functions


1. En Visual Studio 2022, abra el cuadro de diálogo Crear un proyecto.

2. En el cuadro de diálogo "Crear un nuevo proyecto", seleccione la plantilla de


proyecto Azure Functions.

3. En el cuadro de texto Nombre, escriba "SentimentAnalysisFunctionsApp" y


seleccione el botón Siguiente.
4. En el "cuadro de diálogo Información adicional", deje todos los valores
predeterminados tal y como está y seleccione el botón Crear.

5. Instale el paquete NuGet [Link]


a. En el Explorador de soluciones, haga clic con el botón derecho en Administrar
paquetes NuGet.
b. Elija "[Link]" como origen del paquete.
c. Seleccione la pestaña "Examinar ".
d. Busque [Link].
e. Seleccione el paquete en la lista y seleccione el botón Instalar.
f. Haga clic en el botón Aceptar en el cuadro de diálogo Vista previa de los
cambios.
g. Haga clic en el botón Acepto en el cuadro de diálogo Aceptación de la licencia
si está de acuerdo con los términos de licencia de los paquetes que aparecen.

Siga los mismos pasos para instalar los paquetes NuGet [Link],
[Link] y
[Link].

Incorporación del modelo entrenado


previamente en el proyecto
1. Cree un directorio denominado MLModels en el proyecto para guardar los
modelosanteriores a la compilación: en el Explorador de soluciones, haga clic con
el botón derecho en el proyecto y seleccione Agregar > Nueva carpeta. Escriba
"MLModels" y presione ENTRAR.
2. Copie el modelo precompilado en la carpeta MLModels.
3. En el Explorador de soluciones, haga clic con el botón derecho en el archivo del
modelo precompilado y seleccione Propiedades. En Avanzadas, cambie el valor de
Copiar en el directorio de salida por Copiar si es posterior.

Creación de una función de Azure para analizar


sentimientos
Cree una clase para predecir sentimientos. Agregue una nueva clase a su proyecto:

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y,


luego, seleccione Agregar>Nueva Función de Azure....
2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Función de Azure y
cambie el campo Nombre a [Link]. A continuación, seleccione el
botón Agregar.

3. En el cuadro de diálogo Nueva función de Azure, seleccione Desencadenador


Http y elija Anónimo en la lista desplegable Nivel de autorización. Luego haga clic
en el botón Aceptar.

El archivo [Link] se abre en el editor de código. Agregue la siguiente


instrucción using a la parte superior de [Link]:

C#

using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];

De forma predeterminada, la clase AnalyzeSentiment es static . Asegúrese de


quitar la palabra clave static de la definición de clase.

C#

public class AnalyzeSentiment


{

Creación de modelos de datos


Debe crear algunas clases para los datos de entrada y las predicciones. Agregue una
nueva clase a su proyecto:

1. Cree un directorio denominado DataModels en el proyecto para guardar los


modelos de datos. En el Explorador de soluciones, haga clic con el botón derecho
en el proyecto y seleccione Agregar > Nueva carpeta. Escriba "DataModels" y
presione ENTRAR.
2. En el Explorador de soluciones, haga clic con el botón derecho en el directorio
DataModels y luego seleccione Agregar > Clase.

3. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

Se abre el archivo [Link] en el editor de código. Agregue la instrucción


using siguiente en la parte superior del archivo [Link]:

C#

using [Link];

Quite la definición de clase existente y agregue el código siguiente al archivo


[Link]:

C#

public class SentimentData


{
[LoadColumn(0)]
public string SentimentText;

[LoadColumn(1)]
[ColumnName("Label")]
public bool Sentiment;
}

4. En el Explorador de soluciones, haga clic con el botón derecho en el directorio


DataModels y luego seleccione Agregar > Clase.

5. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón
Agregar. El archivo [Link] se abre en el editor de código. Agregue
la instrucción using siguiente en la parte superior del archivo
[Link]:

C#

using [Link];

Quite la definición de clase existente y agregue el código siguiente al archivo


[Link]:

C#
public class SentimentPrediction : SentimentData
{

[ColumnName("PredictedLabel")]
public bool Prediction { get; set; }

public float Probability { get; set; }

public float Score { get; set; }


}

SentimentPrediction hereda de SentimentData el cual proporciona acceso a los


datos originales en la propiedad SentimentText , así como la salida generada por el
modelo.

Registro del servicio PredictionEnginePool


Para realizar una sola predicción, tendrá que crear un objeto PredictionEngine.
PredictionEngine no es seguro para subprocesos. Además, tiene que crear una instancia
de ella en cualquier lugar en que se necesite dentro de la aplicación. A medida que
crece la aplicación, este proceso puede volverse difícil de administrar. Para mejorar el
rendimiento y la seguridad para subprocesos, use una combinación de inserción de
dependencias y el servicio PredictionEnginePool , que crea un elemento ObjectPool de
objetos PredictionEngine para usarlo en toda la aplicación.

En el vínculo siguiente se proporciona más información si quiere aprender más sobre la


inserción de dependencias .

1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y


seleccione Agregar > Clase.

2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase y cambie el


campo Nombre a [Link]. A continuación, seleccione el botón Agregar.

3. Agregue las instrucciones using siguientes en la parte superior del archivo


[Link]:

C#

using [Link];
using [Link];
using [Link];
using SentimentAnalysisFunctionsApp;
using [Link];
using [Link];
using System;
4. Quite el código existente debajo de las instrucciones using y agregue el código
siguiente:

C#

[assembly: FunctionsStartup(typeof(Startup))]
namespace SentimentAnalysisFunctionsApp
{
public class Startup : FunctionsStartup
{

}
}

5. Defina variables para almacenar el entorno en el que se ejecuta la aplicación y la


ruta de acceso del archivo donde se encuentra el modelo dentro de la clase
Startup

C#

private readonly string _environment;


private readonly string _modelPath;

6. A continuación, cree un constructor para establecer los valores de las variables


_environment y _modelPath . Cuando la aplicación se ejecuta localmente, el entorno

predeterminado es Development.

C#

public Startup()
{
_environment =
[Link]("AZURE_FUNCTIONS_ENVIRONMENT");

if (_environment == "Development")
{
_modelPath = [Link]("MLModels", "sentiment_model.zip");
}
else
{
string deploymentPath = @"D:\home\site\wwwroot\";
_modelPath = [Link](deploymentPath, "MLModels",
"sentiment_model.zip");
}
}
7. A continuación, agregue un nuevo método llamado Configure para registrar el
servicio PredictionEnginePool debajo del constructor.

C#

public override void Configure(IFunctionsHostBuilder builder)


{
[Link]<SentimentData,
SentimentPrediction>()
.FromFile(modelName: "SentimentAnalysisModel", filePath:
_modelPath, watchForChanges: true);
}

En un nivel alto, este código inicializa los objetos y servicios de manera automática para
su uso más adelante cuando lo solicite la aplicación en lugar de tener que hacerlo
manualmente.

Los modelos de Machine Learning no son estáticos. A medida que haya nuevos datos
de entrenamiento disponibles, el modelo se vuelve a entrenar y a implementar. Una
manera de obtener la versión más reciente del modelo en la aplicación es volver a
empezar o volver a implementar la aplicación. Sin embargo, esto implica un tiempo de
inactividad de la aplicación. El servicio PredictionEnginePool proporciona un
mecanismo para volver a cargar un modelo actualizado sin necesidad de volver a
empezar o volver a implementar la aplicación.

Establezca el parámetro watchForChanges en true y el PredictionEnginePool inicia un


FileSystemWatcher que escucha las notificaciones de cambios en el sistema de archivos
y genera eventos cuando se produce un cambio en el archivo. Este solicita al
PredictionEnginePool que vuelva a cargar automáticamente el modelo.

El modelo se identifica mediante el parámetro modelName , por lo que se puede volver a


cargar más de un modelo por aplicación tras el cambio.

 Sugerencia

Como alternativa, puede usar el método FromUri al trabajar con modelos


almacenados de manera remota. En lugar de ver si hay eventos modificados de
archivo, FromUri sondea la ubicación remota en busca de cambios. El intervalo de
sondeo predeterminado es de 5 minutos. Puede aumentar o disminuir el intervalo
de sondeo en función de los requisitos de la aplicación. En el ejemplo de código
siguiente, PredictionEnginePool sondea el modelo almacenado en el URI
especificado cada minuto.
C#

[Link]<SentimentData,
SentimentPrediction>()
.FromUri(
modelName: "SentimentAnalysisModel",
uri:"[Link]
learning/models/sentimentanalysis/sentiment_model.zip",
period: [Link](1));

Carga del modelo en la función


Inserte el código siguiente dentro de la clase AnalyzeSentiment:

C#

public AnalyzeSentiment(PredictionEnginePool<SentimentData,
SentimentPrediction> predictionEnginePool)
{
_predictionEnginePool = predictionEnginePool;
}

Este código asigna PredictionEnginePool al pasarlo al constructor de la función que se


obtiene a través de una inserción de dependencias.

Uso del modelo para realizar predicciones


Reemplace la implementación existente del método Run en la clase AnalyzeSentiment
por el código siguiente:

C#

public async Task<IActionResult> Run(


[HttpTrigger([Link], "post", Route = null)]
HttpRequest req,
ILogger log)
{
[Link]("C# HTTP trigger function processed a request.");

// Parse HTTP Request Body


string requestBody = await new StreamReader([Link]).ReadToEndAsync();
SentimentData data = [Link]<SentimentData>
(requestBody);

//Make Prediction
SentimentPrediction prediction =
_predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", example:
data);

//Convert prediction to string


string sentiment = [Link]([Link]) ? "Positive"
: "Negative";

//Return Prediction
return new OkObjectResult(sentiment);
}

Cuando se ejecuta el método Run , los datos entrantes de la solicitud HTTP se


deserializan y se usan como entrada en el PredictionEnginePool . A continuación, se
llama al método Predict para realizar predicciones con el SentimentAnalysisModel
registrado en la clase Startup y devuelve los resultados al usuario si se realiza
correctamente.

Prueba local
Ahora que está todo configurado, es momento de probar la aplicación:

1. Ejecutar la aplicación

2. Abra PowerShell y escriba el código en el símbolo del sistema, donde PORT es el


puerto en que se ejecuta la aplicación. Por lo general, se trata del puerto 7071.

PowerShell

Invoke-RestMethod "[Link] -
Method Post -Body (@{SentimentText="This is a very bad steak"} |
ConvertTo-Json) -ContentType "application/json"

Si se realiza correctamente, la salida debería ser similar al texto siguiente:

PowerShell

Negative

¡Enhorabuena! Publicó correctamente el modelo para realizar predicciones en Internet


mediante una función de Azure.

Pasos siguientes
Implementación en Azure
Implementación de un modelo en una
[Link] Core Web API
Artículo • 10/03/2023

Aprenda cómo publicar un modelo de Machine Learning de [Link] entrenado


previamente en la Web a través de una [Link] Core Web API. Publicar un modelo a
través de una API web permite predicciones mediante métodos HTTP estándar.

Requisitos previos
Visual Studio 2022 con la carga de trabajo de desarrollo de [Link] y web.
PowerShell.
Modelo previamente entrenado. Use el tutorial de análisis de sentimiento de
[Link] para generar su propio modelo o descargue este modelo de Machine
Learning de análisis de sentimiento entrenado previamente .

Creación de un proyecto de [Link] Core Web


API
1. Inicie Visual Studio 2022 y seleccione Crear un proyecto.

2. En el cuadro de diálogo Crear un proyecto:

Escriba Web API en el cuadro de búsqueda.


Seleccione la plantilla API web de [Link] Core y seleccione Siguiente.

3. En el cuadro de diálogo Configure el proyecto:

Asigne al proyecto el nombre SentimentAnalysisWebAPI.


Seleccione Next (Siguiente).

4. En el cuadro de diálogo Información adicional:

Anule la sección de No usar instrucciones de nivel superior.


Seleccione Crear.

5. Instale los siguientes paquetes NuGet:

[Link]
[Link]
Para obtener más información sobre cómo instalar paquetes de en Visual Studio,
consulte la guía Instalación y uso de un paquete NuGet en Visual Studio.

Incorporación del modelo a un proyecto de [Link] Core


Web API
1. Copie el modelo pregenerado en el directorio del proyecto
SentimentAnalysisWebAPI.

2. Configure el proyecto para copiar el archivo de modelo en el directorio de salida.


En el Explorador de soluciones:

Haga clic con el botón derecho en el archivo ZIP del modelo y seleccione
Propiedades.
En Avanzadas, cambie el valor de Copiar en el directorio de salida por Copiar
si es posterior.

Creación de modelos de datos


Debe crear algunas clases para definir el esquema de la entrada y salida del modelo.

7 Nota

Las propiedades de las clases de esquema de entrada y salida dependen de las


columnas del conjunto de datos usadas para entrenar el modelo, así como de la
tarea de aprendizaje automático (regresión, clasificación, etc.).

En el archivo [Link]:

1. Agregue las siguientes instrucciones using:

C#

using [Link];
using [Link];

2. En la parte inferior del archivo, agregue las siguientes clases:

Entrada del modelo

Para este modelo, la entrada contiene una sola propiedad SentimentText , que es
una cadena que representa un comentario de usuario.
C#

public class ModelInput


{
public string SentimentText;
}

Salida del modelo

Una vez que el modelo evalúa la entrada, genera una predicción con tres
propiedades: Sentiment , Probability y Score . En este caso, Sentiment es la
opinión prevista del comentario del usuario y Probability y Score son medidas
de confianza para la predicción.

C#

public class ModelOutput


{
[ColumnName("PredictedLabel")]
public bool Sentiment { get; set; }

public float Probability { get; set; }

public float Score { get; set; }


}

Registro de PredictionEngine para usarlo en la


aplicación
Para realizar una sola predicción, tendrá que crear un objeto PredictionEngine.
PredictionEngine no es seguro para subprocesos. Además, tiene que crear una instancia
de ella en cualquier lugar en que se necesite dentro de la aplicación. A medida que
crece la aplicación, este proceso puede volverse difícil de administrar. Para mejorar el
rendimiento y la seguridad para subprocesos, use una combinación de inserción de
dependencias y el servicio PredictionEnginePool , que crea un elemento ObjectPool de
objetos PredictionEngine para usarlo en toda la aplicación.

En el vínculo siguiente se proporciona más información si quiere aprender sobre la


inserción de dependencias en [Link] Core.

Agregue el código siguiente al archivo [Link]:

C#
[Link]<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath:
"sentiment_model.zip", watchForChanges: true);

En un nivel alto, este código inicializa los objetos y servicios de manera automática para
su uso más adelante cuando lo solicite la aplicación en lugar de tener que hacerlo
manualmente.

Los modelos de Machine Learning no son estáticos. A medida que haya nuevos datos
de entrenamiento disponibles, el modelo se vuelve a entrenar y a implementar. Una
manera de obtener la versión más reciente del modelo en la aplicación es volver a
empezar o volver a implementar la aplicación. Sin embargo, esto implica un tiempo de
inactividad de la aplicación. El servicio PredictionEnginePool proporciona un
mecanismo para volver a cargar un modelo actualizado sin necesidad de volver a
empezar o volver a implementar la aplicación.

Establezca el parámetro watchForChanges en true y el PredictionEnginePool inicia un


FileSystemWatcher que escucha las notificaciones de cambios en el sistema de archivos
y genera eventos cuando se produce un cambio en el archivo. Este solicita al
PredictionEnginePool que vuelva a cargar automáticamente el modelo.

El modelo se identifica mediante el parámetro modelName , por lo que se puede volver a


cargar más de un modelo por aplicación tras el cambio.

 Sugerencia

Como alternativa, puede usar el método FromUri al trabajar con modelos


almacenados de manera remota. En lugar de ver si hay eventos modificados de
archivo, FromUri sondea la ubicación remota en busca de cambios. El intervalo de
sondeo predeterminado es de 5 minutos. Puede aumentar o disminuir el intervalo
de sondeo en función de los requisitos de la aplicación. En el ejemplo de código
siguiente, PredictionEnginePool sondea el modelo almacenado en el URI
especificado cada minuto.

C#

[Link]<SentimentData, SentimentPrediction>()
.FromUri(
modelName: "SentimentAnalysisModel",
uri:"[Link]
learning/models/sentimentanalysis/sentiment_model.zip",
period: [Link](1));
Asignación de punto de conexión de predicción
Para procesar las solicitudes HTTP entrantes, cree un punto de conexión.

Reemplace el punto de conexión / por lo siguiente:

C#

var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput>
predictionEnginePool, ModelInput input) =>
await [Link]([Link](modelName:
"SentimentAnalysisModel", input));

[Link]("/predict", predictionHandler);

El punto de conexión /predict acepta solicitudes HTTP POST y usa el grupo del motor
de predicción para devolver una predicción mediante la entrada proporcionada.

Cuando haya terminado, [Link] debe tener un aspecto similar al siguiente:

C#

using [Link];
using [Link];

var builder = [Link](args);

[Link]<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath:
"sentiment_model.zip", watchForChanges: true);

var app = [Link]();

var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput>
predictionEnginePool, ModelInput input) =>
await [Link]([Link](modelName:
"SentimentAnalysisModel", input));

[Link]("/predict", predictionHandler);

[Link]();

public class ModelInput


{
public string SentimentText;
}

public class ModelOutput


{
[ColumnName("PredictedLabel")]
public bool Sentiment { get; set; }

public float Probability { get; set; }

public float Score { get; set; }


}

Prueba local de Web API


Una vez que todo está configurado, es momento de probar la aplicación.

1. Ejecute la aplicación.

2. Abra PowerShell y escriba el código siguiente, donde PORT es el puerto donde


escuchar la aplicación.

PowerShell

Invoke-RestMethod "[Link] -Method Post -Body


(@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -
ContentType "application/json"

Si se realiza correctamente, la salida debería ser similar al texto siguiente:

PowerShell

sentiment probability score


--------- ----------- -----
False 0.5 0

¡Enhorabuena! Publicó correctamente el modelo para realizar predicciones en Internet


mediante una [Link] Core Web API.

Pasos siguientes
Implementación en Azure
Realización de predicciones con un modelo
AutoML de ONNX en .NET
Artículo • 01/06/2023

En este artículo, aprenderá a usar un modelo de ML automatizado (AutoML) de Neural Network


Exchange (ONNX) para hacer predicciones en una aplicación de consola de .NET Core de C#
con [Link].

[Link] es un marco de aprendizaje automático multiplataforma de código abierto del


ecosistema de .NET que permite entrenar y consumir modelos de aprendizaje automático
personalizados utilizando un enfoque Code First de C# o F# junto con herramientas que
apenas requieren código, como Model Builder y la CLI de [Link]. Este marco puede ampliarse
y permite utilizar otros marcos de aprendizaje automático populares, como TensorFlow y
ONNX.

ONNX es un formato de código abierto para modelos de IA. ONNX admite la interoperabilidad
entre marcos. Esto significa que puede entrenar un modelo en uno de los muchos marcos de
aprendizaje automático que son más conocidos, como PyTorch, convertirlo a un formato ONNX
y consumir el modelo de ONNX en un marco de trabajo diferente, como [Link]. Para más
información, visite el sitio web de ONNX .

Requisitos previos
SDK de .NET Core 3.1 o posterior
Editor de texto o IDE (como Visual Studio o Visual Studio Code )
Modelo de ONNX. Para obtener más información acerca de cómo entrenar un modelo
ONNX de AutoML, consulte el siguiente cuaderno de clasificación para marketing
bancario (SDK v1) .
Netron (opcional)

Creación de una aplicación de consola en C#


En este ejemplo, va a utilizar la CLI de .NET Core para compilar la aplicación, pero puede
realizar las mismas tareas con Visual Studio. Más información sobre la CLI de .NET Core.

1. Abra un terminal y cree una aplicación de consola de .NET Core en C#. En este ejemplo, el
nombre de la aplicación es AutoMLONNXConsoleApp . Se creará un directorio que tendrá el
mismo nombre con el contenido de la aplicación.

CLI de .NET

dotnet new console -o AutoMLONNXConsoleApp


2. En el terminal, vaya al directorio AutoMLONNXConsoleApp.

Bash

cd AutoMLONNXConsoleApp

Incorporación de los paquetes de software


1. Instale los paquetes de NuGet [Link], [Link] y
[Link] mediante la CLI de .NET Core.

CLI de .NET

dotnet add package [Link]


dotnet add package [Link]
dotnet add package [Link]

Estos paquetes contienen las dependencias necesarias para usar un modelo de ONNX en
una aplicación .NET. [Link] cuenta con una API que usa el entorno de ejecución de
ONNX para realizar las predicciones.

2. Abra el archivo [Link] y agregue al comienzo las siguientes instrucciones using para
hacer referencia a los paquetes correspondientes.

C#

using [Link];
using [Link];
using [Link];
using [Link];

Incorporación de una referencia al modelo de


ONNX
Una forma de conseguir que la aplicación de consola acceda al modelo de ONNX es agregarla
al directorio de salida de la compilación. Para más información sobre los elementos comunes
de MSBuild, consulte la guía de MSBuild.

Agregue una referencia al archivo del modelo de ONNX de la aplicación.

1. Copie el modelo ONNX en el directorio raíz AutoMLONNXConsoleApp de la aplicación.

2. Abra el archivo AutoMLONNXConsoleApp. csproj y agregue el siguiente contenido dentro


del nodo Project .

XML
<ItemGroup>
<None Include="[Link]">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

En este caso, el nombre del archivo de modelo de ONNX es [Link].

3. Abra el archivo [Link] y agregue la línea siguiente dentro de la clase Program .

C#

static string ONNX_MODEL_PATH = "[Link]";

Inicialización de MLContext
Dentro del método Main de la clase Program , cree una nueva instancia de MLContext.

C#

MLContext mlContext = new MLContext();

La clase MLContext es el punto de partida de todas las operaciones de [Link], mientras que la
inicialización de mlContext crea un nuevo entorno de [Link] que puede compartirse durante
el ciclo de vida del modelo. Conceptualmente, es similar a DbContext en Entity Framework.

Definición del esquema de datos del modelo


El modelo espera que los datos de entrada y salida estén en un formato específico. [Link]
permite definir el formato de los datos mediante clases. En ocasiones, es posible que ya sepa
cuál es el formato. De lo contrario, puede usar herramientas como Netron para inspeccionar el
modelo de ONNX.

El modelo de este ejemplo utiliza la información del conjunto de datos NYC TLC Taxi Trip. A
continuación, se muestra un ejemplo de los datos:

vendor_id rate_code passenger_count trip_time_in_secs trip_distance payment_type fare_amount

VTS 1 1 1140 3,75 CRD 15,5

VTS 1 1 480 2.72 CRD 10.0

VTS 1 1 1680 7.8 CSH 26,5

Inspección del modelo de ONNX (opcional)


Utilice una herramienta como Netron para inspeccionar las entradas y salidas del modelo.

1. Abra Netron.

2. En la barra de menús superior, seleccione Archivo> Abrir y use el explorador de archivos


para seleccionar el modelo.

3. Se abre el modelo. Por ejemplo, la estructura del modelo [Link] se parece a


la siguiente:

4. Seleccione el último nodo de la parte inferior del grafo ( variable_out1 en este caso) para
ver los metadatos del modelo. Las entradas y salidas de la barra lateral representan las
entradas, salidas y tipos de datos esperados del modelo. Utilice esta información para
definir el esquema de entrada y salida del modelo.

Definición del esquema de entrada del modelo


Cree una nueva clase llamada OnnxInput con las siguientes propiedades en el archivo
[Link].

C#

public class OnnxInput


{
[ColumnName("vendor_id")]
public string VendorId { get; set; }

[ColumnName("rate_code"),OnnxMapType(typeof(Int64),typeof(Single))]
public Int64 RateCode { get; set; }

[ColumnName("passenger_count"), OnnxMapType(typeof(Int64), typeof(Single))]


public Int64 PassengerCount { get; set; }

[ColumnName("trip_time_in_secs"), OnnxMapType(typeof(Int64), typeof(Single))]


public Int64 TripTimeInSecs { get; set; }

[ColumnName("trip_distance")]
public float TripDistance { get; set; }

[ColumnName("payment_type")]
public string PaymentType { get; set; }
}

Cada una de las propiedades se asigna a una columna del conjunto de datos. Además, se
incluirán atributos en las notas de las propiedades.

El atributo ColumnName permite especificar cómo [Link] debe hacer referencia a la columna
al trabajar con los datos. Por ejemplo, aunque la propiedad TripDistance sigue las
convenciones de nomenclatura estándar de .NET, el modelo solo tiene información de una
columna o característica llamada trip_distance . Para solucionar esta discrepancia de
nomenclatura, el atributo ColumnName asigna la propiedad TripDistance a una columna o
característica con el nombre trip_distance .

En el caso de los valores numéricos, [Link] solo trabaja con tipos de valor Single. Sin
embargo, el tipo de datos original de algunas de las columnas es un entero. El atributo
OnnxMapType asigna tipos entre ONNX y [Link].

Para más información sobre los atributos de datos, consulte la guía de datos de carga de
[Link].

Definición del esquema de salida del modelo


Una vez procesados los datos, se genera una salida con un formato determinado. Defina el
esquema de salida de los datos. Cree una nueva clase llamada OnnxOutput con las siguientes
propiedades en el archivo [Link].

C#

public class OnnxOutput


{
[ColumnName("variable_out1")]
public float[] PredictedFare { get; set; }
}

Al igual que con OnnxInput , utilice el atributo ColumnName para asignar a la salida
variable_out1 un nombre más descriptivo: PredictedFare .

Definición de una canalización de predicciones


Normalmente, las canalizaciones de [Link] son una serie de transformaciones en cadena que
se realizan en los datos de entrada para generar una salida. Para más información sobre las
transformaciones de datos, consulte la guía de transformación de datos de [Link].

1. Cree un nuevo método llamado GetPredictionPipeline dentro de la clase Program .

C#

static ITransformer GetPredictionPipeline(MLContext mlContext)


{

2. Defina el nombre de las columnas de entrada y de salida. Agregue el código siguiente


dentro del método GetPredictionPipeline .

C#

var inputColumns = new string []


{
"vendor_id", "rate_code", "passenger_count", "trip_time_in_secs",
"trip_distance", "payment_type"
};

var outputColumns = new string [] { "variable_out1" };

3. Defina la canalización. Un objeto IEstimator proporciona un proyecto de las operaciones y


de los esquemas de entrada y salida de la canalización.

C#

var onnxPredictionPipeline =
mlContext
.Transforms
.ApplyOnnxModel(
outputColumnNames: outputColumns,
inputColumnNames: inputColumns,
ONNX_MODEL_PATH);

En este caso, ApplyOnnxModel es la única transformación de la canalización, que toma los


nombres de las columnas de entrada y salida, y la ruta de acceso al archivo del modelo de
ONNX.

4. Los objetos IEstimator solo definen el conjunto de operaciones que se van a aplicar a los
datos. Lo que realmente trabaja con los datos se conoce como ITransformer. Utilice el
método Fit para crear uno a partir de onnxPredictionPipeline .

C#

var emptyDv = [Link](new OnnxInput[] {});


return [Link](emptyDv);

El método Fit espera un objeto IDataView como entrada para realizar las operaciones. Los
objetos IDataView permiten representar los datos en [Link] con un formato tabular.
Dado que en este caso la canalización solo se usa para realizar predicciones, puede
proporcionar un objeto IDataView para que ITransformer tenga la información necesaria
del esquema de entrada y de salida. A continuación, se devolverá el objeto ITransformer al
que se le ha aplicado el método Fit para que siga utilizándose en la aplicación.

 Sugerencia

En este ejemplo, la canalización se define y se utiliza dentro de la misma aplicación.


Sin embargo, cuando se creen predicciones, se recomienda usar diferentes
aplicaciones para definir y usar la canalización. En [Link], las canalizaciones se
pueden serializar y guardar para utilizarse en otras aplicaciones NET dirigidas a
usuarios finales. [Link] admite varios destinos de implementación, como
aplicaciones de escritorio, servicios web, aplicaciones de WebAssembly * y muchos
otros. Para más información acerca de cómo guardar las canalizaciones, consulte la
guía para guardar y cargar modelos entrenados de [Link].

*WebAssembly solo se admite en .NET Core 5 o versiones posteriores

5. En el método Main , llame al método GetPredictionPipeline con los parámetros


necesarios.

C#

var onnxPredictionPipeline = GetPredictionPipeline(mlContext);

Uso del modelo para realizar predicciones


Ahora que tiene una canalización, es el momento de utilizarla para realizar predicciones.
[Link] dispone de una práctica API que permite llevar a cabo predicciones en una única
instancia de datos denominada PredictionEngine.

1. En el método Main , cree un objeto PredictionEngine utilizando el método


CreatePredictionEngine.

C#

var onnxPredictionEngine = [Link]<OnnxInput,


OnnxOutput>(onnxPredictionPipeline);

2. Cree una entrada de datos de prueba.


C#

var testInput = new OnnxInput


{
VendorId = "CMT",
RateCode = 1,
PassengerCount = 1,
TripTimeInSecs = 1271,
TripDistance = 3.8f,
PaymentType = "CRD"
};

3. Utilice el objeto predictionEngine para hacer predicciones basadas en los nuevos datos
de testInput con el método Predict.

C#

var prediction = [Link](testInput);

4. Envíe la salida de la predicción a la consola.

C#

[Link]($"Predicted Fare: {[Link]()}");

5. Use la CLI de .NET Core para ejecutar la aplicación.

CLI de .NET

dotnet run

La salida debe ser parecida a esta:

text

Predicted Fare: 15.621523

Para más información acerca de cómo realizar predicciones en [Link], consulte la guía sobre
el uso de un modelo para hacer predicciones.

Pasos siguientes
Implementación de un modelo en una [Link] Core Web API
Implementación de un modelo como una instancia .NET sin servidor de Azure Functions
Referencia de comandos de la CLI de
[Link]
Artículo • 05/06/2023

Los comandos classification , regression y recommendation son los comandos


principales proporcionados por la herramienta CLI de [Link]. Estos comandos permiten
generar modelos de [Link] de buena calidad que pueden usarse con fines de
clasificación, regresión y recomendación mediante el aprendizaje automático
automatizado (AutoML) y el código C# de ejemplo para ejecutar o calificar dicho
modelo. Además, se genera código C# para entrenar el modelo y poder investigar el
algoritmo y la configuración del modelo.

7 Nota

Este tema hace referencia a la CLI de [Link] y AutoML de [Link], que se


encuentran actualmente en versión preliminar, por lo que el material está sujeto a
cambios.

Información general
Ejemplo de uso:

Consola

mlnet regression --dataset "[Link]" --label-col price

Los comandos de la tarea de ML mlnet ( classification , regression , recommendation y


forecasting ) generan los recursos siguientes:

Un archivo .zip de modelo serializado ("mejor modelo") listo para usarse.


Código C# para ejecutar o puntuar el modelo generado.
Código de C# con el código de entrenamiento utilizado para generar ese modelo.

Los dos primeros recursos se pueden usar directamente en las aplicaciones de usuario
final (aplicación web [Link] Core, servicios, aplicación de escritorio, y mucho más)
para realizar predicciones con el modelo.

El tercer recurso, el código de entrenamiento, le muestra el código de la API de [Link]


que utilizó la CLI para entrenar el modelo generado, de modo que pueda investigar el
algoritmo y configuración específicos del modelo.

Ejemplos
El comando de la CLI más sencillo para un problema de clasificación (AutoML infiere la
mayor parte de la configuración de los datos proporcionados):

Consola

mlnet classification --dataset "[Link]" --label-col Sentiment

Otro comando de CLI sencillo para un problema de regresión:

Consola

mlnet regression --dataset "[Link]" --label-col Price

Cree y entrene un modelo de clasificación con un conjunto de datos de entrenamiento,


un conjunto de datos de prueba y más argumentos explícitos de personalización:

Consola

mlnet classification --dataset "/MyDataSets/[Link]" --test-


dataset "/MyDataSets/[Link]" --label-col "InsuranceRisk" --
cache on --train-time 600

Opciones de comando
Los comandos de la tarea de ML mlnet ( classification , regression , recommendation ,
forecasting y train ) entrenan varios modelos basados en el conjunto de datos

proporcionado y en las opciones de la CLI de [Link]. Estos comandos también


seleccionan el mejor modelo, lo guardan como un archivo .zip serializado y generan el
código C# correspondiente para la puntuación y el entrenamiento.

Opciones de clasificación
La ejecución de mlnet classification entrenará un modelo de clasificación. Elija este
comando si quiere que un modelo de ML clasifique los datos en dos o más clases (por
ejemplo, análisis de opiniones).

Consola
mlnet classification

--dataset <path> (REQUIRED)

--label-col <col> (REQUIRED)

--cache <option>

--has-header (Default: true)

--ignore-cols <cols>

--log-file-path <path>

--name <name>

-o, --output <path>

--test-dataset <path>

--train-time <time> (Default: 30 minutes, in seconds)

--validation-dataset <path>

-v, --verbosity <v>

-?, -h, --help

Opciones de regresión
La ejecución de mlnet regression entrenará un modelo de regresión. Elija este
comando si quiere que un modelo de ML prediga un valor numérico (por ejemplo,
predicción de precio).

Consola

mlnet regression

--dataset <path> (REQUIRED)

--label-col <col> (REQUIRED)

--cache <option>

--has-header (Default: true)

--ignore-cols <cols>

--log-file-path <path>
--name <name>

-o, --output <path>

--test-dataset <path>

--train-time <time> (Default: 30 minutes, in seconds)

--validation-dataset <path>

-v, --verbosity <v>

-?, -h, --help

Opciones de recomendación
La ejecución de mlnet recommendation entrenará un modelo de recomendación. Elija
este comando si quiere que un modelo de ML recomiende elementos a los usuarios en
función de las clasificaciones (por ejemplo, recomendación de productos).

Consola

mlnet recommendation

--dataset <path> (REQUIRED)

--item-col <col> (REQUIRED)

--rating-col <col> (REQUIRED)

--user-col <col> (REQUIRED)

--cache <option>

--has-header (Default: true)

--log-file-path <path>

--name <name>

-o, --output <path>

--test-dataset <path>

--train-time <time> (Default: 30 minutes, in seconds)

--validation-dataset <path>

-v, --verbosity <v>


-?, -h, --help

Las opciones de entrada no válidas hacen que la herramienta de la CLI emita una lista de
entradas válidas y un mensaje de error.

Opciones de previsión
La ejecución de mlnet forecasting entrenará a un modelo de previsión de series
temporales. Elija este comando si desea que un modelo de ML haga una previsión de un
valor en función de datos históricos (por ejemplo, previsión de ventas).

Consola

mlnet forecasting

--dataset <dataset> (REQUIRED)

--horizon <horizon> (REQUIRED)

--label-col <label-col> (REQUIRED)

--time-col <time-col> (REQUIRED)

--cache <Auto|Off|On>

--has-header

--log-file-path <log-file-path>

--name <name>

-o, --output <output>

--test-dataset <test-dataset>

--train-time <train-time>

-v, --verbosity <verbosity>

Opciones de entrenamiento
La ejecución de mlnet train entrenará a un modelo en función de un archivo
"mbconfig" generado a partir de Model Builder. Para que este comando funcione, los
datos de entrenamiento deben estar en el mismo directorio que el archivo "mbconfig".
Consola

-training-config <training-config> (REQUIRED)

--log-file-path <log-file-path>

-v, --verbosity <verbosity>

Conjunto de datos
--dataset | -d (cadena)

Este argumento proporciona la ruta de acceso del archivo a cualquiera de las siguientes
opciones:

A: el archivo de conjunto de datos entero: si utiliza esta opción y el usuario no


proporciona --test-dataset y --validation-dataset , se utilizarán internamente
enfoques de validación cruzada (de K iteraciones, etc.) o división de datos
automatizada para validar el modelo. En ese caso, el usuario solo deberá
proporcionar la ruta de acceso al archivo del conjunto de datos.

B: el archivo del conjunto de datos de entrenamiento: si el usuario también


proporciona conjuntos de datos para la validación del modelo (con --test-
dataset y, opcionalmente, --validation-dataset ), el argumento --dataset

significa tener solo el "conjunto de datos de entrenamiento". Por ejemplo, cuando


se usa un enfoque de 80-20 % para validar la calidad del modelo y obtener
métricas de precisión, el "conjunto de datos de entrenamiento" tendrá un 80 % de
los datos y el "conjunto de datos de prueba" tendría un 20 % de los datos.

Conjunto de datos de prueba


--test-dataset | -t (cadena)

Ruta de acceso al archivo que apunta al archivo del conjunto de datos de prueba, por
ejemplo, cuando se usa un enfoque de 80-20 % al realizar validaciones regulares para
obtener métricas de precisión.

Si usa --test-dataset , también se requiere --dataset .

El argumento --test-dataset es opcional, a menos que se utilice --validation-dataset.


En ese caso, el usuario debe utilizar los tres argumentos.
Conjunto de datos de validación
--validation-dataset | -v (cadena)

Ruta de acceso al archivo que apunta al archivo del conjunto de datos de validación. El
conjunto de datos de validación es opcional, en cualquier caso.

Si usa un validation dataset , el comportamiento debería ser el siguiente:

Los argumentos test-dataset y --dataset también son necesarios.

El conjunto de datos validation-dataset se usa para calcular el error de


predicción en la selección del modelo.

El test-dataset se usa para la valoración del error de generalización del último


modelo elegido. Idealmente, el conjunto de pruebas se debe mantener en un
"almacén" y extraerse solo al final del análisis de datos.

Básicamente, cuando se usa un validation dataset , además del test dataset , la fase
de validación se divide en dos partes:

1. En la primera parte, simplemente mira los modelos y selecciona el enfoque con


mejor rendimiento mediante los datos de validación (=validación)
2. A continuación, calcula la precisión del enfoque seleccionado (=prueba).

Por lo tanto, la separación de datos podría ser 80/10/10 o 75/15/10. Por ejemplo:

el archivo training-dataset debe tener un 75 % de los datos.


el archivo validation-dataset debe tener un 15 % de los datos.
el archivo test-dataset debe tener un 10 % de los datos.

En cualquier caso, el usuario decidirá los porcentajes mediante la CLI que proporcionará
los archivos ya divididos.

Columna de etiqueta
--label-col (entero o cadena)

Con este argumento, se puede especificar una columna concreta de destino/objetivo (es
decir, la variable que se quiere predecir) utilizando el nombre de la columna establecido
en el encabezado del conjunto de datos o bien el índice numérico de la columna en el
archivo del conjunto de datos (los valores del índice de la columna empiezan en 0).

Este argumento se usa para problemas de clasificación y regresión.


Columna de elementos
--item-col (entero o cadena)

La columna de elementos contiene la lista de elementos que los usuarios califican (los
elementos se recomiendan a los usuarios). Esta columna se puede especificar utilizando
el nombre de la columna establecido en el encabezado del conjunto de datos o bien el
índice numérico de la columna en el archivo del conjunto de datos (los valores del
índice de la columna empiezan en 0).

Este argumento solo se usa para la tarea de recomendación.

Columna de clasificación
--rating-col (entero o cadena)

La columna de clasificación contiene la lista de clasificaciones que los usuarios otorgan a


los elementos. Esta columna se puede especificar utilizando el nombre de la columna
establecido en el encabezado del conjunto de datos o bien el índice numérico de la
columna en el archivo del conjunto de datos (los valores del índice de la columna
empiezan en 0).

Este argumento solo se usa para la tarea de recomendación.

Columna de usuarios
--user-col (entero o cadena)

La columna de usuarios contiene la lista de usuarios que califican elementos. Esta


columna se puede especificar utilizando el nombre de la columna establecido en el
encabezado del conjunto de datos o bien el índice numérico de la columna en el archivo
del conjunto de datos (los valores del índice de la columna empiezan en 0).

Este argumento solo se usa para la tarea de recomendación.

Omisión de columnas
--ignore-columns (cadena)

Con este argumento, puede omitir las columnas existentes en el archivo del conjunto de
datos, de modo que los procesos de entrenamiento no las carguen ni utilicen.
Especifique los nombres de las columnas que desea omitir. Use ", " (coma con espacio)
o " " (espacio) para separar varios nombres de columna. Puede usar comillas para los
nombres de columna que contienen espacios en blanco (por ejemplo, "inicio de
sesión").

Ejemplo:

--ignore-columns email, address, id, logged_in

Tiene encabezado
--has-header (bool)

Especifique si los archivos del conjunto de datos tienen una fila de encabezado. Los
valores posibles son:

true
false

La CLI de [Link] intentará detectar esta propiedad si el usuario no especifica este


argumento.

Tiempo de entrenamiento
--train-time (cadena)

De forma predeterminada, el tiempo máximo de exploración o entrenamiento es de


30 minutos.

Este argumento establece el tiempo máximo (en segundos) para que el proceso explore
varios instructores y configuraciones. El tiempo configurado puede superarse so el
tiempo proporcionado es demasiado corto (por ejemplo, 2 segundos) para una sola
iteración. En este caso, el tiempo real es el tiempo necesario para producir una
configuración de modelo en una sola iteración.

El tiempo necesario para las iteraciones puede variar según el tamaño del conjunto de
datos.

instancias y claves
--cache (cadena)
Si usa almacenamiento en caché, el conjunto de datos de entrenamiento completo se
cargará en memoria.

Para conjuntos de datos pequeños y medianos, el uso de memoria caché puede mejorar
significativamente el rendimiento del entrenamiento, lo que significa que el tiempo de
entrenamiento puede ser más corto que cuando no se usa memoria caché.

Sin embargo, para conjuntos de datos grandes, cargar todos los datos en memoria
puede tener un impacto negativo ya que podría obtener memoria insuficiente. Cuando
se entrene con archivos de conjuntos de datos grandes y no se use la memoria caché,
[Link] transmitirá fragmentos de datos desde la unidad cuando necesite cargar más
datos durante el entrenamiento.

Puede especificar los siguientes valores:

on : Fuerza el uso de la memoria caché durante el entrenamiento. off : Fuerza el no uso


de la memoria caché durante el entrenamiento. auto : Según la heurística de AutoML, se
usará o no la memoria caché. Normalmente, los conjuntos de datos pequeños y
medianos utilizarán la memoria caché y los conjuntos de datos grandes no la usarán si
se usa la opción auto .

Si no especifica el parámetro auto , la configuración --cache de la memoria caché se


utilizara de manera predeterminada.

NOMBRE
--name (cadena)

El nombre de la solución o el proyecto de la salida creada. Si no se especifica ningún


nombre, se usará el nombre sample-{mltask} .

El archivo del modelo de [Link] (archivo ZIP) obtendrá el mismo nombre también.

Ruta de acceso de salida


--output | -o (cadena)

Ubicación o carpeta para colocar la salida generada. El valor predeterminado es el


directorio actual.

Nivel de detalle
--verbosity | -v (cadena)

Establece el nivel de detalle de la salida estándar.

Los valores permitidos son:

q[uiet]
m[inimal] (de manera predeterminada)

diag[nostic] (nivel de información de registro)

De forma predeterminada, la herramienta CLI debe mostrar un mínimo de comentarios


( minimal ) cuando trabaja, como mencionar que está trabajando y, a ser posible, cuánto
tiempo queda o qué porcentaje de tiempo lleva completado.

Ayuda
-h |--help

Imprime la ayuda para el comando con una descripción para el parámetro de cada
comando.

Vea también
Cómo instalar la herramienta de la CLI de [Link]
Introducción a la CLI de [Link]
Tutorial: Análisis de opiniones mediante la CLI de [Link]
Telemetría en la CLI de [Link]
Recursos de [Link]
Artículo • 15/02/2023

Para obtener más información sobre [Link], vea los siguientes recursos:

Glosario de terminología relacionada con el aprendizaje automático y [Link]


Recursos de entrenamiento de Azure sobre el generador de modelos
Telemetría de la CLI de [Link]

Pasos siguientes
Aplique sus conocimientos en uno de los tutoriales de [Link].
Glosario sobre aprendizaje automático
de términos importantes
Artículo • 10/05/2023

La lista siguiente es una compilación de los términos importantes sobre aprendizaje


automático que resultan de utilidad al crear los modelos personalizados en [Link].

Precisión
En clasificación, la exactitud es el número de elementos correctamente clasificados
dividido entre el número total de elementos en el conjunto de pruebas. Va desde 0 (el
menos preciso) a 1 (el más preciso). La exactitud es una de las métricas de evaluación
del rendimiento del modelo. Trátela junto con el valor de precisión, el de recuperación y
la puntuación F.

Área bajo la curva (AUC)


En clasificación binaria, una métrica de evaluación que es el valor del área bajo la curva
que traza la tasa de verdaderos positivos (en el eje y) en relación con la tasa de falsos
positivos (en el eje x). Va de 0,5 (el peor) a 1 (el mejor). También conocida como el área
bajo la curva ROC; es decir, la curva característica operativa del receptor. Para obtener
más información, consulte el artículo de Wikipedia Curva ROC .

Clasificación binaria
Un caso de clasificación donde la etiqueta es solo una de dos clases. Para obtener más
información, vea la sección Clasificación binaria del tema Tareas de aprendizaje
automático.

Calibración
Calibración es el proceso de asignar una puntuación sin procesar en una pertenencia de
la clase, para la clasificación binaria y multiclase. Algunos instructores de [Link] tienen
un sufijo NonCalibrated . Estos algoritmos generan una puntuación sin procesar que
luego se debe asignar a una probabilidad de la clase.

Catálogo
En [Link], un catálogo es una colección de funciones de extensión, agrupadas con un
objetivo común.

Por ejemplo, cada tarea de aprendizaje automático (clasificación binaria, regresión,


clasificación, etcétera) tiene un catálogo de algoritmos de aprendizaje automático
disponibles (instructores). El catálogo para los instructores de clasificación binaria es:
[Link].

clasificación
Cuando los datos se usan para predecir una categoría, la tarea de aprendizaje
automático supervisado se llama clasificación. La clasificación binaria hace referencia a la
predicción de únicamente dos categorías (por ejemplo, clasificar una imagen como la
foto de un "gato" o un "perro"). La clasificación multiclase hace referencia a la
predicción de varias categorías (por ejemplo, clasificar una imagen como la foto de una
raza específica de perro).

Coeficiente de determinación
En regresión, una métrica de evaluación que indica en qué grado los datos se ajustan a
un modelo. Va de 0 a 1. Un valor de 0 significa que los datos son aleatorios o no pueden
ajustarse al modelo. Un valor de 1 significa que el modelo coincide exactamente con los
datos. Esto se conoce a menudo como r2, R2, o r cuadrado.

data
Los datos son esenciales en cualquier aplicación de aprendizaje automático. En [Link],
los datos se representan mediante objetos IDataView. Objetos de vista de datos:

están formados por filas y columnas


se evalúan de forma diferida, es decir, solo cargan datos cuando una operación lo
requiere
contienen un esquema que define el tipo, el formato y la longitud de cada
columna

Estimador
Clase de [Link] que implementa la interfaz IEstimator<TTransformer>.
Se trata de una especificación de una transformación (tanto la transformación de la
preparación de datos como la transformación de entrenamiento de modelos de
aprendizaje automático). Los estimadores pueden encadenarse en una canalización de
transformaciones. Los parámetros de un estimador o una canalización de estimadores
se aprenden al llamar a Fit. El resultado de Fit es un transformador.

Método de extensión
Método de .NET que forma parte de una clase, pero se define fuera de la clase. El primer
parámetro de un método de extensión es una referencia this estática a la clase a la que
pertenece el método de extensión.

Los métodos de extensión se usan ampliamente en [Link] para construir instancias de


estimadores.

Característica
Una propiedad medible del fenómeno que se mide, generalmente un valor numérico
(doble). Las características múltiples se conocen como vector de características y
generalmente se almacenan como double[] . Las características definen los elementos
importantes del fenómeno que se mide. Para obtener más información, vea el artículo
Feature (Característica) en Wikipedia.

Ingeniería de características
La ingeniería de características es el proceso que implica la definición de un conjunto de
características y el desarrollo de software que produce vectores de características a
partir de los datos de fenómenos disponibles, es decir, la extracción de características.
Para obtener más información, vea el artículo Feature engineering (Ingeniería de
características) en Wikipedia.

Puntuación F
En clasificación, una métrica de evaluación que equilibra precisión y recuperación.

Hiperparámetro
Un parámetro de un algoritmo de aprendizaje automático. Algunos ejemplos son el
número de árboles para aprender en un bosque de decisión o el tamaño de paso en un
algoritmo de gradiente descendente. Los valores de los hiperparámetros se establecen
antes de entrenar el modelo y rigen el proceso de búsqueda de los parámetros de la
función de predicción; por ejemplo, los puntos de comparación en un árbol de decisión
o las ponderaciones en un modelo de regresión lineal. Para obtener más información,
vea el artículo Hyperparameter (Hiperparámetro) en Wikipedia.

Etiqueta
El elemento que se va a predecir con el modelo de aprendizaje automático. Por ejemplo,
una raza de perro o el precio futuro de unas acciones.

Pérdida de registro
En clasificación, una métrica de evaluación que caracteriza la precisión de un
clasificador. Cuanto menor sea la pérdida de registro, más preciso será un clasificador.

Función de pérdida
Una función de pérdida es la diferencia entre los valores de etiqueta de entrenamiento y
la predicción realizada por el modelo. Los parámetros del modelo se calculan
minimizando la función de pérdida.

Pueden configurarse distintos instructores con distintas funciones de pérdida.

Error de media absoluto


En regresión, una métrica de evaluación que es el promedio de todos los errores del
modelo, donde el error del modelo es la distancia entre el valor de la etiqueta predicho
y el valor de la etiqueta correcto.

Modelo
Tradicionalmente, los parámetros de la función de predicción. Por ejemplo, las
ponderaciones en un modelo de regresión lineal o los puntos de división en un árbol de
decisión. En [Link], un modelo contiene toda la información necesaria para predecir la
etiqueta de un objeto de dominio (por ejemplo, imagen o texto). Esto significa que los
modelos de [Link] incluyen los pasos de caracterización necesarios, así como los
parámetros para la función de predicción.
Clasificación multiclase
Un caso de clasificación donde la etiqueta es una de tres o más clases. Para obtener más
información, vea la sección Clasificación multiclase del tema Tareas de aprendizaje
automático.

N-grama
Un esquema de extracción de características para datos de texto: cualquier secuencia de
N palabras se convierte en un valor de característica.

Normalización
La normalización es el proceso de escalar datos de número de punto flotante a valores
entre 0 y 1. Muchos de los algoritmos de aprendizaje usados en [Link] requieren la
normalización de los datos de las características de entrada. [Link] proporciona una
serie de transformaciones para la normalización

Vector de características numérico


Un vector de características que se compone únicamente de valores numéricos. Esto es
similar a double[] .

Canalización
Todas las operaciones necesarias para ajustar un modelo a un conjunto de datos. Una
canalización consta de pasos de importación, transformación, caracterización y
aprendizaje de datos. Una vez que una canalización está entrenada, se convierte en un
modelo.

Precision
En clasificación, la precisión de una clase es el número de elementos con una predicción
correcta en cuando a pertenencia a esa clase dividido entre el número total de
elementos cuya predicción señalaba la pertenencia a esa clase.

Recuperación
En clasificación, la recuperación de una clase es el número de elementos con una
predicción correcta en cuando a pertenencia a esa clase dividido entre el número total
de elementos que efectivamente pertenecen a la clase.

Regularización
La regularización penaliza a un modelo lineal por ser demasiado complicado. Hay dos
tipos de regularización:

La regularización L 1 pone a cero las ponderaciones por características


insignificantes. El tamaño del modelo guardado puede ser menor después de este
tipo de regularización.
La regularización L 2 minimiza el rango de ponderación para las características
insignificantes. Este es un proceso más general y menos sensible a valores atípicos.

Regresión
Una tarea de aprendizaje automático supervisada donde el resultado es un valor real,
por ejemplo, doble. Por ejemplo, la predicción de los precios de las acciones. Para
obtener más información, vea la sección Regresión del tema Tareas de aprendizaje
automático.

Error absoluto relativo


En regresión, una métrica de evaluación que es la suma de todos los errores absolutos
dividida entre la suma de las distancias entre los valores de etiqueta correctos y el
promedio de todos los valores de etiqueta correctos.

Error cuadrático relativo


En regresión, una métrica de evaluación que es la suma de todos los errores absolutos
cuadráticos dividida entre la suma de las distancias cuadráticas existente entre los
valores de etiqueta correctos y el promedio de todos los valores de etiqueta correctos.

Raíz cuadrada del error cuadrático medio


En regresión, una métrica de evaluación que es la raíz cuadrada del promedio de los
cuadrados de los errores.
Puntuaciones
La puntuación es el proceso de aplicar nuevos datos a un modelo de Machine Learning
entrenado y generar predicciones. La puntuación también se conoce como inferencia.
Según el tipo de modelo, la puntuación puede ser un valor sin procesar, una
probabilidad o una categoría.

Aprendizaje automático supervisado


Una subclase de aprendizaje automático en la que un modelo deseado predice la
etiqueta de datos aún no vistos. Algunos ejemplos son la clasificación, la regresión y la
predicción estructurada. Para obtener más información, vea el artículo Aprendizaje
supervisado en Wikipedia.

Cursos
El proceso de identificación de un modelo para un conjunto de datos de entrenamiento
determinado. Para un modelo lineal, esto significa buscar las ponderaciones. Para un
árbol, implica la identificación de los puntos de división.

Transformer
Clase de [Link] que implementa la interfaz ITransformer.

Un transformador convierte un IDataView en otro. Un transformador se crea entrenando


un estimador o una canalización de estimadores.

Aprendizaje automático no supervisado


Una subclase de aprendizaje automático en la que un modelo deseado encuentra una
estructura oculta (o latente) en los datos. Algunos ejemplos son la agrupación en
clústeres, el modelado de temas y la reducción de la dimensionalidad. Para obtener más
información, vea el artículo Aprendizaje no supervisado en Wikipedia.
Recursos de entrenamiento de Azure
sobre el generador de modelos
Artículo • 10/05/2023

A continuación le mostramos una guía para obtener más información sobre los recursos
usados para entrenar modelos en Azure con el generador de modelos.

¿Qué es un experimento de Azure Machine


Learning?
Un experimento de Azure Machine Learning es un recurso que debe crearse antes de
ejecutar el entrenamiento del generador de modelos en Azure.

El experimento encapsula la configuración y los resultados de una o más ejecuciones de


entrenamiento de aprendizaje automático. Los experimentos pertenecen a un área de
trabajo específica. La primera vez que se crea un experimento, su nombre se registra en
el área de trabajo. Todas las ejecuciones posteriores: si se usa el mismo nombre de
experimento, se registran como parte del mismo experimento. De lo contrario, se crea
un nuevo experimento.

¿Qué es un área de trabajo de Azure Machine


Learning?
Un área de trabajo es un recurso de Azure Machine Learning que proporciona una
ubicación central para todos los artefactos y recursos de Azure Machine Learning
creados como parte de la ejecución de entrenamiento.

Para crear un área de trabajo de Azure Machine Learning, es necesario lo siguiente:

Nombre: un nombre para el área de trabajo, de entre 3 y 33 caracteres. Los


nombres solo pueden contener caracteres alfanuméricos y guiones.
Región: ubicación geográfica del centro de datos en el que se implementan el área
de trabajo y los recursos. Se recomienda que elija una ubicación cercana a donde
se encuentren usted o sus clientes.
Grupo de recursos: un contenedor que aúna todos los recursos relacionados de
una solución de Azure.
¿Qué es un proceso de Azure Machine
Learning?
Un proceso de Azure Machine Learning es una máquina virtual Linux basada en la nube
que se usa para el entrenamiento.

Para crear un proceso de Azure Machine Learning, es necesario lo siguiente:

Nombre: un nombre para el proceso, de entre 2 y 16 caracteres. Los nombres solo


pueden contener caracteres alfanuméricos y guiones.

Tamaño de proceso

El generador de modelos puede usar uno de los siguientes tipos de proceso


optimizados para GPU:

Tamaño vCPU Memoria: GiB de GPU Memoria Discos Nº


GiB almacenamiento de GPU: de máx.
temporal (SSD) GiB datos NIC
máx.

Standard_NC12 12 112 680 2 24 48 2

Standard_NC24 24 224 1440 4 48 64 4

Consulte la documentación de máquinas virtuales Linux de la serie NC para


obtener más detalles sobre los tipos de proceso optimizados para GPU.

Prioridad de proceso
Prioridad baja: adecuada para tareas con un tiempo de ejecución menor. Puede
verse afectada por interrupciones y falta de disponibilidad. Normalmente cuesta
menos, ya que aprovecha el excedente de capacidad de Azure.
Dedicada: adecuada para tareas de cualquier duración, pero especialmente
trabajos de larga ejecución. No se ve afectada por interrupciones ni falta de
disponibilidad. Normalmente cuesta más, ya que reserva un conjunto dedicado
de recursos de proceso en Azure para sus tareas.

Aprendizaje
El entrenamiento en Azure solo está disponible para el escenario de clasificación de
imágenes del generador de modelos. El algoritmo usado para entrenar estos modelos
es una red neuronal profunda basada en la arquitectura ResNet50. El proceso de
entrenamiento tarda algún tiempo, y la duración puede variar en función del tamaño del
proceso seleccionado, así como de la cantidad de datos. Puede realizar un seguimiento
del progreso de las ejecuciones seleccionando el vínculo "Supervisar la ejecución actual
en el portal de Azure" en Visual Studio.

Resultados
Una vez completado el entrenamiento, se agregan dos proyectos a la solución con los
siguientes sufijos:

ConsoleApp: aplicación de consola C# .NET Core que proporciona código de inicio


para crear la canalización de predicción y realizar predicciones.

Model: Una aplicación C# .NET Standard que contiene los modelos de datos que
definen el esquema de datos del modelo de entrada y salida, así como los
siguientes recursos:
[Link]: versión serializada del modelo en formato Open Neural
Network Exchange (ONNX). ONNX es un formato de código abierto para
modelos de IA que admite la interoperabilidad entre marcos como [Link],
PyTorch y TensorFlow.
[Link]: lista de categorías utilizadas al crear predicciones para
asignar la salida del modelo a una categoría de texto.
[Link]: versión serializada de la canalización de predicción de [Link]
que usa la versión serializada del modelo [Link] para hacer
predicciones y salidas de asignaciones mediante el archivo [Link] .

Uso del modelo de aprendizaje automático


Las clases ModelInput y ModelOutput del proyecto Model definen el esquema de entrada
y salida esperadas del modelo, respectivamente.

En un escenario de clasificación de imágenes, ModelInput contiene dos columnas:

ImageSource : ruta de acceso de la cadena de la ubicación de la imagen.

Label : categoría a la que pertenece la imagen. Label solo se usa como entrada
cuando se realiza el entrenamiento y no es necesario proporcionarlo al realizar
predicciones.

ModelOutput contiene dos columnas:

Prediction : categoría de predicción de la imagen.


Score : lista de probabilidades para todas las categorías (la mayor pertenece a

Prediction ).

Solución de problemas

No se puede crear el proceso


Si se produce un error durante la creación de un proceso de Azure Machine Learning, el
recurso de proceso puede seguir existiendo en un estado de error. Si intenta volver a
crear el recurso de proceso con el mismo nombre, se produce un error en la operación.
Para corregir este error, hay dos posibilidades:

Crear un nuevo proceso con otro nombre


Ir a Azure Portal y quitar el recurso de proceso original
Recopilación de telemetría mediante la
CLI de [Link]
Artículo • 09/05/2023

La CLI de [Link] incluye una característica de telemetría que recopila datos de uso
anónimos que se agregan para su uso por parte de Microsoft.

Cómo Microsoft usa los datos


El equipo del producto usa los datos de telemetría de la CLI de [Link] para ayudar a
entender cómo mejorar las herramientas. Por ejemplo, si los clientes usan con poca
frecuencia determinada tarea de aprendizaje de automático, el equipo del producto
investiga por qué y usa las conclusiones para dar prioridad al desarrollo de
características. La telemetría de la CLI de [Link] también ayuda con la depuración de
problemas, como bloqueos y anomalías de código.

Mientras que el equipo del producto valora esta información, también sabemos que no
todos desean enviar estos datos. Averigüe cómo deshabilitar la telemetría.

Ámbito
El comando mlnet inicia la CLI de [Link], pero el comando por sí mismo no recopila la
telemetría.

La telemetría no está habilitada cuando se ejecuta el comando mlnet sin ningún


comando asociado. Por ejemplo:

mlnet

mlnet --help

La telemetría está habilitada al ejecutar un comando de la CLI de [Link], tal como


mlnet classification .

No participar en la recopilación de datos


La característica de telemetría de la CLI de [Link] está habilitada de manera
predeterminada.
Puede desactivar la característica de telemetría si establece la variable de entorno
MLDOTNET_CLI_TELEMETRY_OPTOUT en 1 o true . Esta variable de entorno se aplica
globalmente a la herramienta CLI de [Link].

Punto de datos recopilados


La característica recopila los siguientes datos:

Qué comando se invocó, por ejemplo, classification


Nombres de parámetros de línea de comandos usados (es decir, "dataset, label-
col, output-path, train-time, verbosity")
Dirección MAC con hash: un id. único y anónimo criptográficamente (SHA256) para
una máquina
Marca de tiempo de una invocación
Dirección IP de tres octetos (no la dirección IP completa) usada solo para
determinar la ubicación geográfica
Nombre de todos los argumentos y parámetros utilizados. No los valores del
cliente, como las cadenas
Nombre de archivo del conjunto de datos con hash
Depósito de tamaño de archivo del conjunto de datos
Sistema operativo y versión
Valor de los comandos de la tarea de Machine Learning: Valores categóricos, como
regression , classification , y recommendation

Versión de la CLI de [Link] (es decir, 0.3.27703.4)

Los datos se envían de forma segura a los servidores de Microsoft con tecnología de
Azure Application Insights , se conservan bajo acceso restringido y se utilizan bajo
controles de seguridad estrictos de sistemas seguros de Azure Storage .

Punto de datos no recopilados


La característica de telemetría no recopila:

datos personales, como los nombres de usuario


nombres de archivo de conjunto de datos
datos de los archivos del conjunto de datos

Si sospecha que la telemetría de la CLI de [Link] recopila datos confidenciales o que


los datos se están tratando de forma insegura o inapropiada, informe de un problema
en los problemas del repositorio de [Link] para que lo investiguemos.
Licencia
La distribución de Microsoft de la CLI de [Link] cuenta con licencia en virtud de los
términos de licencia del software de Microsoft: biblioteca de Microsoft .NET . Para
obtener más información sobre la recolección y el procesamiento de datos, vea la
sección titulada "Datos".

Divulgación
Al ejecutar por primera vez un comando de la CLI de [Link] como mlnet
classification , la herramienta de la CLI de [Link] muestra el texto de divulgación que

indica cómo dejar de participar en la telemetría. El texto puede variar ligeramente según
la versión de la CLI que ejecute.

Vea también
Referencia de la CLI de [Link]
Términos de licencia del software de Microsoft: biblioteca de Microsoft .NET
Privacidad en Microsoft
Declaración de privacidad de Microsoft

También podría gustarte