数学
代数学
代数是数据科学的一种重要实践。 代数是研究抽象数量和之间关系的学科。
有 3 类代数与数据科学密切相关。 一是我们都学过的初等代数, 也就是用乘法和加法等计算单个值。 二是线性代数,也叫矩阵代数。 这是大多数统计流程计算的核心。 最后是线性方程组。 这一类对于线性代数和优化实践都至关重要, 我们稍后会详细介绍。
我们以数据科学行业的工资为例, 采用的是真实数据。 我们列出一个方程, 工资等于某个常数加上年, 这个数字与年龄有关,再加上议价、 工时和误差项。 你可以用这样的缩写, 但更常见的写法是这样。
我来解释一下这些项。 最左边是 Yi,表示结果 Y 的值, 是人员 i 的结果变量, i 可以是 1、2、3 等等。 旁边是 β0,β 是希腊字母, 这项表示纵截距。 然后是 β1,表示变量 1 的回归系数, 它旁边是 X1i, 这是人员 i 的变量 1 的分数。 最后一个是 εi,表示人员 i 的预测误差。
现在,我们要弄清代数中几种可用的结构。 我们都很熟悉标量。 每次只有一个数字。 但你也可以使用矢量, 将一行或一列数字视为一个单位。 还有矩阵, 也就是一个对象中包含多行和多列数据。 利用这些结构,可以把方程改写成这样。
这是组合使用矢量和矩阵的结果。 左边这个矢量是案例 1 和 2 的结果 y。 中间这个矩阵是这两个人的所有数据。 第一行包含要与常数相乘的 1, 以及案例 1 的 3 个变量的分数。 第二行对应案例 2。 这个纵列由回归系数 β0 和 β1 等组成。 最后是一个较小的矢量, 表示案例 1 和 2 的误差项。 我们通过虚构的例子演示一下。 假设有两位数据科学家。28 岁的法蒂玛, 谈判技能优秀,总分 5 分能拿 4 分, 每周工作 50 小时, 年收入是 118,000 美元。 34 岁的以斯拉,谈判技能一般, 每周工作 35 小时, 年收入是 84,000 美元。
我们回到这个方程,计算法蒂玛的工资。 这是我们使用的格式。 代入实际数字。 法蒂玛的工资是 118,000 美元。 我现在要做的是用每个系数乘以她的个人数值, 也就是用从左到右的数据 乘以从上到下的系数。 这样依次相乘,然后把这些值全都加起来, 最后再加上误差项。 顺便说下,你可以看到法蒂玛的误差项很大。 原因是,即使我使用真实数据, 但方程中还有 35 个其他变量, 比如其中一个就表示如果你是 CEO, 每年会多收入 3 万美元。
妙的是我们可以用矩阵表示法 来表示这个方程。 我可以用整个矩阵和矢量集合把它写成这样, 其中 Y 是结果变量的矢量, X 是个人数据整个矩阵, β 是回归系数的整个矢量, ε 是误差项的整个矢量。 这样方程就会非常紧凑, 大多数统计程序中都要记得做到紧凑。 下面我在 R 中演示这一过程。 打开 R 脚本,使用相同的数据进行演示。 我要做的是创建一个结果矢量, 也就是他们的工资。 顺便说下,通常用小写字母表示矢量, 用大写字母表示矩阵。 我们要创建一个矢量并将它显示出来。
就是这个矢量,我们使用 cbind 把它设为一列。
接着要创建一个矩阵并将它提出来, 这正是我们想要的矩阵。 我们得到回归系数的矢量 b。
再次使用 cbind 把它设为一列。
这很重要,因为是列还是行在矩阵代数中 区别很大,就像运算顺序一样。 处理矩阵时, A 乘 B 并不等于 B 乘 A。 现在我们要取得每个人的结果 y 的预测值, 方法是将他们的数据矩阵 乘以回归系数的矢量。
看,这些就是他们的预测分数。 然后,从他们的实际工资中 减去这些预测分数, 就能得到误差项。
对照我们之前得出的答案, 你会发现这些数值都正确。 在 R 中进行这些计算很容易。
我们来总结一下:第一,代数很重要。 它是数据科学的核心实践。 第二,矩阵可以简化表示方式。 第三,数据科学中使用的很多方法, 其核心都是线性代数。
方程组
从事数据科学工作, 需要具备处理线性方程组的能力。 具体来说就是如何处理未知项。 问题是存在相互依赖关系时, 比如 X 依赖 Y,但 Y 也依赖 X, 这听起来非常难解。 有趣的是,线性方程组可以手动求解。 你也可以使用线性或矩阵代数, 我会分别演示这两种方式。 举个销售苹果手机壳的简单例子。 假设你卖出 1000 个手机壳, 有些卖 20 美元,有些卖 5 美元, 总收入是 5900 美元。 每种价格各卖出了多少个? 我们把这些写成方程。 手机壳的销量为 1000 个, 是 x 和 y 这两个价格点的总和。 收入是 x 乘以 20 美元 加上 y 乘以 5 美元 等于 5900 美元。 我们必须找到一种方法, 把这两个方程结合起来得出唯一解。 先看销量。 销量是 x+y, 也就是两个价格的销量之和, 等于1000。 下面是收入。 先来看销量。 我们要做的是解出 x, 所以把 y 移到另一边。 只要两边同时减去 y, 就能消掉左边的 y, 从而得到用 y 表示的 x。 我们再来看收入方程, 把 1000-y 代入这里的 x 。 相乘后得到 -20y+5y, 也就是 -15y, 然后就能解出 y。 我们在两边各减去 20000。 先算这边,再算另一边, 然后两边都除以负 15 美元, 得出 y 等于 940。 返回到销量方程 x+y=1000, 代入 940,两边同时减去这个值, 得出 x 等于 60。 也就是说,单价 20 美元的手机壳 卖出 60 个, 单价 5 美元的手机壳的销量则多得多, 是 940 个。
你也可以把这画成图。 问题在于一开始 左边都是用 x 和 y 表示的, 右边是常数。 我们需要解出两个方程中的 y。 首先两边同时减去 x, 解出上面的 y。 在另一个方程中, 我们用每一项除以 5 美元, 然后两边同时减去 4x 就可以消掉了。 现在两个方程都变成 y 是 x 的函数。 我们可以把这画成图。 比如,这条线表示卖出的手机壳数量。 它最初是 x+y=1000, 化简为 y=-x+1000, 代表卖出手机壳数量所有可能的组合。 这条蓝线代表收入, 是 20x+5y=5900。 它也可以化简为 y, 这代表所有可能的收入组合。 于是我们得到一个交点, 也就是这两个方程的组合解, 60 和 940。 我们也可以使用 R。 向下滚动,然后输入数据。
这是最初的方程 x+y=1000 和 20x+5y=5900。 取左边的这些系数,输入到矩阵中。
我们用 Q 表示数量,这就是我们的矩阵, 然后可以把结果或总数输入到矢量中。 把它放在这里, 然后我们要使用 R 内置的 solve 函数。 使用这里这个命令可以查看相关帮助文档。 这是 solve 函数的帮助文档, 我们要根据 R 解出 Q。 你看,得出的 只有 60 和 940 这两个值, 也就是我们之前手动算出的结果。 如果想检查答案,可以向下滚动到这里, 通过 CES 运行这些等式, 得出相加等于 1000, 相加等于 5900。 我们来总结一下: 线性方程组对于在数据科学中处理数据至关重要。 它们是平衡多个未知数、 来找出唯一解的重要手段。 另外,它们依赖于线性或矩阵代数, 但往往可以手动求解, 这在数据科学领域非常难得。
微积分学
微积分是许多数据科学相关内容的基础。 具体来说,一旦处理变化率和优化问题, 就需要用到微积分。 微积分与数据科学主要在 3 个方面相关。 第一,微积分是实践统计基础的一部分, 所以可用于建立最小二乘回归和概率分布等。 第二是变化,测量随时间变化的数量 或速率本质上是微积分问题。 第三是最大值和最小值, 在需要进行最大化或最小化时, 一般都会用到微积分。 微积分中有两种常用的演算。 第一种是微分, 用于确定某个特定时间的变化率。 有时候,人们把它称为变化的微积分。 第二种是积分,用于根据给定变化率 确定某物在某个特定时间的数量。 有时候,人们把它称为累积的微积分。 我们来简单看一下它的工作原理。 这里有一条抛物线,y 等于 x 的平方。 把一个点放在 x = -2 处, 我们很容易就能算出 y, 只需要计算 x 的平方, 就能得出值等于 4。 但 x = -2 处的斜率是多少呢? 它是一条曲线,所以斜率是在不断变化的。 想算出斜率,就要知道导数, 这是一类非常简单的导数。 这是它的公式, 其中的 xn 在我们的例子中是 x 的平方。 我们把 n 替换成 2 来计算导数。 这两处的 n 都替换成 2, 然后这里,2 减 1 得到 1, 然后把 1 省去,得出 x 平方的导数是 2x。 现在就可以计算这个点处的斜率了。 怎么计算呢?我们把 x 代入算式, 得到斜率为 -4, 图中这条橙色线代表的就是斜率。 如果我们把点移动到 x = 3 处, 就可以用相同算法算出斜率, 2x 等于 6,这就是斜率。 在实际生活中,假设你开发了某种 很棒的网上相亲服务,为了使收入最大化, 你需要确定理想的价格。 这就要用到微积分。具体怎么应用呢? 假设当前的年度订阅售价是 500 美元。 对于此类服务,可以定这样的价格。 假设每个星期卖出 180 份新订阅, 并且还有一些数据表明, 每 5 美元的价格折扣可以多卖出 3 份。 另外,这是一项在线服务, 不涉及物理生产过程, 因此假设开销不会增加。 那么,要让收入最大化, 价格定在多少合适呢? 我们把价格表示为当前价格 500 美元 减去 5 美元乘以 d,d 是折扣单位。 在价格和销量中统一使用 d, 保持单位一致。 销量表示为每周 180 份新订阅, 加每折扣单位 d 对应的 3 份订阅。 我们要把销量看作是价格的函数, 但在此之前, 我们需要用截距和斜率重写方程。 从 y 截距开始。要得到截距, 我们需要知道价格为 0 时预期销量的值。 我们当然不会把服务价格定为 0, 只是需要这个值方便计算。 需要多少个折扣单位才能把价格降到 0 呢? 我们把这个价格方程解为 0。 首先,在两边都减去 500, 这边抵消了, 然后两边同时除以 -5 来提取出 d, 得出 d 为 100。 如果以 5 美元为倍数计算, 100 个折扣单位会得到价格 0。 这时我们就可以求 y 截距了。 我们把这个值代入销量中, 得到 y 截距的实际值。 把折扣单位 d 的值代入销量方程中, 看一看当价格为 0 时,截距值是多少。 我们将 d 替换成 100,先相乘再相加, 得到 y 截距, 也就是价格为 0 时的预期销量。 我们肯定不会按这个价格出售, 这只是为了求出斜率。 现在,斜率等于纵轴 y 的变化 除以横轴 x 的变化。 销量是 y,属于因变量, 价格是 x,属于自变量。 我们取它们各自针对折扣所用的系数, 来计算斜率。 销量的系数是 3,价格的系数是 -5, 二者相除,得到斜率 -0.6。 我们把斜率和之前算出的截距 480 结合起来, 最后得出了以价格函数表示的销量方程。 反过来,我们可以得到收入的公式, 这就是本次练习的目标。 收入等于销量乘以价格。 我们可以在方程中代入刚刚得出的销量, 这样就得到了一个仅由价格表示的收入方程。 然后分别相乘,得到这个。 现在可以求导数了, 因为我们想得到某个最大值。 解决这个问题要用到微积分。 480 乘以价格的导数刚好是 480, 所以我们把价格去掉。 第二部分的导数类似于 我们刚才演示的求曲线上某点的斜率。 把这里的 2 移下来,相乘,得出导数。 现在,我们可以用它解出 0。 说一下这么做的原因。 原始的收入方程是一个逆抛物线。 在我们的示例中,Y 表示收入, 曲线斜率为 0 时 Y 值最大, 因为这表示你处于抛物线的最顶端。 这条就是斜率为 0 的直线,它完全是平的。 我们想找到这个点的位置, 也就是斜率为 0 的直线与曲线相交的点。 回到我们的方程,设结果等于 0, 然后求价格。 两边都减去 480,然后除以 -1.2, 提出价格。 结果得出价格为 400 美元, 也就是在这个点上收入最大。 我们可以使用由价格表示销量的方程, 来计算出这一点上的预期销量。 代入 400,相乘,然后相减,得到 240, 这就是每周新订阅的预期销量。 来看看这会如何影响收入。 这是我们当前收入模式的公式。 当前收入等于 180 乘 500, 得出每周收入是 90,000 美元。 和新模式相比,新模式的预期收入是 96,000 美元。 为了显示改进结果, 我们把这两个数字相除,得到 1.07, 这意味着新定价计划可将收入提升 7%。 总结一下,我们将服务成本从每年 500 美元降到 400,降低了 20%; 每周销量从 180 份新订阅增加到 240 份,增加了 33%, 这些变化加在一起将使收入增长 7%。 现在,我们已经手动完成了整个过程。 你当然可以动手计算, 但在电脑上计算也很方便。 我来简单说说怎么在 R 中计算。
这是 R 界面, 我要做的是先输入以价格函数表示的销量公式, 然后将它保存到“销量”对象中。 之后输入另一个公式, 以价格和销量函数来表示的收入公式。 接下来要做的是并排制作两张图, 为此,我执行了这个小小的参数操作。 我们用图形来表示销量是价格的函数。 这是第一个图形,放大来看看。 可以看到,随着价格的上升,销量会下降; 随着价格的下降,销量会上升。 我们再用图形来表示收入是 价格和销量的函数。 旁边这个就是,它是一条曲线, 就是我们之前说的逆抛物线。 在与最大收入对应的价格处画一条直线, 我们知道那个价格是 400。 然后在收入曲线斜率为 0 的位置画一条直线, 这个值是 96,000。就在这,穿过顶点。 在两线相交处画一个点, 就是这个橙色点。现在,我要恢复图形参数。 如果你改动了这类参数, 一般都需要进行恢复。 然后,我只需要使用一个内置函数 “optimize”,就可以完成所有微积分运算。 函数内容是优化收入, 在 100 美元和 700 美元之间搜索, 寻找最大值。 执行这一操作后,编辑器里给出了结果。 销售价格为 400 时, 可以实现最大收入 96,000 美元。 这和我们通过手动求导数并算出最优解时 得到的结果相同。
那么,从这一扩展讨论中能得出什么结论呢? 一,微积分对数据科学很重要。 二,它是统计分析的基础。 三,它直接用于优化问题。
大O
大 O 和函数性能 是数据科学中的一个重要主题, 可以让你远离麻烦。 时间紧迫时,它尤为重要。 因为可以对数据执行的函数, 在速度方面有所不同。 函数的增长率指的是函数需要的时间, 也叫作它的阶。 所以它才被称为大 O,O 指的是阶。 大 O 用于描述增长率, 增长率的差异可能很大, 有时甚至是反直觉的。
比如,有些函数速度非常快。 像 O(1), 一个针对的二进制数的常数行列式, 或奇或偶; O(log(n)),对数函数; 或 O(n),线性函数。 它们的速度都很快。 中等速度的函数包括 O(n log(n)), 用于快速傅里叶变换, 与其他函数相比是一条很快的捷径。 然后是慢速函数, 我说的慢指的是非常慢。 比如 O(n^2)n的二次方,二次方函数,O(2 ^n),二的n次方, 指数函数; 以及 O(n!) ,n的阶乘, 这大概是速度最慢的函数了。 我举个例子来介绍一下工作原理。 有些函数很有用,比如插入排序, 用于对列表中的项目进行排序。 在最好的情况下,插入排序速度很快, 它的阶数是 N。 但在一般情况下,它的速度特别慢, 所以时间范围可能从从线性到二次方都有。 而另一个比较相似的排序过程, 选择排序,在最好和一般情况下速度都很慢。 可以看到,插入排序的差异很大, 选择排序的差异很小, 但感觉上它们不应该存在差异。 正因如此,在选择函数时, 你要清楚自己将会遇到的情况,这很重要。 我来简单说明一下它在 R 中的工作原理。 我们用图形来表示不同函数的速度。
我要使用 RcolorBrewer 包 来标识颜色。 它在画图时很有用。 加载这个程序包, 然后在这里建一个图。 在绘图命令中 加入 X 轴和 Y 轴的限制范围。 然后从 RcolorBrewer 中 选择特定的调色板。 下面我来绘制函数。 首先是个快速函数,常数函数。 我要做的是使用这些不同的参数, 来绘制这个函数。 现在,把它放大来看,它是一个常数函数。 不管有多少元素,它需要的时间都完全相同。 对数函数需要的时间稍长一些。 我们把它画出来。 可以看到它的时间在增长,但幅度很小。 线性函数需要的时间更长一些。 这个增长幅度已经很明显了, 但与我们将要看到的情况相比简直微不足道。 速度中等的对数线性函数 看上去似乎慢了许多, 但考虑到它在快速傅里叶变换中的运用, 这已经很好了。 它的涨幅要大很多。 在运行这种函数时, 就算只有 10 个元素, 它也需要 23 倍于常数函数的时间。
来看看慢速函数,二次方函数。 可以看到, 这个函数几乎是直线上升到顶部的。 然后是指数函数。 指数函数是一种比较快速的、 使用动态规划来解决行商问题的方法。 这条线非常高。 接下来是速度最慢的阶乘函数。 当你开始尝试使用暴力破解法解决行商问题, 并寻求每一种可能的组合时, 可以使用这种函数。 图片显示了它需要的时间量, 这条线是垂直向上的。 我们把图片放大,看绿线。 我顺便加一个图例, 在元素数量为 10 的地方 加一条垂直的参考线。 我们用虚线来表示。 现在,元素数量为 10, 常数函数每次只需 1 个时间单位, 对数函数所需的时间要长一点, 而阶乘函数所需的时间是 350 万倍。 所以,不管使用哪种算法, 你都需要了解你要使用的函数在时间 和计算资源方面是否高效, 除非你非常有耐心。 从这个简短的演示中我们知道, 函数之间的速度差异很大, 它们的速度也可能因任务而异。 务必要注意函数的计算要求, 包括数据集的大小, 以及你要执行的特定任务。
贝叶斯概率
贝叶斯定理是一个重要工具, 可让你在分析数据时看到问题的另一面。
具体地说,它常能帮助你回答正确的问题。 大多数推理检验往往通过假定某种原因 或假设,给出数据概率、观测效果。 但大多数人想要的恰恰相反。 他们想要在给定观测数据的基础上, 得出假设或原因的概率。 这两种会有截然不同的答案, 所能获得的也相差甚远。 所幸,贝叶斯定理能满足他们的需求。 托马斯·贝叶斯是 18 世纪 英国的一位牧师、统计学家。 我们不知道他长什么样, 所以这里只是一个大致轮廓。
不过,贝叶斯定理使用先验概率和检验信息, 得出所谓的后验概率。 这与收集数据前后的概率有关。
首先是给定假设(Hypothesis)后数据(Data)的概率, 叫做数据似然度,或者敏感度(Sensitivity)。 通常,这从假设检验中得出。 再加上假设或原因的概率, 叫做先验概率。它就像基础概率, 表示这种情况有多常见。 再加上数据的概率, 得到这种结果的可能性有多大? 这叫做边际概率。如果把它们组合起来, 就得出给定观测数据后假设或原因的概率, 这叫作后验概率。 实际的组合方式就是这样。
后验概率等于似然度乘以先验概率, 再除以边际概率。 用符号表示,就是这样。如果用图形表示, 会更容易理解,下面就来看看这个。 比如说这个正方形代表所有人。 假设有一种疾病, 顶部这个较暗的长方形代表患病的人。 我们可以对这种疾病进行检验, 这种检验能够识别出 90% 的患病的人。 顺便说一下, 这也意味着 10% 的人是假阴性。 检验能发现 90% 的患病人群,这是好事。
而这引出了一个问题:如果一个人的疾病检验 是阳性,那么他实际患病的概率是多少? 给你一个提示,不是 90%。 问题是 90% 这个数字来自已经患病的人。 我们必须考虑到检验可能有假阳性这一点。 我们来看看没有患病的人, 这些人当中有一些即使没有患病, 也会检测为阳性,用浅蓝色条形表示。 所以在没有患病的人中, 有 90% 的人检验结果为阴性, 10% 的人检验结果为阳性。
如果你的检测结果为阳性, 要弄清你患病的概率,需要一些东西。 你需要知道检测为阳性的患病人数, 然后除以检测为阳性的总人数,包括假阳性。
在上面这里,我们取 29.7 这个数字。 这里取 6.7,然后将它们组合起来。 相加然后相除,得出 81.6。
这意味着如果检测为阳性, 实际患病的概率是 81.6%。 这小于我们之前认为的 90%, 并没有减少多少,但如果改变数字呢? 如果疾病不是很常见, 患病概率不是 33% 呢? 我们选择一些不太常见的疾病, 比如只有 5%。
即使敏感度不变, 检测为阳性的患病总人数百分比只有 4.5%。 而假阳性占总人数的 9.5%。 如果检测为阳性,要弄清患病的概率, 代入这些数字,进行计算。 结果为 32.1。这意味着如果检测为阳性, 患病的概率不到三分之一。 如果在 R 中来看这个例子, 我可以更轻松地证明这一点。 首先,让我先进行一些单独计算。 我们要在这里创建一个疾病概率的变量。 我把它叫作 pd。 假设它占总人数的百分之一。 然后是给定患病后检测结果呈阳性的概率, 我把它设为 .999, 这是一个非常敏感的检验。 给定没有患病后检测结果呈阳性的概率 设为 10%, 这是假阳性率。 现在,我们可以使用贝叶斯定理, 计算出给定检测结果呈阳性后患病的概率。 经过计算,结果为 9%。 虽然检验的敏感度为 99.9%, 但它并没有解释假阳性的事实 和人群中患病的基础概率。 这两种因素结合在一起得出, 即使你的检测结果为阳性, 你患病的概率仍然非常低。
我也可以用图形表示,这叫作概率曲线。 现在,我要制作一个图表 来显示患病的概率,底部是从 0 到 100。 单击这里,把它放大。 我们可以看到先验概率,它表示这种疾病 有多常见,从左边的 0 到右边的 1, 也就是 100%。 然后是给定检测结果呈阳性后 实际患病的概率。
它在 Y 轴上,这是后验概率。 我在这里设置一些参考线,让它更清楚一点。 返回这里,运行这条线和这条线。
这条垂直线代表占总人数的 1%, 假设是患病人数, 就在左侧附近。这条水平线表示, 假设只有 1% 的人患这种病, 如果检测为阳性,患病的风险大约是 9%。 我可以提供更多这些信息, 方法是准备一整套不同级别的敏感度 和不同级别的假阳性图表。 我在这里创建一个矩阵,这个代码可能不是 最优的,但它可以解决我们现在的问题。 首先是这个图。和我们前面制作的类似。 我先制作这个。
它很小,位于上方的角落里。 然后制作其它几个。 把它放大。你可以看到, 最上面一行检验的敏感度是 99.9%, 接着下降到 95%,然后是 80%。 左侧的假阳性率是 1%, 中间是 10%,右侧是 25%。 从左上方可以看出,如果检验非常敏感, 疾病非常罕见,而且假阳性率非常低, 那么几乎可以保证, 不太可能会有假阳性存在。 但是,在右下角,检验不是很敏感, 有不少假阴性,假阳性也有很多, 如果这种疾病不是很常见, 由于基础概率的影响,在这个例子中, 阳性结果几乎没有任何意义。
这就是贝叶斯定理对理解结果 真正意义的贡献: 将概率从先验概率转变成后验概率。 我们从中得到的结论就是: 首先,你需要关于先验概率的信息, 才能使这一切进行下去。 如果没有这些信息, 可以使用概率曲线来得到所有可能的值。 不过,最重要的是,贝叶斯定理和相关计算 更有可能为你或你的客户最初思考的问题, 提供正确的答案。
应用统计学
假设
假设检验是推论统计 最常用的方法之一。 它的目的是直接检验推测。 假设检验的步骤包括: 首先,要计算 X 的概率,不管结果如何。 如果随机性是唯一的解释, 那么它偶然发生的概率是多少? 如果这个概率很低,则拒绝随机性 作为观测结果的合理解释。 这就是假设检验的基本原理。 在某些情况下,这特别有用。
假设检验常用于科学研究, 检验某个推测是否合理。 它在诊断学中也很常见, 用于计算某个结果基于 检验结果的概率。 如果想知道自己是否符合 某个特定标准,这基本上就是 决定符合或不符合所遵循的一般原则。 它的全称叫做零假设检验, 进行这个检验时, 涉及两个假设或推测。
第一个是零假设。 通常写作 H0, 是指不存在系统效应, 组平均值之间不存在一致的差异, 变量之间没有关联,随机抽样误差 是对样本中观察到的效应的唯一解释。 与它相反的是对立假设, 可以写作 HA,A 表示对立, 也可以写作 H1。 你可以简单地认为, 它是指存在系统效应, 组平均值之间存在一致的差异, 变量之间存在关联。 但重要的是它叫做零假设检验。 所以,你要做的就是直接看零假设, 也就是不存在系统效应。
实际上,你可以通过 零分布图表来看零假设。 这是 Z 检验。 它确立了这个结果的可能范围: 如果零假设为真,只有随机抽样误差 才能解释组平均值之间的差异。 你可以看到,大多数得分都靠近中间, 两边逐渐变细。 你要做的就是设置拒绝的 一个或多个区域。 这里我用红色表示。 这些是上临界值 2.5% 和下临界值 2.5%, 表示一个标准, 如果你的样本值落在其中 任何一个拒绝区域,那么根据零分布, 这种情况偶然发生的概率很低。 接下来需要做的就是制定决策。 当然,问题在于, 确定是否存在样本效应时, 你可能会犯错。 一种可能性是假阳性, 指的是样本数据显示出某种统计效应, 但实际上是由随机性导致的。 在右边的散点图中, 两个变量之间有很强的负相关。 得分在 x 轴上从左向右依次降低。 通过回归线可以看到, 这个规律非常明显。 另一方面,我使用实际上 创建不相关变量的代码, 随机生成了这些数据。 代码指定了相关性为零, 我需要运行四五次, 才能随机得到这个高度正相关结果。 所以,这是假阳性。 样本有相关性,但它所在的总体没有。 另一方面,只有当你拒绝零假设, 假阳性才会发生。 这就说得通了。 它叫做第一类错误,指的是 在整个零分布中,有时会出现极值。 你可以选择自己常用的概率。 最常见的是 5%,意思是, 如果零假设为真,假阳性的概率是 5%。 另一方面,你也可能会有假阴性。 这种情况下,数据看起来呈随机分布, 但实际上,各组之间存在系统差异, 或者存在相关性。 这是一个例子。 这个散点图看起来完全是水平的, 或者非常接近水平。 但实际上,生成数据的代码 指定了正相关性为 0.25,非常明显。 同样,我需要运行四五次 才能获得水平的相关性。 但这告诉你,随机变异可能 会导致不同于总体给你的认识。 当然,只有当你不拒绝零假设, 获得阴性结果时,才会出现假阴性。 这叫做第二类错误,与假阳性不同, 你可以选择一个自己喜欢的值, 这个值实际上是 根据多个因素计算出来的。 不过,现在假设检验大体上 受到了很多批评。 第一个很重要, 就是很容易误解它所计算出的概率。 而且,人们会对零效应假设提出异议。 另外,解释中可能存在偏差, 这来自于对标准划定界限。 但或许最重要的是, 有人说它回答了错误的问题。 它给出的是给定假设后数据的概率, 但你真正想要的是贝叶斯对立假设, 也就是给定数据后假设的概率。 虽然有解决方法,但它们通常 不包含在假设检验的讨论中。 我们的结论就是: 假设检验常用于是或否、 通过或不通过的决策。 尽管有一些批评,但它还是非常有用, 人们利用假设检验进行了 大量非常重要的研究。 而贝叶斯方法可以转变概率, 估计或置信区间是非常有用的 标准假设检验的备选或补充方法。
置信
我们要探讨的下一种 推论统计方法是置信区间。 这些方法试图直接回答这个问题:它有多大? 统计效应有多大?组平均值间的差异有多大? 变量之间的关联有多大? 接下来需要选择一个置信度。 你必须选择这个置信度。 95% 是最常见的。 或者就像这里显示的同心圈一样, 你可以缩小一些范围, 也可以扩大范围,得出更广泛的结论。
原理就是,你越自信,例如,从 95 到 99, 区间越大,也就是说在这个例子中, 圆圈更大。 两种要素之间也存在一种权衡。
首先是准确性。在估计的置信区间中, 准确性意味着等于目标值, 或者集中在真实值上。 更具体地说, 如果置信区间包含真实的总体值, 它就是准确的。 当然,这就会对总体做出正确推断。 与准确性相比,精确性的含义则不同。 在这个例子中, 精确性是指较窄的区间、较小的可能值范围。 这与准确性无关。 我来展示一下它的原理。 假设我看到的是 0 到 100 之间的值。 50 处有一条粗线,55 处有一条虚线, 在这个例子中, 55 是我捏造的真实总体值。 这个分布显示了一个值范围, 它既不准确也不精确。 它不准确是因为漏掉了真实值, 真实值实际上在 50% 的另一边。 如果这是政治投票, 你就会向他们提供错误的答案。 另外,它不精确是因为分布得太广。 这个分布是准确的,因为它集中在真实值上, 在这个例子中是 55。 但它不精确,因为它同样过于分散, 你有大约 2/3 的可能给出正确答案, 或是 1/3 的可能获得错误答案。 也就是说, 如果你的支持率高于或低于 50%, 就会在政治投票中获得支持。 与这个相反,这种分布非常精确。 它非常狭窄,只有很少的 10%。 但它不准确。 事实上,它几乎完全弄错了方向, 彻底漏掉了目标值。 这种最理想。 它很准确,因为集中在真实值上; 也很精确,因为非常狭窄。
在这里,你可以同时看到四种分布, 左边的不准确,右边的准确, 右下角的是最理想的。 接下来是解释问题,也就是向客户解释结果。 置信区间的问题是有时实际统计结果 和解释之间没有关联。 实际结果很容易获得。
例如,平均值的 95% 置信区间 为 5.8 到 7.2。 这些都是捏造的数字。如果人们不仔细思考, 通常对这句话的通俗解释是, 总体均值在 5.8 到 7.2 之间的概率是 95%。 另一方面,标准方法是总体均值是固定的, 不会改变,而这意味着它会改变。 根据标准方法,正确的解释是, 随机选择的样本的 95% 的置信区间 将包含总体均值,因为在这个例子中, 改变的是样本,而不是总体。
通过这个图形可以看出这一点。 这是从总体均值为 55 的数据中 随机生成的 20 个置信区间。 它们从底部的低值上升到高值。 你可以看到其中 19 个与真实总体值相交, 所以它们是准确的置信区间。 另一方面,靠近最右边的第 18 个区间 用蓝色表示,因为它完全漏掉了真实总体值。 这是因为样本和相应置信区间存在随机变异。 下面来看看, 可以影响置信区间宽度的一些因素。 首先是置信度。 从 80 到 90 到 95 再到 99, 区间会越来越大。 其次是标准偏差, 也就是所研究事物的固有变异。 有些事物变化不大, 所以它们的置信区间总是很窄。 有些事物存在大量变异,所以区间很大。 然后是样本量,这是最关键的因素。 小样本的置信区间通常很大。 如果样本量足够大, 任何置信区间都可以变得任意小。 所以,样本量是获得 精确置信区间的重要因素。
我们的结论是什么呢? 首先,置信区间侧重参数 并试图直接估计参数。 另外,它们提供了高值和低值的范围, 所以数据中的变异明确包括在内。 这使得置信区间比你从标准假设检验中 获得的结果更有用。
问题
我们来看看在建模时, 也就是构建统计模型时, 遇到的一些常见问题。
最大的问题是,数据科学可能变得很复杂。 比如你的数据可能具有非正态性。 大部分方法都是钟形曲线, 如果你采用其他方法,就会遇到问题。 变量间的关联可能存在非线性。 直线比较容易处理,曲线和其他形状则更难。 还可能出现我之前提过的多重共线性。 这是指预测因素相互关联, 导致结果变量发生重叠。 可能还会遇到缺失值, 导致模型自身发生许多问题。 我们来逐一看一下。 由于方法大多采用钟形曲线, 因此非正态性是个问题。 钟形曲线呈正态分布。 但你可能需要极偏斜分布, 或者具有双峰或其他形状的混合分布。 另外还可能有离群值。 你会发现, 非正态性会扭曲你使用的度量和模型。 你可以采取一些措施。
比如尝试转换数据, 稍微调整不对称分布的数据。 还可以尝试分离混合分布。 这样就有可能获得两个正态分布的曲线。 非线性是指关联呈曲线分布。 大多数方法都倾向于画直线, 比如回归,这个就是。 另一方面,数据呈明显的曲线分布, 这其实是一种理想的数据曲线形状。
线性是方法的常见假设。 你可以转换一个变量或两个都转换, 看看能否把曲线变成直线。 如果是增长曲线,你可以使用多项式, 采用平方、 立方或其他一些函数来帮助拉直这条曲线。 之前我们提过多重共线性问题, 也就是相关预测因素在尝试解释 结果变量时相互重叠。
问题在于这会扭曲系数。 有些流程受这个问题的影响较小。 有个方法很有趣,有时使用较少的变量, 仍然可以获得预测能力出色的模型。 而且更重要的是,它既稳定又可解释。 此外,并非所有决策都必须基于数据。 你可以使用理论, 在可能的变量集合之间进行选择。 这也是数据科学包含计算机编程、 数学统计学和专业领域知识的原因之一, 这样才有理论可以帮助指导你的分析。
另外两个问题, 一个是我之前提过的组合爆炸。 这是指变量或类别的组合增长过快。 例如,有 4 个变量,每个 2 种类别, 那只有 16 种组合。 你可以了解所有组合,这不是难事。 但如果有 20 个变量,每个 5 种类别呢? 这种情况很常见。 会有 95 万亿种组合。 你显然无法遍历所有组合。 因此,你必须找到一种方法来进行一些精简。 基于专业领域知识的理论, 可以很好地指导你找到这种方法。 另外,马尔可夫链蒙特卡洛方法 也是一种常用方法。 我们先不讨论这些方法的具体用途, 但要知道,当你遇到难题, 无法遍历每个可能的组合时, 可以用它们作为解决方案。 还有一种问题叫维数灾难。 这是指你看到的现象只发生在多维组合中,是一种高维现象。 如果现象变得难以解释和预测, 你可能需要尝试减少维数,与组合爆炸一样, 马尔可夫链蒙特卡洛方法 在这种情况下也很有用。 缺失值可能会扭曲分析, 并且可能导致结果产生偏差。 你需要做的一件事是检查缺失模式。 是否有一组特定案例缺少这个变量的值? 如果是,你需要了解 为什么缺少值的是这些案例, 而不是其他案例。 如果没有固定模式,你可以直接删除 缺失值的案例,但这种情况不常见。 另一种方法是插补缺失值。 有几种办法可以做到这一点, 其中有些优势很明显。 关于这次简短讨论,我们可以总结出几点。 第一,当你尝试建模时, 数据确实可能带来复杂问题。 这包括回答和模型中存在不确定性、 由于缺失值导致偏差和违反正态性假设。 你可以使用分析方法或相关领域的实质理论 来解决其中一些复杂问题。
验证
在数据科学分析中, 验证模型这个主题很容易被忽视。 关键在于你的分析是否符合目标。 很多机器学习算法都失败于实施阶段, 许多科学研究无法复制。 问题在于,你的分析是否真的让你 深入了解问题的一般性质, 而不只是了解手头的具体数据。 换句话说,你的模型非常适合样本数据。 量身定制,非常出色,但其他数据呢? 这是选择普适性或者说可扩展性的问题。
思考这个问题的一种方法是使用后验概率, 也就是获取关于当前数据的信息 并与过去的信息相结合, 从而获得关于未来的某种认识。 大多数分析会提供给定假设后数据的概率。 这是标准测试的基础,不过, 分析给定数据后假设的概率 会更加有趣和实用。 要调换这两种方式, 你必须使用我提过的贝叶斯定理。
获得验证的最简单方法是复制研究。 也就是说, 你要看看能不能重复这样做 并得到相同的结果。 你可以对比精确复制与概念复制。 精确复制是整个过程中完全相同, 而在概念复制中,你要引入变异。 你还可以结合研究结果, 通过元分析或贝叶斯方法可以实现这一点。 两种方法都有效, 因为复制在很多领域都被视为黄金标准。
接下来是留出验证的方法, 就是把数据分成两部分,使用一部分数据 创建模型,然后使用另一部分数据测试模型。 从概念上讲,这个任务很简单, 但需要非常大的样本, 确保在测试之前可以忽略一半的数据。 这种方法在分析竞赛中很常用。
接着是交叉验证, 也就是使用相同数据进行训练和测试。 有一种常见方法叫留一法。 它简单快捷,适合线性模型。 这种方法是一次删除一个值, 并根据所有其他值计算拟合, 从而计算结果的可靠性。 这其实就是刀切法。 它有一种变化叫留 P 法, 是由你选择特定数字。 还有 K 折法,也就是将数据分成多个组, 把一个组放在一边作为测试案例, 使用另一个组建模并测试,然后轮换, 这样每个组都有用做测试案例的时候。 关于这次简短讨论,我们可以总结出几点。 第一,你要确保你的分析有价值, 并且在分析样本数据后可以提供相关信息。 你要检查结论的有效性和模型的普适性。 这很重要, 因为可以帮助你树立对分析和模型的信心。
机器学习
决策树
我们要讨论的第一个 机器学习流程是决策树。 这让我想起了车尾贴上写的“树是答案”, 在机器学习领域,往往也是这样。 这个例子是一个很简单的决策树。我们要讨论的第一个 机器学习流程是决策树。 这让我想起了车尾贴上写的“树是答案”, 在机器学习领域,往往也是这样。
这个例子是一个很简单的决策树。 我们来快速看一下这张图的结构。 这是根节点,也就是起点,在顶部, 接下来是这些分叉路径,标在分支上, 或者叫边,这是数学术语。 这些节点就是决策点。 最后是叶子或终端节点, 它们是你的数据最终到达的最后一个类别。 决策树分为两大类。
一类是分类树, 使用定量和分类数据对分类结果进行建模。 另一类是回归树,同样使用定量和分类数据, 不过是对定量结果进行建模。 这有点像多元回归, 但树的构建和解释往往更容易。 构建树时,你必须做出一个重要决定, 就是用来生成分叉路径的算法或方法。
有几种选择,比如早期的 ID3; 还有它的后继者 C5, 我认为这个 C 代表分类器。 分类和回归树。 它是常见的普遍选择。 卡方自动交互检测法。 多元自适应回归样条。 还有我要使用的条件推断决策树。 一般来说,决策树有利有弊。
优点是灵活,可以处理很多不同类型的数据, 不需要太多准备工作。 而且它们很稳健,可以应对违反假设的情况。 它们易于解释,可以处理大型数据集, 而且通过白盒模型, 你可以轻松看到特定案例最终的决策过程, 以及它所属的类别。 缺点是许多这类模型都依赖启发式和局部最优, 它们通过搜索优化相应节点上的决策点, 而不一定适用于树的全局上下文。 有些方法容易过度拟合, 分支太多,不能很好地进行归纳。 有时某些概念, 如排他、异或、模仿或多路复用, 很难在决策树中建模,但它们也不常见。 决策树可能偏向选择 与其他变量相比级别更多的变量。 我选择条件推理的原因之一, 就是它不太容易受这种缺点影响。 我们在 R 中看一个实际例子。 在这里,我们将使用叫作 party 的包, 如果还没安装,你可以装一下, 另外还会使用 R 内置库中的数据集, 我们把这两个加载一下。 我们要创建一个条件推理树, 在这个例子中是一个分类树, 创建回归树也很容易。 我们将使用之前展示的鸢尾花数据, 我们对三种鸢尾花进行了 150 次观察, 并对每种鸢尾花进行了 4 次不同的测量。
没有太多变量需要处理, 这个例子很容易理解。 我们要做的其实就是使用一个条件推理树, 从而生成实际计算。 如果想查看创建的树的信息, 可以转到下面, 这里显示它在花瓣长度、花瓣宽度, 然后又在花瓣长度上生成了分叉路径。 用图来看这些结果会容易得多, 所以我们来画个图。
在这里画个图,然后放大这个图。 我之前已经展示过其中一部分, 这棵决策树对三种不同鸢尾花的 150 项观察数据进行分类。 先看花瓣长度,如果是短花瓣, 它们都会沿左边向下归入山鸢尾。 如果长一点,就会继续看花瓣宽度, 在这里分叉, 然后其实还要再看一次花瓣长度。 杂色鸢尾最终位于第五节点, 而维吉尼亚鸢尾大多在最右边。 中间有一个节点很难判断, 因为每种花各有四朵, 所以存在一些错误分类。 事实上,如果你想定量查看, 使用表格是个很好的方法。
我们回到 R, 让它给出一个包含预测类别 和实际观察类别的表格。 实际类别横列在顶部,预测类别列在侧面。 可以看到,所有山鸢尾分类正确, 有一个杂色鸢尾被误分类为维吉尼亚鸢尾, 五个维吉尼亚鸢尾分类错误, 所以出现了一些混乱。 但总的来说, 我们使用的决策树 能够根据两项简单的测量数据 对这些花进行分类。 关于决策树,我们来总结一下。 3 个要点: 一是灵活、易于使用且效果出色。 二是需要将所使用的算法与你的数据相匹配, 比如是分类数据还是定量数据, 还要与你尝试回答的特定问题相匹配。 三是要注意防止过度拟合, 或者使用不易受影响的方法。
集成
机器学习最重要的进步之一 是使用集成,或者说集成模型。 大家可以把它看做是集体智慧的统计学版本。
集成模型的理念是组合多个估算值, 也就是取特定结果的多个不同估算值的平均值。 这是因为,组合后的估算值 往往比单个估算值更加准确。 比如一项比赛中,大家要猜出 罐子中弹珠的数量。 这时候就要取所有人估算数量的平均值, 因为有人猜得过高,有人过低, 平均值往往比任何一个人的猜测 更接近真实数量。 在组合估算值时,还要记住一点, 就是保证多样性,稍后我会详细解释。 组合估算值有几种不同的方法。 最常用的方法有 3 种。
第一种是套袋法,引导聚合。 你可以随机抽取数据集, 在此基础上建立模型,获得多个预测, 然后组合这些预测, 在某种程度上就是通过这些模型来投票。 第二种是提升法,每个分类器 为在前一个分类器被分错的样例提升权值。 以此提高错误样例的权重。 第三种是混合法,也称堆叠法。 这种方法使用二阶模型 来组合一阶模型的结果, 因此更复杂一点。 相比而言,套袋法的使用更为广泛一些。 下面拿 R 给大家举个例子。 我要使用 R 中一个名为随机森林的包, 如果你没有安装,要先安装一下。 我还要用到内置数据集包, 现在加载这两个包。 我们已经了解了一些关于包的信息。 向下滚动,使用和之前相同的鸢尾花数据。 再来看 head 命令, 有四个定量测量值,以及鸢尾花的分类。 现在我要做的是把数据分为两部分
, 这是很重要的一步。 选取三分之二的数据创建一个训练集, 剩下的三分之一创建一个测试集。 在这里创建一个随机种子, 以便保证一致性或可重复性。 数据已经分开了, 接下来我要创建两个数据集: 训练集和测试集。 然后创建包含决策树的实际随机森林, 在这里依然要创建一个随机种子。 下面使用随机森林功能。 我要把数据填满,指定 500 棵树。 然后计算相似性。 现在来看一下这个随机森林的结果。
首先看看分类表格中的结果。 先是一个调用,也就是实际命令。 类型是分类,树的数量是 500, 每部分数据中使用了 2 个变量。 出错率很低,只有 3.67%。 下面是混淆矩阵,或者说分类错误的情况。 山鸢尾很容易区分。 变色鸢尾中有两个误分为维吉尼亚鸢尾, 维吉尼亚鸢尾中有两个误分为变色鸢尾。 我们回到这里的脚本。 现在我们按照树的数量来绘制错误图。 运行这行,这是图形,我们把它放大。 这里有一条很低的线,表示错误很少。 这条线有时很平稳,但也有波动, 因为随机数据会被抽取出来并组合在一起。 不过在大约 150 棵树之后就一直很平稳。 这正是重复多次这样做的好处, 哪怕这只是一个随机过程。 另外,我们可以看一下 预测值变量的相对重要性。 我要使用重要性函数,这个就是。 然后就会得到相同信息的图形, 大家可以在这里看到,我把它放大。 从图中可以看出, 对于减少常见错误测量系数 Gini, 花瓣长度是最重要的预测值。 花瓣宽度和花萼长度则没那么重要, 而花萼宽度几乎毫无影响。 然后,我们可以提取这个模型, 运用它来测试数据。 把它用到这里, 然后我们可以得到一个新的表格。 大家可以再次看到,山鸢尾非常容易分类, 全部分类正确。第二列的变色鸢尾 八个中有两个被误分, 维吉尼亚鸢尾十三个中有一个被误分。 这些结果与我们对鸢尾花数据 进行的其他分析的结果非常一致。 对于集成模型,包括随机森林, 我们可以得出什么结论? 首先,多个估算值的准确性 要高于一个估算值。 第二,数据的多样性, 也就是随机筛选数据和确保模型的多样性, 可以提高估算准确度。 最后,随机选择样例和变量, 对于真正确保多样性有着重要的作用, 这能让模型的集成更具预测性和准确性。
k临近算法
K 最近邻是一种 十分常用的案例分类方法, 旨在使用邻近样本或邻近案例, 来预测如何对特定实例进行分类。 K 最近邻又称 kNN,其中 K 指近邻的数量, 是一种基于实例的学习, 关注的是特定案例邻近的实例或示例。 由于算法以实例而不是参数为依据, 有时被称为懒惰学习法。 实际是说,这种算法非常简单, 易于介绍概念,操作不复杂且非常有效。 确定近邻的第一步是确定某种距离度量。 案例之间的距离是多少? 现在,假如你有一定数量的预测变量, 我们称为数量 J, 那么你可以计算 J 维空间中的 欧几里德距离。 这通常适用于定量变量。 而对于分类变量, 则可以使用重叠度量,也就是汉明距离。 另外,你需要留意组合爆炸, 意思是如果变量数量庞大,会有很多个维度。 在应用 kNN 之前, 可能需要使用因子分析或主成分分析 来减少维度。 接下来是如何选择 K, 也就是要使用的近邻数量。 近邻数量越多,模型会越平滑, 能消除很多扭结, 但同时也可能有随机产生噪声的风险。 这实际上会增加误分类的概率, 因此需要些权衡。 一种方法是为近邻分配权重, 较近的获得更大权重,影响力更大, 而较远的案例则权重较小。 你也可以使用 kNN 的各种变体, 如扩展邻近算法 ENN, 或压缩最近邻算法 CNN。 可用的方法很多, 但我们在 R 中来看一个很简单的例子。 在这个例子中,我要再次使用鸢尾花数据, 并且使用一个名为 Class 的库, 意思是分类。我们要加载这个库, 另外还要使用鸢尾花数据集, 然后加载这个数据包。 首先,快速浏览一下你的数据。 我还是要抽取鸢尾花数据中的前 6 个案例。
如果数据的大小差异很大, 且变量的范围不同,则建议将变量标准化。 让它们处于相似的范围内, 使变量标准化。另一方面,在鸢尾花数据中, 样本都非常接近,没有必要进行标准化, 所以我会跳过这一步。 就像之前做的, 我要使用三分之二的数据创建一个训练集, 三分之一的数据创建一个测试集。 使用随机种子来确保再现性。 接下来将案例分成实际的 4 个定量变量, 然后从中删除实际的种类。 所以,这里是前 4 个变量, 也就最后看到的一到四个变量。 这样就创建了训练集和测试集。
另外,因为确实需要设置分类标签, 所以我把它们保存为单独的数据集。 好了。接下来我要创建一个分类器。 你需要选择 K 的值,通常使用奇数, 避免持平的情况。 你可以尝试几个不同的 K 值, 看看结果如何。 我们来试几种。 在下面找到我的预测模型, 在这里我使用 kNN 函数, 并将初始值设为 3, 只查看 3 个最近邻,这个模型就建好了。 如果想要了解分类的情况, 执行这个表格操作。 可以看到,17 个山鸢尾都被正确分了类。 10 个变色鸢尾中有 2 个分类错误、 1 个维吉尼亚鸢尾分类错误。 我们更改 K 值, 再试一次,然后对比结果。 退回到上面,把这个值改成更大的数字, 比如 9。 再次运行这个命令。 突出显示整个部分,重新执行表格操作, 看看比较结果如何。 把界面展开,方便查看这两次的结果。 对比显示分类稍有改善, 错误分类的变色鸢尾减少了一个。 我之前做过对比,知道提高 K 值不会改善 这个特定数据集的分类情况, 而且根据之前使用鸢尾花数据集的经验, 我们知道存在一定的固有错误分类, 但这能让我们了解算法的原理。 根据这次小体验, 关于 kNN 模型我们可以得出哪些结论? 首先,kNN 概念简单, 不难描述,是一种非参数分类法。 这是因为 kNN 只使用近邻样本作为数据。 另外,要记住你选择的 K 值 和距离度量会影响结果, 所以要研究多种方法,对比结果, 然后为你的数据选择最适用的方法。
朴素贝叶斯分类器
另一种常用的分类算法 是朴素贝叶斯分类器。 你可以将它看作一种朴素、 简单但效果显著的解决方案。 “朴素贝叶斯”需要稍作解释。 它是一种分类方法, 可以抽取数据集中的案例并进行分类。 因为采用了贝叶斯定理,所以称为“贝叶斯”。 这个定理可用于 推断给定数据属于某个分类的概率。 “朴素”是因为它无视预测因素之间的关系。 这看起来有问题,但有趣的是, 这个算法其实很有效。 朴素贝叶斯算法虽然朴素, 无视变量之间的关系,但效果仍然显著, 数据准备的效果甚至更好。 比如,平衡分类的大小。 它可以标准化分类的权重, 弥补特征之间的依赖关系。 它可以转换数据,模拟幂律分布。 这种算法还有其他优点, 但主要是以上几点使得这种方法非常有效。 我们在 R 中快速演示一个 简单的朴素贝叶斯例子。 我要使用两个外部数据包。 其中一个叫“e1070”, 根据开发它的类别命名。 它具有我们要用到的贝叶斯法。 我还要使用另一个 “mlbench”包中的一些数据, 意思是机器学习基准。 根据需要进行安装,然后加载它们。 然后使用 1984 年美国国会众议院的 部分相关投票数据,HouseVotes84。 加载这些数据, 然后我们看一下前 6 个案例。 稍微放大一下。 这里有一个众议院议员的政党分类, 包含 16 个变量, 从 V1 到 V16, 代表对 16 个特定法案的投票。
NA 代表有人弃权或不在场。 有赞成票,有反对票, 我们要根据这些投票 来划分民主党人和共和党人。 回到上面的模型。与其他情境下的操作一样, 我要把数据分成一个训练集和一个测试集。 我们要使用种子来保证再现性。 我把它分成两个集,然后创建 两个独立的数据集:训练集和测试集。
接着往下,创建分类器。 我要创建一个朴素贝叶斯分类器对象, 简称“nbc”,指定要使用什么数据。 我们来看下这个分类器。 我把界面展开,这样大家可以看到更多信息。 首先,它为我们提供先验概率, 也就是我们训练的总体样本的百分比。
这里,民主党人占 59%, 共和党人占 41%。 条件概率告诉我们,民主党人和共和党人中 对 16 项法案投赞成票和反对票的百分比。 例如,对于第一项法案 V1, 36% 的民主党人投了反对票, 64% 的投了赞成票,而共和党人中 18% 的人赞成,82% 的人反对。 对于第二项法案, 双方投反对票和赞成票的人数几乎持平。 而其他法案的意见分歧则比较大。 接下来可以使用以上数据 来处理我们的训练数据中的案例, 看看能否根据政党来正确分类。 我要检查模型处理训练数据的效果如何。 我要在这创建一个表格。 可以看到并不是每个人都已正确分类。 但我要使用 prop.table 生成比例值, 并使用舍入和乘法来确定比例。 可以看到,训练数据中 94% 的民主党人 和 88% 的共和党人被正确分类。 接下来在测试数据上试一试。 我要创建一个新的表格, 但是要使用刚才的模型 nbc,也就是 朴素贝叶斯分类器, 不同的是要将它用于测试数据。 我们再次看到,分类并不完美。 我们来看下四舍五入后的百分比。 测试数据中有 96% 的民主党人根据投票记录 被正确分类, 有 77% 的共和党人被正确分类。 当然,我们可能会想增加样本的数量, 可能想要涵盖更多的观察结果, 得出更准确的分类,但这里只简单展示 朴素贝叶斯分类器的工作原理。 我们能从中得出什么结论呢? 一,朴素贝叶斯算法简单却有效。 二,适用于各种预测因素, 包括定量和分类预测因素, 而且得出的结果很容易解释。 因此,朴素贝叶斯算法 是机器学习分类的绝佳选择。
人工神经网络
机器学习中最有趣的方法 或算法之一,是人工神经网络。 这个名字可能让人以为要构建一个大脑, 但我们真正要做的是, 开发遵循大脑指令的算法。
特别是,人工神经网络受到 生物神经网络的启发, 具有数据神经元或真正的算法神经元, 可以通过根据经验调整的连接, 也就是改变的权重来相互交换信息。
神经网络的常见使用场景包括: 基于规则的学习无效、 不能坚持到底、无法很好地描述。 例如,试图识别照片和视频的计算机视觉、 语音识别, 以及试图推断一个难以描述的非线性函数时。
这是一种黑箱模型,输入数据,它进入黑箱, 里面有某种隐藏的处理,与神经网络有关, 然后输出数据。 我们来看一个非常简单的例子 NR。 现在,我要做的就是使用一个叫作 神经网络的包,如果你需要, 可以安装。我在这里加载它。 然后,准备一些数据。 我们要让这个神经网络解决一个 非常简单的问题,就是学习如何求取平方根。 这很重要,因为它实际上是非线性函数, 而且我们不会使用内置的平方根函数, 我们将把它用于训练数据, 我们甚至不会向它提供所有可能的示例, 看看它是否可以通过分析从训练数据中 获得的信息推断出模式。 首先,我们需要生成一些随机数据。
我在这里设置随机种子,保证再现性, 然后我们从 1 到 100 中获得 50 个 随机数的样本,采用放回抽样, 这样就能多次获得相同的数字。 我们来看看这 50 个中的前 6 个, 有两个 41 和一个 94。 然后,对于结果部分, 我们将使用内置的平方根函数, 这将进入我们的训练 y,y 是结果变量。 我们得到了这个,可以看到前六个。 如果我们把这些全部放在一个单独的 数据帧中,就会更容易查看和处理。 我使用 as.data.frame, 可以在这里看到前六个。 41 的平方根是 6.40,后面还有 41,94 的平方根是 9.69 等。 下面,我们要训练神经网络。
你需要指定要用多少层,也就是多少神经元。 在这个例子中,我们用 10 层, 还要设定阈值,让它知道何时停止。 这其实就是误差函数的偏导数, 在这个例子中,我将它指定为 0.01。 运行这个函数,得到 net.sqrt, 然后绘制这个函数图。 现在它变成了一张图片,我们把它放大, 这有点难理解。
输出数据在一侧,权重传给神经元, 事物之间具有这些连接, 当它试图预测结果值, 也就是 train.y 变量时,权重带回这些连接。 现在可以使用新数据 来检验我们开发的这个网络。 我在这里创建一些数据, 这些数字有完全平方根, 我要把 1 到 10 这些数字乘二次方。 然后通过人工神经网络运行这些数字, 也就是乘二次方后的 1 到 10。 我告诉它使用相同的模型。我们来看看结果。 把它放大一点。我们得到了很多输出数据。 这是初始条目。我们可以看到多个一, 多个一对一,接着可以看到数字 1、4 和 9, 这些都是平方, 然后它开始计算这些人工神经元的权重。 我不奢望你真正理解这些,不过有很多。 最后是结果, 这就是它根据我们的输入数据 预计或预测的结果。
现在,我们将这些结果 和预计的结果进行比较。
我在这里创建一个表,获得原始 x、 实际平方根和神经网络输出的估计值。 在上面设置一些列名,显示这个表。 把它放大一点。你在这里可以看到, 即使我们没有向它提供 所有可能的平方根示例, 它也能得出非常接近的结果。 很多情况下,它至少精确到小数点后两位。 最大的偏差是在第二行, 它估计 4 的平方根是 2.04。
不过,这告诉我们, 它能够通过不完整的训练集 推断出有些复杂的规则。 这是关于推断线性模式的重要一点。 从中能得出什么结论呢?有三点。 首先,人工神经网络可以推断复杂的规则。 平方根非常简单,计算机视觉要复杂得多。 另外,它们可以从经验中学习, 调整和改变连接之间的权重。 而且,它们使用黑箱流程,很不透明, 你不知道发生了什么, 这使得它难以解释过程, 但正因为它太复杂, 也许我们不需要所有的细节, 只需查看输出数据是否准确, 就和我们在这个例子中做的差不多。
沟通
可解释性
数据科学项目 始终离不开可解释性。 要这样想,你要通过数据讲故事。 换句话说,你想求取价值。 你想在数据中找出价值。 问题是,分析本身并不是价值。 所以我喜欢这样想: 分析乘以你赋予项目的故事,等于价值。 注意,是相乘的关系, 不是相加。 根据乘法法则,如果故事是零, 即便完成项目,价值也是零。 所以,你的目标应该是 最大程度地丰富项目的故事, 也就是可解释性, 才能从数据和分析中获得最大价值。 想想目标,分析应该由目标推动。 你讲的故事,你给出的叙述, 应该与这些目标一致。 另外,清晰明确地回答你或客户 可能遇到的任何问题。 这里要记住重要的一点:客户不是你。 你需要注意一些问题。 自我中心主义就是一个问题。 我说的不是自负或以自我为中心, 而是一种心理现象, 认为别人能够看到、知道、 感受到你看到、知道、感受到的东西。 还有一个问题叫作虚假同感偏差, 指每个人都知道这一点,所以我无需解释了。 接着是锚定问题, 是指一个人一旦有了特定想法, 就很难摆脱它。 另外,客户不是你,你必须沟通, 所以你需要清晰阐述你给出的故事的每一步。 下面来看看这个问题的一些答案。 向客户汇报时,首先陈述问题, 也就是导致你做出分析的问题。 给出答案,明确表示你在给出答案。 根据需要具体说明,并按顺序进行。 在讨论流程, 也就是详细介绍你如何实现目标时, 有一点很重要: 少讨论,只在有助于解释答案时才讨论。 这个理念就是:分析是一种简化。 关于这点,我喜欢爱因斯坦的话 “万事应简单化,但不应太简单。” 还有一句“少即是多。” 人们普遍认为 这是路德维希·密斯·凡德罗所说, 但其实出自英国诗人罗伯特·勃朗宁之口。 为你的分析构建故事时, 应该牢记这两种思想。 你可以做几件事。 第一,多用图表,少用文字。 第二,简化你用的全部图表。 第三,避免使用表格和数字。 它们让人不知所措。 甚至在表格和图表中,也要少用文字, 把重点放在视觉表现上。 这些会帮助你专注于叙述, 从而构建一个对客户有意义的故事。 下面举个这方面的简单例子。 一个著名案例是关于 伯克利分校 1973 年研究生入学的。 问题是这样的。 1973 年,8000 多名 男性伯克利分校研究生课程申请者中 有 44% 被录取。 另一方面,4000 多名女性申请者中 有 35% 被录取。 这种差异很大,它导致了一场重大诉讼, 这与招生中性别偏见的概念一致。 问题是,当你按系分类时,会得到这张图。 这里有 6 个系, 我们把它们标为 A、B、C 等。 如果仔细观察, 在 A 系,女性录取的比率实际上较高。 B 系也一样, D 系也一样,F 系也一样。 所以在 6 个系中, 有 4 个系都是女性的录取率高于男性。 这是什么意思呢? 这是辛普森悖论的一个例子, 我喜欢把它当作“剥洋葱皮”练习。 重点在于, 这种偏见在系一级是可以忽略不计的, 而且可能对女性有利。 情况就是,越来越多的女性申请选修性 更强的研究生课程。 有些人到这就停止了分析, 但这并不是令人满意或完整的故事, 因为不止这些。 你可能想问一些问题。 例如,为什么各课程的招收人数不同? 为什么有些课程的录取人数高于其他课程? 为什么不同课程的录取率不同? 当然,为什么男性和女性 申请不同课程的比率不同? 这些是后续问题, 你需要充分探索遇到的现象。 然后还有一些你想了解的其他东西。 每个课程的录取标准是什么? 它们是如何进行推广、宣传或招生的? 申请各个课程的人 都接受过哪些类型的早期教育? 还有一个重要问题, 每个课程的资助标准是多少? 如果你想知道是否存在 性别偏见或者课程内部的运作情况, 需要了解的不只是单独的数字。 还需要把它们放在一个更大的背景下, 了解更多关于这种现象的故事。 那么我们的结论是什么呢? 第一,分析需要故事。 它们需要有一个故事才能为客户提供价值。 第二,明确满足客户的目标 并解决他们的问题。 第三,要有最低限度的充分性。 不要过于简短,说明需要说明的问题, 但要尽量清晰简洁。
可行的见解
在向客户汇报数据科学项目的结果时, 你需要能够提供可行的见解。 我是这样想的, 数据和数据科学是为行动服务的。 这与我崇拜的一位大师所说的话不谋而合, 他说: “我的思想完全且始终是为我的行动服务的。” 这位大师就是美国哲学家 和心理学家威廉·詹姆斯。 我们都不想陷入这样一种境地, 那就是虽然工作很努力, 但既不知道自己在做什么, 也没有任何有用的资源。 这让我想起另一句话“我们迷路了, 但我们在快速前进”, 说这话的是洋基队的捕手尤吉·贝拉。 我想说的是,你需要能够指明方向。 记住,项目的实施是有原因的。 为什么实施这个项目? 项目的目标通常是指导未来的某个行动。 它们是要做出决定,选择一种方式。 你进行的分析应该有意义, 而且包含足够的信息,能够指导这个行动。 你需要能够为客户提供后续步骤, 这是要做的事之一。 告诉他们接下来做什么, 并利用分析的数据来证明你的建议。 另外,尽可能具体化,确保你给出的建议 对客户来说切实可行, 并确保每个建议 都是在另一个建议基础上逐步建立起来的。 这其中有一个重要的复杂问题, 那就是相关性与因果关系。 相关性是指两个变量具有简单关联, 而因果关系是指一个变量 直接引起另一个变量的变化。 但事情是这样的,你有相关性, 所有数据都具有内在相关性, 但客户想要因果关系,因为他们希望知道, 这样做能不能带来这个特定结果。 所以就出现了脱节。随之而来的问题是, 怎么才能从已有的相关性, 变成客户需要的因果关系? 这不是关于选择或认识论的哲学问题, 而是一个实际问题。 它是我们可以给出实际答案的问题。 你可以采取一些方法来获得因果关系。 第一,你可以进行实验性研究, 也就是随机对照试验。 从理论上讲, 这是获得因果关系的最简单方法。 有时在实践中很难做到, 而且在收集数据前还需要完成一些工作。 你还可以进行所谓的准实验研究。 这类方法使用非随机数据或相关数据 进行因果推理。 它们涵盖一系列研究,常用于教育、 经济和流行病学, 但执行起来也可能比较困难。 最后是理论和经验。 我们说的是基于研究的理论 和特定于领域的经验。 可以把它看作一种含蓄的投注计算方式, 人们可以利用自身经验, 采取符合当前情境的方式进行操作。 接下来,想想建议的社会和环境因素。 你可能还记得数据科学文氏图, 它指出数据科学由三种特定实践组成。 也就是编码、统计和数学, 以及专业领域知识, 但是,有人曾提议在图中添加第四个圆圈。
就是有关人与人之间关系 如何发展的社会意识和理解。 关于它们的作用,我来讲几点。 你的建议需要与客户的使命一致。 大多数企业都有使命宣言。 这可以帮助你将建议放在 已经明确定义的情境中。 你还需要确保建议与客户的身份一致。 某些建议看起来符合客户的使命, 也能使成果最大化, 但还是与客户的身份不一致, 比如针对宗教服务收取费用。 你需要注意客户所处的商业环境。 了解相关的公司和政府法规, 这样才能使建议具有竞争优势, 并且符合法律和政策要求。 最后,注意社会环境。 你的建议将对客户公司内部的关系 产生什么影响? 我指的是办公室政治。你可能不了解这个, 但如果可以的话,在提建议时尽量注意一下。 我们总结一下。 你的分析需要符合客户的目标。 你需要根据分析提供具体的后续步骤。 在此期间,你应该注意 实施这些步骤的社会乃至文化环境。
演讲可视化
演示可视化是从事数据科学工作时, 应该培养的另一项技能。 因为文字的信息量比数字大, 而图片的信息量比文字还要大。 使用图形的目标取决于你所处的项目阶段。 在这个课程中,我们先前讲了探索式图形, 这类图形需要速度和互动。 使用这些图形,作为分析师的你 可以快速厘清数据,并了解其中包含的信息。 而演示图形则需要清晰度和密集度, 因为需要用它们来向客户传达结论。 在创建可视化演示时, 你应该考虑现有的优先级。 尽可能使用图形而不是文字, 但要仔细选择包含的内容。 不用展示所有内容, 只需要展示与你述说的故事相关的图形。 从这种意义上讲,要构建一个故事, 确保每一点有序展开,环环相扣、相辅相成。 另外,要采用容易理解的方式。 在图形中加入 3D、交互、多轴等元素 可以呈现酷炫效果,但是却很难看懂。 图形多一些而且简单易懂, 要好过图形又少又难理解。 有些可视化技巧是显而易见的。 标记各个轴,把图形展示的内容标清楚。 显示完整的数据,否则可能无法正确展示 随时间发生的变化或各组之间产生的变化。 避免错误使用三维效果。 这会使数据失真, 并把人们的注意力从信息上移走。 最后,以最有可能符合观看者期望的方式, 对图形中的元素进行直观排序。 我举个例子说明一下错误的做法。 这是我制作的一个关于美国教育程度的图形, 是在 Excel 中做的。 这里集合了我见过的真实错误, 我把它们集中到一张图里了。 这里有很多问题,比如,左边的标度很细, 从 8 到 20,但没有涵盖完整的数据。 教育程度是按字母顺序排列的, 但其实应该按受教育的程度排列。 用来显示数据的锥形树很难看懂, 纹理和颜色也很混乱。 有些圆锥被切断了,甚至根本不存在。 还有,背景图片和颜色容易分散注意力, 而且没有参考线。 总之,非常不和谐,就是一团糟。 比较好的做法是做一个这样的图表。 数据是一样的,区别在于这里的教育程度 是按逻辑顺序排列的, 百分比范围的起点是 0, 而且最大值足够涵盖所有数据。 它更容易理解,信息传达得更清楚、更有效。 饼状图是一种很常见的选择。 这个饼状图中关于教育程度的数据, 与我在 Excel 中使用的默认数据完全相同。 所以它看起来有点奇怪。 饼状图很常用,但也有它的问题, 比如,看看这三张饼状图, 告诉我每张图中的 C 和 D 哪个更大。 这是左边、中间和右边的 C 和 D。 事实上很难判断。但是,如果用条形图 显示完全相同的数据, 那么 C 和 D 哪个更大就很容易判断了。 差别其实很小。 饼状图通常效果不太理想也有这个原因。 它们不容易看懂。条形图则更简单, 容易看懂,而且在传达信息方面更有效。 总的来说,越简单越好, 这和优秀工业设计的理念一样。 来看几个例子。这是我之前展示过的图形。 这是一个条形图,颜色是非常简单的灰色, 橙色参考线让你很容易就能发现要找的内容。 这个图我们之前也看过,置信区间,很干净、 很简单,而且很容易辨别与众不同的元素。 这是我为另一个项目制作的散点图, 图中有一个很好标记的异类点。 在这里,为了清楚地传达一连串的信息, 我没有试图把它们叠加在一起, 而是在矩阵中制作了多个图表。 这是我们在关于贝叶斯定理的部分看过的, 相比在一个图表中 把九条不同的线层叠在一起, 使用多个图表能够更清楚地传达这些信息。 总结一下:第一,就像我在开头说的, 图形的信息量比文字多,而与数字相比, 图形不仅信息量更多,并且更容易使用。 在可视化过程中, 应该力求清晰、紧凑和简单。 另外别忘了,要尝试借助图形构建一个故事, 一个有始有终的完整故事。
可重复性研究
在对数据科学简介课程进行总结之前, 我们要讨论的最后一项内容是可重复性研究。 我喜欢把这看作保留工作的电子记录。 之所以需要具备这项能力,有几个原因。 首先,你可以借助它来检查工作, 并验证结论。 其次,它让你的客户、未来的研究人员、 你自己以及任何会回顾这个项目的人, 能够看到项目进行的过程。 第三,某些政策可能要求这样做。 第四,通过记录相关过程, 可以确保学术诚信。 可重复性研究需要包括以下几项内容。 第一,来源。 你需要纳入未经处理的原始数据。 你需要列出项目的目标和论据以及资源, 资源可以包括软件、硬件, 甚至是进行研究的人员、 资金来源等支持要素。 接下来需要介绍项目过程。 你需要提供分析数据时使用的实际代码。 你需要说明每个步骤中所做的探索。 最好记录实验日记或笔记。 然后是输出。 你需要提供处理后的最终数据集。 你需要提供可供演示的图形, 以及所有书面报告,这样其他人就可以 了解完整的工作内容,从第一步到最终结论。 关于需要多少细节,你可以把它想象成食谱。 需要什么呢?细节要足够让其他人 复制所有分析步骤和所有决策, 并得到相同的最终结果。 此外,细节还要足够让他们遵循你的论据, 以及你经历的决策制定过程。 记录的作用很重要。 你可能需要在实验笔记中记录项目过程。 不一定要用纸质笔记本。 数字形式的记录通常更耐用。 但过程一定要记录下来。 对于生成的所有代码, 都应该加上详尽的注释, 让其他人能明白它的内容、作用和使用理由。 另外,为了能够阐述清楚, 要确保文件和文件夹有适当的名称, 让人一看就能明白它们的内容。 最后,边研究边记录是很好的做法, 这样你以后就不需要再重新回想了。 记录时,你可能还需要记住另外两个原则。 第一是兼容性。 除非必要,尽量避免使用专有格式。 尽可能使用通用格式,比如 CSV 文件、 文本文件、PDF 文档或 Markdown 文档。 第二,做好淘汰的准备。 针对软硬件变更制定应对计划, 做好准备应对网络链接故障、 来源失效和项目工作人员离开等问题。 提供足够多的细节,让相关人员 能够在遇到这类状况时重建工作内容。 总结来说,项目不是独立存在的。 每个数据科学项目都处在一定的情境中, 并且与其他目标和其他项目相关。 要确保提供足够多的资源和过程细节, 让其他人能够根据需要重建你的项目。 最后,要针对变化制定应对计划, 做好准备应对不可避免的情况, 并确保为客户提供耐用且实用的结果。