1. 程式人生 > >fit_transform,fit,transform區別和作用詳解!!!!!!

fit_transform,fit,transform區別和作用詳解!!!!!!

寫在前面

  • fit和transform沒有任何關係,僅僅是資料處理的兩個不同環節,之所以出來fit_transform這個函式名,僅僅是為了寫程式碼方便,會高效一點。

  • sklearn裡的封裝好的各種演算法使用前都要fit,fit相對於整個程式碼而言,為後續API服務。fit之後,然後呼叫各種API方法,transform只是其中一個API方法,所以當你呼叫transform之外的方法,也必須要先fit。

  • fit原義指的是安裝、使適合的意思,其實有點train的含義,但是和train不同的是,它並不是一個訓練的過程,而是一個適配的過程,過程都是確定的,最後得到一個可用於轉換的有價值的資訊。

fit,transform,fit_transform常用情況分為兩大類

1. 資料預處理中方法

  • fit(): Method calculates the parameters μ and σ and saves them as internal objects.
    解釋:簡單來說,就是求得訓練集X的均值,方差,最大值,最小值,這些訓練集X固有的屬性。

  • transform(): Method using these calculated parameters apply the transformation to a particular dataset.
    解釋:在fit的基礎上,進行標準化,降維,歸一化等操作(看具體用的是哪個工具,如PCA,StandardScaler等)。

  • fit_transform(): joins the fit() and transform() method for transformation of dataset.
    解釋:fit_transform是fit和transform的組合,既包括了訓練又包含了轉換。
    transform()和fit_transform()二者的功能都是對資料進行某種統一處理(比如標準化~N(0,1),將資料縮放(對映)到某個固定區間,歸一化,正則化等)

    fit_transform(trainData)對部分資料先擬合fit,找到該part的整體指標,如均值、方差、最大值最小值等等(根據具體轉換的目的),然後對該trainData進行轉換transform,從而實現資料的標準化、歸一化等等。

根據對之前部分trainData進行fit的整體指標,對剩餘的資料(testData)使用同樣的均值、方差、最大最小值等指標進行轉換transform(testData)從而保證train、test處理方式相同。所以,一般都是這麼用:

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)

2. 各種演算法的fit,transform方法

  • 舉兩個例子:

1. CountVectorizer舉例,sklearn的CountVectorizer庫是根據輸入資料獲取詞頻矩陣(稀疏矩陣)

  • fit(raw_documents) :根據CountVectorizer引數規則進行操作,比如濾除停用詞等,擬合原始資料,生成文件中有價值的詞彙表;
    在這裡插入圖片描述
  • transform(raw_documents):使用符合fit的詞彙表或提供給建構函式的詞彙表,從原始文字文件中提取詞頻,轉換成詞頻矩陣。
    在這裡插入圖片描述
  • fit_transform(raw_documents, y=None):學習詞彙詞典並返回術語 - 文件矩陣(稀疏矩陣)。
    在這裡插入圖片描述

2. TfidfTransformer舉例,TF-IDF(Term frequency * Inverse Doc Frequency)詞權重

在較低的文字語料庫中,一些詞非常常見(例如,英文中的“the”,“a”,“is”),因此很少帶有文件實際內容的有用資訊。如果我們將單純的計數資料直接餵給分類器,那些頻繁出現的詞會掩蓋那些很少出現但是更有意義的詞的頻率。

為了重新計算特徵的計數權重,以便轉化為適合分類器使用的浮點值,通常都會進行tf-idf轉換。詞重要性度量一般使用文字挖掘的啟發式方法:TF-IDF。IDF,逆向檔案頻率(inverse document frequency)是一個詞語普遍重要性的度量(不同詞重要性的度量)。

  • fit(raw_documents, y=None):根據訓練集生成詞典和逆文件詞頻 由fit方法計算的每個特徵的權重儲存在model的idf_屬性中。
    在這裡插入圖片描述
  • transform(raw_documents, copy=True):使用fit(或fit_transform)學習的詞彙和文件頻率(df),將文件轉換為文件 - 詞矩陣。返回稀疏矩陣,[n_samples, n_features],即,Tf-idf加權文件矩陣(Tf-idf-weighted document-term matrix)。
    在這裡插入圖片描述

總結:

上述第一類和第二類等價。演算法中的fit方法的應用等價於第一類的fit,只不過產生的結果意義不同(不是均值等統計意義,而是根據演算法本身擬合獲取不同資訊以備後用),transform根據fit的結果轉換成目標形式,具體需深究程式碼實現。

Note:

  • 必須先用fit_transform(trainData),之後再transform(testData)
  • 如果直接transform(testData),程式會報錯
  • 如果fit_transfrom(trainData)後,使用fit_transform(testData)而不transform(testData),雖然也能歸一化,但是兩個結果不是在同一個“標準”下的,具有明顯差異。(一定要避免這種情況)

附: 另一個角度理解fit和transform

fit_transform是fit和transform的結合,所以只需要瞭解fit和transform。

transform方法主要用來對特徵進行轉換。

從可利用資訊的角度來說,轉換分為無資訊轉換和有資訊轉換。

  • 無資訊轉換是指不利用任何其他資訊進行轉換,比如指數、對數函式轉換等。
  • 有資訊轉換從是否利用目標值向量又可分為無監督轉換和有監督轉換。
    • 無監督轉換指只利用特徵的統計資訊的轉換,統計資訊包括均值、標準差、邊界等等,比如標準化、PCA法降維等。
    • 有監督轉換指既利用了特徵資訊又利用了目標值資訊的轉換,比如通過模型選擇特徵、LDA法降維等。

通過總結常用的轉換類,我們得到下表:
在這裡插入圖片描述
所以,只有有資訊的轉換類的fit方法才實際有用,顯然fit方法的主要工作是獲取特徵和目標值有價值的資訊,在這點上,fit方法和模型訓練時的fit方法就能夠聯絡在一起了:**都是通過分析特徵和目標值,提取有價值的資訊。對於轉換類來說是某些統計量;對於模型來說可能是特徵的權值係數等。

  • 另外,只有有監督的轉換類的fit和transform方法才需要特徵和目標值兩個引數,即有監督學習的演算法fit(x,y)傳兩個引數。
  • 無監督學習的演算法是fit(x),即傳一個引數,比如降維、特徵提取、標準化。
  • fit方法無用不代表其沒實現,而是除合法性校驗以外,其並沒有對特徵和目標值進行任何處理。