DC送福利——机器学习助你减肥(附源码)

点击上方“DataCastle数据城堡”即可轻松订阅!

来源:知乎机构号“景略集智”

http://zhuanlan.zhihu.com/c_133136111

DC送福利——机器学习助你减肥(附源码)

每逢佳节胖三斤,更不用说有舌尖3助阵的春节假期(虽然...你懂的),刚过完年的你是不是又将减肥列为今年的 KPI ?



减肥对很多人来说都是个沉重的话题:不是我不努力啊,奈何敌人太强大!于是乎,每逢被人问及怎么这么胖,只好优雅的回应:

DC送福利——机器学习助你减肥(附源码)

对于如何健康有效的减肥,广大人民可谓是奇招频出,但是利用代码和机器学习技术实现健康减肥,你听说过吗?



(程序猿攻城狮同学请搬好小板凳)

去年底有个沉寂了快两年的减肥贴在 Reddit 上又火了起来,为什么呢?



原来是2016年时美国程序猿 Ariel Faigon 在 GitHub上写了篇贴子,详细记述了他借助代码和机器学习技术帮自己减肥的励志贴(代码库见文末)



从 2015 年 3 月开始减肥,到 2016 年 7 月,Ariel Faigon 用这种方法将自己的体重从巅峰时的 194磅(176 斤)减到了 174 磅(157 斤),减了将近 20 斤。

DC送福利——机器学习助你减肥(附源码)

虽然体重下降速度算不上快,但考虑到他的基数,这次减肥绝对称得上健康有效。



我们来看看他到底怎么操作的。

沉重的故事背景

我(主人公 Ariel Faigon ——译者注)以前其实是个很瘦的人,我刚到美国拿到第一张“绿卡”的时候,才143磅重(129斤),当时照片如下,现在的照片么..还是别晒了。

DC送福利——机器学习助你减肥(附源码)

蛋疼的是,自从我正式定居美国后,越来越胖,止不住的胖···终于在 2015 年的时候,我赫然发现,比刚来美国时,我重了 50 磅(45 斤)!



这让我在相当长一段时间内都觉得肥胖症在美国好像会传染一样,而且我观察发现,好像过的越苦逼的人,越容易成为胖子...

DC送福利——机器学习助你减肥(附源码)

那么美国的生活方式和这种传染式(存疑)的肥胖症有关系吗?我研究了一下,总结了几个猜想:

⊙快餐随处可见,而且非常便宜



我们买的和吃的东西大多数都被重度加工过

很多食物都添加了大量的糖分,含糖量很高

可想而知,这么吃下去,不胖才怪。当然了也有很多人不止一次表示自己就算只吃一点也会胖。

DC送福利——机器学习助你减肥(附源码)
DC送福利——机器学习助你减肥(附源码)
DC送福利——机器学习助你减肥(附源码)
DC送福利——机器学习助你减肥(附源码)
新减肥路上的摇滚

在刚开始减肥时,我听从了不少建议,多次改变饮食结构。期间我读了减肥专家阿特金斯博士的书,他认为体重增加的主要原因是摄入了过量的碳水化合物,我反复想了想,觉得他说得对。但是只知道这一点,并不会让我成功减肥。

我这人很爱吃披萨和面包,后来尝试减少摄入碳水化合物,也确实减了几磅,但中间一犯馋,又开始吃这些东西,结果减的体重又回来了。然后周而复始,就这么来回拉扯了几个月。

DC送福利——机器学习助你减肥(附源码)

很显然,想通过减少摄取碳水化合物减肥,方法必须还要再完善,我得找到它。当然,我也可以增加活动量,比如先每天跑它个十几圈。但我工作比较忙,程序员嘛,也都不太爱运动。

于是我意识到,我需要一种合适又恰当的生活方式,不仅仅是减少摄取碳水化合物或者增加运动量,而且应该能够可持续操作,甚至还比较舒坦,这样就能成为一种无痛的例行公事了,就像这样:

我能这样减肥持续好几年



饮食习惯也不需要忽然改变

对于我来说,不是很难,也不会太难受

DC送福利——机器学习助你减肥(附源码)
早期探索&恍然大悟

那会儿正好机器学习技术开始火热,我发现可以用机器学习技术识别出让我体重增加和体重减轻的各自因素有哪些。



方法也很简单:每天早晨我都称一下体重,记录下来体重数据以及过去24小时的主要活动,不光是吃了什么,还有运动状况,睡眠时间等等。

最终文件也比较简单,就是个有 3 列数据的 CSV 文件:



日期,早晨体重,昨天生活方式/饮食/活动

(Date, MorningWeight, Yesterday"s lifestyle/food/actions)



最后还有一列,是个任意长度的术语列表 word[:weight],其中:后面的数值表示增加和减少的体重,默认单位为1:

DC送福利——机器学习助你减肥(附源码)

然后我写了个脚本

http://github.com/arielf/weight-loss/blob/master/lifestyle-csv2vw

将这个文件转化为 Vowpal Wabbit 训练集回归格式。转化后的训练集中,标签(目标特征)是过去 24 小时的体重变化(增量),输入特征是过去 24 小时我做了什么导致了体重变化,其实就是第 3 列数据的翻版。

当时我并没有刻意节食,就是收集数据。

机器学习技术在处理数据、放大数据中的微弱信号以及遍历数据 4 次后进行了误差收敛处理,得到了如下图表:

DC送福利——机器学习助你减肥(附源码)

你可以通过替换为你自己的数据文件、安装所有的需求软件后,在目录中运行 make,复制我的这个工作过程。我写了个怎么做的详细指令,点击查看:

http://github.com/arielf/weight-loss/blob/master/HOWTO.md

当你点击 make 运行后,会发生一些奇妙的事情,正常情况下会出现如下结果:

DC送福利——机器学习助你减肥(附源码)

正相关分值(上半部分数据)是导致你体重增加的生活方式,负相关分值(下半部分数据)是让你体重减轻的生活方式。

下图是将这些数据转换为更直观更详细的图表:

DC送福利——机器学习助你减肥(附源码)

关于数据这一块,我需要提醒大家不要过度纠结。其实收集数据的过程是相当有挑战性的,在这里也说几点:

我一开始收集的数据还是有点少(大约 100 天的数据),不够具有代表性。

每天体重变化通常很小,常常是 0.1 磅左右。

我采取的数值比例不是很准确:你可以发现我的数据间隔为 0.2 磅,这个不理想,建议为 0.1 磅。

让你体重增加或减少的因素有时会出现在同一行,它们会相互抵消,这会造成机器学习过程偏离方向。

所以我重点关注了上面列表中的开头和结尾部分,只将数据显示的状况用作进一步研究、试验和行动的总体指导。

虽然我的数据不是很充足,也存在很多噪声,权重也不是很准确,但机器学习还是很清晰的展示了 4 个因素:

1.持续的充足睡眠是体重减轻的首要因素。

2.缺乏睡眠会起到反作用:睡眠太少会导致体重增加。

3.碳水化合物导致我体重增加,罪魁祸首就是高淀粉和含糖食物。

4.油脂食品有相反趋势:它们和体重减轻呈正相关关系。

中间也出现了干扰因素,那就是周末。我在周末一般都宅在家里,不用工作,因此睡得时间也很长。而且,我周末的饮食状况和平时也略有不同。

我花了很久才发现了睡眠部分的影响因素:我们睡觉的时候不吃东西...

DC送福利——机器学习助你减肥(附源码)

而且,我们常常即便不是很饿,也总是会出现吃点东西的念头,但在睡觉的时候不会。

也就是说,我们的睡眠时间是一天中最长的禁食时间。

当然我这么想可能不是很科学,但我们这么做的总目标就是不断的发现和摸索:试验、检查效果、筛选方法、再试验

进一步研究

你或许注意到上面的图表(日期 VS 体重)中,对于体重减轻有几个明显的促进因素。因为随着我了解的越多、维持饮食习惯的能力越来越好,我对减肥问题的认识也越来越深。

延长禁食时间是促进体重减轻的一个主要因素。我当时每天尽量晚些吃晚饭,这样就不会导致睡前太饿而又加餐。这样我将每天的禁食时间延长到了 14-16 个小时,比平时多了近 4 个小时。



第二个促进体重下降的因素的吃了很多油脂食物,目的是为了增加饱腹感,从而大幅减少碳水化合物的摄入。



第三个促进体重减轻的因素是我开始理解血糖指数和血糖负荷的概念,并转向食用产生低血糖负荷的食物。

随着体重下降,我的血糖水平也逐渐回归正常。我现在只希望能保持下去,一直减到我刚到美国时的体重。如果保持当前的减肥速度,大概还需要 1-2 年。

调整饮食结构和生活习惯

通过用机器学习技术分析我的生活数据,我知道了吃哪些食物以及哪些生活习惯会导致我体重增加或减少。这样就好办了,于是我开始有针对性的调整饮食结构和生活习惯:

减少摄入碳水化合物:这部分最难,因为我很喜欢吃一些高淀粉高含糖量的食物,比如(披萨、意大利面、甜面包等等)。不过这也不代表一点碳水化合物都不要,可以偶尔摄入一点,比如一周吃一顿披萨。总之我开始确保大幅减少摄入碳水化合物,也避免薯条、甜甜圈这些零食。



紧盯血糖指数和血糖负荷:避免有高血糖负荷的食物,这样就防止血糖飙升,身体的化学循环紊乱。喜欢吃甜食?那就尽量吃水果,代替喝果汁。水果和果汁的血糖负荷有着很大的差别,那么对体重的影响也就大不相同。于是开始用口感类似但血糖负荷更低的食物来取代血糖负荷高的食物。

增加高脂肪食物:我前面说过,吃油脂食物可以增加饱腹感,进而抑制碳水化合物的摄入。其实我从来不担心自然脂肪,还是该怎么吃就怎么吃。我开始增加此类食物的分量,比如橄榄油、牛油果、蛋黄酱、椰子油、坚果等等。我越是感到不饿,就越不会“思念”碳水化合物。你应该也听说过“好”脂肪和“坏”脂肪的说法,我觉得只要是自然脂肪,就没事。

增加少许锻炼:当然锻炼越多越好,但很多上班族恐怕很难做到。我每天最多的活动量就是骑自行车去上班,来回40分钟,其余时间都比较忙。因此我还是更指望通过调整饮食来实现减肥目标。

增加禁食时间:根据我的数据分析,这是促使我体重下降的主要因素。于是我开始尽量延长禁食时间,比如增加睡眠时间。

吃鸡蛋:鸡蛋富含蛋白质却有很少的碳水化合物。我开始在摄入食物中增加鸡蛋的分量。

吃的慢点,细嚼慢咽:不能再一口吞了!不要等到感到饱了才停止吃东西,人类的大脑感受到饱腹会有20分钟的延迟,因此我得节制一点,不能吃的过多。

减肥后话

上面大致就是过去 16个 月我依靠技术和数据进行减肥的大致过程,取得了减肥近 20 斤的成绩。

DC送福利——机器学习助你减肥(附源码)

作者体重趋势下降图

其实也比较简单,就是先收集自己的生活

数据,用机器学习处理和分析数据,然后根据分析结果对症下药,调整饮食结构和生活习惯。



我之前也看过不少减肥专家的建议,但后来并不理想,因为每个人的身体状况和生活习惯是不同的,还是得根据自己的情况从实际出发。



所以,请不要将我上面的方法视为标准教程和科学研究,这只是我自己减肥的一个方法,如果你也想尝试一下,请务必根据自己的生活数据。

附本项目 GitHub 代码库和数据:

http://github.com/arielf/weight-loss/

参考资料:

http://github.com/arielf/weight-loss?utm_campaign=News&utm_medium=Community&utm_source=DataCamp.com