機器學習框架之sklearn簡介

今天給大家簡單介紹一下sKlearn, 分節如下:

  1. 簡介
  2. 基本概括
  3. 例子實戰之導入數據及數據預處理
  4. 例子實戰之訓練模型
  5. 模型選擇
  6. 超參的搜索
  7. 特徵選擇
  8. 數據切分
  9. Pineline
  10. 小結

簡介

今天為大家介紹的是scikit-learnsklearn是一個Python第三方提供的非常強力的機器學習庫,它包含了從數據預處理到訓練模型的各個方面。在實戰使用scikit-learn中可以極大的節省我們編寫代碼的時間以及減少我們的代碼量,使我們有更多的精力去分析數據分布,調整模型和修改超參。(sklearn為包名

基本概括

sklearn擁有可以用於監督和無監督學習的方法,一般來說監督學習使用的更多。sklearn中的大部分函數可以歸為估計器(Estimator)轉化器(Transformer)兩類。

估計器(Estimator)其實就是模型,它用於對數據的預測或回歸。基本上估計器都會有以下幾個方法:

  • fit(x,y) :傳入數據以及標籤即可訓練模型,訓練的時間和參數設置,數據集大小以及數據本身的特點有關
  • score(x,y)用於對模型的正確率進行評分(範圍0-1)。但由於對在不同的問題下,評判模型優劣的的標準不限於簡單的正確率,可能還包括召回率或者是查准率等其他的指標,特別是對於類別失衡的樣本,準確率並不能很好的評估模型的優劣,因此在對模型進行評估時,不要輕易的被score的得分蒙蔽。
  • predict(x)用於對數據的預測,它接受輸入,並輸出預測標籤,輸出的格式為numpy數組。我們通常使用這個方法返回測試的結果,再將這個結果用於評估模型。

轉化器(Transformer)用於對數據的處理,例如標準化、降維以及特徵選擇等等。同與估計器的使用方法類似:

  • fit(x,y) :該方法接受輸入和標籤,計算出數據變換的方式。
  • transform(x) :根據已經計算出的變換方式,返回對輸入數據x變換後的結果(不改變x)
  • fit_transform(x,y) :該方法在計算出數據變換方式之後對輸入x就地轉換。

以上僅僅是簡單的概括sklearn的函數的一些特點。sklearn絕大部分的函數的基本用法大概如此。但是不同的估計器會有自己不同的屬性,例如隨機森林會有Feature_importance來對衡量特徵的重要性,而邏輯回歸有coef_存放回歸係數intercept_則存放截距等等。並且對於機器學習來說模型的好壞不僅取決於你選擇的是哪種模型,很大程度上與你超參的設置有關。因此使用sklearn的時候一定要去看看官方文檔,以便對超參進行調整。

例子實戰之導入數據及數據預處理

sklearndatasets中提供一些訓練數據,我們可以使用這些數據來進行分類或者回歸等等,以此熟悉sklearn的使用。

如下面代碼所示我們讀取了鳶尾屬植物的分類數據集。load_iris()返回的是一個類似字典的對象通過關鍵字則可以獲取對應的數據。

from sklearn.datasets import load_irisndataSet = load_iris()ndata = dataSet[data] # 數據nlabel = dataSet[target] # 數據對應的標籤nfeature = dataSet[feature_names] # 特徵的名稱ntarget = dataSet[target_names] # 標籤的名稱nprint(target)n

現在我們已經讀取了數據,首先第一件事應當是查看數據的特點。我們可以看到標籤總共有三個,所以該數據要解決的是一個三分類問題。接著我們要去查看數據特徵,用pandasDataFrame展示是一個很好選擇。

import pandas as pdimport numpy as npndf = pd.DataFrame(np.column_stack((data,label)),columns = np.append(feature,label))ndf.head()# 查看前五行數據 n

我們可以看到一條數據對應了4個連續特徵,接著應當查看一些數據集的缺失值的比例,這一步非常重要,如果數據集中出現缺失值,在訓練模型的時候就會出現問題。

df.isnull().sum(axis=0).sort_values(ascending=False)/float(len(df))# 檢查缺失值比例 n

sklearnpreprocessing中有提供Imputer()處理缺失值的函數,它提供了中位數、均值、眾數等策略填充缺失值。但是不同情況下處理不一定使用填充來處理缺失值。因此在遇到缺失值的時候要慎重處理。幸運的是我們這個數據集中沒有缺失值,這樣節省了我們處理缺失值的時間。接下來要判斷數據集的樣本類別是否均衡。

df[label].value_counts() # 檢查數據類別的比例 n

非常幸運,我們的樣本類別的比例恰好是1:1:1,如果我們樣本比例失衡嚴重,那麼我們可能需要對失衡的比例做一些調整,例如重採樣欠採樣等等。現在數據集看上去沒有什麼大的問題了,但是在訓練之前,我們還是應當對數據進行標準化處理。

模型訓練之前,我們要對數據進行預處理。sklearn中的preprocessing模塊提供非常多的數據歸一化的類。

標準化之後的數據不僅可以提高模型的訓練速度,並且不同的標準會帶來不一樣的好處。

from sklearn.preprocessing import StandardScalernStandardScaler().fit_transform(data)n

例如,z-score 標準化將樣本的特徵值轉換到同一量綱下,使得不同特徵之間有可比性。以上我們就是使用了z-score標準化,sklearnpreprocessing中還有一些其他的標準化方法,有興趣的朋友可以查看官方文檔。

例子實戰之訓練模型

在處理好數據之後我們就可以訓練模型了,以多元邏輯回歸為例

from sklearn.linear_model import LogisticRegressionnfrom sklearn.model_selection import ShuffleSplitnfrom sklearn.metrics import classification_reportnfrom sklearn.metrics import roc_auc_scorenss = ShuffleSplit(n_splits = 1,test_size= 0.2) # 按比例拆分數據,80%用作訓練nfor tr,te in ss.split(data,label):n xr = data[tr]n xe = data[te]n yr = label[tr]n ye = label[te]n clf = LogisticRegression(solver = lbfgs,multi_class = multinomial) n clf.fit(xr,yr)n predict = clf.predict(xe)n print(classification_report(ye, predict)) n

這裡我們的邏輯回歸使用OVR多分類方法,

OvR把多元邏輯回歸,看做二元邏輯回歸。具體做法是,每次選擇一類為正例,其餘類別為負例,然後做二元邏輯回歸,得到第該類的分類模型。最後得出多個二元回歸模型。按照各個類別的得分得出分類結果。

模型選擇

對於一個分類任務,我們可以按照以上的圖來選擇一個比較合適的解決方法或者模型,但模型的選擇並不是絕對的,事實上很多情況下你會去試驗很多的模型,才能比較出適合該問題的模型。

數據劃分

我們可以使用交叉驗證或其他劃分數據集的方法對數據集多次劃分,以得出模型平均的性能而不是偶然結果。sklearn 有很多劃分數據集的方法,它們都在model_selection 裡面,常用的有

  • K折交叉驗證:
    • KFold 普通K折交叉驗證
    • StratifiedKFold(保證每一類的比例相等)
  • 留一法:
    • LeaveOneOut (留一)
    • LeavePOut (留P驗證,當P = 1 時變成留一法)
  • 隨機劃分法:
    • ShuffleSplit (隨機打亂後劃分數據集)
    • StratifiedShuffleSplit (隨機打亂後,返回分層劃分,每個劃分類的比例與樣本原始比例一致)

以上方法除了留一法都有幾個同樣的參數:

  • n_splits:設置劃分次數
  • random_state:設置隨機種子

以上的劃分方法各有各的優點,留一法、K折交叉驗證充分利用了數據,但開銷比隨機劃分要高,隨機劃分方法可以較好的控制訓練集與測試集的比例。(通過設置train_size參數)。關於劃分數據集的使用可以參照上面例子中的ShuffleSplit的用法,其他的函數使用方法大同小異,詳細可查看官方文檔。

超參的搜索

我們上面已經初步得出模型,並且效果看起來還不錯,所以我們現在應該下想辦法進一步優化這一個模型了。

我們在調參的時候需要將數據集分為三部分,分別是:訓練集、驗證集以及測試集。訓練集用於模型的訓練,然後我們根據驗證集的結果去調整出泛化能力較強的模型,最後通過測試集得出模型的泛化能力。如果只把數據分為訓練集和測試集,也許你能調出對於測試集最合適的參數,但模型的泛化能力也許並沒有在測試集上表現的那麼強。

由於鳶尾屬植物的數據集並不大,如果將數據分為三部分的話,訓練數據就太少了,可能提高不了模型的性能。在此只是簡單的介紹sklearn中的調參方法。

model_seletion裡面還提供自動調參的函數,以格搜索(GridSearchCV)為例。

from sklearn.model_selection import GridSearchCVnclf = LogisticRegression()ngs = GridSearchCV(clf, parameters)ngs.fit(data, label)ngs.best_params_ n

通過傳入字典,對比使用不同的參數的估計器的效果,得出最優的參數。這裡是對邏輯回歸的精度進行調整。另外我們還可以使用不同的指標來選擇參數,不同的指標在sklearn.metrics

特徵選擇

當特徵特別多的時候,且有冗餘的情況下,對特徵進行選擇不僅能使訓練速度加快,還可以排除一些負面特徵的干擾。sklearnfeature_seletion提供了它許多特徵選取函數,目前包括單變數選擇方法遞歸特徵消除演算法。它們均為轉化器,故在此不舉例說明如何使用。

除了使用feature_seletion的方法選取特徵外,我們也可以選擇那些帶有特徵選擇的模型進行選擇特徵,例如隨機森林會根據特徵的重要程度對特徵打分。

Pineline

使用pineline可以按順序構建從數據處理到和訓練模型的整個過程。pineline中間的步驟必須轉化器(對數據進行處理)。使用pineline的好處就是可以封裝一個學習的過程,使得重新調用這個過程變得更加方便。中間的過程用多個二元組組成的列表表示。

from sklearn.pipeline import Pipelinenfrom sklearn.decomposition import PCAnpca = PCA(n_components=2)nclf = LogisticRegression()nnew_clf = Pipeline([(pca,pca),(clf,clf)]) n

上面的封裝的估計器,會先用PCA將數據降至兩維,在用邏輯回歸去擬合。

小結

本期介紹sklearn只做簡單介紹,還有一些方面沒有涉及,例如特徵抽取、降維等等,這些在官方文檔中有詳細使用方法及參數介紹。


推薦閱讀:

第十三章 Python: xml轉json
《Fluent Python》雜記
Python 曾經開發過哪些了不起的程序或遊戲?
想擴展知識,學一門新語言,該學 Python、Ruby,還是 C++ ?

TAG:Python | 机器学习 | sklearn |