您的位置:首頁>科技>正文

sklearn:Python語言開發的通用機器學習庫

更多深度文章, 請關注雲計算頻道:https://yq.aliyun.com/cloud

引言:深入理解機器學習並完全看懂sklearn文檔, 需要較深厚的理論基礎。 但是, 要將sklearn應用於實際的項目中, 只需要對機器學習理論有一個基本的掌握, 就可以直接調用其API來完成各種機器學習問題。

本文選自《全棧資料之門》, 將向你介紹通過三個步驟來解決具體的機器學習問題。

sklearn介紹

scikit-learn是Python語言開發的機器學習庫, 一般簡稱為sklearn, 目前算是通用機器學習演算法庫中實現得比較完善的庫了。 其完善之處不僅在於實現的演算法多, 還包括大量詳盡的文檔和示例。 其文檔寫得通俗易懂,

完全可以當成機器學習的教程來學習。

如果要說sklearn文檔的重要性, 個人覺得, 應該可以與佛經中的《金剛經》相比。 如果能將其當成《金剛經》一樣來閱讀, 你的機器學習水準一定會有質的提升。

一般初閱佛經, 肯定會被其中的一些名詞弄糊塗, 就像初次閱讀sklearn的文檔一樣, 會被諸如training data、testing data、model select、cross validation等這樣的詞彙弄糊塗。 但實際上, 只要肯用心讀, 把這些基礎概念弄明白, 後續學習就比較容易了。 sklearn必須要結合機器學習的一些基礎理論來理解, 就像佛經必須要結合一些佛法基礎理論來理解一樣。

既然是通用的機器學習庫, sklearn中包含了大量常用的演算法。 正如其介紹一樣, 基本功能主要分為6個部分:分類、回歸、聚類、資料降維、模型選擇與資料預處理,

如下圖所示。

要深入理解機器學習, 並且完全看懂sklearn的文檔, 需要較深厚的理論基礎。 但是, 要將sklearn應用於實際的專案中, 卻並不需要特別多的理論知識, 只需要對機器學習理論有一個基本的掌握, 就可以直接調用其API來完成各種機器學習問題。

對於具體的機器學習問題, 通常可以分為三個步驟:

資料準備與預處理

模型選擇與訓練

模型驗證與參數調優

下面就通過一個具體的示例來介紹這三個步驟。

資料預處理

在這個示例中, 使用sklearn自帶的Iris資料來做演示, 而演算法使用kNN來進行分類, 要瞭解kNN演算法的詳細資訊, 請參考“近朱者赤, 相親kNN”一節。

使用load_iris方法, 載入Iris資料。 Iris是一個非常有名的公共資料集, 描述了鳶尾花的三種不同的子類別,

共有4個特徵, 分別為花萼的長度與寬度, 花瓣的長度與寬度。 可以不用關注具體分哪三類, 只需要知道在資料中類標籤分別用0、1、2表示即可。

載入資料的代碼如下:

%pysparkfrom sklearn.datasets import load_irisfrom sklearn.cross_validation import train_test_split# 載入資料iris = load_iris()

將資料的特徵載入為data_X, 將類別標籤載入為data_y, 一般的命名習慣是, 使用大寫的X表示特徵是多維的, 而用小寫的y表示目標值為1維。 不同的命名習慣, 比較符合人類以貌取人的特點, 程式師不僅是人, 更是聰明的人, 因此也有這樣的習慣。

載入完資料, 使用sklearn自帶的train_test_split方法將資料按0.8與0.2的比例進行劃分, 切分為訓練資料train與測試資料test, 並將特徵與目標值分別命名為train_X、train_y與test_X、test_y。

其執行結果如下圖所示。

建模與預測

準備好資料後, 就可以從neighbors近鄰類中導入kNN分類演算法了,

其代碼如下所示:

%pysparkfrom sklearn.neighbors import KNeighborsClassifier# 構建knn模型knn = KNeighborsClassifier(n_neighbors=3, n_jobs=-1)# 擬合數據knn.fit(train_X, train_y)# 預測preds = knn.predict(test_X)print('knn model:', knn)print('First 3 pred:',preds[:3])

通過使用兩個自訂參數n_neighbors(參考的近鄰數)與n_jobs(使用的CPU核數)來導入KNeighborsClassifier模型, 這樣就生成了一個knn的模型。 n_neighbors是knn中最重要的參數, 可以通過交叉驗證來設置一個合理的值。 而n_jobs是sklearn中所有支援並行的演算法都會支援的參數, sklearn中有很多演算法都可以將單台機器的全部CPU進行並行運算, 設置為-1即是使用機器的全部CPU核, 也可以設置成具體的數位值。

接著使用fit方法在訓練資料上進行擬合, kNN是一個有監督的學習演算法, 因此在擬合數據的時候, 需要將已知的類別標籤train_y與特徵train_X一起輸入到模型中進行資料擬合。

模型在訓練資料上完成了擬合, 便可以對測試資料進行預測了, 使用predict方法來對測試的特徵進行預測。

因為是使用特徵來預測其類別, 此處自然不能傳入測試資料的類別標籤資料test_y, 這個資料是在後面對模型進行評估時使用的。 列印knn模型, 會輸出其用於構建的參數, 也可以列印出預測的前三個值, 如下圖所示。

在上面的建模與預測過程中, sklearn的這種簡潔API方式已經成為現代機器學習庫爭相模仿的對象, 就連Spark的ML庫, 也在學習這種簡潔的方式, 可以說幾乎已經成為大眾接受的標準方式了。

模型評估

評估一個模型的好壞是機器學習中非常重要的任務。 否則, 無法評價模型的好壞, 也就無法更好地優化模型。 歸根到底, 所有的機器學習演算法都是一堆數學運算, 其預測的值與標準的值是可以進行數學上的對比的。 在這一點上,與教育中所用的考試分數來評估一個人的能力不一樣,也與公司中所用的KPI來考核一個人對公司的貢獻是不一樣的。

在分類演算法中,通常的評價指標有精確率、召回率與F1-Score等幾種。

前面構建的knn模型,本身也有一個score方法,可以對模型的好壞做一個初步評估,其使用的指標為F1-Score。當然,也可以使用sklearn中提供的更多的評價指標來評估模型。其代碼如下所示:

%pysparkfrom pprint import pprint

對每個類別的資料都進行了精確率、召回率與F-beta Score的評估,其結果如下圖所示。

模型持久化

辛辛苦苦訓練好一個模型後,總希望後面可以直接使用,此時就必須要對模型進行持久化操作了。模型本身就是一個Python的物件,可以使用pickle的方式將模型轉儲到檔,但sklearn推薦使用其joblib介面,保存與載入模型都非常簡單:

import joblib# 保存模型joblib.dump(model, '/tmp/model.pkl')# 載入模型model = joblib.load('/tmp/model.pkl')三個層次

前面已經演示了一個完整的使用sklearn來解決實際問題的例子,可以發現,如果只是調用sklearn的API,確實不需要太複雜的理論知識。在學完上面的示例後,你或許都並不清楚kNN演算法是如何工作的,但學習是分層次的。

也許有的人認為,只會調用API來實現,並不是真正會用機器學習了。確實,不理解kNN演算法,就不清楚如何進行演算法的參數調優。但個人認為,從sklearn入門機器學習是最好的途徑,儘管你以前完全沒有接觸過機器學習。

我所理解的,學習機器學習演算法的三個層次如下所述。

調用:知道演算法的基本思想,能應用現有的庫來做測試。簡單說,就是了解kNN是做什麼的,會調用sklearn中的kNN演算法。

調參:知道演算法的主要影響參數,能進行參數調節優化。

嚼透:理解演算法的實現細節,並且能用代碼實現出來。

上面三個層次是不是很押韻呢,但不幸的是,有的人一上來就想達到第三個層次,於是剛開始就被如何實現kNN演算法嚇到了,過不了三天就從入門到放棄了。

作為應用型的機器學習,能達到第三階段固然好,但在實際應用中,建議能調用現有的庫就直接調用好了。不理解的地方,能看懂源碼最好。不太建議自己從頭實現,除非能力確實夠了,否則寫出來的代碼並不能保證性能與準確性。

當然,從另外一個角度來說,尤其是在分散式環境下,機器學習還有另外三個層次,想知道的話,請見《全棧資料之門》一書。

本文選自《全棧數據之門》

在這一點上,與教育中所用的考試分數來評估一個人的能力不一樣,也與公司中所用的KPI來考核一個人對公司的貢獻是不一樣的。

在分類演算法中,通常的評價指標有精確率、召回率與F1-Score等幾種。

前面構建的knn模型,本身也有一個score方法,可以對模型的好壞做一個初步評估,其使用的指標為F1-Score。當然,也可以使用sklearn中提供的更多的評價指標來評估模型。其代碼如下所示:

%pysparkfrom pprint import pprint

對每個類別的資料都進行了精確率、召回率與F-beta Score的評估,其結果如下圖所示。

模型持久化

辛辛苦苦訓練好一個模型後,總希望後面可以直接使用,此時就必須要對模型進行持久化操作了。模型本身就是一個Python的物件,可以使用pickle的方式將模型轉儲到檔,但sklearn推薦使用其joblib介面,保存與載入模型都非常簡單:

import joblib# 保存模型joblib.dump(model, '/tmp/model.pkl')# 載入模型model = joblib.load('/tmp/model.pkl')三個層次

前面已經演示了一個完整的使用sklearn來解決實際問題的例子,可以發現,如果只是調用sklearn的API,確實不需要太複雜的理論知識。在學完上面的示例後,你或許都並不清楚kNN演算法是如何工作的,但學習是分層次的。

也許有的人認為,只會調用API來實現,並不是真正會用機器學習了。確實,不理解kNN演算法,就不清楚如何進行演算法的參數調優。但個人認為,從sklearn入門機器學習是最好的途徑,儘管你以前完全沒有接觸過機器學習。

我所理解的,學習機器學習演算法的三個層次如下所述。

調用:知道演算法的基本思想,能應用現有的庫來做測試。簡單說,就是了解kNN是做什麼的,會調用sklearn中的kNN演算法。

調參:知道演算法的主要影響參數,能進行參數調節優化。

嚼透:理解演算法的實現細節,並且能用代碼實現出來。

上面三個層次是不是很押韻呢,但不幸的是,有的人一上來就想達到第三個層次,於是剛開始就被如何實現kNN演算法嚇到了,過不了三天就從入門到放棄了。

作為應用型的機器學習,能達到第三階段固然好,但在實際應用中,建議能調用現有的庫就直接調用好了。不理解的地方,能看懂源碼最好。不太建議自己從頭實現,除非能力確實夠了,否則寫出來的代碼並不能保證性能與準確性。

當然,從另外一個角度來說,尤其是在分散式環境下,機器學習還有另外三個層次,想知道的話,請見《全棧資料之門》一書。

本文選自《全棧數據之門》

Next Article
喜欢就按个赞吧!!!
点击关闭提示