繁体   English   中英

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

[英]How to do Multi-hot Encoding but with actual values instead of ones

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

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是电影 ID(字符串)的可变长度列表的 batch_size 大小的列表, 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 ...

不使用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.]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM