精华内容
下载资源
问答
  • python surprise

    千次阅读 2018-05-16 00:15:14
    surprise 库 目录 surprise 库 目录 参考文档 安装 预测算法 prediction_algorithms包 The algorithm base class 算法基类 Baselines estimates configuration 基线法估计配置 使用GridSearchCV调整算法参数 ...

    surprise 库


    目录

    参考文档

    Surprise’ documentation
    GitHub — Surprise

    安装

    With pip (you’ll need numpy, and a C compiler. Windows users might prefer using conda):

    $ pip install numpy
    $ pip install scikit-surprise

    With conda:

    $ conda install -c conda-forge scikit-surprise

    For the latest version, you can also clone the repo and build the source (you’ll first need Cython and numpy):

    $ pip install numpy cython
    $ git clone https://github.com/NicolasHug/surprise.git
    $ cd surprise
    $ python setup.py install

    预测算法

    1. 所有算法都由AlgoBase基类生成,基类里实现了一些关键的方法,(e.g. predict, fit and test).
    2. Every algorithm is part of the global Surprise namespace, so you only need to import their names from the Surprise package
      任何算法都是在surprise库的全局命名空间中,可以直接调用。

    prediction_algorithms

    算法类名 说明 解释
    random_pred.NormalPredictor Algorithm predicting a random rating based on the distribution of the training set, which is assumed to be normal. 根据训练集的分布特征随机给出一个预测值
    baseline_only.BaselineOnly Algorithm predicting the baseline estimate for given user and item. 给定用户和Item,给出基于baseline的估计值
    knns.KNNBasic A basic collaborative filtering algorithm. 最基础的协作过滤
    knns.KNNWithMeans A basic collaborative filtering algorithm, taking into account the mean ratings of each user. 将每个用户评分的均值考虑在内的协作过滤实现
    knns.KNNBaseline A basic collaborative filtering algorithm taking into account a baseline rating. 考虑基线评级的协作过滤
    matrix_factorization.SVD The famous SVD algorithm, as popularized by Simon Funk during the Netflix Prize. SVD实现
    matrix_factorization.SVDpp The SVD++ algorithm, an extension of SVD taking into account implicit ratings. SVD++,即LFM+SVD
    matrix_factorization.NMF A collaborative filtering algorithm based on Non-negative Matrix Factorization. 基于矩阵分解的协作过滤
    slope_one.SlopeOne A simple yet accurate collaborative filtering algorithm. 一个简单但精确的协作过滤算法
    co_clustering.CoClustering A collaborative filtering algorithm based on co-clustering. 基于协同聚类的协同过滤算法

    The algorithm base class 算法基类

    The surprise.prediction_algorithms.algo_base module defines the base class AlgoBase from which every single prediction algorithm has to inherit.

    1. fit(trainset)

      Train an algorithm on a given training set.
      This method is called by every derived class as the first basic step for training an algorithm. It basically just initializes some internal structures and set the self.trainset attribute.
      Parameters: trainset (Trainset) – A training set, as returned by the folds method.
      Returns: self

      在一个给定的数据集上训练一个算法

    Baselines estimates configuration 基线法估计配置

    中用到最小化平方误差函数的算法(包括Baseline 方法 和相似度计算)都需要配置参数,不同的参数会导致算法有不同的性能,且不同的 baseline 用于不同的算法,参数配置不一样。
    使用默认的baseline参数已经可以取得一定的性能的。
    需要注意的是,一些相似度度量用到Baseline,无论实际的预测算法是否用到baseline,都需要配置相关参数
    具体的参数配置,可以参考这篇论文
    Factor in the Neighbors: Scalable and Accurate Collaborative Filtering

    使用GridSearchCV调整算法参数

    cross_validate()函数针对给定的一组参数报告交叉验证过程的准确性度量。 如果你想知道哪个参数组合可以产生最好的结果,那么GridSearchCV类就可以解决问题。 给定一个参数的字典,这个类彻底地尝试所有参数组合,并报告任何准确性度量(在不同分割上的平均值)的最佳参数。 它受到scikit-learn的GridSearchCV的启发。

    Similarity measure configuration 相似度度量配置

    Many algorithms use a similarity measure to estimate a rating. The way they can be configured is done in a similar fashion as for baseline ratings: you just need to pass a sim_options argument at the creation of an algorithm. This argument is a dictionary with the following (all optional) keys:

    通过指定sim_options这个字典变量来配置相似度指标
    1. name: 指定相似度指标的名字,similarities module 中给出了MSD
    2. user_based: 指定是使用计算用户之间的相似度还是Item之间的相似度,这个地方的选择对预测算法的性能有巨大影响,默认值:True
    3. min_support:当相似度不为0时,最小公共用户数或公共项目数
    4. shrinkage: 收缩参数,仅用于 pearson_baseline 相似度

    Trainset class

    It is used by the fit() method of every prediction algorithm. You should not try to built such an object on your own but rather use the Dataset.folds() method or the DatasetAutoFolds.build_full_trainset() method.

    训练集不应该由个人创建,可以通过Dataset.folds()或者DatasetAutoFolds.build_full_trainset()方法创建。

    源码解读

    reader 类

    def __init__(self, name=None, line_format='user item rating',
                sep=None,rating_scale=(1, 5), skip_lines=0):

    建立阅读器的格式,自动将评分定在rating_scale区间
    self.offset : self.offset = -lower_bound + 1 if lower_bound <= 0 else 0

    def parse_line(self, line)
        '''Parse a line.
    
            Ratings are translated so that they are all strictly positive.
    
            Args:
                line(str): The line to parse
    
            Returns:
                tuple: User id, item id, rating and timestamp. The timestamp is set  to ``None`` if it does no exist.
        '''
    

    解析一行,返回需要的格式数据

    dataset 类

    def build_full_trainset(self):
        """Do not split the dataset into folds and just return a trainset as
        is, built from the whole dataset.
    
        User can then query for predictions, as shown in the :ref:`User Guide
        <train_on_whole_trainset>`.
    
        Returns:
            The :class:`Trainset <surprise.Trainset>`.
        """

    将所有数据用于生成训练集

     def construct_trainset(self, raw_trainset):
    
    建立 `raw_id` 到 `inner_id`的映射
    得到 ur 字典 --- `用户-评分`字典
         ir 字典 --- `Item-评分`字典
         n_users --- 用户数
         n_items --- Item数
         n_ratings --- 评分记录数
    
    建立训练集

    trainset 类

    KNNBaseline 类

    1. KNNBaseline
      KNNBaseline.png
      考虑基础评分的协同过滤
      最好用 pearson_baseline 相似度
      关于Baseline方法的作用,可以参考这篇文章
      推荐系统的协同过滤算法实现和浅析 pdf

    KNNBasic 类

    KNNBasic.png

    def fit(self, trainset):
        """
        计算相似度
        计算公式的由来可以参考相关书籍
        """
    def estimate(self, u, i):
        """
        估计用户u对物品i的打分
        找出在给物品i打过分的k个近邻用户
        根据相应的预测评分计算公式计算预测评分
        返回值: est, details({'actual_k': actual_k})
        """

    example

    库中,是预测所有用户没有评论过的物品的评分
    不适合做Top-N推荐

    split 数据分割

    数据分割部分的分割操作都是针对所有数据集的操作,适合评分预测的应用,不适合Top-N推荐的应用(有待验证)

    ShuffleSplit 类

    shuffleSplit
    将所有的训练数据随机地分成k份。

    train_test_split
    将数据分割为训练集和测试集割为训练集和测试集

    展开全文
  • Surprise概述surprise是一个便于使用的开源Python库,应用于推荐系统。安装/使用最简单的方式是使用pip:$ pip install surprise或者你可以clone仓库并build源:$ git clone ...

    Surprise

    概述

    surprise是一个便于使用的开源Python库,应用于推荐系统。

    安装/使用

    最简单的方式是使用pip:

    $ pip install surprise

    或者你可以clone仓库并build源:

    $ git clone https://github.com/NicolasHug/surprise.git

    $ python setup.py install

    示例

    下面是一个简单的例子,用户显示如何加载一个数据集:

    from surprise import SVD

    from surprise import Dataset

    from surprise import evaluate

    # Load the movielens-100k dataset (download it if needed),

    # and split it into 3 folds for cross-validation.

    data = Dataset.load_builtin("ml-100k")

    data.split(n_folds=3)

    # We"ll use the famous SVD algorithm.

    algo = SVD()

    # Evaluate performances of our algorithm on the dataset.

    perf = evaluate(algo, data, measures=["RMSE", "MAE"])

    print(perf)

    输出:

    Evaluating RMSE, MAE of algorithm SVD.

    Fold 1 Fold 2 Fold 3 Mean

    MAE 0.7475 0.7447 0.7425 0.7449

    RMSE 0.9461 0.9436 0.9425 0.9441

    展开全文
  • 推荐系统-Python+surprise

    2019-10-15 15:40:55
    surprise是一个python的推荐系统的库,里面包含数据下载、数据处理、模型(包括svd、svd++、slopeone、random rating base 等,具体可以去看官方文档地址)、评分等各种功能 实现 安装 1、在命令行 pip ...

    利用surprise+自己的数据构建推荐系统

    • surprise介绍
      surprise是一个python的推荐系统的库,里面包含数据下载、数据处理、模型(包括svd、svd++、slopeone、random rating base 等,具体可以去看官方文档地址)、评分等各种功能

    • 实现

    • 安装

       1、在命令行 pip install surprise
       2、命令行安装报错的话可以去[python库网站](https://www.lfd.uci.edu/~gohlke/pythonlibs/#qimage2ndarray)ctrl+f搜索surprise下载,然后在目录下shift+右键进入命令行 pip install ******.whl来安装
       3、安装结束打开编辑器编辑一个python文件 `import surprise`并运行,不报错的话就完成了安装
      
    • 数据
      我们需要的数据有三行:user、item、ratings

    • 导入所需要的模块

    import surprise
    from surprise import Dataset,Reader
    #Reader 将数据转化为surprise所需要的数据时需要这个
    from surprise.evaluate import accuracy
    #评分
    from surprise.model_selection import train_test_split
    #数据切割
    
    • 数据处理
    reader = Reader()
    data =Dataset.load_from_df(train,reader)
    trains,tests = train_test_split(data)
    
    
    • 创建模型并训练
    algo = surprise.SVDpp()
    algo.fit(trains)
    
    • 获取结果
    def setRatings(data,model):
        user_list = list(train.xwho.unique())
        unum = len(user_list)
        item_list = list(train.sku_id.unique())
        inum = len(item_list)
        
        #构建一个shape为[users,items] index为user,columns为item的dataframe表格
        ndrating = np.zeros((unum,inum),dtype=int)
        Pridect_ratings = DataFrame(ndrating,index=user_list,columns=item_list)
        #对每个用户对每个商品进行预测评分,并将得分插入Predict_retings表格
        for user in user_list:
            for item in item_list:
                predict_info = algo.predict(user,item)
                #判断是否有过行为,买过则及买过的分
                if predict_info.r_ui != 5:
                    score = predict_info.r_ui
                score = predict_info.est
    
                Pridect_ratings[item][user]=score
        return Pridect_ratings
        #返回一个具有预测的得分的表格
    
    • 未完待续
    展开全文
  • 基于Pythonsurprise的电影推荐系统

    千次阅读 2017-06-11 16:48:49
    基于PythonSurprise的电影推荐系统

    surprise 是一个主流的python推荐系统框架支持的最基本数据格式为movielens dataset,其评分数据格式为 

    user item rating timestamp


    # -*- 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)
    

    展开全文
  • 记录安装surprise包错误解决办法。 方法一: 一开始我是直接在cmd上运行下面这行代码,但是报错了,仔细看安装程序最后提示,出现”Microsoft Visual C++ 14.0 required”并附有相应的网址,然而直接打开网址找到C++...
  • Surprise一个Python scikit构建和分析推荐系统
  • from surprise import KNNWithMeans from surprise import Dataset from surprise.model_selection import GridSearchCV # Use movielens-100K data = Dataset.load_builtin('ml-100k') param_grid = {'n_epochs':...
  • 推荐系统学习笔记-python-surprise包安装背景安装过程尝试最方便的pip安装尝试手动安装 背景 安装scikit-surprise包过程中出现的问题记录一下 安装过程 尝试最方便的pip安装 打开命令行窗口输入pip install scikit-...
  • python推荐系统库Surprise

    千次阅读 2017-09-13 22:03:50
    # ## python推荐系统库Surprise # ![](./Surprise.png) # 在推荐系统的建模过程中,我们将用到python库 [Surprise(Simple Python RecommendatIon System Engine)](https://github.com/NicolasHug/Surprise),是...
  • Surprise(Simple Python Recommendation System Engine)是一款推荐系统库,是scikit系列中的一个。简单易用,同时支持多种推荐算法。基础算法、协同过滤、矩阵分解等 Surprise使用 Surprise里有自带的Movielens...
  • 本文是用来记录学习surprise的过程。 本文内容: 1. 自动交叉验证 2. train-test split 和 fit() 方法 3. 训练整个数据集和predict()方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 493
精华内容 197
关键字:

pythonsurprise

python 订阅