Я изучаю пример 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», эта проблема возникает. введите описание изображения здесь