master
aolingwen 5 years ago
parent d789d4baf8
commit 8b76ed54de

@ -7,7 +7,7 @@
## 为什么需要距离
`AGNES`算法是一种自底向上聚合的层次聚类算法它先会将数据集中的每个样本看作一个初始簇然后在算法运行的每一步中找出距离最近的两个簇进行合并直至达到预设的簇的数量。所以AGNES算法需要不断的计算簇之间的距离这也符合聚类的核心思想物以类聚人以群分因此怎样度量两个簇之间的距离成为了关键。
`AGNES`算法是一种自底向上聚合的层次聚类算法,它先会将数据集中的每个样本看作一个初始簇,然后在算法运行的每一步中找出距离最近的两个簇进行合并,直至达到预设的簇的数量。所以`AGNES`算法需要不断的计算簇之间的距离,这也符合聚类的核心思想(物以类聚,人以群分),因此怎样度量两个簇之间的距离成为了关键。
## 距离的计算

@ -17,7 +17,7 @@
那么准确对越高就能说明模型的分类性能越好吗?非也!举个例子,现在我开发了一套癌症检测系统,只要输入你的一些基本健康信息,就能预测出你现在是否患有癌症,并且分类的准确度为`0.999`。您认为这样的系统的预测性能好不好呢?
您可能会觉得,哇,这么高的准确度!这个系统肯定很牛逼!但是我们知道,一般年轻人患癌症的概率非常低,假设患癌症的概率为 0.001 ,那么其实我这个癌症检测系统只要一直输出您没有患癌症,准确度也可能能够达到`0.999`。
您可能会觉得,哇,这么高的准确度!这个系统肯定很牛逼!但是我们知道,一般年轻人患癌症的概率非常低,假设患癌症的概率为`0.001` ,那么其实我这个癌症检测系统只要一直输出您没有患癌症,准确度也可能能够达到`0.999`。
假如现在有一个人本身已经患有癌症,但是他自己不知道自己患有癌症。这个时候用我的癌症检测系统检测发现他没有得癌症,那很显然我这个系统已经把他给坑了(耽误了治疗)。
@ -142,7 +142,7 @@ $$
- 假设模型`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`能够同时兼顾精准率和召回率的原因。
@ -200,7 +200,7 @@ $$
<div align=center><img src="./img/70.jpg", height="300" width="300"/></div>
那么模型`A`的性能比模型`B`的性能好,因为模型`A`当`FPR`较低时所对应的`TPR`比模型`B`的低`FPR`所对应的`TPR`更高。由由于随着`FPR`的增大,`TPR`也会增大。所以ROC曲线与横轴所围成的面积越大模型的分类性能就越高。而ROC曲线的面积称为`AUC`。
那么模型`A`的性能比模型`B`的性能好,因为模型`A`当`FPR`较低时所对应的`TPR`比模型`B`的低`FPR`所对应的`TPR`更高。由由于随着`FPR`的增大,`TPR`也会增大。所以ROC曲线与横轴所围成的面积越大模型的分类性能就越高。而`ROC`曲线的面积称为`AUC`。
#####AUC

@ -6,7 +6,7 @@
<div align=center><img src="./img/21.jpg", height="300" width="300"/></div>
其实这样一种脑回路的形式就是我们所说的决策树。所以从图中能看出决策树是一个类似于人们决策过程的树结构,从根节点开始,每个分枝代表一个新的决策事件,会生成两个或多个分枝,每个叶子代表一个最终判定所属的类别。很明显,如果我现在已经构造好了一颗决策树的话,现在我得到一条数据`(男, 29)`,我就会认为这个人没有买过车。所以呢,关键问题就是怎样来构造决策树了。
其实这样一种脑回路的形式就是决策树。所以从图中能看出决策树是一个类似于人们决策过程的树结构,从根节点开始,每个分枝代表一个新的决策事件,会生成两个或多个分枝,每个叶子代表一个最终判定所属的类别。很明显,如果我现在已经构造好了一颗决策树的话,现在我得到一条数据`(男, 29)`,我就会认为这个人没有买过车。所以呢,关键问题就是怎样来构造决策树了。
构造决策树时会遵循一个指标,有的是按照**信息增益**来构建,这种叫**ID3算法**,有的是**信息增益比**来构建,这种叫**C4.5**算法,有的是按照**基尼系数**来构建的,这种叫**CART**算法。在这里主要介绍一下**ID3算法**。
@ -23,13 +23,13 @@
从这个公式也可以看出,如果我概率是 $$0$$ 或者是 $$1$$ 的时候,我的熵就是 $$0$$ 。(因为这种情况下我随机变量的不确定性是最低的),那如果我的概率是 $$0.5$$ 也就是五五开的时候,我的熵是最大也就是 $$1$$ 。(就像扔硬币,你永远都猜不透你下次扔到的是正面还是反面,所以它的不确定性非常高)。所以呢,**熵越大,不确定性就越高**。
我们实际情况下,我们要研究的随机变量基本上都是多随机变量的情况,所以假设有随便量`(X,Y)`,那么它的联合概率分布是这样的:
在实际情况下,要研究的随机变量基本上都是多随机变量的情况,所以假设有随便量`(X,Y)`,那么它的联合概率分布是这样的:
$$
P(X=x_i, Y=y_j)=p_{ij}, i=1,2,...,n; j=1,2,...,m
$$
那如果我想知道在我事件 $$X$$ 发生的前提下,事件 $$Y$$ 发生的熵是多少的话,这种熵我们叫它**条件熵**。条件熵 $$H(Y|X)$$ 表示随机变量 $$X$$ 的条件下随机变量 $$Y$$ 的不确定性。条件熵的计算公式是这样的:$$H(Y|X)=\sum^n_{i=1}p_iH(Y|X=x_i)$$。
那如果我想知道在我事件 $$X$$ 发生的前提下,事件 $$Y$$ 发生的熵是多少的话,这种熵叫它**条件熵**。条件熵 $$H(Y|X)$$ 表示随机变量 $$X$$ 的条件下随机变量 $$Y$$ 的不确定性。条件熵的计算公式是这样的:$$H(Y|X)=\sum^n_{i=1}p_iH(Y|X=x_i)$$。
**当然条件熵的一个性质也熵的性质一样,我概率越确定,条件熵就越小,概率越五五开,条件熵就越大**。
@ -55,7 +55,7 @@ $$
`活跃度为高的熵= -0-(6/6)*log(6/6)=0`
现在有了总的熵和条件熵之后我们就能算出性别和活跃度这两个特征的信息增益了。
现在有了总的熵和条件熵之后就能算出性别和活跃度这两个特征的信息增益了。
`性别的信息增益=总的熵-(8/15)*性别为男的熵-(7/15)*性别为女的熵=0.0064`
@ -69,7 +69,7 @@ $$
这样看上去可能会懵,不如用刚刚的数据来构建一颗决策树。
一开始我们已经算过信息增益最大的是活跃度,所以决策树的根节点是活跃度 。所以这个时候树是这样的:
一开始已经算过信息增益最大的是活跃度,所以决策树的根节点是活跃度 。所以这个时候树是这样的:
<div align=center><img src="./img/23.jpg", height="100" width="100"/></div>

@ -0,0 +1,14 @@
这些年来,大数据先是被神化,继而又被妖魔化,到了今天,其实谁也不知道别人所谓的大数据指的是什么。有时候大数据的定义里既有平台(硬件)又有分析技术。但为了说清楚大数据和人工智能的关系,我们还是回归大数据的本质:海量的、多维度、多形式的数据。
任何智能的发展,其实都需要一个学习的过程。而近期人工智能之所以能取得突飞猛进的进展,不能不说是因为这些年来大数据长足发展的结果。正是由于各类感应器和数据采集技术的发展,我们开始拥有以往难以想象的的海量数据,同时,也开始在某一领域拥有深度的、细致的数据。而这些,都是训练某一领域“智能”的前提。
如果我们把人工智能看成一个嗷嗷待哺拥有无限潜力的婴儿,某一领域专业的海量的深度的数据就是喂养这个天才的奶粉。奶粉的数量决定了婴儿是否能长大,而奶粉的质量则决定了婴儿后续的智力发育水平。
与以前的众多数据分析技术相比,人工智能技术立足于神经网络,同时发展出多层神经网络,从而可以进行深度机器学习。与以外传统的算法相比,这一算法并无多余的假设前提(比如线性建模需要假设数据之间的线性关系),而是完全利用输入的数据自行模拟和构建相应的模型结构。这一算法特点决定了它是更为灵活的、且可以根据不同的训练数据而拥有自优化的能力。
但这一显著的优点带来的便是显著增加的运算量。在计算机运算能力取得突破以前,这样的算法几乎没有实际应用的价值。大概十几年前,我们尝试用神经网络运算一组并不海量的数据,整整等待三天都不一定会有结果。但今天的情况却大大不同了。高速并行运算、海量数据、更优化的算法共同促成了人工智能发展的突破。所以大数据与人工智能的关系非常密切。
本系列书籍主要针对大数据与人工智能两个方向中使用最广的技术编写了四本书分别为《HBase入门指南》《xxx》《xxx》与《机器学习 原理与实践》。
由于编者水平有限加之时间仓促书中难免存在疏漏与不足之处恳请读者和专家提出您宝贵的意见和建议。educoder团队将竭尽所能不断提高书籍质量为广大读者提供更好的书籍。

@ -41,7 +41,7 @@
## kNN算法解决回归问题
很明显,刚刚我们使用**kNN算法**解决了一个分类问题,那**kNN算法**能解决回归问题吗?当然可以!
很明显,刚刚使用**kNN算法**解决了一个分类问题,那**kNN算法**能解决回归问题吗?当然可以!
在使用`kNN`算法解决回归问题时的思路和解决分类问题的思路基本一致,只不过预测标签值是多少的的时候是将距离最近的`k`个样本的标签值加起来再算个平均,而不是投票。例如离待预测样本最近的`5`个样本的标签如下:

@ -4,15 +4,15 @@
线性回归是什么意思?可以拆字释义。回归肯定不用我多说了,那什么是线性呢?我们可以回忆一下初中时学过的直线方程:$$y=k*x+b$$
这个式子表达的是,当我知道 k参数和 b参数的情况下我随便给一个 x 我都能通过这个方程算出 y 来。而且呢,这个式子是线性的,为什么呢?因为从直觉上来说,你都知道,这个式子的函数图像是条直线。
这个式子表达的是,当我知道`k`(参数)和`b`(参数)的情况下,我随便给一个`x`我都能通过这个方程算出`y`来。而且呢,这个式子是线性的,为什么呢?因为从直觉上来说,你都知道,这个式子的函数图像是条直线。
从理论上来说,这式子满足线性系统的性质(至于线性系统是什么,可以查阅相关资料,这里就不多做赘述了,不然没完没了)。你可能会觉得疑惑,这一节要说的是线性回归,我说个这么 low 直线方程干啥?其实,说白了,线性回归就是在 N 维空间中找一个形式像直线方程一样的函数来拟合数据而已。比如说,我现在有这么一张图,横坐标代表房子的面积,纵坐标代表房价。
从理论上来说,这式子满足线性系统的性质(至于线性系统是什么,可以查阅相关资料,这里就不多做赘述了,不然没完没了)。你可能会觉得疑惑,这一节要说的是线性回归,我说个这么`low`直线方程干啥?其实,说白了,线性回归就是在`N`维空间中找一个形式像直线方程一样的函数来拟合数据而已。比如说,我现在有这么一张图,横坐标代表房子的面积,纵坐标代表房价。
<div align=center><img src="./img/10.jpg", height="300" width="350"/></div>
然后呢,线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点。
那如果让 1000 位朋友来找这条直线就可能找出 1000 种直线来,比如这样
那如果让`1000`位朋友来找这条直线就可能找出`1000`种直线来,比如这样
<div align=center><img src="./img/11.jpg", height="300" width="350"/></div>
@ -28,7 +28,7 @@
## 损失函数
那既然是找直线,那肯定是要有一个评判的标准,来评判哪条直线才是最好的。OK道理我们都懂,那咋评判呢?其实只要算一下实际房价和我找出的直线根据房子大小预测出来的房价之间的差距就行了。说白了就是算两点的距离。当把所有实际房价和预测出来的房价的差距(距离)算出来然后做个加和,就能量化出现在预测的房价和实际房价之间的误差。例如下图中我画了很多条小数线,每一条小数线就是实际房价和预测房价的差距(距离)。
那既然是找直线,那肯定是要有一个评判的标准,来评判哪条直线才是最好的。道理我们都懂,那咋评判呢?其实只要算一下实际房价和我找出的直线根据房子大小预测出来的房价之间的差距就行了。说白了就是算两点的距离。当把所有实际房价和预测出来的房价的差距(距离)算出来然后做个加和,就能量化出现在预测的房价和实际房价之间的误差。例如下图中我画了很多条小数线,每一条小数线就是实际房价和预测房价的差距(距离)。
<div align=center><img src="./img/14.jpg", height="300" width="350"/></div>
@ -49,7 +49,9 @@ $$
## 怎样计算出线性回归的解?
现在你应该已经弄明白了一个事实那就是我只要找到一组参数也就是线性方程每一项上的系数能让我的损失函数的值最小那我这一组参数就能最好的拟合我现在的训练数据。OK那怎么来找到这一组参数呢其实有两种套路一种就是用大名鼎鼎的**梯度下降**,其大概思想就是根据每个参数对损失函数的偏导来更新参数。另一种是线性回归的**正规方程解**,这名字听起来高大上,其实本质就是根据一个固定的式子计算出参数。由于**正规方程解**在数据量比较大的时候时间复杂度比较高,所以在这一部分中,主要聊聊怎样使用梯度下降的方法来更新参数。
现在你应该已经弄明白了一个事实,那就是我只要找到一组参数(也就是线性方程每一项上的系数)能让我的损失函数的值最小,那我这一组参数就能最好的拟合我现在的训练数据。
那怎么来找到这一组参数呢?其实有两种套路,一种就是用大名鼎鼎的**梯度下降**,其大概思想就是根据每个参数对损失函数的偏导来更新参数。另一种是线性回归的**正规方程解**,这名字听起来高大上,其实本质就是根据一个固定的式子计算出参数。由于**正规方程解**在数据量比较大的时候时间复杂度比较高,所以在这一部分中,主要聊聊怎样使用梯度下降的方法来更新参数。
### 什么是梯度下降
@ -82,7 +84,7 @@ $$
### 使用梯度下降求解线性回归的解
我们知道线性回归的损失函数 $$J$$ 为:$$J(\theta)=\frac{1}{2}\sum^m_{i=1}(h_\theta(x^i)-y^i)^2$$,其中$$\theta$$为线性回归的解。使用梯度下降来求解,最关键的一步是算梯度(也就是算偏导),通过计算可知第$$j$$个权重的偏导为:
线性回归的损失函数 $$J$$ 为:$$J(\theta)=\frac{1}{2}\sum^m_{i=1}(h_\theta(x^i)-y^i)^2$$,其中$$\theta$$为线性回归的解。使用梯度下降来求解,最关键的一步是算梯度(也就是算偏导),通过计算可知第$$j$$个权重的偏导为:
<center>
$$

@ -18,7 +18,6 @@ $$
\end{cases}
$$
</center>
<br>
(其中$$\hat y$$为样本 $$x$$ 根据模型预测出的标签结果,标签 $$0$$ 和标签 $$1$$ 所代表的含义是根据业务决定的,比如在癌细胞识别中可以使 $$0$$ 代表良性肿瘤,$$1$$ 代表恶性肿瘤)。

@ -1,6 +1,6 @@
# 多分类学习
现实中常遇到多分类学习任务。有些二分类算法可以直接推广到多分类但在更多情形下我们是基于一些策略利用二分类算法来解决多分类问题。例如OvO、OvR。
现实中常遇到多分类学习任务。有些二分类算法可以直接推广到多分类,但在更多情形下,我们是基于一些策略,利用二分类算法来解决多分类问题。例如:`OvO``OvR`
## OvO

@ -4,13 +4,13 @@
`Policy Gradient`的核心思想非常简单,就是找一个函数$$\pi$$,这个函数$$\pi$$能够根据现在环境的状态(state)来产生接下来要采取的行动或者动作(action)。即$$\pi(state)\rightarrow action$$。
函数$$\pi$$其实可以看成是一个模型,那么想在无数次尝试中寻找出能让 Agent 尽量拿高分的模型应该怎样来找呢?我相信您应该猜到了!没错!就是神经网络!
函数$$\pi$$其实可以看成是一个模型,那么想在无数次尝试中寻找出能让`Agent`尽量拿高分的模型应该怎样来找呢?我相信你应该猜到了!没错!就是神经网络!
我们可以将游戏画面传给神经网络作为输入,然后神经网络预测一下当前游戏画面下,下一步动作的概率分布。
<div align=center><img src="../img/1004.jpg", height=250/></div>
细心的可能会发现,如果每次取概率最高的动作作为下一步的动作,那不就成分类了么。其实`Policy Gradient`的并不是每次都选取概率最高的动作,而是根据动作的概率分布进行采样。也就是说就算我预测出来的向上挪的概率为`80%`,也不一定会向上挪。
细心的可能会发现,如果每次取概率最高的动作作为下一步的动作,那不就成分类了么。其实`Policy Gradient`的并不是每次都选取概率最高的动作,而是根据动作的概率分布进行采样。也就是说就算我预测出来的向上挪的概率为`80%`,也不一定会向上挪。
那么为什么采样而不是直接选取概率最大的呢?因为这样很有灵性。可以想象一下,我们和别人下棋的时候,如果一直按照套路来下,那么对手很可能能够猜到我们下一步棋会怎么走,从而占据主动。如果我们时不时地不按套路出牌,但是这种不按套路的动作不会降低太多对于我们能够赢下这一局棋的几率。那么对手很可能会不知所措,主动权就掌握在我们手里。就像《天龙八部》中虚竹大破珍珑棋局时一样,可能有灵性一点,会有意想不到的效果。
@ -26,20 +26,20 @@
<div align=center><img src="../img/1006.jpg", height=350/></div>
那么怎样评价这`10`把游戏打的好还是不好呢?也很明显,`10`把游戏的所有反馈全部都加起来就好了。如果把这些反馈的和称为总反馈(总得分),那么就有**总反馈(总得分)=第1把反馈1+第1把反馈2+...+第10把反馈m**。也就是说总反馈越高越好。
那么怎样评价这`10`把游戏打的好还是不好呢?也很明显,`10`把游戏的所有反馈全部都加起来就好了。如果把这些反馈的和称为总反馈(总得分),那么就有**总反馈(总得分)=第1把反馈1+第1把反馈2+...+第10把反馈m**。也就是说总反馈越高越好。
说到这,有一个问题需要弄清楚:假设总共玩了`100`把,每`10`把计算一次总反馈,那么这`10`次的总反馈会不会是一模一样的呢?其实仔细想想会发现不会一摸一样,因为:
- 游戏的状态实时在变,所以环境状态不可能一直是一样的。
- 动作是从一个概率分布中采样出来的。
既然总反馈一直会变,那么我们可以尝试换一种思路,即计算总反馈的期望,即总反馈的期望越高越好。那这个期望怎么算呢?
既然总反馈一直会变,可以尝试换一种思路,即计算总反馈的期望,即总反馈的期望越高越好。那这个期望怎么算呢?
首先我们可以将每一把游戏看成一个游戏序列(**状态1->动作1->反馈1->状态2->动作2->反馈2 ... 状态N->动作N->反馈N**)。那么每一个游戏序列(即每一把游戏)的**反馈=反馈1+反馈2+...+反馈N**。因此,若假设$$R(\tau)$$表示游戏序列$$\tau$$的反馈,则有:$$R(\tau)=\sum_{n=1}^N\tau_n$$。
如果我们把整个乒乓球游戏所有可能出现的状态,动作,反馈组合起来看成是玩了`N`(`N`很大很大) 把游戏,就会有`N`个游戏序列(**游戏序列1游戏序列2游戏序列3, ... , 游戏序列N**)。那么我们在玩游戏时所得到的游戏序列实际上就是从这`N`个游戏序列中采样得到的。
如果把整个乒乓球游戏所有可能出现的状态,动作,反馈组合起来看成是玩了`N`(`N`很大很大) 把游戏,就会有`N`个游戏序列(**游戏序列1游戏序列2游戏序列3, ... , 游戏序列N**)。那么我们在玩游戏时所得到的游戏序列实际上就是从这`N`个游戏序列中采样得到的。
所以我们游戏的总的反馈期望$$\overline{R_\theta}$$可表示为:$$\overline{R_\theta}=\sum_\tau R(\tau)P(\tau|\theta)$$。这个公式看起来复杂,其实不难理解。
所以游戏的总的反馈期望$$\overline{R_\theta}$$可表示为:$$\overline{R_\theta}=\sum_\tau R(\tau)P(\tau|\theta)$$。这个公式看起来复杂,其实不难理解。
<div align=center><img src="../img/1007.jpg", height=150/></div>
@ -75,7 +75,7 @@ $$
</center>
<br>
会发现$$\sum_{n=1}^NR(\tau^n)$$很好算,只要把反馈全部加起来就完事了,难算的是$$\nabla logP(\tau^n|\theta)$$。所以我们来看一下$$\nabla logP(\tau^n|\theta)$$应该怎么算。
会发现$$\sum_{n=1}^NR(\tau^n)$$很好算,只要把反馈全部加起来就完事了,难算的是$$\nabla logP(\tau^n|\theta)$$。所以我们来看一下$$\nabla logP(\tau^n|\theta)$$应该怎么算。
由于一个游戏序列$$\tau$$是由多个状态,动作,反馈构成的,即:
@ -113,7 +113,7 @@ $$
</center>
<br>
$$P(a_t|s_t,\theta)$$其实就是我们神经网络根据环境状态预测出来的下一步的动作概率分布。
$$P(a_t|s_t,\theta)$$其实就是神经网络根据环境状态预测出来的下一步的动作概率分布。
<div align=center><img src="../img/1009.jpg", height=150/></div>

@ -1,6 +1,6 @@
# 什么是强化学习
强化学习是一类算法,是让计算机实现从一开始完全随机的进行操作,通过不断地尝试,从错误中学习,最后找到规律,学会了达到目的的方法。这就是一个完整的强化学习过程。让计算机在不断的尝试中更新自己的行为,从而一步步学习如何操自己的行为得到高分。
强化学习是一类算法,是让计算机实现从一开始完全随机的进行操作,通过不断地尝试,从错误中学习,最后找到规律,学会了达到目的的方法。
它主要包含四个元素,`Agent`、环境状态、行动、奖励,强化学习的目标就是获得最多的累计奖励。

Binary file not shown.

Binary file not shown.

@ -2,41 +2,41 @@
##MSE
MSEMean Squared Error叫做均方误差其实就是线性回归的损失函数。公式如下
`MSEMean Squared Error`叫做均方误差,其实就是线性回归的损失函数。公式如下:
$$
\frac{1}{m}\sum_{i=1}^m(y^i-p^i)^2
$$
其中$$y^i$$表示第 i 个样本的真实标签,$$p^i$$表示模型对第 i 个样本的预测标签。线性回归的目的就是让损失函数最小。那么模型训练出来了,我们在测试集上用损失函数来评估模型就行了。
其中$$y^i$$表示第`i`个样本的真实标签,$$p^i$$表示模型对第`i`个样本的预测标签。线性回归的目的就是让损失函数最小。那么模型训练出来了,我们在测试集上用损失函数来评估模型就行了。
##RMSE
RMSERoot Mean Squard Error均方根误差公式如下
`RMSERoot Mean Squard Error`均方根误差,公式如下:
$$
\sqrt{\frac{1}{m}\sum_{i=1}^m(y^i-p^i)^2}
$$
RMSE 其实就是**MSE**开个根号。有什么意义呢?其实实质是一样的。只不过用于数据更好的描述。
`RMSE`其实就是**MSE**开个根号。有什么意义呢?其实实质是一样的。只不过用于数据更好的描述。
例如:要做房价预测,每平方是万元,我们预测结果也是万元。那么差值的平方单位应该是千万级别的。那我们不太好描述自己做的模型效果。怎么说呢?我们的模型误差是多少千万?于是干脆就开个根号就好了。我们误差的结果就跟我们数据是一个级别的了,在描述模型的时候就说,我们模型的误差是多少万元。
##MAE
MAE(Mean Aboslute Error),公式如下:
`MAE(Mean Aboslute Error)`,公式如下:
$$
\frac{1}{m}\sum_{i=1}^m|y^i-p^i|
$$
MAE 虽然不作为损失函数,确是一个非常直观的评估指标,它表示每个样本的预测标签值与真实标签值的 L1 距离。
`MAE`虽然不作为损失函数,确是一个非常直观的评估指标,它表示每个样本的预测标签值与真实标签值的`L1`距离。
#####R-Squared
上面的几种衡量标准针对不同的模型会有不同的值。比如说预测房价 那么误差单位就是万元。数子可能是 3 4 5 之类的。那么预测身高就可能是 0.1 0.6 之类的。没有什么可读性,到底多少才算好呢?不知道,那要根据模型的应用场景来。 看看分类算法的衡量标准就是正确率,而正确率又在 01 之间,最高百分之百。最低 0 。如果是负数,则考虑非线性相关。很直观,而且不同模型一样的。那么线性回归有没有这样的衡量标准呢?
上面的几种衡量标准针对不同的模型会有不同的值。比如说预测房价 那么误差单位就是万元。数子可能是`3``4``5`之类的。那么预测身高就可能是`0.1``0.6`之类的。没有什么可读性,到底多少才算好呢?不知道,那要根据模型的应用场景来。看看分类算法的衡量标准就是正确率,而正确率又在 `01`之间,最高百分之百。最低`0`。如果是负数,则考虑非线性相关。很直观,而且不同模型一样的。那么线性回归有没有这样的衡量标准呢?
R-Squared 就是这么一个指标,公式如下:
`R-Squared`就是这么一个指标,公式如下:
$$
R^2=1-\frac{\sum_i(p^i-y^i)^2}{\sum_i(y_{mean}^i-y^i)^2}
@ -48,8 +48,8 @@ $$
其实分子表示的是模型预测时产生的误差,分母表示的是对任意样本都预测为所有标签均值时产生的误差,由此可知:
1. $$R^2 \leq1$$,当我们的模型不犯任何错误时,取最大值 1
1. $$R^2 \leq1$$,当我们的模型不犯任何错误时,取最大值`1`
2. 当我们的模型性能跟基模型性能相同时,取 0
2. 当我们的模型性能跟基模型性能相同时,取`0`
3. 如果为负数,则说明我们训练出来的模型还不如基准模型,此时,很有可能我们的数据不存在任何线性关系。

@ -42,7 +42,7 @@ X = digits.data
y = digits.target
```
得到`X``y`数据之后,我们还需要将这些数据进行划分,划分成两个部分,一部分是训练集,另一部分是测试集。因为如果没有测试集的话,我们并不知道我们的手写数字识别程序识别得准不准。数据集划分代码如下:
得到`X``y`数据之后,还需要将这些数据进行划分,划分成两个部分,一部分是训练集,另一部分是测试集。因为如果没有测试集的话,并不知道手写数字识别程序识别得准不准。数据集划分代码如下:
```python
# 将Xy划分成训练集和测试集其中训练集的比例为80%测试集的比例为20%
@ -68,7 +68,7 @@ clf.fit(X_train, Y_train)
result = clf.predict(X_test)
```
得到预测结果后,我们需要将其与测试集的真实答案进行比对,计算出预测的准确率。`sklearn`已经为我们提供了计算准确率的接口,使用代码如下:
得到预测结果后,需要将其与测试集的真实答案进行比对,计算出预测的准确率。`sklearn`已经提供了计算准确率的接口,使用代码如下:
```python
# 导入计算准确率的接口
@ -80,9 +80,9 @@ acc = accuracy_score(y_test, result)
print(acc)
```
此时你会发现我们短短的几行代码实现的手写数字识别程序的准确率高于**0.95**。
此时你会发现短短的几行代码实现的手写数字识别程序的准确率高于**0.95**。
而且我们不仅可以使用随机森林来实现手写数字识别,我们还可以使用别的机器学习算法实现,比如逻辑回归,代码如下:
而且不仅可以使用随机森林来实现手写数字识别,还可以使用别的机器学习算法实现,比如逻辑回归,代码如下:
```python
from sklearn.linear_model import LogisticRegression
@ -146,7 +146,7 @@ print(acc)
`3`. 重复第`2`步`k`次,这样每份都有一次机会作为测试集,其他机会作为训练集
`4`. 计算`k`组测试结果的平均值作为算法性能的估计。
sklearn 为我们提供了将数据划分成 k 份类 KFold ,使用示例如下:
`sklearn`为我们提供了将数据划分成`k`份的类`KFold`,使用示例如下:
```python
# 导入KFold

@ -2,7 +2,7 @@
## 训练集,测试集,样本,特征
假设我们收集了一份西瓜数据:
假设收集了一份西瓜数据:
| 色泽 | 纹理 | 声音 | 甜不甜 |
| :-: | :-: | :-: | :-: |
@ -13,7 +13,7 @@
并假设现在已经使用机器学习算法根据这份数据的特点训练出了一个很厉害的模型,成为了一个挑瓜好手,只需告诉它这个西瓜的色泽,纹理和声音就能告诉你这个西瓜甜不甜。
我们通常将这种喂给机器学习算法来训练模型的数据称为**训练集**,用来让机器学习算法预测的数据称为**测试集**。
通常将这种喂给机器学习算法来训练模型的数据称为**训练集**,用来让机器学习算法预测的数据称为**测试集**。
训练集中的所有行称为**样本**。由于我们的挑瓜好手需要的西瓜信息是色泽、纹理和声音,所以此训练集中每个样本的前`3`列称为**特征**。挑瓜好手给出的结果是甜或不甜,所以最后`1`列称为**标签**。
@ -23,28 +23,28 @@
## 欠拟合与过拟合
最好的情况下,我们的模型应该不管在训练集上还是测试集上,它的性能都不错。但是有的时候,我们的模型在训练集上的性能比较差,那么这种情况我们称为**欠拟合**。那如果我们的模型在训练集上的性能好到爆炸,但在测试集上的性能却不尽人意,那么这种情况我们称为**过拟合**。
最好的情况下,模型应该不管在训练集上还是测试集上,它的性能都不错。但是有的时候,我模型在训练集上的性能比较差,那么这种情况我们称为**欠拟合**。那如果模型在训练集上的性能好到爆炸,但在测试集上的性能却不尽人意,那么这种情况我们称为**过拟合**。
其实欠拟合与过拟合的区别和我们生活中学生考试的例子很像。如果一个学生在平时的练习中题目的正确率都不高,那么说明这个学生可能基础不牢或者心思没花在学习上,所以这位学生可能欠缺基础知识或者智商可能不太高或者其他种种原因,像这种情况可以看成是**欠拟合**。那如果这位学生平时练习的正确率非常高,但是他不怎么灵光,喜欢死记硬背,只会做已经做过的题,一碰到没见过的新题就不知所措了。像这种情况可以看成时是**过拟合**。
其实欠拟合与过拟合的区别和生活中学生考试的例子很像。如果一个学生在平时的练习中题目的正确率都不高,那么说明这个学生可能基础不牢或者心思没花在学习上,所以这位学生可能欠缺基础知识或者智商可能不太高或者其他种种原因,像这种情况可以看成是**欠拟合**。那如果这位学生平时练习的正确率非常高,但是他不怎么灵光,喜欢死记硬背,只会做已经做过的题,一碰到没见过的新题就不知所措了。像这种情况可以看成时是**过拟合**。
那么是什么原因导致了欠拟合和过拟合呢?
我们的模型过于简单,很可能会导致欠拟合。如果模型过于复杂,就很可能会导致过拟合。
当模型过于简单,很可能会导致欠拟合。如果模型过于复杂,就很可能会导致过拟合。
<div align=center><img src="./img/64.jpg", height="250" width="350"/></div>
## 验证集与交叉验证
在真实业务中,我们可能没有真正意义上的测试集,或者说不知道测试集中的数据长什么样子。那么我们怎样在没有测试集的情况下来验证我们的模型好还是不好呢?这个时候就需要**验证集**了。
在真实业务中,我们可能没有真正意义上的测试集,或者说不知道测试集中的数据长什么样子。那么怎样在没有测试集的情况下来验证模型好还是不好呢?这个时候就需要**验证集**了。
那么验证集从何而来,很明显,我们可以从训练集中抽取一小部分的数据作为验证集,用来验证我们模型的性能。
那么验证集从何而来,很明显,可以从训练集中抽取一小部分的数据作为验证集,用来验证模型的性能。
但如果仅仅是从训练集中抽取一小部分作为验证集的话,有可能会让我们对模型的性能有一种偏见或者误解。
但如果仅仅是从训练集中抽取一小部分作为验证集的话,有可能会让对模型的性能有一种偏见或者误解。
比如我们现在要对手写数字进行识别,那么我就可能会训练一个分类模型。但可能模型对于数字`1`的识别准确率比较低 ,而验证集中没多少个数字为`1`的样本,然后用验证集测试完后得到的准确率为`0.96`。然后您可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的验证集让您的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是**k-折交叉验证**
比如现在要对手写数字进行识别,那么我就可能会训练一个分类模型。但可能模型对于数字`1`的识别准确率比较低 ,而验证集中没多少个数字为`1`的样本,然后用验证集测试完后得到的准确率为`0.96`。然后您可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的验证集让您的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是**k-折交叉验证**
在**K-折交叉验证**中,我们把原始训练数据集分割成`K`个不重合的⼦数据集,然后我们做`K`次模型训练和验证。每⼀次,我们使⽤⼀个⼦数据集验证模型,并使⽤其它`K1`个⼦数据集来训练模型。在这`K`次训练和验证中,每次⽤来验证模型的⼦数据集都不同。最后,我们对这`K`次在验证集上的性能求平均。
在**K-折交叉验证**中,把原始训练数据集分割成`K`个不重合的⼦数据集,然后做`K`次模型训练和验证。每⼀次,使⽤⼀个⼦数据集验证模型,并使⽤其它`K1`个⼦数据集来训练模型。在这`K`次训练和验证中,每次⽤来验证模型的⼦数据集都不同。最后,对这`K`次在验证集上的性能求平均。
`K`的值由我们自己来指定,如以下为`5`折交叉验证。

@ -6,14 +6,14 @@
<div align=center><img src="./img/1024.jpg", height="250"/></div>
图中的绿线与黄线都能很好的将图中的红点与蓝点给区分开。但是,哪条线的泛化性更好呢?可能你不太了解泛化性,也就是说,我们的这条直线,不仅需要在训练集 **(已知的数据)** 上能够很好的将红点跟蓝点区分开来,还要在测试集 **(未知的数据)** 上将红点和蓝点给区分开来。
图中的绿线与黄线都能很好的将图中的红点与蓝点给区分开。但是,哪条线的泛化性更好呢?可能你不太了解泛化性,也就是说,这条直线,不仅需要在训练集 **(已知的数据)** 上能够很好的将红点跟蓝点区分开来,还要在测试集 **(未知的数据)** 上将红点和蓝点给区分开来。
假如经过训练,我们得到了黄色的这条决策边界用来区分我们的数据,这个时候又来了一个数据,即黑色的点,那么你觉得黑色的点是属于红的这一类,还是蓝色的这一类呢?
假如经过训练,我们得到了黄色的这条决策边界用来区分数据,这个时候又来了一个数据,即黑色的点,那么你觉得黑色的点是属于红的这一类,还是蓝色的这一类呢?
<div align=center><img src="./img/1025.jpg", height="250"/></div>
如上图,根据黄线的划分标准,黑色的点应该属于红色这一类。可是,我们肉眼很容易发现,黑点离蓝色的点更近,它应该是属于蓝色的点。这就说明,黄色的这条直线它的泛化性并不好,它对于未知的数据并不能很好的进行分类。那么,如何得到一条泛化性好的直线呢?这个就是支持向量机考虑的问题。
如上图,根据黄线的划分标准,黑色的点应该属于红色这一类。可是,肉眼很容易发现,黑点离蓝色的点更近,它应该是属于蓝色的点。这就说明,黄色的这条直线它的泛化性并不好,它对于未知的数据并不能很好的进行分类。那么,如何得到一条泛化性好的直线呢?这个就是支持向量机考虑的问题。
### 基本思想
@ -43,7 +43,7 @@ $$
</center>
<br>
其中$$w=(w_1,w_2,..,w_d)$$为法向量,决定了决策边界的方向。$$b$$为位移项,决定了决策边界与原点之间的距离。显然,决策边界可被法向量和位移确定,我们将其表示为$$(w,b)$$。样本空间中的任意一个点$$x$$,到决策边界$$(w,b)$$的距离可写为:
其中$$w=(w_1,w_2,..,w_d)$$为法向量,决定了决策边界的方向。$$b$$为位移项,决定了决策边界与原点之间的距离。显然,决策边界可被法向量和位移确定,可以将其表示为$$(w,b)$$。样本空间中的任意一个点$$x$$到决策边界$$(w,b)$$的距离可写为:
<center>
$$
@ -52,7 +52,7 @@ $$
</center>
<br>
假设决策边界$$(w,b)$$能够将训练样本正确分类,即对于任何一个样本点$$(x_i,y_i)$$,若它为正类,即$$y_i=+1$$时,$$w^Tx+b\geq +1$$。若它为负类,即$$y_i=-1$$时,$$w^Tx+b\leq -1$$。
假设决策边界$$(w,b)$$能够将训练样本正确分类,即对于任何一个样本点$$(x_i,y_i)$$若它为正类,即$$y_i=+1$$时,$$w^Tx+b\geq +1$$。若它为负类,即$$y_i=-1$$时,$$w^Tx+b\leq -1$$。
<div align=center><img src="./img/1028.jpg", height="250"/></div>
@ -69,7 +69,7 @@ $$
<div align=center><img src="./img/1029.jpg", height="150"/></div>
显然,为了最大化间隔,仅需最大化$$||w||^{-1}$$,这等价于最小化$$||w||^2$$,于是,条件可以重写为:
显然,为了最大化间隔,仅需最大化$$||w||^{-1}$$这等价于最小化$$||w||^2$$,于是,条件可以重写为:
<center>
$$
@ -157,7 +157,7 @@ $$
</center>
<br>
从对偶问题解出的$$\alpha_i$$是拉格朗日乘子,它恰对应着训练样本$$(x_i,y_i)$$由于原问题有不等式的约束因此上述过程需满足KKT(Karush-Kuhn-Tucker)条件,即要求:
从对偶问题解出的$$\alpha_i$$是拉格朗日乘子,它恰对应着训练样本$$(x_i,y_i)$$由于原问题有不等式的约束因此上述过程需满足KKT(Karush-Kuhn-Tucker)条件即要求:
<center>
$$
@ -181,7 +181,7 @@ $$
所谓的软间隔,是相对于硬间隔说的,刚刚在间隔与支持向量中提到的间隔就是硬间隔。
接着我们再看如何可以软间隔最大化呢SVM 对训练集里面的每个样本$$(x_i,y_i)$$引入了一个松弛变量$$\xi_i\geq0$$,使函数间隔加上松弛变量大于等于$$1$$,也就是说:
接着我们再看如何可以软间隔最大化呢SVM 对训练集里面的每个样本$$(x_i,y_i)$$引入了一个松弛变量$$\xi_i\geq0$$使函数间隔加上松弛变量大于等于$$1$$,也就是说:
<center>
$$
@ -215,7 +215,7 @@ $$
</center>
<br>
这里,$$C>0$$为惩罚参数,可以理解为我们一般回归和分类问题正则化时候的参数。$$C$$越大,对误分类的惩罚越大,$$C$$越小,对误分类的惩罚越小。也就是说,我们希望权值的二范数尽量小,误分类的点尽可能的少。$$C$$是协调两者关系的正则化惩罚系数。在实际应用中,需要调参来选择。
这里,$$C>0$$为惩罚参数,可以理解为一般回归和分类问题正则化时候的参数。$$C$$越大,对误分类的惩罚越大,$$C$$越小,对误分类的惩罚越小。也就是说,希望权值的二范数尽量小,误分类的点尽可能的少。$$C$$是协调两者关系的正则化惩罚系数。在实际应用中,需要调参来选择。
同样的,使用拉格朗日函数将软间隔最大化的约束问题转化为无约束问题,利用相同的方法得到数学模型:
@ -248,7 +248,7 @@ $$
##smo算法
序列最小优化算法($$smo$$算法)是一种启发式算法, $$SVM$$中的模型参数可以使用该算法进行求解。其基本思路是:如果所有变量的解都满足此最优化问题的$$KKT$$条件,那么这个最优化问题的解就得到了。因为$$KKT$$条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反$$KKT$$条件最严重的那一个,另一个由约束条件自动确定。如此,$$smo$$算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。具体如下:
序列最小优化算法($$smo$$算法)是一种启发式算法, $$SVM$$中的模型参数可以使用该算法进行求解。其基本思路是:如果所有变量的解都满足此最优化问题的$$KKT$$条件,那么这个最优化问题的解就得到了。因为$$KKT$$条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量一个是违反$$KKT$$条件最严重的那一个,另一个由约束条件自动确定。如此,$$smo$$算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。具体如下:
选择两个变量$$\alpha_1,\alpha_2$$,其它变量$$\alpha_i,i=3,4,..m$$是固定的。
于是,$$smo$$的最优化问题的子问题可以写成:
@ -281,9 +281,9 @@ $$
<div align=center><img src="./img/1032.jpg", height="200"/></div>
由于$$\alpha_1,\alpha_2$$的关系被限制在盒子里的一条线段上,所以两变量的优化问题实际上仅仅是一个变量的优化问题。不妨我们假设最终是$$\alpha_2$$的优化问题。由于我们采用的是启发式的迭代法,假设我们上一轮迭代得到的解是$$\alpha^{old}_1,\alpha^{old}_2$$,假设沿着约束方向$$\alpha_2$$未经剪辑的解是$$\alpha_2^{new,unc}$$。本轮迭代完成后的解为$$\alpha^{new}_1,\alpha^{new}_2$$。
由于$$\alpha_1,\alpha_2$$的关系被限制在盒子里的一条线段上,所以两变量的优化问题实际上仅仅是一个变量的优化问题。不妨假设最终是$$\alpha_2$$的优化问题。由于采用的是启发式的迭代法,假设上一轮迭代得到的解是$$\alpha^{old}_1,\alpha^{old}_2$$,假设沿着约束方向$$\alpha_2$$未经剪辑的解是$$\alpha_2^{new,unc}$$。本轮迭代完成后的解为$$\alpha^{new}_1,\alpha^{new}_2$$。
由于$$\alpha_2^{new}$$必须满足上图中的线段约束。假设$$L$$和$$H$$分别是上图中$$\alpha_2^{new}$$所在的线段的边界。那么很显然我们有:
由于$$\alpha_2^{new}$$必须满足上图中的线段约束。假设$$L$$和$$H$$分别是上图中$$\alpha_2^{new}$$所在的线段的边界。那么很显然有:
<center>
$$
@ -292,7 +292,7 @@ $$
</center>
<br>
而对于$$L$$和$$H$$我们也有限制条件如果是上面左图中的情况,则:
而对于$$L$$和$$H$$,也有限制条件如果是上面左图中的情况,则:
<center>
@ -302,7 +302,7 @@ $$
</center>
<br>
如果是上面右图中的情况,我们有:
如果是上面右图中的情况,有:
<center>
$$
@ -311,7 +311,7 @@ $$
</center>
<br>
也就是说,假如我们通过求导得到的$$\alpha_2^{new,unc}$$,则最终的$$\alpha_2^{new}$$应该为:
也就是说,假如通过求导得到的$$\alpha_2^{new,unc}$$,则最终的$$\alpha_2^{new}$$应该为:
<center>
$$
@ -324,7 +324,7 @@ $$
</center>
<br>
那么如何求出$$\alpha_2^{new}$$呢?很简单,我们只需要将目标函数对$$\alpha2$$求偏导数即可。首先我们整理下我们的目标函数。为了简化叙述,我们令:
那么如何求出$$\alpha_2^{new}$$呢?很简单只需要将目标函数对$$\alpha2$$求偏导数即可。首先整理下我们的目标函数。为了简化叙述,令:
<center>
$$
@ -360,15 +360,15 @@ $$
$$smo$$算法需要选择合适的两个变量做迭代,其余的变量做常量来进行优化,那么怎么选择这两个变量呢?
一般来说,我们首先选择违反$$0 < \alpha_i < C$$这个条件的点。如果这些支持向量都满足$$KKT$$条件,再选择违反$$\alpha_i=0$$和$$\alpha_i=C$$的点。
一般来说,首先选择违反$$0 < \alpha_i < C$$这个条件的点。如果这些支持向量都满足$$KKT$$条件,再选择违反$$\alpha_i=0$$和$$\alpha_i=C$$的点。
$$smo$$算法称选择第二一个变量为内层循环,假设我们在外层循环已经找到了$$\alpha_1$$, 第二个变量$$\alpha_2$$的选择标准是让$$E_1$$-$$E_2$$有足够大的变化。由于$$\alpha_1$$定了的时候,$$E_1$$也确定了,所以要想$$E_1$$-$$E_2$$最大,只需要在$$E_1$$为正时,选择最小的$$E_i$$作为$$E_2$$ 在$$E_1$$为负时,选择最大的$$E_i$$作为$$E_2$$,可以将所有的$$E_i$$保存下来加快迭代。
$$smo$$算法称选择第二一个变量为内层循环,假设在外层循环已经找到了$$\alpha_1$$, 第二个变量$$\alpha_2$$的选择标准是让$$E_1$$-$$E_2$$有足够大的变化。由于$$\alpha_1$$定了的时候$$E_1$$也确定了,所以要想$$E_1$$-$$E_2$$最大,只需要在$$E_1$$为正时,选择最小的$$E_i$$作为$$E_2$$ 在$$E_1$$为负时,选择最大的$$E_i$$作为$$E_2$$,可以将所有的$$E_i$$保存下来加快迭代。
如果内存循环找到的点不能让目标函数有足够的下降, 可以采用遍历支持向量点来做$$\alpha_2$$,直到目标函数有足够的下降, 如果所有的支持向量做$$\alpha_2$$都不能让目标函数有足够的下降,可以跳出循环,重新选择$$\alpha_1$$。
如果内存循环找到的点不能让目标函数有足够的下降, 可以采用遍历支持向量点来做$$\alpha_2$$直到目标函数有足够的下降, 如果所有的支持向量做$$\alpha_2$$都不能让目标函数有足够的下降,可以跳出循环,重新选择$$\alpha_1$$。
### 计算阈值b和差值Ei
在每次完成两个变量的优化之后,需要重新计算阈值$$b$$。当$$0<\alpha_1^{new}< C$$时,我们:
在每次完成两个变量的优化之后,需要重新计算阈值$$b$$。当$$0<\alpha_1^{new}< C$$时,:
<center>
$$

@ -20,7 +20,7 @@ data.head()
<div align=center><img src="../img/32.jpg"/, height="200" width="550"></div>
从图中可以看出数据是由`11`个特征和`1`个标签(Survived)组成的。其中各个特征和标签的意义如下:
从图中可以看出数据是由`11`个特征和`1`个标签(`Survived`)组成的。其中各个特征和标签的意义如下:
@ -68,7 +68,7 @@ plt.show()
<div align=center><img src="../img/34.jpg"/></div>
从图中可以看出泰坦尼克沉船事件中还是凶多吉少的。因为在`891`名船客中,只有约`38%`左右的人幸免于难,那么接下来尝试使用数据集中不同的特征,来看看他们的生还率有多少。其实这样一个过程我们可以看出大概有哪些类型的船客活了下来。
从图中可以看出泰坦尼克沉船事件中还是凶多吉少的。因为在`891`名船客中,只有约`38%`左右的人幸免于难,那么接下来尝试使用数据集中不同的特征,来看看他们的生还率有多少。其实这样一个过程可以看出大概有哪些类型的船客活了下来。
## 性别与生还率的关系
@ -80,7 +80,7 @@ data.groupby(['Sex','Survived'])['Survived'].count()
<div align=center><img src="../img/35.jpg"/></div>
看上去好像女性船客的生还率高一些,我们不妨再可视化一下。
看上去好像女性船客的生还率高一些,不妨再可视化一下。
```python
f,ax=plt.subplots(1,2,figsize=(18,8))
@ -274,7 +274,7 @@ plt.show()
我们可以看出:
- 一等舱和二等舱的女性的生还率几乎为`100%` 这与女性是一等舱还是二等舱没啥关系。
- `S`号口岸上船并且是三等舱的,不管是男的还是女的,生还率都很低。金钱决定命运。。。
- `S`号口岸上船并且是三等舱的,不管是男的还是女的,生还率都很低。金钱决定命运。
- `Q`号口岸上船的男性几乎团灭,因为`Q`号口岸上船的基本上都是三等舱船客。

@ -99,7 +99,7 @@ data['Initial'].replace(['Mr','Mrs','Miss','Master','Other'],[0,1,2,3,4],inplace
## 删掉没多大用处的特征
- 姓名:难道姓名和生死有关系?这也太玄乎了,我不信,所以把它删掉
- 姓名:难道姓名和生死有关系?这也太玄乎了,我不信,所以把它删掉
- 年龄:由于已经根据年龄生成了新的特征“年龄段”,所以这个特征也需要删除。
- 票:票这个特征感觉是一堆随机的字符串,所以删掉。
- 花费:和年龄一样,删掉。

@ -1,6 +1,6 @@
# 构建模型进行预测
做好数据预处理后,可以将数据喂给我们的机器学习模型来进行训练和预测了。不过在构建模型之前,我们要使用处理训练集数据的方式来处理测试集。
做好数据预处理后,可以将数据喂给机器学习模型来进行训练和预测了。不过在构建模型之前,要使用处理训练集数据的方式来处理测试集。
```python
test_data=pd.read_csv('./Titanic/test.csv')

@ -10,5 +10,5 @@
泰坦尼克号数据集是目标是给出一个模型来预测某位泰坦尼克号的乘客在沉船事件中是生还是死。而且该数据集是一个非常好的数据集,能够让您快速的开始数据科学之旅。
泰坦尼克生还预测实训已在`educoder`平台上提供,若感兴趣可以进入链接https://www.educoder.net/shixuns/kz3fixv9/challenges 进行体验。
泰坦尼克生还预测实训已在`educoder`平台上提供若感兴趣可以进入链接https://www.educoder.net/shixuns/kz3fixv9/challenges 进行体验。

@ -4,7 +4,7 @@
网格搜索的意思其实就是遍历所有我们想要尝试的参数组合,看看哪个参数组合的性能最高,那么这组参数组合就是模型的最佳参数。
`sklearn`为我们提供了网格搜索的接口,我们能很方便的进行网格搜索。
`sklearn`为我们提供了网格搜索的接口,能很方便的进行网格搜索。
```python
from sklearn.model_selection import GridSearchCV
@ -24,7 +24,7 @@ print(grid_search.best_score_)
<div align=center><img src="../img/58.jpg"/></div>
可以看到经过调参之后,我们的随机森林模型的性能提高到了 `0.8323`,提升了接近`1%`的准确率。然后我们使用最佳参数构造随机森林,并对测试集测试会发现,测试集的准确率达到了 `0.8525`
可以看到经过调参之后,随机森林模型的性能提高到了 `0.8323`,提升了接近`1%`的准确率。然后使用最佳参数构造随机森林,并对测试集测试会发现,测试集的准确率达到了 `0.8525`
```python
Y_train = data['Survived']

@ -11,21 +11,21 @@
### 分类
假如现在有一些苹果、西瓜和香蕉的图片作为训练集(**有标签**),现在想要机器学习算法能够根据新的测试图片来分辨出该图片中的是苹果、西瓜还是香蕉。像这样的任务我们称为**分类**任务。
假如现在有一些苹果、西瓜和香蕉的图片作为训练集(**有标签**),现在想要机器学习算法能够根据新的测试图片来分辨出该图片中的是苹果、西瓜还是香蕉。像这样的任务称为**分类**任务。
<div align=center><img src="./img/4.jpg", height="250" width="350"/></div>
### 回归
假如现在有一些苹果的售价数据作为训练集(**有标签**),现在想要机器学习算法能够根据新的测试图片来分辨出该图片中的苹果能卖多少钱。像这样的任务我们称为**回归**任务。
假如现在有一些苹果的售价数据作为训练集(**有标签**),现在想要机器学习算法能够根据新的测试图片来分辨出该图片中的苹果能卖多少钱。像这样的任务称为**回归**任务。
<div align=center><img src="./img/5.jpg", height="250" width="350"/></div>
### 聚类
假如现在有一些水果的图片作为训练集(**无标签**),现在想要机器学习算法能够根据训练集中的图片将这些图片进行归类,但是并不知道这些类别是什么。像这样的任务我们称为**聚类**任务。
假如现在有一些水果的图片作为训练集(**无标签**),现在想要机器学习算法能够根据训练集中的图片将这些图片进行归类,但是并不知道这些类别是什么。像这样的任务称为**聚类**任务。
<div align=center><img src="./img/6.jpg", height="250" width="350"/></div>
@ -35,7 +35,7 @@
## experience
**experience**指的根据历史数据总结归纳出规律的过程,即学习过程,或模型的训练过程。**模型**这个词看上去很高大上,其实我们可以把他看成是一个函数。例如:现在想用机器学习来识别图片里的是香蕉还是苹果,那么机器学习所的事情就是得到一个比较好的函数,当我们输入一张香蕉图片时,能得到识别结果为香蕉的输出,当我们输入一张苹果图片时,能得到识别结果为苹果的输出。
**experience**指的根据历史数据总结归纳出规律的过程,即学习过程,或模型的训练过程。**模型**这个词看上去很高大上,其实可以把他看成是一个函数。例如:现在想用机器学习来识别图片里的是香蕉还是苹果,那么机器学习所的事情就是得到一个比较好的函数,当输入一张香蕉图片时,能得到识别结果为香蕉的输出,当输入一张苹果图片时,能得到识别结果为苹果的输出。
<div align=center><img src="./img/63.jpg", height="250" width="300"/></div>
@ -44,4 +44,4 @@
## performance
**performance**指的是模型的性能。对于不同的任务,我们有不同的衡量模型性能的标准。例如分类时可能会根据模型的**准确率****精准率****召回率****AUC**等指标来衡量模型的好坏,回归时会看看模型的**MSE****RMSE****r2 score**等指标,回归时会以**FM指数****DB指数**等指标来衡量聚类的效果怎么样。对各种性能指标感兴趣可以阅读**模型评估指标**章节。
**performance**指的是模型的性能。对于不同的任务,有不同的衡量模型性能的标准。例如分类时可能会根据模型的**准确率****精准率****召回率****AUC**等指标来衡量模型的好坏,回归时会看看模型的**MSE****RMSE****r2 score**等指标,回归时会以**FM指数****DB指数**等指标来衡量聚类的效果怎么样。对各种性能指标感兴趣可以阅读**模型评估指标**章节。

@ -1,6 +1,6 @@
# 机器学习项目流程
当我们拿到一个项目需求想要使用机器学习来实现时,我们往往会按照**理解问题与问题转换、获取数据、数据清洗与预处理、特征工程、模型训练与调优**这`5`个步骤来走。
当我们拿到一个项目需求想要使用机器学习来实现时,往往会按照**理解问题与问题转换、获取数据、数据清洗与预处理、特征工程、模型训练与调优**这`5`个步骤来走。
### 1.理解实际问题,抽象为机器学习能处理的数学问题

@ -1,4 +1,4 @@
# 综合实战案例
纸上得来终觉浅,绝知此事要躬行。当我们学会了机器学习算法原理,知道了怎样使用`sklearn`来快速编写机器学习程序之后,我们需要进行大量的实战演练来提升我们的技能和实操能力。所以在本章中提供了两个综合实战案例:一个是`kaggle`中最为经典的也是最适合入门的机器学习比赛---泰坦尼克生还预测。另一个是使用强化学习来让程序自己玩乒乓球游戏。希望通过这两个实战案例,能够提升您对机器学习的兴趣以及使用机器学习技术解决实际问题的能力。
纸上得来终觉浅,绝知此事要躬行。当我们学会了机器学习算法原理,知道了怎样使用`sklearn`来快速编写机器学习程序之后,需要进行大量的实战演练来提升我们的技能和实操能力。所以在本章中提供了两个综合实战案例:一个是`kaggle`中最为经典的也是最适合入门的机器学习比赛---泰坦尼克生还预测。另一个是使用强化学习来让程序自己玩乒乓球游戏。希望通过这两个实战案例,能够提升您对机器学习的兴趣以及使用机器学习技术解决实际问题的能力。

Loading…
Cancel
Save