[英]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.