surprise工具簡介--矩陣分解


Surprise(Simple Python Recommendation System Engine)是一款推薦系統庫,是scikit系列中的一個。簡單易用,同時支持多種推薦算法(基礎算法、協同過濾、矩陣分解等)。

設計surprise時考慮到以下目的:
讓用戶完美控制他們的實驗。為此,特別強調 文檔,試圖通過指出算法的每個細節盡可能清晰和准確。
減輕數據集處理的痛苦。用戶可以使用內置數據集(Movielens, Jester)和他們自己的自定義 數據集。
提供各種即用型預測算法, 例如基線算法, 鄰域方法,基於矩陣因子分解( SVD, PMF, SVD ++,NMF)等等。此外, 內置了各種相似性度量(余弦,MSD,皮爾遜......)。
可以輕松實現新的算法思路。
提供評估, 分析 和 比較 算法性能的工具。使用強大的CV迭代器(受scikit-learn優秀工具啟發)以及 對一組參數的詳盡搜索,可以非常輕松地運行交叉驗證程序 。

基本算法

算法類名 說明
random_pred.NormalPredictor 根據訓練集的分布特征隨機給出一個預測值
baseline_only.BaselineOnly 給定用戶和Item,給出基於baseline的估計值
knns.KNNBasic 最基礎的協同過濾
knns.KNNWithMeans 將每個用戶評分的均值考慮在內的協同過濾實現
knns.KNNBaseline 考慮基線評級的協同過濾
matrix_factorization.SVD SVD實現
matrix_factorization.SVDpp SVD++,即LFM+SVD
matrix_factorization.NMF 基於矩陣分解的協同過濾
slope_one.SlopeOne 一個簡單但精確的協同過濾算法
co_clustering.CoClustering 基於協同聚類的協同過濾算法

其中基於近鄰的方法(協同過濾)可以設定不同的度量准則

相似度度量標准 度量標准說明
cosine 計算所有用戶(或物品)對之間的余弦相似度。
msd 計算所有用戶(或物品)對之間的均方差異相似度。
pearson 計算所有用戶(或物品)對之間的Pearson相關系數。
pearson_baseline 計算所有用戶(或物品)對之間的(縮小的)Pearson相關系數,使用基線進行居中而不是平均值。

支持不同的評估准則

評估准則 准則說明
rmse 計算RMSE(均方根誤差)。
mae 計算MAE(平均絕對誤差)。
fcp 計算FCP(協調對的分數)。

biasSVD算法

使用Surprise工具中的SVD
參數:

n_factors: k值,默認為100
n_epochs:迭代次數,默認為20
biased:是否使用biasSVD,默認為True
verbose:輸出當前epoch,默認為False
reg_all:所有正則化項的統一參數,默認為0.02
reg_bu:bu的正則化參數,reg_bi:bi的正則化參數
reg_pu:pu的正則化參數,reg_qi:qi的正則化參數

funkSVD算法

使用Surprise工具中的SVD
參數:

n_factors: k值,默認為100
n_epochs:迭代次數,默認為20
biased:是否使用biasSVD,設置為False
verbose:輸出當前epoch,默認為False
reg_all:所有正則化項的統一參數,默認為0.02
reg_bu:bu的正則化參數,reg_bi:bi的正則化參數
reg_pu:pu的正則化參數,reg_qi:qi的正則化參數

SVD++算法

使用Surprise工具中的SVDpp
參數:

n_factors: k值,默認為20
n_epochs:迭代次數,默認為20
verbose:輸出當前epoch,默認為False
reg_all:所有正則化項的統一參數,默認為0.02
reg_bu:bu的正則化參數,reg_bi:bi的正則化參數
reg_pu:pu的正則化參數,reg_qi:qi的正則化參數
reg_yj:yj的正則化參數

利用surprise工具預測movielens簡單數據集(SVD,biasSVD,SVD++)

from surprise import Dataset
from surprise import Reader
from surprise import BaselineOnly, KNNBasic, NormalPredictor
from surprise import accuracy
from surprise.model_selection import KFold, split
from surprise import SVD,SVDpp
#import pandas as pd

# 數據讀取
reader = Reader(line_format='user item rating timestamp', sep=',', skip_lines=1)
data = Dataset.load_from_file('./ratings.csv', reader=reader)
#rain_set = data.build_full_trainset()
train_s,test_s = split.train_test_split(data, train_size=0.8)

algo1 = SVD()
algo2 = SVD(biased = False)
algo3 = SVDpp()

print('SVDbias結果')
algo1.fit(train_s)
pre = algo1.test(test_s)
accuracy.rmse(pre,verbose=True)
print('SVD結果')
algo2.fit(train_s)
pre = algo2.test(test_s)
accuracy.rmse(pre,verbose=True)
print('SVD++結果')
algo3.fit(train_s)
pre = algo3.test(test_s)
accuracy.rmse(pre,verbose=True)

示例代碼:
鏈接:https://pan.baidu.com/s/1JY7d6xiFc8jgTQZpEQJ_Ng
提取碼:q6x5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM