机器学习——Surprise
0介紹
從這里開始學習:https://surprise.readthedocs.io/en/stable/prediction_algorithms_package.html
 surprise,和sklearn類似,不過是surprise主要用于推薦
1預測算法
1.0AlgoBase基類
Surprise提供了一系列內置算法。所有預測算法都源自AlgoBase基類,其中實現(implement)了一些關鍵方法(e.g. predict, fit and test)。
 surprise.prediction_algorithms.algo_base 模塊定義了每個預測算法都必須從中繼承的基類AlgoBase。
抽象類,其中定義了預測算法的基本行為。
 關鍵參數:
- baseline_options (dict, optional) - 如果算法需要計算基線估計值(baselines estimates),則baseline_options參數用于配置計算方式。
- 有關使用情況,請參閱1.0.1基線估計配置。
 
1.0.1Baselines estimates configuration(基線估計值配置)
本節僅適用于嘗試最小化以下正則化平方誤差(或等效誤差)的算法(或相似性度量):
 對于在另一個目標函數(例如SVD算法)中使用基線的算法,基線配置是不同的,并且特定于每個算法。請參考他們自己的文檔。
 Baselines(基線)可以通過兩種不同的方式進行估計
- Using Stochastic Gradient Descent (SGD)——隨機梯度下降法
- Using Alternating Least Squares (ALS)——交替最小二乘法
您可以使用在創建算法時傳遞的bsl_options參數配置計算基線的方式。此參數是一個字典,其中鍵“method”表示要使用的方法。接受的值為“als”(默認值)和“sgd”。根據其值,可以設置其他選項。
 ASL:
- “reg_i”:項(items)的正則化參數。對應于[Koren:2010]中的λ2。默認值為10。
- “reg_u”:用戶的正則化參數。對應于[Koren:2010]中的λ3。默認值為15。
- ‘n_epochs’:ALS過程的迭代次數。默認值為10。注意,在[Koren:2010]中,描述的是一個單一的迭代過程。
- 在機器學習中,ALS指使用交替最小二乘法求解的一個協同過濾推薦算法
SGD:
- “reg”:優化成本函數的正則化參數,對應于[Koren:2010]中的λ1。默認值為0.02。
- “learning_rate”:SGD的學習率,對應于[Koren:2010]中的γ。默認值為0.005。
- ‘n_epochs’:SGD過程的迭代次數。默認值為20。
注意:對于這兩個過程(ALS和SGD),用戶和項目偏差(bu和bi)初始化為零。
Note that some similarity measures(相似性度量) may use baselines, such as the pearson_baseline similarity.
 具體看here
1.0.2Similarity measure configuration(相似性度量配置)
許多算法使用相似性度量來估計評分。配置它們的方式與baselines ratings(基線評級)的方式類似:您只需在創建算法時傳遞sim_options參數。此參數是具有以下(所有可選)鍵的字典:
- “name”:相似性模塊中定義的要使用的相似性的名稱。默認值為“MSD”。(MSD——Mean Squared Difference)
- “user_based”:將計算用戶之間還是項目之間的相似性。這對預測算法的性能有很大的影響。默認值為True(即計算用戶之間的相似性)。
- “min_support”:相似度不為零的 最小公共項(items)數(當“user_based”為“True”時)或最小公共用戶數(當“user_based”為“False”)。簡單地說,如果|Iuv|<min_support ,那么sim(u,v)=0(即這兩個用戶之間的相似度為0)。這同樣適用于物品。
- “shrinkage”:要應用的收縮參數(僅與pearson_baseline相似性相關)。默認值為100。
相似度度量方法有cosine、msd、pearson、pearson_baseline等
1.0.3 algobase的方法
1compute_baselines()
2compute_similarities()
3default_prediction()
4fit(trainset)
在給定的訓練集上訓練算法。
 此方法由每個派生類調用,作為訓練算法的第一個基本步驟。它基本上只是初始化一些內部結構并設置self.trainset屬性。
- 參數:trainset(trainset)–一個由folds方法返回的訓練集。
- 返回:self
5get_neighbors(iid, k)
6predict(uid, iid, r_ui=None, clip=True, verbose=False)
計算給定用戶和項目的評級預測。
 predict方法將原始ID轉換為內部ID(What are raw and inner ids?),然后調用在每個派生類中定義的estimate方法。如果無法進行預測(例如,因為用戶 和/或 項目未知),則根據默認值設置預測。
 參數:
- uid–用戶id(raw)。
- iid–項目的id(raw)。
- r_ui(float)-真實評級。可選,默認為無。
- clip(bool)–是否將估算值剪切到評級量表中。例如,如果rui為5.5,而評級等級為[1,5],則rui設置為5。如果rui<1,情況也是如此。默認值為True。
- verbose (bool)–是否打印預測的詳細信息。默認值為False。
return:
 一個預測對象,包含:
- 用戶id uid(raw)。
- 項目id iid(raw)。
- 真實評級r_ui(rui)。
- 估計評級(rui)。
Raw ID是rating file 或 a pandas DataFrame中定義的ID。它們可以是字符串或數字。但是請注意,如果評級是從標準場景的文件中讀取的,則它們表示為字符串。了解您是否正在使用predict()或其他接受Raw ID作為參數的方法非常重要。
 在trainset創建時,每個raw id映射到一個稱為inner id的唯一整數,該整數更適合surprise操作。raw ID和inner ID之間的轉換可以使用trainset的**to_inner_uid()、to_inner_iid()、to_raw_uid()和to_raw_iid()**方法完成。
7test(testset, verbose=False)
1.00The predictions module
The surprise.prediction_algorithms.predictions module defines the Prediction named tuple and the PredictionImpossible exception.
 here
1.1Basic Algorithms
1.1.1random_pred.NormalPredictor
基于假設為正態的訓練集分布預測隨機評分的算法。
class surprise.prediction_algorithms.random_pred.NormalPredictor Bases: surprise.prediction_algorithms.algo_base.AlgoBase預測rui由正態分布N(μ^ ,σ^ 2)生成,其中μ^ 和σ^ 通過使用最大似然估計的訓練數據進行估計:
1.1.2baseline_on1y.BaselineOnly
為給定用戶和項目預測基線估計值的算法。
class surprise.prediction_algorithms.baseline_only.BaselineOnly(bsl_options={}, verbose=True) Bases: surprise.prediction_algorithms.algo_base.AlgoBase
 如果用戶U是未知的,則bu假設為0,item同理。
1.2 knns
1.2.1knns.KNNBasic
一種基本的協同過濾算法。
class surprise.prediction_algorithms.knns.KNNBasic(k=40, min_k=1, sim_options={}, verbose=True, **kwargs) Bases: surprise.prediction_algorithms.knns.SymmetricAlgo
 參數:
- k(int)–聚合時要考慮的(最大)鄰居數。默認值為40。
- min_k(int)–聚合時要考慮的最小鄰居數。如果沒有足夠的鄰居,則將預測設置為所有評級的全局平均值。默認值為1。
- sim_options(dict)–相似性度量的選項字典。
 verbose(bool)–是否打印偏差估計、相似性等跟蹤消息。默認值為True。
注意:
 對于這些算法(knns)中的每一種,聚合以計算估計的實際鄰居數必然小于或等于k。首先,可能沒有足夠的鄰居,其次,集合Nki(u)和Nku(i)只包含相似性度量為正的鄰居。將負相關的用戶(或項目)的評分匯總在一起是沒有意義的。對于給定的預測,可以在預測的詳細信息字典的“actual_k”字段中檢索鄰居的實際數量。
1.2.2knns.KNNlwithMeans
一種基本的協同過濾算法,考慮到每個用戶的平均評分。
class surprise.prediction_algorithms.knns.KNNWithMeans(k=40, min_k=1, sim_options={}, verbose=True, **kwargs) Bases: surprise.prediction_algorithms.knns.SymmetricAlgo考慮到每個用戶的平均評分,主要是考慮到用戶個人的特點,會給所有item打高分等情況。
1.2.3knns.KNNWithZScore
一種基本的協同過濾算法,它考慮了每個用戶的z分數標準化。
class surprise.prediction_algorithms.knns.KNNWithZScore(k=40, min_k=1, sim_options={}, verbose=True, **kwargs) Bases: surprise.prediction_algorithms.knns.SymmetricAlgo1.2.4knns.KNNBaseline
一種基本的協同過濾算法,考慮了基線評分。
class surprise.prediction_algorithms.knns.KNNBaseline(k=40, min_k=1, sim_options={}, bsl_options={}, verbose=True, **kwargs) Bases: surprise.prediction_algorithms.knns.SymmetricAlgo1.3matrix_factorization
1.3.1matrix_factorization.SVD
著名的SVD算法,由Simon Funk在Netflix大獎期間推廣。當不使用基線時,這相當于概率矩陣分解。
class surprise.prediction_algorithms.matrix_factorization.SVD Bases: surprise.prediction_algorithms.algo_base.AlgoBase參數:
-  n_factors :因子(factors)的數量。默認值為20。 
-  n_epochs :SGD(隨機梯度下降)過程的迭代次數。默認值為20。 
-  biased (bool) – Whether to use baselines (or biases). Default is True. 
-  init_mean:因子向量初始化的正態分布平均值。默認值為0。 
-  init_std_dev:因子向量初始化正態分布的標準偏差。默認值為0.1。 
-  lr_all:所有參數的學習率。默認值為0.007。 
-  reg_all:所有參數的正則化項。默認值為0.02。 
-  lr_bu:bu的學習率。如果設置,則優先于lr_all。默認值為“無”。 
-  lr_bi:bi的學習率。如果設置,則優先于lr_all。默認值為“無”。 
-  lr_pu:pu的學習率。如果設置,則優先于lr_all。默認值為“無”。 
-  lr_qi:qi的學習率。如果設置,則優先于lr_all。默認值為“無”。 
-  reg_bu:bu的正規化術語。如果設置,則優先于reg_all。默認值為“無”。 
-  reg_bi:bi的正則化術語。如果設置,則優先于reg_all。默認值為“無”。 
-  reg_pu:pu的正則化術語。如果設置,則優先于reg_all。默認值為“無”。 
-  reg_qi:qi的規范化術語。如果設置,則優先于reg_all。默認值為“無”。 
-  random_state(int、numpy的RandomState實例或None):確定將用于初始化的RNG。如果為int,則隨機_狀態將用作新RNG的種子。這對于在多次調用fit()時獲得相同的初始化非常有用。如果是RandomState實例,則該實例將用作RNG。如果沒有,則使用來自numpy的當前RNG。默認值為“無”。 
-  verbose:如果為True,則打印當前歷元。默認值為False。 
pu
 The user factors (only exists if fit() has been called)
 Type: numpy array of size (n_users, n_factors)
 qi
 The item factors (only exists if fit() has been called)
 Type: numpy array of size (n_items, n_factors)
bu
 The user biases (only exists if fit() has been called)
 Type: numpy array of size (n_users)
 bi
 The item biases(偏差) (only exists if fit() has been called)
 Type: numpy array of size (n_items)
1.3.2matrix_factorization.SVDpp
SVD++算法,它是SVD的一個擴展,考慮了隱式評級。
clas ssurprise.prediction_algorithms.matrix_factorization.SVDpp Bases: surprise.prediction_algorithms.algo_base.AlgoBase參數(大部分同上):
- lr_yj:yj的學習率。如果設置,則優先于lr_all。默認值為“無”。
-  - reg_yj:yj的正則化術語。如果設置,則優先于reg_all。默認值為“無”。
 yj
 The (implicit) item factors (only exists if fit() has been called)
 Type: numpy array of size (n_items, n_factors)
 
- reg_yj:yj的正則化術語。如果設置,則優先于reg_all。默認值為“無”。
1.3.3matrix_factorization.NMF
一種基于非負矩陣分解的協同過濾算法。
class surprise.prediction_algorithms.matrix_factorization.NMF Bases: surprise.prediction_algorithms.algo_base.AlgoBase1.4slope_one.SlopeOne
一種簡單但精確的協同過濾算法。
1.5co_clustering.CoClustering
一種基于協同聚類的協同過濾算法。
2model_selection
2.1交叉驗證迭代器Cross validation iterators
Surprise 提供了各種工具來運行交叉驗證過程和搜索預測算法的最佳參數。這里介紹的工具都是從優秀的scikit學習庫中獲得大量靈感的。
 該模塊還包含將數據集拆分為訓練集和測試集的功能:
分割數據集以及訓練和測試
from surprise import SVD from surprise import Dataset from surprise import accuracy from surprise.model_selection import train_test_splitdata = Dataset.load_builtin('ml-100k') #加載movielens-100k數據集trainset, testset = train_test_split(data, test_size=.25) #隨機抽樣選出訓練集和測試集,這里選取了25%作為測試集algo = SVD() #使用SVD算法algo.fit(trainset) #做訓練 predictions = algo.test(testset) #做測試accuracy.rmse(predictions) #計算RMSE顯然,我們也可以簡單地將我們的算法作用于整個數據集,而不是進行交叉驗證。這可以通過使用build_full_trainset()方法建立trainset對象來完成 :
from surprise import KNNBasic from surprise import Dataset data = Dataset.load_builtin('ml-100k') #加載movielens-100k數據集 trainset = data.build_full_trainset() #糾正/取出訓練集 algo = KNNBasic() #建立算法并訓練 algo.fit(trainset)2.1.1 KFold
是一個基本的交叉驗證迭代器。
class surprise.model_selection.split.KFold(n_splits=5, random_state=None, shuffle=True)參數:
- n_splits(int)–折疊的數量。
- random_state(int、numpy的RandomState實例或None)–確定將用于確定folds的RNG。如果為int,則random_state將用作新RNG的種子。這對于通過多次調用split()獲得相同的拆分非常有用。如果是RandomState實例,則該實例將用作RNG。如果沒有,則使用來自numpy的當前RNG。random_state僅在隨機播放為真時使用。默認值為“無”。
- shuffle(bool)–是否洗牌split()方法的數據參數中的評級。洗牌沒有到位。默認值為True。
split(data)
用于迭代訓練集集和測試集的生成器函數。
 參數:數據(Dataset)–包含將被分為訓練集和測試集的額定值的數據。
 生成:元組(訓練集、測試集)
 使用
2.1.2 RepeatedKFold
RepeatedKFold:重復KFold交叉驗證程序。
2.1.3ShuffleSplit
ShuffleSplit是一個帶有隨機訓練集和測試集的基本交叉驗證迭代器。
2.1.4LeaveOneOut
LeaveOneOut交叉驗證迭代器,其中每個用戶在測試集中只有一個評級。
2.1.5 PredefinedKFold
PredefinedKFold 一個交叉驗證迭代器,用于在使用load_from_方法加載數據集時調用。
3 similarities module
3.1 cosine
計算所有用戶對(或項目)之間的余弦相似性。
surprise.similarities.cosine()3.2 msd
計算所有對用戶(或項目)之間的均方差相似度。
surprise.similarities.msd()3.3pearson
計算所有用戶對(或項目)之間的pearson相關系數。
surprise.similarities.pearson()3.4 pearson_baseline
計算所有用戶(或項目)對之間的(收縮的)pearson相關系數,使用基線作為中心,而不是平均值。
surprise.similarities.pearson_baseline()4accuracy module
accuracy模塊提供了計算一組預測的精度指標的工具。
 可用的精度指標:
 
5dataset module
class surprise.dataset.Dataset(reader)dataset模塊定義用于管理數據集的dataset類和其他子類。
 用戶可以同時使用內置數據集和用戶定義數據集。目前,有三個內置數據集可用:
 The movielens-100k dataset.
 The movielens-1m dataset.
 The Jester dataset 2.
 可以使用Dataset.load_builtin()方法加載(或下載(如果尚未加載))所有內置數據集。
 總結:
5.1 classmethod load_builtin(name=u’ml-100k’, prompt=True)
加載內置數據集。
如果尚未加載數據集,則將下載并保存該數據集。
 默認情況下,surprise下載的數據集將保存在“~/.surprise_data”目錄中。這也是存儲轉儲文件的地方。您可以通過設置“SURPRISE_DATA_FOLDER”環境變量來更改默認目錄(here)
 您必須使用split方法(model_selection模塊)拆分數據集。
 參數:
 name(字符串)–要加載的內置數據集的名稱。可接受的值為“ml-100k”、“ml-1m”和“jester”。默認值為“ml-100k”。
 prompt(bool)–如果數據集不在磁盤上,則在下載前進行提示。默認值為True。
 返回:
 數據集對象。
如果名稱參數不正確,ValueError錯誤。
5.2 classmethod load_from_df(df, reader)
5.3 classmethod load_from_file(file_path, reader)
5.4 classmethod load_from_folds(folds_files, reader)
5.5
class surprise.dataset.DatasetAutoFolds(ratings_file=None, reader=None, df=None)6Trainset class
trainset包含構成訓練集的所有有用數據。
class surprise.Trainset(ur, ir, n_users, n_items, n_ratings, rating_scale, raw2inner_id_users, raw2inner_id_items)每個預測算法的fit()方法都使用它。您不應該嘗試自己構建這樣的對象,而應該使用Dataset.folds() method or the DatasetAutoFolds.build_full_trainset() method
 trainset與dataset不同。可以將數據集視為原始數據,將訓練集視為定義了有用方法的更高級別的數據。
 交叉驗證也可以由多個數據集組成。
here是trainset的屬性和方法
 屬性:
 
 方法:
 
參考
https://blog.csdn.net/yuxeaotao/article/details/79851576
總結
以上是生活随笔為你收集整理的机器学习——Surprise的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python安装surprise库总是失
- 下一篇: 推荐算法——Surprise
