链接地址:
<推荐书籍: Python数据分析和挖掘实战,不过不建议去买,除非工作需要>
搜索引擎:用户通过关键字,搜索引擎返回给用户与输出的关键词相关的信息。
推荐系统:不需要用户提供明确的需求,而是通过分析用户的历史行为,从而主动向用户推荐能够满足他们的兴趣和需求的信息。1.入门须知:
架构流程图
模型训练图
其实整体从技术层面来说,最难的是: 相似度计算公式
公式如下:

夹脚余弦
向量的大小,也就是向量的长度(或称模)。向量a的模记作|a|。向量a和向量b余弦值: cos = a*b/[|a|*|b|]给出了坐标 a(x1, y1) b(x2, y3)# 两个向量的模|a| = √[x1^2+y1^2]|b| = √[x2^2+y2^2]# 两个向量的向量积a*b = (x1,y1)(x2,y2) = x1x2+y1y2# 余弦值cos = a*b/[|a|*|b|] = (x1x2+y1y2)/[ √[x1^2+y1^2] * √[x2^2+y2^2] ]
2.基于用户的协同过滤(UserCF)
- 基于用户的协同过滤(UserCF): 用户少,物品多的场景
- 1)找到和目标用户兴趣相似的用户集合
- 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

例如:
人1 | 人2 | 人3 | 人4 | 人5 | 人6 | 人7 | |
---|---|---|---|---|---|---|---|
物品A | 1 | 1 | 1 | 1 | |||
物品B | 1 | 1 | |||||
物品C | 1 | 1 | 1 | ||||
物品D | 1 | 1 | 1 | ||||
物品E | 1 | 1 | |||||
物品F | 1 | 1 | 1 | ||||
物品G | 1 | 1 | 1 | ||||
物品H | 1 | 1 | |||||
物品I | 1 | 1 | |||||
物品J | 1 | 1 | 1 | 1 | |||
物品K | 1 | 1 | 1 |
用户集合 ( K-紧邻, 做用户分类)
我们通过用户标签,给用户进行分类:(例如:选中的物品来给用户做分类)
假设:- 1/3/4/5 运动类型的孩子
- 1/3/7 逗逼类型的孩子
- 2/6 死宅内心的孩子
热门推荐 (当然用户分类可以再细致一点,下面可以加过滤条件)
1.分完类,然后统计销量,把物品销量最好的进行推荐
3.基于物品的协同过滤(ItemCF)

- 基于物品的协同过滤(ItemCF): 用户多,物品少的场景
- 1.计算物品之间的相似度
- 2.根据物品的相似度和用户的历史行为给用户生产推荐列表
- 案例如下:(杰卡德相似系数)
-  选择A物品的用户,和B/C/D/E相似度,谁最高呢? 我们来看看 AB: A和B同时出现 => 4次 A和B出现过 => 7次 所以 AB 的相似度: 4/7 = 0.57 我们来看看 AB: A和C同时出现 => 1次 A和C出现过 => 5次 所以 AB 的相似度: 1/5 = 0.2
4.效果评估
1.非个性化算法:随机推荐
2.非个性化算法:热门推荐 3.个性化算法:相同的交叉验证
1.召回率和准确率
- TPR= TP/(TP + FN): 被预测为正的样本结果数/正样本实际数(即召回率)
- FPR= FP/(FP + TN): 被预测为正的负样本结果数/负样本实际数(个人观点:即误判流失率)
- 例如: 100件商品推荐 (TP + FN) || 50件讨厌商品 (FP + TN)
- 通过模型:
- 80件(TP + FP) = 60(推荐 合理 TP) + 20(推荐 不合理 FP)
- 70件(FN + TN) = 40(不推荐 不合理 FN) + 30(不推荐 合理 TN)
- 那么:
- precesion 正确率 = 60/80
- recall 召回率 = 60/100
- TPR 误判流失率 = FP/(FP + TN) = 20/50
- 通过模型:
- 120件(TP + FP) = 80(推荐 合理 TP) + 40(推荐 不合理 FP)
- 30件(FN + TN) = 20(不推荐 不合理 FN) + 10(不推荐 合理 TN)
- 那么:
- precesion 正确率 = 80/120
- recall 召回率 = 80/100
- TPR 误判流失率 = FP/(FP + TN) = 40/50
2.F值
一般情况,对同一个策略模型,用不同的阀值,可以统计出一组不同阀值下的精确率和召回率关系,我们称之为P-R曲线,如下图:
图中横坐标是召回率,用R(Recall)表示;纵坐标是准确率,用P(Precision)表示。
有时候,我们在P和R做出平衡,因此我们需要用一个值来体现策略在P值和R值两方面的整体表现。 最普通也最容易理解的是F1值,F1值的计算公式如下:F1= 2*P*R/(P + R) <= 1/([1/x+1/y]/2) // 倒数和的算数平方数的倒数更通用的公式是: F=(1+β^2)*P*R/(β^2*P+R)
@威哥的解释
( 哪个斜率大哪个重要: 分子看做常数,求个导;权重乘在P上,R的系数你看做1,如果这个权重大于1,就说明P对于整个指标的增长作用小) 例如: F = 5P * R / (4P + R) P=1, R=1 ; F值= 1 P=2, R=1 ; F值= 10/9 P=1, R=2 ; F值= 10/6 说明:R增长1,比P增长1,效果更明显,所以召回更重要@威哥的解释
这个问题好像就是召回和准确之间的矛盾。这个哪个重要得根据你的场景来决定,比如你做模型是为了预测这个人是否有罪,这个时候为了不错杀好人,你会希望你的模型的目标更偏向准确率,因为偏向召回率会把好人错杀。 另外一个场景:如果你的模型是用来预测一个人是否有传染病,这个时候明显召回率更加重要,因为你希望尽可能多的把真的传染病搞出来,以免出去害人,这个时候就顾不上好人了。 但是一般而言,这两个指标是有冲突的,于是就有两个指标的调和平均数出现了,其实还有一个与这两个相关的指标叫做 这个东西,其中有一个参数让你来控制哪个指标更加重要,当参数取1时两个一样重要就是你上面的式子。3.ROC和AUC
1. ROC 曲线
如何:画 ROC 曲线?
TPR= TP/(TP + FN): 被预测为正的样本结果数/正样本实际数(即召回率) FPR= FP/(FP + TN): 被预测为正的负样本结果数/负样本实际数(个人观点:即误判流失率)上图中一个阈值,得到一个点。现在我们需要一个独立于阈值的评价指标来衡量这个医生的医术如何,也就是遍历所有的阈值,得到ROC曲线。
- 左上角的点(TPR=1,FPR=0),为完美分类,也就是这个医生医术高明,诊断全对。
- 点A(TPR>FPR),医生A的判断大体是正确的。
- 中线上的点B(TPR=FPR),也就是医生B全都是蒙的,蒙对一半,蒙错一半;
- 下半平面的点C(TPR<FPR),这个医生说你有病,那么你很可能没有病,医生C的话我们要反着听,为真庸医

如上,是三条ROC曲线,在0.23处取一条直线。那么,在同样的低FPR=0.23的情况下,红色分类器得到更高的PTR。也就表明,ROC越往上,分类器效果越好。我们用一个标量值AUC来量化他。
2. AUC 面积
首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
1.AUC
AUC值为ROC曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好。
AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。 AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。 AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。2.AUC的物理意义
假设分类器的输出是样本属于正类的socre(置信度),则AUC的物理意义为,任取一对(正、负)样本,正样本的score大于负样本的score的概率。
计算AUC:
- 第一种方法:AUC为ROC曲线下的面积,那我们直接计算面积可得。面积为一个个小的梯形面积之和。计算的精度与阈值的精度有关。
- 第二种方法:根据AUC的物理意义,我们计算正样本score大于负样本的score的概率。取
N*M
(N为正样本数,M为负样本数)个二元组,比较score,最后得到AUC。时间复杂度为O(N*M
)。 - 第三种方法:与第二种方法相似,直接计算正样本score大于负样本的概率。我们首先把所有样本按照score排序,依次用rank表示他们,如最大score的样本,rank=n(n=N+M),其次为n-1。那么对于正样本中rank最大的样本,rank_max,有M-1个其他正样本比他score小,那么就有(rank_max-1)-(M-1)个负样本比他score小。其次为(rank_second-1)-(M-2)。最后我们得到正样本大于负样本的概率为
- 
- 时间复杂度为O(N+M)。

可以参考:
1. 2. 3.