web-dev-qa-db-fra.com

Création de nombreuses colonnes de fonctionnalité dans Tensorflow

Je commence un projet Tensorflow et je suis en train de définir et de créer mes colonnes de caractéristiques. Cependant, j'ai des centaines et des centaines de fonctionnalités, c'est un ensemble de données assez complet. Même après le prétraitement et le nettoyage, j'ai beaucoup de colonnes.

La manière traditionnelle de créer un feature_column est définie dans le tutoriel Tensorflow et même ceci StackOverflow post . Vous devez essentiellement déclarer et initialiser un objet Tensorflow pour chaque colonne d’entités:

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

Cela fonctionne très bien si votre ensemble de données ne contient que quelques colonnes, mais dans mon cas, je ne veux sûrement pas avoir des centaines de lignes de code initialisant différents objets feature_column

Quelle est la meilleure façon de résoudre ce problème? Je remarque que dans le tutoriel, toutes les colonnes sont rassemblées sous forme de liste:

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

Ce qui est finalement passé dans votre estimateur:

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

Ainsi, le moyen idéal de gérer la création de feature_column pour des centaines de colonnes serait-il de les ajouter directement à une liste? Quelque chose comme ça?

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

Est-ce la meilleure façon de créer ces colonnes de caractéristiques? Ou est-ce que certaines fonctionnalités de Tensorflow me permettent de contourner cette étape?

12
Yu Chen

Ce que vous avez est logique pour moi. :) copier à partir de votre propre code:

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

J'ai utilisé votre propre réponse. Je viens d’éditer un petit peu (il devrait y avoir my_columns au lieu de my_column dans la boucle for) et l’afficher comme cela a fonctionné pour moi.

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))
1
Maxim Zh

Les deux méthodes ci-dessus ne fonctionnent que si les données sont fournies dans le bloc de données pandas où vous avez le nom de colonne pour chaque colonne. Mais si vous avez toutes les colonnes numériques et que vous ne voulez pas nommer ces colonnes. par exemple en lisant plusieurs colonnes numériques d'un tableau numpy, vous pouvez utiliser quelque chose comme ceci: - 

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

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

où X_train est votre tableau numy avec 784 colonnes. Vous pouvez vérifier ce post par Vikas Sangwan pour plus de détails.

0
MNA