Как использовать embedding_column с BoostedTreesClassifier - PullRequest
0 голосов
/ 03 августа 2020

Я изучаю пример GBDT на официальном сайте tensorflow: https://www.tensorflow.org/tutorials/estimator/boosted_trees?hl=en Пример на официальном сайте представляет собой горячую обработку функций классификации. Но я хочу преобразовать дискретные объекты в плотные векторы посредством встраивания. В процессе я столкнулся с неразрешимой проблемой. Следующий код является примером с официального веб-сайта.

CATEGORICAL_COLUMNS = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck',
                       'embark_town', 'alone']
NUMERIC_COLUMNS = ['age', 'fare']

def one_hot_cat_column(feature_name, vocab):
return tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list(feature_name,vocab))

for feature_name in CATEGORICAL_COLUMNS:
    vocabulary = dftrain[feature_name].unique()
    feature_columns.append(one_hot_cat_column(feature_name, vocabulary))

for feature_name in NUMERIC_COLUMNS:
    feature_columns.append(tf.feature_column.numeric_column(feature_name,dtype=tf.float32))

Но когда я меняю'indicator_column 'на'embedding_column' и запускаю'boostedtreeclassifier ', выдается сообщение об ошибке.

def embedding_column(feature_name,vocab):
return tf.feature_column.embedding_column(categorical_column=tf.feature_column.categorical_column_with_vocabulary_list(
                                          feature_name,vocab),dimension=4,combiner='sum')
feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
    vocabulary = dftrain[feature_name].unique()
    feature_columns.append(embedding_column(feature_name,vocabulary))
 
for feature_name in NUMERIC_COLUMNS:
    feature_columns.append(tf.feature_column.numeric_column(feature_name,
                                           dtype=tf.float32))

Далее, я не вносил никаких изменений в метод ввода данных на официальном сайте.

NUM_EXAMPLES = len(y_train)
def make_input_fn(X,y,n_epochs=None,shuffle=True):
    def input_fn():
        dataset = tf.data.Dataset.from_tensor_slices((dict(X),y))
        if shuffle:
            dataset = dataset.shuffle(NUM_EXAMPLES)
        dataset = dataset.repeat(n_epochs)
        dataset = dataset.batch(NUM_EXAMPLES)
        return dataset
    return input_fn
    

Затем я начинаю инициализировать модель и тренировать, и здесь будет сообщено об ошибке.

n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,n_batches_per_layer=n_batches)
train_input_fn = make_input_fn(dftrain,y_train)

est.train(train_input_fn,max_steps=100)

Выше сказано: '# ПРИМЕЧАНИЕ: GBDT требует, чтобы все DenseColumns предоставляли атрибут dtype.' 'AttributeError: объект' EmbeddingColumn 'не имеет атрибута' type ''. Я использую «Estimator.LinearClassifier», и это не проблема, но когда я использую «tf.estimator.BoostedTreesClassifier», эта проблема возникает. введите описание изображения здесь

...