深度学习的协同过滤的推荐算法-毕设神器

简介: 深度学习的协同过滤的推荐算法-毕设神器


在当今的电子商务和娱乐平台中,个性化推荐系统已经成为了一种不可或缺的功能。本文将介绍如何使用Python实现协同过滤推荐算法,以便为用户提供个性化的商品推荐。


数据准备

我将使用一个包含用户ID、商品ID和评分的CSV文件作为我的数据源。我将会介绍如何加载和预处理这些数据,以便于用于训练和测试我的推荐模型。


模型训练

我将使用Surprise库来构建和训练协同过滤推荐模型。将详细介绍数据加载、参数调优、模型训练和评估等步骤,以确保我的模型能够在真实数据上取得良好的表现。


模型保存

一旦我训练好了模型,需要将其保存到文件中,以便之后的使用。我将展示如何将训练好的模型保存到磁盘中,并将模型的评估结果保存为JSON文件。


模型使用

最后,将展示如何加载保存的模型,并使用它为特定用户生成推荐。我将展示如何将训练好的模型应用到实际的推荐系统中。


下面是一个更为复杂的训练模块示例:

import os
import pandas as pd
from surprise import Dataset, Reader
from surprise import KNNWithMeans, SVD, NMF
from surprise import dump
from surprise.model_selection import cross_validate, GridSearchCV
from surprise.accuracy import rmse, mae
import json
import logging
# 设置日志记录
logging.basicConfig(level=logging.INFO, filename='training.log', filemode='w',
                    format='%(name)s - %(levelname)s - %(message)s')
# 数据预处理
def data_preprocessing(df):
    # 这里可以添加任何数据预处理步骤,例如:
    # 1. 删除重复项
    # 2. 处理缺失值
    # 3. 归一化或标准化
    # 4. 数据转换
    # 为了示例,我们只是简单地返回原始DataFrame
    return df
# 载入数据
def load_data(file_path):
    df = pd.read_csv(file_path)
    df = data_preprocessing(df)
    reader = Reader(line_format='user item rating', sep=',', skip_lines=1)
    data = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader)
    return data
# 参数调优
def tune_parameters(data, algo_class, param_grid, cv=3):
    gs = GridSearchCV(algo_class, param_grid, measures=['rmse', 'mae'], cv=cv)
    gs.fit(data)
    return gs.best_params['rmse'], gs.best_estimator['rmse']
# 训练模型
def train_model(data, algo):
    trainset = data.build_full_trainset()
    algo.fit(trainset)
    return algo
# 评估模型
def evaluate_model(algo, data):
    results = cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)
    logging.info(results)
    return results
# 保存模型和评估结果
def save_model_and_results(model, results, model_filename, results_filename):
    dump.dump(model_filename, algo=model)
    with open(results_filename, 'w') as f:
        json.dump(results, f)
# 主程序
def main():
    file_path = 'ratings.csv'  # 这里填写你的CSV文件路径
    model_filename = 'collaborative_filtering_model.pickle'  # 模型保存文件名
    results_filename = 'model_results.json'  # 保存模型评估结果的文件名
    data = load_data(file_path)
    # 定义多个算法及其参数网格进行调优
    algorithms = {
        'KNNWithMeans': {
            'algo': KNNWithMeans,
            'params': {
                'k': [10, 20, 30],
                'sim_options': {'name': ['cosine', 'pearson'], 'user_based': [True, False]}
            }
        },
        'SVD': {
            'algo': SVD,
            'params': {
                'n_factors': [50, 100, 150],
                'n_epochs': [20, 30],
                'lr_all': [0.005, 0.01],
                'reg_all': [0.02, 0.1]
            }
        },
        'NMF': {
            'algo': NMF,
            'params': {
                'n_factors': [15, 20, 25],
                'n_epochs': [50, 100],
            }
        }
    }
    # 保存最佳模型的信息
    best_model_info = {}
    # 对每个算法进行参数调优
    for algo_name, algo_data in algorithms.items():
        logging.info(f"开始参数调优: {algo_name}")
        best_params, best_algo = tune_parameters(data, algo_data['algo'], algo_data['params'])
        logging.info(f"最佳参数:{best_params}")
        logging.info(f"开始训练模型: {algo_name}")
        model = train_model(data, best_algo)
        
        logging.info(f"开始评估模型: {algo_name}")
        results = evaluate_model(model, data)
        # 如果当前模型是最优模型,则保存
        if not best_model_info or best_model_info['best_score'] > results['test_rmse'].mean():
            best_model_info = {
                'algorithm': algo_name,
                'best_score': results['test_rmse'].mean(),
                'best_params': best_params,
                'best_estimator': best_algo
            }
    # 保存最佳模型和评估结果
    save_model_and_results(
        best_model_info['best_estimator'],
        best_model_info,
        model_filename,
        results_filename
    )
    logging.info(f"模型已训练并保存为: {model_filename}")
    logging.info(f"模型评估结果已保存为: {results_filename}")
if __name__ == "__main__":
    main()

我对三种不同的推荐算法进行了参数调优,并选择了其中最佳的模型。我们还将模型的评估结果和最佳参数配置保存到了JSON文件中,并通过日志文件记录了整个训练过程的详细信息。


这个实现方式不仅增加了代码的行数和复杂性,还提供了更多的灵活性和可维护性,可以很容易地扩展到其他推荐算法和参数搜索空间。此外,通过日志记录,我们可以更好地监控模型训练过程,以便于调试和性能分析。


相关文章
|
2天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1519 4
|
29天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
503 19
|
2天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
179 1
|
8天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
457 5
|
7天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
314 2
|
23天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
25天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2608 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析