Python 如何处理图书交叉数据集中的0个条目

Python 如何处理图书交叉数据集中的0个条目,python,pandas,machine-learning,data-science,Python,Pandas,Machine Learning,Data Science,我正在使用book,它有一个文件,其中给出了用户X对book Y的评分,但许多条目包含值0,这意味着用户X喜欢book Y,但没有给它评分。我使用的是协同过滤,因此这0个条目给我带来了问题,好像取了0,它们会降低书的整体评级 我是数据科学领域的新手,有人能帮我解决这个问题吗 我能想到的是用用户的平均图书评级代替0评级,但我没有任何论据支持我的想法。ISBN代码非常混乱,包含大量不正确的ISBN,并且不统一 以下只是几个例子: "User-ID";"ISBN";"Book-Rating" "116

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

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


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

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)

更新:


从0.20.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)

更新:


从0.20.1开始

我的建议是将所有评分提高
1
。在这种情况下,您将获得那些喜欢但没有评级的书籍的最低评级,因为
0
将转换为
1
@qmaruf因为评级书籍的评级从1到10,即使我将0增加到1,与其他书籍相比,它仍然是有偏差的,比如对书籍7、8、8、7进行评级的用户。拥有一本评级为1的书意味着他不喜欢这本书,但事实并非如此,他只是没有对这本书进行评级。你在比较定量和定性评级,这本身就很棘手。如果用户可以喜欢某样东西,但也可以对其进行评分,那么您可能需要使用交叉验证进行测试,以查看哪个建议更好(like=1,like=average,like=9)。要了解有关推荐系统评估的更多信息,这个quora问题是一个很好的起点:这不是一个关于编程的问题-我建议发布我的建议,将所有评分提高
1
。在这种情况下,您将获得那些喜欢但没有评级的书籍的最低评级,因为
0
将转换为
1
@qmaruf因为评级书籍的评级从1到10,即使我将0增加到1,与其他书籍相比,它仍然是有偏差的,比如对书籍7、8、8、7进行评级的用户。拥有一本评级为1的书意味着他不喜欢这本书,但事实并非如此,他只是没有对这本书进行评级。你在比较定量和定性评级,这本身就很棘手。如果用户可以喜欢某样东西,但也可以对其进行评分,那么您可能需要使用交叉验证进行测试,以查看哪个建议更好(like=1,like=average,like=9)。要了解更多关于推荐系统评估的信息,这个quora问题是一个很好的起点:这不是一个关于编程的问题-我建议发布在我们需要将用户X给出的评级替换为book Y(如果为0)的页面上。根据您的方式,book Y的评级对于所有用户都是相同的(如果为0)我们需要将用户X给book Y的评分替换为(如果是0)根据您的方式,book Y的评分对所有用户都是相同的(如果是0),这不是错了吗?@rishabh,您想如何计算平均评分?我们需要将用户X给book Y的评分替换为(如果是0)根据你的方式,书Y的评分对所有用户都是相同的(如果是0),我们需要替换用户X给书Y的评分(如果是0),根据你的方式,书Y的评分对所有用户都是相同的(如果是0),这不对吗?@rishabh,那么,您想如何计算平均评级?