2017-10-19 17 views
4

Je commence un projet Tensorflow et je suis en train de définir et de créer mes colonnes de fonctions. Cependant, j'ai des centaines et des centaines de caractéristiques - c'est un ensemble de données assez vaste. Même après le prétraitement et le récurage, j'ai beaucoup de colonnes.Création de nombreuses colonnes de fonctions dans Tensorflow

La manière traditionnelle de créer un feature_column est définie dans le Tensorflow tutorial et même ce StackOverflow post. Vous déclarez essentiellement et initialiser un objet tensorflow pour chaque colonne de fonction:

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

Cela fonctionne très bien si votre ensemble de données ne dispose que de quelques colonnes, mais dans mon cas, je ne veux sûrement pas d'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 collectées sous forme de liste:

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

qui est finalement passé dans votre estimateur:

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

Ainsi serait le moyen idéal de gérer feature_column création pour des centaines de colonnes être de les ajouter directement dans 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 fonctions? Ou est-ce que je manque une fonctionnalité à Tensorflow qui me permet de contourner cette étape?

+1

Ce que vous avez a du sens pour moi. :) – greeness

+0

Pouvez-vous promouvoir cela à une réponse, @ verdure? Merci! :) – dga

+0

D'accord, cela n'ajoute rien à la question d'op. – greeness

Répondre

2

Ce que vous avez du sens 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)) 
1

J'ai utilisé votre propre réponse. Juste édité un peu (il devrait y avoir my_columns au lieu de my_column dans for boucle) et l'affichage de la façon dont 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))