631
技術社區[雲棲]
一位缺覺的父親記錄了他雙胞胎寶寶的睡眠數據 並交給機器學習,結果……
◆ ◆ ◆
導讀
初為人父人母,最大的體會必須是:缺覺!喂奶換尿布,孩子一夜醒來好幾次,沒把小寶寶哄睡,卻把自己哄睡了,那時候你的內心一定是崩潰的。
國外一個缺覺的父親實在受夠了他的雙胞胎寶寶,聯合他的妻子,統計了兩個娃的睡眠及喂養時間數據等,用機器學習分析預測,總結並掌握兩個孩子的作息規律,科學的育兒方法讓他們伺候好孩子的同時,又將孩子對自己的睡眠影響降到最低,真是太機智了。技術咖拯救睡眠啊!
接下來就讓我們看看這對夫妻是如何收集數據、並利用機器學習分析數據的,或許年輕的我們可以學一手。
這樣看來機器學習和數據決策其實並沒有那麼高高在上,可能也可以幫我們解決一些生活中的有趣問題。
◆ ◆ ◆
前言
一個月前,我試著用A / B測試我們那對雙胞胎,看看怎樣不同的“治療”或輸入參數會造成較久的睡眠,當然這由我們自己來完成。我發現睡眠模式相當不穩定,並沒有找到促進睡眠相關的東西。隨著時間的推移,他們更大程度上傾向於自然醒。然而,現在他們已經四個月大了,他們已經開始普遍但是很少討論的睡眠顛倒(Sleep Regression)。我又一次發現自己渴望獲得更多的睡眠。我先前投的文章中確實有一個評論說,“無論多麼渴望睡更多,我都會努力去找,我能找到對於睡眠有用的東西嗎”?嘿嘿,我找到了。從此,我轉而關注另一項計算機科技:機器學習。
機器學習是一個計算機科學的領域,提供 “教”計算機或程序的方式,而不需要給他們一些分散的指令集。在正常編程中,我會讓計算機按順序執行一列命令,按邏輯基於輸入的方法來做決策,不過這些程序永遠都不會離開已定義好的軌跡。盡管這聽起來比它實際上運行的方式更像終結者(Terminator),但是機器學習可以接受人拿給的用於“學習”的數據,以此作為預測的基礎。雖然這在整個科技行業變得越來越流行,而AI主要被用於瀏覽購買行為和推薦,也許最有趣的是,分類和識別照片和畫作,這大多是穀歌在做。我沒有找到什麼例子用於做家長帶小孩。
多虧我的妻子是會計背景,還有我們的A型人格,我們詳細記錄了兩個男孩的進食和睡眠行為。還記得這個表格嗎?
◆ ◆ ◆
“大數據”,毫不誇張的講
使用這些數據,我開始尋找輸入參數的最優組合,在這個例子中,我關注食物總消耗、最後喂食時間和最後喂量,來決定什麼情況會導致男孩的最久時間睡眠。最重要的是我可以讓計算機做艱苦的工作。另外,我們這組模式有兩倍的數據,因為很明顯我們有兩個男孩。
有幾個可用的巨大機器學習庫,他們跨編程語言。雖然我主要使用Java和Javascript工作,我選擇了Python庫sklearn,因為我熟悉Python以及這個靈活的腳本語言可以說是近乎完美的應用。有許多對這個庫和文檔極好的教程。
如果感興趣,你可以在github上找到我的代碼。
把我們從電子表格收集的數據導出來,我提取了過去一個月的數據點。因為嬰兒正經曆快速的成長發育變化,我覺得一個月的數據乘以2個嬰兒,是一種對近因效應較好的平衡,而且數據足夠用於做預測了。
◆ ◆ ◆
放在一起進行編碼
我也得到了一些有趣的統計值,包括:平均每天我們喂食兩男孩(各)27.5盎司,通常讓他們在睡覺在7:25睡覺,睡前喂他們5.22盎司,它們平均睡9個小時。結果發現男孩75%的情況睡超過10小時。不賴的發現。但我知道我們還有一些工作可以改進。
總喂食 |
最後喂食時間 |
最後喂食量 |
睡眠時間(小時) |
|
次數 |
62 |
62 |
62 |
62 |
均值 |
27.491935 |
7.455645 |
5.225806 |
9.084677 |
標準差 |
2.001008 |
0.331181 |
0.857357 |
1.726092 |
最小值 |
24.000000 |
6.750000 |
2.000000 |
3.500000 |
25% |
26.000000 |
7.250000 |
5.000000 |
8.000000 |
50% |
27.000000 |
7.375000 |
5.000000 |
9.000000 |
75% |
29.000000 |
7.687500 |
6.000000 |
10.187500 |
最大值 |
32.000000 |
8.500000 |
7.000000 |
13.500000 |
采用這些數據,我能夠畫出對於睡眠時間的每個參數。
你可以看出數據間已經沒有很強的相關性,至少多數不存在線性關係。最具線性特征的關係,還有很多離群點的,要屬總進食量和睡眠小時之間的關係了。奇怪的是嬰兒吃得多反而睡得少了。
有許多不同類型的機器學習算法。這些主要分為線性和非線性兩種類型。我用了六種使用相當廣泛的算法運行這組數據,看看每個能到的準確程度。以下是結果。
Logistic Regression: 0.303333 (0.211056) |
Linear Discriminant Analysis: 0.376667 (0.157797) |
K Neighbors Classifier: 0.286667 (0.073333) |
Decision Tree Classifier: 0.356667 (0.196667) |
GaussianNB: 0.183333 (0.076376) |
Support Vector Machine: 0.410000 (0.200028) |
注:每種算法的準確程度,括號中的為標準差,或者采用一個形象的圖表
在這裏你可以看到,支持向量機算法在這些數據上完成的明顯最好,雖然變化範圍較寬,均值並不比其他的算法強很多。這些方法用於預測甚至沒有一個超過50%的(均值)。這完全是由於數據的偽隨機性質。即使有這樣的結果,我決定繼續嚐試,希望能深入有更多新奇的發現。
采用支持向量機,我用輸入的數據訓練算法。用了這個,當我們哄孩子們上床,基於一天的食物量,以及睡前前最後一餐的量,我現在就可以預測出他們能睡多久。例如,給他們28盎司,哄他們7點上床,最後一餐喂6盎司,將造成一個比較差的8小時的睡眠。
◆ ◆ ◆
結論
用目前訓練出的算法,某種程度上,我可以預測將會得到多久的睡眠。更重要的是,我可以從箱型圖(Box Plot)中,6種流行的算法性能趨線,看出他們的表現。並且試著優化,明白怎樣類型的行為可以造成更久的睡眠。一種反常規的現象是,早些躺下,吃更少的食物,實際上一整天的睡眠時間卻增加了。這可能是由於很多因素導致的,但我的理論是,吃得少那補充的就少,胃收縮的也就減少,因此睡眠也就更安穩。有多少次你是狼吞虎咽,然後奇怪的是在半夜餓醒了?
很不幸,正如用A/B測試一樣,沒有一種個體輸入對睡眠似乎是直接的。我想如果真的有人已經發現了,能掙數百萬。綜上所述,機器學習可以找到變量之間一些像這些的趨勢和關聯,從而得到比A/B測驗或者“試誤法”(trial and error)更好、更準確的結果,仍然結果還差得很遠呢。從這組數據集,最多可以得到41%的預測準確率。這意味著結果往往是錯誤的。由於頻繁的發育變化,還有男孩之間的差異,很難在他們之間應用數據。再次申明,樣本量大一點是有幫助的,但我們不打算很快要三胞胎。
盡管如此,這些結果總比沒有好,幫助論證了機器學習和數據科學領域的許諾。比起依據直覺,我更喜歡靠數據來決策,和這些證實我猜測的數據,隻會讓我對我們的育兒方法感覺更好。
原文發布時間為:2016-11-04
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號
最後更新:2017-06-01 12:32:12