Python粉都應該知道的開源機器學習框架:Scikit-learn入門指南

對Python語言有所瞭解的科研人員可能都知道SciPy——一個開源的基於Python的科學計算工具包。基於SciPy,目前開發者們針對不一樣的應用領域已經發展出了爲數衆多的分支版本,它們被統一稱爲Scikits,即SciPy工具包的意思。而在這些分支版本中,最有名,也是專門面向機器學習的一個就是Scikit-learn。html

Scikit-learn項目最先由數據科學家 David Cournapeau 在 2007 年發起,須要NumPy和SciPy等其餘包的支持,是Python語言中專門針對機器學習應用而發展起來的一款開源框架。python

和其餘衆多的開源項目同樣,Scikit-learn目前主要由社區成員自發進行維護。多是因爲維護成本的限制,Scikit-learn相比其餘項目要顯得更爲保守。這主要體如今兩個方面:一是Scikit-learn歷來不作除機器學習領域以外的其餘擴展,二是Scikit-learn歷來不採用未經普遍驗證的算法。算法

本文將簡單介紹Scikit-learn框架的六大功能,安裝和運行Scikit-learn的大概步驟,同時爲後續各更深刻地學習Scikit-learn提供參考。原文來自infoworld網站的特約撰稿人Martin Heller,他曾在1986-2010年間作過長達20多年的數據庫、通用軟件和網頁開發,具備豐富的開發經驗。數據庫

Scikit-learn的六大功能

Scikit-learn的基本功能主要被分爲六大部分:分類,迴歸,聚類,數據降維,模型選擇和數據預處理。網絡

分類是指識別給定對象的所屬類別,屬於監督學習的範疇,最多見的應用場景包括垃圾郵件檢測和圖像識別等。目前Scikit-learn已經實現的算法包括:支持向量機(SVM),最近鄰,邏輯迴歸,隨機森林,決策樹以及多層感知器(MLP)神經網絡等等。數據結構

須要指出的是,因爲Scikit-learn自己不支持深度學習,也不支持GPU加速,所以這裏對於MLP的實現並不適合於處理大規模問題。有相關需求的讀者能夠查看一樣對Python有良好支持的Keras和Theano等框架。框架

迴歸是指預測與給定對象相關聯的連續值屬性,最多見的應用場景包括預測藥物反應和預測股票價格等。目前Scikit-learn已經實現的算法包括:支持向量迴歸(SVR),脊迴歸,Lasso迴歸,彈性網絡(Elastic Net),最小角迴歸(LARS ),貝葉斯迴歸,以及各類不一樣的魯棒迴歸算法等。能夠看到,這裏實現的迴歸算法幾乎涵蓋了全部開發者的需求範圍,並且更重要的是,Scikit-learn還針對每種算法都提供了簡單明瞭的用例參考。機器學習

聚類是指自動識別具備類似屬性的給定對象,並將其分組爲集合,屬於無監督學習的範疇,最多見的應用場景包括顧客細分和試驗結果分組。目前Scikit-learn已經實現的算法包括:K-均值聚類,譜聚類,均值偏移,分層聚類,DBSCAN聚類等。函數

數據降維是指使用主成分分析(PCA)、非負矩陣分解(NMF)或特徵選擇等降維技術來減小要考慮的隨機變量的個數,其主要應用場景包括可視化處理和效率提高。工具

模型選擇是指對於給定參數和模型的比較、驗證和選擇,其主要目的是經過參數調整來提高精度。目前Scikit-learn實現的模塊包括:格點搜索,交叉驗證和各類針對預測偏差評估的度量函數。

數據預處理是指數據的特徵提取和歸一化,是機器學習過程當中的第一個也是最重要的一個環節。這裏歸一化是指將輸入數據轉換爲具備零均值和單位權方差的新變量,但由於大多數時候都作不到精確等於零,所以會設置一個可接受的範圍,通常都要求落在0-1之間。而特徵提取是指將文本或圖像數據轉換爲可用於機器學習的數字變量。

須要特別注意的是,這裏的特徵提取與上文在數據降維中提到的特徵選擇很是不一樣。特徵選擇是指經過去除不變、協變或其餘統計上不重要的特徵量來改進機器學習的一種方法。

總結來講,Scikit-learn實現了一整套用於數據降維,模型選擇,特徵提取和歸一化的完整算法/模塊,雖然缺乏按步驟操做的參考教程,但Scikit-learn針對每一個算法和模塊都提供了豐富的參考樣例和詳細的說明文檔。

安裝和運行Scikit-learn

如前所述,Scikit-learn須要NumPy和SciPy等其餘包的支持,所以在安裝Scikit-learn以前須要提早安裝一些支持包,具體列表和教程能夠查看Scikit-learn的官方文檔: http://scikit-learn.org/stable/install.html ,如下僅列出Python、NumPy和SciPy等三個必備包的安裝說明。

Python:https://www.python.org/about/gettingstarted/

NumPy:http://www.numpy.org/

SciPy:http://www.scipy.org/install.html

假定已經完整安裝了全部支持包,那麼利用安裝Scikit-learn只須要簡單的一條簡單的pip命令(也能夠用conda命令,詳見官方文檔):

$ sudo pip install -U scikit-learn

這裏加上sudo是爲了不安裝過程當中出現一些權限問題,若是用戶已經確保了管理員權限也能夠省略。

固然,開發者也能夠選擇本身到GitHub開源平臺上下載Scikit-learn的源代碼,解壓後在根目錄鍵入make自行編譯和鏈接可執行文件,效果是同樣的。另外,爲了確保測試方便,高級用戶還能夠選擇安裝針對Python的測試框架nose,安裝方法詳見其官方說明: http://nose.readthedocs.io/en/latest/  。

經過Jupyter Notebook工具運行Scikit-learn樣例的過程也很簡單,用戶只須要在官方給出的樣例庫: http://scikit-learn.org/stable/auto_examples/index.html#general-examples  選擇一個樣例,而後在頁面中下載其Python源碼和IPython notebook文件,藉着經過Jupyter Notebook工具運行就能夠了。假如選擇了交叉驗證預測的樣例,那麼其運行狀況的截圖以下所示。

Python粉都應該知道的開源機器學習框架:Scikit-learn入門指南

原做者在這裏表示,Scikit-learn是他測試過的最簡單易用的機器學習框架。他表示,Scikit-learn樣例的運行結果和文檔描述如出一轍,API接口的設計合理且一致性高,並且幾乎不存在「阻抗不匹配」的數據結構,使用這種功能完善且幾乎沒有Bug的開源框架進行機器學習研究,無疑是一件值得高興的事。

更深刻地學習Scikit-learn

如前所述,Scikit-learn針對每一個算法和模塊都提供了豐富的參考樣例和詳細的說明文檔,據官方的統計大約有200多個。並且爲了清晰明白,絕大多數樣例都至少給出了一張由Matplotlib繪製的數據圖表。這些都是官方提供的學習Scikit-learn框架最直接有效的學習材料。

針對科學數據處理的應用場景,官方還給出了一個更爲詳細和全面的參考教程:A tutorial on statistical-learning for scientific data processing,其中包括統計學習、監督學習、模型選擇和無監督學習等若干部分,內容覆蓋全面,講解細緻,而且使用了真實的數據、代碼和圖表。

另外,教程中還調用了與文本相關的樣例,例以下圖所示的四個不一樣SVM分類器的比較。

Python粉都應該知道的開源機器學習框架:Scikit-learn入門指南

這裏須要指出的是,雖然運行Scikit-learn官方給出的樣例後一般都能獲得一致的結果,但大多數狀況下系統都會拋出警告信息。做者認爲拋出警告信息的緣由來自兩個方面:一是蘋果vecLib框架自己對Scikit-learn支持很差(做者用的是MacOS),二是樣例中使用的Python版本多是早期的版本,而實際運行中是最新的版本。例以下圖中是使用Python 2.7.10版本拋出的警告信息,而Scikit-learn官方頁面上並無出現。

Python粉都應該知道的開源機器學習框架:Scikit-learn入門指南

整體上來講,做爲專門面向機器學習的Python開源框架,Scikit-learn能夠在必定範圍內爲開發者提供很是好的幫助。它內部實現了各類各樣成熟的算法,容易安裝和使用,樣例豐富,並且教程和文檔也很是詳細。

另外一方面,Scikit-learn也有缺點。例如它不支持深度學習和強化學習,這在今天已是應用很是普遍的技術,例如準確的圖像分類和可靠的實時語音識別和語義理解等。此外,它也不支持圖模型和序列預測,不支持Python以外的語言,不支持PyPy,也不支持GPU加速。

看到這裏可能會有人擔憂Scikit-learn的性能表現,這裏須要指出的是:若是不考慮多層神經網絡的相關應用,Scikit-learn的性能表現是很是不錯的。究其緣由,一方面是由於其內部算法的實現十分高效,另外一方面或許能夠歸功於Cython編譯器:經過Cython在Scikit-learn框架內部生成C語言代碼的運行方式,Scikit-learn消除了大部分的性能瓶頸。

應該明確的一點是:雖然歸納地說Scikit-learn並不適合深度學習問題,但對於某些特殊場景而言,使用Scikit-learn仍然是明智的選擇。例如要建立鏈接不一樣對象的預測函數時,或者在未標記的數據集中爲了訓練模型對不一樣的對象進行分類時,面對這些場景Scikit-learn只經過普通的舊機器學習模型就能很好地解決,而並不須要創建數十層的複雜神經網絡。

就好像喜歡Scala語言的人會選擇Spark ML,喜歡繪製圖表和偶爾編寫少許Python/R語言代碼的人會選擇微軟Cortana和Azure同樣,對於那些Python語言的死忠粉而言,Scikit-learn多是各類機器學習庫中的最好選擇。

相關文章
相關標籤/搜索