KNN机器学习算法—python的surprise库电影推荐系统爬坑笔记

参考博文:https://blog.csdn.net/jsond/article/details/73042866

本文仅为记录尝试的时候遇到的坑。

数据格式:user item rating timestamp

安装库:

    在安装surprise库的时候如果用python3.X的时候会提示需要visio c++ 2014,但是笔者环境明明有visio c++2014和2015,具体好像还需要一些其他配置,并没有去深究,后经搜索用python2.7可以直接安装使用:

在安装之前首先要确认已经安装了numpy库。

pip install scikit-surprise

源码如下:

# -*- coding:utf-8 -*-
from __future__ import (absolute_import, division, print_function, unicode_literals)
import os
import io
from surprise import KNNBaseline
from surprise import Dataset

import logging

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')


# 训练推荐模型 步骤:1
def getSimModle():
    # 默认载入movielens数据集
    data = Dataset.load_builtin('ml-100k')
    trainset = data.build_full_trainset()
    #使用pearson_baseline方式计算相似度  False以item为基准计算相似度 本例为电影之间的相似度
    sim_options = {'name': 'pearson_baseline', 'user_based': False}
    ##使用KNNBaseline算法
    algo = KNNBaseline(sim_options=sim_options)
    #训练模型
    algo.train(trainset)
    return algo


# 获取id到name的互相映射  步骤:2
def read_item_names():
    """
    获取电影名到电影id 和 电影id到电影名的映射
    """
    file_name = (os.path.expanduser('~') +
                 '/.surprise_data/ml-100k/ml-100k/u.item')
    rid_to_name = {}
    name_to_rid = {}
    with io.open(file_name, 'r', encoding='ISO-8859-1') as f:
        for line in f:
            line = line.split('|')
            rid_to_name[line[0]] = line[1]
            name_to_rid[line[1]] = line[0]
    return rid_to_name, name_to_rid


# 基于之前训练的模型 进行相关电影的推荐  步骤:3
def showSimilarMovies(algo, rid_to_name, name_to_rid):
    # 获得电影Toy Story (1995)的raw_id
    toy_story_raw_id = name_to_rid['Toy Story (1995)']
    logging.debug('raw_id=' + toy_story_raw_id)
    #把电影的raw_id转换为模型的内部id
    toy_story_inner_id = algo.trainset.to_inner_iid(toy_story_raw_id)
    logging.debug('inner_id=' + str(toy_story_inner_id))
    #通过模型获取推荐电影 这里设置的是10部
    toy_story_neighbors = algo.get_neighbors(toy_story_inner_id, 10)
    logging.debug('neighbors_ids=' + str(toy_story_neighbors))
    #模型内部id转换为实际电影id
    neighbors_raw_ids = [algo.trainset.to_raw_iid(inner_id) for inner_id in toy_story_neighbors]
    #通过电影id列表 或得电影推荐列表
    neighbors_movies = [rid_to_name[raw_id] for raw_id in neighbors_raw_ids]
    print('The 10 nearest neighbors of Toy Story are:')
    for movie in neighbors_movies:
        print(movie)


if __name__ == '__main__':
    # 获取id到name的互相映射
    rid_to_name, name_to_rid = read_item_names()

    # 训练推荐模型
    algo = getSimModle()

    ##显示相关电影
    showSimilarMovies(algo, rid_to_name, name_to_rid)

数据集路径问题:

    1、第一次运行的时候总是会在read_item_names()函数中第一句提醒找不到ml-100k的数据集文件,后经查阅os.path.expanduser(path)  的作用是:把path中包含“~”和“~user”转换成用户目录。后自己去单独下载了ml-100k数据集,并放在同级目录下,然后将单引号中路径换为‘/ml-100k/u.item’,还是找不到。再把os.path.expanduser('~')去掉,不通过此方式,后发现不抱错,应该是找到了对应文件。

    2、接下来在getSimModel()函数中,提醒需要下载ml-100k数据集,这里好像是直接使用surprise库中Dataset的数据集,按照提示下载即可,如果太慢的话,用蓝灯开VPN进行下载。

运行:

    之后虽然会有报警告,但是已经可以正常运行了:


此处输出就是Toy Story (1995)最相近的10部电影。

尝试将参数换为Beauty and the Beast(1991),输出结果如下:


同样Toy Story(1995)也在其中。

数据:/ml-100k/u.item内容如下


尾部的参数就是根据电影以及影评人的评分所构造的矩阵。

猜你喜欢

转载自blog.csdn.net/zomb1e123456/article/details/80156103