我想实现一个散列叉积转换,就像 Keras 使用的那样:
>>> layer = keras.layers.HashedCrossing(num_bins=5, output_mode='one_hot')
>>> feat1 = np.array([1, 5, 2, 1, 4])
>>> feat2 = np.array([2, 9, 42, 37, 8])
>>> layer((feat1, feat2))
<tf.Tensor: shape=(5, 5), dtype=float32, numpy=
array([[0., 0., 1., 0., 0.],
[1., 0., 0., 0., 0.],
[0., 0., 0., 0., 1.],
[1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0.]], dtype=float32)>
>>> layer2 = keras.layers.HashedCrossing(num_bins=5, output_mode='int')
>>> layer2((feat1, feat2))
<tf.Tensor: shape=(5,), dtype=int64, numpy=array([2, 0, 4, 0, 2])>
该层使用“哈希技巧”执行分类特征的交叉。从概念上讲,转换可以被认为是: hash(concatenate(features)) % num_bins。
我很难理解
concatenate(features)
部分。我是否必须对每“对”特征进行哈希处理?
与此同时,我尝试了这个:
>>> cross_product_idx = (feat1*feat2.max()+1 + feat2) % num_bins
>>> cross_product = nn.functional.one_hot(cross_product_idx, num_bins)
它可以工作,但不使用哈希函数可能会导致分布问题
我可以追踪到代码的this部分,他们只是使用“X”作为来自各种功能的一组交叉值的字符串分隔符。
我正在努力理解连接(功能)部分。我是否必须对每“对”特征进行哈希处理?
如果要交叉两个特征,对于每个特征的每对值,您需要以某种方式“组合”它们(这就是他们所说的“串联”)。我从代码中看到的连接只是使用分隔符“X”的字符串连接。
因此,如果您有
feature A: "A1", "A2"
和 feature B: "B1", "B2", "B3"
,您需要这样做
hash("A1_X_B1") % num_bins
hash("A1_X_B2") % num_bins
hash("A1_X_B3") % num_bins
hash("A2_X_B1") % num_bins
hash("A2_X_B2") % num_bins
hash("A2_X_B2") % num_bins
然后根据需要对这些数字进行 one-hot 编码。