判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

大資料文摘發表於2019-03-07

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

大資料文摘投稿作品

作者:blmoistawinde

年前,文摘菌曾經扒下了全網所有“年夜飯”菜譜,找到了最有年味的一道菜的一文,對於菜譜資料分析產生了濃厚的興趣,遂自己也寫了個爬蟲爬取了某美食網站的一些精選菜譜和食材資訊。

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

當看到這些美味佳餚的資料來源源不斷入庫時,我旺盛的好奇心一下子被激發了起來:

  • 世界菜系琳琅滿目,能不能從資料中挖掘出它們的特色?

  • 能不能從大資料中得到大家對美食口味的特別偏好?

  • 若是我自己找到甚至做了一道菜,能不能自動判斷它的菜系,甚至給它打分?

我相信豐富的資料探勘和機器學習方法將能夠滿足我的好奇心,現在就動手進行探索吧。

菜系特色

我認為菜系的特色食材應該是一個菜系能夠用來區別於其他菜系的特殊食材。

我想到,機器學習中的分類方法正好可以幫助我們挖掘出這些區分性的特徵!

川菜可能是中國最為人津津樂道的菜系之一了,於是我把每道菜的食材當成特徵,先訓練了一個區分是否川菜的邏輯迴歸模型,模型的引數就能夠揭示川菜的特色了,讓我們看看:

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

上半部分是川菜的特色食材,大名鼎鼎的郫縣豆瓣位列榜首想必是眾望所歸。而看著後面的那些食材,草魚、剁椒、雞爪、花椒…水煮魚、泡椒鳳爪這些菜餚的辛香是不是已經飄入鼻腔了呢?

下半部分則是川菜相對於其他菜系來說不喜使用的食材(排斥食材)。番茄醬、冰糖、蜂蜜等甜味食材榜上有名,是因為習慣了重辣,清甜已經不如法眼了嗎?另外,作為上海人的筆者還注意到,自己身邊十分普遍的雞蛋在川菜中似乎並不常用,莫不是蜀道難,難於養母雞?看來這些資料中確實有頗多內涵,值得我們細細探究哈。

用同樣的方法,我得到了22種菜系的特色食材和排斥食材:

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

看著這張有味道的表格,筆者的腦袋裡已經自動冒出了意麵、壽司、菠蘿飯;夾饃、羊排、揚州飯,種種美食的畫面了。不知道來自五湖四海的大家又會想到什麼美食呢?

菜譜評分

要給菜譜打分,實際上就可以看成一個迴歸問題。給出人類對菜品的評分,然後再讓模型去學習人的評分標準即可。不過當下有一個問題,就是我的資料中並沒有標準的人類評分。

為了解決這個問題,我構造了一個屬性,令評分=log(菜譜收藏數)/log(瀏覽量),這是基於一個直覺——一道菜越好,看到這個菜譜的人就越可能收藏它,也就是收藏的比例會更高。利用這種“評分”,我訓練了一個xgboost的迴歸模型。

有了訓練出的模型,我嘗試了用它來給幾道菜打打分:

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

或許這個模型比較喜歡重口味?

xgboost模型也有很好的解釋性,我們可以透過它輸出的特徵重要性瞭解到影響菜譜評分的重要食材。

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

油鹽糖、蔥薑蒜等家常食材和調味料位列前茅,看來能把家常的食材駕馭好對於菜品的質量就很重要了,平平淡淡即是真。

各人口味

若是要承辦一頓盛宴款待來自五湖四海的朋友,那麼眾口難調可能就是一個要考慮的重要問題了。再好的一道菜也未必能夠合所有人的口味,但是,如果能夠讓菜桌上菜品的分佈與各人的喜好相適應,每個人也就都能吃上自己喜歡的食物了。接下來,我正是要從這裡的資料中找到大家的口味偏好。

資料中沒有直接的口味資訊,不過,我們可以從菜譜的名稱、原料、簡介等文字資訊中粗略的估計其口味。我選取了“酸 辣 鹹 甜 香 鮮 清淡”作為7種基本口味,若是它們出現在一道菜的文字資訊中,就認為這道菜有這種滋味。一道菜可以有多重口味,比如加辣椒的酸菜魚至少就有“酸、辣”兩種滋味。

下面,以收藏數佔比為標準,看看網站上大家的總體口味偏好都是怎樣的吧:

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

看來大家對美食的首要要求就是要香(畢竟真香!),其次鮮、辣也是非常流行的要素。這樣看來,理想的一桌宴席,應當是滿桌的菜品都香飄四溢,有殷紅的辣菜讓人食指大動,鮮美的湯品讓人久久回味,還有酸、甜、鹹味的小菜點心更增胃口。

雖然總體的喜好有很參考價值,但是每個人都有自己好的一口,不能一概而論。不過,要是知道一個人的故鄉,就能夠大致猜到他的口味愛好了。那麼我們怎麼了解各地人們的口味愛好呢?

資料中有著各地的菜系資訊,若是能夠統計各種菜系的口味分佈,不就能夠估計出這個地方人們的愛好了嗎?下面的動圖就展示了13種菜系的相對口味偏好。

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

圖中數值為菜系間的相對比較值,而非絕對值。絕對值資料及本視覺化程式碼在後面提供。

所以,若是能夠了解宴會上客人的故鄉,我們就能夠更準確地選擇我們的菜品。就比如辣味雖好,若是有江浙地區的客人,也要記得留一些清淡的菜品哦。

那麼,我們就大資料燒菜吧?

現在,我們已經可以用資料估計人群的口味偏好,用模型給我們的菜品打分了,那麼後面似乎我們就可以用大資料投其所好,擇優燒菜?

或許有能力的同仁真的可以做這樣的嘗試,不過在筆者自己的小家中似乎還沒有能與大資料相匹配的豐富食材。這不,一天家裡面準備燒意麵,正可以在美食網站上查好的燒法,比如我就看中了"羅勒番茄意麵",然而,家中並沒有羅勒這種東西。

判菜系、調眾囗、打分數,這一回,我們用大資料燒菜?

羅勒是一種香草,青翠的綠色又為菜餚增色不少……這時,我的目光投向冰箱中的香菜,它說不定也能收到類似的奇效呢?

於是,在我的巧思,和家人的巧手下,一道香菜番茄醬意麵就這麼誕生了,色香味也都不錯!

不知道大資料會給我這道奇葩的菜(離群值)打出幾分?不過我想,充分發揮創意,開拓現有資料中不存在的全新可能性,似乎是一件更享受的事情呢!

注:

1、本文結論,僅供娛樂。如有吻合,不勝榮幸。歡迎大家提出意見、指出問題。由於程式碼較多較雜不及整理,我把部分程式碼(動態視覺化和原料標準化)和處理後的資料檔案開源在我的Github上,有興趣不妨看看和star一下~

2、在正式訓練模型前需要進行特徵工程,篩選掉不重要的特徵。而這裡我們又要用大量不規範的食材名來做特徵,比如說光是豆瓣醬,就有[‘豆瓣醬’, ‘郫縣豆瓣醬’, ‘正宗郫縣豆瓣醬’, ‘六月香豆瓣醬’, ‘豆瓣醬鹽糖雞精香菜’, ‘辣豆瓣醬’, ‘老乾媽和豆瓣醬可以二選一’]這麼多種說法,所以這裡我們就要合併這些冗餘的特徵。我把網上採集得到的食材作為標準實體,利用它們的本名和別名把各種描述與這些實體連結(原始碼見上),就完成了這一步。還可能存在一些少量的不規範描述,我使用低頻詞過濾消除了它們。

3、分類模型的效果很不錯,能夠達到96.6%的準確率。但迴歸模型的R方=0.156,實際上效果並不是很好,所以這一部分的結論可能會有些問題,或許需要更好的評分標準,這裡僅作為一種可能性的探索。

注:本原載於作者的CSDN部落格:

https://blog.csdn.net/blmoistawinde/article/details/87884777

希望交流的可以到部落格處或上面的Github聯絡。

本文為投稿作品,僅代表個人觀點。

作者介紹:

上海西南某高校學森一枚,資料玩家,喜歡有趣有意義的資料探勘分析。目前興趣方向在NLP,社交網路分析和知識圖譜等。 嚮往風一般自由,希望拂過之處給世界帶來些清新與滋潤~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562039/viewspace-2637824/,如需轉載,請註明出處,否則將追究法律責任。

相關文章