swa*_*his 5 python recommendation-engine scikit-learn tensorflow nmf
我正在尝试使用非负矩阵分解构建推荐系统。使用scikit-learn NMF作为模型,我拟合我的数据,导致一定的损失(即重建误差)。然后,我使用inverse_transform方法生成新数据的推荐。
现在,我使用在 TensorFlow 中构建的另一个模型执行相同的操作。训练后的重建误差接近于之前使用 sklearn 方法获得的重建误差。然而,潜在因素和最终建议都不相同。
据我所知,这两种方法之间的区别之一是:在 sklearn 中,我使用坐标下降求解器,而在 TensorFlow 中,我使用基于梯度下降的 AdamOptimizer。其他一切似乎都是一样的:
我正在使用的相关代码:
1.scikit-learn方法:
model = NMF(alpha=0.0, init='random', l1_ratio=0.0, max_iter=200,
n_components=2, random_state=0, shuffle=False, solver='cd', tol=0.0001,
verbose=0)
model.fit(data)
result = model.inverse_transform(model.transform(data))
Run Code Online (Sandbox Code Playgroud)
2.TensorFlow方法:
w = tf.get_variable(initializer=tf.abs(tf.random_normal((data.shape[0],
2))), constraint=lambda p: tf.maximum(0., p))
h = tf.get_variable(initializer=tf.abs(tf.random_normal((2,
data.shape[1]))), constraint=lambda p: tf.maximum(0., p))
loss = tf.sqrt(tf.reduce_sum(tf.squared_difference(x, tf.matmul(w, h))))
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果这两种方法生成的建议不匹配,那么我如何确定哪些是正确的?根据我的用例,sklearn 的 NMF 给了我很好的结果,但 TensorFlow 实现却没有。如何使用我的自定义实现实现相同的目标?
优化器的选择对训练质量有很大影响。一些非常简单的模型(例如,我正在考虑 GloVe)确实可以与某些优化器配合使用,而与其他一些优化器则根本不起作用。然后,回答你的问题:
我如何确定哪些是正确的?
评估与模型的设计一样重要,也一样困难,即您可以尝试这两个模型和几个可用的数据集,并使用一些指标来对它们进行评分。您还可以在真实案例应用程序上使用 A/B 测试来估计建议的相关性。
如何使用我的自定义实现实现相同的目标?
首先,尝试为Tensorflow找到一个坐标下降优化器,并确保您实现的所有步骤与scikit-learn中的步骤完全相同。然后,如果您无法重现相同的结果,请尝试不同的解决方案(为什么不先尝试一个简单的梯度下降优化器?)并利用Tensorflow提供的强大模块化功能!
最后,如果您的实现提供的建议那么糟糕,我建议您其中存在错误。尝试与一些现有代码进行比较。
归档时间: |
|
查看次数: |
2320 次 |
最近记录: |