2.3 監(jiān)督學(xué)習(xí) III
原文:Machine Learning for Humans, Part 2.3: Supervised Learning III
作者:Vishal Maini
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
非參數(shù)化模型:KNN、決策樹和隨機(jī)森林。包含交叉驗(yàn)證、超參數(shù)調(diào)優(yōu)和集成模型。
非參數(shù)學(xué)習(xí)器
事情變得有點(diǎn)...奇怪了。
我們目前為止涉及的方法,線性回歸,對率回歸和 SVM ,它們的模型形式是預(yù)定義的。與之相反,非參數(shù)學(xué)習(xí)器事先沒有特定的模型結(jié)構(gòu)。在訓(xùn)練模型之前,我們不會(huì)推測我們嘗試習(xí)得的函數(shù)f的形式,就像之前的線性回歸那樣。反之,模型結(jié)構(gòu)純粹由數(shù)據(jù)定義。
這些模型對于訓(xùn)練數(shù)據(jù)的形狀更加靈活,但是有時(shí)會(huì)有可解釋性的代價(jià)。不久你就會(huì)更理解它。讓我們繼續(xù)吧。
K 最近鄰(KNN)
你是你的最親密的 K 個(gè)朋友的均值。
KNN 看起來圖樣圖森破,不像是機(jī)器學(xué)習(xí)算法。它的思路是,通過尋找 K 個(gè)最近的數(shù)據(jù)點(diǎn)的標(biāo)簽,來標(biāo)記測試數(shù)據(jù)點(diǎn)x。
看一看下面的圖像。讓我們假設(shè),你想知道,迷之綠色圓圈是紅色三角還是藍(lán)色方塊。你怎么做呢?
你可以嘗試提出一個(gè)迷之方程,它查看綠色圓圈在坐標(biāo)平面的哪里,并作出相應(yīng)的預(yù)測?;蛘?,你可以僅僅查看三個(gè)最近的鄰居,并猜測綠色圓圈可能是個(gè)紅色三角。你也可以進(jìn)一步擴(kuò)展圓圈,并查看五個(gè)最近鄰,并這樣作出預(yù)測(五個(gè)最近鄰里面,有三個(gè)藍(lán)色方塊,所以我們猜測,k=5時(shí)迷之綠色圓圈是藍(lán)色方塊。

KNN 的演示,其中
k=1, 3, 5。為了劃分上面的迷之綠色圓圈(x),查看它的單個(gè)最近鄰,是個(gè)“紅色三角”。所以我們猜測?為“紅色三角”。k=3時(shí),查看三個(gè)最近鄰:這里的眾數(shù)仍然是“紅色三角”,所以?為“紅色三角”。k=5時(shí),我們選取五個(gè)最近鄰的眾數(shù),要注意?變?yōu)榱恕八{(lán)色方塊”。圖片來自維基百科。
就是這樣。這就是 KNN。你查看了 K 個(gè)最近的數(shù)據(jù)點(diǎn),如果變量是連續(xù)的(例如房價(jià)),取它們的均值;如果變量是離散的(例如貓或者狗),取它們的眾數(shù)。
如果你打算猜測未知房價(jià),你可以選取一些地理上鄰近的房子,然后取平均,你就會(huì)得到一些很棒的猜測。這可能甚至優(yōu)于參數(shù)化回歸模型,一些經(jīng)濟(jì)學(xué)家構(gòu)建了它們來估計(jì)臥室/浴室、鄰近的學(xué)校、公共交通的距離,以及其它的數(shù)量的參數(shù)。
如何使用 KNN 來預(yù)測房價(jià):
- 儲存訓(xùn)練集。
X是特征,例如郵政編碼、鄰居、臥室數(shù)量、面積、公共交通的距離,以及其它。Y是對應(yīng)的售價(jià)。
- 將你的訓(xùn)練集排序,按照與測試集中的房子的相似性,基于
X中的特征。我們下面會(huì)定義“相似性”。
- 計(jì)算 K 個(gè)最鄰近的房子的均值。這就是你對售價(jià)(也就是
?)的猜測。
KNN 不需要預(yù)定義的參數(shù)化函數(shù)f(X),它用于將Y與X相關(guān)聯(lián)。這使得它更適合關(guān)系過于復(fù)雜,不能用簡單的線性模型表示的情況。
距離度量:定義和計(jì)算“鄰近性”
在尋找“最近鄰”的時(shí)候,你如何計(jì)算問題中的數(shù)據(jù)點(diǎn)的距離呢?你如何在數(shù)學(xué)上判斷,示例中的哪個(gè)藍(lán)色方塊和紅色三角更接近綠色圓圈?尤其是,如果你無法畫出一幅漂亮的二維圖像,用眼睛觀測它?
最直接的度量是歐氏(幾何)距離(“像烏鴉飛過”的一條直線)。另一個(gè)是曼哈頓(街區(qū))距離,就像在城市塊中行走。你可以想象,在涉及到 Uber 司機(jī)的費(fèi)用計(jì)算的模型中,曼哈頓距離更加實(shí)用。

綠色直線為歐氏距離。藍(lán)色直線為曼哈頓距離。來源:維基百科
還記得用于尋找直角三角形斜邊長度的畢達(dá)哥拉斯(勾股)定理嘛?

c為斜邊(上面的綠色直線),a和b是兩個(gè)直角邊(上面的紅色直線)。
通過計(jì)算a和b長度的平方和的平方根,我們就解出了c,求出了斜邊長度。這里a和b是三角形的直角(正交)邊(也就是,它們互為 90 度角,在空間中垂直)。

給定兩個(gè)正交方向的向量的情況下,求解斜邊長度的思路,可以推廣到多維。這就是 N 維空間的點(diǎn)p和q的歐氏距離d(p,q)的推導(dǎo)方式:

歐氏距離的公式,由勾股定理推出。
使用這個(gè)公式,你可以計(jì)算所有訓(xùn)練數(shù)據(jù)點(diǎn),到你嘗試標(biāo)注的數(shù)據(jù)點(diǎn)的鄰近度,并選取 K 個(gè)最近鄰的均值或眾數(shù),來做出你的預(yù)測。
通常你不需要手動(dòng)計(jì)算任何距離,用搜索引擎簡單搜索一下,你就能在 NumPy 或者 SciPy 找到預(yù)構(gòu)建的函數(shù),會(huì)為你做這個(gè)事情,例如,euclidean_dist = numpy.linalg.norm(p-q)。但是看到八年級的集合概念如何有助于構(gòu)建當(dāng)今的 ML 模型,這很有趣。
選取k:使用交叉驗(yàn)證調(diào)優(yōu)超參數(shù)
為了決定我們使用哪個(gè)k,你可以測試不同的 KNN 模型,使用交叉驗(yàn)證以及k的不同值。
將你的訓(xùn)練集分成兩部分,在一部分上訓(xùn)練模型,將保留的部分用作測試集。
通過將模型的預(yù)測(
?),與測試數(shù)據(jù)的真實(shí)值(y)相比,看看你的模型表現(xiàn)如何。在所有迭代中,通常選取誤差最小的模型。

交叉驗(yàn)證的演示。分塊和迭代的數(shù)量可以修改。
K 的較高值防止過擬合
K 的較高值能防止過擬合,但是如果 K 太高的話,你的模型會(huì)有很大偏差,并且不靈活。選取一個(gè)極端的示例:如果k=N(數(shù)據(jù)點(diǎn)的總數(shù)),模型就失效了,將所有測試數(shù)據(jù)分類為訓(xùn)練數(shù)據(jù)的均值或者眾數(shù)。
如果動(dòng)物數(shù)據(jù)集中的單個(gè)最常見的動(dòng)物是蘇格蘭折耳貓,k=N(訓(xùn)練觀測值數(shù)量)的 KNN 會(huì)將實(shí)際上的每個(gè)其它動(dòng)物預(yù)測成它。在 Vishal 看來,這個(gè)很棒,但 Samer 不同意。
完全沒有來由的蘇格蘭折耳貓
.gif。我們可以休息一下。
真實(shí)世界中使用 KNN 的地方
一些你可以使用 KNN 的地方:
分類:詐騙檢測。模型可以使用新的訓(xùn)練樣本馬上更新,因?yàn)槟銉H僅是存儲新的數(shù)據(jù)點(diǎn),這允許你快速適應(yīng)新的詐騙方法。
回歸:預(yù)測房價(jià)。在房價(jià)預(yù)測中,字面上的“最近鄰”實(shí)際上很好暗示了價(jià)格上的相似。KNN 在物理相似性很重要的領(lǐng)域很實(shí)用。
填充缺失的訓(xùn)練數(shù)據(jù)。如果你的
.csv中的一列有大量缺失值,你可以通過選取均值或者眾數(shù)填充數(shù)據(jù)。KNN 可能會(huì)給你每個(gè)缺失值的更加準(zhǔn)確的猜測。
決策樹和隨機(jī)森林
制作一顆好的決策樹就像玩“20個(gè)問題”的游戲。

右邊的決策樹描述了泰坦尼克號的生還者規(guī)律。
決策樹根節(jié)點(diǎn)的第一次分割,就像是 20 個(gè)問題中的第一個(gè)問題:你打算盡可能干凈地分隔數(shù)據(jù),所以這個(gè)分割的信息增益應(yīng)該最大。
如果你的朋友說,“我正在想一個(gè)名詞,問我 20 個(gè)是或不是的問題來猜猜它”,并且你的第一個(gè)問題是“它是土豆嘛?”,你就太蠢了。因?yàn)槿绻鼈冋f“不是”,你沒有獲得任何信息。除非你知道你的朋友整天都在想土豆,或者剛剛在想它,那么你就猜對了。
反之,類似“這是一個(gè)物體嘛?”的問題可能更有意義。
這有點(diǎn)類似醫(yī)院分類病人,或者做出不同的診斷的方式。它們先問一些問題,并檢查一些重要的指標(biāo)來判斷你是否馬上就要掛了,還是不是。當(dāng)你進(jìn)門的時(shí)候,它們不會(huì)一開始就做切片檢查,或者檢查你是否得了胰腺癌。
有幾種方式來量化信息增益,以便你能根本上求解訓(xùn)練集的每個(gè)可能的分割,以及每個(gè)分割的信息增益。你可以用這個(gè)方式,盡可能高效地預(yù)測每個(gè)標(biāo)簽或值。
現(xiàn)在,讓我們查看一個(gè)特定的數(shù)據(jù)集,并討論我們?nèi)绾芜x擇分割。
泰坦尼克數(shù)據(jù)集
Kaggle 的泰坦尼克數(shù)據(jù)集大量用于機(jī)器學(xué)習(xí)入門。當(dāng)泰坦尼克沉沒時(shí),2224 個(gè)乘客和乘員中有 1502 個(gè)死亡。雖然包含一些運(yùn)氣成分,女人、孩子和頭等艙更有可能生還。如果你回去看看上面的決策樹,你會(huì)看到,它某些程度上反映了性別、年齡和艙位的變化。
選擇決策樹中的分割
熵是集合中的無序的總數(shù),由基尼系數(shù)和交叉熵度量。如果值相當(dāng)混雜,熵就很大;如果你能干凈地分割數(shù)據(jù),就沒有熵。對于父節(jié)點(diǎn)的每個(gè)分割,你需要讓子節(jié)點(diǎn)盡可能純粹,也就是熵最小。例如,在泰坦尼克中,性別是生還者的重要決定因素,所以將這個(gè)特征用于第一次分割十分有意義,并且它是擁有最大信息增益的特征。
讓我們看一看泰坦尼克的變量:

來源:Kaggle
我們通過選取這些變量之一,以及根據(jù)它分割數(shù)據(jù)集,來構(gòu)建決策樹。

第一次分割將我們的數(shù)據(jù)集分為男性和女性。之后女性分支又按照年齡分割(使熵最小的分割)。與之類似,男性分支按照艙位分割。通過對新的乘客遍歷這棵樹,你可以使用它來猜測它們是否掛了。
泰坦尼克的示例解決了分類問題(生存或者死亡)。如果我們將決策樹用于回歸,例如預(yù)測房價(jià),我們可以分割決定房價(jià)的最重要的特征。面積:大于或小于 xxx?臥室或者浴室數(shù)量:大于或小于 xxx?
之后,在測試期間,你需要用特定的房子遍歷所有分割,并取葉子節(jié)點(diǎn)的所有房價(jià)的均值(最底下的節(jié)點(diǎn)),這些房子就會(huì)成為你的售價(jià)預(yù)測。
決策樹是高效的,因?yàn)樗鼈円子诮庾x,即使對凌亂的數(shù)據(jù)也很強(qiáng)大,并且一旦訓(xùn)練完成,部署的開銷很小。決策樹也擅長于處理混合數(shù)據(jù)(數(shù)值或類別)。
也就是說,決策樹的訓(xùn)練開銷很大,過擬合的風(fēng)險(xiǎn)很大,并且容易找到局部最優(yōu),因?yàn)樗鼈冊诜指钪缶筒荒芑厮萘?。為了解決這些缺陷,我們轉(zhuǎn)向了一種方式,它演示了將多個(gè)決策樹整合為一個(gè)模型的力量。
隨機(jī)森林:決策樹的集成
由多個(gè)模型整合的模型叫做集成模型,這通常是一個(gè)制勝策略。
單個(gè)決策樹可能做出很多錯(cuò)誤判斷,因?yàn)樗泻芏喾呛诩窗椎呐袛?。隨機(jī)森林是個(gè)元估計(jì)其,它繼承了多個(gè)決策樹,并擁有一些可觀的改進(jìn):
每個(gè)節(jié)點(diǎn)上分割的特征數(shù)量限制為總體的一定百分比(這是個(gè)可以調(diào)整的超參數(shù),詳見 scikit-learn 的文檔)。這確保了繼承模型不會(huì)過度依賴單個(gè)特征,并且公平地利用所有潛在的預(yù)測性特征。
每棵樹從原始數(shù)據(jù)集抽取隨機(jī)樣本,來生成自己的分割,這添加了進(jìn)一步的隨機(jī)元素來防止過擬合。
這些改進(jìn)也防止了樹的高度相關(guān)。如果沒有上面的第一條和第二條,每棵樹都是相同的,因?yàn)檫f歸的二元分割時(shí)決定性的。
為了演示,看看下面的九個(gè)決策樹分類器:

這些決策樹分類器可以集成到隨機(jī)森林中,它整合了這些輸入。將橫軸和縱軸看做特征x1和x2。對于每個(gè)特征的特定值,決策樹輸出“藍(lán)色”、“綠色”和“紅色”的分類。

這些結(jié)果通過眾數(shù)(分類)或者均值(回歸)整合為單個(gè)集成模型,它優(yōu)于單個(gè)決策樹的輸出。
隨機(jī)森林是建模過程的一個(gè)非常不錯(cuò)的起始點(diǎn),因?yàn)樗鼈儗τ诓徽麧嵉臄?shù)據(jù)擁有高容忍度的強(qiáng)大表現(xiàn)。并且,對于在眾多特征中找到最重要的特征非常實(shí)用。
也有很多機(jī)智的繼承模型,它組合了決策樹并產(chǎn)生非常棒的表現(xiàn)。請查看 XGBoost(eXtreme Gradient Boosting)的示例。
之后,我們就完成了監(jiān)督學(xué)習(xí)的學(xué)習(xí)
非常不錯(cuò)。這一節(jié)中我們涉及了:
- 兩個(gè)非參數(shù)監(jiān)督學(xué)習(xí)算法:KNN 和決策樹
- 距離和信息增益的度量
- 隨機(jī)森林,它是集成模型的示例
- 交叉驗(yàn)證和超參數(shù)調(diào)優(yōu)
我希望,你現(xiàn)在有了一些可靠的直覺,對于在給定訓(xùn)練集的情況下,我們?nèi)绾瘟?xí)得f,以及使用它和測試數(shù)據(jù)做出預(yù)測。
在“第三部分:無監(jiān)督學(xué)習(xí)”中,我們討論當(dāng)我們擁有不帶標(biāo)簽的訓(xùn)練集時(shí),如何解決問題。
練習(xí)材料和擴(kuò)展閱讀
2.3a 實(shí)現(xiàn) KNN
嘗試這個(gè)攻略,在 Python 中從零開始實(shí)現(xiàn) KNN。你可能也打算看一看 scikit-learn 的文檔,來體驗(yàn)預(yù)構(gòu)建的實(shí)現(xiàn)的工作方式。
2.3b 決策樹
嘗試《An Introduction to Statistical Learning》中的第八章的決策樹實(shí)驗(yàn)。你可以使用泰坦尼克訓(xùn)練集來玩玩,并且查看這個(gè)教程,它涵蓋了與上面相同的概念和代碼。這里是隨機(jī)森林的 scikit-learn 實(shí)現(xiàn),可以在數(shù)據(jù)集上開箱即用。