如何进行多热编码但使用实际值而不是实际值

Posted

技术标签:

【中文标题】如何进行多热编码但使用实际值而不是实际值【英文标题】:How to do Multi-hot Encoding but with actual values instead of ones 【发布时间】:2021-12-16 21:03:14 【问题描述】:

我可以通过以下方式对电影评分执行多热编码:

from sklearn.preprocessing import MultiLabelBinarizer


def multihot_encode(actual_values, ordered_possible_values) -> np.array:
    """ Converts a categorical feature with multiple values to a multi-label binary encoding """
    mlb = MultiLabelBinarizer(classes=ordered_possible_values)
    binary_format = mlb.fit_transform(actual_values)
    return binary_format

user_matrix = multihot_encode(lists_of_movieIds, all_movieIds)

其中arr_of_movieIds 是一个batch_size 大小的可变长度电影ID 列表(字符串)列表,all_movieIds 是所有可能的电影ID 字符串。

但是,我希望得到用户对电影的实际评分,而不是结果矩阵上的 1。就像list_of_movieIds 一样,我也可以访问与list_of_ratings 的“平行”。

我该如何有效地做到这一点?是否有另一个 MultiLabelBinarizer 将它们作为参数?我可以做一些花哨的线性代数吗?

我试着这样做:

user_matrix[user_matrix == 1] = np.concatenate(list_of_ratings)

但评级放错了,因为list_of_ratings 的排序方式与all_movieIds 不同...

【问题讨论】:

【参考方案1】:

不使用MultiLabelBinarizer

import numpy as np
classes=['comedy', 'xyz','thriller', 'sci-fi']
id_dict = c:i for i,c in enumerate(classes)
lists_of_movieIds = ['sci-fi', 'thriller', 'comedy']
list_of_ratings = [[4,3],[5]]

data = np.zeros((len(lists_of_movieIds), len(classes)))
for i, (m_ids,rs) in enumerate(zip(lists_of_movieIds, list_of_ratings)):
  for m_id,r in zip(m_ids,rs):
    data[i, id_dict[m_id]] = r

print (data)

输出:

[[0. 0. 3. 4.]
 [5. 0. 0. 0.]]

【讨论】:

感谢您的回答,但重点是避免 python for 循环并使用矢量化操作,因为我相信这会更慢。 我最终在创建 movieId 时对我的数据集进行了排序,并使用我在帖子中提到的屏蔽方法作为临时(如果我没有找到更好的方法,可能是永久性的)和有风险的解决方案。跨度>

以上是关于如何进行多热编码但使用实际值而不是实际值的主要内容,如果未能解决你的问题,请参考以下文章