Sklearn学习之路(2)——围绕评估器转换器展开讨论
1. 寫在前面
在上一講中,我們對于Sklearn框架有了一個較為直觀的認(rèn)識,但是對于其中的細(xì)節(jié)部分,可能還是不知甚解。這次,我們將會詳細(xì)的介紹其中的一些知識,包括:Sklearn版本注意事項、最基本的評估器與轉(zhuǎn)換器、fit、transform與fit_transform的區(qū)別、pipeline使用,tfidf與CountVectorizer方法等。
2. Sklearn版本注意事項
在網(wǎng)上很多Sklearn的例子,但是很多時候copy下來又運(yùn)行不了,其實很多時候是因為Sklearn版本不同。機(jī)器學(xué)習(xí)是一個非常活躍的領(lǐng)域,而Sklearn又是一個非?;钴S的框架,版本更新迭代速度很快,而且修改比較多,很多時候上一個版本的函數(shù)與方法,在下一個版本中就已經(jīng)不能使用了。大家需要自己去Sklearn官網(wǎng)里查看最新的API。另外一點,好在Pycharm里會提醒,在接下來的版本中可能移除的方法,讓你及時調(diào)整代碼。因此如果出現(xiàn)了網(wǎng)上的示例不能運(yùn)行的情況,有可能是版本已經(jīng)更新了。
3. 評估器與轉(zhuǎn)換器
說到評估器與轉(zhuǎn)換器,大家可能沒有一個直觀的認(rèn)識。事實上,基本上大部分的分類器都屬于評估器,這點你可以從分類器的包名可以看到:
這里面類匯總,第一個為基礎(chǔ)評估器,第二個為基礎(chǔ)分類器,最后一個為基礎(chǔ)轉(zhuǎn)換器。基本上所有的評估器與轉(zhuǎn)換器都有三個基本方法,fit,transform,fit_transform。為什么著重講這個,因為在pipeline中,它的最后一部分為評估器,也就是說最后一步一定是個分類器,而前面的預(yù)處理、降維、正則化等都是轉(zhuǎn)換器。這點我們會在后面講到。
4. fit、transform與fit_transform的區(qū)別
其實程序員最應(yīng)去的一個地方就是Stackoverflow,那里有最權(quán)威、最清楚的Bug調(diào)試解決方案。雖然大部分都是英語,但是英語解釋的比較確切。
fit原義指的是安裝、使適合的意思,其實有點train的含義但是和train不同的是,它并不是一個訓(xùn)練的過程,而是一個適配的過程,過程都是定死的,最后只是得到了一個統(tǒng)一的轉(zhuǎn)換的規(guī)則模型。
transform則指的是轉(zhuǎn)換.。從可利用信息的角度來說,轉(zhuǎn)換分為無信息轉(zhuǎn)換和有信息轉(zhuǎn)換。無信息轉(zhuǎn)換是指不利用任何其他信息進(jìn)行轉(zhuǎn)換,比如指數(shù)、對數(shù)函數(shù)轉(zhuǎn)換等。有信息轉(zhuǎn)換從是否利用目標(biāo)值向量又可分為無監(jiān)督轉(zhuǎn)換和有監(jiān)督轉(zhuǎn)換。無監(jiān)督轉(zhuǎn)換指只利用特征的統(tǒng)計信息的轉(zhuǎn)換,統(tǒng)計信息包括均值、標(biāo)準(zhǔn)差、邊界等等,比如標(biāo)準(zhǔn)化、PCA法降維等。有監(jiān)督轉(zhuǎn)換指既利用了特征信息又利用了目標(biāo)值信息的轉(zhuǎn)換,比如通過模型選擇特征、LDA法降維等。
而fit_transform方法則是把上述2個過程統(tǒng)一起來,對模型先訓(xùn)練,然后根據(jù)輸入的訓(xùn)練數(shù)據(jù)返回一個轉(zhuǎn)換矩陣。這個過程通常只存在訓(xùn)練過程中。在Pipeline中尤為明顯。
5. pipeline的使用
給出一幅圖,就可以大致了解pipeline的運(yùn)行方式與流程:
這里我們可以看到pipeline的最后一步一定是一個分類器,而開始部分可以是一個規(guī)約化,中間可以是降維、可以是特征選取等等一套流程。當(dāng)然,這里用的都是包里自帶的評估器與分類器,如果想自己寫其中的一個過程然后添加到整個pipeline中,還需要繼承基類(第3節(jié)講到)后才能添加進(jìn)去。
具體的使用樣例如下:
6. CountVectorizer()與TfidfTransformer()
在第三節(jié)中,我們講到了評估器與轉(zhuǎn)換器,這2個都是有上面那3個方法,評估器可能還會多一個predict預(yù)測這個方法。主要是用來分類的。
同樣的,評估器里的算法多為機(jī)器學(xué)習(xí)算法,而轉(zhuǎn)換器里的算法多為轉(zhuǎn)換算法。像TFIDF算法就是轉(zhuǎn)換器,它只不過是把一個文檔列表轉(zhuǎn)換為一個TFIDF矩陣,但是如何轉(zhuǎn)換是有一個模型的,這個模型這個被訓(xùn)練語料fit后的模型,它同樣可以被用來轉(zhuǎn)換(transform)測試語料,例如下面這代碼:
#初始化一個ftidf對象 tfidf=TfidfTransformer(); from sklearn.feature_extraction.text import CountVectorizer #初始化一個統(tǒng)計詞頻對象 count_vect = CountVectorizer() #返回的是一個稀疏矩陣 train_data = count_vect.fit_transform(train_data) #通過稀疏矩陣獲得tfidf矩陣 train_result=tfidf.fit_transform(train_data); #使用同樣的統(tǒng)計詞頻模型來生成訓(xùn)練語料的統(tǒng)計詞頻矩陣。 test_data = count_vect.transform(test_data) #使用同樣的模型對測試語料轉(zhuǎn)換,可以得到和測試語料同樣的TFIDF矩陣。 test_result=tfidf.transform(test_data);這里我們在使用tfidf轉(zhuǎn)換器的同時需要使用一個統(tǒng)計詞頻轉(zhuǎn)換器,因為統(tǒng)計詞頻轉(zhuǎn)換器可以把文章列表轉(zhuǎn)換為一個詞頻的矩陣,如下表:
| 1 | 1 | 2 | ··· |
| 2 | 0 | 2 | ··· |
| ··· | ··· | ··· | ··· |
但是其實它真實存儲的時候是以稀疏矩陣存儲,也就是只存儲非0的單元。這樣做其實有2點好處。
(0, 18375) 1
(0, 19325) 1
(0, 39321) 1
(0, 45163) 1
(0, 110448) 1
(0, 22986) 1
(0, 115259) 1
(0, 31639) 1
上邊是第一行的稀疏矩陣,最大的值為115259,也就是說最大的列假設(shè)為115259列,如果測試集中出現(xiàn)了一個單詞,這個單詞在前115259個詞都沒出現(xiàn)過,這時候,只需要:
(1,115260) 1
即可,非常容易擴(kuò)展。
這時候,才能使用tfidf轉(zhuǎn)換器,把這個轉(zhuǎn)換成相應(yīng)的tfidf值,因為只有這樣做過了,tfidf轉(zhuǎn)換器才能方便的轉(zhuǎn)換。因為這時候,無論是一篇文章的詞總數(shù),還是文檔總數(shù),還是出現(xiàn)目標(biāo)詞的文檔數(shù)都非常容易的統(tǒng)計出,這樣對于TFIDF公式:
=目標(biāo)文章中目標(biāo)詞出現(xiàn)的數(shù)目目標(biāo)文章中所有詞的數(shù)目×log所有文章總數(shù)出現(xiàn)目標(biāo)詞的文章數(shù)目+1
其實最后的+1不一定放上去,主要是為了防止查找原語料中不存在的詞時,分母不為0。
使用tfidf轉(zhuǎn)換器后,整個稀疏矩陣就成這樣子了:
(0, 31639) 0.350232605058
(0, 115259) 0.287191449938
(0, 22986) 0.325286181826
(0, 110448) 0.38664944433
(0, 45163) 0.399257482535
(0, 39321) 0.308066927057
(0, 19325) 0.350232605058
(0, 18375) 0.403205473668
大家可以看到,與詞頻統(tǒng)計的稀疏矩陣的非0點坐標(biāo)是一致的不同的就是其中的值。
7. 小結(jié)
我們這次對于sklearn有了一個更加明確的認(rèn)識,在此基礎(chǔ)上已經(jīng)可以做一些特定的實驗了。但是如何進(jìn)行特征選擇和最終的實驗評估報告還并未說明,這幾部分將在以后的文章中更新。
總結(jié)
以上是生活随笔為你收集整理的Sklearn学习之路(2)——围绕评估器转换器展开讨论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack及其核心组件
- 下一篇: 易语言多线程