Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记1 — 机器学习基础知识简介
紅色石頭的個人網(wǎng)站:redstonewill.com
本章介紹的是每一個數(shù)據(jù)科學(xué)家都應(yīng)該知道并聽說的機(jī)器學(xué)習(xí)許多基本的概念和術(shù)語。這將是一個高層次的概括(本書唯一沒有很多代碼的一章)。內(nèi)容很簡單,但是你要保證在進(jìn)行下一章之前對本章每個概念都理解得很透徹。因此,端起一杯咖啡,讓我們開始吧!
1 什么是機(jī)器學(xué)習(xí)?
機(jī)器學(xué)習(xí)是一門通過編程從而在數(shù)據(jù)中學(xué)習(xí)的科學(xué)技術(shù),或者稱之為藝術(shù)。
這里有一個更一般的定義:
在不直接針對問題進(jìn)行編程的情況下,賦予計算機(jī)學(xué)習(xí)能力的一個研究領(lǐng)域。 —— Arthur Samuel, 1959
另外一個更加工程化的定義:
對于某類任務(wù)T和性能度量P,如果計算機(jī)程序在T上以P衡量的性能隨著經(jīng)驗E而自我完善,那么就稱這個計算機(jī)程序從經(jīng)驗E學(xué)習(xí)。 —— Tom Mitchell, 1997
例如垃圾郵件過濾系統(tǒng)就是一個機(jī)器學(xué)習(xí)程序,可以用來區(qū)分垃圾郵件和非垃圾郵件。機(jī)器學(xué)習(xí)系統(tǒng)用來學(xué)習(xí)的樣本稱之為訓(xùn)練樣本(training set),每個訓(xùn)練樣本稱之為訓(xùn)練實例(training instance)或樣本。在這個例子中,任務(wù) T 就是要對新郵件進(jìn)行區(qū)分,經(jīng)驗 E 就是訓(xùn)練數(shù)據(jù),性能度量 P 需要定義,例如使用分類正確的郵件所占的比例。這種度量方式稱之為準(zhǔn)確率(accuracy),經(jīng)常應(yīng)用在分類問題中。
2 為什么使用機(jī)器學(xué)習(xí)?
我們先來思考,使用傳統(tǒng)編程技術(shù)如何區(qū)分垃圾郵件和非垃圾郵件呢?(如下圖所示)
1.首先你應(yīng)該考慮典型的垃圾郵件具有什么特點。例如在郵件的主題中包含了“4U”、“信用卡”、“免費”等詞語。又或者是在郵件的發(fā)件人、郵件內(nèi)容中有一些垃圾郵件常出現(xiàn)的特定的詞語等。
2.然后你就可以對這些情況編寫垃圾郵件檢測算法,若一定數(shù)量的詞匯檢測到了,則可以判定是垃圾郵件。
3.最后驗證程序,重復(fù) 1 和 2,直到檢測算法的準(zhǔn)確率足夠高。
因為這個問題并不簡單,你按照上面思路編寫的程序可能很復(fù)雜、冗長,而且很難把控。
對比而言,同樣是垃圾郵件分類,機(jī)器學(xué)習(xí)可以自動從垃圾郵件和非垃圾郵件中檢測出哪些單詞是經(jīng)常出現(xiàn)在垃圾郵件中的(如下圖所示),而不需要人為指出出現(xiàn)哪些單詞可能就是垃圾郵件。這樣使得問題更加簡化、容易掌控,而且分類的準(zhǔn)確率更高。
而且,如果給你發(fā)垃圾郵件的人知道了他們的關(guān)鍵詞“4 U”被鎖定的話,他們可能會把這個關(guān)鍵詞替換成“For U”。如果使用傳統(tǒng)編程技術(shù),就要針對“For U”重新編寫程序。那么,垃圾郵件關(guān)鍵詞每次替換,都需要重新針對新的關(guān)鍵詞改寫程序,相當(dāng)麻煩。
而機(jī)器學(xué)習(xí)則不用這么麻煩,只需將新的郵件樣本交給模型,機(jī)器會自動檢測出哪些單詞是可能出現(xiàn)在垃圾郵件中的。整個過程不需要人工排查和干預(yù)(如下圖所示)。
機(jī)器學(xué)習(xí)強(qiáng)大的另一個原因是,某些問題非常復(fù)雜,傳統(tǒng)編程很難有較好的方案去解決。例如語音識別、圖像識別,使用傳統(tǒng)人工編程方式來解決效率低而且準(zhǔn)確率不高。相比之下,最好的解決方法就是使用機(jī)器學(xué)習(xí),給出足夠多的數(shù)據(jù),讓機(jī)器自己去學(xué)習(xí),得到較高的識別率。
最后,機(jī)器學(xué)習(xí)還可以幫助人們?nèi)W(xué)習(xí)(如下圖所示)。為什么這樣說呢?因為 ML 算法可以從數(shù)據(jù)中提取出有用和關(guān)鍵的信息。例如垃圾郵件分類,經(jīng)過好的訓(xùn)練得到的 ML 模型能夠揭示出哪些單詞或者哪些單詞的組合是預(yù)測為垃圾郵件最重要的特征參考。機(jī)器得到的這些信息可以幫助人們更好地揭示問題的本質(zhì),從而更好地解決問題。
將 ML 技術(shù)應(yīng)用到大數(shù)據(jù)中,挖掘數(shù)據(jù)本身蘊(yùn)含的規(guī)律和模式,這就是 數(shù)據(jù)挖掘。
總結(jié)下來,機(jī)器學(xué)習(xí)的強(qiáng)大之處體現(xiàn)在以下幾個方面:
-
傳統(tǒng)的編程方式解決問題通常需要人工調(diào)試、建立冗長規(guī)則,而機(jī)器學(xué)習(xí)算法可以極大地簡化代碼且性能更好。
-
對于某些復(fù)雜問題,例如語音識別、圖像識別,傳統(tǒng)編程沒有一個較好的解決方案,而機(jī)器學(xué)習(xí)通常表現(xiàn)得很好。
-
機(jī)器學(xué)習(xí)系統(tǒng)可以自適應(yīng)新的數(shù)據(jù),只需采集新的數(shù)據(jù),重新訓(xùn)練 ML 模型即可。
-
機(jī)器學(xué)習(xí)可以揭示復(fù)雜問題和大數(shù)據(jù)內(nèi)在規(guī)律和特性。
3 機(jī)器學(xué)習(xí)類型
機(jī)器學(xué)習(xí)類型可以按照不同的方式來劃分,具體表現(xiàn)在:
-
是否需要人類的監(jiān)督:監(jiān)督式學(xué)習(xí)、非監(jiān)督式學(xué)習(xí)、半監(jiān)督式學(xué)習(xí)、強(qiáng)化學(xué)習(xí)
-
是否可以在線上進(jìn)行學(xué)習(xí):在線學(xué)習(xí)、批量學(xué)習(xí)
-
是否可以簡單地把新的數(shù)據(jù)集與已知數(shù)據(jù)集進(jìn)行比較得出結(jié)果,還是從訓(xùn)練集中檢測模式再建立預(yù)測模型:基于實例學(xué)習(xí)、基于模型學(xué)習(xí)。
當(dāng)然以上這些劃分方式并不是各自獨立的,可以相互結(jié)合。例如一個垃圾郵件檢測系統(tǒng),可以是在線的、基于神經(jīng)網(wǎng)路模型的監(jiān)督式學(xué)習(xí)。
接下來我們詳細(xì)看看這些機(jī)器學(xué)習(xí)類型。
3.1 監(jiān)督式/非監(jiān)督式學(xué)習(xí)
機(jī)器學(xué)習(xí)可以根據(jù)再訓(xùn)練過程中受到的監(jiān)督類型和程度進(jìn)行劃分,類型包括:監(jiān)督式學(xué)習(xí)、非監(jiān)督式學(xué)習(xí)、半監(jiān)督式學(xué)習(xí)、強(qiáng)化學(xué)習(xí)。
監(jiān)督式學(xué)習(xí)
監(jiān)督式學(xué)習(xí),訓(xùn)練集包含了樣本的輸出,即 label(如下圖所示)。
一個典型的監(jiān)督式學(xué)習(xí)就是分類問題,例如垃圾郵件分類,通過對郵件內(nèi)容包括它們對應(yīng)的標(biāo)簽(垃圾、非垃圾)進(jìn)行訓(xùn)練。最終得到的模型對新的郵件進(jìn)行預(yù)測,判斷它是不是垃圾郵件。
另一個典型的監(jiān)督式學(xué)習(xí)就是回歸問題(如下圖所示),例如汽車價格預(yù)測,通過對汽車特征(商標(biāo)、車齡等)包括它們對應(yīng)的價格進(jìn)行訓(xùn)練。最終得到的模型對新的汽車進(jìn)行預(yù)測,得到它的價格。
值得注意的是,有些回歸算法也可以用于分類,反之亦然。例如邏輯回歸(Logistic Regression)常用于分類,然而它也可以輸出對應(yīng)該類別的概率(例如得到垃圾郵件的概率是 20%)。
下面列舉一些最常見的監(jiān)督式學(xué)習(xí)算法:
-
k-近鄰
-
線性回歸
-
邏輯回歸
-
支持向量機(jī)
-
決策樹和隨機(jī)森林
-
神經(jīng)網(wǎng)路
非監(jiān)督式學(xué)習(xí)
非監(jiān)督式學(xué)習(xí),顧名思義,訓(xùn)練集是沒有輸出 label 的(如下圖所示)。
下面列舉一些最常見的非監(jiān)督式學(xué)習(xí)算法:
-
聚類
—— k-均值
—— 層次聚類分析(HCA)
—— 最大期望算法(EM)
-
可視化和降維
—— 主成分分析(PCA)
—— 核 PCA
—— 局部線性嵌入(LLE)
—— t分布隨機(jī)鄰居嵌入(t-SNE)
-
關(guān)聯(lián)規(guī)則學(xué)習(xí)
—— Apriori
—— Eclat
例如現(xiàn)在你掌握了你的博客訪客信息,想使用聚類算法對這些訪客進(jìn)行分組(如下圖所示)。你不需要告訴算法每個訪客應(yīng)該屬于哪一組,聚類算法會自己分析和判斷。比如訪客中有 40% 是男性,喜歡看漫畫書,訪問博客的時間經(jīng)常是晚上;20% 是年輕的科幻迷,訪問博客的時間經(jīng)常是周末,等等。如果你使用層次聚類分析,會對每個組劃分得更細(xì)。
可視化算法(visualizationv algorithm)也是非監(jiān)督式學(xué)習(xí)的好例子。它能夠把高緯的復(fù)雜且沒有標(biāo)簽的樣本數(shù)據(jù)在 2D 或 3D 空間中展示出來,便于作圖(如下圖所示)。這些算法盡可能保存原始數(shù)據(jù)足夠多的結(jié)構(gòu)信息(例如可視化的時候避免原始輸入空間不同類別的樣本發(fā)生重疊)。這有助于我們理解不同類別之間的近似程度。
一個相關(guān)的算法叫做降維(dimensionality reduction)。目的是簡化數(shù)據(jù)但是不能損失太多信息。常用的思路就是講相似特征合并成一個。例如汽車的里程數(shù)和它的車齡關(guān)系較為密切,降維算法就是把這兩個特征合并成一個特征來表征汽車的磨損程度。這種做法就是特征提取。降維的好處是減少特征個數(shù),讓算法運行更快,減小了計算成本和存儲空間成本。更重要的是,降維可以消除一些噪聲影響,提升算法性能。
還有一個非監(jiān)督式學(xué)習(xí)的例子就是異常檢測(anomaly detection)。例如檢測不正常的信用卡交易來避免詐騙,捕獲人工制造缺陷,或者剔除數(shù)據(jù)集中的異常點以便傳替給后面的機(jī)器學(xué)習(xí)算法。異常檢測算法是使用正常數(shù)據(jù)集進(jìn)行訓(xùn)練的,得到的模型對新的樣本進(jìn)行測試,判斷它是不是異常點(如見圖所示)。
最后一個非監(jiān)督式學(xué)習(xí)的例子就是關(guān)聯(lián)規(guī)則學(xué)習(xí)(association rule learning),目標(biāo)就是挖掘大量數(shù)據(jù)中不同屬性之前的聯(lián)系。例如,通過對超市用戶購買商品歷史記錄的分析,發(fā)現(xiàn)購買燒烤醬和土豆薯片的用戶也傾向于購買牛排。因此,基于此分析,超市老板就可以把這些用戶可能會一起買的商品放在相近的貨架上,方便用戶購買。
半監(jiān)督式學(xué)習(xí)
半監(jiān)督式學(xué)習(xí),簡單地說就是訓(xùn)練集大多數(shù)樣本沒有 label,只有少量樣本有 label。例如一些照片托管服務(wù),例如谷歌照片,就是一個例子。一旦你把所有家庭照片上傳到服務(wù)器之后,云端算法會自動識別出每個家庭成員出現(xiàn)在哪些照片中,例如 A 出現(xiàn)在照片 1、3、5、6 中, B 出現(xiàn)在照片 2、3、5、8 中,這是一個非監(jiān)督式學(xué)習(xí)的過程(聚類)。現(xiàn)在你要做的就只是告訴機(jī)器每個人的名字(相當(dāng)于 label),即標(biāo)注 A、B 等分別叫什么名字(監(jiān)督式)。然后,機(jī)器就可以根據(jù)你給的 label,把每張照片中的每個人都標(biāo)注上名字,即 label。也就是說,通過標(biāo)注少量的樣本,然后根據(jù)聚類算法,把所有樣本的 label 都自動加上了。
大多數(shù)半監(jiān)督式學(xué)習(xí)都是監(jiān)督式學(xué)習(xí)和非監(jiān)督式學(xué)習(xí)相結(jié)合的。例如深度置信網(wǎng)絡(luò)(DBNs),其基礎(chǔ)構(gòu)建模型為受限玻爾茲曼機(jī)(RBMs)。RBMs 的訓(xùn)練過程是非監(jiān)督式學(xué)習(xí),但是整個 DBNs 系統(tǒng)是使用監(jiān)督式學(xué)習(xí)調(diào)優(yōu)的。
強(qiáng)化學(xué)習(xí)
強(qiáng)化學(xué)習(xí)相對來說比較難一些。如下圖所示,假設(shè)一個學(xué)習(xí)系統(tǒng) Agent 可以觀察環(huán)境,并做出相應(yīng)的行為,然后得到相應(yīng)的反饋。正確的行為得到獎勵,錯誤的行為得到懲罰。Agent 必須自我學(xué)習(xí)最佳策略是什么,來即時獲得最多的正反饋,從而實現(xiàn)學(xué)習(xí)的目的。策略定義為 Agent 在一個給定情境中需要做出的即時行為。
上面這張圖生動形象地解釋了強(qiáng)化學(xué)習(xí)。機(jī)器人 Agent 面臨的狀況是發(fā)生火災(zāi),這時候,它必須進(jìn)行決策,是選擇接近火源,還是接水救火?這由 Agent 自己決定。如果 Agent 直接接近火源,那么就會得到懲罰(負(fù)反饋)。通過這樣的訓(xùn)練,讓 Agent 自己知道避免懲罰就必須遠(yuǎn)離火源,而做出取水救火的策略。強(qiáng)化學(xué)習(xí)可以類比成訓(xùn)練寵物的過程,比如我們要訓(xùn)練狗狗坐下,但是狗狗無法直接聽懂我們的指令的。在訓(xùn)練過程中,我們根據(jù)狗狗的行為做出相應(yīng)的反饋,如果它表現(xiàn)得好,我們就給他獎勵,如果它做跟指令完全無關(guān)的動作,我們就給它小小的懲罰。這樣不斷修正狗狗的動作,最終能讓它按照我們的指令來行動。
強(qiáng)化學(xué)習(xí)非常強(qiáng)大,我們熟悉的 AlphaGo 就是強(qiáng)化學(xué)習(xí)的典型代表。2016 年,AlphaGo 戰(zhàn)敗了世界圍棋冠軍李世石。它就是通過分析數(shù)百萬場圍棋比賽,從中學(xué)習(xí)到贏的策略,然后跟自己進(jìn)行很多長比賽。經(jīng)過這樣的訓(xùn)練和學(xué)習(xí),最終 AlphaGo 成為了一名圍棋頂尖高手。
3.2 批量學(xué)習(xí)和在線學(xué)習(xí)
機(jī)器學(xué)習(xí)類型另一種分類方式是根據(jù)是否可以對新添加的數(shù)據(jù)進(jìn)行在線的即時學(xué)習(xí)。如果可以的話就叫在線學(xué)習(xí)(online learning),如果是離線的話就叫批量學(xué)習(xí)(batch learning)。
批量學(xué)習(xí)
批量學(xué)習(xí)不是即時學(xué)習(xí),它是將所有的訓(xùn)練數(shù)據(jù)一起訓(xùn)練,這會花費很多時間和計算資源,所以一般只能用離線的方式訓(xùn)練。模型一旦訓(xùn)練完成,就上線發(fā)布,使用固定的模型工作,所以也常稱為離線學(xué)習(xí)(offline learning)。
這時候如果有新的數(shù)據(jù)產(chǎn)生,想要得到新的模型必須把新的數(shù)據(jù)和之前的數(shù)據(jù)結(jié)合起來,再次重新離線訓(xùn)練機(jī)器學(xué)習(xí)模型,最后上線發(fā)布。
批量學(xué)習(xí)比較簡單也是最常見的機(jī)器學(xué)習(xí)類型。但是,一次完整的訓(xùn)練過程可能會花費很多時間,甚至幾天、一個星期都有可能。如果機(jī)器學(xué)習(xí)系統(tǒng)更新數(shù)據(jù)很頻繁,那么使用這種離線方式訓(xùn)練就比較麻煩,成本很大,需要不停地整合數(shù)據(jù)、離線訓(xùn)練、發(fā)布模型。這種情況下,批量學(xué)習(xí)并不是一個好方法。
而且,訓(xùn)練整個數(shù)據(jù)集需要很多的計算資源(例如 CPU/GPU、內(nèi)存、存儲、IO、網(wǎng)絡(luò)等)。特別是再數(shù)據(jù)量很大的情況下,其消耗的資源和成本是巨大的。這時候,一般不建議使用批量學(xué)習(xí)模型。
最后,如果你的系統(tǒng)需要能夠自主學(xué)習(xí),且資源有限(例如手機(jī) App),那么攜帶大量數(shù)據(jù)、消耗大量資源,每天花費數(shù)小時來進(jìn)行模型訓(xùn)練是不太現(xiàn)實的。
在線學(xué)習(xí)
在線學(xué)習(xí)可以即時地重新訓(xùn)練模型,當(dāng)新的數(shù)據(jù)點或者小批量(mini-batches)數(shù)據(jù)傳給模型的時候,模型立即根據(jù)新數(shù)據(jù)重新訓(xùn)練。整個過程快速而且成本低。這是一種在線學(xué)習(xí)的方式,如下圖所示。
在線學(xué)習(xí)對于那些持續(xù)接受數(shù)據(jù)(例如,股票價格)并且需要快速更新或自主學(xué)習(xí)的系統(tǒng)非常有用。如果你的計算資源有限,在線學(xué)習(xí)也是一個不錯的選擇:一旦在線學(xué)習(xí)系統(tǒng)了學(xué)習(xí)了新的數(shù)據(jù)實例,它就不再需要它們了,因此可以丟棄(除非您想要回滾到以前的狀態(tài)并“重播”數(shù)據(jù))。這樣可以節(jié)省大量的空間。
在線學(xué)習(xí)算法也可以應(yīng)用于當(dāng)數(shù)據(jù)集很大,機(jī)器內(nèi)存不夠的時候進(jìn)行模型訓(xùn)練(稱為核外學(xué)習(xí),out of core learning)。做法是把整個數(shù)據(jù)集切分成許多小批量(mini-batches)樣本,依次對每個小批量樣本進(jìn)行訓(xùn)練,重復(fù)進(jìn)行,直到整個數(shù)據(jù)集完成訓(xùn)練(如下圖所示)。值得注意的是,整個過程一般是離線進(jìn)行的,所以在線學(xué)習(xí)這個名字可能有點讓人疑惑,你也可以稱之它為增量學(xué)習(xí)(incremental learning)。
在線學(xué)習(xí)一個很重要的參數(shù)就是基于數(shù)據(jù)改變更新算法的頻率,是只要有新的數(shù)據(jù)進(jìn)來就更新算法還是積累一定的數(shù)據(jù)改變之后再更新算法。這個參數(shù)被成為:學(xué)習(xí)率(learning rate)。如果設(shè)置很大的學(xué)習(xí)率,算法對會快速適應(yīng)新數(shù)據(jù),而忘記舊的數(shù)據(jù)(然而,垃圾郵件檢測系統(tǒng)中你可能并不想讓模型只對新的垃圾郵件標(biāo)記,而很快舍棄之前的標(biāo)記方法)。相反,如果設(shè)置較小的學(xué)習(xí)率,系統(tǒng)就會具有較大的慣性。也就是說,學(xué)習(xí)的速度比較慢,但是對數(shù)據(jù)中可能存在的噪聲就不會特別敏感。系統(tǒng)的健壯性就會更強(qiáng)一些。
在線學(xué)習(xí)一個大的挑戰(zhàn)是只要有壞數(shù)據(jù)輸入給系統(tǒng),那么系統(tǒng)的性能就會立刻逐步下降。如果這是一個即時系統(tǒng),用戶就會立刻注意到。例如,壞數(shù)據(jù)可能來自于機(jī)器人上的故障傳感器,可能是某人在搜索引擎輸入垃圾信息以提高搜索排名。為了減少這種風(fēng)險,您需要密切監(jiān)視系統(tǒng),如果檢測到系統(tǒng)性能下降,就立即關(guān)閉學(xué)習(xí)(或回滾到上一個版本的系統(tǒng))。您可能還需要監(jiān)視輸入數(shù)據(jù)并對異常數(shù)據(jù)作出反應(yīng)(例如,使用異常檢測算法)。
3.3 基于實例學(xué)習(xí) vs 基于模型學(xué)習(xí)
機(jī)器學(xué)習(xí)還可以就根據(jù)它的歸納方法來劃分。大多數(shù)機(jī)器學(xué)習(xí)的任務(wù)是做出預(yù)測,這意味著給到大量的訓(xùn)練樣本訓(xùn)練模型,系統(tǒng)需要泛化到從未見過的樣本。模型在訓(xùn)練集上有好的表現(xiàn)是個好事,但這還不夠;目標(biāo)是模型在新的實例上的表現(xiàn)。
有兩種主要的歸納方法:基于實例學(xué)習(xí)和基于模型學(xué)習(xí)。
基于實例學(xué)習(xí)
或許最簡單的學(xué)習(xí)方式就是記憶學(xué)習(xí)。如果你用這種方式創(chuàng)建一個垃圾郵件過濾器,它只會標(biāo)記所有與已經(jīng)由用戶標(biāo)記的郵件相同的郵件。這不是最壞的解決方案,但肯定不是最好的。
不能僅僅是標(biāo)記與已知郵件相同的郵件,你的垃圾郵件檢測程序還應(yīng)該可以標(biāo)記與已知郵件相似的郵件。這就需要計算兩封郵件的相似程度。一種最基本的相似度測量方式就是計算兩封郵件包含相同單詞的個數(shù)。如果新郵件與已知的一封垃圾郵件相同單詞個數(shù)較多,那么系統(tǒng)就會判斷其也是垃圾郵件。
這種學(xué)習(xí)方法就叫做基于實例學(xué)習(xí):系統(tǒng)把所有訓(xùn)練集樣本都存儲下來,然后計算新的樣本與存儲的這些實例的相似度(如下圖所示)。
基于模型學(xué)習(xí)
另一種歸納方法就是使用所有訓(xùn)練集樣本建立一個模型,然后使用這個模型預(yù)測新的樣本。這中學(xué)習(xí)方法就叫做基于模型學(xué)習(xí)(如下圖所示)。
例如,假設(shè)你想知道是否錢能讓人快樂,因此,你從 OECD 網(wǎng)站上下載 Better Life Index 數(shù)據(jù),從 IMF 網(wǎng)站上下載 GDP 數(shù)據(jù)。然后就可以根據(jù)人均 GDP 和生活滿意度建立對應(yīng)的表格,如下所示。
下面畫出一些國家人均 GDP 與生活滿意度之間的關(guān)系散點圖:
似乎能看到一點趨勢。盡管數(shù)據(jù)有些噪聲,但是生活滿意度多少與 GDP 呈現(xiàn)線性增長關(guān)系。因此,你可以令生活滿意度是人均 GDP 的線性函數(shù)。這一步稱為模型選擇:選擇一個生活滿意度的線性模型,該模型只有一個屬性(attribute),即人均 GDP。
這個模型有兩個參數(shù):θ0\theta_0θ0? 和 θ1\theta_1θ1?,通過調(diào)整這些參數(shù),你可以讓你的模型表示任何線性函數(shù),如下圖所示。
在使用你的模型之前,你需要確定參數(shù)值 θ0\theta_0θ0? 和 θ1\theta_1θ1? 讓模型表現(xiàn)最好。怎么做呢?你需要制定一個性能評估方法。可以定義一個擬合函數(shù)測量模型有多好,也可以定義一個代價函數(shù)(loss function)來測量模型有多不好。對于線性回歸問題,人們一般使用代價函數(shù)來測量線性模型預(yù)測值與實際樣本值之間的距離,目標(biāo)就是讓這個距離越小越好,最小化。
這就是線性回歸算法,根據(jù)訓(xùn)練集,線性回歸算法能夠找到最合適的參數(shù),使得線性模型能最好程度地擬合這些數(shù)據(jù)。這個過程稱為模型訓(xùn)練。在上面這個例子中,使用線性回歸算法,得到的最佳參數(shù)為:θ0=4.85\theta_0 = 4.85θ0?=4.85,θ1=4.91×10?5\theta_1 = 4.91 × 10^{-5}θ1?=4.91×10?5。
現(xiàn)在得到的線性模型擬合數(shù)據(jù)的效果就很好了,如下圖所示。
最后,你就可以使用這個模型進(jìn)行預(yù)測了。例如,你想知道 Cyprus 人的生活滿意度,但是 OECD 并沒有提供這個數(shù)據(jù)。幸運的是,你可以使用剛剛訓(xùn)練好的模型進(jìn)行預(yù)測:你查到 Cyprus 人均 GDP 是 $22,587,然后根據(jù)模型的線性表達(dá)式,計算生活滿意度為:4.85+22,587×4.91×10?5=5.964.85 + 22,587 × 4.91 × 10^{-5} = 5.964.85+22,587×4.91×10?5=5.96。
下面這段代碼就是使用 Python 來導(dǎo)入數(shù)據(jù)集,預(yù)處理,創(chuàng)建可視化散點圖,然后訓(xùn)練線性模型并作出預(yù)測。
# Code example import matplotlib import matplotlib.pyplot as plt import numpy as np import pandas as pd import sklearn.linear_model import os datapath = os.path.join("datasets", "lifesat", "")def prepare_country_stats(oecd_bli, gdp_per_capita):oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value")gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)gdp_per_capita.set_index("Country", inplace=True)full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,left_index=True, right_index=True)full_country_stats.sort_values(by="GDP per capita", inplace=True)remove_indices = [0, 1, 6, 8, 33, 34, 35]keep_indices = list(set(range(36)) - set(remove_indices))return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]# Load the data oecd_bli = pd.read_csv(datapath + "oecd_bli_2015.csv", thousands=',') gdp_per_capita = pd.read_csv(datapath + "gdp_per_capita.csv",thousands=',',delimiter='\t',encoding='latin1', na_values="n/a")# Prepare the data country_stats = prepare_country_stats(oecd_bli, gdp_per_capita) X = np.c_[country_stats["GDP per capita"]] y = np.c_[country_stats["Life satisfaction"]]# Visualize the data country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction') plt.show()# Select a linear model model = sklearn.linear_model.LinearRegression()# Train the model model.fit(X, y)# Make a prediction for Cyprus X_new = [[22587]] # Cyprus' GDP per capita print(model.predict(X_new)) # outputs [[ 5.96242338]][[ 5.96242338]]
值得注意的是,如果我們使用的是基于實例的方法學(xué)習(xí),我們發(fā)現(xiàn)與 Cyprus 人均 GDP 最接近的國家是 Slovenia(人均 GDP 為 $20,732)。因為 Slovenia 人的生活滿意度是 5.7,則可以說 Cyprus 的生活滿意度也是 5.7。如果我們選擇與 Cyprus GDP 最接近的 3 個國家,分別是 Portugal、Slovenia、Spain,GDP 分別是 5.1、5.7、6.5,則平均計算,得到 Cyprus 的人均 GDP 為 5.77。這兩個結(jié)果與我們使用基于模型學(xué)習(xí)的結(jié)果很相近。這種實例學(xué)習(xí)方法就叫做 k-近鄰算法。
對應(yīng)到代碼中,如果使用 k-近鄰替代線下回歸,則只要把下面這條語句:
clf = sklearn.linear_model.LinearRegression()替換成:
clf = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)就好了。
如果一切進(jìn)展順利的話,這個模型就可以較好地預(yù)測了。如果效果不好,那你還需要使用更多的特征(例如就業(yè)率、健康程度、空氣質(zhì)量等),獲得更好的訓(xùn)練集,或者使用更強(qiáng)大的模型(例如多項式回歸)。
下面對基于模型學(xué)習(xí)作個總結(jié):
-
選取數(shù)據(jù)集
-
選擇模型
-
在訓(xùn)練集上訓(xùn)練模型(即使用學(xué)習(xí)算法找到最佳參數(shù),讓代價函數(shù)最小化)
-
最后,將模型應(yīng)用到新的樣本中,進(jìn)行預(yù)測,希望的得到較好的泛化能力
這就是構(gòu)建一個典型的機(jī)器學(xué)習(xí)項目的過程。
到目前為止,我們已經(jīng)介紹了很多內(nèi)容:你知道了什么是機(jī)器學(xué)習(xí),為什么機(jī)器學(xué)習(xí)是有用的,機(jī)器學(xué)習(xí)有哪些類型,以及構(gòu)建機(jī)器學(xué)習(xí)系統(tǒng)的一般流程是什么樣的。
項目地址:
https://github.com/RedstoneWill/Hands-On-Machine-Learning-with-Sklearn-TensorFlow
總結(jié)
以上是生活随笔為你收集整理的Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记1 — 机器学习基础知识简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序自删除方法大总结
- 下一篇: 干货 | 机器学习正在面临哪些主要挑战?