【问题标题】:Feature Hashing of zip codes with Scikit in machine learning在机器学习中使用 Scikit 对邮政编码进行特征散列
【发布时间】:2021-07-20 20:07:51
【问题描述】:

我正在研究一个机器学习问题,我的数据集中有很多邮政编码(约 8k 个唯一值)。因此我决定将这些值散列到一个较小的特征空间中,而不是使用像 OHE 这样的东西。

我遇到的问题是我的哈希中唯一行的百分比非常小(20%),这基本上意味着根据我的理解,我有很多重复/冲突。即使我将哈希表中的特征增加到约 200 个,但我从未得到超过 20% 的唯一值。这对我来说没有意义,因为我的哈希中的列数越来越多,应该可以有更多独特的组合

我使用以下代码用 scikit 对我的邮政编码进行哈希处理,并根据最后一个数组中的唯一值计算碰撞:

from sklearn.feature_extraction import FeatureHasher

D = pd.unique(Daten["PLZ"])

print("Zipcode Data:", D,"\nZipcode Shape:", D.shape)

h = FeatureHasher(n_features=2**5, input_type="string")
f = h.transform(D)
f = f.toarray()

print("Feature Array:\n",f ,"\nFeature Shape:", f.shape)

unq = np.unique(f, axis=0)

print("Unique values:\n",unq,"\nUnique Shape:",unq.shape)
print("Percentage of unique values in hash array:",unq.shape[0]/f.shape[0]*100)

对于我收到的输出:

Zipcode Data: ['86916' '01445' '37671' ... '82387' '83565' '83550'] 
Zipcode Shape: (8158,)
Feature Array:
 [[ 2.  1.  0. ...  0.  0.  0.]
 [ 0. -1.  0. ...  0.  0.  0.]
 [ 1.  0.  0. ...  0.  0.  0.]
 ...
 [ 0.  0.  0. ...  0.  0.  0.]
 [ 1.  0.  0. ...  0.  0.  0.]
 [ 0. -1.  0. ...  0.  0.  0.]] 
Feature Shape: (8158, 32)
Unique values:
 [[ 0. -3.  0. ...  0.  0.  0.]
 [ 0. -2.  0. ...  0.  0.  0.]
 [ 0. -2.  0. ...  0.  0.  0.]
 ...
 [ 4.  0.  0. ...  0.  0.  0.]
 [ 4.  0.  0. ...  0.  0.  0.]
 [ 4.  0.  0. ...  0.  0.  0.]] 
Unique Shape: (1707, 32)
Percentage of unique values in hash array: 20.9242461387595

非常感谢任何帮助和见解。

【问题讨论】:

    标签: machine-learning scikit-learn hash feature-extraction


    【解决方案1】:

    转换后的数据中的第一个2 应该是一个线索。我想你也会发现很多列都是全零的。

    来自the documentation

    每个样本都必须是可迭代的...

    因此哈希器将邮政编码'86916' 视为元素86916集合,而您只会得到十个非零列(第一列可能是6,出现两次,如开头所述)。您应该能够通过将输入重塑为二维来纠正此问题。

    【讨论】:

    • 感谢您的回答。我像这样重新调整输入:D = np.reshape(D,(len(D),1)) 到 (8158,1)。但是,我必须将 n_features 提高到 4096 才能获得 63% 的唯一哈希值。在这一点上,我问自己为什么特征哈希即使存在这么多冲突,二进制编码器不是更好吗?
    • 使用 4096 个新列和交替符号,使用约 8000 个原始值,您的空间量刚好合适,但散列的(伪)随机性意味着您应该期望大约 1/e 〜= 27%的碰撞,这几乎与您观察到的相符。 onehot 上的哈希值是编码速度更快(您不必每次都在类别列表中查找邮政编码,只需将其放入哈希函数中即可)并且内存效率更高(您不需要)不需要保存所有唯一的邮政编码)。
    • 好的,但为什么还要使用它呢?我可以轻松地将所有 8000 个唯一值编码为 13 位或 13 列。这样就根本不会发生冲突,而不是 4096 个新功能,我只有 13 个?我只是想不出分类编码应该有利于散列的情况还是我遗漏了什么?
    • 我其他评论的最后一句话给出了使用散列的理由:它不是建模理想的,但它在计算上很有帮助。至于紧凑的二进制编码,从建模的角度来看并不是很好;参见例如datascience.stackexchange.com/a/54423/55122.
    • 我想你可以说是的。剩下的问题是二进制编码在什么时候优于散列,反之亦然。由于两者都添加了错误的关系,这真的很难说,但在这种情况下有这么多的冲突,我猜我会使用二进制编码。不幸的是,关于这个主题的研究并不多。
    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 2020-12-10
    • 2017-08-22
    • 2018-02-06
    • 2013-12-01
    • 2019-04-16
    • 2014-10-21
    • 2020-12-23
    相关资源
    最近更新 更多