master
aolingwen 5 years ago
parent 8ad8ad9d44
commit 91727bf23e

@ -27,7 +27,7 @@ loss = np.mean(np.multiply((y-np.dot(x,w))**2,record))
我们的目的就是最小化平方差损失函数,通常机器学习都是使用梯度下降的方法来最小化损失函数得到正确的参数。
梯度下降可以看成是我们被蒙住了双眼,然后要从山顶走到山下的过程。既然是被蒙住双眼,那么只能用脚去小步试探,看看哪个方向是朝着山下最的方向,找到了这个方向后就往该方向走一小步。然后不断地试探,走,试探,走,最终就可能会成功地走到山下。
梯度下降可以看成是我们被蒙住了双眼,然后要从山顶走到山下的过程。既然是被蒙住双眼,那么只能用脚去小步试探,看看哪个方向是朝着山下最的方向,找到了这个方向后就往该方向走一小步。然后不断地试探,走,试探,走,最终就可能会成功地走到山下。
如果我们将损失函数的值的大小看成是山的高度,那么我们就可以使用这种类似爬山的梯度下降算法来求解。其中,试探这个动作就是计算参数对于损失函数的偏导(即梯度),走这个动作就是根据梯度来更新参数,至于走的时候步子迈多大就是学习率。

@ -2,7 +2,7 @@
## 什么是推荐系统
你可能会有这样的经历,当你在电商网站闲逛时电商网站会根据你的历史行为轨迹分析出你的喜好,你推荐一些你可能喜欢的商品。当你刷抖音快手等小视频APP时这些APP会根据你观看视频的时长、视频类型等数据进行判别判别出你接下来可能更想要看到的视频。其实这些基本上都是推荐系统的应用。
你可能会有这样的经历,当你在电商网站闲逛时电商网站会根据你的历史行为轨迹分析出你的喜好,你推荐一些你可能喜欢的商品。当你刷抖音快手等小视频APP时这些APP会根据你观看视频的时长、视频类型等数据进行判别判别出你接下来可能更想要看到的视频。其实这些基本上都是推荐系统的应用。
![](1.jpg)
@ -27,7 +27,7 @@
- 基于内容的推荐系统无论是为了让你买东西还是给你找可能想阅读的文章如果我们从这些被推荐项着手试着分析它们的特征比如说体裁、类型、风格、颜色等与你之前购买或者阅读的偏好信息进行匹配这就是基于内容的推荐系统Content-Based Recommendation
- 基于知识的推荐系统。通过上面的介绍我们可以知道大量多次的购买是CBS跟CF的前提但是如果面对的是大量的单词购买者呢(比如说汽车),这个时候怎么办?我们可以考量使用更为精细和结构化的信息,比如说专业的特征等来构建明确的约束条件,同时,我们也看到,约束条件往往会跟用户有一个交互式的引导,这样才能比较好的摸索出用户的喜好。
- 基于知识的推荐系统。通过上面的介绍我们可以知道大量多次的购买是CBS跟CF的前提但是如果面对的是大量的单次购买者呢(比如说汽车),这个时候怎么办?我们可以考虑使用更为精细和结构化的信息,比如说专业的特征等来构建明确的约束条件,同时,我们也看到,约束条件往往会跟用户有一个交互式的引导,这样才能比较好的摸索出用户的喜好。
本章中主要介绍协同过滤算法,并讲解如何实现电影推荐功能。

@ -4,7 +4,7 @@
首先是准确度的量化问题。本章一开始就提到过,该数据集不能用准确率这个指标来衡量我们的算法的性能。因为该数据集的标签是不平衡的。那什么样的指标能够衡量这种不平衡的数据呢?那就是 F1 Score !
想要弄明白 F1 Score 所代表的意义,就需要先从混淆矩阵说起。以癌症检测系统为例,癌症检测系统的输出不是有癌症就是健康,这里为了方便,就用`1`表示患有癌症,`0`表示健康。假设现在拿`10000`条数据来进行测试,其中有`9978`条数据的真实类别是`0`,系统预测的类别也是`0`,有`2`条数据的真实类别是`1`却预测成了`0`,有`12`条数据的真实类别是`0`但预测成了`1`,有`8`条数据的真实类别是`1`,预测结果也是`1`
想要弄明白 F1 Score 所代表的意义,就需要先从混淆矩阵说起。以癌症检测系统为例,癌症检测系统的输出不是有癌症就是健康,这里为了方便,就用 1 表示患有癌症0 表示健康。假设现在拿 10000 条数据来进行测试,其中有 9978 条数据的真实类别是 0 ,系统预测的类别也是 0 ,有 2 条数据的真实类别是 1 却预测成了 0 ,有 12 条数据的真实类别是 0 但预测成了 1 ,有 8 条数据的真实类别是 1 ,预测结果也是 1
如果我们把这些结果组成如下矩阵,则该矩阵就成为**混淆矩阵**。
@ -20,16 +20,16 @@
| 0 | 预测`0`正确的数量 | 预测`1`错误的数量 |
| 1 | 预测`0`错误的数量 | 预测`1`正确的数量 |
如果将正确看成是`True`,错误看成是`False``0`看成是`Negtive``1`看成是`Positive`。然后将上表中的文字替换掉,混淆矩阵如下:
如果将正确看成是 True ,错误看成是 False 0 看成是 Negtive 1 看成是 Positive 。然后将上表中的文字替换掉,混淆矩阵如下:
| 真实预测 | 0 | 1 |
| ------------ | ------------ | ------------ |
| 0 | TN | FP |
| 1 | FN | TP |
因此`TN`表示真实类别是`Negtive`,预测结果也是`Negtive`的数量;`FP`表示真实类别是`Negtive`,预测结果是`Positive`的数量;`FN`表示真实类别是`Positive`,预测结果是`Negtive`的数量;`TP`表示真实类别是`Positive`,预测结果也是`Positive`的数量。
因此 TN 表示真实类别是 Negtive ,预测结果也是 Negtive 的数量; FP 表示真实类别是 Negtive ,预测结果是 Positive 的数量FN 表示真实类别是 Positive ,预测结果是 Negtive 的数量; TP 表示真实类别是 Positive ,预测结果也是 Positive 的数量。
很明显,当`FN`和`FP`都等于`0`时,模型的性能应该是最好的,因为模型并没有在预测的时候犯错误。即如下混淆矩阵:
很明显,当 FN 和 FP 都等于 0 时,模型的性能应该是最好的,因为模型并没有在预测的时候犯错误。即如下混淆矩阵:
| 真实预测 | 0 | 1 |
| ------------ | ------------ | ------------ |
@ -40,7 +40,7 @@
然后还需要明白两个概念:精准率和召回率。
**精准率(`Precision`)**指的是模型预测为`Positive`时的预测准确度,其计算公式如下:
**精准率( Precision )** 指的是模型预测为 Positive 时的预测准确度,其计算公式如下:
$$
Precisioin=\frac{TP}{TP+FP}
@ -53,11 +53,11 @@ $$
| 0 | 9978 | 12 |
| 1 | 2 | 8 |
则该系统的精准率=`8/(8+12)=0.4`
则该系统的精准率=8/(8+12)=0.4。
`0.4`这个值表示癌症检测系统的预测结果中如果有`100`个人被预测成患有癌症,那么其中有`40`人是真的患有癌症。**也就是说,精准率越高,那么癌症检测系统预测某人患有癌症的可信度就越高。**
0.4 这个值表示癌症检测系统的预测结果中如果有 100 个人被预测成患有癌症,那么其中有 40 人是真的患有癌症。**也就是说,精准率越高,那么癌症检测系统预测某人患有癌症的可信度就越高。**
**召回率(`Recall`)**指的是我们关注的事件发生了,并且模型预测正确了的比值,其计算公式如下:
**召回率(Recall)** 指的是我们关注的事件发生了,并且模型预测正确了的比值,其计算公式如下:
$$
Precisioin=\frac{TP}{FN+TP}
@ -70,16 +70,16 @@ $$
| 0 | 9978 | 12 |
| 1 | 2 | 8 |
则该系统的召回率=`8/(8+2)=0.8`
则该系统的召回率=8/(8+2)=0.8。
从计算出的召回率可以看出,假设有`100`个患有癌症的病人使用这个系统进行癌症检测,系统能够检测出`80`人是患有癌症的。**也就是说,召回率越高,那么我们感兴趣的对象成为漏网之鱼的可能性越低。**
从计算出的召回率可以看出,假设有 100 个患有癌症的病人使用这个系统进行癌症检测,系统能够检测出 80 人是患有癌症的。**也就是说,召回率越高,那么我们感兴趣的对象成为漏网之鱼的可能性越低。**
那么精准率和召回率之间存在着什么样的关系呢?举个例子,假设有这么一组数据,菱形代表`Positive`,圆形代表`Negtive`
那么精准率和召回率之间存在着什么样的关系呢?举个例子,假设有这么一组数据,菱形代表 Positive ,圆形代表 Negtive
![](12.jpg)
现在需要训练一个模型对数据进行分类,假如该模型非常简单,就是在数据上画一条线作为分类边界。模型认为边界的左边是`Negtive`,右边是`Positive`。如果该模型的分类边界向左或者向右移动的话,模型所对应的精准率和召回率如下图所示:
现在需要训练一个模型对数据进行分类,假如该模型非常简单,就是在数据上画一条线作为分类边界。模型认为边界的左边是 Negtive右边是Positive 。如果该模型的分类边界向左或者向右移动的话,模型所对应的精准率和召回率如下图所示:
![](13.jpg)
@ -87,24 +87,24 @@ $$
那么有没有像准确率一样值越高说明性能越好而且能够兼顾精准率和召回率的指标呢那就是F1 Score
`F1 Score`是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。`F1 Score`可以看作是模型准确率和召回率的一种加权平均,它的最大值是`1`,最小值是`0`。其公式如下:
F1 Score 是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1 Score 可以看作是模型准确率和召回率的一种加权平均,它的最大值是 1 ,最小值是 0 。其公式如下:
$$
F1=\frac{2*precision*recall}{precision+recall}
$$
- 假设模型`A`的精准率为`0.2`,召回率为`0.7`,那么模型`A`的`F1 Score`为`0.31111`
- 假设模型 A 的精准率为 0.2 ,召回率为 0.7 ,那么模型 A 的 F1 Score 为 0.31111
- 假设模型`B`的精准率为`0.7`,召回率为`0.2`,那么模型`B`的`F1 Score`为`0.31111`
- 假设模型 B 的精准率为 0.7 ,召回率为 0.2 ,那么模型 B 的 F1 Score 为 0.31111
- 假设模型`C`的精准率为`0.8`,召回率为`0.7`,那么模型`C`的`F1 Score`为`0.74667`
- 假设模型 C 的精准率为 0.8 ,召回率为 0.7 ,那么模型 C 的 F1 Score 为 0.74667
- 假设模型`D`的精准率为`0.2`,召回率为`0.3`,那么模型`D`的`F1 Score`为`0.24`
- 假设模型 D 的精准率为 0.2 ,召回率为 0.3 ,那么模型 D 的 F1 Score 为 0.24
从上述`4`个模型的各种性能可以看出模型C的精准率和召回率都比较高因此它的`F1 Score`也比较高。而其他模型的精准率和召回率要么都比较低,要么一个低一个高,所以它们的`F1 Score`比较低。
从上述 4 个模型的各种性能可以看出模型C的精准率和召回率都比较高因此它的 F1 Score 也比较高。而其他模型的精准率和召回率要么都比较低,要么一个低一个高,所以它们的 F1 Score 比较低。
这也说明了只有当模型的精准率和召回率都比较高时`F1 Score`才会比较高。这也是`F1 Score`能够同时兼顾精准率和召回率的原因。
这也说明了只有当模型的精准率和召回率都比较高时 F1 Score 才会比较高。这也是 F1 Score 能够同时兼顾精准率和召回率的原因。
嗯,现在知道用什么指标来衡量模型性能了,那怎样才能不偏不倚地判别模型性能的好坏呢?那就是交叉验证!
@ -114,13 +114,13 @@ $$
但如果仅仅是从训练集中抽取一小部分作为验证集的话,有可能会让对模型的性能有一种偏见或者误解。
比如现在要对手写数字进行识别,那么我就可能会训练一个分类模型。但可能模型对于数字`1`的识别准确率比较低 ,而验证集中没多少个数字为`1`的样本,然后用验证集测试完后得到的准确率为`0.96`。然后您可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的验证集让您的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是**k-折交叉验证**
比如现在要对手写数字进行识别,那么我就可能会训练一个分类模型。但可能模型对于数字`1`的识别准确率比较低 ,而验证集中没多少个数字为`1`的样本,然后用验证集测试完后得到的准确率为 0.96 。然后您可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的验证集让您的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是**k-折交叉验证**
在**K-折交叉验证**中把原始训练数据集分割成K个不重合的⼦数据集然后做K次模型训练和验证。每⼀次使⽤⼀个⼦数据集验证模型并使⽤其它K1个⼦数据集来训练模型。在这K次训练和验证中每次⽤来验证模型的⼦数据集都不同。最后对这K次在验证集上的性能求平均。
![](14.jpg)
OK明白了什么是F1 Score 和 交叉验证之后。我们就可以使用 sklearn 提供好了的接口来验证我们模型的性能了,代码十分简单。
OK明白了什么是 F1 Score 和交叉验证之后。我们就可以使用 sklearn 提供好了的接口来验证我们模型的性能了,代码十分简单。
```python
# 导入K折功能
@ -156,7 +156,7 @@ print(mean_f1_score)
![](15.jpg)
可以看到,我们的决策树模型的 F1 Score 为 0.8左右。嗯,结果还是不错的。当然,我们还可以做更多的分析和处理工作,来让我们的分数越来越高。希望你能自己动手,尝试提高分数,相信你会享受这个过程的。
可以看到,我们的决策树模型的 F1 Score 为 0.8 左右。嗯,结果还是不错的。当然,我们还可以做更多的分析和处理工作,来让我们的分数越来越高。希望你能自己动手,尝试提高分数,相信你会享受这个过程的。

@ -1,2 +0,0 @@
# 8.1:Apriori算法思想

@ -1,2 +0,0 @@
# 8.3:Apriori算法流程

@ -7,16 +7,17 @@
```python
# 构建只有一个元素的项集, 假设dataSet为[[1, 2], [0, 1]. [3, 4]]
# 那么该项集为frozenset({0}), frozenset({1}), frozenset({2}),frozenset({3}), frozenset({4})
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset, C1)
def create_C1(dataset):
C1 = set()
for t in basket:
for item in t:
item_set = frozenset([item])
C1.add(item_set)
return C1
```
有了从无到有之后,接下来需要从 1 到 K。不过需要注意的是这个时候需要排除掉支持度小于最小支持度的项集。代码实现如下
```python

@ -2,7 +2,7 @@
## 最简单的场景
互联网中的网页可以看是一个有向图其中网页是结点如果网页A有链接到网页B则存在一条有向边`A->B`,下面是一个简单的示例:
互联网中的网页可以看是一个有向图其中网页是结点如果网页A有链接到网页B则存在一条有向边`A->B`,下面是一个简单的示例:
![](1.jpg)
@ -38,7 +38,7 @@
## 怎样解决复杂场景的问题
上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如图中的 C ),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而上悄悄地在地址栏输入另外一个地址,而在地址栏输入而跳转到各个网页的概率是 1/n 。假设上网者每一步查看当前网页的概率为 a ,那么他从浏览器地址栏跳转的概率为 (1-a) ,于是迭代公式转化为:
上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如图中的 C ),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而是悄悄地在地址栏输入另外一个地址。像这样直接输入网址后跳转到各个网页的概率很显然是 1/n 。假设上网者每一步查看当前网页的概率为 a ,那么他从浏览器地址栏跳转的概率为 (1-a) ,于是迭代公式转化为:
$$
V'=\alpha MV+(1-\alpha)V

@ -1,8 +1,8 @@
# 9.1 什么是PageRank
PageRank的Page可是认为是网页表示网页排名也可以认为是Larry Page(google 产品经理)因为他是这个算法的发明者之一还是google CEO。
PageRank 的 Page 可以认为是网页表示网页排名也可以认为是Larry Page(google 产品经理)因为他是这个算法的发明者之一还是google CEO。
PageRank算法计算每一个网页的PageRank值然后根据这个值的大小对网页的重要性进行排序。它的思想是模拟一个悠闲的上网者上网者首先随机选择一个网页打开然后在这个网页上呆了几分钟后跳转到该网页所指向的链接这样无所事事、漫无目的地在网页上跳来跳去PageRank就是估计这个悠闲的上网者分布在各个网页上的概率。
PageRank算法计算每一个网页的 PageRank 值,然后根据这个值的大小对网页的重要性进行排序。它的思想是模拟一个悠闲的上网者,上网者首先随机选择一个网页打开,然后在这个网页上呆了几分钟后,跳转到该网页所指向的链接,这样无所事事、漫无目的地在网页上跳来跳去, PageRank 就是估计这个悠闲的上网者分布在各个网页上的概率。
当计算出上网者分布在各个网页上的概率之后,就可以将概率高的网页推荐给上网者以提高用户体验,同时也节省上网者查找资料的时间。

Loading…
Cancel
Save