【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解

简介: 【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解

1. 问题介绍

使用矩阵分解, 根据用户给短电影的评分数据, 做一个千人千面的个性化推荐系统。

需要安装推荐系统库surprise, 使用如下命令安装: pip install scikit-surprise

1.1推荐系统矩阵分解方法介绍

1.2 数据集:ml-100k

该数据集包括了943位用户对1682部电影的评分信息(总共100,000),评分也是1-5的整数;

  • u.data文件包含了100,000条评分信息,每条记录的形式:user id | item id | rating | timestamp.(分隔符是一个tab)

2. 推荐系统实现

2.1 定义矩阵分解函数

关注GZH:阿旭算法与机器学习,回复:“电影推荐系统”即可获取本文数据集、源码与项目文档

# 导入 nunpy 和 surprise 辅助库
import numpy as np
import surprise  

注: Surprise库本身没有提供纯粹的矩阵分解的算法, 在这里我们自己实现了基于Alternating Least Squares的矩阵分解, 使用梯度下降法优化;

矩阵分解类MatrixFactorization继承了surprise.AlgoBase, 方便我们使用surpise库提供的其它功能

class MatrixFactorization(surprise.AlgoBase):
    '''基于矩阵分解的推荐.'''
    
    def __init__(self, learning_rate, n_epochs, n_factors, lmd):
        
        self.lr = learning_rate  # 梯度下降法的学习率
        self.n_epochs = n_epochs  # 梯度下降法的迭代次数
        self.n_factors = n_factors  # 分解的矩阵的秩(rank)
        self.lmd = lmd # 防止过拟合的正则化的强度
        
    def fit(self, trainset):
        '''通过梯度下降法训练, 得到所有 u_i 和 p_j 的值'''
        
        print('Fitting data with SGD...')
        
        # 随机初始化 user 和 item 矩阵.
        u = np.random.normal(0, .1, (trainset.n_users, self.n_factors))
        p = np.random.normal(0, .1, (trainset.n_items, self.n_factors))
        
        # 梯度下降法
        for _ in range(self.n_epochs):
            for i, j, r_ij in trainset.all_ratings():
                err = r_ij - np.dot(u[i], p[j])
                # 利用梯度调整 u_i 和 p_j
                u[i] -= -self.lr * err * p[j] + self.lr * self.lmd * u[i]
                p[j] -= -self.lr * err * u[i] + self.lr * self.lmd * p[j]
                # 注意: 修正 p_j 时, 按照严格定义, 我们应该使用 u_i 修正之前的值, 但是实际上差别微乎其微
        
        self.u, self.p = u, p
        self.trainset = trainset
    def estimate(self, i, j):
        '''预测 user i 对 item j 的评分.'''
        # 如果用户 i 和物品 j 是已知的值, 返回 u_i 和 p_j 的点积
        # 否则使用全局平均评分rating值(cold start 冷启动问题)
        if self.trainset.knows_user(i) and self.trainset.knows_item(j):
            return np.dot(self.u[i], self.p[j])
        else:
            return self.trainset.global_mean

2.2 基于上述矩阵分解实现电影推荐

from surprise import BaselineOnly
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise.model_selection import cross_validate
from surprise.model_selection import train_test_split
import os
# 数据文件
file_path = os.path.expanduser('./ml-100k/u.data')
# - u.data文件包含了100,000条评分信息,每条记录的形式:user id | item id | rating | timestamp.(分隔符是一个tab)
# 数据文件的格式如下:
# 'user item rating timestamp', 使用制表符 '\t' 分割, rating值在1-5之间.
reader = Reader(line_format='user item rating timestamp', sep='\t', rating_scale=(1, 5))
data = Dataset.load_from_file(file_path, reader=reader)
# 查看文件内容
import pandas as pd
df = pd.read_csv("./ml-100k/u.data")
df.head()
196\t242\t3\t881250949
0 186\t302\t3\t891717742
1 22\t377\t1\t878887116
2 244\t51\t2\t880606923
3 166\t346\t1\t886397596
4 298\t474\t4\t884182806
df.shape
(99999, 1)

默认的SGD方法

# 将数据随机分为训练和测试数据集
trainset, testset = train_test_split(data, test_size=.25)
# 初始化以上定义的矩阵分解类.
algo = MatrixFactorization(learning_rate=.005, n_epochs=60, n_factors=2, lmd = 0.2)
# 训练
algo.fit(trainset)
# 预测
predictions = algo.test(testset)
# 计算平均绝对误差
accuracy.mae(predictions)
Fitting data with SGD...
MAE:  0.7818
0.7817791289983778

用 surpise 内建的基于最近邻的方法做比较

# 使用 surpise 内建的基于最近邻的方法做比较
algo = surprise.KNNBasic()
algo.fit(trainset)
predictions = algo.test(testset)
accuracy.mae(predictions)
Computing the msd similarity matrix...
Done computing similarity matrix.
MAE:  0.7725
0.7724598550399949

用 surpise 内建的基于 SVD 的方法做比较

# 使用 surpise 内建的基于 SVD 的方法做比较
algo = surprise.SVD()
algo.fit(trainset)
predictions = algo.test(testset)
accuracy.mae(predictions)
MAE:  0.7398
0.7397586022054631


相关文章
|
11天前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
|
13天前
|
机器学习/深度学习 数据采集 数据可视化
基于python 机器学习算法的二手房房价可视化和预测系统
文章介绍了一个基于Python机器学习算法的二手房房价可视化和预测系统,涵盖了爬虫数据采集、数据处理分析、机器学习预测以及Flask Web部署等模块。
基于python 机器学习算法的二手房房价可视化和预测系统
|
7天前
|
机器学习/深度学习 人工智能 算法
掌握机器学习:从基础到实战的全路径导览
在人工智能的浪潮中,机器学习如同一艘航船,引领我们探索数据的海洋。本文是一篇深入浅出的技术分享,旨在为初学者和进阶者提供一条清晰的学习路线图。我们将一起启航,从理论的灯塔到实践的港湾,逐步揭开机器学习的神秘面纱,让每一位旅者都能在这场智能革命中找到自己的位置。
|
6天前
|
机器学习/深度学习 人工智能 关系型数据库
【机器学习】Qwen2大模型原理、训练及推理部署实战
【机器学习】Qwen2大模型原理、训练及推理部署实战
17 0
【机器学习】Qwen2大模型原理、训练及推理部署实战
|
13天前
|
机器学习/深度学习 数据可视化 数据处理
Python vs R:机器学习项目中的实用性与生态系统比较
【8月更文第6天】Python 和 R 是数据科学和机器学习领域中最受欢迎的两种编程语言。两者都有各自的优点和适用场景,选择哪种语言取决于项目的具体需求、团队的技能水平以及个人偏好。本文将从实用性和生态系统两个方面进行比较,并提供代码示例来展示这两种语言在典型机器学习任务中的应用。
36 1
|
17天前
|
机器学习/深度学习 算法
【Deepin 20系统】机器学习分类算法模型xgboost、lightgbm、catboost安装及使用
介绍了在Deepin 20系统上使用pip命令通过清华大学镜像源安装xgboost、lightgbm和catboost三个机器学习分类算法库的过程。
14 4
|
16天前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【8月更文挑战第3天】在数据的海洋中探寻真知,决策树犹如智慧之树,以其直观易懂的强大功能,引领我们逐步缩小决策范围,轻松获取数据洞察。本篇将带您踏上Python机器学习之旅,从理解决策树为何受青睐开始,通过scikit-learn库实现鸢尾花数据集分类,解析其决策机制,并掌握调参技巧,最终优化模型性能,共同摘取数据科学的甜美果实。
26 1
|
19天前
|
机器学习/深度学习 数据采集 存储
机器学习在推荐系统中的应用
【7月更文挑战第31天】随着机器学习技术的不断发展和普及,推荐系统在电子商务、社交媒体、新闻资讯等领域的应用越来越广泛。机器学习算法的应用为推荐系统优化提供了全新的思路和方法,使得推荐系统能够更加智能化和个性化地为用户提供服务。未来,随着数据量的不断增加和算法的不断创新,推荐系统将会变得更加精准和高效,为用户带来更加优质的体验。
|
24天前
|
机器学习/深度学习 算法 数据挖掘
从菜鸟到大师:Scikit-learn库实战教程,模型训练、评估、选择一网打尽!
【7月更文挑战第26天】在数据科学领域, Scikit-learn是初学者通往专家之路的必备工具。
32 5
|
22天前
|
机器学习/深度学习 算法 自动驾驶
探索机器学习:从基础到进阶的实战之旅
【7月更文挑战第28天】机器学习领域正迅速扩展,成为技术革新的驱动力之一。本文旨在通过深入浅出的方式介绍机器学习的核心概念、主要算法及其在现实世界中的应用案例,为初学者和有一定经验的开发者提供一条清晰的学习路径。我们将从理论基础出发,逐步深入到高级应用,最终探讨如何将机器学习模型部署到实际项目中,以实现智能化解决方案。