如何在混合数据集经One-Hot编码后用Sklearn/Pandas实现KNN推荐系统
嘿,作为机器学习新手能想到用KNN来做无用户数据的物品推荐,这个思路真的很棒!咱们一步步来拆解怎么把One-Hot编码和KNN结合起来,还有一些适合你场景的其他方法~
一、先理清楚你的数据处理逻辑
你的场景是无用户交互数据、只有物品混合特征的物品推荐,属于「物品-物品协同过滤」的冷启动场景,KNN完全适用,但得先把所有特征转换成模型能理解的数值型数据才行。
1. 特征分类与针对性编码
先把你的特征分成三类,分别处理:
- 数值型特征:
views(浏览量)、shares(分享数)这类直接用原始值,但建议做归一化/标准化(比如用StandardScaler),不然KNN计算距离时,数值大的特征会完全主导结果。 - 类别型特征:
categories(分类)、author(作者)这类离散类别,One-Hot编码正好适配!可以用sklearn.preprocessing.OneHotEncoder,记得设置handle_unknown='ignore',避免遇到新类别时出错。 - 文本型特征:
title(标题)这类直接用One-Hot会导致维度爆炸,建议用TF-IDF编码(sklearn.feature_extraction.text.TfidfVectorizer),把标题转换成低维的数值向量,更适合计算相似度。
2. 一站式合并所有特征
用sklearn.compose.ColumnTransformer可以一次性处理不同类型的特征,不用手动拼接,举个实操代码例子:
import pandas as pd from sklearn.preprocessing import OneHotEncoder, StandardScaler, TfidfVectorizer from sklearn.compose import ColumnTransformer from sklearn.neighbors import NearestNeighbors # 模拟你的物品数据 data = pd.DataFrame({ 'id': [1,2,3,4,5], 'title': ['机器学习入门', 'Python数据分析', 'KNN算法详解', '推荐系统实战', '深度学习基础'], 'categories': ['AI', '数据分析', 'AI', '推荐系统', 'AI'], 'author': ['张三', '李四', '张三', '王五', '赵六'], 'views': [1000, 2000, 1500, 3000, 800], 'shares': [50, 100, 75, 150, 30] }) # 定义不同特征的处理规则 preprocessor = ColumnTransformer( transformers=[ # 数值特征:标准化 ('num', StandardScaler(), ['views', 'shares']), # 类别特征:One-Hot编码 ('cat', OneHotEncoder(handle_unknown='ignore'), ['categories', 'author']), # 文本特征:TF-IDF编码 ('text', TfidfVectorizer(stop_words='中文'), 'title') ]) # 生成最终的特征矩阵 feature_matrix = preprocessor.fit_transform(data)
3. 训练KNN模型并生成推荐
接下来用NearestNeighbors(KNN的无监督版本,专门用来找最近邻),设置n_neighbors=4(因为要推荐3个,得把物品自身排除),然后针对目标物品找相似项:
# 初始化KNN模型,用余弦相似度(高维特征下比欧氏距离更稳定) knn_model = NearestNeighbors(metric='cosine', n_neighbors=4) knn_model.fit(feature_matrix) # 假设要给id=1的物品做推荐 target_idx = data[data['id'] == 1].index[0] # 找到最近的4个邻居(包含物品自身) distances, indices = knn_model.kneighbors(feature_matrix[target_idx]) # 输出排除自身后的Top3推荐 recommended_ids = data.iloc[indices[0][1:]]['id'].tolist() print(f"为物品{data.iloc[target_idx]['id']}推荐的相似物品ID:{recommended_ids}")
二、其他适合你场景的新手友好方法
除了KNN,还有几个简单易上手的方法可以试试:
- TF-IDF直接计算相似度:如果标题/标签是核心特征,直接用
sklearn.metrics.pairwise.cosine_similarity计算物品间的相似度,排序取Top3就行,代码更简洁。 - LightFM库:专门做推荐系统的工具,支持混合类型特征,即使没有用户数据,也能快速搭建「物品-物品」模式的推荐模型,自动处理特征编码,新手友好。
- 手动加权特征相似度:比如给分类特征的相似度权重设为0.5,标题相似度设为0.3,浏览量相似度设为0.2,手动加权后取Top3,理解起来更直观。
三、新手避坑提示
- 处理缺失值:先检查数据里有没有缺失的特征(比如某个物品没有author),用众数/均值填充后再编码,不然会报错。
- 特征权重调整:如果某个特征对推荐更重要(比如
categories比author关键),可以在预处理后给对应特征列乘以权重(比如给分类的One-Hot结果乘以2),让它在距离计算中占比更高。 - 维度爆炸应对:如果类别特征的取值特别多(比如有上百个作者),One-Hot会让特征矩阵过大,这时候可以换成
TargetEncoder(目标编码),不过要注意过拟合问题,新手可以先从One-Hot开始,遇到问题再调整。
内容的提问来源于stack exchange,提问作者sns
相关产品推荐
相关产品推荐

