機器學習系列(1):機器學習基礎

章我們簡要介紹下機器學習(Machine Learning)的基本概念。主要介紹機器學習演算法的應用,監督學習和無監督學習(supervised-unsupervised learning)的應用場景,訓練和測試數據的用法,學習效果評估方式。最後,對scikit-learn進行一些簡單的介紹。

自計算機問世以來,計算機可以學習和模仿人類智慧的觀點,可謂「引無數英雄競折腰」。像Arthur C. Clarke的HAL(Heuristically programmed ALgorithmic computer)和Isaac Asimov的Sonny那樣的人工智慧已經成為共識,通過學習經驗獲得新知識和技能的軟體程序也變得越來越多。我們用這機器學習程序發現我們會喜歡的新音樂,快速找出我們想網購的鞋子。機器學習程序讓我們通過命令控制手機,讓恆溫器自動調節溫度。比人類更準確的識別出潦草的手寫郵箱地址,更安全的保護信用卡防止詐騙。從新藥品調查到從網頁尋找頭條新聞,機器學習軟體逐漸成為許多產業的核心工具。機器學習已經進入長期以來一直被認為只有人類才能勝任的領域,如杜克大學UNC(Duke)籃球隊輸給了北卡(UNC)的體育報道。

Advertisements

機器學習是設計和研究能夠根據過去的經驗來為未來做決策的軟體,它是通過數據進行研究的程序。機器學習的基礎是歸納(generalize),就是從已知案例數據中找出未知的規律。機器學習的典型案例就是垃圾郵件過濾。通過對數千份已經打上是否為垃圾標籤的郵件進行觀察經驗,對新郵件進行過濾。

人工智慧研究領域的計算機科學家Arthur Samuel說,機器學習是「研究如何讓計算機可以不需要明確的程序也能具有學習能力」。在20世紀五六十年代,Samuel開發了下象棋程序。程序的規則非常簡單,要打敗專業對手需要複雜的策略,但是通過幾千局遊戲的訓練,程序學會了複雜的策略,可以打敗很多人類棋手。

計算機科學家Tom Mitchell對機器學習的定義更正式,「一個程序在完成任務T后獲得了經驗E,其表現為效果P,如果它完成任務T的效果是P ,那麼會獲得經驗E」。例如,假設你有一些圖片,每個圖片里是一條狗或一隻貓。程序可以通過觀察圖片來學習,然後它可以通過計算圖片正確分類比例來評估學習效果。

Advertisements

我們將使用Mitchell的定義來組織這一章的內容。首先,我們要介紹經驗的類型,包括監督學習和無監督學習。然後,我們介紹機器學習系統可以處理的常見任務。最後,我們介紹機器學習系統效果評估方式。

從經驗中學習

機器學習系統通常被看作是有無人類監督學習兩種方式。監督學習問題是,從成對的已經標記好的輸入和輸出經驗數據作為一個輸入進行學習,用來預測輸出結果,是從有正確答案的例子中學習。而無監督學習是程序不能從已經標記好的數據中學習。它需要在數據中發現一些規律。假如我們獲取了人的身高和體重數據,非監督學習的例子就是把數據點分成組別。一種程序可能是把數據分成男人與女人,兒童與成人等不同組別。

再假設數據都標記了人的性別。那麼,一種監督學習方式就是基於一個人的身高和體重數據來預測這個人是男是女。後面我們會介紹監督學習與非監督學習的演算法和案例。

監督學習與非監督學習可以看作機器學習的兩端。還有一些中間類型,稱為半監督學習,既包含監督數據也有非監督數據,這類問題可以看作是介於監督學習與非監督學習之間的學習。半監督機器學習案例是一種增強學習(Reinforcement Learning),問題可以通過決策來獲得反饋,但是反饋與某一個決策可能沒有直接關係。例如,一個增強學習程序學習玩超級瑪麗遊戲,讓它完成一級或超過一定分數會獲得獎勵,如果失敗一次會受到懲罰。但是,監督反饋與具體要執行的決策無關,避開板栗仔(Goombas)或者跳過火輪圈。本書討論的半監督學習將集中於監督與非監督學習,因為這些類型包括機器學習的絕大多數問題。下一章,我們會介紹監督學習與非監督學習的更多細節。

監督學習是通過一個輸入產生一個帶標籤的輸出的經驗數據對中進行學習。機器學習程序中輸出結果有很多名稱,一些屬於機器學習領域,另外一些是專用術語。本書中,我們把輸出結果稱為響應值(response variable),不過輸出結果還有其他名稱,如因變數(dependent variables),回歸值(regressands),標準變數(criterion variables),測得變數(measured variables),解釋變數(explained variables),結果變數(outcome variables),實驗變數(experimental variables),標籤(labels),和輸出變數(output variables)。同理,輸入變數也有很多名稱。本書把輸入變數作為特徵(features),它們測量的現象作為解釋變數(explanatory variables)。輸入變數的其他名稱有,預測值(predictors),解釋變數(regressors),控制變數(controlled variables),操作便利(manipulated variables)和顯現變數(exposure variables)。響應變數和解釋變數可能需要真實的或不相關的數值。

構成監督學習經驗的案例集合稱為訓練集(training set)。評估程序效果的案例集合稱為測試集(test set)。響應變數可以看成是解釋變數構成問題的答案。監督學習問題從不同問題結合中學習,就是說,監督學習程序輸入是正確的答案,需要對類似的問題作出正確的反饋。

機器學習任務

常見的監督式機器學習任務就是分類(classification)和回歸(regression)。分類認為需要學會從若干變數約束條件中預測出目標變數的值,就是必須預測出新觀測值的類型,種類或標籤。分類的應用包括預測股票的漲跌,新聞頭條是政治新聞還是娛樂新聞。回歸問題需要預測連續變數的數值,比如預測新產品的銷量,或者依據工作的描述預算工資水平等。與分類方式類似,回歸問題需要監督學習。

常見的無監督式機器學習任務是通過訓練數據發現相關觀測值的組別,稱為類(clusters)。對應的任務稱為聚類(clustering),通過一些相似性度量方法把一些觀測值分成同一類。聚類常用來分析數據集。比如有一些影評數據,聚類演算法可以分辨積極的和消極的影評。系統是不能給類加上「積極」或「消極」的標籤的;沒有監督,系統只能通過相似性度量方法把觀測值分成兩類。聚類分析的應用場景是用市場產品銷售數據為客戶分級。通過挖掘一組用戶的共同屬性,銷售人員可以為這類客戶提供定製服務。聚類還被用於互聯網廣播服務,比如有一些歌曲,聚類演算法能夠按風格流派把歌曲分組。通過不同的相似性度量方法,同樣的聚類演算法可能通過關鍵詞來分組,也可能通過使用的樂器來分組。

降維(Dimensionality reduction)是另一個常見的無監督學習任務。有些問題可能包含成千上萬個解釋變數,處理起來非常麻煩。另外,有些解釋變數屬於噪音,也有些完全是無邊的變數,這些影響都會降低程序的歸納能力。降維是發現對響應變數影響最大的解釋變數的過程。降維可以更容易的實現數據可視化。如不同面積房子的價格數據可視化,房子的面積可以畫在x軸,其價格可以畫在y軸,很容易實現可視化。再加一個解釋變數,也很容易可視化房屋價格的回歸問題,比如房間里衛生間的數量可以畫在z軸。但是,幾千個解釋變數的問題是不可能可視化的。

訓練數據和測試數據

訓練集裡面的觀測值構成了演算法用來學習的經驗數據。在監督學習問題中,每個觀測值都由一個響應變數和若干個解釋變數組成。

測試集是一個類似的觀測值集合,用一些度量標準來評估模型的運行效果。需要注意的是,測試集的數據不能出現在訓練集中。否則,很難評價演算法是否從訓練集中學到了歸納能力,或者僅僅只是簡單的記錄了結果。歸納很好的程序能夠用新數據有效地完成任務。相反,一個通過記憶訓練數據來學習複雜模型的程序,可能通過訓練集準確預測響應變數的值,但是在處理新問題的時候由於沒有歸納能力會預測失敗。

訓練集的記憶稱為過度擬合(over-fitting)。一個記住了觀測值的程序不一定能夠很好的完成工作,因為它在記憶關係和結果的時候,把雜訊也同時記住了。平衡記憶能力與歸納能力,或者說是過度擬合與擬合不夠,是許多機器學習演算法面對的共同問題。後面的章節,我們會介紹正則化(regularization),可以用來減輕許多模型的過度擬合程度。

除了訓練集和測試集,還有一個觀測值集合稱為驗證集(validation set或 hold-out set),有時候需要用到。驗證集用來調整超參數(hyperparameters)變數,這類變數控制模型是如何學習的。這個程序也通過測試集來評估其真實的效果,驗證集的效果不能用於評估其真實的效果,由於程序參數已經用驗證數據調整過了。通常會把監督學習的觀測值分成訓練、驗證和測試集三部分。各部分的大小沒有要求,按實際觀測值的規模來定。一般把50%以上的數據作為訓練集,25%的數據做測試集,剩下的作為驗證集。

有的訓練集只包含幾百個觀測值,有的可能有幾百萬。隨著存儲成本越來越便宜,網路連接範圍不斷擴大,內置感測器的智能手機的普及,以及對隱私數據態度的轉變都在為大數據新動力,千萬甚至上億級別的訓練集成為可能。本書不會涉及這類需要上百個機器并行計算才能完成的任務,許多機器學習演算法的能力會隨著訓練集的豐富變得更強大。但是,機器學習演算法也有句老話「放入的是垃圾,出來的也是垃圾」。一個學習了一大堆錯誤百出的教材的學生不會比只讀一點好書的學生考得好。同理,對一堆充滿雜訊、沒有關聯、或標籤錯誤的數據進行學習的演算法,也不會比只學習一小部分更有代表性的訓練集的演算法效果更好。

許多監督學習的訓練集都是手工準備的,或者半自動處理。建一個海量監督數據集需要耗費許多資源。好在scikit-learn有些數據集,可以讓開發者直接驗證自己的模型。在開發階段,尤其是訓練集不夠的時候,交叉驗證(cross-validation )的方法可以用相同的數據對演算法進行多次訓練和檢驗。在交叉驗證中,訓練數據是分成N塊的。演算法用N-1塊進行訓練,再用最後一塊進行測試。每塊都被演算法輪流處理若干次,保證演算法可以在訓練和評估所有數據。下圖就是5塊數據的交叉驗證方法:

數據集被等分成5塊,從A標到E。開始的時候,模型用B到E進行訓練,在A上測試。下一輪,在A,C,D和E上訓練,用B進行測試。依次循環,直到每一塊都測試過。交叉驗證為模型的效果評估提供了比只有一個數據集更準確的方法。

效果評估,偏差,方差

許多度量方法可以用於評估一個程序是否學會了有效處理任務。在監督學習問題中,很多效果度量標準用來評估預測誤差。有兩種基本的預測誤差:模型的偏差(bias)和方差(variance)。假設你有很多訓練集都是不一樣的,但是都具有代表性。一個高偏差的模型會產生類似的誤差,無論它使用哪個訓練集。模型偏離自己對真實關係假設的誤差超過了模型在訓練集訓練的結果。模型有高偏差是固定不變的,但是模型有高方差可能是靈活的,因為模型發覺了訓練集裡面的噪音部分。就是說,高方差的模型是過度擬合了訓練集數據,而一個模型有高偏差的時候,其實是擬合不夠的表現。

偏差和方差就像飛鏢射到靶子上。每個飛鏢就是從不同數據集得出的預測結果。高偏差、低誤差的模型就是把飛鏢扔到了離靶心很遠的地方,但是都集中在一個位置。而高偏差、高誤差的模型就是把飛鏢扔到了靶子上,但是飛鏢離靶心也很遠,而且彼此間很分散。低偏差、高誤差的模型就是把飛鏢扔到了離靶心很近的地方,但是聚類效果不好。最後就是低偏差、低誤差的模型,把飛鏢扔到了離靶心很近的地方,聚類效果也很好。如下圖所示:

在理想情況下,模型具有低偏差和低誤差,但是二者具有背反特徵,即要降低一個指標的時候,另一個指標就會增加。這就是著名的偏差-方差均衡(Bias-Variance Trade-off)。後面我們會介紹很多模型的偏差-方差均衡特點。

無監督學習問題沒有誤差項要評估,其效果的是評估數據結構的一些屬性。

大多數效果評估方法只能用於具體的任務。機器學習系統應該可以這樣評估:用系統在真實世界中發生錯誤的代價來表示效果評估方法。這看起來很明顯,下面例子描述的是適用於一般任務而不只是具體任務的效果評估方法。

有一個對腫瘤數據進行觀察的機器學習系統分類任務,需要預測腫瘤是惡性的(malignant)還是良性的(benign)。準確度,或者是正確分類的比例,就是對程序效果評價的直觀度量方法。準確度能夠評價程序效果,不過它不能區分出,誤把良性腫瘤分為惡性腫瘤,和誤把惡性腫瘤分為良性腫瘤的效果差異。在一些應用里,發生不同類型錯誤的代價是相同的。但是,在這個問題裡面,沒有識別出惡性腫瘤的代價要比誤把良性腫瘤分為惡性腫瘤的代價要大的多。

我們可以通過對每一種可能的預測結果進行評估來建立分類系統效果的不同評價方法。當系統正確地識別出一個惡性腫瘤,這個預測叫真陽性(True positive);如果把一個良性腫瘤分成了一個惡性腫瘤,叫假陽性(False positive);正確地識別出一個良性腫瘤叫真陰性(True negative);把一個惡性腫瘤分成了一個良性腫瘤,叫假陰性(False negative)。這四個結果可以用來計算分類系統效果的評價體系,包括準確率(accuracy),精確率(precision)和召回率(recall)三項指標。

準度率計算公式如下,TP是真陽性統計結果,TN是真陰性統計結果,FP是假陽性統計結果,FN是假陰性統計結果:ACC=(TP+TN)/(TP+TN+FP+FN)

精確率是被判斷為惡性腫瘤中,真正為惡性腫瘤統計結果所佔比例:P=TP/(TP+FP)

召回率是指真正為惡性腫瘤被分類系統判斷出來的比例:R=TP/(TP+FN)

在這個例子中,精確率是評估被系統判斷為惡性腫瘤中的腫瘤裡面,確實為惡性腫瘤的比例。而召回率是評估真實的惡性腫瘤被系統正確判斷出來的比例。

從精確率和召回率評估指標可以看出,高準確率的分類系統實際沒有發現出所有的惡性腫瘤。如果絕大多數腫瘤都是良性的,那麼分類器沒有預測出惡性腫瘤也可以獲得極高的準確率。而一個具有低準確率和高召回率的分類系統反而更好,因為它能夠識別出更多惡性腫瘤。

許多其他效果評估方法都可以用於分類方法中,後面我們會介紹一些,包括多標籤分類問題的評價標準。下一章,我們會介紹一些回歸問題的常用評價標準。

scikit-learn簡介

自2007年發布以來,scikit-learn已經成為最給力的Python機器學習庫(library)了。scikit-learn支持的機器學習演算法包括分類,回歸,降維和聚類。還有一些特徵提取(extracting features)、數據處理(processing data)和模型評估(evaluating models)的模塊。

作為Scipy庫的擴展,scikit-learn也是建立在Python的NumPy和matplotlib庫基礎之上。NumPy可以讓Python支持大量多維矩陣數據的高效操作,matplotlib提供了可視化工具,SciPy帶有許多科學計算的模型。

scikit-learn文檔完善,容易上手,豐富的API,使其在學術界頗受歡迎。開發者用scikit-learn實驗不同的演算法,只要幾行代碼就可以搞定。scikit-learn包括許多知名的機器學習演算法的實現,包括LIBSVM和LIBLINEAR。還封裝了其他的Python庫,如自然語言處理的NLTK庫。另外,scikit-learn內置了大量數據集,允許開發者集中於演算法設計,節省獲取和整理數據集的時間。

scikit-learn可以不受任何限制,遵從自由的BSD授權。許多scikit-learn的演算法都可以快速執行而且可擴展,除了海量數據集以外。最後,scikit-learn穩定性很好,大部分代碼都可以通過Python的自動化測試(mock,nose等)。

總結

本文,我們把機器學習定義成一種程序的設計和研究過程,其可以建立一種從一件任務的過往經驗中學習並改善處理能力的程序。我們討論了經驗監督的範圍。一端是監督學習,程序從打上標籤的輸入和輸出數據中學習。另外一種是無監督學習,程序需要發現沒有標籤數據的內置結構。半監督學習同時使用有標籤和無標籤的訓練數據。

我們通過案例介紹了機器學習的常見問題。在分類任務中,程序需要從解釋變數預測出響應變數的離散數值。在回歸任務中,程序從解釋變數預測出響應變數的連續數值。無監督學習任務包括聚類和降維,聚類是將觀測值通過相似度評價方法分成不同的類,降維是將解釋變數集合縮減為一個合成特性集合,同時儘可能的保留數據的信息。我們還介紹了偏差-方差均衡和不同機器學習任務的效果評價方法。

最後,我們介紹了scikit-learn的歷史,目標和優點,以及scikit-learn和相關開發工具的安裝過程。下一博文,我們就詳細的介紹回歸問題,用scikit-learn建立本書的第一個模型。

數據分析網認證作者:風雪夜歸子

數據分析網(www.afenxi.com),國內領先的大數據門戶,旨在幫助大數據從業人士、愛好者提供大數據新聞資訊、前沿技術、業界觀點的信息平台。

Advertisements

你可能會喜歡