【问题标题】:How to handle 0 entries in book crossing dataset如何处理图书交叉数据集中的 0 个条目
【发布时间】:2017-02-22 01:09:46
【问题描述】:

我正在使用书 crossing Data-set,它有一个文件给出了用户 X 对书 Y 的评分,但很多条目包含值 0,这意味着用户 X 喜欢书 Y,但没有给它评分。我正在使用协同过滤,因此这 0 个条目给我带来了问题,就好像取 0 一样,它们会降低这本书的整体评分。

我是数据科学领域的新手,有人能帮忙解决这个问题吗?

我能想到的是用用户的平均图书评分替换 0 评分,但我没有任何论据来支持我的想法。

【问题讨论】:

  • 我的建议是将所有评级提高1。在这种情况下,您将获得那些喜欢但未评分书籍的最低评分,因为0 将转换为1
  • @qmaruf 对书籍评分的评分是从 1-10 ,即使我将 0 增加到 1 ,与其他书籍相比,它仍然会有偏差,例如对书籍 7 、 8 评分的用户, 8、7。拥有一本书的评分为 1 意味着他不喜欢这本书,但事实并非如此,他只是没有给这本书评分。
  • 您正在比较定量和定性评级,因此这本身就很棘手。如果用户喜欢某样东西但也对其进行评分,您可能需要使用交叉验证进行测试,以查看哪个推荐更好(喜欢 = 1、喜欢 = 平均、喜欢 = 9)。要了解有关推荐系统评估的更多信息,请从这个 quora 问题开始:quora.com/…
  • 这不是关于编程的问题 - 我建议在 Cross Validated 上发帖

标签: python pandas machine-learning data-science


【解决方案1】:

ISBN码很乱,包含很多不正确的ISBN,而且不统一。

这里只是几个例子:

"User-ID";"ISBN";"Book-Rating"
"11676";" 9022906116";"7"
"11676";"\"0432534220\"";"6"
"11676";"\"2842053052\"";"7"
"11676";"0 7336 1053 6";"0"
"11676";"0=965044153";"7"
"11676";"0000000000";"9"
"11676";"00000000000";"8"
"146859";"01402.9182(PB";"7"
"158509";"0672=630155(P";"0"
"194500";"(THEWINDMILLP";"0"

所以我建议先清理一下:

df.ISBN = df.ISBN.str.replace(r'[^\w\d]+', '')

然后计算平均收视率:

avg_ratings = df.groupby('ISBN')['Book-Rating'].mean().round().astype(np.int8)

最后设置这些书的平均评分,评分为零:

df.loc[df['Book-Rating'] == 0, 'Book-Rating'] = df.loc[df['Book-Rating'] == 0, 'ISBN'].map(avg_ratings)

更新:

从 Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers 开始。

【讨论】:

  • 我们需要将用户 X 给出的评分替换为书 Y(如果它是 0),根据你的方式,书 Y 的评分对于所有用户来说都是相同的(如果那里是 0)跨度>
  • 我们需要将用户 X 给出的评分替换为书 Y(如果它是 0),根据你的方式,书 Y 的评分对于所有用户来说都是相同的(如果那里是 0),是那不是错了吗?
  • @risabh,那么你想如何计算平均评分?
猜你喜欢
  • 2018-10-05
  • 2017-11-03
  • 2016-12-23
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多