Estás leyendo la publicación: Cree su primer modelo de aprendizaje automático con Big Query ML
BigQuery ML permite al usuario usar consultas SQL regulares para desarrollar y ejecutar modelos de aprendizaje automático en BigQuery. Democratiza el aprendizaje automático al permitir que los profesionales de SQL creen modelos utilizando sus herramientas y habilidades de SQL existentes. BigQuery ML acelera el desarrollo al eliminar la necesidad de reubicar datos. Aunque comenzó con una regresión lineal, ahora se ha expandido para incluir modelos más potentes, como Deep Neural Networks y AutoML Tables, al vincular BigQuery ML con TensorFlow y Vertex AI como backend. Este artículo se centra en la creación de un modelo de aprendizaje automático con BigQuery ML. Los siguientes son los temas a tratar.
Tabla de contenido
- Primeros pasos con Big Query ML
- Autenticación y configuración del proyecto
- Extracción de datos
- Análisis de los datos
- Entrenamiento y evaluación del modelo
El aprendizaje automático en conjuntos de datos masivos requiere una programación y comprensión sustanciales de los marcos de ML, que no todos poseen. BigQuery ML permite a los analistas aplicar el aprendizaje automático con sus herramientas y capacidades de SQL existentes. Echemos un vistazo a los modelos de ML compatibles.
Primeros pasos con Big Query ML
El usuario debe crear una cuenta en la plataforma de Google Cloud. Uno puede omitir la información de la tarjeta de crédito si solo quiere usar Big Query ML para la prueba. Básicamente dependiendo de las necesidades del usuario individual.
Una vez registrado en GCP, busque Big Query y cree un proyecto. Se puede crear un conjunto de datos y agregarle datos desde el GCP o desde el cuaderno, lo que se demostrará más adelante en este artículo. La pantalla se parecería a la imagen que se muestra a continuación.
En este artículo se usa un cuaderno de colaboración, por lo que el proceso diferiría para los distintos cuadernos de la plataforma AI.
¿Está buscando un repositorio completo de bibliotecas de Python utilizadas en ciencia de datos, echa un vistazo aquí.
Autenticación y configuración del proyecto
La cuenta de GCP debe autenticarse para su uso y asegúrese de usar la misma identificación de cuenta (identificación de Gmail) tanto para GCP como para colab. Desde que uso el cuaderno colab, necesito usar el siguiente código.
desde google.cloud importar bigquery desde google.colab importar autenticación auth.authenticate_user()
Una vez autenticado, es hora de configurar las variables del proyecto, como la identificación del proyecto, el nombre del conjunto de datos y el nombre del modelo. El nombre del modelo podría definirse como cualquier nombre preferido en cualquier formato particular. El ID del proyecto se puede encontrar en la sección de detalles del proyecto en el GCP. A continuación se muestra la forma de acceder a la identificación del proyecto.
project_id = ‘amazing-blend-354905’ dataset_name = “experimental_data” model_name = “sm_experimental_model” eval_name = model_name + “_eval” client = bigquery.Client(project=project_id) dataset = client.create_dataset(dataset_name)
Los extractos se dividirán en 80,10,10 para entrenamiento, validación y prueba en este artículo.
En BigQuery, necesitamos una muestra repetible de los datos para el aprendizaje automático. Cambie el ‘8’ en la consulta anterior a ‘= 8’ para recibir datos de validación y ‘= 9’ para obtener datos de prueba. Como resultado, se valida el 10 % de las muestras y se analiza el 10 %.
Debe escribir la consulta SQL entre comillas triples y luego pasar la consulta a la consulta del cliente para su procesamiento. Big Query procesará la consulta y devolverá el resultado que se necesita almacenar en una variable y podría convertirse en un marco de datos de pandas usando ‘to_dataframe’.
Todo el conjunto de datos
query = “”” SELECCIONE edad, clase de trabajo, peso_funcional, educación, número_educación, estado civil, ocupación, relación, raza, sexo, ganancia de capital, pérdida de capital, horas_por_semana, país_nativo, grupo_de_ingresos FROM `bigquery-public-data.ml_datasets.census_adult_income` “”” conjunto de datos = cliente.consulta(consulta).to_dataframe()
Conjunto de entrenamiento
consulta = “”” SELECCIONE edad, clase de trabajo, peso_funcional, educación, número_educación, estado civil, ocupación, relación, raza, sexo, ganancia_de_capital, pérdida_de_capital, horas_por_semana, país_nativo, tramo_de_ingresos FROM `bigquery-public-data.ml_datasets.census_adult_income` WHERE MOD( ABS(FARM_FINGERPRINT(CAST(funcional_weight AS STRING))), 10) < 8 """ train_dataset = cliente.consulta(consulta).to_dataframe()
Conjunto de prueba
consulta = “”” SELECCIONE edad, clase de trabajo, peso_funcional, educación, número_educación, estado civil, ocupación, relación, raza, sexo, ganancia_de_capital, pérdida_de_capital, horas_por_semana, país_nativo, tramo_de_ingresos FROM `bigquery-public-data.ml_datasets.census_adult_income` WHERE MOD( ABS(FARM_FINGERPRINT(CAST(funcional_weight AS STRING))), 10) = 9 “”” test_dataset = cliente.consulta(consulta).to_dataframe()
Conjunto de validación
consulta = “”” SELECCIONE edad, clase de trabajo, peso_funcional, educación, número_educación, estado civil, ocupación, relación, raza, sexo, ganancia_de_capital, pérdida_de_capital, horas_por_semana, país_nativo, tramo_de_ingresos FROM `bigquery-public-data.ml_datasets.census_adult_income` WHERE MOD( ABS(FARM_FINGERPRINT(CAST(funcional_peso COMO CADENA))), 10) = 8 “”” eval_dataset = cliente.consulta(consulta).to_dataframe()
Comprobación de la longitud de todo el conjunto de datos
len (conjunto de datos), len (conjunto de datos de entrenamiento), len (conjunto de datos de evaluación), len (conjunto de datos de prueba)
Análisis de los datos
Verifiquemos los valores faltantes en el conjunto de datos.
consulta = “”” SELECT COUNTIF(clase de trabajo ES NULL O LTRIM(clase de trabajo) COMO ‘?’) COMO clase de trabajo, ROUND(COUNTIF(clase de trabajo ES NULO O LTRIM(clase de trabajo) COMO ‘?’) / COUNT(clase de trabajo) * 100) COMO workclass_percentage, COUNTIF(la ocupación ES NULL O LTRIM(ocupación) COMO ‘?’) AS ocupación, ROUND(COUNTIF(la ocupación ES NULL O LTRIM(ocupación) COMO ‘?’) / COUNT(ocupación) * 100) AS ocupación_porcentaje, COUNTIF( país_nativo ES NULL O LTRIM(país_nativo) COMO ‘?’) AS país_nativo, ROUND(COUNTIF(país_nativo ES NULL O LTRIM(país_nativo) COMO ‘?’) / COUNT(país_nativo) * 100) AS país_nativo_porcentaje FROM `bigquery-public-data .ml_datasets.census_adult_income` “”” client.query(consulta).to_dataframe()
Analizar el número de ciudadanos que trabajan en sectores como privado, gobierno, autónomos, etc.
consulta = “”” SELECT workclass, COUNT(workclass) AS total_workclass FROM `bigquery-public-data.ml_datasets.census_adult_income` GROUP BY workclass ORDER BY total_workclass DESC “”” client.query(query).to_dataframe()
Del mismo modo, cualquier cosa podría extraerse y almacenarse del conjunto de datos. Los datos almacenados podrían manejarse de manera similar al marco de datos de pandas que normalmente se lee usando la función de lectura de pandas. Para más análisis, consulte el cuaderno de colab en las referencias.
Entrenamiento y evaluación del modelo
El conjunto de datos público se utilizará para entrenar el modelo. La cláusula de “modo de creación” se utiliza para construir y entrenar el modelo de “modelo experimental data.sm experimental”. El comando “crear o reemplazar modelo” genera y entrena un modelo al mismo tiempo que reemplaza un modelo existente con el mismo nombre en el conjunto de datos proporcionado.
Capacitación
OPCIONES DE CREAR O REEMPLAZAR EL MODELO `experimental_data.sm_experimental_model` ( model_type=”logistic_reg”, auto_class_weights=true, data_split_method=’no_split’, input_label_cols=[‘income_bracket’]max_iteraciones=15)
La oración anterior implica que está desarrollando un modelo de regresión logística. Esta opción genera una regresión logística o un modelo de regresión logística multiclase. La columna de etiqueta en los modelos de regresión logística solo debe tener dos valores diferentes. Al crear un modelo de regresión logística multiclase, use datos de entrenamiento con más de dos etiquetas únicas.
- tipo de modelo: necesita especificar el modelo como en este artículo usando regresión logística.
- auto_clase_pesos: los datos de entrenamiento utilizados para crear un modelo de regresión logística multiclase no están ponderados de forma predeterminada. Si las etiquetas en los datos de entrenamiento están sesgadas, el modelo puede aprender a sobreestimar la clase de etiquetas más común, lo que puede no ser deseable. Los pesos de clase se pueden emplear en regresiones logísticas y logísticas multiclase para equilibrar las etiquetas de clase. Si es cierto, los pesos para cada clase se determinan en proporción inversa a su frecuencia.
- método_dividir_datos: El procedimiento para dividir los datos de entrada en conjuntos de entrenamiento y evaluación. El modelo se entrena utilizando datos de entrenamiento. La detención temprana de los datos de evaluación se utiliza para evitar el sobreajuste. La configuración predeterminada es división automática. Como ya dividí los datos antes, lo configuré en “sin división”.
- input_label_cols: El(los) nombre(s) de la(s) columna(s) de etiqueta en los datos de entrenamiento. Aunque las columnas de etiqueta de entrada permiten una matriz de cadenas, los modelos de registro lineal y registro logístico solo admiten un miembro de matriz. Si no se proporcionan columnas de etiqueta de entrada, se utiliza la columna de datos de entrenamiento etiquetada como “etiqueta”. La consulta falla si no existe ninguno.
- max_iteraciones: El número máximo de pasos de entrenamiento.
Cuando se utiliza una declaración de “crear modelo”, el modelo debe tener un tamaño de 90 MB o menos, de lo contrario, la consulta fallará. En general, se admite una cardinalidad total de características (dimensión del modelo) de 5 a 10 millones si todas las variables categóricas son cadenas cortas. La dimensionalidad está determinada por la cardinalidad y la longitud de las variables de cadena. Los datos no deben contener ningún valor nulo o nan; de lo contrario, la consulta fallará. BigQuery ML estandarizó y centró todas las columnas numéricas en cero antes de reenviarlas al entrenamiento. BQML convertirá las características categóricas en características numéricas. El código final se verá así.
training_model_query = “”” CREAR O REEMPLAZAR MODELO `experimental_data.sm_experimental_model` OPCIONES ( model_type=”logistic_reg”, auto_class_weights=true, data_split_method=’no_split’, input_label_cols=[‘income_bracket’], max_iterations=15) COMO SELECCIONAR edad, CASO CUANDO la clase de trabajo ES NULL ENTONCES ‘Privado’ CUANDO LTRIM(clase de trabajo) LIKE ‘?’ THEN ‘Private’ ELSE workclass END AS workclass, CASE WHEN native_country IS NULL THEN ‘Estados Unidos’ WHEN LTRIM(native_country) LIKE ‘?’ THEN ‘Estados Unidos’ ELSE país_nativo END AS país_nativo, CASE WHEN LTRIM(estado civil) IN ( ‘Nunca casado’, ‘Divorciado’, ‘Separado’, ‘Viudo’ ) THEN ‘Soltero’ WHEN LTRIM(estado_matrimonial) IN ( ‘Casado -civ-cónyuge’, ‘Casado-cónyuge-ausente’, ‘Casado-AF-cónyuge’ ) THEN ‘Casado’ ELSE NULL END AS estado_marital, número_de_educación, ocupación, raza, horas_por_semana, tramo_de_ingresos FROM `bigquery-public-data.ml_datasets .census_adult_income` WHERE MOD(ABS(FARM_FINGERPRINT(CAST(function_weight AS STRING))), 10) < 8 AND (ocupación NO ES NULO O LTRIM(ocupación) NO COMO '?%') GRUPO POR 1, 2, 3, 4 , 5, 6, 7, 8, 9 """ cliente.consulta(formación_modelo_consulta)
evaluando
Evaluemos el modelo usando la cláusula “ML.EVALUATE”.
evaluación_modelo_consulta = “”” SELECCIONE precisión, recuperación, exactitud, f1_score, log_loss, roc_auc DESDE ML.EVALUATE (MODELO `experimental_data.sm_experimental_model`, ( SELECCIONE edad, CASO CUANDO la clase de trabajo ES NULL ENTONCES ‘Privado’ CUANDO LTRIM(clase de trabajo) LIKE ‘? ‘ THEN ‘Privado’ ELSE clase de trabajo END AS clase de trabajo, CASE WHEN país_nativo IS NULL THEN ‘Estados Unidos’ WHEN LTRIM(país_nativo) LIKE ‘?’ THEN ‘Estados Unidos’ ELSE país_nativo END AS país_nativo, CASE WHEN LTRIM(estado_marital) IN ( ‘ Nunca casado’, ‘Divorciado’, ‘Separado’, ‘Viudo’ ) THEN ‘Soltero’ WHEN LTRIM(estado_marital) IN ( ‘Casado-civ-cónyuge’, ‘Casado-cónyuge-ausente’, ‘Casado-AF-cónyuge ‘ ) THEN ‘Casado’ ELSE NULL END AS estado_marital, número_de_educación, ocupación, raza, horas_por_semana, tramo_de_ingresos FROM `bigquery-public-data.ml_datasets.census_adult_income` WHERE MOD(ABS(FARM_FINGERPRINT(CAST(funcional_weight AS STRING))), 10 ) = 8 AND (ocupación NO ES NULL O LTRIM(ocupación) NO COMO ‘?%’) GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9 )) “”” evaluación_trabajo = cliente.consulta (evaluando_modelo_consulta).to_dataframe()
La puntuación AUC es buena, casi 0,87. El retiro también está bien. Podemos confirmar que el modelo está haciendo un buen trabajo para clasificar.
Predicción
Ahora que el modelo está entrenado y evaluado, es hora de predecir algún rango de ingresos. Dado que el objetivo del modelo era predecir el rango de ingresos que es menor o igual a 50k o mayor a 50k. Predigamos y comparemos el segmento de ingresos real.
query_prediction = “”” SELECT income_bracket, predicted_income_bracket, predicted_income_bracket_probs FROM ML.PREDICT(MODEL `experimental_data.sm_experimental_model`, ( SELECT age, CASE WHEN workclass IS NULL THEN ‘Private’ WHEN LTRIM(workclass) LIKE ‘?’ THEN ‘Private’ ELSE clase de trabajo END COMO clase de trabajo, CASO CUANDO país_nativo ES NULL ENTONCES ‘Estados Unidos’ CUANDO LTRIM(país_nativo) LIKE ‘?’ ENTONCES ‘Estados Unidos’ ELSE país_nativo END AS país_nativo, CASO CUANDO LTRIM(estado_marital) IN ( ‘nunca casado’, ‘ Divorciado’, ‘Separado’, ‘Viudo’ ) THEN ‘Soltero’ WHEN LTRIM(estado_marital) IN ( ‘Casado-civ-cónyuge’, ‘Casado-cónyuge-ausente’, ‘Casado-AF-cónyuge’ ) THEN ‘Casado’ ELSE NULL END AS estado_marital, número_de_educación, ocupación, raza, horas_por_semana, grupo_de_ingresos FROM `bigquery-public-data.ml_datasets.census_adult_income` WHERE MOD(ABS(FARM_FINGERPRINT(CAST(funcional_weight AS STRING))), 10) = 9 AND ocupación IS NOT NULL AND LTRIM(ocupación) NOT LIKE ‘?%’ GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9 )) “”” predicciones = client.query(query_prediction).to_dataframe()
Comparemos la predicción con la realidad.
fig, ejes = plt.subplots(1, 2, figsize=(15, 5), sharex=True) fig.suptitle(‘Gráfico de comparación’) sns.countplot(ax=ejes[0]datos=predicciones, x=’rango de ingresos’) ejes[0].set_title(‘Ingresos reales’) sns.countplot(ax=axes[1]datos=predicciones, x=’grupo_de_ingresos_predicho’) ejes[1].set_title(‘Ingresos previstos’) plt.show()
Conclusiones
BigQuery ML democratiza el uso del aprendizaje automático al permitir que los analistas de datos, los principales consumidores de los almacenes de datos, construyan y ejecuten modelos utilizando herramientas y hojas de cálculo de inteligencia empresarial convencionales. No es necesario escribir una solución ML en Python o Java. BigQuery usa SQL para entrenar y acceder a modelos. Con este artículo, hemos entendido que uno puede usar SQL para hacer modelos predictivos sin mucho conocimiento de aprendizaje automático.