1.導(dǎo)入
前面有過(guò)這樣的比方,首要對(duì)數(shù)據(jù)進(jìn)行縮放,然后手動(dòng)兼并特征,再運(yùn)用無(wú)監(jiān)督機(jī)器學(xué)習(xí)來(lái)學(xué)習(xí)特征。因而,大多數(shù)機(jī)器學(xué)習(xí)運(yùn)用不只需求運(yùn)用單個(gè)算法,而且還需求將許多不同的處理進(jìn)程和機(jī)器學(xué)習(xí)模型鏈接在一起。接下來(lái)將介紹怎樣運(yùn)用Pipeline 類(lèi)來(lái)簡(jiǎn)化構(gòu)建改換和模型鏈的進(jìn)程,將要點(diǎn)介紹怎樣將Pipeline 和GridSearchCV 結(jié)合起來(lái),然后一起查找一切處理進(jìn)程中的參數(shù)。
舉一個(gè)比方來(lái)闡明模型鏈的重要性。咱們知道,能夠經(jīng)過(guò)運(yùn)用MinMaxScaler 進(jìn)行預(yù)處理來(lái)大大提高核SVM 在cancer 數(shù)據(jù)集上的功能。下面這些代碼完成了區(qū)分?jǐn)?shù)據(jù)、核算最小值和最大值、縮放數(shù)據(jù)與練習(xí)SVM:
上面的代碼第11行,是在x_train數(shù)據(jù)中找到最大值、最小值,然后用它別離縮放練習(xí)集和測(cè)驗(yàn)集,如第13、15行所示。這是所要求的正確的做法。
現(xiàn)看下面的比方:練習(xí)集和驗(yàn)證集卻沒(méi)有遵從這個(gè)要求。
!!! 問(wèn)題所在 : 穿插驗(yàn)證的數(shù)據(jù)集是已經(jīng)在外面進(jìn)行縮放處理的練習(xí)集,在穿插驗(yàn)證內(nèi)部將其格外 練習(xí)集和驗(yàn)證集如圖 6-1所示。
謹(jǐn)記一條準(zhǔn)則:先區(qū)分?jǐn)?shù)據(jù)集,再進(jìn)行縮放處理或其它預(yù)處理。
那么,在穿插驗(yàn)證內(nèi)部,怎樣做到呢?
在scikit-learn 中,要想運(yùn)用cross_val_score 函數(shù)和GridSearchCV 函數(shù)完成這一點(diǎn),能夠運(yùn)用Pipeline 類(lèi)。Pipeline 類(lèi)能夠?qū)⒍鄠€(gè)處理進(jìn)程兼并(glue)為單個(gè)scikit-learn 估量器。Pipeline 類(lèi)自身具有fit、predict 和score 辦法,其行為與scikit-learn 中的其他模型相同。Pipeline 類(lèi)最常見(jiàn)的用例是將預(yù)處理進(jìn)程(比方數(shù)據(jù)縮放)與一個(gè)監(jiān)督模型(比方分類(lèi)器)鏈接在一起。2.構(gòu)建管道的辦法
咱們來(lái)看一下怎樣運(yùn)用Pipeline 類(lèi)來(lái)表明在運(yùn)用MinMaxScaler 縮放數(shù)據(jù)之后再練習(xí)一個(gè)SVM 的作業(yè)流程(對(duì)應(yīng)本文最初的第一個(gè)比方)。首要,咱們構(gòu)建一個(gè)由進(jìn)程列表組成的管道目標(biāo)。每個(gè)進(jìn)程都是一個(gè)元組,其間包含一個(gè)稱(chēng)號(hào)和一個(gè)估量器的實(shí)例。
這兒創(chuàng)立了兩個(gè)進(jìn)程:第一個(gè)叫作"scaler",是MinMaxScaler 的實(shí)例;第二個(gè)叫作"svm",是SVC 的實(shí)例。現(xiàn)在來(lái)擬合這個(gè)管道,pipe.fit 首要對(duì)第一個(gè)進(jìn)程(縮放器)調(diào)用fit,然后運(yùn)用該縮放器對(duì)練習(xí)數(shù)據(jù)進(jìn)行改換,最終用縮放后的數(shù)據(jù)來(lái)擬合SVM。要想在測(cè)驗(yàn)數(shù)據(jù)上進(jìn)行評(píng)價(jià),咱們只需調(diào)用pipe.score,代碼如下:
在對(duì)管道調(diào)用score 辦法時(shí),首要運(yùn)用縮放器對(duì)測(cè)驗(yàn)數(shù)據(jù)進(jìn)行改換,然后運(yùn)用縮放后的測(cè)驗(yàn)數(shù)據(jù)對(duì)SVM 調(diào)用score 辦法。如你所見(jiàn),這個(gè)成果與咱們從本章最初的第一個(gè)比方中的代碼得到的成果是相同的。運(yùn)用管道,咱們削減了“預(yù)處理+ 分類(lèi)”進(jìn)程所需求的代碼量。
運(yùn)用管道的首要長(zhǎng)處在于,現(xiàn)在咱們能夠在cross_val_score 或GridSearchCV 中運(yùn)用這個(gè)估量器,針對(duì)本文最初的第二比方運(yùn)用管道:3.解決問(wèn)題:在網(wǎng)絡(luò)查找中運(yùn)用管道
咱們界說(shuō)一個(gè)需求查找的參數(shù)網(wǎng)格,并運(yùn)用管道和參數(shù)網(wǎng)格構(gòu)建一個(gè)GridSearchCV。不過(guò)在指定參數(shù)網(wǎng)格時(shí)存在一處纖細(xì)的改變。咱們需求為每個(gè)參數(shù)指定它在管道中所屬的進(jìn)程。咱們要調(diào)理的兩個(gè)參數(shù)C 和gamma 都是SVC 的參數(shù),歸于第二個(gè)進(jìn)程。咱們給這個(gè)進(jìn)程的稱(chēng)號(hào)是"svm"。為管道界說(shuō)參數(shù)網(wǎng)格的語(yǔ)法是為每個(gè)參數(shù)指定進(jìn)程稱(chēng)號(hào),后邊加上__(雙下劃線),然后是參數(shù)稱(chēng)號(hào)。因而,要想查找SVC 的C 參數(shù),有必要運(yùn)用"svm__C" 作為參數(shù)網(wǎng)格字典的鍵,對(duì)gamma 參數(shù)也是同理:
與本文最初的第二比方中所做的網(wǎng)格查找不同,現(xiàn)在關(guān)于穿插驗(yàn)證的每次區(qū)分來(lái)說(shuō),僅運(yùn)用練習(xí)部分對(duì)MinMaxScaler 進(jìn)行擬合。將圖6-2 與圖6-1 進(jìn)行比照。
圖6-2: 運(yùn)用管道在穿插驗(yàn)證循環(huán)內(nèi)部進(jìn)行預(yù)處理時(shí)的數(shù)據(jù)運(yùn)用情況4.簡(jiǎn)析管道的作業(yè)流程
Pipeline 類(lèi)不光可用于預(yù)處理和分類(lèi),實(shí)踐上還能夠?qū)㈨б鈹?shù)量的估量器銜接在一起。例如,你能夠構(gòu)建一個(gè)包含特征提取、特征挑選、縮放和分類(lèi)的管道,總共有4 個(gè)進(jìn)程。相同,最終一步能夠是回歸或聚類(lèi)等。
關(guān)于管道中估量器的僅有要求就是,除了最終一步之外的一切進(jìn)程都需求具有transform辦法,這樣它們能夠生成新的數(shù)據(jù)表明,以供下一個(gè)進(jìn)程運(yùn)用。在調(diào)用Pipeline.fit 的進(jìn)程中,管道內(nèi)部順次對(duì)每個(gè)進(jìn)程調(diào)用fit 和transform,其輸入是前一個(gè)進(jìn)程中transform 辦法的輸出。關(guān)于管道中的最終一步,則僅調(diào)用fit。
疏忽某些細(xì)枝末節(jié),其完成辦法如下所示。請(qǐng)記住,pipeline.steps 是由元組組成的列表,所以pipeline.steps[0][1] 是第一個(gè)估量器,pipeline.steps[1][1] 是第二個(gè)估量器,以此類(lèi)推:
4.1 用make_pipline辦法創(chuàng)立管道?
咱們一般不需求為每一個(gè)進(jìn)程供給用戶指定的稱(chēng)號(hào)。有一個(gè)很便利的函數(shù)make_pipeline,能夠創(chuàng)立管道并依據(jù)每個(gè)進(jìn)程所屬的類(lèi)為其主動(dòng)命名。make_pipeline 的語(yǔ)法如下所示:
4.2 拜訪進(jìn)程特點(diǎn)
一般來(lái)說(shuō),想拜訪管道中的進(jìn)程,最簡(jiǎn)略的辦法是經(jīng)過(guò)named_steps 特點(diǎn),它是一個(gè)字典,將進(jìn)程稱(chēng)號(hào)映射為估量器:
4.3 拜訪網(wǎng)格查找管道中的特點(diǎn)
運(yùn)用管道的首要場(chǎng)景就是進(jìn)行網(wǎng)格查找。一個(gè)常見(jiàn)的使命是在網(wǎng)格查找內(nèi)拜訪管道的某些進(jìn)程。咱們對(duì)cancer 數(shù)據(jù)集上的LogisticRegression 分類(lèi)器進(jìn)行網(wǎng)格查找,在將數(shù)據(jù)傳入LogisticRegression 分類(lèi)器之前,先用Pipeline 和StandardScaler對(duì)數(shù)據(jù)進(jìn)行縮放。首要,咱們用make_pipeline 函數(shù)創(chuàng)立一個(gè)管道:
5. 運(yùn)用舉例一:網(wǎng)格查找預(yù)處理進(jìn)程與模型參數(shù)
咱們能夠運(yùn)用管道將機(jī)器學(xué)習(xí)作業(yè)流程中的一切處理進(jìn)程封裝成一個(gè)scikit-learn 估量器。這么做的另一個(gè)優(yōu)點(diǎn)在于,現(xiàn)在咱們能夠運(yùn)用監(jiān)督使命(比方回歸或分類(lèi))的輸出來(lái)調(diào)理預(yù)處理參數(shù)。在運(yùn)用嶺回歸之前運(yùn)用boston 數(shù)據(jù)集的多項(xiàng)式特征,下面咱們用一個(gè)管道來(lái)重復(fù)這個(gè)建模進(jìn)程,管道包含3 個(gè)進(jìn)程:縮放數(shù)據(jù)、核算多項(xiàng)式特征與嶺回歸:
咱們?cè)鯓又捞暨x幾回多項(xiàng)式,或許是否挑選多項(xiàng)式或交互項(xiàng)呢?抱負(fù)情況下,咱們期望依據(jù)分類(lèi)成果來(lái)挑選degree 參數(shù)。咱們能夠運(yùn)用管道查找degree 參數(shù)以及Ridge 的alpha參數(shù)。為了做到這一點(diǎn),咱們要界說(shuō)一個(gè)包含這兩個(gè)參數(shù)的param_grid,并用進(jìn)程稱(chēng)號(hào)作為前綴:
從穿插驗(yàn)證的成果中能夠看出,運(yùn)用二次多項(xiàng)式很有用,但三次多項(xiàng)式的作用比一次或二次都要差許多。從找到的最佳參數(shù)中也能夠看出這一點(diǎn):
正與咱們調(diào)查圖6-4 中的網(wǎng)格查找成果所意料的那樣,不運(yùn)用多項(xiàng)式特征得到了顯著更差的成果。
一起查找預(yù)處理參數(shù)與模型參數(shù)是一個(gè)十分強(qiáng)壯的戰(zhàn)略。可是要記住,GridSearchCV 會(huì)測(cè)驗(yàn)指定參數(shù)的一切可能組合。因而,向網(wǎng)格中增加更多參數(shù),需求構(gòu)建的模型數(shù)量將呈指數(shù)增加。6.運(yùn)用舉例二:網(wǎng)格查找挑選運(yùn)用哪個(gè)模型
進(jìn)一步將GridSearchCV 和Pipeline 結(jié)合起來(lái):查找管道中正在履行的實(shí)踐進(jìn)程。下面是一個(gè)比方:在iris 數(shù)據(jù)集上比較RandomForestClassifier 和SVC。咱們知道,SVC需求對(duì)數(shù)據(jù)進(jìn)行縮放,運(yùn)用StandardScaler。RandomForestClassifier 不需求預(yù)處理。先界說(shuō)管道,顯式地對(duì)進(jìn)程命名。咱們需求兩個(gè)進(jìn)程,一個(gè)用于預(yù)處理,然后是一個(gè)分類(lèi)器。咱們能夠用SVC 和StandardScaler 來(lái)將其實(shí)例化:
界說(shuō)需求查找的parameter_grid。咱們期望classifier 是RandomForestClassifier或SVC。因?yàn)檫@兩種分類(lèi)器需求調(diào)理不同的參數(shù),而且需求不同的預(yù)處理,所以運(yùn)用查找網(wǎng)格列表。為了將一個(gè)估量器分配給一個(gè)進(jìn)程,運(yùn)用進(jìn)程稱(chēng)號(hào)作為參數(shù)稱(chēng)號(hào)。假如咱們想越過(guò)管道中的某個(gè)進(jìn)程(例如,RandomForest 不需求預(yù)處理),則能夠?qū)⒃撨M(jìn)程設(shè)置為None:
網(wǎng)格查找的成果是SVC 與StandardScaler 預(yù)處理,在C=10 和gamma=0.01 時(shí)給出最佳成果。7.小結(jié)
Pipeline 類(lèi)是一種通用東西,能夠?qū)C(jī)器學(xué)習(xí)作業(yè)流程中的多個(gè)處理進(jìn)程鏈接在一起。運(yùn)用管道能夠?qū)⒍鄠€(gè)進(jìn)程封裝為單個(gè)Python 目標(biāo),這個(gè)目標(biāo)具有咱們了解的scikit-learn 接口fit、predict 和transform。特別是運(yùn)用穿插驗(yàn)證進(jìn)行模型評(píng)價(jià)與運(yùn)用網(wǎng)格查找進(jìn)行參數(shù)挑選時(shí),運(yùn)用Pipeline 類(lèi)來(lái)包含一切處理進(jìn)程對(duì)正確的評(píng)價(jià)至關(guān)重要。
運(yùn)用Pipeline 類(lèi)還能夠讓代碼愈加簡(jiǎn)練,并削減不必pipeline 類(lèi)構(gòu)建處理鏈時(shí)可能會(huì)犯的過(guò)錯(cuò)(比方忘掉將一切改換器運(yùn)用于測(cè)驗(yàn)集,或許運(yùn)用次序過(guò)錯(cuò))的可能性。挑選特征提取、預(yù)處理和模型的正確組合,這在某種程度上是一門(mén)藝術(shù),一般需求一些試錯(cuò)。可是有了管道,這種“測(cè)驗(yàn)”多個(gè)不同的處理進(jìn)程是十分簡(jiǎn)略的。在進(jìn)行實(shí)驗(yàn)時(shí),要當(dāng)心不要將處理進(jìn)程復(fù)雜化,而且一定要評(píng)價(jià)一下模型中的每個(gè)組件是否必要。
全文完














