美文网首页程序员
TF2: Featrue Column

TF2: Featrue Column

作者: 数科每日 | 来源:发表于2021-01-05 12:03 被阅读0次

    前言

    Feature Column 是 TensorFlow 2 中的一个模块, 但是 官方文档 对它的介绍极其简略,简直就是一句话。 倒是 Tutorial: Classify structured data with feature columns 中有一部分涉及了这块内容, 本文就是基于这篇文章, 对Featrue Column 本身及其在整个TF2 Machine Learning PipeLine 的作用加以介绍。

    缩略语

    FC: Feature Column
    TF2:TensorFlow 2

    1. FC 是什么?

    1. FC是针对结构化数据(Structure Data)使用的, 文中举例,比如在 csv 中存储的数据, 我觉得存储在结构化数据库(RMSDB) 中的数据也可以归类到这里。 所以FC的应用场景还是挺大的。

    2. FC 的角色是 结构化数据模型 之间的 桥梁 (feature columns as a bridge to map from columns in a CSV to features used to train the model)

    3. FC 是 Input pipeline 的一部分。

    4. FC 是关于具体某个结构化数据说明书,其本身并不存储任何数据。在下面的例子中可以看到, 一组 FC 是针对具体某个 DataFrame 的说明, 一组创建好的 FC 是依附于某个具体DataFrame的。

    5. FC 往往和 Pandas 的 DataFramelayers.DenseFeatures 连用。 FC 上接 Dataframe, 下接 DenseFeatures Layer, 这就解释了“桥梁” 一词。

    2. FC 怎么用?

    直接放官方代码, 可以当模板用, 注意点

    • 对不同类型的数据 FC提供不同的函数处理(numeric,categorical ),如果是文本则需要单独的文本 embedding。文本处理不在 FC 覆盖范围内。
    • FC可以做一些对 Feture 的变形, 比如bucketized, embedding, crossed 。
    • 每个FC都是针对单独一列的, 一般来说一个 Datafame 包含很多列, 所以FC 一般都放在一个list中 (feature_columns)
    • Model 中第一个layer 是 tf.keras.layers.DenseFeatures(feature_columns)
    • 训练数据, 测试数据都用同一个 FC, 这个FC一般是基于训练数据做的。对于模型来说, 只需要第一层是 feature_layer 就可以了, 和传入的数据无关。
    feature_columns = []
    
    # numeric cols
    for header in ['PhotoAmt', 'Fee', 'Age']:
      feature_columns.append(feature_column.numeric_column(header))
    
    # bucketized cols
    age = feature_column.numeric_column('Age')
    age_buckets = feature_column.bucketized_column(age, boundaries=[1, 2, 3, 4, 5])
    feature_columns.append(age_buckets)
    
    # indicator_columns
    indicator_column_names = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',
                              'FurLength', 'Vaccinated', 'Sterilized', 'Health']
    for col_name in indicator_column_names:
      categorical_column = feature_column.categorical_column_with_vocabulary_list(
          col_name, dataframe[col_name].unique())
      indicator_column = feature_column.indicator_column(categorical_column)
      feature_columns.append(indicator_column)
    
    # embedding columns
    breed1 = feature_column.categorical_column_with_vocabulary_list(
          'Breed1', dataframe.Breed1.unique())
    breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
    feature_columns.append(breed1_embedding)
    
    # crossed columns
    age_type_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=100)
    feature_columns.append(feature_column.indicator_column(age_type_feature))
    
    # Create a feature layer
    feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
    
    batch_size = 32
    train_ds = df_to_dataset(train, batch_size=batch_size)
    val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
    test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
    
    
    # Create, compile, and train the model
    model = tf.keras.Sequential([
      feature_layer,
      layers.Dense(128, activation='relu'),
      layers.Dense(128, activation='relu'),
      layers.Dropout(.1),
      layers.Dense(1)
    ])
    
    model.compile(optimizer='adam',
                  loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                  metrics=['accuracy'])
    
    model.fit(train_ds,
              validation_data=val_ds,
              epochs=10)
    
    

    3. FC 函数介绍 (未完成)

    • bucketized_column : 通过划分不同的区间,把数值型转化成Category
    • categorical_column_with_hash_bucket :对于类型巨多而且sparse 的Category, 会面临 Feture 爆炸的情况。 优点是让Feture 打打减少, 缺点是如果出现撞车(不同Featrue 放到一个篮子里), 可能会对结果造成影响。
    • categorical_column_with_identity : 把int 数值,直接当成 Category 的类型来用。
    • categorical_column_with_vocabulary_file :给一个词汇文件,处理categorical, word-> int
    • categorical_column_with_vocabulary_list : 给一个词汇list,处理categorical, word-> int
    • crossed_column : 把不同列放在一起组合成一个新列使用
    • embedding_column : 类似Word embedding,参考上面例子
    • indicator_column : 配合其他函数完成 One-hot encoding, 参考上面例子
    • make_parse_example_spec : ??? Creates parsing spec dictionary from input feature_columns.
    • numeric_column : 标识是数值列,原样使用
    • sequence_categorical_column_with_hash_bucket : ??? A sequence of categorical terms where ids are set by hashing.
    • sequence_categorical_column_with_identity : ??? Returns a feature column that represents sequences of integers.
    • sequence_categorical_column_with_vocabulary_file : ??? A sequence of categorical terms where ids use a vocabulary file.
    • sequence_categorical_column_with_vocabulary_list : ??? A sequence of categorical terms where ids use an in-memory list.
    • sequence_numeric_column : ??? Returns a feature column that represents sequences of numeric data.
    • shared_embeddings :把几列放在一起做 Embedding
    • weighted_categorical_column : 对于Categorical Column 加上权重

    相关文章

      网友评论

        本文标题:TF2: Featrue Column

        本文链接:https://www.haomeiwen.com/subject/hnuioktx.html