机器学习算法中有一个重要环节就是评判算法的好坏,我们在之间的笔记中讲过多种评价回归算法的评测标准,比如均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、$R^2$(R Squared)。但是在分类问题中我们一直使用分类准确度这一个指标,也就是预测对分类的样本数量除以总预测样本数量。但是这个方法存在很大的一个缺陷,所以这篇笔记主要介绍评价分类问题的方式方法。

极度偏斜数据(Skewed Data)

为什么说分类准确度这个指标存在很大的一个缺陷呢。举个例子,假设有一个癌症预测系统,输入体检信息,判断是否患有癌症。我们知道世界上相对于其他病症,患癌症的比例还是很小,如果癌症产生的概率只有0.1%,那么有99.9%的人都不会患有癌症。这就意味着,就算癌症预测系统什么都不做,但凡有体检信息输入,就给出没有患癌症的结果,那准确率也是达到了99.9%。那此时这个分类准确度是真实的吗?所以当样本数据或领域的实际情况存在数据极度偏斜的时候,只使用分类准确度这个指标是远远不够的。

混淆矩阵(Confusion Matrix)

这一节介绍一个能进一步分析分类结果的工具,混淆矩阵。

上面这个表针对二分类问题,所有将类别就分为两类0和1,0表示Negative,类似医院上的阴性,1表示Positive,类似医学上的阳性。行代表真实值,列代表预测值。

如上图所示:

  • (0, 0)格子真实值和预测值都为0,称为预测Negative正确,记作True Negative,简写为TN。
  • (0, 1)格子真实值为0,但预测值为1,称为预测Positive错误,记作False Positive,简写为FP。
  • (1, 0)格子真实值为1, 但预测值为0,称为预测Negative错误,记作False Negative,简写为FN。
  • (1, 1)格子真实值和预测值都为1,称为预测Positive正确,记作True Positive,简写为TP。

以上这个表格就叫做混淆矩阵。举个例子,如果对10000个人预测他们是否患癌症,通过混淆矩阵表示出的真实情况就是:

解读一下:

  • 没有患癌症,系统也预测出没有患癌症的人为9978人(TN)。
  • 没有患癌症,但系统预测出患癌症的人为12人(FP)。
  • 患有癌症,但系统预测出没有患癌症的人为2人(FN)。
  • 患有癌症,系统也预测出患有癌症的人为8人(TP)。
閱讀全文 »

OmniFocus的几个主要概念

文章中所有的内容都是以OmniFocus 3为例。

  • 文件夹:OmniFocus中任务的组织结构最顶级一层,但只是用于分类,本身没有什么属性。
  • 项目:顾名思义,用于定义我们生活和工作中大大小小的项目,项目本身也有属性设置,可设置标签、其内任务的关系(并行、串行、单个),截止日期等。项目下可包含多个任务。
  • 任务:OmniFocus中承载事件的最小颗粒。因为OmniFocus支持任务无限嵌套,所以当多个任务在一个任务下时该任务就成为一个任务组。
  • 任务组:任务组本身也是一个任务,但是它又是其他任务的父任务,所以任务组有子任务关系(并行、串行、单个)的设置。
  • 标签:任务、项目身上都可以设置一到多个标签。标签可以嵌套,并且标签支持设置地理位置,并且有根据进入,走出两个行为和距离范围设置通知。
  • 透视:根据各种条件筛选任务的视图。比如查看有标签“办公室”,即将截至的任务。条件可以按照包含任意、全部包含和不包含进行组合。然后还可以设置筛选出来任务的排列、分组方式。

任务系统

我参照John Z. Sonmez的看板+番茄钟的系统,将其调整为OmniFocus+番茄钟的系统。

系统设置

  • 在截止日期这一项,将即将截止日期的表示设置为今天。
  • 今天和Watch这一项,设置为自定义透视的今日(该透视下面会讲到)。

构建系统的主要标签

  • 仪式:周期性重复的任务会设置该标签。
  • 地点:标明某个任务能在何种场所进行。
    • 办公室
    • 通勤中
  • 状态:进行任务时需要投入的专注度。
    • 集中精力
    • 放松
  • 跟踪:需要跟踪的任务会设置该标签,比如安排下去的任务需要在某个时间点知道完成的结果。
  • 采购:需要购买东西的任务会设置该标签。
  • 星期:规划一周任务时设置的标签。
    • 周一
    • 周二
    • 周三
    • 周四
    • 周五
    • 周六
    • 周日
  • 二分钟:能在很短时间内完成的任务会设置该标签。
閱讀全文 »

决策边界

决策边界顾名思义就是需要分类的数据中,区分不同类别的边界,举个不恰当的例子,就像省的地界一样,你处在北京还是处在河北,全看你站在区分北京和河北的那条线的哪边。这节我们来看看使用逻辑回归算法如何绘制鸢尾花前两个分类的决策边界。

线性决策边界

再来回顾一下逻辑回归,我们需要找到一组$\theta$值,让这组$\theta$和训练数据相乘,然后代入Sigmoid函数,求出某个类别的概率,并且假设,当概率大于等于0.5时,分类为1,当概率小于0.5时,分类为0:

$$\hat p = \sigma(\theta^T X_b)=\frac 1 {1+e^{-\theta^{T}X_b}}$$

$$\hat y =\left\{
\begin{aligned}
1, \ \ \ \hat p \ge 0.5 \\
0, \ \ \ \hat p < 0.5 \\
\end{aligned}
\right.
$$

在Sigmoid函数那节解释过,当$t>0$时,$\hat p>0.5$。当$t<0$时,$\hat p<0.5$,因为$t= \theta^T X_b $,所以:

$$\hat y =\left\{
\begin{aligned}
1, \ \ \ \ \hat p \ge 0.5, \ \ \ \ \theta^T X_b \ge 0 \\
0, \ \ \ \ \hat p < 0.5, \ \ \ \ \theta^T X_b < 0 \\
\end{aligned}
\right.
$$

那么当$\theta^T X_b =0$时,理论上$\hat p$就是0.5,分类既可以为0,也可以为1。只不过我们在这里将$\hat p=0.5$是,分类假设为1。由此可见$\theta^T X_b =0$就是逻辑回归中的决策边界,并且是线性决策边界。

閱讀全文 »

在这一篇笔记中我们来学习目前应用比较广泛的一个分类算法逻辑回归(Logistic Regression)。

什么是逻辑回归

首先大家应该有会有一个疑问,为什么既然叫逻辑回归,但是解决的却是分类问题呢。因为逻辑回归是将样本的特征和样本发生的概率联系起来,在拟合样本数据发生概率的时候,其实是在解决一个回归问题,当概率计算出来后,再根据概率进行分类处理。所以逻辑回归在解决分类问题时,其实中间还是进行了回归问题的处理,但是逻辑回归只能解决二分类问题,这一点要注意。

逻辑回归在解决概率这个回归问题时,和线性回归、多项式回归有一个不同的地方,那就是后者训练出的模型,预测其他样本数据的目标值时值域理论上是在负无穷到正无穷的,换句话说也就是对值域是没有什么限制的。而对于表示概率的数而言,一般值域都是在0到1之间,真实世界中,概率不都是按从0%到100%表示嘛。所以这就引出了逻辑回归和线性回归的相似和不同处,继而体现在公式模型上。在第四篇笔记中,我们知道多元线性回归的公式模型是:
$$ \hat y = \theta ^T X_b $$

因为$\hat y$的值域为$(-\infty,+\infty)$,所以如果要在逻辑回顾中运用在求解概率的公式模型上就需要另外一个函数将其值域限定在$(0, 1)$,我们将这个函数称为Sigmoid函数:

$$\hat p = \sigma(\theta ^T X_b)$$

$$\sigma(t) = \frac 1 {1+e^{-t}}$$

最终逻辑回归求解概率的模型为:

$$\hat p = \frac 1 {1+e^{-\theta ^T X_b}}$$

閱讀全文 »

验证数据集与交叉验证

在上一篇笔记中我们又提到了训练数据集和测试数据集,拆分样本数据的这种做法目的就是通过测试数据集判断模型的好坏,如果我们发现训练出的模型产生了过拟合的现象,既在训练数据集上预测评分很好,但是在测试数据集上预测评分不好的情况,那可能就需要重新调整超参数训练模型,以此类推,最终找到一个或一组参数使得模型在测试数据集上的预测评分也很好,也就是训练出的模型泛化能力比较好。那么这种方式会产生一个问题,就是有可能会针对测试数据过拟合,因为每次都是找到参数训练模型,然后看看在测试数据集上的表现如何,这就让我们的模型又被测试数据集左右了,既可以理解为训练出的模型对特定的训练数据集和特定的测试数据集表现都不错,但是再来一种类似的样本数据,表现可能又不尽如人意了。

那么要彻底解决这个问题,就要引入验证数据集的概念,既将样本数据分为三份,训练数据集、验证数据集、测试数据集。

  • 训练数据集和之前的用途一样,是用来训练模型的。
  • 验证数据集的作用和之前的测试数据集一样,是用来验证由训练数据集训练出的模型的好坏程度的,或者说是调整超参数使用的数据集。
  • 此时的测试数据集和之前的作用就不一样了,这里的测试数据集是当训练出的模型在训练数据集和验证数据集上都表现不错的前提下,最终衡量该模型性能的数据集。测试数据集在整个训练模型的过程中是不参与的。

交叉验证(Cross Validation)

我们在验证数据集概念的基础上,再来看看交叉验证。交叉验证其实解决的是随机选取验证数据集的问题,因为如果验证数据集是固定的,那么万一验证数据集过拟合了,那就没有可用的验证数据集了,所以交叉验证提供了随机的、可持续的、客观的模型验证方式。

交叉验证的思路是将训练数据分成若干份,假设分为A、B、C三份,分别将这三份各作为一次验证数据集,其他两份作为训练数据集训练模型,然后将训练出的三个模型评分取均值,将这个均值作为衡量算法训练模型的结果来调整参数,如果平均值不够好,那么再调整参数,再训练出三个模型,以此类推。

閱讀全文 »