【Python百宝箱】个性化推荐算法探幽:从协同过滤到深度学习,推荐系统库选择指南

2023-12-28 14:44:15

个性化推荐:Surprise、LightFM、Implicit、Cornac、TuriCreate、Spotlight全方位解析

前言

在当今数字时代,推荐系统在引导用户发现个性化内容、产品和体验方面发挥着至关重要的作用。本文深入探讨了推荐系统领域的多个先进工具和库,为读者提供了全面而深刻的了解。无论您是开发人员、数据科学家还是对推荐技术感兴趣的业务专业人士,这篇文章将为您揭示推荐系统的最新趋势和最佳实践。

欢迎订阅专栏:Python库百宝箱:解锁编程的神奇世界

1. Surprise

1.1 协同过滤

协同过滤是推荐系统中常用的方法,基于用户或物品的相似性来进行推荐。下面是使用Surprise库实现基于用户的协同过滤的简单示例:

from  surprise import Dataset, Reader
from surprise.model_selection import cross_validate
from surprise import KNNBasic

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)

# 使用KNNBasic算法进行基于用户的协同过滤
sim_options = {'name': 'cosine', 'user_based': True}
knn_model = KNNBasic(sim_options=sim_options)

# 交叉验证评估模型性能
cross_validate(knn_model, data, measures=['RMSE'], cv=5, verbose=True)
1.2 基于模型的方法

Surprise支持基于模型的方法,其中矩阵分解是一个常见的技术。以下是一个使用SVD(奇异值分解)的示例:

from surprise import SVD
from surprise.model_selection import train_test_split
from surprise import accuracy

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)
trainset, testset = train_test_split(data, test_size=0.2)

# 使用SVD进行矩阵分解
svd_model = SVD()
svd_model.fit(trainset)

# 预测并评估模型性能
predictions = svd_model.test(testset)
accuracy.rmse(predictions)
1.3 交叉验证技术

Surprise支持交叉验证来评估推荐算法的性能。以下是一个交叉验证的示例:

from surprise.model_selection import cross_validate
from surprise import KNNBasic

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)

# 使用KNNBasic算法进行交叉验证
sim_options = {'name': 'cosine', 'user_based': True}
knn_model = KNNBasic(sim_options=sim_options)

# 交叉验证评估模型性能
cross_validate(knn_model, data, measures=['RMSE'], cv=5, verbose=True)
1.4 网格搜索优化参数

Surprise库允许使用网格搜索优化模型参数,以提高推荐算法的性能。下面是一个网格搜索的示例,通过调整KNNBasic算法的邻居数量和相似性度量来找到最佳参数组合:

from surprise.model_selection import GridSearchCV

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)

# 定义参数网格
param_grid = {'k': [20, 30, 40], 'sim_options': {'name': ['cosine', 'pearson']}}

# 使用网格搜索优化参数
grid_search = GridSearchCV(KNNBasic, param_grid, measures=['RMSE'], cv=3)
grid_search.fit(data)

# 输出最佳参数和性能指标
print(f'Best RMSE Score: {grid_search.best_score["rmse"]}')
print(f'Best Parameters: {grid_search.best_params["rmse"]}')
1.5 推荐新用户

在推荐系统中,当面临新用户时,需要一种方法来为其生成推荐。Surprise库提供了build_anti_testset方法,该方法可以为新用户生成未评分的项目列表。以下是一个示例:

from  surprise.model_selection import train_test_split
from surprise import SVD, Dataset, Reader

# 数据准备
reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('ratings.csv', reader=reader)
trainset, testset = train_test_split(data, test_size=0.2)

# 使用SVD进行矩阵分解
svd_model = SVD()
svd_model.fit(trainset)

# 生成新用户的未评分项目列表
new_user_id = 1000
new_user_items = data.build_anti_testset(fill=0)['user_id'] == new_user_id

# 针对新用户进行预测
predictions = svd_model.test(new_user_items)

# 输出推荐结果
print(f'Recommendations for New User {new_user_id}: {predictions}')

通过以上拓展,我们介绍了网格搜索优化参数和为新用户生成推荐的方法,为读者提供更全面的Surprise库使用指南。接下来,我们将深入探讨LightFM库的关键特性。

2. LightFM

2.1 混合模型

LightFM支持混合模型,结合了协同过滤和内容过滤的优势。以下是一个示例:

from lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 训练混合模型
model.fit(data['train'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], k=5).mean()
print(f'Precision: {precision}')
2.2 内容加权混合

在LightFM中,您可以使用物品的内容信息对推荐进行加权。以下是一个简单的示例:

from  lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 将物品内容信息加入模型
model = model.fit(data['train'], item_features=data['item_features'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], item_features=data['item_features'], k=5).mean()
print(f'Precision: {precision}')
2.3 整合用户和物品特征

LightFM能够整合用户和物品的特征进行推荐。以下是一个示例:

from  lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 将用户和物品特征加入模型
model = model.fit(data['train'], user_features=data['user_features'], item_features=data['item_features'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], user_features=data['user_features'], item_features=data['item_features'], k=5).mean()
print(f'Precision: {precision}')
2.4 内置评估指标

LightFM提供了多种内置的评估指标,用于评估模型的性能。以下是一个使用AUC指标的示例:

from lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import auc_score

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 训练模型
model = model.fit(data['train'], epochs=30, num_threads=2)

# 使用AUC指标评估模型性能
auc = auc_score(model, data['test'], num_threads=2).mean()
print(f'AUC Score: {auc}')
2.5 多线程训练

为了提高训练速度,LightFM支持多线程训练。以下是一个使用两个线程进行训练的示例:

from lightfm import LightFM
from lightfm.datasets import fetch_movielens
from lightfm.evaluation import precision_at_k

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 多线程训练模型
model = model.fit(data['train'], epochs=30, num_threads=2)

# 评估模型性能
precision = precision_at_k(model, data['test'], k=5, num_threads=2).mean()
print(f'Precision: {precision}')
2.6 保存和加载模型

LightFM允许用户保存训练好的模型以备将来使用。以下是保存和加载模型的示例:

from  lightfm import LightFM
from lightfm.datasets import fetch_movielens

# 数据准备
data = fetch_movielens()
model = LightFM(loss='warp')  # 使用WARP损失进行训练

# 训练模型
model = model.fit(data['train'], epochs=30, num_threads=2)

# 保存模型
model.save('saved_model')

# 加载模型
loaded_model = LightFM()
loaded_model = loaded_model.load('saved_model')

通过这些补充,我们更深入地探讨了LightFM库的特性,包括内容加权混合、整合用户和物品特征、内置评估指标、多线程训练以及保存和加载模型等方面。在接下来,我们将深入研究Implicit库的功能和应用。

3. Implicit

3.1 隐式反馈

Implicit库专注于处理隐式反馈数据的推荐系统。以下是一个简单的使用示例:

import implicit
import numpy as np
import scipy.sparse as sparse 

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用ALS算法进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
model.fit(sparse_data)

# 进行推荐
user_id = 0
recommendations = model.recommend(user_id, sparse_data)
print(f'Recommendations for User {user_id}: {recommendations}')
3.2 矩阵分解

Implicit库支持矩阵分解技术,其中ALS(Alternating Least Squares)是其中之一。以下是一个示例:

import implicit
import numpy as np
import scipy.sparse as sparse

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用ALS算法进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
model.fit(sparse_data)

# 获取物品的潜在特征向量
item_id = 2
item_vector = model.item_factors[item_id]
print(f'Latent Feature Vector for Item {item_id}: {item_vector}')
3.3 交替最小二乘(ALS)算法

ALS算法是Implicit库中的一种矩阵分解方法。以下是一个示例:

import implicit
import numpy as np
import scipy.sparse as sparse

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用ALS算法进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
model.fit(sparse_data)

# 获取用户的潜在特征向量
user_id = 1
user_vector = model.user_factors[user_id]
print(f'Latent Feature Vector for User {user_id}: {user_vector}')
3.4 超参数调优

在Implicit库中,您可以通过调整超参数以优化模型性能。以下是一个使用Grid Search调优ALS算法的示例:

import implicit
import numpy as np
import scipy.sparse as sparse
from implicit.evaluation import train_test_split, precision_at_k

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 拆分训练集和测试集
train_data, test_data = train_test_split(sparse_data)

# 定义超参数网格
param_grid = {'factors': [20, 50, 100], 'regularization': [0.01, 0.1, 1.0]}

# 使用Grid Search调优ALS算法
best_precision = 0
best_params = None
for factors in param_grid['factors']:
    for regularization in param_grid['regularization']:
        model = implicit.als.AlternatingLeastSquares(factors=factors, regularization=regularization)
        model.fit(train_data)
        precision = precision_at_k(model, test_data, K=5).mean()
        if precision > best_precision:
            best_precision = precision
            best_params = {'factors': factors, 'regularization': regularization}

print(f'Best Precision: {best_precision}')
print(f'Best Parameters: {best_params}')
3.5 使用BM25加权

在Implicit库中,您可以使用BM25加权来提升推荐性能。以下是一个示例:

import implicit
import numpy as np
import scipy.sparse as sparse 

# 构建一个稀疏矩阵表示用户-物品交互(隐式反馈)
data = np.array([[0, 1, 1, 0],
                 [1, 1, 0, 1],
                 [1, 0, 1, 0]])
sparse_data = sparse.csr_matrix(data.T)

# 使用BM25加权进行矩阵分解
model = implicit.als.AlternatingLeastSquares(factors=50)
weighted_data = (sparse_data * 5).astype('double')  # 通过乘以权重来加权
model.fit(weighted_data)

# 进行推荐
user_id = 0
recommendations = model.recommend(user_id, sparse_data)
print(f'Recommendations for User {user_id}: {recommendations}')

通过以上拓展,我们更深入地介绍了Implicit库的功能,包括超参数调优、使用BM25加权等方面。接下来,我们将深入研究Cornac库,了解其评估指标和神经推荐模型。

4. Cornac

4.1 评估指标

Cornac库提供多种评估指标,用于评估推荐系统性能。以下是一个示例:

from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.evaluation import BaseMethod, RatioSplit
from cornac.eval_methods import BaseMethod
from cornac.models import MostPop, BPR

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估指标
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0)
most_pop_model = MostPop()
bpr_model = BPR()

# 评估最流行模型
most_pop_results = most_pop_model.evaluate(eval_method)
print(f'Most Popular Model Results: {most_pop_results}')

# 评估BPR模型
bpr_results = bpr_model.evaluate(eval_method)
print(f'BPR Model Results: {bpr_results}')
4.2 神经推荐模型

Cornac支持使用神经网络的推荐模型。以下是一个简单的示例:

from cornac.models import NeuMF
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import BaseMethod, RatioSplit

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0)

# 创建NeuMF模型
neumf_model = NeuMF(
    num_factors=8,
    layers=[16, 8, 4],
    act_fn='tanh',
    learner='adam',
    early_stopping=True,
    verbose=True
)

# 训练和评估模型
neumf_model.fit(eval_method)
results = neumf_model.evaluate(eval_method, metric=['precision', 'recall', 'ndcg'])
print(f'NeuMF Model Results: {results}')
4.3 推荐系统中的时间动态

Cornac能够处理推荐系统中的时间动态。以下是一个示例:

from cornac.models import TimeSVDpp
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import BaseMethod, RatioSplit

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0, timestamp=True)

# 创建TimeSVD++模型
time_svdpp_model = TimeSVDpp(
    factors=15,
    svdpp_steps=10,
    n_epochs=20,
    init_mean=0,
    init_std_dev=0.1,
    lr_all=0.007,
    reg_all=0.02
)

# 训练和评估模型
time_svdpp_model.fit(eval_method)
results = time_svdpp_model.evaluate(eval_method, metric=['precision', 'recall', 'ndcg'])
print(f'TimeSVD++ Model Results: {results}')
4.4 多样性评估指标

Cornac库还支持多样性评估指标,用于度量推荐结果的多样性。以下是一个示例:

from cornac.models import ItemKNN
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import BaseMethod, RatioSplit
from cornac.metrics import Diversity

# 数据准备
reader = Reader()
train_data = MovieLens('100k', rating_threshold=4.0)
test_data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = RatioSplit(data=train_data, test_size=0.2, rating_threshold=4.0)

# 创建ItemKNN模型
item_knn_model = ItemKNN(k=50, similarity='cosine', name='ItemKNN')

# 训练和评估模型
item_knn_model.fit(eval_method)
results = item_knn_model.evaluate(eval_method, metrics=[Diversity('diversity')])
print(f'ItemKNN Model Diversity: {results["diversity"]}')
4.5 使用交叉验证

Cornac支持交叉验证来评估推荐算法的性能。以下是一个示例:

from cornac.models import MostPop
from cornac.data import Reader
from cornac.datasets import MovieLens
from cornac.eval_methods import CrossValidation

# 数据准备
reader = Reader()
data = MovieLens('100k', rating_threshold=4.0)

# 评估方法
eval_method = CrossValidation(data=data, num_folds=5, rating_threshold=4.0)

# 创建Most Popular模型
most_pop_model = MostPop()

# 交叉验证评估模型
results = most_pop_model.evaluate(eval_method)
print(f'Most Popular Model Cross-Validation Results: {results}')

通过以上拓展,我们更深入地介绍了Cornac库的功能,包括评估指标、神经推荐模型、推荐系统中的时间动态、多样性评估指标以及使用交叉验证等方面。接下来,我们将深入研究TuriCreate库,了解其数据预处理和基于图的模型。

5. TuriCreate

5.1 数据预处理

TuriCreate提供了方便的数据预处理工具,可用于简化数据准备过程。以下是一个示例:

import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 拆分数据集为训练集和测试集
train_data, test_data = tc.recommender.util.random_split_by_user(data, 'userId', 'movieId')    

# 查看数据
print(train_data.head())
5.2 基于图的模型

TuriCreate支持基于图的模型,其中可以使用用户和物品之间的关系进行推荐。以下是一个示例:

import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建图对象
graph = tc.SGraph()

# 添加边(用户-物品关系)
graph = graph.add_edges(data, src_field='userId', dst_field='movieId')

# 创建基于图的推荐模型
model = tc.recommender.create(graph, user_id='userId', item_id='movieId', target='rating')
5.3 推荐系统的深度学习

TuriCreate具备深度学习功能,可以用于构建更复杂的推荐系统。以下是一个简单的深度学习推荐模型示例:

import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建深度学习推荐模型
model = tc.recommender.create(data, user_id='userId', item_id='movieId', target='rating',
                               ranking_factorization_model='deep', max_iterations=50) 
5.4 特征工程和标准化

TuriCreate支持特征工程和标准化,以提高推荐模型的性能。以下是一个示例:

import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建特征
data['interaction'] = data['rating'] * 0.1

# 创建特征工程模型
feature_engineering_model = tc.feature_engineering.create(data, 'interaction')

# 获取转换后的数据
transformed_data = feature_engineering_model.transform(data)

# 标准化数据
normalized_data = tc.toolkits._internal_utils._normalize(transformed_data, ['interaction'])
5.5 模型调参

TuriCreate允许用户调整推荐模型的参数以优化性能。以下是一个示例:

import turicreate as tc

# 读取数据
data = tc.SFrame.read_csv('ratings.csv')

# 创建深度学习推荐模型
model = tc.recommender.create(data, user_id='userId', item_id='movieId', target='rating',
                               ranking_factorization_model='deep', max_iterations=50, 
                               linear_regularization=0.01, ranking_regularization=0.1)

通过这些补充,我们更深入地介绍了TuriCreate库的功能,包括数据预处理、基于图的模型、推荐系统的深度学习、特征工程和标准化以及模型调参等方面。在接下来,我们将深入研究Spotlight库,了解其序列感知推荐和推荐中的时间效应。

6. Spotlight

6.1 序列感知推荐

Spotlight库适用于考虑用户行为序列的推荐场景。以下是一个示例:

from spotlight.interactions import Interactions
from spotlight.cross_validation import random_train_test_split
from spotlight.evaluation import sequence_mrr_score
from spotlight.sequence.implicit import ImplicitSequenceModel

# 读取数据
data = Interactions.from_csv('sequence_data.csv', sep=',')

# 拆分训练集和测试集
train, test = random_train_test_split(data)

# 创建序列感知推荐模型
model = ImplicitSequenceModel(n_iter=3, representation='lstm', loss='bpr')
model.fit(train, verbose=True)

# 评估模型性能
mrr = sequence_mrr_score(model, test)
print(f'Mean Reciprocal Rank (MRR): {mrr}')
6.2 推荐中的时间效应

Spotlight允许在推荐中考虑时间效应。以下是一个带有时间效应的示例:

from  spotlight.interactions import Interactions
from spotlight.cross_validation import random_train_test_split
from spotlight.evaluation import precision_recall_score
from spotlight.sequence.implicit import ImplicitSequenceModel

# 读取带时间信息的数据
data = Interactions.from_csv('temporal_data.csv', sep=',', time_col='timestamp')

# 拆分训练集和测试集
train, test = random_train_test_split(data)

# 创建带时间效应的推荐模型
model = ImplicitSequenceModel(n_iter=3, representation='lstm', loss='bpr', use_timestamps=True)
model.fit(train, verbose=True)

# 评估模型性能
precision, recall = precision_recall_score(model, test)
print(f'Precision: {precision}, Recall: {recall}')
6.3 用于序列数据的循环神经网络

Spotlight支持使用循环神经网络(RNN)处理序列数据。以下是一个示例:

from   spotlight.interactions import Interactions
from spotlight.cross_validation import random_train_test_split
from spotlight.evaluation import precision_recall_score
from spotlight.sequence.implicit import ImplicitSequenceModel

# 读取序列数据
data = Interactions.from_csv('sequence_data.csv', sep=',')

# 拆分训练集和测试集
train, test = random_train_test_split(data)

# 创建使用RNN的序列推荐模型
model = ImplicitSequenceModel(n_iter=3, representation='rnn', loss='bpr')
model.fit(train, verbose=True)

# 评估模型性能
precision, recall = precision_recall_score(model, test)
print(f'Precision: {precision}, Recall: {recall}')

总结

推荐系统的不断演进为用户提供了更加个性化、智能化的体验。Surprise、LightFM、Implicit、Cornac、TuriCreate和Spotlight等工具的介绍为读者提供了在构建和优化推荐系统时的多种选择。无论是基于协同过滤、深度学习还是考虑时间动态,本文提供的示例代码将帮助读者深入了解并应用这些先进的推荐技术。

文章来源:https://blog.csdn.net/qq_42531954/article/details/135198877
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。