我正在研究一个推荐问题,大致遵循他们的Youtube 论文。他们的代理问题是推荐用户将观看的下一个视频。他们在模型中包含的一个功能是表示观看历史记录(即用户观看了哪些视频),他们通过嵌入视频 ID 然后对该嵌入进行平均来实现这一点。
所以对于数据,他们可能...
[
[1234, 5678, 9012],
[1234],
[9012, 1234, 8245],
]
并且这些 ID 中的每一个都嵌入到 8 个特征中,这 8 个特征对训练数据中的每个观察值进行平均,这 8 个平均特征输入到网络的深层。
tf.keras.preprocessing.sequence.pad_sequences现在我可以使用plusEmbedding()和的组合在 keras 中复制它GlobalAveragePooling1D(),并且效果相当好。我的问题是我想评估其他算法来解决同样的问题(毕竟,我的数据比 Youtube 少得多,所以我不确定我是否需要一个 NN)。我无法真正概念化如何处理这种历史“手表”的编码,尽管它可以在更传统的算法(如 sklearn 中的 XGBoost 或 RandomForests)中工作。Ordinal Encoding 和取平均值看起来很傻,我显然不能 OneHot 编码第 1 到第 n 个视频观看等等。任何有关如何解决此问题的想法将不胜感激。
编辑:
我想可能的FeatureHasher符合要求?它不是一个平均值,而是生成每个散列输入类别的总和。这仍然(默认情况下)会导致成千上万的功能,所以我不确定它是否会比 OneHotEncoding 有重大改进!
编辑2:
或者,也许我可以通过将类别数组连接成单个字符串并使用 CountVectorizer 创建一个 (n_samples, n_categories) 数组,然后使用TruncatedSVD将其减少到更易于管理的组件数量,将其视为文本嵌入问题。
我想我有几个想法,有人知道它们是否值得一试吗?