
42
|
第
2
章
底线是我们需要使用指纹哈希算法,并且我们需要对得到的哈希值进行模运算。
操作顺序
请注意,我们先求模,然后求绝对值:
CREATE TEMPORARY FUNCTION hashed(airport STRING, numbuckets INT64) AS (
ABS(MOD(FARM_FINGERPRINT(airport), numbuckets))
);
前面的代码片段中
ABS
、
MOD
和
FARM_FINGERPRINT
的顺序很重要,因为
INT64
的
取值范围是不对称的。具体来说,它的范围在
-9,223,372,036,854,775,808
和
9,223,372,036,854,775,807
之间(两者都包括在内)。所以,如果我们要这样做:
ABS(FARM_FINGERPRINT(airport))
如果
FARM_FINGERPRINT
操作碰巧返回
-9,223,372,036,854,775,808
,我们将遇到一
个罕见且可能无法复现的溢出错误,因为它的绝对值不能用
INT64
表示!
空哈希桶
尽管不太可能,但即使我们选择
10
个哈希桶来代表
347
个机场,其中一个哈希桶也
有可能是空的。因此,当使用哈希特征列时,也使用
L2
正则化可能是有益的(
https://
oreil.ly/xlwAH
),这样与空桶相关的权值将被驱动到接近于
0
。这样,即使一个词汇
表外的机场真的掉进了一个空桶里,也不会导致模型在数值上变得不稳定。
设计模式
2
:嵌入
嵌入(
Embeddings
)是一种可学习的数据表示,它将高基数数据映射到低维空间, ...