【问题标题】: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 不同...

【问题讨论】:

    标签: python numpy scikit-learn one-hot-encoding multi-hot-encoding


    【解决方案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 时对我的数据集进行了排序,并使用我在帖子中提到的屏蔽方法作为临时(如果我没有找到更好的方法,可能是永久性的)和有风险的解决方案。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多