Creación de canalizaciones de aprendizaje automático con Snowflake y Dask
En esta publicación, quiero compartir algunas de las herramientas que he estado explorando recientemente y mostrarles cómo las uso y cómo ayudaron a mejorar la eficiencia de mi flujo de trabajo. Los dos de los que hablaré en particular son Snowflake y Dask. Dos herramientas muy diferentes pero que se complementan bien entre sí, especialmente como parte del ciclo de vida de ML.
By daniel foley, Científico de datos
Introducción
Recientemente, he estado tratando de encontrar mejores formas de mejorar mi flujo de trabajo como científico de datos. Tiendo a pasar una buena parte de mi tiempo modelando y construyendo ETL en mi trabajo. Esto ha significado que cada vez más necesito confiar en herramientas para manejar grandes conjuntos de datos de manera confiable y eficiente. Rápidamente me di cuenta de que usar pandas para manipular estos conjuntos de datos no siempre es un buen enfoque y esto me llevó a buscar otras alternativas.
En esta publicación, quiero compartir algunas de las herramientas que he estado explorando recientemente y mostrarles cómo las uso y cómo ayudaron a mejorar la eficiencia de mi flujo de trabajo. Los dos de los que hablaré en particular son Snowflake y Dask. Dos herramientas muy diferentes pero que se complementan bien entre sí, especialmente como parte del ciclo de vida de ML. Espero que después de leer esta publicación, comprenda bien qué son Snowflake y Dask, cómo se pueden usar de manera efectiva y pueda comenzar a trabajar con sus propios casos de uso.
Más específicamente, quiero mostrarte cómo puedes construir una canalización ETL usando Snowflake y Python para generar datos de entrenamiento para una tarea de aprendizaje automático. Luego quiero presentar a Dask y Nube de Saturno y mostrarle cómo puede aprovechar el procesamiento paralelo en la nube para acelerar realmente el proceso de capacitación de ML para que pueda aumentar su productividad como científico de datos.
Construyendo ETL en Snowflake y Python
Antes de pasar a la codificación, será mejor que explique brevemente qué es Snowflake. Esta es una pregunta que hice recientemente cuando mi equipo decidió comenzar a usarlo. A alto nivel, es un almacén de datos en la nube. Después de jugar con él por un tiempo, me di cuenta de lo poderoso que era. Creo que para mí, una de las características más útiles son los almacenes virtuales que puede utilizar. Un almacén virtual le brinda acceso a los mismos datos, pero es completamente independiente de otros almacenes virtuales, por lo que los recursos informáticos no se comparten entre los equipos. Esto ha demostrado ser muy útil, ya que elimina cualquier potencial problema de rendimiento causado por otros usuarios que ejecutan consultas a lo largo del día. Esto ha resultado en menos frustración y pérdida de tiempo esperando que se ejecuten las consultas.
Dado que vamos a utilizar Snowflake, describiré brevemente cómo puede configurarlo y comenzar a experimentar con él usted mismo. Necesitamos hacer lo siguiente:
- Obtenga una cuenta de Snowflake configurada
- Pon nuestros datos en Snowflake
- Escriba y pruebe nuestras consultas utilizando SQL y la interfaz de usuario de Snowflake
- Escriba una clase de Python que pueda ejecutar nuestras consultas para generar nuestro conjunto de datos final para modelar
Configurar una cuenta es tan fácil como registrarse para una prueba gratuita en su página web del NDN Collective . Una vez que lo haya hecho, puede descargar la CLI de snowsql esta página. Esto facilitará la adición de datos a Snowflake. Después de seguir estos pasos, podemos intentar conectarnos a Snowflake usando nuestras credenciales y la línea de comando.
snowsql -a <account_name> -u <user_name>
Puede encontrar el nombre de su cuenta en la URL cuando inicie sesión en la interfaz de usuario de Snowflake. Debería verse así: xxxxx.europe-west2.gcp. Bien, pasemos al siguiente paso y llevemos nuestros datos a Snowflake. Hay algunos pasos que debemos seguir aquí, a saber:
- Crea nuestro almacén virtual
- Crea una base de datos
- Definir y crear nuestras tablas
- Cree una tabla de preparación para nuestros archivos CSV
- Copiando los datos en nuestras tablas
Afortunadamente, esto no es demasiado difícil y podemos hacerlo completamente usando la CLI de snowsql. Para este proyecto, usaré un conjunto de datos más pequeño de lo que me gustaría, pero desafortunadamente, no puedo usar ninguno de los datos de mi empresa y puede ser bastante difícil encontrar grandes conjuntos de datos adecuados en línea. Sin embargo, encontré algunos datos de transacciones de Dunnhumby que están disponibles gratuitamente en Kaggle. Aunque solo por diversión, creo un conjunto de datos sintéticos mucho más grande usando estos datos para probar qué tan bien Dask maneja el desafío en comparación con sklearn.
En primer lugar, necesitamos configurar un almacén virtual y una base de datos utilizando los siguientes comandos en la interfaz de usuario de Snowflake.
Para crear or reemplazar almacén analytics_wh
warehouse_size = "X-SMALL"
auto_suspend = 180
auto_resume = verdadero
inicialmente_suspendido = verdadero;
Para crear or reemplazar base de datos dunhumby;
Nuestros datos constan de 6 CSV que convertiremos en 6 tablas. No dedicaré demasiado tiempo a revisar el conjunto de datos, ya que esta publicación trata más sobre el uso de Snowflake y Dask en lugar de interpretar los datos.
A continuación se muestran los comandos que podemos usar para crear nuestras tablas. Todo lo que necesita saber de antemano es con qué columnas y tipos de datos trabajará.
create or replace table campaign_desc ( description string, campaign number,
start_day number,
end_day number ); create or replace table campaign_table ( description string, Household_key number, campaign number ); create or replace table coupon ( COUPON_UPC number, product_id number, campaign number ); create or replace table coupon_redempt ( household_key number, day number, coupon_upc number, campaign number ); create or replace table transactions ( household_key number, BASKET_ID number, day number, product_id number, quantity number, sales_value number, store_id number, retail_disc decimal, trans_time number, week_no number, coupon_disc decimal, coupon_match_disc decimal ); create or replace table demographic_data ( age_dec string, marital_status_code string, income_desc string, homeowner_desc string, hh_comp_desc string, household_size_desc string, kid_category_desc string, Household_key number);
Ahora que hemos creado nuestras tablas, podemos empezar a pensar en cómo introducir datos en ellas. Para ello, necesitaremos preparar nuestros archivos CSV. Este es básicamente un paso intermedio para que Snowflake pueda cargar directamente los archivos de nuestro escenario en nuestras tablas. Podemos usar el PUT comando para poner archivos locales en nuestro escenario y luego el COPIAR EN comando para indicarle a Snowflake dónde colocar estos datos.
use database dunnhumby; create or replace stage dunnhumby_stage; PUT file://campaigns_table.csv @dunnhumby.public.dunnhumby_stage; PUT file://campaigns_desc.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon_d=redempt.csv @dunnhumby.public.dunnhumby_stage; PUT file://transaction_data.csv @dunnhumby.public.dunnhumby_stage; PUT file://demographics.csv @dunnhumby.public.dunnhumby_stage;
Como comprobación rápida, puede ejecutar este comando para comprobar qué hay en el área de preparación.
ls @dunnhumby.public.dunnhumby_stage;
Ahora solo necesitamos copiar los datos en nuestras tablas usando las consultas a continuación. Puede ejecutarlos en la interfaz de usuario de Snowflake o en la línea de comandos después de iniciar sesión en Snowflake.
copy into campaign_table from @dunnhumby.public.dunnhumby_stage/campaigns_table.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into campaign_desc from @dunnhumby.public.dunnhumby_stage/campaign_desc.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon from @dunnhumby.public.dunnhumby_stage/coupon.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon_redempt from @dunnhumby.public.dunnhumby_stage/coupon_redempt.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into transactions from @dunnhumby.public.dunnhumby_stage/transaction_data.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into demographic_data from @dunnhumby.public.dunnhumby_stage/demographics.csv.gz file_format = ( type = csv skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’);
Muy bien, con un poco de suerte tenemos nuestros datos en nuestras tablas en primer lugar. Oh, si solo fuera así de simple, todo este proceso me tomó algunos intentos para hacerlo bien (cuidado con la ortografía incorrecta). Con suerte, puedes seguir esto y estar listo para comenzar. Nos estamos acercando a las cosas interesantes, pero los pasos anteriores son una parte vital del proceso, así que asegúrese de comprender cada uno de estos pasos.
Escribiendo nuestro Pipeline en SQL
En este siguiente paso, escribiremos las consultas para generar nuestro objetivo, nuestras características y, finalmente, produciremos un conjunto de datos de entrenamiento. Un enfoque para crear un conjunto de datos para modelar es leer estos datos en la memoria y usar pandas para crear nuevas funciones y unir todos los marcos de datos. Este suele ser el enfoque que ve en Kaggle y en otros tutoriales en línea. El problema con esto es que no es muy eficiente, especialmente cuando se trabaja con conjuntos de datos de tamaño razonable. Por esta razón, es una idea mucho mejor subcontratar el trabajo pesado a algo como Snowflake, que maneja conjuntos de datos masivos extremadamente bien y probablemente le ahorrará una gran cantidad de tiempo. No dedicaré mucho tiempo a profundizar en los detalles de nuestro conjunto de datos aquí, ya que no es realmente vital para lo que estoy tratando de mostrar. Sin embargo, en general, querrá dedicar una cantidad considerable de tiempo a explorar y comprender sus datos antes de comenzar a modelar. El objetivo de estas consultas será preprocesar los datos y crear algunas características simples que luego podamos usar en nuestros modelos.
Definición de destino
Obviamente, un componente vital del aprendizaje automático supervisado es definir un objetivo apropiado para predecir. Para nuestro caso de uso, predeciremos el abandono calculando si un usuario realiza otra visita dentro de las dos semanas posteriores a una semana de corte. La elección de 2 semanas es bastante arbitraria y dependerá del problema específico que estemos tratando de resolver, pero supongamos que está bien para este proyecto. En general, querrá analizar cuidadosamente a sus clientes para comprender la distribución de los intervalos entre visitas para llegar a una definición adecuada de abandono.
La idea principal aquí es que para cada tabla queremos tener una fila por clave_familiar que contenga valores para cada una de nuestras características.
Características de la campaña
Funciones de transacción
A continuación, creamos algunas métricas simples basadas en estadísticas agregadas, como el promedio, el máximo y la desviación estándar.
Características demográficas
Este conjunto de datos tiene muchos datos faltantes, así que decidí usar la imputación aquí. Existen muchas técnicas para los datos faltantes, desde eliminar los datos faltantes hasta métodos avanzados de imputación. Acabo de hacerme la vida más fácil aquí y reemplacé los valores faltantes con el modo. No recomendaría necesariamente tomar este enfoque en general, ya que comprender por qué faltan estos datos es realmente importante para decidir cómo tratarlos, pero para los propósitos de este ejemplo, seguiré adelante y tomaré el enfoque fácil. Primero calculamos el modo para cada una de nuestras características y luego usamos coalesce para reemplazar cada fila con el modo si faltan datos.
Datos de muestra
Finalmente, construimos una consulta para nuestros datos de entrenamiento uniendo nuestras tablas principales y terminamos con una tabla que contiene nuestro objetivo, nuestra campaña, transacciones y características demográficas que podemos usar para construir un modelo.
Como un breve aparte, para aquellos interesados en aprender más sobre las características y matices de Snowflake, recomendaría el siguiente libro: Libro de cocina de copo de nieve. Comencé a leer este libro y está lleno de información realmente útil sobre cómo usar Snowflake y entra en muchos más detalles que aquí.
Código Python para ETL
La pieza final que necesitamos para este ETL es escribir un script para ejecutarlo. Ahora, esto solo es realmente necesario si planea ejecutar un ETL como este con regularidad, pero esta es una buena práctica y hace que sea mucho más fácil ejecutar el ETL cuando sea necesario.
Analicemos brevemente los componentes principales de nuestra clase EtlTraining. Nuestra clase toma una entrada que es la semana de corte. Esto se debe a la forma en que se definen los datos en nuestro conjunto de datos, pero normalmente, esto estaría en un formato de fecha que corresponde a la fecha de corte que queremos elegir para generar datos de entrenamiento.
Inicializamos una lista de nuestras consultas para que podamos recorrerlas fácilmente y ejecutarlas. También creamos un diccionario que contiene nuestros parámetros que pasamos a nuestra conexión Snowflake. Aquí usamos variables de entorno que configuramos en Saturn Cloud. Aquí es una guía sobre cómo hacer esto. No es demasiado difícil conectarse a Snowflake, todo lo que tenemos que hacer es usar el conector Snowflake y pasar nuestro diccionario de credenciales. Implementamos esto en el método de conexión Snowflake y devolvemos esta conexión como un atributo.
Para que estas consultas sean un poco más fáciles de ejecutar, guardo cada consulta como una variable de cadena de Python en el archivo ml_query_pipeline.py. El método execute_etl hace exactamente lo que dice en la lata. Recorrimos cada consulta, la formateamos, la ejecutamos y terminamos cerrando la conexión Snowflake.
Para ejecutar este ETL, simplemente podemos escribir los siguientes comandos en la terminal. (donde ml_pipeline es el nombre del script anterior).
python -m ml_pipeline -w 102 -j ‘train’
Como un breve aparte, probablemente querrá ejecutar un ETL como este a intervalos regulares. Por ejemplo, si desea hacer predicciones diarias, deberá generar un conjunto de datos como este todos los días para pasarlo a su modelo, de modo que pueda identificar cuáles de sus clientes es probable que abandonen. No entraré en esto en detalle aquí, pero en mi trabajo, usamos Airflow para orquestar nuestros ETL, por lo que recomendaría revisarlo si está interesado. De hecho, recientemente compré un libro 'Canalizaciones de datos con Apache Airflow', lo cual creo que es genial y realmente ofrece algunos ejemplos sólidos y consejos sobre cómo usar el flujo de aire.
Dask y modelado
Ahora que tenemos nuestra canalización de datos construida, podemos comenzar a pensar en el modelado. El otro objetivo principal que tengo para esta publicación es resaltar las ventajas de usar Dask como parte del proceso de desarrollo de ML y mostrarles lo fácil que es usarlo.
Para esta parte del proyecto, también utilicé Nube de Saturno que es una herramienta realmente agradable que encontré recientemente que nos permite aprovechar el poder de Dask en un grupo de computadoras en la nube. Las principales ventajas de usar Saturn para mí son que es realmente fácil compartir su trabajo, súper simple escalar su computación cuando lo necesite y tiene una opción de nivel gratuito. El desarrollo de modelos en general es un caso de uso realmente bueno para Dask, ya que normalmente queremos entrenar un montón de modelos diferentes y ver qué funciona mejor. Cuanto más rápido podamos hacer esto, mejor, ya que tenemos más tiempo para centrarnos en otros aspectos importantes del desarrollo del modelo. Similar a Snowflake, solo necesitas registrarte esta página y puede crear rápidamente una instancia de Jupyter lab y comenzar a experimentar con ella usted mismo.
Ahora, me doy cuenta de que en este punto he mencionado a Dask varias veces pero nunca he explicado realmente qué es. Permítanme tomarme un momento para brindarles una descripción general de muy alto nivel de Dask y por qué creo que es increíble. De manera muy simple, Dask es una biblioteca de Python que aprovecha la computación paralela para permitirle procesar y realizar operaciones en conjuntos de datos muy grandes. Y, la mejor parte es que, si ya está familiarizado con Python, Dask debería ser muy sencillo ya que la sintaxis es muy similar.
El siguiente gráfico destaca los componentes principales de Dask.
Fuente: Documentación de Dask
Las colecciones nos permiten crear un gráfico de tareas que luego se pueden ejecutar en múltiples computadoras. Algunas de estas estructuras de datos probablemente suenen bastante familiares, como las matrices y los marcos de datos, y son similares a las que encontraría en Python, pero con algunas diferencias importantes. Por ejemplo, puede pensar en un marco de datos Dask como un grupo de marcos de datos pandas construidos de tal manera que nos permite realizar operaciones en paralelo.
Pasando de las colecciones tenemos el planificador. Una vez que creamos el gráfico de tareas, el programador se encarga del resto por nosotros. Administra el flujo de trabajo y envía estas tareas a una sola máquina o las distribuye en un clúster. Con suerte, eso le brinda una descripción general muy breve de cómo funciona Dask. Para obtener más información, le sugiero que consulte el documentación o esta primer libro. Ambos son muy buenos recursos para profundizar en este tema.
Código Python para modelado
Al modelar, tiendo a tener una pequeña cantidad de algoritmos de referencia que siempre probaré primero. Por lo general, esto me dará una buena idea de lo que podría ser adecuado para el problema específico que tengo. Estos modelos son Regresión logística, Bosque aleatorio y GradientBoosting. En mi experiencia, cuando se trabaja con datos tabulares, estos algoritmos suelen dar muy buenos resultados. A continuación, construimos una canalización de modelado de sklearn utilizando estos 3 modelos. Los modelos exactos que usamos aquí no son realmente importantes, ya que la canalización debería funcionar para cualquier modelo de clasificación de sklearn, esta es solo mi preferencia.
Sin más preámbulos, profundicemos en el código. Afortunadamente, subcontratamos la mayor parte de nuestro preprocesamiento a Snowflake para no tener que perder mucho tiempo con nuestros datos de entrenamiento aquí, pero agregaremos algunos pasos adicionales usando sklearn pipelines.
El primer fragmento de código a continuación muestra la canalización cuando se usa sklearn. Tenga en cuenta que nuestro conjunto de datos es un marco de datos de pandas antiguo simple y todos nuestros pasos de preprocesamiento se llevan a cabo utilizando métodos sklearn. No hay nada particularmente fuera de lo común aquí. Estamos leyendo nuestros datos de la tabla producida por nuestro ETL Snowflake y pasando esto a una canalización de sklearn. Aquí se aplican los pasos de modelado habituales. Dividimos el conjunto de datos en entrenar y probar y hacemos un preprocesamiento, es decir, imputamos los valores faltantes utilizando la mediana, escalamos los datos y codificamos de forma directa nuestros datos categóricos. Soy un gran fanático de sklearn pipelines y básicamente los uso cada vez que desarrollo modelos hoy en día, realmente facilitan un código limpio y conciso.
¿Cómo funciona esta canalización en un conjunto de datos con aproximadamente 2 millones de filas? Bueno, ejecutar este modelo sin ningún ajuste de hiperparámetros tarda unos 34 minutos. Ay, un poco lento. Puede imaginar lo prohibitivamente que tomaría esto si quisiéramos hacer cualquier tipo de ajuste de hiperparámetros. Ok, no es lo ideal, pero veamos cómo Dask maneja el desafío.
Código Python de Dask ML
Nuestro objetivo aquí es ver si podemos vencer la tubería de sklearn anterior, alerta de spoiler, definitivamente podemos. Lo bueno de Dask es que la barrera de entrada cuando ya estás familiarizado con Python es bastante baja. Podemos poner esta canalización en funcionamiento en Dask con solo unos pocos cambios.
El primer cambio que probablemente notará es que tenemos algunas importaciones diferentes. Una de las diferencias clave entre esta canalización y la anterior es que usaremos un marco de datos Dask en lugar de un marco de datos pandas para entrenar nuestro modelo. Puede pensar en un marco de datos Dask como un grupo de marcos de datos pandas donde podemos realizar cálculos en cada uno al mismo tiempo. Este es el núcleo del paralelismo de Dask y es lo que va a reducir el tiempo de formación de esta canalización.
Aviso que usamos @ dask.delayed como decorador de nuestro cargar_datos_de_entrenamiento función. Esto le indica a Dask que paralelice esta función para nosotros.
También vamos a importar algunos métodos de preprocesamiento y canalización de Dask y, lo más importante, necesitaremos importar SaturnCluster, lo que nos permitirá crear un clúster para entrenar nuestros modelos. Otra diferencia clave con este código es que usamos dask.persist después de nuestra división de pruebas de trenes. Antes de este punto, ninguna de nuestras funciones se había calculado realmente debido a la evaluación perezosa de Dask. Una vez que usamos el método de persistencia, le estamos diciendo a Dask que envíe nuestros datos a los trabajadores y ejecute las tareas que hemos creado hasta este punto y deje estos objetos en el clúster.
Finalmente, entrenamos nuestros modelos usando el método retardado. Una vez más, esto nos permite crear nuestra tubería de forma perezosa. La canalización no se ejecuta hasta que llegamos a este código:
fit_pipelines = dask.compute(*pipelines_)
Esta vez solo nos tomó alrededor de 10 minutos ejecutar esta canalización en exactamente el mismo conjunto de datos. Esa es una aceleración por un factor de 3.4, no está nada mal. Ahora, si quisiéramos, podríamos acelerar esto aún más ampliando nuestros recursos informáticos con solo tocar un botón en Saturno.
Implementando nuestro Pipeline
Mencioné anteriormente que probablemente querrá ejecutar una tubería como esta con bastante regularidad utilizando algo como el flujo de aire. Da la casualidad de que si no desea la molestia inicial de configurar todo para el flujo de aire, Saturn Cloud ofrece una alternativa simple con Jobs. Los trabajos nos permiten empaquetar nuestro código y ejecutarlo a intervalos regulares o según sea necesario. Todo lo que necesita hacer es ir a un proyecto existente y hacer clic en crear un trabajo. Una vez que hagamos eso, debería verse así:
Fuente: Saturno
A partir de aquí, todo lo que tenemos que hacer es asegurarnos de que nuestros archivos de Python de arriba estén en el directorio de la imagen y que podamos ingresar nuestro comando de Python arriba
python -m ml_pipeline -w 102 -j 'train'
También podemos configurar un horario usando la sintaxis cron para ejecutar el ETL a diario si lo deseamos. Para los interesados, aquí hay un Tutorial eso entra en todo el meollo de la cuestión.
Conclusiones y conclusiones
Bueno, hemos llegado al final de nuestro proyecto en este punto. Ahora, obviamente, he omitido algunas partes clave del ciclo de desarrollo de ML, como el ajuste de hiperparámetros y la implementación de nuestro modelo, pero tal vez lo deje para otro día. ¿Creo que deberías probar Dask? No soy un experto de ninguna manera, pero por lo que he visto hasta ahora, ciertamente parece realmente útil y estoy súper emocionado de experimentar más con él y encontrar más oportunidades para incorporarlo en mi trabajo diario como científico de datos. Con suerte, esto le resultó útil y también puede ver algunas de las ventajas de Snowflake y Dask y comenzar a experimentar con ellos por su cuenta.
Recursos
- Canalizaciones de datos con Apache Airflow
- Libro de cocina de copo de nieve
- Ciencia de datos a escala con Python y Dask
- Coursera: SQL para ciencia de datos
Algunas de mis otras publicaciones pueden resultarle interesantes
Construyamos una canalización de datos de transmisión
Modelado de mezcla gaussiana (GMM)
Un enfoque bayesiano para la predicción de series de tiempo
Nota: algunos de los enlaces de esta publicación son enlaces de afiliados.
Bio: daniel foley es un ex economista convertido en científico de datos que trabaja en la industria de los juegos móviles.
Original. Publicado de nuevo con permiso.
Relacionado:
Fuente: https://www.kdnuggets.com/2021/07/building-machine-learning-pipelines-snowflake-dask.html
- "
- &
- 102
- 2021
- de la máquina
- Mi Cuenta
- Adicionales
- Ventaja
- consejos
- Afiliación
- algoritmos
- Todos
- Amazon
- APACHE
- Reservada
- en torno a
- auto
- MEJOR
- Poco
- build
- Construir la
- Manojo
- Campaña
- cases
- causado
- Reto
- el cambio
- comprobación
- clasificación
- más cerca
- Soluciones
- código
- Codificación
- componente
- Calcular
- computadoras
- informática
- Coursera
- Creamos
- Referencias
- Clientes
- datos
- Ciencia de los datos
- científico de datos
- conjunto de datos
- almacenamiento de datos
- Base de datos
- día
- acuerdo
- deep learning
- capas demográficas
- detalle
- desarrollar
- Desarrollo
- HIZO
- Director
- eficiencia
- certificados
- Entorno
- experimento
- Caracteristicas
- Finalmente
- en fin
- Nombre
- Focus
- seguir
- formato
- Gratuito
- ser completados
- función
- juego de azar
- Industria de juegos
- General
- candidato
- GPU
- maravillosa
- guía
- esta página
- Alta
- Destacar
- Cómo
- Como Hacer
- HTTPS
- enorme
- idea
- Identifique
- imagen
- aumente
- energético
- info
- información
- cuestiones
- IT
- Trabajos
- Empleo
- únete
- saltar
- Clave
- large
- APRENDE:
- aprendizaje
- Nivel
- Biblioteca
- línea
- Etiqueta LinkedIn
- Lista
- carga
- local
- Largo
- máquina de aprendizaje
- Métrica
- millones
- ML
- Móvil
- Los juegos móviles
- modelo
- movimiento
- a saber
- Nuevas características
- Ofertas
- en línea
- Operaciones
- Optión
- Otro
- actuación
- Mucho
- Artículos
- industria
- Predicciones
- producido
- productividad
- proyecto
- público
- Python
- Reading
- reducir
- regresión
- Recursos
- RESTO
- Resultados
- Ejecutar
- correr
- Escala
- la ampliación
- Ciencia:
- los científicos
- Serie
- set
- pólipo
- Compartir
- compartido
- sencillos
- chica
- So
- RESOLVER
- velocidad
- pasar
- Gastos
- Girar
- dividido
- SQL
- Etapa
- comienzo
- fundó
- statistics
- Historias
- en streaming
- Target
- test
- Ideas
- equipo
- parte superior
- contacto
- Formación
- transaccional
- Transacciones
- juicio
- Tutoriales
- ui
- us
- usuarios
- Virtual
- Manejo de
- semana
- Que es
- dentro de
- Actividades:
- los trabajadores.
- flujo de trabajo
- funciona
- la escritura
- X
- años