Machine Learning para Vertica

Anotación


En este artículo quiero compartir mi propia experiencia con el aprendizaje automático en un almacén de datos en Vertica.

Francamente, no soy un analista experto que podrá describir en detalle toda la variedad de métodos de investigación y algoritmos de predicción de datos. Pero aún así, como soy un experto en Vertica y tengo experiencia básica con ML, trataré de hablar sobre formas de trabajar con el análisis predictivo en Vertica utilizando la funcionalidad del servidor incorporado y el lenguaje R.

Biblioteca de aprendizaje automático Vertica


A partir de la versión 7, Vertica se ha ampliado con la biblioteca Machine Learning, con la que puede:

  • Prepare ejemplos de datos para el aprendizaje automático
  • entrenar modelos de aprendizaje automático sobre datos preparados;
  • Realizar análisis predictivos de datos de almacenamiento en modelos de aprendizaje automático guardados.

La biblioteca viene inmediatamente con la instalación de Vertica para todas las versiones, incluida la Comunidad gratuita. Trabajar con él se enmarca en forma de una llamada a funciones desde SQL, que se describen en detalle en la documentación con ejemplos de uso en datos de demostración preparados.

Un ejemplo de trabajo con ML en Vertica


Como un ejemplo simple de cómo funciona ML, tomé los datos de demostración de mtcars que forman parte del ejemplo de datos ML para Vertica. Estos datos incluyen dos tablas:

  • mtcars_train: datos preparados para entrenar modelos de aprendizaje automático
  • mtcars - datos para análisis

Veamos los datos para el entrenamiento:

=>SELECT * FROM mtcars_train; 



En el conjunto de datos sobre modelos de automóviles, se describen sus características. Intentemos entrenar el aprendizaje automático para que, de acuerdo con las características de los automóviles, sea posible predecir qué tipo de caja de cambios está involucrada en el automóvil: una caja manual o una caja de cambios automática. Para hacer esto, necesitaremos construir un modelo de regresión logística en los datos preparados, encontrando la dependencia del tipo de caja del campo "am" y los campos de peso del vehículo "wt", el número de cilindros "cyl" y el número de velocidades en el cuadro "gear":

 =>SELECT LOGISTIC_REG('logistic_reg_mtcars', 'mtcars_train', 'am', 'cyl, wt, gear'); Finished in 19 iterations 

La función llamada analizó la relación entre am y los campos cyl, wt, gear, reveló la fórmula de dependencia y escribió el resultado de la simulación de la dependencia en la base de datos Vertica en el modelo "logistic_reg_mtcars". Con este modelo guardado, ahora puede analizar datos sobre automóviles y predecir la disponibilidad de cajas de cambios automáticas.

Se puede ver información sobre el modelo:

 =>SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='logistic_reg_mtcars'); 



Ahora usamos el modelo en los datos para automóviles, guardando el resultado en una nueva tabla:

 =>CREATE TABLE mtcars_predict_results AS ( SELECT car_model, am, PREDICT_LOGISTIC_REG(cyl, wt, gear USING PARAMETERS model_name='logistic_reg_mtcars') AS prediction FROM mtcars ); 

Y comparando los valores reales de am con los obtenidos en la predicción predicción:

 =>SELECT * FROM mtcars_predict_results; 



En este caso, el pronóstico para el 100% coincidió con el tipo real de cuadro en los modelos presentados. En el caso de preparar nuevos datos para la capacitación, deberá eliminar y volver a guardar el modelo.

Funcionalidad ML en Vertica


La biblioteca Vertica ML admite los siguientes tipos de análisis predictivo:

  • Previsión:
    • Regresión lineal
    • Bosque aleatorio para regresión
    • SVM (Máquina de vectores de soporte) para regresión
  • Clasificación:
    • Regresión logística
    • Bayes ingenuos
    • Bosque aleatorio para clasificación
    • SVM (Máquina de vectores de soporte) para clasificación
  • Agrupamiento:
    • k-significa

Para preparar los datos para el entrenamiento, se presenta la siguiente funcionalidad:

  • Balance de datos
  • Limpieza de emisiones
  • Codificación de valores de columna categóricos (textuales)
  • Reemplazar datos faltantes
  • Normalización de datos.
  • Análisis de componentes principales
  • Muestreo de datos
  • Descomposición de valores singulares

Teniendo en cuenta la funcionalidad de ML en Vertica, podemos decir que la biblioteca incorporada nos permite resolver una amplia gama de problemas, pero no tiene el trabajo atrasado para estudiar los patrones y las dependencias en los datos. Existen funciones para preparar datos para el aprendizaje automático, pero sin visualizar la distribución de datos en forma de gráficos, solo los gurús del análisis con conocimiento experto de los datos analizados pueden "preparar" dichos datos y entrenar modelos de aprendizaje en ellos.

R Studio con Vertica


Para un análisis de datos predictivos más completo e interactivo, el lenguaje R es ideal, ya que tiene un entorno visual para trabajar con datos de R Studio. Las ventajas tangibles de usar R con Vertica serán:

  • interactividad del entorno con la capacidad de guardar el estado para un análisis posterior después de la próxima ejecución;
  • visualización visual de datos en forma de tablas y gráficos;
  • Potencia de lenguaje R para trabajar con conjuntos de datos;
  • Una variedad de algoritmos de análisis predictivo similares a los presentados en Vertica ML.

Las desventajas de trabajar con R con big data son los requisitos de RAM, la velocidad de trabajar con grandes arrays de datos y la necesidad de importar y exportar datos Vertica. Estas deficiencias están cubiertas por la capacidad de incrustar funciones R escritas para la ejecución directa en un clúster en Vertica, que se describirá a continuación.

Una pequeña introducción a R


Reproduciremos el pronóstico para cuadros automáticos en datos Vertica usando R. Para no asustar a los programadores que no están familiarizados con este lenguaje, conduciré un curso corto de un joven luchador R.

Entonces, el lenguaje R es el mismo lenguaje de procedimiento que tiene objetos, clases y funciones.
Un objeto puede ser un conjunto de datos (vector, lista, conjunto de datos ...), valor (texto, número, fecha, hora ...) o una función. Para los valores, se admiten los tipos numéricos, de cadena, booleanos y de fecha y hora. Para los conjuntos de datos, la numeración de la matriz comienza en 1, no en 0.

Clásicamente, en lugar de "=" en R, se usa el operador de asignación "<-". Aunque no está prohibido utilizar la asignación al otro lado "->" e incluso el habitual "=". El operador "=" en sí mismo se usa cuando se llaman funciones para especificar parámetros con nombre.

En lugar de "." "$" se utiliza para acceder a los campos de los conjuntos de datos. Un punto no es una palabra clave y se usa en nombres de objetos para aumentar su legibilidad. Por lo tanto, "my.data $ field" se descifrará como una matriz de registros del campo "field" del conjunto de datos "my.data".

Puede usar comillas simples o dobles para enmarcar textos.

Lo más importante: R está orientado a trabajar con conjuntos de datos. Incluso si el código dice "a <-1", asegúrese de que R dentro de sí cree que "a" es una matriz de 1 elemento. El diseño del lenguaje le permite trabajar con conjuntos de datos, como con variables ordinarias: sumar y restar, conectar y desconectar, filtrar por medidas. La forma más fácil de crear una matriz que enumere sus elementos es llamar a la función "c (elementos de matriz separados por comas)". El nombre "c" aparentemente se toma como una abreviatura corta de Collection, pero no lo diré con certeza.

Cargando datos de un DBMS en R


Para usar RDBMS a través de ODBC para R, debe instalar el paquete RODBC. Se puede instalar en R Studio en la pestaña de paquetes o usando el comando R:

 install.packages('RODBC') library('RODBC') 


Ahora podemos trabajar con Vertica. Creamos un alias ODBC para el servidor y obtenemos los datos de prueba y el conjunto de datos completo para el automóvil:

 #    Vertica con <- odbcConnect(dsn='VerticaDSN') #    mtcars_train mtcars.train <- sqlQuery(con, "SELECT * FROM public.mtcars_train") #    mtcars</b> mtcars.data <- sqlQuery(con, "SELECT * FROM public.mtcars") #   odbcClose(con) 

Al cargar datos de fuentes R para campos de tipos de texto y fecha-hora, su pertenencia a factores se establece automáticamente. El campo "am" es de tipo numérico y R se percibe como un indicador numérico, y no como un factor, que no permitirá una regresión logística. Por lo tanto, convertimos este campo a un factor numérico:

 mtcars.data$am = factor(mtcars.data$am) mtcars.train$am = factor(mtcars.train$am) 

En R Studio, es conveniente ver interactivamente los datos, construir gráficos de análisis predictivo y escribir código en R con consejos:



Construyendo un modelo en R


Construiremos un modelo de regresión logística sobre el conjunto de datos preparado para las mismas dimensiones que en Vertica:

 mtcars.model <- glm(formula = am ~ cyl + wt + gear, family = binomial(), data = mtcars.train) 

Explicación: en el lenguaje R, la fórmula de análisis predictivo se indica como:

 <  >~<   > 

Análisis de datos del modelo en R


Inicializamos el conjunto de datos resultante, tomando de mtcars todos los registros para los campos requeridos:

 mtcars.result <- data.frame(car_model = mtcars.data$car_model, am = mtcars.data$am, predict = 0) 

Ahora, basado en el modelo construido, puede realizar un análisis de los datos en sí:

 mtcars.result$predict <- predict.glm(mtcars.model, newdata = subset(mtcars.data, select = c('cyl', 'wt', 'gear')), type = 'response' ) 

El resultado del análisis se devuelve al campo de predicción como un porcentaje de la probabilidad del pronóstico. Simplifique por analogía con Vertica a valores 0 o 1, considerando el pronóstico positivo con una probabilidad de más del 50%:

 mtcars.result$predict <- ifelse(mtcars.result$predict > 0.5, 1, 0) 

Calculamos el número total de registros para los cuales el campo de predicción predicho no coincide con el valor real en am:

 nrow(mtcars[mtcars.result$am != mtcars.result$predict, ]) 

R devolvió cero. Por lo tanto, el pronóstico convergió en todos los modelos de automóviles, como en el ML de Vertica.

Tenga en cuenta: el filtro devolvió los registros de mtcars (el primer parámetro entre corchetes) con todas las columnas (el segundo parámetro se omitió después de la coma entre corchetes).

Guardar y cargar datos localmente en R


Al salir de R, el estudio sugiere guardar el estado de todos los objetos para continuar trabajando después de un reinicio. Si por alguna razón necesita guardar y luego restaurar el estado de objetos individuales, para esto se proporcionan funciones especiales en R:

 #      save(mtcars.model, file = 'mtcars.model') #      load('mtcars.model') 

Guardar datos de R a Vertica


Si R Studio se usó para preparar datos para entrenar modelos ML Vertica, o si el análisis se realizó directamente en él, que luego se usará en la base de datos Vertica, los conjuntos de datos R se pueden escribir en la tabla Vertica.

Dado que la biblioteca ODBC para R está diseñada para RDTPMS OLTP, no puede generar correctamente consultas de creación de tablas para Vertica. Por lo tanto, para registrar datos con éxito, deberá crear manualmente la tabla necesaria en Vertica utilizando SQL, cuyo conjunto de campos y tipos coincide con el conjunto de datos grabables R.

Además, el proceso de grabación en sí parece simple (no olvide abrir y luego cerrar la conexión):

 sqlSave(con, mtcars.result, tablename = 'public.mtcars_result', append = TRUE, rownames = FALSE, colnames = FALSE) 

Usando Vertica con R


El trabajo interactivo con datos en R Studio es adecuado para el modo de investigación y preparación de datos. Pero es completamente inadecuado para el análisis de flujos de datos y grandes matrices en modo automático. Una de las opciones para el esquema de análisis predictivo híbrido R con Vertica es la preparación de datos para aprender sobre R e identificar dependencias para construir modelos. Luego, utilizando las funciones ML integradas en Vertica, los modelos de pronóstico para los datos preparados en R se entrenan teniendo en cuenta las dependencias identificadas de las variables.

Hay una opción más flexible cuando toda la potencia del lenguaje R se usa directamente desde debajo de Vertica. Para esto, Vertica desarrolló la distribución R en forma de una biblioteca de complementos que le permite utilizar funciones de transformación escritas directamente en el lenguaje R en consultas SQL. La documentación describe en detalle la instalación del soporte R para Vertica y los paquetes R adicionales necesarios para la operación, si los hay.

Guardar el modelo R en Vertica


Para utilizar el modelo de análisis preparado previamente por R Studio en las funciones de R que se ejecutan en Vertica, debe guardarlas en los servidores de Vertica. Guardar localmente en cada servidor del clúster con un archivo no es conveniente ni confiable, se pueden agregar nuevos servidores al clúster y, al cambiar el modelo, deberá recordar volver a escribir todos los archivos nuevamente.

La forma más conveniente es serializar el modelo R en texto y guardar la función Vertica como UDF, que devolverá este texto como una constante (no olvide abrir y luego cerrar la conexión):

 #     mtcars.model.text <- rawToChar( serialize(mtcars.model, connection = NULL, ascii = TRUE)) #       Vertica # (     ) mtcars.func <- paste0( "CREATE OR REPLACE FUNCTION public.MtCarsAnalizeModel() RETURN varchar(65000) AS BEGIN RETURN '", gsub("'", "''", mtcars.model.text), "'; END; GRANT EXECUTE ON FUNCTION public.MtCarsAnalizeModel() TO public;" ) #    Vertica sqlQuery(con, mtcars.func) 

El método propuesto permite eludir la restricción de Vertica en los parámetros transmitidos en la función de transformación, donde solo se requiere la transferencia de constantes o expresiones de constantes. Vertica UDF SQL compila no como funciones, sino como expresiones calculadas, es decir, al pasar un parámetro, en lugar de llamar a la función, se transferirá su texto (en este caso una constante), que se guardó en el código anterior.

Si cambia el modelo, deberá recrear su función en Vertica. Tiene sentido envolver este código en una función universal que genera una función en Vertica con el nombre especificado del modelo pasado.

Funciones R para Vertica


Para conectar las funciones R a Vertica, debe escribir funciones de análisis y registro de datos en Vertica.

La función de trabajar con datos desde la propia Vertica debe tener dos parámetros: el conjunto de datos resultante (como data.frame) y los parámetros de trabajo (como la lista):

 MtCarsAnalize <- function(data, parameters) { if ( is.null(parameters[['model']]) ) { stop("NULL value for model! Model cannot be NULL.") } else { model <- unserialize(charToRaw(parameters[['model']])) } names(data) <- c('car_model', 'cyl', 'wt', 'gear') result <- data.frame(car_model = data$car_model, predict = 0) result$predict <- predict.glm(model, newdata = subset(data, select = c('cyl', 'wt', 'gear')), type = 'response' ) result$predict <- ifelse(result$predict > 0.5, TRUE, FALSE) return(result) } 

En el cuerpo de la función, se verifica que se pasa el parámetro del modelo, cuyo texto se traduce en forma binaria y se deserializa en el objeto del modelo de análisis. Como Vertica transfiere sus propios nombres de campo al conjunto de datos para la función, los nombres de campo explícitos se establecen en el conjunto de datos. En base a los datos obtenidos, se construye un conjunto de resultados con el nombre del modelo de máquina y cero predicción. A continuación, se construye un pronóstico utilizando solo los campos necesarios para el análisis del conjunto de datos obtenido. El campo de predicción del conjunto de resultados se establece en valores booleanos (para un cambio en lugar de valores numéricos) y el resultado se devuelve desde la función.

Ahora queda por describir el registro de esta función en Vertica:

 MtCarsAnalizeFactory <- function() { list(name = MtCarsAnalize, udxtype = c("transform"), intype = c("varchar", "int", "float", "int"), outtype = c("varchar", "boolean"), outnames = c("car_model", "predict"), parametertypecallback=MtCarsAnalizeParameters) } MtCarsAnalizeParameters <- function() { parameters <- list(datatype = c("varchar"), length = 65000, scale = c("NA"), name = c("model")) return(parameters) } 

La función MtCarsAnalizeFactory describe el nombre de la función utilizada para la operación, el campo para el conjunto de datos entrantes y salientes, y la segunda función describe el parámetro "modelo" pasado. Los tipos de campo son tipos de datos Vertica. Al transmitir y devolver datos, Vertica convierte automáticamente los valores a los tipos de datos necesarios para el lenguaje R. Puede ver la tabla de compatibilidad de tipos en la documentación de Vertica.

Puede probar el funcionamiento de la función escrita para Vertica en los datos cargados en R studio:

 test.data = subset(mtcars.data, select = c('car_model', 'cyl', 'wt', 'gear')) test.params = list(model = mtcars.model.text) test.result = MtCarsAnalize(test.data, test.params) 

Conecte la biblioteca de características a Vertica


Guardamos todas las funciones anteriores en un archivo "mtcars_func.r" y lo subimos a uno de los servidores desde el clúster Vertica en "/ home / dbadmin".

Un punto importante: en R Studio, debe configurar la opción para guardar la traducción de líneas en archivos en modo Posix (LF). Esto se puede hacer en las opciones globales, sección Código, pestaña Guardar. Si está trabajando en Windows, de manera predeterminada, el archivo se guardará con un retorno de carro y no podrá cargarse en Vertica.

Nos conectamos al servidor desde el clúster Vertica, en el que guardamos el archivo y cargamos la biblioteca:

 CREATE LIBRARY MtCarsLibs AS '/home/dbadmin/mtcars_func.r' LANGUAGE 'R'; 

Ahora desde esta biblioteca puedes registrar la función R:

 CREATE TRANSFORM FUNCTION public.MtCarsAnalize AS LANGUAGE 'R' NAME 'MtCarsAnalizeFactory' LIBRARY MtCarsLibs; GRANT EXECUTE ON TRANSFORM FUNCTION public.MtCarsAnalize(varchar, int, float, int) TO public; 

Funciones de llamada R en Vertica


Llamamos a la función R, pasándole el texto del modelo, que se guardó previamente como una función UDF:

 SELECT MtCarsAnalize(car_model, cyl, wt, gear USING PARAMETERS model = public.MtCarsAnalizeModel()) OVER() FROM public.mtcars; 



Se puede verificar que, al igual que en los casos anteriores, el pronóstico es 100% consistente con el estado real de las cosas:

 SELECT c.*, p.predict, p.predict = c.am::int AS valid FROM public.mtcars c INNER JOIN ( SELECT MtCarsAnalize(car_model, cyl, wt, gear USING PARAMETERS model = public.MtCarsAnalizeModel()) OVER() FROM public.mtcars ) p ON c.car_model = p.car_model 

Tenga en cuenta que las funciones de transformación en Vertica devuelven su propio conjunto de datos de los campos y registros definidos dentro de las funciones, sin embargo, pueden usarse en consultas si se envuelven en una subconsulta.

Cuando las funciones R están conectadas, Vertica copia el código fuente a su instalación, que compila en código máquina. El archivo R de origen cargado en el servidor después de conectarse a la biblioteca no es necesario para seguir trabajando. La velocidad de las funciones, teniendo en cuenta la compilación binaria, es lo suficientemente alta como para trabajar con grandes conjuntos de datos, sin embargo, vale la pena recordar que todas las operaciones R se llevan a cabo en la memoria y existe el riesgo de intercambio si falta memoria del sistema operativo para satisfacer las necesidades de colaboración de Vertica y R .

Si se llama a la función en la partición de los datos especificados en PARTITION BY para OVER, Vertica paraleliza la ejecución de cada partición en los servidores del clúster. Por lo tanto, si un fabricante aún estuviera presente en el conjunto de datos además del modelo de máquina, puede especificarlo en PARTICIÓN POR y paralelizar el análisis para cada fabricante.

Otras oportunidades de aprendizaje automático de Vertica


Además de R, Vertica puede desarrollar sus propias funciones de transformación en C, Java y Python. Cada idioma tiene sus propios matices y características de escritura y conexión con Vertica. Junto con su propio ML, todo esto le da a Vertica una buena reserva para el análisis predictivo de datos.

Gracias y enlaces


Quiero agradecer sinceramente a mi amigo y colega Vlad Malofeev de Perm, quien me presentó a R y me ayudó a resolverlo en uno de nuestros proyectos conjuntos.

Inicialmente, en un proyecto donde se realizó un pronóstico sobre condiciones difíciles para el futuro utilizando datos del año pasado, los desarrolladores intentaron utilizar SQL y Java. Esto causó grandes dificultades teniendo en cuenta la calidad de estas fuentes y ralentizó en gran medida el desarrollo del proyecto. Vlad llegó al proyecto con R, conectamos R con Vertica, condujo los datos al estudio y todo giró y giró maravillosamente de inmediato. Literalmente en semanas, todo lo que duró meses fue rastrillado, salvando el proyecto del código complejo.

Los datos de ejemplo con automóviles se pueden descargar desde el repositorio de GIT:

 git clone https://github.com/vertica/Machine-Learning-Examples 

y subir a Vertica:

 /opt/vertica/bin/vsql -d <name of your database> -f load_ml_data.sql 

Si desea profundizar en ML y aprender a trabajar con R, le recomiendo un libro en ruso "R en acción". Análisis y visualización de datos en el lenguaje R " . Está escrito en un lenguaje humano simple y accesible y es adecuado para principiantes que no se han encontrado con el aprendizaje automático.

Aquí puede ver información sobre cómo conectar la biblioteca R a Vertica.

Para aquellos que ya han comenzado a aprender y usar ML en Python, vale la pena prestar atención al IDE Rodeo, este es un análogo de R Studio, porque sin un análisis de calidad interactivo es imposible. Creo que todo lo descrito en este artículo bajo R de una manera similar se puede desarrollar en Python, incluido guardar el modelo en funciones UDF y desarrollar funciones de análisis para Vertica. Si marca, no olvide darse de baja de los resultados en los comentarios, le agradeceré la información.

Gracias por su tiempo y espero haber podido demostrar la simplicidad y las increíbles capacidades de la simbiosis de R y Vertica.

Source: https://habr.com/ru/post/es436306/


All Articles