作者:[龍心塵](http://blog.csdn.net/longxinchen_ml?viewmode=contents) &&[寒小陽](http://blog.csdn.net/han_xiaoyang?viewmode=contents)
時間:2016年1月。
出處:
[http://blog.csdn.net/longxinchen_ml/article/details/50493845](http://blog.csdn.net/longxinchen_ml/article/details/50493845),
[http://blog.csdn.net/han_xiaoyang/article/details/50503115](http://blog.csdn.net/han_xiaoyang/article/details/50503115)
聲明:版權所有,轉載請聯系作者并注明出處
### 1. 劇情一:挑螃蟹的秘密
李雷與韓梅梅的關系發展得不錯,趁國慶休假一起來天津玩。今天,李雷十分神秘地請韓梅梅去一家餐館吃螃蟹。韓梅梅大失所望,這個餐館很不起眼,感覺就像路邊的老食堂。菜單都用粉筆寫在黑板上,一點都不高檔。一看價格,滿黃螃蟹120塊錢一只!這也太貴了。
李雷看到了韓梅梅的神情,笑著解釋道:“這家店老板有一個絕活——會看螃蟹。他能保證120塊的螃蟹就是滿黃。如果拆開來不是,這個螃蟹就不要錢,再換一個。靠著老板的絕活,這家店已經是幾十年的老店了,在當地非常有名氣。郭德綱、趙麗蓉這些天津社會名流都來這家店吃過螃蟹。”
韓梅梅將信將疑。拆開螃蟹,飽滿的蟹黃噴薄欲出。韓梅梅邊吃邊驚嘆:“從沒有吃個這么好吃的螃蟹!”
李雷接著說:“老板的絕活密不外傳,幾十年來都自己上貨。雖說是一個大老板,一年到頭滿身海鮮味。而且他也不開分店。”
韓梅梅說:“那是,這么高明的絕活只有他自己知道才能掙錢啊。”這時,韓梅梅拂面而笑,突然想考一考自己的相親對象,說:“李大碼農,你不是做機器學習的嗎?如果要你去用機器學習挑滿黃的螃蟹,你怎么做?”
### 2. 初步劃定特征的范圍,獲取特征
李雷早就想過這個問題了。長期的職業素養讓他對任何事情都想用機器學習的方法去鼓搗。李雷的基本思路是這樣的,我們盡可能觀察螃蟹更多的特征,從中找出與“螃蟹滿黃”最相關的特征來,幫助我們去判斷。當然特征有非常多,我們可以先頭腦風暴一下:
1. 一些直觀的特征:包括蟹殼的顏色和光澤度、鉗子的大小、肚臍的形狀、螃蟹腿的粗細和長度、眼睛的大小和顏色光澤、螃蟹的品種、重量、體積、腰圍等等……
1. 一些需要在互動過程中觀察到的特征:螃蟹鉗子的力量,對外界刺激的反應,用筷子觸碰螃蟹眼睛后的反應,螃蟹行動的速度……
1. 還有一些外部環境的特征: 收獲螃蟹的季節,培養螃蟹的水域……
>韓梅梅插話到:“這么多特征我頭都大了,你還有完沒完?”
其實,如果真要窮舉出所有的特征可能永遠也舉不完。但是我們目的很明確——判斷螃蟹是否是滿黃。所以我們只關心跟這個問題(“標簽”)相關的特征,它們只占所有特征中很小一部分。怕就怕一些糊涂的需求方連目的都不明確就要求一通亂搞,即便出來了一堆結果,也不知道有什么用。
頭腦風暴完之后,很重要的一點就是找到對這個問題有長期經驗的人,虛心向他們學習。人腦其實是一個很好的特征篩選器,這些經驗可以給我們非常多的指導和啟發,極大地減少我們試錯的工作量。比如我們可以直接去找海鮮市場問螃蟹販子,去田間地頭找螃蟹養殖戶,去海鮮飯店去問有經驗的采購員和廚師……他們的最一線的經驗是特征工程中的寶貴財富。
但這里需要考慮將經驗轉換成可量化的指標,才能便于機器學習。比如人們可能會說螃蟹很“活躍”、很“精神”,或者很“慵懶”。這些特征需要轉換成一些可量化指標去衡量,具體怎么轉換也有很大學問。
接下來要考慮的問題是對這些特征的可用性進行簡單的評估。比如:
1. 特征獲取、描述難度
1. 數據的規模
1. 特征的準確率
1. 特征的覆蓋率
1. 其他
我們**通過明確目標,頭腦風暴,咨詢專家,特征量化,可用性評估等流程,就基本劃定了特征范圍**。
### 3. 劇情二:“特征預處理”的門道
李雷說完,便拿出自己的平板,給韓梅梅看自己某個項目中搜集的初始特征。這些特征被放在一張巨大的表里。
韓梅梅看著這些密密麻麻的數字,心想:看李雷說得頭頭是道,但還是沒告訴我怎么挑,不能讓他輕易繞過去。
于是她說:“我看你這些特征數據有大有小,有些就是幾萬上下浮動,有些僅僅是小數點后好幾位的微小變化,有些就是在0或1這兩種可能中變化,有些連值都沒有。你這些數據能用嗎?”
李雷說:“不能,要轉換成標準件。”
韓梅梅:“標準件?”
### 4. “特征標準件”
如果把機器學習過程當做一個加工廠的話,那輸入的數據(特征、標簽)就是原材料,輸出的模型和判斷結果就是產品。并不是胡亂扔進去任何原材料都能加工出合格產品的。原材料需要一個“預處理”過程才能方便地被算法處理。這些預處理后的數據,李雷起了個不夠規范的名字,叫做“特征標準件”。
以二分類問題為例,不同的算法對“特征標準件”的要求是不同的。比如邏輯回歸和神經網絡,比較喜歡歸一化之后在[-1,1]區間內浮動的特征。而貝葉斯方法,喜歡因子化之后的{0,1}分布的二元特征,每個特征只有“是”和“不是”兩種可能的狀態。
### 5. 連續特征與非連續特征
特征可以分為兩類:“連續特征”和“非連續特征”。
“身高”、“體重”、“成績”、“腰圍”、“長度”、“寬度”、“體積”、“速度”等等,都是連續特征。連續特征能夠比較方便地進行歸一化。歸一化的統一公式如下:
x?=x?μS
μ為所有樣本數據的均值,x?μ的步驟叫做去均值化>
1. 當S=xmax?xmin時,經過處理的數據在區間[-1,1]之間。
1. 當S=σ(所有樣本的標準差)時,經過處理的數據符合標準正態分布,即均值為0,標準差為1
另一方面:“是否高富帥”、“是否白富美”、“螃蟹的品種”、“螃蟹所在的水域”、“收獲螃蟹的季節”等等,都是非連續特征。非連續特征能夠比較方便地進行因子化,或者它本身就是二元特征。方法如下:
特征“收獲螃蟹的季節”:{春,夏,秋,冬} 因子化后的結果為:
- 特征“是否春”:{是,否}
- 特征“是否夏”:{是,否}
- 特征“是否秋”:{是,否}
- 特征“是否冬”:{是,否}
### 6. 兩類特征的相互轉化
連續特征可以當非連續特征來用,非連續特征可以當連續特征來用。
連續特征可以離散化非連續特征。比如“年齡”作為一個連續特征,假設它的取值范圍是[0,100]。我們可以中間切一刀,比如選擇60(歲)。大于等于60歲的就叫做“老年”,小于60歲的就是“非老年”,這樣就轉化成了一個二元特征了。怎么選擇離散的分離邊界也很有學問。
如果我們中間切兩刀甚至更多刀,比如18(歲)和60(歲)。大于等于60歲的就叫做“老年”,18歲到60歲之間的就叫做“中青年”,小于18歲就叫做“未成年”。然后再把這3類因子化成3個二分類就夠了:“是否老年”、“是否中青年”和“是否未成年”。

非連續特征因子化成二元特征{0,1}后可以直接當做[0,1]之間的連續特征來用。我們之前文章[《機器學習系列(3)_邏輯回歸應用之Kaggle泰坦尼克之災》](http://blog.csdn.net/han_xiaoyang/article/details/49797143)就是這么使用的。
### 7. 去除特征之間的共線性
我們在對離散特征**因子化過程中細分到二元特征為止即可**。那對于二元特征本身能否因子化成兩個特征?比如以下例子:
特征“螃蟹的性別”:{公,母} ,可否轉換為:
- 特征“是否公螃蟹”:{是,否}
- 特征“是否母螃蟹”:{是,否}
這是不行的,因為這兩個特征的信息完全一樣,也叫做**共線性**。計算這兩個特征之間的條件熵:
H(“是否公螃蟹”|“是否母螃蟹”)=0
也可以用計算條件熵的方法去衡量兩類離散特征的差異性,方便去除共線性關系的特征。
連續特征也有著共線性的情況,比如同一個品種的螃蟹腿的“長度”和“粗細”是共線性關系。也就是說,如果我們知道螃蟹腿的長度是x厘米,那么螃蟹腿的直徑就是kx厘米,k是一個穩定的常數。因此我們只需要螃蟹腿的“長度”這一個特征就夠了。那么連續特征的共線性如何去除?
可以計算兩個變量(x,y)的相關系數:
rxy=cov(x,y)σxσy=cov(x,y)cov(x,x)×cov(y,y)√
rxy的取值范圍是[-1,1],如果是0則統計獨立,如果接近1則強相關。>
可以計算這些數據的協方差矩陣,進而求出相關系數矩陣。就可以比較任意兩個特征了。


既然協方差矩陣都求了,那就干脆用主成分分析(PCA)吧,這樣更省事。得到主成分,線性相關的那些量就直接被舍棄了。我們在前文[《深度學習與計算機視覺系列(7)_神經網絡數據預處理,正則化與損失函數》](http://blog.csdn.net/han_xiaoyang/article/details/50451460) 對PCA有相關論述。
感興趣的同學可以試試把上述離散二元特征當做連續變量使用,構造幾個數據,計算其相關系數并進行主成分分析。發現其相關系數就是-1,主成分分析后自動就變成一個主成分了。可見PCA對于連續特征與非連續特征都是去除共線性的通用方法。
### 8. 缺失值的處理
這個問題現在才講,但實際過程中應該在前期去處理。掌握以下三點就夠了:
1. 如果某個特征的缺失值比較多:可能就直接舍棄。
1. 如果缺失值不是很多,而且是連續特征:可以考慮用回歸方法去擬合,或者直接用眾數、中位數、平均數等具體的值去替代即可。
1. 如果缺失值不是很多,而且是非連續特征:可以嘗試把缺失值當做一個新的類目去處理,可能也揭示了一定的客觀現實。
### 9. 離群點的分析
對于連續特征,最好看看其在樣本中的分布。如果某些值偏離了主要聚集區域,可能需要單獨抽出來分析,里面可能包含了更多的信息,可以這樣畫圖方便觀察:

### 10. 特征預處理小結
特征的預處理步驟比較多,相互之間的關系比較復雜。我們畫了一張圖以揭示它們之間的關系:

### 11. 劇情三:李雷另辟蹊徑挑螃蟹
韓梅梅長嘆一口氣:“終于聽你叨逼叨逼說完了。”
李雷說:“沒辦法啊,這塊工作其實挺多的。我還要好多沒說完……” “你打住”,韓梅梅趕緊說,“我算服了你了。但是李大碼農,你還沒有跟我說你怎么靠這些特征挑螃蟹呢。”
李雷說:“不急,用邏輯回歸……”韓梅梅說:“不要用邏輯回歸,我已經從趙媒婆那知道了。你換個方法,用非連續特征來做。”韓梅梅存心想刁難她的相親對象。
李雷說:“那可以用貝葉斯。”
### 12. 用貝葉斯方法挑螃蟹
我們的標簽用Y=“是滿黃”來表示,相應的Y???=“不是滿黃”。Xi表示所有離散化的二元特征,如X1=“是河蟹”,X2=“是秋季收貨”,X3=”鉗子的力量大”……。于是在已知這些特征的情況下,該螃蟹“是滿黃”的概率如下:
P(Y|X1,X2,X3...)=P(X1,X2,X3...|Y)×P(Y)P(X1,X2,X3...)>
其實,可以直接判斷P(Y|X1,X2,X3...)是否大于1/2即可。因為P(X1,X2,X3...)這一項算起來比較麻煩,我們用以下方法直接把它約掉。
先求出螃蟹“不是滿黃”的概率:
P(Y???|X1,X2,X3...)=P(X1,X2,X3...|Y??)×P(Y??)P(X1,X2,X3...)>
再兩式相處,得到:
P(Y|X1,X2,X3...)P(Y??|X1,X2,X3...)=P(X1,X2,X3...|Y)×P(Y)P(X1,X2,X3...|Y??)×P(Y??)>
這樣就約去了P(X1,X2,X3…)。只需要判斷P(Y|X1,X2,X3...)P(Y??|X1,X2,X3...)是否大于1即可。但是,工程上用除法不太方便,兩邊同時取對數log,得到:
logP(Y|X1,X2,X3...)P(Y??|X1,X2,X3...)=logP(X1,X2,X3...|Y)P(X1,X2,X3...|Y??)+logP(Y)P(Y??)>
左邊是螃蟹“是滿黃”的邏輯發生比,只需要判斷其是否大于0即可。
到目前為止,以上都是等價變換。
接下來我們引入貝葉斯方法中常用的條件獨立假設:
P(X1,X2,X3...|Y)=P(X1|Y)×P(X2|Y)×P(X3|Y)...
P(X1,X2,X3...|Y???)=P(X1|Y???)×P(X2|Y???)×P(X3|Y???)...>
將它們帶入上式,就變成了:
logP(Y|X1,X2,X3...)P(Y??|X1,X2,X3...)=logP(X1|Y)P(X1|Y??)+logP(X2|Y)P(X2|Y??)+logP(X3|Y)P(X3|Y??)+...+logP(Y)P(Y??)>
于是我們得到了一個簡單的求和式,只需要判斷等式右邊求和的結果是否大于0即可。而最關鍵的就是右邊每一項都非常好求!假如訓練集中所有的滿黃螃蟹收集在一起,統計每一個特征出現的次數,除以滿黃螃蟹的總數,就是其相應的條件(后驗)概率了。再統計該特征在非滿黃螃蟹集合中的條件(后驗)概率,二者相除再取對數即可。
### 13. 用貝葉斯方法進行特征有效性分析
等式右邊作為一個求和式,其中每個求和項logP(Xi|Y)P(Xi|Y??)的絕對值越大,其對結果的影響越強烈,相對應的特征就是顯著特征。而絕對值比較小的特征就是非顯著特征,剔除掉也不會很明顯地影響結果。這就完成了一個特征篩選的過程。
我們再分析一下各個求和項的結構,里面的概率部分是后驗概率,是特征相對于標簽的后驗概率。這個后驗概率與我們上一篇文章[《從白富美相親看特征預處理與選擇(上)》](http://blog.csdn.net/han_xiaoyang/article/details/50481967)中的后驗概率方向相反,不要搞混淆了。
### 14. 貝葉斯與邏輯回歸之間的關系
我們繼續看看這個求和項,是不是很像邏輯回歸中的求和項?我們如果拿二元特征當做連續變量采用邏輯回歸方法。其判別式如下:
z=w1x1+w2x2+w3x3+...+b;其中xi∈{0,1}>
二者的表達式驚人地相似!莫非logP(Xi|Y)P(Xi|Y??)=wi,二者一模一樣?
感興趣的同學可以自己舉個例子試一下,發現還是有區別的,二者求出來的權重不一樣。產生這樣差別的原因是什么呢?
想必大家都猜到了。就是貝葉斯方法引入的兩個條件獨立假設。正因為這兩個條件獨立假設,貝葉斯方法直接跳過了邏輯回歸中反復迭代用梯度下降法才能求出的各個權重。
因此貝葉斯方法與邏輯回歸的區別就是貝葉斯方法引入了一個更強的附加假設,而且可以直接通過統計結果求權重,而不必用梯度下降法。
所以有些情況下貝葉斯方法求出來的結果不好,就可以考慮考慮是不是條件獨立假設的原因。
因此,可以說“在某種假定下,可以證明:與樸素貝葉斯分類方法一樣,許多神經網絡和曲線擬合算法輸出最大的后驗假定。”——韓家煒:《數據挖掘:概念與技術(第三版)》
### 15. 劇情四:李雷露餡兒了
韓梅梅聽完,十分感慨地說:“難怪機器學習能挑出正確的結果,難怪趙媒婆用機器學習方法從這么多人中能把你挑出里來。你還是有兩下子嘛。”
“廢話,她是我干媽”,李雷志得意滿,不小心說漏嘴。 韓梅梅:“什么?!”
李雷后悔不已,尷尬地陪著笑臉說道:“梅梅,我錯了,我不該瞞你這么久。”到了這個地步,李雷只能和盤托出了。
### 16. 數據VS算法
其實李雷早就知道韓媽媽要挑選相親名單,如果按她的標準,李雷根本沒法進入名單中。而李雷也猜想她會去找趙媒婆。他就早早地聯系趙媒婆,跟她推銷他的機器學習方法。趙媒婆終于被李雷忽悠動心了。李雷就幫她開發那個相親算法。但其實趙媒婆的樣本數量不夠,特征數量卻非常多,肯定會過擬合。李雷就跟她說他會多找一些相親的數據。李雷能從哪里找啊,只能發動周圍的同學,讓他們找他們觀察到的情侶案例。而在這些群體中,恰好中學、大學是同學的情侶比率非常高,而且很多男方是碼農。而李雷剛好符合這個條件,李雷的評分就非常高了。
因為樣本選擇本來就代表性不足,沒能覆蓋更多的青年群體,所以還是過擬合,只是偏向了李雷這邊的概率而已。
可見,做機器學習雖然看起來比較炫酷的是算法,但真正關鍵的是數據。數據決定了你結果的上限,而算法只是盡可能逼近這個上限。而這點李雷并沒有告訴趙媒婆。
對樣本情況的分析要在特征優化過程中尤其注意。整個流程圖如下:

### 17. 特征選擇的局限性
而且,李雷并不覺得感情這樣復雜的東西能夠用趙媒婆那些量化的指標衡量好的。房子、車子、學歷、文憑這些并不能衡量兩個人之間的感情。一些非常重要的特征是難以量化的,比如兩個人的“三觀”、兩個人對待感情的態度、兩個人相互相處的獨一無二的經歷、兩個人刻骨銘心的情感體驗、那種兩個人相信能夠一輩子都在一起的篤定的感覺……這些至關重要的特征極其復雜,卻非常難以量化。所以對于這類問題,機器學習的能力還是很有限的。
### 18. 劇情五:尾聲
韓梅梅聽完李雷,既生氣,又好笑,還有一點點小感動:這小子為了感情還是蠻拼的。
一段沉默之后,韓梅梅笑著對李雷說:“好了好了,我不怪你了。”李雷長舒一口氣。
韓梅梅繼續說:“問個挑螃蟹的問題。你剛才選了這么多特征。為什么不考慮用B超直接照一下,看看里面什么東西不就成了嗎?”
李雷一聽,猶如當頭一棒,整個腦子都被草泥馬占滿了:“我去,這么簡單的方法我怎么想不到?!”
韓梅梅這時已經笑得肚子痛了,根本說不上話。
李雷吐槽到:“梅梅,你太厲害了。我覺得機器永遠也學不到的兩樣東西就是人類的情感和腦洞啊!”
### 19. 后記
其實博主也沒有喪心病狂到抓只螃蟹去照B超,只是自己被這個想法逗樂了,大家開心就好哈。O(∩_∩)O~~
如果真要死磕,據說B超的穿透力比較弱,對骨骼、空氣等很難達到深部,因此難以成像。但是通過聲波的回聲來判斷,也是一個思路。就像有些人可以通過拍打西瓜聽聲音來判斷它甜不甜的道理一樣。
如果不用機械波而用電磁波,比如X射線,估計哪怕能看到螃蟹滿黃顧客也不會吃了。顧客也會擔心放射殘留的。CT應該好些,但是貴呀。一套設備下來,螃蟹估計也不止120塊錢了吧。沒玩過CT,不知道成本多少……總之還是要考慮獲取特征的成本的。
- 前言
- 機器學習系列(1)_邏輯回歸初步
- 機器學習系列(2)_從初等數學視角解讀邏輯回歸
- 機器學習系列(3)_邏輯回歸應用之Kaggle泰坦尼克之災
- 手把手入門神經網絡系列(1)_從初等數學的角度初探神經網絡
- 手把手入門神經網絡系列(2)_74行代碼實現手寫數字識別
- 機器學習系列(4)_機器學習算法一覽,應用建議與解決思路
- 機器學習系列(5)_從白富美相親看特征預處理與選擇(上)
- 機器學習系列(6)_從白富美相親看特征預處理與選擇(下)
- 機器學習系列(7)_機器學習路線圖(附資料)
- NLP系列(2)_用樸素貝葉斯進行文本分類(上)
- NLP系列(3)_用樸素貝葉斯進行文本分類(下)
- NLP系列(4)_樸素貝葉斯實戰與進階