【问题标题】:getting error while forming train matrix in book recommendation system在图书推荐系统中形成训练矩阵时出错
【发布时间】:2025-11-23 21:10:01
【问题描述】:

我是数据科学的新手,在通过协同过滤创建图书推荐系统时遇到问题。有人可以就以下错误提出建议。

import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np

data  = pd.read_csv('BX-Book-Ratings.csv',engine = 'python')
df = data.iloc[1:10000,:]
print(df)
print(df.dtypes)
df['isbn']= pd.to_numeric(df['isbn'], errors = 'coerce')
df = df[np.isfinite(df).all(1)]
df['isbn'] = df['isbn'].astype(np.int64)

from sklearn.model_selection import train_test_split
n_users = df.user_id.unique().shape[0] 
n_book = df.isbn.unique().shape[0]
train_data, test_data = train_test_split(df, test_size=0.5)
print(n_users , n_book)
train_data_matrix = np.zeros((n_users, n_book))
for line in train_data.itertuples():
    #[user_id index, book_id index] = given rating.
    train_data_matrix[line[1] - 1, line[2] - 1] = line[3] 
train_data_matrix
--------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-125-caa0bcd40167> in <module>
      2 for line in train_data.itertuples():
      3     #[user_id index, book_id index] = given rating.
----> 4     train_data_matrix[line[1] - 1, line[2] - 1] = line[3]
      5 train_data_matrix

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

【问题讨论】:

  • 据我从您的代码中了解到,您试图通过从每个字段中减去 1 作为训练数据部分的 isbn 字段作为索引。问题是 isbn 值不能反映我猜的实际索引,也可能不在数据框的范围内。

标签: python-3.x data-science collaborative-filtering


【解决方案1】:

最可能的错误原因是索引值不匹配。 我可以看到 ISBN 是 int 类型,但是 user_id 呢??

修复:

解决方法是为这些 n_users * n_book 创建一个唯一索引。

  • Method1 : 这可以使用另一个独特的来创建 消费者和项目的数据框并使用其索引。

  • 方法2:创建一个字典并使用唯一值作为键和一些索引。

现在使用的任何方法都应该在其余过程中保持一致,否则将导致不匹配 书目评分。

此修复使用方法 2。

# Method2
user_dict= {}
for item,value in enumerate(df.user_id.unique().tolist()):
    consumer_dict[value]= item



book_dict = {}
for item, value in enumerate(df.isbn.unique().tolist()):
    item_dict[value] = item                       

print(len(user_dict.keys()), len(book_dict.keys()))

for line in train.itertuples():
    row_index = user_dict[line[1]]
    col_index = book_dict[line[2]]
    data_matrix[row_index, col_index] = line[3]

希望这会有所帮助,数据快照可能有助于解决此问题。

【讨论】: