基于KNeighborsClassifier的有声书推荐系统预测结果固定问题求助
有声书推荐系统预测结果固定问题排查与解决
核心问题:用户输入数据未被使用
你的代码里,__init__方法的参数book被后续的book = pd.read_csv("dataset.csv", delimiter = ";")直接覆盖,导致用户输入的数据根本没传入预测环节。最后预测用的是数据集的第一行(dataframe.iloc[[0]]),所以不管输入什么,都会返回这一行对应的书名。
其他潜在问题
- 未进行数据归一化:KNN算法对特征尺度敏感,像
ratings_count_converted这类数值范围大的特征会主导距离计算,导致预测结果偏差。 - 未拆分训练集与测试集:导入了
train_test_split但未使用,无法验证模型泛化能力。 - 模型参数未调整:默认K值(k=5)可能不适合你的数据集,需要根据情况调整。
修复后的代码示例
from sklearn.neighbors import KNeighborsClassifier import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler class SuggestAudiobook: def __init__(self, user_input_data): # 加载数据集 book_df = pd.read_csv("dataset.csv", delimiter=";") # 分离特征与目标变量 X = book_df[["audioRuntime_converted", "category_converted", "average_rating_converted", "ratings_count_converted"]] y = book_df.Title.astype('string') # 特征归一化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 拆分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) # 初始化并训练模型(可调整K值,比如k=3) model = KNeighborsClassifier(n_neighbors=3) model.fit(X_train, y_train) # 处理用户输入数据:转为DataFrame并归一化 user_df = pd.DataFrame([user_input_data], columns=X.columns) user_scaled = scaler.transform(user_df) # 进行预测 prediction = model.predict(user_scaled) print("推荐的有声书是 --> ", prediction[0]) # 使用示例:传入用户输入的特征数据 # user_input = {"audioRuntime_converted": 120, "category_converted": 2, "average_rating_converted": 4, "ratings_count_converted": 500} # SuggestAudiobook(user_input)
关键修复点说明
- 保留用户输入:将参数名改为
user_input_data,避免与数据集变量冲突,确保用户数据传入预测。 - 特征归一化:用
StandardScaler统一特征尺度,解决KNN对特征范围敏感的问题。 - 拆分数据集:使用
train_test_split拆分训练集和测试集,便于评估模型效果。 - 正确预测用户输入:将用户输入转为符合模型要求的格式,经过归一化后再预测。
内容的提问来源于stack exchange,提问作者raffaele de france
相关产品推荐
相关产品推荐

