溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Sklearn進(jìn)行數(shù)據(jù)挖掘的步驟

發(fā)布時(shí)間:2021-09-10 09:18:48 來(lái)源:億速云 閱讀:126 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“使用Sklearn進(jìn)行數(shù)據(jù)挖掘的步驟”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1 使用sklearn進(jìn)行數(shù)據(jù)挖掘

1.1 數(shù)據(jù)挖掘的步驟

數(shù)據(jù)挖掘通常包括數(shù)據(jù)采集,數(shù)據(jù)分析,特征工程,訓(xùn)練模型,模型評(píng)估等步驟。使用sklearn工具可以方便地進(jìn)行特征工程和模型訓(xùn)練工作,在《使用sklearn做單機(jī)特征工程》中,我們***留下了一些疑問(wèn):特征處理類都有三個(gè)方法fit、transform和fit_transform,fit方法居然和模型訓(xùn)練方法fit同名(不光同名,參數(shù)列表都一樣),這難道都是巧合?

顯然,這不是巧合,這正是sklearn的設(shè)計(jì)風(fēng)格。我們能夠更加優(yōu)雅地使用sklearn進(jìn)行特征工程和模型訓(xùn)練工作。此時(shí),不妨從一個(gè)基本的數(shù)據(jù)挖掘場(chǎng)景入手:

使用Sklearn進(jìn)行數(shù)據(jù)挖掘的步驟

我們使用sklearn進(jìn)行虛線框內(nèi)的工作(sklearn也可以進(jìn)行文本特征提取)。通過(guò)分析sklearn源碼,我們可以看到除訓(xùn)練,預(yù)測(cè)和評(píng)估以外,處理其他工作的類都實(shí)現(xiàn)了3個(gè)方法:fit、transform和fit_transform。從命名中可以看到,fit_transform方法是先調(diào)用fit然后調(diào)用transform,我們只需要關(guān)注fit方法和transform方法即可。

transform方法主要用來(lái)對(duì)特征進(jìn)行轉(zhuǎn)換。從可利用信息的角度來(lái)說(shuō),轉(zhuǎn)換分為無(wú)信息轉(zhuǎn)換和有信息轉(zhuǎn)換。無(wú)信息轉(zhuǎn)換是指不利用任何其他信息進(jìn)行轉(zhuǎn)換,比如指數(shù)、對(duì)數(shù)函數(shù)轉(zhuǎn)換等。有信息轉(zhuǎn)換從是否利用目標(biāo)值向量又可分為無(wú)監(jiān)督轉(zhuǎn)換和有監(jiān)督轉(zhuǎn)換。無(wú)監(jiān)督轉(zhuǎn)換指只利用特征的統(tǒng)計(jì)信息的轉(zhuǎn)換,統(tǒng)計(jì)信息包括均值、標(biāo)準(zhǔn)差、邊界等等,比如標(biāo)準(zhǔn)化、PCA法降維等。有監(jiān)督轉(zhuǎn)換指既利用了特征信息又利用了目標(biāo)值信息的轉(zhuǎn)換,比如通過(guò)模型選擇特征、LDA法降維等。通過(guò)總結(jié)常用的轉(zhuǎn)換類,我們得到下表:

使用Sklearn進(jìn)行數(shù)據(jù)挖掘的步驟

不難看到,只有有信息的轉(zhuǎn)換類的fit方法才實(shí)際有用,顯然fit方法的主要工作是獲取特征信息和目標(biāo)值信息,在這點(diǎn)上,fit方法和模型訓(xùn)練時(shí)的fit方法就能夠聯(lián)系在一起了:都是通過(guò)分析特征和目標(biāo)值,提取有價(jià)值的信息,對(duì)于轉(zhuǎn)換類來(lái)說(shuō)是某些統(tǒng)計(jì)量,對(duì)于模型來(lái)說(shuō)可能是特征的權(quán)值系數(shù)等。另外,只有有監(jiān)督的轉(zhuǎn)換類的fit和transform方法才需要特征和目標(biāo)值兩個(gè)參數(shù)。fit方法無(wú)用不代表其沒(méi)實(shí)現(xiàn),而是除合法性校驗(yàn)以外,其并沒(méi)有對(duì)特征和目標(biāo)值進(jìn)行任何處理,Normalizer的fit方法實(shí)現(xiàn)如下:

def fit(self, X, y=None):  """Do nothing and return the estimator unchanged This method is just there to implement the usual API and hence work in pipelines. """ X = check_array(X, accept_sparse='csr') return self

基于這些特征處理工作都有共同的方法,那么試想可不可以將他們組合在一起?在本文假設(shè)的場(chǎng)景中,我們可以看到這些工作的組合形式有兩種:流水線式和并行式?;诹魉€組合的工作需要依次進(jìn)行,前一個(gè)工作的輸出是后一個(gè)工作的輸入;基于并行式的工作可以同時(shí)進(jìn)行,其使用同樣的輸入,所有工作完成后將各自的輸出合并之后輸出。sklearn提供了包pipeline來(lái)完成流水線式和并行式的工作。

1.2 數(shù)據(jù)初貌

在此,我們?nèi)匀皇褂肐RIS數(shù)據(jù)集來(lái)進(jìn)行說(shuō)明。為了適應(yīng)提出的場(chǎng)景,對(duì)原數(shù)據(jù)集需要稍微加工:

from numpy import hstack, vstack, array, median, nan from numpy.random import choice from sklearn.datasets import load_iris  #特征矩陣加工 #使用vstack增加一行含缺失值的樣本(nan, nan, nan, nan) #使用hstack增加一列表示花的顏色(0-白、1-黃、2-紅),花的顏色是隨機(jī)的,意味著顏色并不影響花的分類 iris.data = hstack((choice([0, 1, 2], size=iris.data.shape[0]+1).reshape(-1,1), vstack((iris.data, array([nan, nan, nan, nan]).reshape(1,-1))))) #目標(biāo)值向量加工 #增加一個(gè)目標(biāo)值,對(duì)應(yīng)含缺失值的樣本,值為眾數(shù) iris.target = hstack((iris.target, array([median(iris.target)])))

1.3 關(guān)鍵技術(shù)

并行處理,流水線處理,自動(dòng)化調(diào)參,持久化是使用sklearn優(yōu)雅地進(jìn)行數(shù)據(jù)挖掘的核心。并行處理和流水線處理將多個(gè)特征處理工作,甚至包括模型訓(xùn)練工作組合成一個(gè)工作(從代碼的角度來(lái)說(shuō),即將多個(gè)對(duì)象組合成了一個(gè)對(duì)象)。在組合的前提下,自動(dòng)化調(diào)參技術(shù)幫我們省去了人工調(diào)參的反鎖。訓(xùn)練好的模型是貯存在內(nèi)存中的數(shù)據(jù),持久化能夠?qū)⑦@些數(shù)據(jù)保存在文件系統(tǒng)中,之后使用時(shí)無(wú)需再進(jìn)行訓(xùn)練,直接從文件系統(tǒng)中加載即可。

2 并行處理

并行處理使得多個(gè)特征處理工作能夠并行地進(jìn)行。根據(jù)對(duì)特征矩陣的讀取方式不同,可分為整體并行處理和部分并行處理。整體并行處理,即并行處理的每個(gè)工作的輸入都是特征矩陣的整體;部分并行處理,即可定義每個(gè)工作需要輸入的特征矩陣的列。

2.1 整體并行處理

pipeline包提供了FeatureUnion類來(lái)進(jìn)行整體并行處理:

from numpy import log1p from sklearn.preprocessing import FunctionTransformer from sklearn.preprocessing import Binarizer from sklearn.pipeline import FeatureUnion   #新建將整體特征矩陣進(jìn)行對(duì)數(shù)函數(shù)轉(zhuǎn)換的對(duì)象 step2_1 = ('ToLog', FunctionTransformer(log1p)) #新建將整體特征矩陣進(jìn)行二值化類的對(duì)象 step2_2 = ('ToBinary', Binarizer()) #新建整體并行處理對(duì)象 #該對(duì)象也有fit和transform方法,fit和transform方法均是并行地調(diào)用需要并行處理的對(duì)象的fit和transform方法 #參數(shù)transformer_list為需要并行處理的對(duì)象列表,該列表為二元組列表,***元為對(duì)象的名稱,第二元為對(duì)象  step2 = ('FeatureUnion', FeatureUnion(transformer_list=[step2_1, step2_2, step2_3]))

2.2 部分并行處理

整體并行處理有其缺陷,在一些場(chǎng)景下,我們只需要對(duì)特征矩陣的某些列進(jìn)行轉(zhuǎn)換,而不是所有列。pipeline并沒(méi)有提供相應(yīng)的類(僅OneHotEncoder類實(shí)現(xiàn)了該功能),需要我們?cè)贔eatureUnion的基礎(chǔ)上進(jìn)行優(yōu)化:

View Code

在本文提出的場(chǎng)景中,我們對(duì)特征矩陣的第1列(花的顏色)進(jìn)行定性特征編碼,對(duì)第2、3、4列進(jìn)行對(duì)數(shù)函數(shù)轉(zhuǎn)換,對(duì)第5列進(jìn)行定量特征二值化處理。使用FeatureUnionExt類進(jìn)行部分并行處理的代碼如下:

from numpy import log1p from sklearn.preprocessing import OneHotEncoder from sklearn.preprocessing import FunctionTransformer from sklearn.preprocessing import Binarizer  #新建將部分特征矩陣進(jìn)行定性特征編碼的對(duì)象 step2_1 = ('OneHotEncoder', OneHotEncoder(sparse=False)) #新建將部分特征矩陣進(jìn)行對(duì)數(shù)函數(shù)轉(zhuǎn)換的對(duì)象 step2_2 = ('ToLog', FunctionTransformer(log1p)) #新建將部分特征矩陣進(jìn)行二值化類的對(duì)象 step2_3 = ('ToBinary', Binarizer()) #新建部分并行處理對(duì)象 #參數(shù)transformer_list為需要并行處理的對(duì)象列表,該列表為二元組列表,***元為對(duì)象的名稱,第二元為對(duì)象 #參數(shù)idx_list為相應(yīng)的需要讀取的特征矩陣的列 step2 = ('FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4]]))

3 流水線處理

pipeline包提供了Pipeline類來(lái)進(jìn)行流水線處理。流水線上除***一個(gè)工作以外,其他都要執(zhí)行fit_transform方法,且上一個(gè)工作輸出作為下一個(gè)工作的輸入。***一個(gè)工作必須實(shí)現(xiàn)fit方法,輸入為上一個(gè)工作的輸出;但是不限定一定有transform方法,因?yàn)榱魉€的***一個(gè)工作可能是訓(xùn)練!

根據(jù)本文提出的場(chǎng)景,結(jié)合并行處理,構(gòu)建完整的流水線的代碼如下:

  1. from numpy import log1p 

  2. from sklearn.preprocessing import Imputer 

  3. from sklearn.preprocessing import OneHotEncoder 

  4. from sklearn.preprocessing import FunctionTransformer 

  5. from sklearn.preprocessing import Binarizer 

  6. from sklearn.preprocessing import MinMaxScaler 

  7. from sklearn.feature_selection import SelectKBest 

  8. from sklearn.feature_selection import chi2 

  9. from sklearn.decomposition import PCA 

  10. from sklearn.linear_model import LogisticRegression 

  11. from sklearn.pipeline import Pipeline 


  12. #新建計(jì)算缺失值的對(duì)象 

  13. step1 = ('Imputer', Imputer()) 

  14. #新建將部分特征矩陣進(jìn)行定性特征編碼的對(duì)象 

  15. step2_1 = ('OneHotEncoder', OneHotEncoder(sparse=False)) 

  16. #新建將部分特征矩陣進(jìn)行對(duì)數(shù)函數(shù)轉(zhuǎn)換的對(duì)象 

  17. step2_2 = ('ToLog', FunctionTransformer(log1p)) 

  18. #新建將部分特征矩陣進(jìn)行二值化類的對(duì)象 

  19. step2_3 = ('ToBinary', Binarizer()) 

  20. #新建部分并行處理對(duì)象,返回值為每個(gè)并行工作的輸出的合并 

  21. step2 = ('FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4]])) 

  22. #新建無(wú)量綱化對(duì)象 

  23. step3 = ('MinMaxScaler', MinMaxScaler()) 

  24. #新建卡方校驗(yàn)選擇特征的對(duì)象 

  25. step4 = ('SelectKBest', SelectKBest(chi2, k=3)) 

  26. #新建PCA降維的對(duì)象 

  27. step5 = ('PCA', PCA(n_components=2)) 

  28. #新建邏輯回歸的對(duì)象,其為待訓(xùn)練的模型作為流水線的***一步 

  29. step6 = ('LogisticRegression', LogisticRegression(penalty='l2')) 

  30. #新建流水線處理對(duì)象 

  31. #參數(shù)steps為需要流水線處理的對(duì)象列表,該列表為二元組列表,***元為對(duì)象的名稱,第二元為對(duì)象 

  32. pipeline = Pipeline(steps=[step1, step2, step3, step4, step5, step6]) 

4 自動(dòng)化調(diào)參

網(wǎng)格搜索為自動(dòng)化調(diào)參的常見(jiàn)技術(shù)之一,grid_search包提供了自動(dòng)化調(diào)參的工具,包括GridSearchCV類。對(duì)組合好的對(duì)象進(jìn)行訓(xùn)練以及調(diào)參的代碼如下:

  1. from sklearn.grid_search import GridSearchCV 
    #新建網(wǎng)格搜索對(duì)象 

  2. #***參數(shù)為待訓(xùn)練的模型 

  3. #param_grid為待調(diào)參數(shù)組成的網(wǎng)格,字典格式,鍵為參數(shù)名稱(格式“對(duì)象名稱__子對(duì)象名稱__參數(shù)名稱”),值為可取的參數(shù)值列表 

  4. grid_search = GridSearchCV(pipeline, param_grid={'FeatureUnionExt__ToBinary__threshold':[1.0, 2.0, 3.0, 4.0], 'LogisticRegression__C':[0.1, 0.2, 0.4, 0.8]}) 

  5. #訓(xùn)練以及調(diào)參 

  6. grid_search.fit(iris.data, iris.target) 

5 持久化

externals.joblib包提供了dump和load方法來(lái)持久化和加載內(nèi)存數(shù)據(jù):

#持久化數(shù)據(jù) #***個(gè)參數(shù)為內(nèi)存中的對(duì)象 #第二個(gè)參數(shù)為保存在文件系統(tǒng)中的名稱 #第三個(gè)參數(shù)為壓縮級(jí)別,0為不壓縮,3為合適的壓縮級(jí)別 dump(grid_search, 'grid_search.dmp', compress=3) #從文件系統(tǒng)中加載數(shù)據(jù)到內(nèi)存中 grid_search = load('grid_search.dmp')

6 回顧

使用Sklearn進(jìn)行數(shù)據(jù)挖掘的步驟

注意:組合和持久化都會(huì)涉及pickle技術(shù),在sklearn的技術(shù)文檔中有說(shuō)明,將lambda定義的函數(shù)作為FunctionTransformer的自定義轉(zhuǎn)換函數(shù)將不能pickle化。

“使用Sklearn進(jìn)行數(shù)據(jù)挖掘的步驟”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI