【问题标题】:Load and use BoostedTreesClassifier saved model加载和使用 BoostedTreesClassifier 保存的模型
【发布时间】:2021-03-04 22:48:48
【问题描述】:

我正在尝试在 TensorFlow 中使用 BoostedTreesClassifier 保存的模型,但我不知道如何使用加载的模型进行预测。我在这里使用来自tutorial 的示例代码。这是我正在使用的最小代码:

import pandas as pd
from matplotlib import pyplot as plt
import tensorflow as tf

tf.random.set_seed(123)

dftrain = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
dfeval = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')

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))
feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
  # Need to one-hot encode categorical features.
  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))

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)
    # For training, cycle thru dataset as many times as need (n_epochs=None).
    dataset = dataset.repeat(n_epochs)
    # In memory training doesn't use batching.
    dataset = dataset.batch(NUM_EXAMPLES)
    return dataset
  return input_fn

train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, shuffle=False, n_epochs=1)

n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,
                                          n_batches_per_layer=n_batches)

est.train(train_input_fn, max_steps=100)

result = est.evaluate(eval_input_fn)

# Make predictions
pred_dicts = list(est.predict(eval_input_fn))
probs = pd.Series([pred['probabilities'][1] for pred in pred_dicts])

probs.plot(kind='hist', bins=20, title='predicted probabilities')
plt.show()

# Save model
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
saved_model_path = est.export_saved_model('saved_model', serving_input_receiver_fn)

# Load model
loaded_est = tf.saved_model.load(saved_model_path)

# How can I use loaded_est to make predictions?
# pred_dicts_using_loaded_model = list(loaded_est.predict(eval_input_fn))
# probs_using_loaded_model = pd.Series([pred['probabilities'][1] for pred in pred_dicts_using_loaded_model])

编辑:最后两行评论只是为了展示我最终想要实现的目标。它们不会正确运行,也不是因为loaded_est 是与est 不同类型的对象。我不知道如何像使用est 一样使用loaded_est 进行预测。我查看了用于保存和加载模型here 的文档,他们在图像上执行此操作,但我无法将其转换为该数据,其中输入只是一个向量(即来自dfeval DataFrame 的一行)。

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    我最终通过搜索 something slightly more generic 在 Ajeet Singh 贡献的 medium.com 上找到了示例代码。为了回答我自己的问题,这里是使用加载的模型进行预测的代码:

    def predict(loaded_model, row, columns, dtypes):
      example = tf.train.Example()
      for i in range(len(columns)):
        if dtypes[i] == 'object':
          example.features.feature[columns[i]].bytes_list.value.extend([bytes(row[i], 'utf-8')])
        elif dtypes[i] == 'float':
          example.features.feature[columns[i]].float_list.value.extend([row[i]])
        elif dtypes[i] == 'int64':
          example.features.feature[columns[i]].int64_list.value.extend([row[i]])
      return loaded_model.signatures['predict'](examples=tf.constant([example.SerializeToString()]))
    
    pred_dicts_using_loaded_model = [predict(loaded_est, row, dfeval.columns, dfeval.dtypes) for row in dfeval.itertuples(index=False)]
    probs_using_loaded_model = [pred_dict['probabilities'][0][1].numpy() for pred_dict in pred_dicts_using_loaded_model]
    
    for p in zip(probs, probs_using_loaded_model):
      print(p)
    

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2019-04-12
      相关资源
      最近更新 更多