Создание многих столбцов объектов в Tensorflow

Я начинаю работу над проектом Tensorflow и нахожусь в середине определения и создания моих столбцов функций. Тем не менее, у меня есть сотни и сотни функций - это довольно обширный набор данных. Даже после предварительной обработки и очистки, у меня много столбцов.

традиционный способ создания feature_column определена в Tensorflow учебник и даже сообщение StackOverflow. Вы по существу объявляете и инициализируете объект Tensorflow для каждого столбца функций:

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

это работает хорошо, если ваш набор данных имеет только несколько колонн, но в моем случае, я точно не хочу иметь сотни строк кода инициализации разные feature_column объекты.

каков наилучший способ решить эту проблему? Я замечаю, что в учебнике все столбцы собраны в виде списка:

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

который в конечном итоге передается в ваш оценщик:

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

так было бы идеальным способом обработка feature_column создание сотен столбцов, чтобы добавить их в список? Что-то вроде этого?

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))

это лучший способ создать эти столбцы? Или мне не хватает некоторой функциональности Tensorflow, которая позволяет мне обойти этот шаг?

3 ответов


то, что у вас есть, имеет для меня смысл. :) копирование из собственного кода:

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))

я использовал ваш собственный ответ. Просто отредактировал немного (должно быть my_columns вместо my_column на for loop) и опубликовать его так, как он работал для меня.

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))

вышеуказанные два метода работают, только если данные предоставлены в фрейме данных pandas, где у вас есть имя столбца для каждого столбца. Но, если у вас есть все числовые столбцы, и вы не хотите называть эти столбцы. например, прочитав несколько числовых столбцов из массива numpy, вы можете использовать что-то вроде этого:-

feature_column = [tf.feature_column.numeric_column(key='image',shape=(784,))] 

input_fn = tf.estimator.inputs.numpy_input_fn(dict({'image':x_train})  

где X_train-Ваш массив numy с 784 столбцами. Вы можете проверить это в должности Викас Сангван для более подробной информации.