问题1:
在中wide_n_deep_tutorial.py,有一个hash_bucket_size为tf.feature_column.categorical_column_with_hash_bucket和tf.feature_column.crossed_column方法命名的超参数,值是hash_bucket_size=1000。
但是为什么要1000?如何设置该参数?
问题2:关于第二个问题crossed_columns,那就是,
crossed_columns = [
tf.feature_column.crossed_column( ["education", "occupation"], hash_bucket_size=1000),
tf.feature_column.crossed_column( [age_buckets, "education", "occupation"], hash_bucket_size=1000),
tf.feature_column.crossed_column( ["native_country", "occupation"], hash_bucket_size=1000) ]
在wide_n_deep_tutorial.py中
为什么选择["education", "occupation"],[age_buckets, "education", "occupation"]以及["native_country", "occupation"]作为crossed_columns,是有经验的任何规则?
关于hash_bucket_size:如果将其设置得太低,则会发生许多哈希冲突,其中不同类别将映射到同一存储桶,从而迫使神经网络使用其他功能来区分它们。如果将其设置得太高,则将无用的RAM大量使用:我假设您将包裹categorical_column_with_hash_bucket()在embedding_column()(通常应该如此)中,在这种情况下,hash_bucket_size它将确定嵌入矩阵的行数。
如果有k个类别,则发生碰撞的概率大约等于:1 - exp(-k*(k-1)/2/hash_bucket_size)(source),因此,如果有40个类别并且您使用hash_bucket_size=1000,则发生碰撞的概率非常高:大约54%!为了说服自己,请尝试运行len(np.unique(np.random.randint(1000, size=40)))几次(它会选择0至999之间的40个随机数,并计算有多少个唯一数),您会发现结果通常少于40。您可以使用此公式选择一个的值hash_bucket_size不会导致太多的冲突。
就是说,如果只有几次碰撞,在实践中可能不会太糟,因为神经网络仍将能够使用其他功能来区分碰撞类别。最好的选择是尝试不同的值,hash_bucket_size以找到低于该值的性能开始下降,然后将其提高10-20%以确保安全。
对于 hash_bucket
一般思想是,理想情况下,哈希函数的结果不应导致任何冲突(否则您/算法将无法区分两种情况)。因此,在这种情况下,1000“只是”一个值。如果您查看职业和国家/地区的唯一条目(16 和 43),您会发现这个数字足够高:
edb@lapelidb:/tmp$ cat adult.data | cut -d , -f 7 | sort | uniq -c | wc -l
16
edb@lapelidb:/tmp$ cat adult.data | cut -d , -f 14 | sort | uniq -c | wc -l
43
Run Code Online (Sandbox Code Playgroud)
特征交叉
我认为经验法则是,如果特征的组合确实有意义,那么交叉就有意义。在这个例子中,教育和职业是相关的。至于第二个,将人们定义为“拥有博士学位的初级工程师”与“没有学位的高级清洁人员”可能是有意义的。您经常看到的另一个典型例子是经度和纬度的交叉,因为它们在一起比单独存在更有意义。
| 归档时间: |
|
| 查看次数: |
2333 次 |
| 最近记录: |