gpt4 book ai didi

tensorflow - Tensorflow 分类编码中多余列的逻辑是什么?

转载 作者:行者123 更新时间:2023-12-04 03:30:44 25 4
gpt4 key购买 nike

我正在关注 preprocessing layers 的官方 Tensorflow 教程,我不确定我为什么在分类编码之后最终得到这些额外的列。
这是一个精简的 最小可重复性 示例(包括数据):

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
import pathlib

dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'
csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'
tf.keras.utils.get_file('petfinder_mini.zip', dataset_url, extract=True, cache_dir='.')
df = pd.read_csv(csv_file)

# In the original dataset "4" indicates the pet was not adopted.
df['target'] = np.where(df['AdoptionSpeed']==4, 0, 1)
# Drop un-used columns.
df = df.drop(columns=['AdoptionSpeed', 'Description'])

# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
dataframe = dataframe.copy()
labels = dataframe.pop('target')
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
ds = ds.prefetch(batch_size)
return ds

batch_size = 5
ds = df_to_dataset(df, batch_size=batch_size)
[(train_features, label_batch)] = ds.take(1)

def get_category_encoding_layer(name, dataset, dtype, max_tokens=None):
# Create a StringLookup layer which will turn strings into integer indices
if dtype == 'string':
index = preprocessing.StringLookup(max_tokens=max_tokens)
else:
index = preprocessing.IntegerLookup(max_values=max_tokens)

# Prepare a Dataset that only yields our feature
feature_ds = dataset.map(lambda x, y: x[name])

# Learn the set of possible values and assign them a fixed integer index.
index.adapt(feature_ds)

# Create a Discretization for our integer indices.
encoder = preprocessing.CategoryEncoding(max_tokens=index.vocab_size())
#encoder = preprocessing.CategoryEncoding(max_tokens=2)

# Prepare a Dataset that only yields our feature.
feature_ds = feature_ds.map(index)

# Learn the space of possible indices.
encoder.adapt(feature_ds)

# Apply one-hot encoding to our indices. The lambda function captures the
# layer so we can use them, or include them in the functional model later.
return lambda feature: encoder(index(feature))
所以,运行后
type_col = train_features['Type']
layer = get_category_encoding_layer('Type', ds, 'string')
layer(type_col)
我得到的结果是:
<tf.Tensor: shape=(5, 4), dtype=float32, numpy=
array([[0., 0., 1., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 1.],
[0., 0., 0., 1.]], dtype=float32)>
类似于 tutorial 中显示的内容确实。
请注意,这是一个二元分类问题(猫/狗):
np.unique(type_col)
# array([b'Cat', b'Dog'], dtype=object)
那么,上面结果中显示的分类编码之后的 2 个额外列的逻辑是什么?它们代表什么,为什么它们是 2(而不是 1、3 或更多)?
(我非常清楚,如果我希望使用简单的单热编码,我可以简单地使用 to_categorical() ,但这不是这里的问题)

最佳答案

正如问题中已经暗示的那样,分类编码比简单的一次性编码更丰富。要查看这两列代表什么,只需添加一个诊断 print get_category_encoding_layer() 内的某处功能:

print(index.get_vocabulary())
那么最后一个命令的结果将是:
['', '[UNK]', 'Dog', 'Cat']
<tf.Tensor: shape=(5, 4), dtype=float32, numpy=
array([[0., 0., 1., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 1.],
[0., 0., 0., 1.]], dtype=float32)>
提示应该很清楚:这里额外的两列代表空值 ''和未知的 '[UNK]' ,分别可能出现在 future (看不见的)数据中。
这实际上是根据默认参数确定的,而不是 CategoryEncoding , 但是前面的 StringLookup ;来自 docs :
mask_token=''
oov_token='[UNK]'
您可以通过请求 oov_token='' 来获得更严格的编码(只有 1 个额外的列而不是 2 个)。而不是 oov_token='[UNK]' ;替换对 StringLookup 的调用在 get_category_encoding_layer()功能与
    index = preprocessing.StringLookup(oov_token='',mask_token=None, max_tokens=max_tokens)
之后,结果将是:
['', 'Dog', 'Cat']
<tf.Tensor: shape=(5, 3), dtype=float32, numpy=
array([[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 1.],
[0., 0., 1.]], dtype=float32)>
即只有 3 列(没有 '[UNK]' 的专用列)。 AFAIK,这是您可以达到的最低值 - 尝试同时设置 mask_tokenoov_tokenNone将导致错误。

关于tensorflow - Tensorflow 分类编码中多余列的逻辑是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66874100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com