Artículo
· 10 hr atrás Lectura de 9 min

InterSystems para dummies – Machine learning II

   

 

Anteriormente, entrenamos nuestro modelo mediante Machine Learning. Sin embargo, los datos de muestra que utilizamos se generaron directamente a partir de instrucciones de insert.

Hoy aprenderemos a cargar estos datos directamente desde un archivo.

Volcado de Datos

Antes de volcar los datos de su archivo, verifique qué nombre de encabezado tienen los campos.

En este caso, el archivo se llama “Sleep_health_and_lifestyle_dataset.csv” y se encuentra en la carpeta data/csv.

Este archivo contiene 374 registros más un encabezado (375 líneas).

El encabezado incluye los siguientes nombres y posiciones:

  1. Person ID
  2. Gender
  3. Age
  4. Occupation
  5. Sleep Duration
  6. Quality of Sleep
  7. Physical Activity Level
  8. Stress Level
  9. BMI Category
  10. Systolic
  11. Diastolic
  12. Heart Rate
  13. Daily Steps
  14. Sleep Disorder

Es esencial conocer los nombres de los encabezados de columna.

La clase St.MLL.insomnia02 tiene diferentes nombres de columnas, por lo tanto, necesitamos cargar los datos indicando el nombre de la columna en el archivo, mientras que la relación con la columna se coloca en la tabla.

LOAD DATA FROM FILE '/opt/irisbuild/data/csv/Sleep_health_and_lifestyle_dataset.csv'
INTO St_MLL.insomnia02 
(Gender,Age,Occupation,SleepDuration,QualitySleep,PhysicalActivityLevel,
StressLevel,BMICategory,Systolic,Diastolic,HeartRate,DailySteps,SleepDisorder)
VALUES ("Gender","Age","Occupation","Sleep Duration","Quality of Sleep","Physical Activity Level",
"Stress Level","BMI Category","Systolic","Diastolic","Heart Rate","Daily Steps","Sleep Disorder")
USING {"from":{"file":{"header":true}}}

 

Toda la información tiene sentido, pero… ¿Qué es la última instrucción?

{
  "from": {
    "file": {
      "header": true
    }
  }
}

Esta es una instrucción para que el comando LOAD DATA determine qué es el archivo (si tiene o no un encabezado; si el separador de columnas es otro carácter, etc.).

Puede encontrar más información sobre las opciones JSON consultando los siguientes enlaces:

LOAD DATA (SQL)

LOAD DATA jsonOptions 

Como las columnas del archivo no coinciden con las de las tablas, es necesario indicar que el documento tiene una línea con el encabezado, porque por defecto este valor es “false”.

Ahora, analizaremos nuestro modelo una vez más. Con muchos más datos disponibles, será mucho más eficiente en este punto.

TRAIN MODEL insomnia01AllModel FROM St_MLL.insomnia02
TRAIN MODEL insomnia01SleepModel FROM St_MLL.insomnia02
TRAIN MODEL insomnia01BMIModel FROM St_MLL.insomnia02

Rellene la tabla St_MLL.insomniaValidate02 con el 50% de las filas de St_MLL.insomnia02:

INSERT INTO St_MLL.insomniaValidate02(
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic)
SELECT TOP 187
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic
FROM St_MLL.insomnia02

Validar los modelos con la tabla recién validada:

INSERT INTO St_MLL.insomniaTest02(
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic)
SELECT TOP 50
Age, BMICategory, DailySteps, Diastolic, Gender, HeartRate, Occupation, PhysicalActivityLevel, QualitySleep, SleepDisorder, SleepDuration, StressLevel, Systolic
FROM St_MLL.insomnia02

Continuando con nuestro modelo anterior (una enfermera de 29 años, mujer), podemos comprobar qué predicción hará nuestra tabla de prueba.

Nota: Las siguientes consultas estarán enfocadas exclusivamente a este tipo de personas.

SELECT *, PREDICT(insomnia01AllModel) FROM St_MLL.insomnia02
WHERE age = 29 and Gender = 'Female' and Occupation = 'Nurse'

¡¡¡Sorpresa!!! El resultado es idéntico al obtenido con menos datos. Pensamos que entrenar nuestro modelo con más datos mejoraría el resultado, pero nos equivocamos.

Para variar, ejecuté la consulta de probabilidad y obtuve un resultado bastante interesante:

 

Según los datos (sexo, edad, calidad del sueño y duración del sueño), la probabilidad de tener insomnio es solo del 46,02%, mientras que la probabilidad de tener apnea del sueño es del 51,46%.

Nuestro entrenamiento de datos previo nos proporcionó los siguientes porcentajes: insomnio - 34,63% y apnea del sueño - 64,18%.

¿Qué significa? Cuantos más datos tengamos, más precisos serán los resultados.

El Tiempo es Oro

Ahora, probemos otro tipo de entrenamiento, utilizando la serie de tiempo.

Siguiendo los mismos pasos que tomamos para construir la tabla de insomnio, creé una clase llamada WeatherBase:

Class St.MLL.WeatherBase Extends %Persistent
{

/// Date and time of the weather observation in New York City
Property DatetimeNYC As %DateTime;
/// Measured temperature in degrees
Property Temperature As %Numeric(SCALE = 2);
/// Apparent ("feels like") temperature in degrees
Property ApparentTemperature As %Numeric(SCALE = 2);
/// Relative humidity (0 to 1)
Property Humidity As %Numeric(SCALE = 2);
/// Wind speed in appropriate units (e.g., km/h)
Property WindSpeed As %Numeric(SCALE = 2);
/// Wind direction in degrees
Property WindBearing As %Numeric(SCALE = 2);
/// Visibility distance in kilometers
Property Visibility As %Numeric(SCALE = 2);
/// Cloud cover fraction (0 to 1)
Property LoudCover As %Numeric(SCALE = 2);
/// Atmospheric pressure in appropriate units (e.g., hPa)
Property Pressure As %Numeric(SCALE = 2);
}

Luego, creé dos clases que extendían de WeatherBase (Weather y WeatherTest). Esto me permitió tener las mismas columnas en ambas tablas.

Hay un archivo llamado "NYC_WeatherHistory.csv" en la carpeta csv. Contiene la temperatura, la humedad, la velocidad del viento y la presión de la ciudad de Nueva York en 2015. ¡Es una gran cantidad de datos! Por eso, cargaremos el archivo en nuestra tabla usando los conocimientos sobre cómo cargar datos desde un archivo.

LOAD DATA FROM FILE '/opt/irisbuild/data/csv/NYC_WeatherHistory.csv'
INTO St_MLL.Weather 
(DatetimeNYC,Temperature,ApparentTemperature,Humidity,WindSpeed,WindBearing,Visibility,LoudCover,Pressure)
VALUES ("DatetimeNYC","Temperature","ApparentTemperature","Humidity","WindSpeed","WindBearing","Visibility","LoudCover","Pressure")
USING {"from":{"file":{"header":true}}}

📣NOTA: Los nombres de las columnas y los campos de la tabla son los mismos, por lo tanto, podemos utilizar la siguiente sentencia en su lugar.
LOAD DATA FROM FILE '/opt/irisbuild/data/csv/NYC_WeatherHistory.csv'
INTO St_MLL.Weather 
USING {"from":{"file":{"header":true}}}

Ahora crearemos nuestro modelo, pero lo haremos de una manera particular.

CREATE TIME SERIES MODEL WeatherForecast 
PREDICTING (Temperature, Humidity, WindSpeed, Pressure) 
BY (DatetimeNYC) FROM St_MLL.Weather
USING {"Forward":3}

 

Si deseamos crear una serie de predicciones, debemos tener en cuenta las siguientes recomendaciones:

  1. El campo de fecha debe ser DateTime.
  2. Intente ordenar los datos cronológicamente.
📣NOTA: Este consejo viene de Luis Angel Perez, gracias a su gran experiencia en Machine Learning.

El último comando, USING {"Forward":3}, establece los pasos de tiempo para la serie temporal.

Este parámetro tiene otros valores:

forward especifica el número de intervalos de tiempo futuros que desea prever, como un entero positivo. Las filas aproximadas aparecerán después de la última hora o fecha del conjunto de datos original. Sin embargo, puede especificar esta opción y la configuración inversa simultáneamente.

Ejemplo: USING {"Forward":3}

backward define el número de intervalos de tiempo en el pasado que desea predecir como un entero positivo. Las filas pronosticadas aparecerán antes de la fecha o hora más temprana del conjunto de datos original. Recuerde que puede indicar tanto esto como la configuración de avance al mismo tiempo. El proveedor AutoML ignora este parámetro.
Ejemplo: USING {"backward":5}

frequency determina el tamaño y la unidad de los intervalos de tiempo previstos como un entero positivo seguido de una letra que indica la unidad de tiempo. Si no se asigna este valor, se proporciona el intervalo de tiempo más común en los datos.

Ejemplo: USING {"Frequency":"d"}

Este parámetro no distingue entre mayúsculas y minúsculas.

Las abreviaturas de letras para unidades de tiempo se detallan en la siguiente tabla:

Abreviacion

Unidad de tiempo

y

Año

m

Mes

w

Semana

d

Día

h

Hora

t

Minuto

s

Segundo

Ahora… ¡a entrenar! Ya sabes el comando para eso:

TRAIN MODEL WeatherForecast

 

¡Ten paciencia! Este entrenamiento tardó 1391 segundos, lo que equivale aproximadamente a 23 minutos.

Ahora, rellena la tabla St_MLL.WeatherTest con el comando "Populate".

Do ##class(St.MLL.WeatherTest).Populate()

Incluye los primeros 5 días de enero de 2025. Una vez completado, seleccione la predicción utilizando el modelo y la tabla de prueba.

📣Recuerda: Es crucial tener al menos tres valores para poder hacer un pronóstico.
SELECT WITH PREDICTIONS (WeatherForecast) * FROM St_MLL.WeatherTest

Bueno, nos muestra el pronóstico para las próximas 3 horas del 2 de enero de 2025. Esto se debe a que definimos nuestro modelo para pronosticar 3 registros en adelante. Sin embargo, nuestro modelo de datos contiene datos para cada hora de cada día (00:00, 01:00, 02:00, etc.).

Si queremos ver la perspectiva diaria, deberíamos crear otro modelo entrenado para hacerlo día a día.

Creemos el siguiente modelo para ver el pronóstico de 5 días.

CREATE TIME SERIES MODEL WeatherForecastDaily 
PREDICTING (Temperature, Humidity, WindSpeed, Pressure) 
BY (DatetimeNYC) FROM St_MLL.Weather
USING {"Forward":5, "Frequency":"d"}

 

Ahora, repita los mismos pasos… entrenando y mostrando el pronóstico:

TRAIN MODEL WeatherForecastDaily
SELECT WITH PREDICTIONS (WeatherForecastDaily) * FROM St_MLL.WeatherTest

¡Espera! Esta vez, tengo el siguiente error:

[SQLCODE: <-400>:<Fatal error occurred>]
[%msg: <PREDICT execution error: ERROR #5002: ObjectScript error: <PYTHON EXCEPTION> *<class 'ValueError'>: forecast_length is too large for training data. What this means is you don't have enough history to support cross validation with your forecast_length. Various solutions include bringing in more data, alter min_allowed_train_percent to something smaller, and also setting a shorter forecast_length to class init for cross validation which you can then override with a longer value in .predict() This error is also often caused by errors in inputing of or preshaping the data. Check model.df_wide_numeric to make sure data was imported correctly. >]

¿Qué ha pasado?

Como indica el error, se debe a la falta de datos para hacer una predicción. Podrías pensar que necesita más datos en la tabla meteorológica y en el entrenamiento, pero tiene 8760 registros... ¿Cuál es el problema?

Si queremos pronosticar el tiempo para un gran número de días, necesitamos muchos datos en el modelo. Introducir todos los datos en una tabla requiere un tiempo de entrenamiento considerable y un ordenador muy potente. Por lo tanto, dado que este es un tutorial básico, crearemos un modelo para solo 3 días.

No olvides eliminar el modelo WeatherForecastDaily antes de seguir las instrucciones.

DROP MODEL WeatherForecastDaily

No voy a incluir todas las imágenes de esos cambios, pero sí te daré las instrucciones de qué hacer:

CREATE TIME SERIES MODEL WeatherForecastDaily 
PREDICTING (Temperature, Humidity, WindSpeed, Pressure) 
BY (DatetimeNYC) FROM St_MLL.Weather
USING {"Forward":3, "Frequency":"d"}

TRAIN MODEL WeatherForecastDaily

SELECT WITH PREDICTIONS (WeatherForecastDaily) * FROM St_MLL.WeatherTest

Nota Importante

El contenedor Docker containers.intersystems.com/intersystems/iris-community-ml:latest-em ya no está disponible, por lo que debes usar el contenedor iris-community.

Este contenedor no se inicializa con la configuración de AutoML, por lo que primero deberá ejecutarse la siguiente declaración:

pip install --index-url https://registry.intersystems.com/pypi/simple --no-cache-dir --target /usr/irissys/mgr/python intersystems-iris-automl

Si está utilizando un Dockerfile para implementar su imagen Docker, recuerde agregar el siguiente comando a las instrucciones de implementación:

ARG IMAGE=containers.intersystems.com/intersystems/iris-community:latest-em
FROM $IMAGE
USER root
WORKDIR /opt/irisbuild
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisbuild
RUN pip install --index-url https://registry.intersystems.com/pypi/simple --no-cache-dir --target /usr/irissys/mgr/python intersystems-iris-automl

Para obtener más información, visite el siguiente sitio web:

https://docs.intersystems.com/iris20251/csp/docbook/DocBook.UI.Page.cls?KEY=GIML_Configuration_Providers#GIML_Configuration_Providers_AutoML_Install 

 

Comentarios (1)1
Inicie sesión o regístrese para continuar