爲什麼訓練集用fit_transform()而測試集用transform()及sklearn.feature_extraction.text.CountVectorizer API詳解

真正講明白的

https://blog.csdn.net/yyhhlancelot/article/details/85097656

 

API

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html#sklearn.feature_extraction.text.CountVectorizer

 

真正講明白的博客內容

Sklearn 裏面的fit transform fit_transform的區別(爲什麼訓練集用fit_transform()而測試集用transform()?)
 yyhhlancelot 最後發佈於2018-12-19 15:34:40 閱讀數 1820  收藏 12
展開
在國內網上找了很多資料,感覺都說的不明不白不清不楚,很多博客都是根據原始document來進行闡述,使用的時候也是按照格式使用,最後去外網感覺終於有點搞明白了來頭。

參考:

https://stackoverflow.com/questions/23838056/what-is-the-difference-between-transform-and-fit-transform-in-sklearn
https://stackoverflow.com/questions/38692520/what-is-the-difference-between-fit-transform-and-transform-in-sklearn-countvecto
https://stackoverflow.com/questions/43675665/when-scale-the-data-why-the-train-dataset-use-fit-and-transform-but-the-te
https://sebastianraschka.com/faq/docs/scale-training-test.html
推薦大家一定點進第四個去閱讀一下,如果覺得英文閱讀不方便,也可以看一下我接下來的解釋。

首先要提及的一點,這些方法都是用來對數據進行尺度化(標準化)。

我們使用Z-score方法將數據進行正態分佈化:

對訓練集使用這些方法:

fit():計算數據的參數,(均值),(標準差),並存儲在對象中(例如實例化的CountVectorizer()等)。
transform():將這些參數應用到數據集,進行標準化(尺度化)。
fit_transform():將前兩種方法合併,fit + transform,然後對數據集使用。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)
不管是StandardScaler或是其他類,道理都是相通的,所以不用糾結類的問題。

這裏就要提出來一個問題,爲什麼test數據集只使用transfrom()?

按照通俗的解釋是 對測試集使用通過計算訓練集相同的參數來進行尺度化,那到底是爲什麼呢?

下面我們用一個例子進行說明:

假設我的訓練集有三個棒子的樣本,它們分別是:

樣本1:10cm  ---> class 2
樣本2:20cm  ---> class 2
樣本3:30cm  ---> class 1
通過給出的數據,我們可以算出以下參數:

mean : 20
std : 8.2
我們對數據進行標準化,得到以下:

樣本1:-1.21  ---> class 2
樣本2:0  ---> class 2
樣本3:1.21  ---> class 1
現在我們對數據做一個假設結論,當小於0.6的就歸到class 2,反之就歸類到 class 1。這個假設看起來比較有意義,符合數據分佈。

接下來,我們看看測試集的樣本:

樣本4:5cm  ---> class ?
樣本5:6cm  ---> class ?
樣本6:7cm  ---> class ?
這是“未標準化的”數據,如果我們不對它們進行標準化,那按我們剛剛的假設,那它們都屬於class 1了?肯定不可能是吧,好的,那現在假如我們“重新”對它們計算參數,注意了,這裏我們是針對測試集計算參數!

我們將測試集標準化後,得到了一下:

樣本4:-1.21 
樣本5:0 
樣本6:1.21 
巧了,和剛剛訓練集得到的一模一樣。然後我們用我們剛剛訓練集訓練得到的結論,對它們分類:

樣本4:-1.21  ---> class 2
樣本5:0  ---> class 2
樣本6:1.21  ---> class 1
奇怪的事情發生了,感覺不太對是吧?

那我們用訓練集得到的參數對它們進行標準化呢:

樣本4:-1.837
樣本5:-1.715
樣本6:-1.592
按我們開始的假設結論進行分類:

樣本4:-1.837 ---> class 2
樣本5:-1.715 ---> class 2
樣本6:-1.592 ---> class 2
這下似乎看起來有意義多了,我們訓練集似乎訓練了一個比較說的通的模型(剛剛的假設結論~)。所以,你經常看到爲什麼大家在說,如果對test_data進行fit_transform()就會"overfitting"就是這麼來的。
————————————————
版權聲明:本文爲CSDN博主「yyhhlancelot」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yyhhlancelot/article/details/85097656

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