Creando muchas columnas de características en Tensorflow

Me estoy iniciando en un proyecto Tensorflow, y estoy en medio de definir y crear mis columnas de características. Sin embargo, tengo cientos y cientos de características, es un conjunto de datos bastante extenso. Incluso después de preprocesar y fregar, tengo muchas columnas.

La forma tradicional de crear una feature_column se define en el tutorial de Tensorflow e incluso en esta publicación de StackOverflow . Básicamente, declara e inicializa un objeto Tensorflow para cada columna de función:

 gender = tf.feature_column.categorical_column_with_vocabulary_list( "gender", ["Female", "Male"]) 

Esto funciona muy bien si su conjunto de datos tiene solo unas pocas columnas, pero en mi caso, seguramente no quiero que cientos de líneas de código inicialicen diferentes objetos feature_column .

¿Cuál es la mejor manera de resolver este problema? Observo que en el tutorial, todas las columnas se recostackn como una lista:

 base_columns = [ gender, native_country, education, occupation, workclass, relationship, age_buckets, ] 

Lo que finalmente se pasa a su estimador:

 m = tf.estimator.LinearClassifier( model_dir=model_dir, feature_columns=base_columns) 

Entonces, ¿la forma ideal de manejar la creación de feature_column para cientos de columnas sería agregarlas directamente a una lista? ¿Algo como esto?

 my_columns = [] for col in df.columns: if is_string_dtype(df[col]): #is_string_dtype is pandas function my_column.append(tf.feature_column.categorical_column_with_hash_bucket(col, hash_bucket_size= len(df[col].unique()))) elif is_numeric_dtype(df[col]): #is_numeric_dtype is pandas function my_column.append(tf.feature_column.numeric_column(col)) 

¿Es esta la mejor manera de crear estas columnas de características? ¿O me falta alguna funcionalidad de Tensorflow que me permita solucionar este paso?

Lo que tienes tiene sentido para mí. 🙂 copiando de su propio código:

 my_columns = [] for col in df.columns: if is_string_dtype(df[col]): #is_string_dtype is pandas function my_columns.append(tf.feature_column.categorical_column_with_hash_bucket(col, hash_bucket_size= len(df[col].unique()))) elif is_numeric_dtype(df[col]): #is_numeric_dtype is pandas function my_columns.append(tf.feature_column.numeric_column(col)) 

Utilicé tu propia respuesta. Solo editado un poco (debería haber my_columns lugar de my_column en for loop) y publicarlo de la forma en que funcionó para mí.

 import pandas.api.types as ptypes my_columns = [] for col in df.columns: if ptypes.is_string_dtype(df[col]): #is_string_dtype is pandas function my_columns.append(tf.feature_column.categorical_column_with_hash_bucket(col, hash_bucket_size= len(df[col].unique()))) elif ptypes.is_numeric_dtype(df[col]): #is_numeric_dtype is pandas function my_columns.append(tf.feature_column.numeric_column(col)) 

Los dos métodos anteriores solo funcionan si los datos se proporcionan en el dataframe de pandas donde tiene el nombre de columna para cada columna. Pero, en caso de que tenga todas las columnas numéricas y no quiera nombrar esas columnas. Para, por ejemplo, leer varias columnas numéricas de una matriz numpy, puede usar algo como esto:

 feature_column = [tf.feature_column.numeric_column(key='image',shape=(784,))] input_fn = tf.estimator.inputs.numpy_input_fn(dict({'image':x_train}) 

donde X_train es su matriz numy con 784 columnas. Puedes consultar esta publicación de Vikas Sangwan para más detalles.