工业推荐系统

常用算法评价指标|盘点与选择

2020-04-10  本文已影响0人  大饼与我

目录

一、前言
二、FM模型简单介绍
三、模型调试阶段
1.数据集调整
2.参数调整

四、模型评估阶段

  • 知识铺垫(混淆矩阵)
  • 准确度(Accuracy)
  • 误差(error)
  • 查准率(precision)
  • 召回率(recall)
  • PRC
  • F1-score
  • ROC曲线和AUC
  • KAPPA系数
  • NDCG

五、总结

一、前言

本文借助FM模型来了解算法的评价标准。因此重点在评价标准,而不在模型本身。

二、FM模型的简单介绍

1、FM模型应用意义

FM(Factorization Machine)主要是为了解决数据稀疏的情况下,特征怎样组合的问题。数据稀疏性普遍存在的实际应用场景中,二阶特征系数w{ij}的训练是很困难的.

2、公式与参数

FM模型公式
模型参数
化简后的FM模型公式
  • w_{0}\in \mathbb{R}表示FM的偏置
  • w\in \mathbb{R}^{n}表示FM模型对一阶特征的建模
  • V\in \mathbb{R}^{nk}表示FM模型对二阶特征的建模

3、FM模型重要原理|矩阵分解


(1) 二阶特征组成矩阵V:(矩阵V的第i行表示:第i维特征x_{i}的隐向量v_{i}

$V$矩阵

(2)V矩阵转置

$V$矩阵的转置

(3)多项式模型的二阶特征w_{ij}组成的方阵W
W=\begin{bmatrix} w_{11}&w_{12}& \cdots &w_{1n}\\ w_{21} &w_{22} & \cdots &w_{2n} \\ \cdots &\cdots &\cdots &\cdots \\ w_{n1} &w_{n2} &\cdots &w_{nn} \end{bmatrix}

  • 方阵W的上三角的元素(不包括对角线上的元素),即为多项式模型的二阶特征系数w_{ij}
  • 注意: 为什么只是上三角?因为必须i<j

(4)<V_{i},V_{j}>组成方阵 \hat{w}
\hat{w}= V\times V^j = \begin{bmatrix} v_{1}^T\\ v_{2}^T\\ \cdots \\ v_{n}^T \end{bmatrix}\times \begin{bmatrix} v_{1} &v_{2} &\cdots & v_{n} \end{bmatrix}
= \begin{bmatrix} v_{1}^Tv_{1} & v_{1}^Tv_{2} &\cdots & v_{1}^Tv_{n}\\ v_{2}^Tv_{1} & v_{2}^Tv_{2} &\cdots &v_{2}^Tv_{n} \\ \cdots & \cdots &\cdots &\cdots \\ v_{n}^Tv_{1} &v_{n}^Tv_{2} &\cdots &v_{n}^Tv_{n} \end{bmatrix}
= \begin{bmatrix} v_{1}^Tv_{1} & \hat{w}_{12} &\cdots & \hat{w}_{1n}\\ \hat{w}_{21} & v_{2}^Tv_{2} &\cdots &\hat{w}_{2n} \\ \cdots & \cdots &\cdots &\cdots \\ \hat{w}_{n1} &\hat{w}_{n2} &\cdots &v_{n} ^Tv_{n} \end{bmatrix}

  • 方阵\hat{W}的上三角的元素(不包括对角线),即为FM模型的二阶特征系数:<v_{i}v_{j}>
  • 注意:i<j
  • FM模型只关心互异特征之间的关系(i<j),所以对角线可以任意取值。
矩阵分解结论:

当超参数k充分大,对于任意正定的实矩阵\hat{W}\in R_{n\times n},均存在实矩阵\hat{V}\in R_{n\times k}使得\widehat{w}=V\times V^{T}


在这里对FM模型其他方面不过多阐述,详情移步


 

三、模型调试阶段

1.数据集调试

(1)数据集的划分

由于我们是百万级别的数据,因此我们采用留出法(hold-out)将数据集划分为训练集和测试集。
留出法直接将数据集D划分为两个互斥的部分,其中一部分作为训练集S ,另一部分用作测试集T。训练集和测试集的比例为70%:30%

from sklearn.model_selection import train_test_split
X=df.drop('rating', axis=1)
Y=df['rating']
X_train,X_val,Y_train,Y_val=train_test_split(X, Y, test_size=0.3, random_state=3)

(2)调整数据集大小

学习率为0.001,数据集为2000
学习率为0.001,数据集为20000

我们可以得到这样的结论:

  • 在数据集样本数量较少时(2000个),改变迭代次数的作用明显。.误差变化很大,整体不稳定
  • 在数据集样本数量较大时(2万个)改变迭代次数作用不大。总体上看,在迭代次数为5左右达到局部最优。并大约在迭代次数5之后达到稳定不变。
  • 在我们误差极值差不多的前提前,为了追求稳定性,我们选择2万的数据。

 

2.参数调整

根据以往的经验,这里我主要对学习率迭代数进行调整。

(1) 调试方法 1 其他参数不变 调整迭代数(学习率为0.001,数据集为20000)

(学习率为0.001,数据集为20000)

结论:在较大的数据集下,不改变其他参数的前提下,迭代次数1-10对模型准确度和误差的影响较大。迭代数超过10后影响不大。


(2)调试方法2 调整学习率

迭代数、学习率与训练误差的关系
迭代数、学习率与泛化误差的关系
  • 可以看出训练误差和泛化误差差别不大过拟合的可能性很低。因此,我们观察泛化误差,寻找最优参数搭配即可。
  • 总体上看,学习率为0.005的泛化误差平均值最小。因此,考虑选择学习率为0.005。同时可以看到学习率为0.005训练次数为72的时候,泛化误差最小。
  • 虽然迭代数为10之后影响不大,但是我们在细微的变化中选择最优的
  • 因此,目前得到的最优参数搭配:数据集20000,迭代数72 ,学习率0.005.

 

四、模型评估阶段

1、知识铺垫|混淆矩阵

混淆矩阵
  • True Positive (真正,TP)被模型预测为正的正样本
  • True Negative(真负 , TN)被模型预测为负的负样本
  • False Positive (假正, FP)被模型预测为正的负样本
  • False Negative(假负 , FN)被模型预测为负的正样本

FM模型运行结果

 

2、准确度(Accuracy)

准确度公式

评价结果:从准确度上看,FM模型在电影评价分类上表现水平较为一般。


 

3、误差(error)

(1) 知识铺垫:(经验误差|泛化误差|欠拟合|过拟合)

(2) 对于分类问题,我们常采用“logit逻辑函数”
logit函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

'''计算logit损失函数:L = log(1 + e**(y_hat * y))'''
def logit(y, y_hat):
    return np.log(1 + np.exp(-y * y_hat))

(3) 评估结论

详细的评估过程其实已经在参数调整里说明过了,这里不再复述。泛化误差与训练误差皆在0.67左右,过拟合可能性低,但高达0.67的泛化误差,仍然说明了这个FM模型在电影评分分类表现不佳。


 

4、查准率(Precision)


FM模型结果

评估结果

  • 我们可以看到学习率为0.005,迭代数为50时,PRECISION达到了局部最优,相较于别的学习率,学习率0.005在PRECISION上表现不错。
  • 整体而言PRECISION值在0.54左右,确实为真占预测为真的比重超过一半,FM模型性能在电影评分分类上还算一般。

 

5、召回率(Recall)

评估结果

  • 从召回率看,如果我们追求稳定性,就选择学习率为0.01的,平均值在0.38左右。如果我们追求高的recall,我们就选你学习率为0.0001,迭代数为1的参数搭配。
  • 整体而言,RECALL在0.4左右,预测为真占确实为真的比重较低,性能一般。

TIPS:查准率和召回率的关系
查准率和查全率是一对矛盾的度量,一般而言,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。

那么问题来了。如何在precision 和recall中权衡?
当然是具体问题具体分析。主要看你目的,但我们会希望尽量避免极端情况。

举个例子:

  • 癌症筛查,一般会要求高的查准度,并不要求高的查全率。因为,高的查全率,仅仅说明更多的人被测出可能得癌症,但是却不能精确地指出真正得癌症的人,不够精确的可能会给测试者带来心理上的负担,最后让测试者虚惊一场。
  • 但如果是病毒筛查,一般会要求高的查全率的,因为“宁肯误杀、不肯错放”,不小心放出去的携带病毒者,可能会导致悲剧的后果。
  • 如果你先上述过程太麻烦,懒癌患者首选:PRC和F1曲线

 

6、PRC曲线

评估结果

PRC

从PRC曲线上看,我们试图找均衡点,(0.59,0.3),但仍然离右上角有些远,说明FM模型对于电影评分分类较为一般。


 

7、F1 -score

评估结果


  • 从F1-score来看,学习率为0.01时,FM分类器较为稳定。
  • 但是F1-score的极大值出现在学习率0.0001,迭代数为1次时,但是极差大,稳定性较低。
  • 参数选择:若最求高的F1-score,就选择学习率为0.0001的,若求稳,就选择学习率为0.01的。
  • 模型评估:F1-score的整体平均值在0.44左右。FM模型在电影评分分类上性能表现一般。

 

8、ROC&AUC

TPR=\frac{TP}{TP+FN}
FPR=\frac{FP}{TN+FP}



评估结果


  • 从ROC曲线看,我们可以看出最优零界点距离(0,1)还是有些远,因此用FM模型来对电影评分分类效果不佳。
  • AUC值约为0.57,起码大于了0.5,说明FM模型对于电影评分的分类还是可以用的,只是性能一般

 

9、KAPPA系数

评估结果

Kappa系数: 0.1431773928163418

KAPPA系数越为0.14,处于0~0.2的区间,证明FM模型对于电影评分的分类具有极低的一致性。


 

10、NDCG

(1)含义与要点
(2) 评价结果
test-ndcg
test-ndcg

结论:我们可以看到学习率为0.005在迭代次数为250时,ndcg值达到最大,但这个0.365258仍不够看。而NDCG是0到1的数,越接近1说明模型性能越好。因此,我们的FM模型电在影评分的二分类场景下表现较差。


(3)分解与推进

TIP:要理解NDCG,我们需从CG到DCG再到NDCG.

1)累积增益CG,推荐系统中CG表示将每个推荐结果相关性的分值累加后作为整个推荐列表的得分:CG_{k}=\sum_{i=1}^{k}rel_{i}


2)折损累计增益(DCG)
DCG, Discounted 的CG,就是在每一个CG的结果上除以一个折损值。目的就是为了让排名越靠前的结果越能影响最后的结果

DCG_{K}=\sum_{i=1}^{k}\frac{2^{rel_{i}}-1}{log_{2}(i+1)}


3)归一化折损累计增益NDCG
对于不同用户的推荐列表的评估分数就进行归一化,就是NDCG,normalize后的DCG
NDCG_{K}=\frac{DCG_{K}}{IDCG_{K}}
IDCG为理想情况下最大的DCG值:
IDCG_{K}=\sum_{i=1}^{\left |REL \right |}\frac{2^{rel_{i}}-1}{log_{2}(i+1)}
其中 |REL| 表示,结果按照相关性从大到小的顺序排序,取前K个结果组成的集合。也就是按照最优的方式对结果进行排序。

 

五、总结

1、评价总结

FM第1次迭代,当前损失值为:0.6732
FM第21次迭代,当前损失值为:0.6723
FM第41次迭代,当前损失值为:0.6723
FM第61次迭代,当前损失值为:0.6723
FM在测试集的分类准确率为: 60.25%
FM在训练集的分类准确率为: 59.75%
训练集roc: 56.54%
混淆矩阵: 
 [[6558 1265]
 [4370 1806]]
验证集roc: 56.77%
混淆矩阵: 
 [[2803  608]
 [1777  812]]
查准率: 0.571830985915493
查全率: 0.31363460795674003
查准率与查全率的调和平均: 0.4050885507607882
ndcg指标: 0.35131512781803936
AUC: 0.5676938797625974
Kappa系数: 0.1431773928163418
海明距离: 0.3975
程序运行了: 0:04:53.367329 秒

Process finished with exit code 0

从准确率看,FM性能在电影评分分类里表现一般,查准率高于查全率,确实为真占预测为真的比重高于预测为真占确实为真的比重。ndcg在0.35左右,KAPPA 系数在0.143左右,FM模型在电影评分分类中性能表现不佳。AUC与PRC表现差距不大,证明正负样本分布均匀。总的来说,这么多评价指标都指向了一个结果:FM模型在电影评分分类中性能表现一般。


 

2、方法总结


①关于precision和recall的两者的权衡
两者的权衡主要参考任务需求
举个例子,垃圾短信分类。如果我们不希望漏掉任何重要短信时,我们可以选择高的recall,相对低的precision。如果我们痛恶垃圾短信,重要信息被漏掉也无妨,那就选择高的precision,低的recall。

②关于PRC和F1的选择。
PRC的均衡点是Precision、recall的简单算数平均数。而F1是Precision recall的调和平均数。这意味着,相比PRC,F1更加能避免极端情况。precision和recall 其中一个值很低,F1值就会低,而PRC只要其中一个值很高,另一个值很低也不影响PRC的值。因为:\frac{0.1+0.9}{2}\frac{0.9+0.1}{2} \frac{0.5+0.5}{2}在PRC曲线里都一样。因此,关于PRC和F1两者的选择,更取决于你在不在乎极端情况的出现。

关于PRC和ROC的选择
ROC和PRC在模型性能评估上效果都差不多,但需要注意的是,在正负样本分布得极不均匀(highly skewed datasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。点击这了解更多

希望本篇文章能够对你有所帮助,共勉 : )


代码来自GitHub
https://gith<wbr>ub.com/moren<wbr>jiujiu/FM/bl<wbr>ob/master/FM<wbr>_Demo.ipynb

上一篇 下一篇

猜你喜欢

热点阅读