建立機(jī)器學(xué)習(xí)系統(tǒng)
An Overview of Building a Machine Learning System
前言叨B叨
前兩章對(duì)機(jī)器學(xué)習(xí)的背景以及應(yīng)用場(chǎng)景做了比較詳細(xì)的闡述, 還介紹了一個(gè)關(guān)于機(jī)器學(xué)習(xí)算法的基本概念. 從第三章起會(huì)圍繞機(jī)器學(xué)習(xí)的流程,算法等詳細(xì)鋪開(kāi), 同學(xué)們請(qǐng)系好安全帶.
觀眾朋友們,晚上好,
今天是個(gè)好號(hào),農(nóng)歷不造初幾,歡迎收看新聞聯(lián)播節(jié)目,
首先向您介紹這次新聞的主要內(nèi)容:
1.機(jī)器學(xué)習(xí)中,NumPy, scikit-learn, 和 pandas是怎么一回事
2.向量(Vectors):如何有效地處理大型數(shù)據(jù)集
3.訓(xùn)練有監(jiān)督機(jī)器學(xué)習(xí)模型的基本工作流程
?4.梯度增強(qiáng)(Gradient boosting): 它一個(gè)通用的機(jī)器學(xué)習(xí)算法
下面是詳細(xì)報(bào)道:
1. NumPy, scikit-learn, 和潘大師(pandas)
Python是機(jī)器學(xué)習(xí)中使用最廣泛的編程語(yǔ)言之一企蹭。除了簡(jiǎn)單易用之外帖烘,Python之所以非常流行因?yàn)樗性S多hen很棒的機(jī)器學(xué)習(xí)庫(kù)。我們將用到三個(gè)最流行的庫(kù): 首先,我們將使用numpy代兵。NumPy是一個(gè)庫(kù)笛园,利用它你可以處理大型數(shù)據(jù)集以及內(nèi)存操作兜挨。它是免費(fèi)的退唠、開(kāi)源的箩艺,而且在硅谷之類(lèi)的IT行業(yè)應(yīng)用相當(dāng)廣泛。它是許多其他機(jī)器學(xué)習(xí)庫(kù)的基礎(chǔ)宪萄。接下來(lái)艺谆,我們將使用scikit-learn。scikit-learn是一個(gè)非常受歡迎的機(jī)器學(xué)習(xí)庫(kù)拜英。
你可以把它看作是機(jī)器學(xué)習(xí)中的瑞士軍刀静汤。它提供了許多最流行的機(jī)器學(xué)習(xí)算法并且很容易使用。最后聊记,我們還將使用pandas撒妈。pandas允許您將數(shù)據(jù)表示為一個(gè)可以用代碼控制的虛擬電子表格。它有許多類(lèi)似微軟Excel的功能排监,比如快速編輯和計(jì)算等等狰右。它能夠輕松的處理CSV數(shù)據(jù)文件。pandas的名字來(lái)自“panel data”一詞(和我們的大熊貓不搭噶哈)舆床,因?yàn)樗涯愕臄?shù)據(jù)表示成一系列的面板棋蚌,就像電子表格中的頁(yè)面一樣。
令人欣慰的是, 所有這些庫(kù)都完美地協(xié)同工作挨队。NumPy提供數(shù)據(jù)加載和數(shù)據(jù)處理的基本工作谷暮,pandas則使得數(shù)據(jù)更容易清理及易于計(jì)算. 基于處理過(guò)的數(shù)據(jù), 然后由scikit-learn提供實(shí)際的機(jī)器學(xué)習(xí)算法來(lái)執(zhí)行。
2. 向量(Vectors):如何有效地處理大型數(shù)據(jù)集
在機(jī)器學(xué)習(xí)中盛垦,我們經(jīng)常使用大數(shù)據(jù)數(shù)組湿弦。由于機(jī)器學(xué)習(xí)的線(xiàn)性代數(shù)根(linear algebra roots),這些數(shù)組有時(shí)被稱(chēng)為單個(gè)數(shù)據(jù)列的向量和較大數(shù)組的向量腾夯。讓我們看看如何在代碼中使用向量颊埃。讓我們打開(kāi)vecotors pt1.py。
這里有一個(gè)簡(jiǎn)單的數(shù)組蝶俱,或者向量班利,表示訓(xùn)練數(shù)據(jù)集中每套房的面積。當(dāng)我們訓(xùn)練機(jī)器學(xué)習(xí)算法時(shí)榨呆,我們經(jīng)常需要在訓(xùn)練數(shù)據(jù)集中的每一行應(yīng)用相同的數(shù)學(xué)運(yùn)算罗标。例如,假設(shè)我們要將每個(gè)面積乘以0.3的權(quán)重积蜻。
完成這個(gè)事情最高效的方法是什么闯割?在傳統(tǒng)的編程中,標(biāo)準(zhǔn)的解決方案是每次一行遍歷數(shù)組竿拆,一個(gè)for循環(huán)搞定宙拉。讓我們運(yùn)行代碼并檢查輸出。在控制臺(tái)中如输,我們可以看到它在得到最終結(jié)果之前對(duì)數(shù)組進(jìn)行了13次獨(dú)立的更新。這樣做是沒(méi)毛病的,但每次在數(shù)組中一個(gè)元素上對(duì)每個(gè)元素進(jìn)行乘法實(shí)際上效率很低不见。如今的CPU有能力并行批量操作澳化。
這種能力稱(chēng)為單指令、多數(shù)據(jù)或SIMD稳吮。而不是一次一個(gè)地遍歷每個(gè)數(shù)組元素缎谷,CPU可以將數(shù)組塊加載到內(nèi)存中,并在一步中完成該塊上的所有乘法操作灶似。這在處理大型數(shù)組時(shí)速度會(huì)產(chǎn)生巨大的差異列林。讓我們來(lái)看看代碼vecotors pt2.py。
我們不使用循環(huán)來(lái)處理數(shù)組酪惭,而是使用一個(gè)數(shù)組庫(kù)希痴,它知道如何并行處理數(shù)據(jù)。NumPy可以在內(nèi)存中非常高效地創(chuàng)建數(shù)組, 然后會(huì)自動(dòng)并行化春感。
因此砌创,我們不使用for循環(huán),我們的代碼看起來(lái)如下所示鲫懒。
首先我們創(chuàng)建的數(shù)組作為NumPy數(shù)組而不是作為一個(gè)正常的Python數(shù)組嫩实。然后我們會(huì)將整個(gè)數(shù)組乘以0.3。當(dāng)我們告訴NumPy要把一個(gè)數(shù)組乘以一個(gè)單個(gè)的數(shù)字時(shí)窥岩,NumPy會(huì)將此操作分別應(yīng)用于數(shù)組中的每一個(gè)元素甲献。讓我們來(lái)運(yùn)行代碼看看效果。
哪種方法更高效?相信群眾的眼睛是雪亮的颂翼。
但更重要的是晃洒,NumPy自動(dòng)利用CPU的SIMD功能,增加并聯(lián)陣列塊疚鲤。我們得到與使用for循環(huán)相同的結(jié)果锥累,但我們不需要經(jīng)歷這么多步驟。你在陣列上需要做的大部分操作都可以并行完成集歇。這包括簡(jiǎn)單的操作比如加法桶略,減法,乘法诲宇,和除法际歼,甚至更復(fù)雜的操作,如正弦和余弦姑蓝。這就是所謂的矢量化我們的代碼鹅心。我們用可并行執(zhí)行的向量操作代替迭代循環(huán)。這是非常重要的一點(diǎn)纺荧。
如果你發(fā)現(xiàn)自己為數(shù)組寫(xiě)了一個(gè)for循環(huán)旭愧,那么你可能out了颅筋。相反,你應(yīng)該使用numpy來(lái)操作整個(gè)數(shù)組输枯。
3. 訓(xùn)練有監(jiān)督機(jī)器學(xué)習(xí)模型的基本工作流程
讓我們?yōu)g覽基本的工作流來(lái)訓(xùn)練有監(jiān)督的機(jī)器學(xué)習(xí)模型议泵。不管使用哪種有監(jiān)督的機(jī)器學(xué)習(xí)算法,基本過(guò)程都是一樣的桃熄。我們將在課程的后面更詳細(xì)地介紹這個(gè)工作流的每一步先口,但是在深入了解細(xì)節(jié)之前,了解基本的工作流是非常有幫助的瞳收。
使用機(jī)器學(xué)習(xí)的第一步是獲取數(shù)據(jù)碉京。對(duì)于我們預(yù)測(cè)房屋價(jià)格的項(xiàng)目,我們將收集一年內(nèi)所有在一個(gè)地區(qū)銷(xiāo)售的房屋的數(shù)據(jù)螟深。對(duì)于每一個(gè)出售的房子谐宙,我們會(huì)盡可能多地收集,比如臥室的數(shù)量血崭,房子的大小等等卧惜。下一步是清理和預(yù)處理數(shù)據(jù)。
我們開(kāi)始使用的數(shù)據(jù)幾乎總是需要先處理一下夹纫,然后才能用于機(jī)器學(xué)習(xí)咽瓷。我們將詳細(xì)介紹這一點(diǎn),但基本思想是:將任何基于文本的數(shù)據(jù)轉(zhuǎn)換成數(shù)字舰讹,并選擇哪些數(shù)據(jù)最有用以包含在模型中茅姜。接下來(lái),我們將獲取所有的數(shù)據(jù)月匣,并對(duì)數(shù)據(jù)的順序進(jìn)行亂序排列钻洒。
我們希望確保數(shù)據(jù)是隨機(jī)的,這樣機(jī)器學(xué)習(xí)算法就不會(huì)因?yàn)閿?shù)據(jù)恰好符合某個(gè)特定的順序,而在不存在的模式上拾取數(shù)據(jù)锄开。下一步素标,我們將得到經(jīng)過(guò)處理的數(shù)據(jù),并將其分成兩組萍悴,通常是第一組數(shù)據(jù)的70%行头遭,第二組中的30%行。
前70%的數(shù)據(jù)是我們用來(lái)訓(xùn)練模型的癣诱。這稱(chēng)為我們的訓(xùn)練數(shù)據(jù)集计维。機(jī)器學(xué)習(xí)模型將僅基于此數(shù)據(jù)創(chuàng)建。最后30%的數(shù)據(jù)是我們的測(cè)試數(shù)據(jù)撕予。這些數(shù)據(jù)將不用于訓(xùn)練模型鲫惶,而是用于檢查模型的準(zhǔn)確性。同樣非常重要的是实抡,我們也不用訓(xùn)練數(shù)據(jù)來(lái)檢查模型的準(zhǔn)確性∏纺福現(xiàn)在我們有了干凈的欢策、經(jīng)過(guò)調(diào)整的、拆分的數(shù)據(jù)赏淌,我們已經(jīng)準(zhǔn)備好訓(xùn)練機(jī)器學(xué)習(xí)模型了猬腰。但是每一個(gè)機(jī)器學(xué)習(xí)算法都需要設(shè)置一些參數(shù)。這些參數(shù)將控制諸如模型如何學(xué)習(xí)模式和數(shù)據(jù)的速度以及模式的復(fù)雜程度猜敢。
這些被稱(chēng)為超參數(shù)(hyperparameters)設(shè)置。然后盒延,通過(guò)訓(xùn)練數(shù)據(jù)和期望輸出來(lái)訓(xùn)練機(jī)器學(xué)習(xí)模型缩擂。
當(dāng)模型被訓(xùn)練時(shí),我們需要檢查它對(duì)測(cè)試數(shù)據(jù)集的準(zhǔn)確性添寺。這證明了該模型在新數(shù)據(jù)上是否有效胯盯,或者只適用于訓(xùn)練數(shù)據(jù)。如果它能夠預(yù)測(cè)測(cè)試數(shù)據(jù)集的精確值计露,就意味著該模型已經(jīng)可以使用了博脑。如果它不能預(yù)測(cè)測(cè)試數(shù)據(jù)集的精確值,我們需要再試一次票罐。
我們可以改變我們給模型的訓(xùn)練數(shù)據(jù)叉趣,或改變模型的參數(shù)直到我們得到我們想要的結(jié)果。
最后该押,一旦模型被訓(xùn)練和評(píng)估疗杉,我們就可以使用它。我們可以對(duì)新數(shù)據(jù)進(jìn)行反饋蚕礼,這將給我們提供新的預(yù)測(cè)烟具。
4. 梯度增強(qiáng)(Gradient boosting): 一個(gè)通用的機(jī)器學(xué)習(xí)算法
在本節(jié)中,我們將學(xué)習(xí)梯度增強(qiáng)算法奠蹬,這是一種強(qiáng)大的機(jī)器學(xué)習(xí)算法朝聋,在許多不同種類(lèi)的現(xiàn)實(shí)問(wèn)題中都能起到很好的作用。它可以處理復(fù)雜的模式和線(xiàn)性模型無(wú)法處理的數(shù)據(jù)囤躁。梯度增強(qiáng)是一種集成學(xué)習(xí)算法冀痕。集成學(xué)習(xí)算法使用了許多簡(jiǎn)單的機(jī)器學(xué)習(xí)模型,這些模型可以比任何單獨(dú)的模型本身更精確地解決問(wèn)題割以。梯度提升的基本數(shù)據(jù)結(jié)構(gòu)是一個(gè)決策樹(shù)金度。決策樹(shù)是一個(gè)模型,其中有分支決策點(diǎn)严沥,并通過(guò)跟蹤樹(shù)的路徑確定最終值猜极。
一個(gè)簡(jiǎn)單的決策樹(shù)如下所示。
這個(gè)決策樹(shù)有一個(gè)決策點(diǎn)消玄。如果房子超過(guò)1000平方英尺跟伏,它預(yù)測(cè)房子應(yīng)該增加額外的50000美元丢胚。如果是小的,那么減少50000美元受扳。為了創(chuàng)建更多的細(xì)微預(yù)測(cè)携龟,我們可以向決策樹(shù)添加第二層,并有更多的決策點(diǎn)勘高。
現(xiàn)在這個(gè)模型有點(diǎn)精細(xì)了峡蟋。真正的小房子還有50000美元的減少,而真正大的房子則增加了150000美元华望。
這是一個(gè)很好的開(kāi)端蕊蝗,但要對(duì)各種戶(hù)型的價(jià)值進(jìn)行建模,需要進(jìn)一步增加模型的復(fù)雜性赖舟。有兩種方法可以使這個(gè)模型更加復(fù)雜蓬戚。第一種方法是在決策樹(shù)中添加層和分支,直到它對(duì)數(shù)據(jù)集中的每一個(gè)單元進(jìn)行建模宾抓。
我們可能會(huì)得到一個(gè)決策樹(shù)子漩,它有數(shù)百層,有成千上萬(wàn)條分支路徑石洗。事實(shí)證明幢泼,創(chuàng)建非常復(fù)雜的決策樹(shù)通常在實(shí)踐中不起作用。大的決策樹(shù)往往不能很好地利用新的數(shù)據(jù)讲衫。第二種方法是創(chuàng)建許多單獨(dú)的簡(jiǎn)單決策樹(shù)旭绒,并將每個(gè)決策樹(shù)的輸出組合起來(lái)得到最終結(jié)果。
這是集合方法焦人。每一棵樹(shù)都會(huì)通過(guò)看問(wèn)題的一個(gè)小方面來(lái)做出最后的回答挥吵。這有點(diǎn)像問(wèn)你所有的朋友同樣的問(wèn)題,并把他們所有的答案結(jié)合起來(lái)花椭,拿出最好的最終答案忽匈。梯度增強(qiáng)有一個(gè)技巧,它不創(chuàng)建獨(dú)立建模數(shù)據(jù)的多個(gè)決策樹(shù),而是創(chuàng)建相互建立的決策樹(shù)矿辽。每個(gè)新樹(shù)的目標(biāo)是修復(fù)前面樹(shù)的最大錯(cuò)誤丹允。
讓我們來(lái)看看這是如何在實(shí)際數(shù)據(jù)中工作的。這是一張房屋價(jià)格圖袋倔,根據(jù)每平方英尺的面積有多大雕蔽。
每一個(gè)藍(lán)點(diǎn)代表一個(gè)真正的房子。你可以看到宾娜,大小和價(jià)值之間存在著明顯的關(guān)系批狐。粗略地說(shuō),較大的房子更貴。我們的目標(biāo)是使用梯度增強(qiáng)來(lái)建立這種關(guān)系模型嚣艇。在算法的第一步承冰,它將創(chuàng)建一個(gè)只有幾個(gè)分支的簡(jiǎn)單決策樹(shù)。這條橙色線(xiàn)顯示了根據(jù)其大小和平方英尺分配給一所房子的決策樹(shù)的值食零。第一個(gè)決策樹(shù)非常簡(jiǎn)單困乒。1500平方英尺以下的房子價(jià)值不到10000美元,2200平方英尺以上的房子價(jià)值10000美元贰谣,而2700平方英尺以上的房子則價(jià)值10000美元娜搂。
第一個(gè)決策樹(shù)捕獲了一點(diǎn)模式,但在上下極端都不是很準(zhǔn)確吱抚。它的小房子和低估值的大房子∮抗ィ現(xiàn)在,梯度增強(qiáng)算法將添加第二個(gè)決策樹(shù)频伤。但是當(dāng)它創(chuàng)建第二棵樹(shù)時(shí),它會(huì)特別地減少第一棵樹(shù)錯(cuò)誤的地方芝此。下面是第二個(gè)決策樹(shù)添加時(shí)的線(xiàn)條憋肖。
您可以看到第二個(gè)決策樹(shù)增加了三個(gè)決策點(diǎn)。通過(guò)給小房子額外的價(jià)格處罰和大房子額外的刺激婚苹,這兩個(gè)決策樹(shù)組合做一個(gè)稍微好一點(diǎn)的整體工作的數(shù)據(jù)擬合岸更。
讓我們結(jié)合這個(gè)過(guò)程并添加20個(gè)決策樹(shù),每一個(gè)都改進(jìn)以前樹(shù)的錯(cuò)誤〔采現(xiàn)在我們有了一條很好地跟蹤數(shù)據(jù)的行怎炊。這是一個(gè)很好的模型,我們可以用來(lái)預(yù)測(cè)房?jī)r(jià)的平方米廓译,但現(xiàn)在讓我們繼續(xù)75次迭代评肆。
現(xiàn)在,該行開(kāi)始彎曲和扭曲非区,以跟蹤數(shù)據(jù)集中的特定離群值瓜挽。這是過(guò)度擬合(overfitting)。我們讓我們的機(jī)器學(xué)習(xí)模型變得太復(fù)雜了征绸,它開(kāi)始模擬真正不存在的劇烈的價(jià)格波動(dòng)久橙。在以后的課程我們會(huì)談?wù)撨^(guò)如何避免。
結(jié)語(yǔ)
如有錯(cuò)誤請(qǐng)高手指正.
你的 關(guān)注-收藏-轉(zhuǎn)發(fā) 是我繼續(xù)分享的動(dòng)力!