基于隐式反馈将Python字典转矩阵的最优模型配置及实现问询
解决嵌套用户-艺术家播放数据转矩阵的问题
嘿,我完全懂你碰到的麻烦!用DictVectorizer处理这种嵌套的用户-艺术家播放记录确实不对路子——它本来是用来把单个样本的特征字典转成向量的,但咱们这里的需求是构建一个用户×艺术家的评分矩阵,每个单元格是播放次数(未收听为0),用它自然会卡在字符串艺术家的处理上,调参数根本解决不了核心问题。
给你两个实用的解决方案,都是我平时处理隐式反馈数据常用的:
方案一:手动构建矩阵(灵活可控)
如果喜欢自己把控每一步,可以手动提取所有用户和艺术家,初始化全0矩阵再填充数据:
import numpy as np # 假设你的嵌套字典是这样的:user_plays = {"user1": {"artistA": 5, "artistB": 2}, "user2": {"artistC": 3}} user_plays = {"user1": {"artistA": 5, "artistB": 2}, "user2": {"artistC": 3}} # 提取所有唯一用户和艺术家 users = list(user_plays.keys()) artists = list({artist for user in user_plays.values() for artist in user.keys()}) # 初始化全0矩阵 play_matrix = np.zeros((len(users), len(artists)), dtype=int) # 填充播放次数 for user_idx, user in enumerate(users): for artist, plays in user_plays[user].items(): artist_idx = artists.index(artist) play_matrix[user_idx][artist_idx] = plays print("用户列表:", users) print("艺术家列表:", artists) print("播放矩阵:\n", play_matrix)
这个方法的好处是你能清楚知道每个位置对应的用户和艺术家,后续做隐式模型(比如ALS、MF)的时候也方便映射回原始ID。
方案二:用Pandas一键转换(简洁高效)
如果想少写代码,Pandas的透视表功能简直是为这个需求量身定做的:
import pandas as pd # 把嵌套字典转成扁平的列表(用户, 艺术家, 播放次数) flat_data = [] for user, artist_plays in user_plays.items(): for artist, plays in artist_plays.items(): flat_data.append((user, artist, plays)) # 转成DataFrame df = pd.DataFrame(flat_data, columns=["user", "artist", "plays"]) # 构建透视表,未收听的自动填充0 play_matrix = df.pivot_table(index="user", columns="artist", values="plays", fill_value=0) print("播放矩阵:\n", play_matrix)
输出的结果是一个DataFrame,行是用户,列是艺术家,单元格就是播放次数,直接可以拿去给隐式反馈模型(比如implicit库的ALS模型)用,非常方便。
为啥DictVectorizer不行?
最后说句题外话:DictVectorizer的作用是把每个样本的特征字典(比如{"age": 25, "gender": "male"})转成one-hot编码的向量,但咱们这里的每个用户对应的是多个艺术家的播放次数,它会把每个艺术家当成一个独立的布尔特征(有没有听过),而不是保留播放次数作为特征值,所以不管怎么调参数都没法得到你想要的量化播放次数矩阵。
内容的提问来源于stack exchange,提问作者Mr. Jibz
相关产品推荐
相关产品推荐

