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