前言

最近因为课题需要,捡起了很多年前学了但是没怎么应用的机器学习。作为一个经典的算法,逻辑回归目前被作为神经网络诞生前的基础,具有广泛的应用。单层单节点的逻辑回归在“泰坦尼克号生还概率预测”这个问题上表现较为良好(~78%准确度)。本文的在线示例是用大约600条历史上泰坦尼克号上的搭乘者->生还/死亡数据,喂给一个3层的神经网络训练而成。对于以下细节,你或许会感兴趣:

  • 数据集:训练样本627条,测试样本264条
  • 准确度:训练集88%,测试集83%,尚未进行超参数优化(还没来得及做)
  • 模型状况:三层的浅层神经网络,节点数分别为:128(ReLU), 64(ReLU), 1(Sigmoid)
  • 源码:qwezarty/machine-learning-examples

注:在线演示的参数验证并不严格,还请大家手下留情不要用表单工具提交一些奇怪的值(要是把AI玩坏了,她会来找你算账的),另外为了简化输入,我使用下拉选项替代了许多的文本框。好了,现在大家就可以由观看《泰坦尼克号》的经验,有序上船,会不会翻全看造化啦!

在线示例



















这个模型有什么用?

这是一个典型的“疾病与风险控制”示例,想象一下把数据源替换成“良性/恶性肿瘤与各特征的关系”,例如肿瘤的三维尺寸、发病时长、患者的性别/年龄/遗传疾病史等等,如果你有几百条这样的数据,在良好的调优的前提下,你甚至能达到90%以上的准确度(甚至超过了那些经验丰富的医师,所以有言论说是AI的出现会使医生失业,并不是空穴来风)。

此外,Andrew Ng 也分享了他曾经为某家航空公司做风险建模,预测飞机引擎在本次飞行中出现的故障率,用的也是纯粹的神经网络逻辑回归模型,结合关键位置的传感器信息,能够降低空难/减少检修次数等等。

由此可见,在机器学习中数据与模型同样重要。与单层单节点的逻辑回归(代价函数为凸函数,仅有一个最优解)不同的是,神经网络能够随着样本数量的提升不断有效地提高准确度(有很多局部最优解,取决于你的初始值),所以在更多的样本的情况下,模型的准确度也能进一步提高。

P.S. 如果你对“为什么”不感兴趣,那本文到这里就已经结束了。

数据集概况与模型训练

feature distributions

以上四张图分别为训练集中年龄、船费、性别和船票等级的整体数据分布。在拿到一个机器学习任务时,首先把握住数据的整体感觉是十分重要的。图中我们不难看出登船的大部分都是年轻人(20-35),并且男性比女性多了一倍的数量,大部分人的船费仅在0-40刀之间。

% of survive, vs, features

存活率方面,我只绘出了四张图,它们依次是:性别、是否单独一人登船、船票等级和登船的配偶/兄弟姐妹数量。可以看到,女性的存活率比男性高出了四倍,是首要的影响因素(历史上船长爱德华·约翰·史密斯在最后的时刻下命令,先让妇女和儿童上救生艇。电影中的镜头大家也都明白。)此外,一等舱的存活率比三等舱高出了近三倍,可见富裕的资源确实能让你更好地活下来(贫穷人流下了悔恨的泪水。)

关于泰坦尼克号的数据分析,网上其实有很多(数据分析从业者)有兴趣的同学可以进一步看下这篇文章:泰坦尼克号乘客数据分析。看过人工对真实数据的分析以后,你可以再次调戏一下AI,结合两者不难发现AI的准确度还是相当的高。

cost, vs, # of iterations

这是代价函数随着迭代次数的改变,可以明显看到相比于普通的逻辑回归(代价函数为凸函数),浅层的神经网络已经有了持续优化的能力:在10k次迭代以后依然能够持续地提高训练集的准确度(图中表现为能够继续降低代价函数的值)。然而,过多的使用同一个训练集会造成 over-fitting problem 所以我们这里仅仅选取了12k次迭代训练。

accuracy

最后,这是训练完毕以后的准确度,训练集~89%,测试集~83%,符合我们文章一开始提到的的期待值。另外,我们还可以在训练之前对训练集进行清洗,如扩充样本、缺失值处理等等,以及在设计浅层神经网络时进行超参数调优,以进一步提高准确度。(偷懒,这个工作以后看情况补上)

神经网络到底在做什么?

(瞎扯淡预警)

回忆一下高中知识:考虑平面线性拟合问题,比如有10个数据点基本散布在一条直线附近,你的目标是去找到某条平面直线去最大程度上的拟合这些点。那么最容易想到的就是假想现在有某个斜率+截距的直线,计算所有这些点到直线距离的平方和,你要做的就是不断调整斜率+截距,以使得平方和最小(至此已经变成了一个纯数学问题,找二次方程的极值。)

现在,我们把这个问题进行略微修改:考虑三维空间的点,比如有100个点分布在空间中,每个点都有0和1两个取值(binary fields)。你要找到的是某个三维曲面尽量更多地包围住那些取值为1的点。可以想见如果你的自由参数越多(神经网络的层数/节点数),那么你这个曲面能够变化的形状就越奇怪,越能够拟合这些数据点(当然过犹不及,过多的参数也会使得形状过于奇怪,结果使得其对训练集准确度很高,但对没见过的数据例如测试集,就会表现很差,这也是超参数调优所要确定的事)。

实际上在我们的泰坦尼克号问题中,总共有九个特征维度,这些点分布在九维空间里,每个点都有数值(0代表死亡,1代表生还)。那么这些生还的数据点,肯定有某种内在的分布规律(比如集中在某一小块区域附近,潜在原因是现实世界里的内在联系),你的任务就是在九维空间里找到一个曲面,以更大程度上地包围住这些生还者的点。

当我思考到这些的时,确实让我有点震惊:人类在用有限的知识和能力,去理解和感知突破肉体极限的东西。

写在最后

其实近些年来,“神经网络”和“人工智能”已经被资本市场炒烂了,如果你完完整整看完了通篇文章,那么不难看出其实“神经网络”和人类大脑的神经元没有太大关系(现有的科学甚至都没法理解神经元是如何工作的),“人工智能”一点儿也不智能:我们只是在给定的条件下,求解一个数学问题的最优解。