推荐算法——Surprise
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                推荐算法——Surprise
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                Surprise入門使用
官網(wǎng):https://yiyibooks.cn/sorakunnn/surprisesurprise-v1.0.5/surprise-v1.0.5/index.html
1. 使用movielens數(shù)據(jù)集
from surprise import SVD, KNNWithMeans, Reader import os from surprise import Dataset from surprise.model_selection import cross_validate # 默認(rèn)載入movielens數(shù)據(jù)集 # data = Dataset.load_builtin('ml-100k')# 載入自己數(shù)據(jù)集的方法 # 把path中包含的"~"和"~user"轉(zhuǎn)換成用戶目錄 filepah = os.path.expanduser('~/.surprise_data/ml-100k/ml-100k/u.data') reader = Reader(line_format='user item rating timestamp', sep='\t') data = Dataset.load_from_file(file_path=filepah, reader=reader)# 試一把SVD矩陣分解 algo = SVD() # 也可以試試別的算法 # algo = KNNWithMeans() # 在數(shù)據(jù)集上測(cè)試一下效果并打印, 3折交叉驗(yàn)證 cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=3, verbose=True)2. 算法調(diào)參(讓推薦系統(tǒng)有更好的效果)
這里實(shí)現(xiàn)的算法用到的算法無外乎也是SGD等,因此也有一些超參數(shù)會(huì)影響最后的結(jié)果,我們同樣可以用sklearn中常用到的網(wǎng)格搜索交叉驗(yàn)證(GridSearchCV)來選擇最優(yōu)的參數(shù)。簡(jiǎn)單的例子如下所示:
from surprise import Dataset, SVD from surprise.model_selection import GridSearchCV# 定義好需要優(yōu)選的參數(shù)網(wǎng)格:輪次,學(xué)習(xí)率,正則化程度 param_grid = {'n_epochs': [5, 10], 'lr_all': [0.002, 0.005],'reg_all': [0.4, 0.6]} # 使用網(wǎng)格搜索交叉驗(yàn)證 grid_search = GridSearchCV(SVD, param_grid, measures=['rmse', 'mae', 'fcp'], cv=3) data = Dataset.load_builtin('ml-100k') # 在數(shù)據(jù)集上找到最好的參數(shù) grid_search.fit(data) # 輸出調(diào)優(yōu)的參數(shù)組# 輸出最好的RMSE結(jié)果 print(grid_search.best_score['rmse']) # 輸出對(duì)應(yīng)最好的RMSE結(jié)果的參數(shù) print(grid_search.best_params['rmse'])# 輸出最好的MAE結(jié)果 print(grid_search.best_score['mae']) # 輸出對(duì)應(yīng)最好的MAE結(jié)果的參數(shù) print(grid_search.best_params['mae'])print(grid_search.best_score['fcp']) print(grid_search.best_params['fcp'])2. 在數(shù)據(jù)集上訓(xùn)練模型
1.用協(xié)同過濾構(gòu)建模型并進(jìn)行預(yù)測(cè)
movielens的例子,以下的程序段告訴大家如何在協(xié)同過濾算法建模以后,根據(jù)一個(gè)item取回相似度最高的item,主要是用到algo.get_neighbors()這個(gè)函數(shù)
import io import osfrom surprise import Dataset from surprise import KNNBaselinedef read_item_names():"""獲取電影名到電影id 和 電影id到電影名的映射構(gòu)建映射字典:return:"""filename = (os.path.expanduser('~/.surprise_data/ml-100k/ml-100k/u.item'))rid_to_name = {}name_to_rid = {}with io.open(filename, '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# 首先,用算法計(jì)算相互間的相似度 data = Dataset.load_builtin('ml-100k') # 使用協(xié)同過濾必須有這行,將我們的算法運(yùn)用于整個(gè)數(shù)據(jù)集,而不進(jìn)行交叉驗(yàn)證,構(gòu)建了新的矩陣 trainset = data.build_full_trainset() # 度量準(zhǔn)則:pearson距離,協(xié)同過濾:基于item sim_options = {'name': 'pearson_baseline', 'user_based': False}algo = KNNBaseline(sim_options=sim_options) algo.fit(trainset=trainset)rid_to_name, name_to_rid = read_item_names()# 拿出來Toy Story這部電影對(duì)應(yīng)的item id toy_story_raw_id = name_to_rid['Toy Story (1995)'] # 轉(zhuǎn)換為內(nèi)部id toy_story_inner_id = algo.trainset.to_inner_iid(toy_story_raw_id)# 根據(jù)內(nèi)部id找到最近的10個(gè)鄰居 toy_story_neighbors = algo.get_neighbors(toy_story_inner_id, k=10)# 將10個(gè)鄰居的內(nèi)部id轉(zhuǎn)換為item id也就是raw toy_story_neighbors_rids = (algo.trainset.to_raw_iid(inner_id) for inner_id in toy_story_neighbors) # 將10個(gè)鄰居的item id 轉(zhuǎn)為name toy_story_neighbors_names = (rid_to_name[raw_id] for raw_id in toy_story_neighbors_rids) # 打印結(jié)果 print('----------The 10 nearest neighbors of Toy Story---------------') for movie in toy_story_neighbors_names:print(movie)總結(jié)
以上是生活随笔為你收集整理的推荐算法——Surprise的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 机器学习——Surprise
- 下一篇: empty多个变量php,php emp
