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


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


本文選自《全棧數據之門》。將向你介紹通過三個步驟來解決詳細的機器學習問題。

sklearn介紹

  scikit-learn是Python語言開發的機器學習庫。一般簡稱為sklearn。眼下算是通用機器學習算法庫中實現得比較完好的庫了。

其完好之處不僅在於實現的算法多。還包含大量詳盡的文檔和演示樣例。其文檔寫得通俗易懂,全然能夠當成機器學習的教程來學習。
  假設要說sklearn文檔的重要性,個人認為,應該能夠與佛經中的《金剛經》相比。假設能將其當成《金剛經》一樣來閱讀,你的機器學習水平一定會有質的提升。
  一般初閱佛經。肯定會被當中的一些名詞弄糊塗,就像初次閱讀sklearn的文檔一樣,會被諸如training data、testing data、model select、cross validation等這種詞匯弄糊塗。但實際上,僅僅要肯用心讀,把這些基礎概念弄明確,興許學習就比較easy了。sklearn必需要結合機器學習的一些基礎理論來理解,就像佛經必需要結合一些佛法基礎理論來理解一樣。
  既然是通用的機器學習庫。sklearn中包括了大量經常使用的算法。正如其介紹一樣。基本功能主要分為6個部分:分類、回歸、聚類、數據降維、模型選擇與數據預處理。例如以下圖所看到的。


【圖1】
  要深入理解機器學習,而且全然看懂sklearn的文檔,須要較深厚的理論基礎。可是。要將sklearn應用於實際的項目中,卻並不須要特別多的理論知識,僅僅須要對機器學習理論有一個主要的掌握,就能夠直接調用其API來完畢各種機器學習問題。
對於詳細的機器學習問題,通常能夠分為三個步驟:

  • 數據准備與預處理
  • 模型選擇與訓練
  • 模型驗證與參數調優

以下就通過一個詳細的演示樣例來介紹這三個步驟。

數據預處理

  在這個演示樣例中,使用sklearn自帶的Iris數據來做演示。而算法使用kNN來進行分類,要了解kNN算法的具體信息,請參考“近朱者赤。相親kNN”一節。
  使用load_iris方法,載入Iris數據。Iris是一個很有名的公共數據集。描寫敘述了鳶尾花的三種不同的子類別,共同擁有4個特征,分別為花萼的長度與寬度,花瓣的長度與寬度。能夠不用關注詳細分哪三類,僅僅須要知道在數據中類標簽分別用0、1、2表示就可以。


  載入數據的代碼例如以下:

%pyspark

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split

# 載入數據
iris = load_iris()
data_X = iris.data
data_y = iris.target

# 數據維度、特征與目標值的前3項
print('data:', data_X.shape, data_y.shape)
print('features:', data_X[:3, :])
print('target:', data_y[:3])

# 數據切分
train_X, test_X, train_y, test_y = train_test_split(data_X, 
data_y, test_size=0.2)

# 訓練數據與測試數據的維度
print('train:', train_X.shape, train_y.shape)
print('test: ', test_X.shape, test_y.shape)

  將數據的特征載入為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。
  其運行結果例如以下圖所看到的。
【圖2】

建模與預測

  准備好數據后,就能夠從neighbors近鄰類中導入kNN分類算法了,其代碼例如以下所看到的:

%pyspark

from 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模型,會輸出其用於構建的參數。也能夠打印出預測的前三個值。例如以下圖所看到的。


【圖3】
  在上面的建模與預測過程中,sklearn的這樣的簡潔API方式已經成為現代機器學習庫爭相模仿的對象,就連Spark的ML庫。也在學習這樣的簡潔的方式。能夠說差點兒已經成為大眾接受的標准方式了。

模型評估

  評估一個模型的好壞是機器學習中很重要的任務。

否則,無法評價模型的好壞,也就無法更好地優化模型。歸根究竟,全部的機器學習算法都是一堆數學運算,其預測的值與標准的值是能夠進行數學上的對照的。在這一點上,與教育中所用的考試分數來評估一個人的能力不一樣,也與公司中所用的KPI來考核一個人對公司的貢獻是不一樣的。


  在分類算法中,通常的評價指標有精確率、召回率與F1-Score等幾種。
  前面構建的knn模型。本身也有一個score方法,能夠對模型的好壞做一個初步評估。其使用的指標為F1-Score。當然,也能夠使用sklearn中提供的很多其它的評價指標來評估模型。其代碼例如以下所看到的:

%pyspark

from pprint import pprint

# 使用測試的特征與測試的目標值
print(knn.score(test_X, test_y))

from sklearn.metrics import precision_recall_fscore_support

# 打印出三個指標
scores = precision_recall_fscore_support(test_y, preds)
pprint(scores)

  對每一個類別的數據都進行了精確率、召回率與F-beta Score的評估,其結果例如以下圖所看到的。
【圖4】

模型持久化

  辛辛苦苦訓練好一個模型后,總希望后面能夠直接使用。此時就必需要對模型進行持久化操作了。模型本身就是一個Python的對象。能夠使用pickle的方式將模型轉儲到文件。但sklearn推薦使用其joblib接口,保存與載入模型都很easy:

import joblib

# 保存模型
joblib.dump(model, '/tmp/model.pkl')

# 載入模型
model = joblib.load('/tmp/model.pkl')

三個層次

  前面已經演示了一個完整的使用sklearn來解決實際問題的樣例,能夠發現。假設僅僅是調用sklearn的API,確實不須要太復雜的理論知識。在學完上面的演示樣例后,你也許都並不清楚kNN算法是怎樣工作的。但學習是分層次的。
  或許有的人覺得。僅僅會調用API來實現。並非真正會用機器學習了。確實。不理解kNN算法,就不清楚怎樣進行算法的參數調優。但個人覺得,從sklearn入門機器學習是最好的途徑。雖然你曾經全然沒有接觸過機器學習。
  我所理解的。學習機器學習算法的三個層次例如以下所述。

  1. 調用:知道算法的基本思想,能應用現有的庫來做測試。簡單說,就是了解kNN是做什么的,會調用sklearn中的kNN算法。
  2. 調參:知道算法的主要影響參數,能進行參數調節優化。
  3. 嚼透:理解算法的實現細節,而且能用代碼實現出來。

上面三個層次是不是非常押韻呢,但不幸的是,有的人一上來就想達到第三個層次。於是剛開始就被怎樣實現kNN算法嚇到了,過不了三天就從入門到放棄了。
  作為應用型的機器學習,能達到第三階段固然好,但在實際應用中。建議能調用現有的庫就直接調用好了。不理解的地方,能看懂源代碼最好。不太建議自己從頭實現,除非能力確實夠了,否則寫出來的代碼並不能保證性能與准確性。
  當然,從另外一個角度來說,尤其是在分布式環境下,機器學習還有另外三個層次,想知道的話,請見《全棧數據之門》一書。
  本文選自《全棧數據之門》,點此鏈接可在博文視點官網查看此書。
                    圖片描寫敘述
  想及時獲得很多其它精彩文章。可在微信中搜索“博文視點”或者掃描下方二維碼並關注。
                       圖片描寫敘述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM