web-dev-qa-db-de.com

Viele Feature-Spalten in Tensorflow erstellen

Ich beginne mit einem Tensorflow-Projekt und bin gerade dabei, meine Feature-Spalten zu definieren und zu erstellen. Ich habe jedoch Hunderte und Hunderte von Funktionen - es ist ein ziemlich umfangreicher Datensatz. Ich habe selbst nach der Vorverarbeitung und dem Schrubben viele Spalten.

Die traditionelle Methode zum Erstellen eines feature_column ist im Tensorflow-Tutorial und sogar in diesem StackOverflow post definiert. Sie deklarieren und initialisieren im Wesentlichen ein Tensorflow-Objekt für jede Feature-Spalte:

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

Dies funktioniert gut und gut, wenn Ihr Dataset nur wenige Spalten enthält. In meinem Fall möchte ich jedoch sicher nicht, dass Hunderte von Codezeilen verschiedene feature_column-Objekte initialisieren. 

Wie lässt sich dieses Problem am besten lösen? Ich stelle fest, dass im Tutorial alle Spalten als Liste gesammelt werden:

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

Welches wird letztendlich an Ihren Schätzer übergeben:

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

Wäre es also die ideale Art, die feature_column-Erstellung für Hunderte von Spalten zu behandeln, um sie direkt in eine Liste einzufügen? Etwas wie das?

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

Ist dies der beste Weg, diese Feature-Spalten zu erstellen? Oder vermisse ich Tensorflow einige Funktionen, mit denen ich diesen Schritt umgehen kann?

12
Yu Chen

Was du hast, macht für mich Sinn. :) Kopieren von Ihrem eigenen 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

Ich habe deine eigene Antwort verwendet. Nur ein wenig editiert (es sollte my_columns anstelle von my_column in for-Schleife geben) und so postieren, wie es für mich funktioniert hat.

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

Die beiden oben genannten Methoden funktionieren nur, wenn die Daten in einem Pandas-Datenrahmen bereitgestellt werden, in dem Sie für jede Spalte einen Spaltennamen haben. Falls Sie jedoch alle numerischen Spalten haben und diese Spalten nicht benennen möchten. für z.B. Wenn Sie mehrere numerische Spalten aus einem numpy-Array lesen, können Sie Folgendes verwenden: - 

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

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

dabei ist X_train Ihr numy-Array mit 784 Spalten. Sie können dieses post von Vikas Sangwan für weitere Details überprüfen.

0
MNA