神奇了,我用机器学习减了 20 斤肥肉!

2019年4月11日 375点热度 0人点赞 0条评论

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

图片


对于如何健康有效的减肥,广大人民可谓是奇招频出,但是利用代码和机器学习技术实现健康减肥,你听说过吗?(程序猿攻城狮同学请搬好小板凳)

去年底有个沉寂了快两年的减肥贴在 Reddit 上又火了起来,什么呢?原来是2016年时美国程序猿 Ariel Faigon 在 GitHub上写了篇贴子,详细记述了他借助代码和机器学习技术帮自己减肥的励志贴(代码库见文末)。从 2015 年 3 月开始减肥,到 2016 年 7 月,Ariel Faigon 用这种方法将自己的体重从巅峰时的 194磅(176 斤)减到了 174 磅(157 斤),减了将近 20 斤。

图片


虽然体重下降速度算不上快,但考虑到他的基数,这次减肥绝对称得上健康有效。我们来看看他到底怎么操作的。


1

沉重的故事背景


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

图片

蛋疼的是,自从我正式定居美国后,越来越胖,止不住的胖···终于在 2015 年的时候,我赫然发现,比刚来美国时,我重了 50 磅(45 斤)!这让我在相当长一段时间内都觉得肥胖症在美国好像会传染一样,而且我观察发现,好像过的越苦逼的人,越容易成为胖子...

图片

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

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

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

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


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

图片
图片
图片
图片

2

新减肥路上的摇滚


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


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

图片

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

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

  • 我能这样减肥持续好几年

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

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


3

早期探索&恍然大悟


那会儿正好机器学习技术开始火热,我发现可以用机器学习技术识别出让我体重增加和体重减轻的各自因素有哪些。方法也很简单:每天早晨我都称一下体重,记录下来体重数据以及过去24小时的主要活动,不光是吃了什么,还有运动状况,睡眠时间等等。

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

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

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

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

#
# -- Comment lines (ignored)
#
Date,MorningWeight,YesterdayFactors
2012-06-10,185.0,
2012-06-11,182.6,salad sleep bacon cheese tea halfnhalf icecream
2012-06-12,181.0,sleep egg
2012-06-13,183.6,mottsfruitsnack:2 pizza:0.5 bread:0.5 date:3 dietsnapple splenda milk nosleep
2012-06-14,183.6,coffeecandy:2 egg mayo cheese:2 rice meat bread:0.5 peanut:0.4
2012-06-15,183.4,meat sugarlesscandy salad cherry:4 bread:0 dietsnapple:0.5 egg mayo oliveoil
2012-06-16,183.6,caprise bread grape:0.2 pasadena sugaryogurt dietsnapple:0.5 peanut:0.4 hotdog
2012-06-17,182.6,grape meat pistachio:5 peanut:5 cheese sorbet:5 orangejuice:2
# and so on ...


然后我写了个脚本

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

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

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

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

图片

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

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

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

$ make

... (output trimmed for brevity) ...

FeatureName       HashVal   ...   Weight RelScore
nosleep            143407   ...  +0.6654 90.29%
melon              234655   ...  +0.4636 62.91%
sugarlemonade      203375   ...  +0.3975 53.94%
trailmix           174671   ...  +0.3362 45.63%
bread              135055   ...  +0.3345 45.40%
caramelizedwalnut  148079   ...  +0.3316 44.99%
bun                  1791   ...  +0.3094 41.98%

... (trimmed for brevity. Caveat: data is too noisy anyway) ...

stayhome           148879   ...  -0.2690 -36.50%
bacon               64431   ...  -0.2998 -40.69%
egg                197743   ...  -0.3221 -43.70%
parmesan             3119   ...  -0.3385 -45.94%
oliveoil           156831   ...  -0.3754 -50.95%
halfnhalf          171855   ...  -0.4673 -63.41%
sleep              127071   ...  -0.7369 -100.00%


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

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

图片

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

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

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


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


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


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

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

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

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

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

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


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

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

图片

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

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

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


4

进一步研究


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


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


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


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


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


5

调整饮食结构和生活习惯

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

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

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

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

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

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

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

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


6

减肥后话

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

图片
作者的体重下降趋势图

其实也比较简单,就是先收集自己的生活数据,用机器学习处理和分析数据,然后根据分析结果对症下药,调整饮食结构和生活习惯。我之前也看过不少减肥专家的建议,但后来并不理想,因为每个人的身体状况和生活习惯是不同的,还是得根据自己的情况从实际出发。所以,请不要将我上面的方法视为标准教程和科学研究,这只是我自己减肥的一个方法,如果你也想尝试一下,请务必根据自己的生活数据。

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

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

本文经授权转载自公众号“景略集智”,转载请联系原账号。

题图来源:图虫创意

参考资料:
https://github.com/arielf/weight-loss?utm_campaign=News&utm_medium=Community&utm_source=DataCamp.com

微信公众号全新改版

如果你还想找到“我是科学家”

请尽快将【我是科学家iScientist】设置为“星标”

图片欢迎个人转发到朋友圈图片图片

图片

看完不点“在看”,你不胖谁胖

【拓展阅读】七天假期只收获了体重?为了帮你们减肥,科学家们真是操碎了心……

41230神奇了,我用机器学习减了 20 斤肥肉!

这个人很懒,什么都没留下

文章评论