2.3 監(jiān)督學習 III
原文:Machine Learning for Humans, Part 2.3: Supervised Learning III
作者:Vishal Maini
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
非參數(shù)化模型:KNN婶熬、決策樹和隨機森林褐隆。包含交叉驗證秀又、超參數(shù)調(diào)優(yōu)和集成模型灭美。
非參數(shù)學習器
事情變得有點...奇怪了。
我們目前為止涉及的方法,線性回歸被辑,對率回歸和 SVM 制恍,它們的模型形式是預定義的。與之相反宽菜,非參數(shù)學習器事先沒有特定的模型結構谣膳。在訓練模型之前,我們不會推測我們嘗試習得的函數(shù)f
的形式铅乡,就像之前的線性回歸那樣继谚。反之,模型結構純粹由數(shù)據(jù)定義阵幸。
這些模型對于訓練數(shù)據(jù)的形狀更加靈活花履,但是有時會有可解釋性的代價。不久你就會更理解它挚赊。讓我們繼續(xù)吧诡壁。
K 最近鄰(KNN)
你是你的最親密的 K 個朋友的均值。
KNN 看起來圖樣圖森破荠割,不像是機器學習算法妹卿。它的思路是,通過尋找 K 個最近的數(shù)據(jù)點的標簽涨共,來標記測試數(shù)據(jù)點x
纽帖。
看一看下面的圖像。讓我們假設举反,你想知道懊直,迷之綠色圓圈是紅色三角還是藍色方塊。你怎么做呢火鼻?
你可以嘗試提出一個迷之方程室囊,它查看綠色圓圈在坐標平面的哪里雕崩,并作出相應的預測∪谧玻或者盼铁,你可以僅僅查看三個最近的鄰居,并猜測綠色圓圈可能是個紅色三角尝偎。你也可以進一步擴展圓圈饶火,并查看五個最近鄰焚碌,并這樣作出預測(五個最近鄰里面涌哲,有三個藍色方塊,所以我們猜測黎棠,k=5
時迷之綠色圓圈是藍色方塊抖僵。
KNN 的演示鲤看,其中
k=1, 3, 5
。為了劃分上面的迷之綠色圓圈(x
)耍群,查看它的單個最近鄰义桂,是個“紅色三角”。所以我們猜測?
為“紅色三角”蹈垢。k=3
時慷吊,查看三個最近鄰:這里的眾數(shù)仍然是“紅色三角”,所以?
為“紅色三角”耘婚。k=5
時罢浇,我們選取五個最近鄰的眾數(shù),要注意?
變?yōu)榱恕八{色方塊”沐祷。圖片來自維基百科嚷闭。
就是這樣。這就是 KNN赖临。你查看了 K 個最近的數(shù)據(jù)點胞锰,如果變量是連續(xù)的(例如房價),取它們的均值兢榨;如果變量是離散的(例如貓或者狗)嗅榕,取它們的眾數(shù)。
如果你打算猜測未知房價吵聪,你可以選取一些地理上鄰近的房子凌那,然后取平均,你就會得到一些很棒的猜測吟逝。這可能甚至優(yōu)于參數(shù)化回歸模型帽蝶,一些經(jīng)濟學家構建了它們來估計臥室/浴室、鄰近的學校块攒、公共交通的距離励稳,以及其它的數(shù)量的參數(shù)佃乘。
如何使用 KNN 來預測房價:
- 儲存訓練集。
X
是特征驹尼,例如郵政編碼趣避、鄰居、臥室數(shù)量新翎、面積程帕、公共交通的距離,以及其它地啰。Y
是對應的售價骆捧。
- 將你的訓練集排序,按照與測試集中的房子的相似性髓绽,基于
X
中的特征。我們下面會定義“相似性”妆绞。
- 計算 K 個最鄰近的房子的均值顺呕。這就是你對售價(也就是
?
)的猜測。
KNN 不需要預定義的參數(shù)化函數(shù)f(X)
括饶,它用于將Y
與X
相關聯(lián)株茶。這使得它更適合關系過于復雜,不能用簡單的線性模型表示的情況图焰。
距離度量:定義和計算“鄰近性”
在尋找“最近鄰”的時候启盛,你如何計算問題中的數(shù)據(jù)點的距離呢?你如何在數(shù)學上判斷技羔,示例中的哪個藍色方塊和紅色三角更接近綠色圓圈僵闯?尤其是,如果你無法畫出一幅漂亮的二維圖像藤滥,用眼睛觀測它鳖粟?
最直接的度量是歐氏(幾何)距離(“像烏鴉飛過”的一條直線)。另一個是曼哈頓(街區(qū))距離拙绊,就像在城市塊中行走向图。你可以想象,在涉及到 Uber 司機的費用計算的模型中标沪,曼哈頓距離更加實用榄攀。
綠色直線為歐氏距離。藍色直線為曼哈頓距離金句。來源:維基百科
還記得用于尋找直角三角形斜邊長度的畢達哥拉斯(勾股)定理嘛檩赢?
c
為斜邊(上面的綠色直線),a
和b
是兩個直角邊(上面的紅色直線)趴梢。
通過計算a
和b
長度的平方和的平方根漠畜,我們就解出了c
币他,求出了斜邊長度。這里a
和b
是三角形的直角(正交)邊(也就是憔狞,它們互為 90 度角蝴悉,在空間中垂直)。
給定兩個正交方向的向量的情況下瘾敢,求解斜邊長度的思路拍冠,可以推廣到多維。這就是 N 維空間的點p
和q
的歐氏距離d(p,q)
的推導方式:
歐氏距離的公式簇抵,由勾股定理推出庆杜。
使用這個公式,你可以計算所有訓練數(shù)據(jù)點碟摆,到你嘗試標注的數(shù)據(jù)點的鄰近度晃财,并選取 K 個最近鄰的均值或眾數(shù),來做出你的預測典蜕。
通常你不需要手動計算任何距離断盛,用搜索引擎簡單搜索一下,你就能在 NumPy 或者 SciPy 找到預構建的函數(shù)愉舔,會為你做這個事情钢猛,例如,euclidean_dist = numpy.linalg.norm(p-q)
轩缤。但是看到八年級的集合概念如何有助于構建當今的 ML 模型命迈,這很有趣。
選取k
:使用交叉驗證調(diào)優(yōu)超參數(shù)
為了決定我們使用哪個k
火的,你可以測試不同的 KNN 模型壶愤,使用交叉驗證以及k
的不同值。
將你的訓練集分成兩部分卫玖,在一部分上訓練模型公你,將保留的部分用作測試集。
通過將模型的預測(
?
)假瞬,與測試數(shù)據(jù)的真實值(y
)相比陕靠,看看你的模型表現(xiàn)如何。在所有迭代中脱茉,通常選取誤差最小的模型剪芥。
交叉驗證的演示。分塊和迭代的數(shù)量可以修改琴许。
K 的較高值防止過擬合
K 的較高值能防止過擬合税肪,但是如果 K 太高的話,你的模型會有很大偏差,并且不靈活益兄。選取一個極端的示例:如果k=N
(數(shù)據(jù)點的總數(shù))锻梳,模型就失效了,將所有測試數(shù)據(jù)分類為訓練數(shù)據(jù)的均值或者眾數(shù)净捅。
如果動物數(shù)據(jù)集中的單個最常見的動物是蘇格蘭折耳貓疑枯,k=N
(訓練觀測值數(shù)量)的 KNN 會將實際上的每個其它動物預測成它。在 Vishal 看來蛔六,這個很棒荆永,但 Samer 不同意。
完全沒有來由的蘇格蘭折耳貓
.gif
国章。我們可以休息一下具钥。
真實世界中使用 KNN 的地方
一些你可以使用 KNN 的地方:
分類:詐騙檢測。模型可以使用新的訓練樣本馬上更新液兽,因為你僅僅是存儲新的數(shù)據(jù)點骂删,這允許你快速適應新的詐騙方法。
回歸:預測房價四啰。在房價預測中桃漾,字面上的“最近鄰”實際上很好暗示了價格上的相似。KNN 在物理相似性很重要的領域很實用拟逮。
填充缺失的訓練數(shù)據(jù)。如果你的
.csv
中的一列有大量缺失值适滓,你可以通過選取均值或者眾數(shù)填充數(shù)據(jù)敦迄。KNN 可能會給你每個缺失值的更加準確的猜測。
決策樹和隨機森林
制作一顆好的決策樹就像玩“20個問題”的游戲凭迹。
右邊的決策樹描述了泰坦尼克號的生還者規(guī)律罚屋。
決策樹根節(jié)點的第一次分割,就像是 20 個問題中的第一個問題:你打算盡可能干凈地分隔數(shù)據(jù)嗅绸,所以這個分割的信息增益應該最大脾猛。
如果你的朋友說,“我正在想一個名詞鱼鸠,問我 20 個是或不是的問題來猜猜它”猛拴,并且你的第一個問題是“它是土豆嘛?”蚀狰,你就太蠢了愉昆。因為如果它們說“不是”,你沒有獲得任何信息麻蹋。除非你知道你的朋友整天都在想土豆跛溉,或者剛剛在想它,那么你就猜對了。
反之芳室,類似“這是一個物體嘛专肪?”的問題可能更有意義。
這有點類似醫(yī)院分類病人堪侯,或者做出不同的診斷的方式嚎尤。它們先問一些問題,并檢查一些重要的指標來判斷你是否馬上就要掛了抖格,還是不是诺苹。當你進門的時候,它們不會一開始就做切片檢查雹拄,或者檢查你是否得了胰腺癌收奔。
有幾種方式來量化信息增益,以便你能根本上求解訓練集的每個可能的分割滓玖,以及每個分割的信息增益坪哄。你可以用這個方式,盡可能高效地預測每個標簽或值势篡。
現(xiàn)在翩肌,讓我們查看一個特定的數(shù)據(jù)集,并討論我們?nèi)绾芜x擇分割禁悠。
泰坦尼克數(shù)據(jù)集
Kaggle 的泰坦尼克數(shù)據(jù)集大量用于機器學習入門念祭。當泰坦尼克沉沒時,2224 個乘客和乘員中有 1502 個死亡碍侦。雖然包含一些運氣成分粱坤,女人、孩子和頭等艙更有可能生還瓷产。如果你回去看看上面的決策樹站玄,你會看到,它某些程度上反映了性別濒旦、年齡和艙位的變化株旷。
選擇決策樹中的分割
熵是集合中的無序的總數(shù),由基尼系數(shù)和交叉熵度量尔邓。如果值相當混雜晾剖,熵就很大;如果你能干凈地分割數(shù)據(jù)梯嗽,就沒有熵钞瀑。對于父節(jié)點的每個分割,你需要讓子節(jié)點盡可能純粹慷荔,也就是熵最小雕什。例如缠俺,在泰坦尼克中,性別是生還者的重要決定因素贷岸,所以將這個特征用于第一次分割十分有意義壹士,并且它是擁有最大信息增益的特征。
讓我們看一看泰坦尼克的變量:
來源:Kaggle
我們通過選取這些變量之一偿警,以及根據(jù)它分割數(shù)據(jù)集躏救,來構建決策樹。
第一次分割將我們的數(shù)據(jù)集分為男性和女性螟蒸。之后女性分支又按照年齡分割(使熵最小的分割)盒使。與之類似,男性分支按照艙位分割七嫌。通過對新的乘客遍歷這棵樹少办,你可以使用它來猜測它們是否掛了。
泰坦尼克的示例解決了分類問題(生存或者死亡)诵原。如果我們將決策樹用于回歸英妓,例如預測房價,我們可以分割決定房價的最重要的特征绍赛。面積:大于或小于 xxx蔓纠?臥室或者浴室數(shù)量:大于或小于 xxx?
之后吗蚌,在測試期間腿倚,你需要用特定的房子遍歷所有分割,并取葉子節(jié)點的所有房價的均值(最底下的節(jié)點)蚯妇,這些房子就會成為你的售價預測猴誊。
決策樹是高效的,因為它們易于解讀侮措,即使對凌亂的數(shù)據(jù)也很強大,并且一旦訓練完成乖杠,部署的開銷很小分扎。決策樹也擅長于處理混合數(shù)據(jù)(數(shù)值或類別)。
也就是說胧洒,決策樹的訓練開銷很大畏吓,過擬合的風險很大,并且容易找到局部最優(yōu)卫漫,因為它們在分割之后就不能回溯了菲饼。為了解決這些缺陷,我們轉向了一種方式列赎,它演示了將多個決策樹整合為一個模型的力量宏悦。
隨機森林:決策樹的集成
由多個模型整合的模型叫做集成模型,這通常是一個制勝策略。
單個決策樹可能做出很多錯誤判斷饼煞,因為它有很多非黑即白的判斷源葫。隨機森林是個元估計其,它繼承了多個決策樹砖瞧,并擁有一些可觀的改進:
每個節(jié)點上分割的特征數(shù)量限制為總體的一定百分比(這是個可以調(diào)整的超參數(shù)息堂,詳見 scikit-learn 的文檔)。這確保了繼承模型不會過度依賴單個特征块促,并且公平地利用所有潛在的預測性特征荣堰。
每棵樹從原始數(shù)據(jù)集抽取隨機樣本,來生成自己的分割竭翠,這添加了進一步的隨機元素來防止過擬合振坚。
這些改進也防止了樹的高度相關。如果沒有上面的第一條和第二條逃片,每棵樹都是相同的屡拨,因為遞歸的二元分割時決定性的。
為了演示褥实,看看下面的九個決策樹分類器:
這些決策樹分類器可以集成到隨機森林中呀狼,它整合了這些輸入。將橫軸和縱軸看做特征x1
和x2
损离。對于每個特征的特定值哥艇,決策樹輸出“藍色”、“綠色”和“紅色”的分類僻澎。
這些結果通過眾數(shù)(分類)或者均值(回歸)整合為單個集成模型貌踏,它優(yōu)于單個決策樹的輸出。
隨機森林是建模過程的一個非常不錯的起始點窟勃,因為它們對于不整潔的數(shù)據(jù)擁有高容忍度的強大表現(xiàn)祖乳。并且,對于在眾多特征中找到最重要的特征非常實用秉氧。
也有很多機智的繼承模型眷昆,它組合了決策樹并產(chǎn)生非常棒的表現(xiàn)。請查看 XGBoost(eXtreme Gradient Boosting)的示例汁咏。
之后亚斋,我們就完成了監(jiān)督學習的學習
非常不錯。這一節(jié)中我們涉及了:
- 兩個非參數(shù)監(jiān)督學習算法:KNN 和決策樹
- 距離和信息增益的度量
- 隨機森林攘滩,它是集成模型的示例
- 交叉驗證和超參數(shù)調(diào)優(yōu)
我希望帅刊,你現(xiàn)在有了一些可靠的直覺,對于在給定訓練集的情況下漂问,我們?nèi)绾瘟暤?code>f赖瞒,以及使用它和測試數(shù)據(jù)做出預測女揭。
在“第三部分:無監(jiān)督學習”中,我們討論當我們擁有不帶標簽的訓練集時冒黑,如何解決問題田绑。
練習材料和擴展閱讀
2.3a 實現(xiàn) KNN
嘗試這個攻略,在 Python 中從零開始實現(xiàn) KNN抡爹。你可能也打算看一看 scikit-learn 的文檔掩驱,來體驗預構建的實現(xiàn)的工作方式。
2.3b 決策樹
嘗試《An Introduction to Statistical Learning》中的第八章的決策樹實驗冬竟。你可以使用泰坦尼克訓練集來玩玩欧穴,并且查看這個教程,它涵蓋了與上面相同的概念和代碼泵殴。這里是隨機森林的 scikit-learn 實現(xiàn)涮帘,可以在數(shù)據(jù)集上開箱即用。