Pregunta
· 7 jul, 2024

Cómo entrenar "realmente" un modelo de aprendizaje automático

Hola a todos,

Hace unos días vi a un youtuber hablando de cómo crear una red neuronal (en español)

https://www.youtube.com/embed/iX_on3VxZzk
[Este es un enlace integrado, pero no puede ver el contenido integrado directamente en el sitio porque rechazó las cookies que se necesitan para acceder a él. Para ver el contenido integrado, debe aceptar todas las cookies desde la Configuración de cookies]

En resumen, utiliza la red neuronal para aprender a convertir grados Celsius a grados Fahrenheit.
Grados Fahrenheit= (Grados  Celsius × 9/5) +32

En este vídeo utiliza Python para crear la red neuronal, donde crea una tabla con los valores de grados Celsius y grados Fahrenheit.
Luego hace 1000 entrenamientos al modelo que ha creado, cuando consulta la predicción a un valor que no está en la tabla que ha utilizado para entrenar, le da un valor correcto (o bastante cercano).

Bueno, quería hacer el mismo ejemplo usando IRIS e Intersystems IntegratedML, así que creé una tabla con los dos valores y siguiendo las instrucciones de "Introducción al aprendizaje automático"

Class St.MLL.celsiusFahrenheit Extends %Persistent
{

/// Value of Celsius
Property Celsius As %Decimal;
/// Value of Fahrenheit
Property Fahrenheit As %Decimal;
/// Populate table
ClassMethod Populate() As %Status
{
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(-40,-40))
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(-10,14))
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(0,32))
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(8,46))
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(15,59))
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(22,72))
    &sql(INSERT INTO St_MLL.celsiusFahrenheit VALUES(38,100))
    Return $$$OK
}

ClassMethod Training() As %Status
{
    write "Creating model celsiusFahrenheitModel",!
    &sql(CREATE MODEL celsiusFahrenheitModel PREDICTING (Fahrenheit) FROM St_MLL.celsiusFahrenheit)
    write "Training model",!
    for i=1:1:100
    {
        &sql(TRAIN MODEL celsiusFahrenheitModel As FirstModel)
        write "Step "_i_" of 100",!
    }
    write "Validate model celsiusFahrenheitModel",!
    &sql(VALIDATE MODEL celsiusFahrenheitModel FROM St_MLL.celsiusFahrenheit)
}

}

Hice lo mismo, entrenando el modelo 100 veces.

He creado otra tabla con los valores para probar el modelo.

Class St.MLL.celsiusTest Extends %Persistent
{

/// Value of Celsius
Property Celsius As %Decimal;
/// Value of Fahrenheit
Property Fahrenheit As %Decimal;
/// Populate table
ClassMethod Populate() As %Status
{
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(10,0))
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(20,0))
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(30,0))
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(40,0))
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(50,0))
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(60,0))
    &sql(INSERT INTO St_MLL.celsiusTest VALUES(70,0))
    Return $$$OK
}
}

Pero no parece funcionar porque siempre devuelve el mismo valor de predicción.

USER > do ##class(St.MLL.celsiusFahrenheit).Populate()
USER > do ##class(St.MLL.celsiusFahrenheit).Training()
Creating model celsiusFahrenheitModel
Training model
Step 1 of 100
Step 2 of 100
Step 3 of 100
Step 4 of 100
......
Step 99 of 100
Step 100 of 100
Validate model celsiusFahrenheitModel
USER > do ##class(St.MLL.celsiusTest).Populate()
USER >

Estaba esperando:

Celisu Fahrenheit prediction
10 0 50
20 0 68
30 0 86
40 0 104
50 0 122
60 0 140
70 0 158

Creí que, una vez entrenado el modelo, podría predecir qué valor le corresponde, porque no sabemos cuál es el valor en Fahrenheit.
¿Qué se está haciendo mal? ¿Estoy intentando hacer algo que no es posible? Es decir, que mi modelo aprenda cuál es el patrón y yo solo tengo que preguntar el valor de la predicción de mi modelo según el valor de los grados centígrados.

Muchas gracias

Product version: IRIS 2023.3
$ZV: IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2023.3 (Build 254U) Wed Nov 8 2023 13:03:30 EST
Comentarios (2)1
Inicie sesión o regístrese para continuar

Añado la respuesta que me han dado en el community en inglés:

Hola Kurro!

Gracias por tu artículo y por probar IntegratedML. Con suerte, le indicaremos la dirección correcta:

1. IntegratedML no es "solo redes neuronales", sino más bien una canalización de autoML (consulte la Guía de AutoML) que primero prueba varios métodos de ML en un subconjunto de datos y luego realiza una ejecución de entrenamiento utilizando los datos completos utilizando el método de ML (redes neuronales). , regresión logística, bosques aleatorios, etc.) que obtuvieron mejores resultados en el subconjunto de datos. De hecho, de forma predeterminada, para problemas de regresión como este, solo usamos XGBRegressor, por lo que en este caso el método que utiliza IntegratedML no es una red neuronal en absoluto.

2. Solo es necesario llamar al "TRAIN MODEL" una vez por conjunto de datos de entrenamiento. El bucle sobre los ejemplos se maneja dentro de esa llamada.

3. Este es potencialmente un conjunto de datos demasiado pequeño para producir resultados confiables. IntegratedML divide los datos internamente en subconjuntos de entrenamiento y prueba, por lo que probablemente obtendrá mejores resultados si tiene al menos 100 ejemplos aleatorios.

Atentamente,

tomás