## 《人工不智能》2:教你写一个人工智能程序

咱们继续说布鲁萨德的《人工不智能》这本书。我们想通过这本书消除你对人工智能技术的恐惧感，为此，咱们今天要一起写一个真正的人工智能程序。

注意我们可不是打比方闹着玩，我们要用真实的数据和真实的算法，做一个真实的人工智能项目。这个项目还很有意思 —— 我们要用人工智能，预测，泰坦尼克号邮轮上每一位乘客的生死。

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212234150855992807.jpg)

像电视剧《西部世界》里那样的真人一样的人工智能，叫做“广义人工智能”，这种技术在可以预见的未来都不存在。现在大家用的都是“狭义人工智能”，而狭义人工智能的本质就是人们常说的“机器学习”。

而所谓“机器学习”，也不是说机器有思想，它学会了一项技能。机器学习就是用一组数据建立一个统计模型，这个统计模型能对新的数据做出预言。输入数据越多越精确，模型能做的预言就越准确，就好像是它在不断地“学习”一样。

数学家管这叫“统计模型”，计算机科学家给起了个更值钱的名字叫“机器学习（Machine Learning，经常性感地缩写为“ML”）”，记者有时候管这叫“大数据”，而其实这就是现在科技大佬们在发布会上口口声声说的“人工智能”。

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212235270037423668.jpg)

布鲁萨德在这本书中用的例子是用机器学习的方法判断泰坦尼克号上哪些乘客会存活，哪些乘客会遇难。这个例子不是她原创的，Kaggle 网站上有现成的教程 [1]，包括所有代码。你可以在自己的计算机上重复整个过程，你可能需要安装 Python 语言和几个库函数包，但你总共只要写几十行的代码，把整个项目研究明白大概需要一个晚上的时间。

我来帮你解说一下思路和步骤。如果你懂编程，你会发现这件事非常简单；如果你不懂编程，我也能帮你理解这个思路。考虑到机器学习是美国现在最值钱的技能 —— 高手一年能挣四五十万美元 —— 也许今天这个例子就开启了你机器学习的工作之路！

那你说我一点基础都没有，怎么能一下子就写一个机器学习程序呢？答案当然是因为你站在了巨人的肩膀上。现在机器学习的算法已经非常成熟，连专业人士都不需要自己从头到尾写一个算法，网上都有现成的。常用的机器学习算法大概有十几个，都做成了 Python 的库函数，我们可以直接调用。

顺便说一句，如果你想严肃地自学机器学习，Kaggle 和 DataCamp 是两个非常好的教学和比赛网站。

泰坦尼克号的所有旅客名单和他们的各项统计资料，网上都有现成的数据，我们将直接调用这些数据。

我们将使用 Python 编程语言。我在专栏第一季说过，如果你想学编程，Python 是最直观最漂亮最简单的编程语言。

泰坦尼克乘客的数据已经被人放在了亚马逊的云服务器上，可以随便下载 ——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212236523180696793.jpg)

数据已经被分成了两个文件。第一个文件叫 train，我们要用这个文件里的数据来训练一个统计模型，然后再用第二个文件，叫 test，检验这个模型的有效性。

以下所有操作都是针对 train 文件的。你要是看不懂代码就直接忽略，只听文字讲解就可以。打开训练数据，你会发现它是一个12位的数组，对每个乘客都包含以下这些项目 ——

* 乘客编号

* 乘客是否存活

* 乘客姓名

* 舱位是头等舱、二等舱还是三等舱

* 乘客的性别

* 年龄

* 在泰坦尼克号上有没有兄弟姐妹或者配偶

* 在泰坦尼克号上有没有父母或者子女

* 乘客的船票号码

* 买的船票价格

* 在船上住的房间编号

* 在英国哪个口岸上的船。

训练数据库中一共包含891个人，但是其中只有714个人的年龄记录。使用 Python，我们只要用一些简单的命令就可以对数据做各种操作。比如我们想知道各个舱位都有多少乘客，可以用 ——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212237557123047154.jpg)

结果发现头等舱有216名乘客，二等舱有184名，三等舱有491人。再用 ——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212238403983314484.jpg)

就知道这819名乘客中有549人遇难，342人幸存，遇难率是61.6%。

其实现在你就可以做一次预言了。随便指定一位乘客，让你预测他是遇难还是存活，你应该预测他遇难 —— 这个预测的准确率高达61.6%。

现在我们要让这个预测更准确。我们看电影知道上救生艇是女士和孩子优先，那么性别对于存活的影响应该很大。简单做个统计操作 ——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212239349814152010.jpg)

就知道男女各自的存活和遇难人数。女性的存活率是74%，男性的存活率只有18%。这就是一个更准确的预测。

要想进一步提高准确度，我们就要上机器学习算法了。布鲁萨德选取的算法叫“决策树（Decision Tree）”，你现在不需要知道它的细节，直接调用就可以，调用方法是一行代码——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212240301277785937.jpg)

下面的思路非常简单。刚才我们说了，乘客的性别对存活与否影响很大。那为了更精确地预测，你能不能想想，还有哪些因素对存活可能有比较重要的影响。我们要做的就是把所有这些因素都交给“决策树”算法，让算法自动用这些因素的数据生成一个模型。

比如像姓名和编号这些数据，你能想到肯定没啥用。我们选取四项指标：

* 舱位，据说头等舱有上救生艇优先权；

* 性别，女士优先；

* 年龄，小孩优先；

* 船票费用

其实每一项因素具体起到什么作用你都不用管，你只要能猜测出来大概这几个因素有用就行了，一切都交给算法自动发现。

现在有个问题是算法要求每个数据都得有数值，可是“年龄”这一项只有714个人的数据。为此我们还得把剩下一百多个人的年龄数据给补上，就用所有乘客年龄的中位数来代替。这种事情在实际操作中非常常见，对付对付先用上再说。

好，现在生成模型，也是整个机器学习的核心部分，只要以下这么短短几行代码 ——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212241293426019873.jpg)

基本上就是你告诉程序要预测的目标是乘客是否存活，影响目标的四个因素是舱位、性别、年龄和船票价格，你选取的机器学习模型是“决策树”。

最后生成的这个“my_tree_one”，就是预测模型。大功告成！

我们先看看这个模型的性质 ——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212243018037821305.jpg)

结果显示四项指标在统计上的重要程度分别是：船票花费占33.7%，性别占31.3%，年龄占23%，舱位占12.3%。注意这只是一个综合的统计性质，模型内部非常复杂，并不是对这几个数据做什么加权平均。反正我们现在知道，船票花费是个比性别更重要的存活因素。

好，现在看看这个模型的预测准确度。利用现有的训练数据，做一次操作——

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212243554125502066.jpg)

模型的预测准确率高达97%。这是一个非常好的成绩，但是可以理解，因为毕竟你的模型就是用这组数据训练出来的。

对模型的真正考验是使用刚才说的那个“测试”数据。测试数据里只有11项指标，不包含存活信息。我们要把这个 test 数据拿过来，用刚才训练好的模型直接预测这些我们完全没接触过的乘客的存活情况！DataCamp 网站会帮你评分，具体的步骤我就不写了，直接告诉你结果。结果是，我们这个模型用于测试数据的准确度仍然高达97%！

你想想吧。我们只知道泰坦尼克号上一半旅客的存活信息，我们根据这些信息做了一个预测模型，然后就能用这个模型，以97%的准确度，预测另一半旅客中每个人是否活了下来！

回顾一遍，整个步骤是这样的 ——

1. 把所有数据分成两组，一组用于训练，一组用于检验；

2. 数据都是数组，其中包括你想要预测的目标信息（是否存活），以及可能影响这个目标的各种信息；

3. 选择几个你认为最有可能影响目标的信息（舱位、性别、年龄、票价）；

4. 选择一个机器学习算法（“决策树”）；

5. 把目标和可能影响目标的几个信息作为数组变量输入算法，训练得到一个预测模型；

6. 把预测模型用于检验数据，看看这个模型的准确度。

现在你已经完成了一次人工智能编程。

学会了这个方法，使用现成的工具，只要有足够好的数据，你立即就可以搞几个人工智能应用。比如一个信用卡公司有十万个用户的详细数据，包括年龄、收入、以往的购买记录、信用得分、还款记录等等，那你就可以预测其中每一个人下个月按时还款的可能性。

不过我们今天的主要目的还是体会现在所谓的“人工智能”到底是怎么回事儿。它仅仅一个统计模型而已。从这个实操例子中我们可以得出两个洞见。

第一个洞见是，每个模型都会带来歧视。

泰坦尼克模型中对生死影响最重要的变量是船票价格。船票越贵，你存活的可能性就越高。那假设你是一个卖保险的，现在既然你知道买了高价票的人存活率高，将来他们不太可能找你理赔，那你为了多卖几分保险，是不是可以少收一点他们的保险费？

这就是区别定价，这就是价格歧视。你并不是歧视穷人也不是更爱富人，只不过为了多赚点钱，你就会多收穷人的保险费，少收富人的保险费，你完全是理性的 —— 可是，请问这合理吗？这道德吗？

第二个洞见是人工智能真的不智能。

说白了我们今天做的就是四项指标去预测一项指标而已。你完全可以想到还有很多别的因素对在泰坦尼克号上存活很重要，但是我们根本没考虑。

比如说，当时放救生艇的时候，船长的命令是“让女人和孩子上救生艇”，但是两侧放救生艇的人对命令的理解不一样。一个人的理解是*优先*让妇女儿童上，如果周围的妇女儿童都上了救生艇还有空位，那就让男的也上。另外一个人的理解则是*只*让妇女儿童上救生艇，妇女儿童上完哪怕还有空位，也不让男性上，就直接把救生艇放下去。

那如此说来，一个男人能不能存活，跟他当时距离哪个救生艇近很有关系！但是我们根本就没有这项数据。

还有，在船即将沉没的一刹那还站在船头的人，如果你选择往远处猛跳，你就有可能存活下来；如果你不跳，沉船造成的旋涡就会你拖下水，你就很可能遇难。所以最后一刻的跳法也决定了生死，但是这个跳法也没有包括在模型里面。

模型对泰坦尼克上发生了什么一无所知，它根本不理解自己在干什么，本质上它的一切预测都是猜的 —— 所谓机器学习，只不过是增加它猜对的概率而已。

但是我们居然就做到了97%的准确率。人工智能界对此有个专门的形容词，叫“unreasonably effective”，不合理地准确。如此粗糙的模型，它居然就能做到这么准确！

你可能对此非常感慨！但是当你的手机准确识别了你的语音的时候，当 AlphaGo 赢了柯洁的时候，你也有过这样的感慨。它们的算法更复杂，但是本质原理都是一样的。

破除迷信战胜恐惧最好的办法就是亲自做一遍，现在你至少知道你可以做到。

现有的人工智能就是用统计方法增加猜测的准确度。人工智能就是机器学习。机器学习就是统计模型。“人工智能”应该叫“人工不智能”。

### 💡 精华要点
- 人工智能界有个专门的形容词，叫“unreasonably effective”，不合理地准确。现有的人工智能就是用统计方法增加猜测的准确度。人工智能就是机器学习。机器学习就是统计模型。“人工智能”应该叫“人工不智能”。

![图片](https://piccdn3.umiwi.com/img/201805/21/201805212245106860871919.jpg)
