Python機器學習庫scikit-learn使用小結(一)

scikit-learn庫(前兩小結)

       在做數據分析和挖掘的過程中,數據的處理(標準化)、劃分、快速建模都是必不可少的方式。這裏本人總結了一些scikit-learn(以下簡稱sklearn)庫的使用方法小結,當然也本人在工作中時常需要用到的一些。(方法在精不在多,這裏不是sklearn所以的總結)

       sklearn庫整合了多種機器學習算法,能夠在數據分析過程中快速建立模型,且模型接口統一,使用起來非常方便。基於官方文檔,本次我們只小結4個點:sklearn轉換器、數據標準化與數據劃分、聚類,分類,迴歸模型的構建與評估。

1、sklearn轉換器處理數據

       sklearn提供了datasets模塊、model_selection模型選擇模塊,preprocessing數據預處理模塊與decompisition特徵分解模塊。實現數據的預處理與模型構建前的數據標準化,二值化,歸一化,數據集的分割,交叉驗證,PCA降維。

1.1、加載datasets模塊中數據集

       sklearn庫的datasets模塊集成了部分數據分析的經典數據集,可以使用這些數據集進行數據預處理,建模等操作,熟悉sklearn的數據處理流程和建模流程。datasets模塊常用數據集的加載函數與解釋如下表所示。

數據集加載函數

數據集任務類型

數據集加載函數

數據集任務類型

load_ boston

迴歸

load_breast_cancer

分類,聚類

fetch_california_housing

迴歸

load_iris

分類,聚類

load_digits

分類

load_wine

分類

       使用sklearn進行數據預處理會用到sklearn提供的統一接口——轉換器(Transformer)。如果需要加載某個數據集可以將對應的函數賦值給某個變量。

       加載後的數據集可以視爲一個字典,幾乎所有的sklearn數據集均可以使用data,target,feature_names,DESCR分別獲取數據集的數據,標籤,特徵名稱和描述信息。

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()##將數據集賦值給iris變量
print('breast_cancer數據集的長度爲:',len(cancer))
print('breast_cancer數據集的類型爲:',type(cancer))

cancer_data = cancer['data']
print('breast_cancer數據集的數據爲:','\n',cancer_data)

cancer_data = cancer['data']
print('breast_cancer數據集的數據爲:','\n',cancer_data)

cancer_target = cancer['target'] ## 取出數據集的標籤
print('breast_cancer數據集的標籤爲:\n',cancer_target)

cancer_names = cancer['feature_names'] ## 取出數據集的特徵名
print('breast_cancer數據集的特徵名爲:\n',cancer_names)

cancer_desc = cancer['DESCR'] ## 取出數據集的描述信息
print('breast_cancer數據集的描述信息爲:\n',cancer_desc)

2.1、將數據集劃分爲訓練集和測試集

       在數據分析過程中,爲了保證模型在實際系統中能夠起到預期作用,一般需要將樣本分成獨立的三部分:訓練集(train set),驗證集(validation set)和測試集(test set)。其中訓練集用於估計模型,驗證集用於確定網絡結構或者控制模型複雜程度的參數,而測試集則用於檢驗最優的模型的性能。典型的劃分方式是訓練集佔總樣本的50%,而驗證集和測試集各佔25%。

       當數據總量較少的時候,使用上面的方法將數據劃分爲三部分就不合適了。常用的方法是留少部分做測試集,然後對其餘N個樣本採用K折交叉驗證法。其基本步驟是將樣本打亂,然後均勻分成K份,輪流選擇其中K-1份做訓練,剩餘的一份做驗證,計算預測誤差平方和,最後把K次的預測誤差平方和的均值作爲選擇最優模型結構的依據。sklearn的model_selection模塊提供了train_test_split函數,能夠對數據集進行拆分,其使用格式如下。

sklearn.model_selection.train_test_split(*arrays, **options)

       train_test_split函數及其常用參數如下表所示。

參數名稱

說明

*arrays

接收一個或多個數據集。代表需要劃分的數據集,若爲分類迴歸則分別傳入數據和標籤,若爲聚類則傳入數據。無默認。

test_size

接收float,int,None類型的數據。代表測試集的大小。如果傳入的爲float類型的數據則需要限定在0-1之間,代表測試集在總數中的佔比;如果傳入爲int類型的數據,則表示測試集記錄的絕對數目。該參數與train_size可以只傳入一個。

train_size

接收float,int,None類型的數據。代表訓練集的大小。該參數與test_size可以只傳入一個。

random_state

接收int。代表隨機種子編號,相同隨機種子編號產生相同的隨機結果,不同的隨機種子編號產生不同的隨機結果。默認爲None。

shuffle

接收boolean。代表是否進行有放回抽樣。若該參數取值爲True則stratify參數必須不能爲空。

stratify

接收array或者None。如果不爲None,則使用傳入的標籤進行分層抽樣。

       train_test_split函數根據傳入的數據,分別將傳入的數據劃分爲訓練集和測試集。如果傳入的是1組數據,那麼生成的就是這一組數據隨機劃分後訓練集和測試集,總共2組。如果傳入的是2組數據,則生成的訓練集和測試集分別2組,總共4組。將breast_cancer數據劃分爲訓練集和測試集。

from sklearn.model_selection import train_test_split
cancer_data_train, cancer_data_test, cancer_target_train, cancer_target_test = \
train_test_split(cancer_data, cancer_target, test_size=0.2, random_state=42)
print('訓練集數據的形狀爲:',cancer_data_train.shape)
print('訓練集標籤的形狀爲:',cancer_target_train.shape)
print('測試集數據的形狀爲:',cancer_data_test.shape)
print('測試集標籤的形狀爲:',cancer_target_test.shape)

       在model_selection模塊中還提供了其他數據集劃分的函數,如PredefinedSplit,ShuffleSplit等。

2.2、使用sklearn轉換器進行數據預處理與降維

       爲幫助用戶實現大量的特徵處理相關操作,sklearn把相關的功能封裝爲轉換器(transformer)。轉換器主要包括三個方法:fit,transform和fit_transform。

方法名稱

說明

fit

fit方法主要通過分析特徵和目標值,提取有價值的信息,這些信息可以是統計量,也可以是權值係數等。

transform

transform方法主要用來對特徵進行轉換。以可利用信息的角度可分爲無信息轉換和有信息轉換。無信息轉換是指不利用任何其他信息進行轉換,比如指數和對數函數轉換等。有信息轉換根據是否利用目標值向量又可分爲無監督轉換和有監督轉換。

fit_transform

fit_transform方法就是先調用fit方法,然後調用transform方法。

       使用sklearn轉換器能夠實現對傳入的NumPy數組進行標準化處理,歸一化處理,二值化處理,PCA降維等操作。在數據分析過程中,各類特徵處理相關的操作都需要對訓練集和測試集分開操作,需要將訓練集的操作規則,權重係數等應用到測試集中。

import numpy as np
from sklearn.preprocessing import MinMaxScaler
Scaler = MinMaxScaler().fit(cancer_data_train) ##生成規則
cancer_trainScaler = Scaler.transform(cancer_data_train) ##將規則應用於訓練集
print('離差標準化前訓練集數據的最小值爲:',np.min(cancer_data_train))
print('離差標準化後訓練集數據的最小值爲:',np.min(cancer_trainScaler))
print('離差標準化前訓練集數據的最大值爲:',np.max(cancer_data_train))
print('離差標準化後訓練集數據的最大值爲:',np.max(cancer_trainScaler))

       離差標準化之後的訓練集數據的最小值,最大值的確限定在了[0,1]之間,同時由於測試集是應用了訓練集的離差標準化規則,數據超出了[0,1]的範圍。sklearn除了提供離差標準化函數MinMaxScaler外,還提供了一系列數據預處理函數,具體如下表所示。

函數名稱

說明

StandardScaler

對特徵進行標準差標準化。

Normalizer

對特徵進行歸一化。

Binarizer

對定量特徵進行二值化處理。

OneHotEncoder

對定性特徵進行獨熱編碼處理。

FunctionTransformer

對特徵進行自定義函數變換。

       sklearn除了提供基本的特徵變換函數外,還提供了降維算法,特徵選擇算法,這些算法的使用也是通過轉換器的方式。對breast_cancer數據集進行PCA降維算法,則特徵維度降爲3。

from sklearn.decomposition import PCA
pca_model = PCA(n_components=3).fit(cancer_trainScaler) ##生成規則
cancer_trainPca = pca_model.transform(cancer_trainScaler) ##將規則應用於訓練集
print('PCA降維前訓練集數據的形狀爲:',cancer_trainScaler.shape)
print('PCA降維後訓練集數據的形狀爲:',cancer_trainPca.shape)

       PCA降維算法常用參數如下。

函數名稱

說明

n_components

接收None,int,float或string。未指定時,代表所有特徵均會被保留下來;如果爲int,則表示將原始數據降低到n個維度;如果爲float,同時svd_solver參數等於full;賦值爲string,比如n_components='mle',將自動選取特徵個數n,使得滿足所要求的方差百分比。默認爲None。

copy

接收bool。代表是否在運行算法時將原始數據複製一份,如果爲True,則運行後,原始數據的值不會有任何改變。默認爲True

whiten

接收boolean。表示白化,就是對降維後的數據的每個特徵進行歸一化,讓方差都爲1。默認爲False。

svd_solver

接收string {‘auto’, ‘full’, ‘arpack’, ‘randomized’}。代表使用的SVD算法。randomized一般適用於數據量大,數據維度多,同時主成分數目比例又較低的PCA降維。full是使用SciPy庫實現的傳統SVD算法。arpack和randomized的適用場景類似,區別是randomized使用的是sklearn自己的SVD實現,而arpack直接使用了SciPy庫的sparse SVD實現。auto則代表PCA類會自動在上述三種算法中去權衡,選擇一個合適的SVD算法來降維。默認爲auto。

 

文章未經博主同意,禁止轉載!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章