You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在混合数据集经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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:42:41