从 TFRecord 数据集中删除一列(用于特征选择)

问题描述 投票:0回答:1

我正在尝试实现一个特征选择组件,并考虑以下计划:

实施

  • 组件将 和
    InputArtifact[Example]
    作为输入
  • 由于数据以 TFRecords 的形式存储在输入工件的 URI 中,因此我将其转换为兼容的 numpy 字典,并使用 sklearn 来得出所选功能的列表
  • 我直接从输入示例中删除所需的特征以生成将其放入OutputArtifact[Example]
    (具有相同的结构但列更少)
我已经完成了第一点和第二点,但无法弄清楚如何直接在 TFRecord 数据集本身中删除选定的列(我正在使用

tf.data.TFRecordDataset(train_uri, compression_type='GZIP')

python tensorflow tensorflow-datasets tfrecord tfx
1个回答
1
投票
我花了一些时间才弄清楚(在评论中 TensorFlow 支持链接的博客的帮助下),但这里有一个解决方法!

split_dataset = tf.data.TFRecordDataset("path_to_original_dataset.gzip", compression_type='GZIP')
with tf.io.TFRecordWriter(path = "path_to_new_TFRecord.gzip", options="GZIP") as writer:
      for split_record in split_dataset.as_numpy_iterator():
        example = tf.train.Example()
        example.ParseFromString(split_record)

        updated_example = update_example(selected_features, example)

        writer.write(updated_example.SerializeToString())
这里,

updated_example

是我使用的自定义函数,它获取解析后的示例,对其进行处理并返回处理后的示例!

# update example with selected features def update_example(selected_features, orig_example): result = {} for key, feature in orig_example.features.feature.items(): if key in selected_features: result[key] = orig_example.features.feature[key] new_example = tf.train.Example(features=tf.train.Features(feature=result)) return new_example
我没有删除该列(因为我无法找到这样做的方法),而是只是逐个功能创建了一个新示例并将其返回!

© www.soinside.com 2019 - 2024. All rights reserved.