อะไรคือความแตกต่างระหว่าง 'transform' และ 'fit_transform' ใน sklearn


118

ในกล่องเครื่องมือ sklearn-python มีสองฟังก์ชันtransformและfit_transformเกี่ยวกับsklearn.decomposition.RandomizedPCA. คำอธิบายของสองฟังก์ชันมีดังต่อไปนี้

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่

แต่อะไรคือความแตกต่างระหว่างพวกเขา?


5
est.fit_transform(X)เทียบเท่าเสมอest.fit(X).transform(X)แต่มักจะเร็วกว่า
Fred Foo

คำตอบ:


22

.transformวิธีการที่มีความหมายสำหรับเมื่อคุณได้คำนวณแล้วPCAเช่นถ้าคุณได้เรียกอยู่แล้ว.fitวิธีการ

In [12]: pc2 = RandomizedPCA(n_components=3)

In [13]: pc2.transform(X) # can't transform because it does not know how to do it.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-e3b6b8ea2aff> in <module>()
----> 1 pc2.transform(X)

/usr/local/lib/python3.4/dist-packages/sklearn/decomposition/pca.py in transform(self, X, y)
    714         # XXX remove scipy.sparse support here in 0.16
    715         X = atleast2d_or_csr(X)
--> 716         if self.mean_ is not None:
    717             X = X - self.mean_
    718 

AttributeError: 'RandomizedPCA' object has no attribute 'mean_'

In [14]: pc2.ftransform(X) 
pc2.fit            pc2.fit_transform  

In [14]: pc2.fit_transform(X)
Out[14]: 
array([[-1.38340578, -0.2935787 ],
       [-2.22189802,  0.25133484],
       [-3.6053038 , -0.04224385],
       [ 1.38340578,  0.2935787 ],
       [ 2.22189802, -0.25133484],
       [ 3.6053038 ,  0.04224385]])
    
  

ดังนั้นคุณต้องการfit RandomizedPCAแล้วtransformเป็น:

In [20]: pca = RandomizedPCA(n_components=3)

In [21]: pca.fit(X)
Out[21]: 
RandomizedPCA(copy=True, iterated_power=3, n_components=3, random_state=None,
       whiten=False)

In [22]: pca.transform(z)
Out[22]: 
array([[ 2.76681156,  0.58715739],
       [ 1.92831932,  1.13207093],
       [ 0.54491354,  0.83849224],
       [ 5.53362311,  1.17431479],
       [ 6.37211535,  0.62940125],
       [ 7.75552113,  0.92297994]])

In [23]: 

ใน PCA โดยเฉพาะอย่างยิ่ง.transformใช้การเปลี่ยนแปลงของพื้นฐานที่ได้รับผ่านการสลายตัว PCA ของเมทริกซ์เพื่อเมทริกซ์XZ


ฉันได้แก้ไขคำถามของฉันแล้ว ฟังก์ชันทั้งสองส่งคืนค่าชนิดเดียวกัน
tqjustc

2
คุณหมายความว่านั่นfit_transformคือการรวมกันของสองฟังก์ชันfitและtransform?
tqjustc

6
ถ้าคุณใช้พอดีและแปลงร่างบนเมทริกซ์เดียวกันใช่ ไม่ใช่ถ้าคุณพอดีกับเมทริกซ์ x แล้วแปลงเมทริกซ์ z
Donbeo

Line In [14] พูดว่า "ftransform" นั่นคืออะไร?
Rajdeep Biswas

99

ในscikit เรียนรู้ API ประมาณการ ,

fit() : ใช้สำหรับสร้างพารามิเตอร์โมเดลการเรียนรู้จากข้อมูลการฝึกอบรม

transform(): พารามิเตอร์ที่สร้างจากfit()วิธีการใช้กับโมเดลเพื่อสร้างชุดข้อมูลที่แปลงแล้ว

fit_transform(): การรวมกันของfit()และtransform()api ในชุดข้อมูลเดียวกัน

ป้อนคำอธิบายภาพที่นี่

ชำระเงินบทที่ 4จากหนังสือเล่มนี้และคำตอบจากstackexchangeเพื่อความชัดเจนยิ่งขึ้น


58

วิธีการเหล่านี้ใช้เพื่อกำหนดขนาดกลาง / คุณลักษณะของข้อมูลที่กำหนด โดยพื้นฐานแล้วจะช่วยทำให้ข้อมูลเป็นปกติภายในช่วงเฉพาะ

สำหรับสิ่งนี้เราใช้วิธี Z-score

คะแนน Z

เราทำสิ่งนี้ในชุดข้อมูลการฝึกอบรม

1. Fit ():วิธีการคำนวณพารามิเตอร์μและσและบันทึกเป็นวัตถุภายใน

2. Transform ():วิธีการที่ใช้พารามิเตอร์จากการคำนวณเหล่านี้ใช้การแปลงกับชุดข้อมูลเฉพาะ

3. Fit_transform ():รวมวิธี fit () และ transform () สำหรับการแปลงชุดข้อมูล

ข้อมูลโค้ดสำหรับ Feature Scaling / Standardization (หลัง train_test_split)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_transform(X_train)
sc.transform(X_test)

เราใช้การเปลี่ยนแปลงพารามิเตอร์เดียวกัน (ชุดการฝึกที่เหมือนกันสองพารามิเตอร์μและσ (ค่า)) กับชุดทดสอบของเรา


1
ขอบคุณสำหรับคำอธิบายนี้ ฉันอยากรู้ว่าค่า 'พอดี' มีอยู่หรือไม่และสิ่งนี้ช่วยได้!
Adib

2
+1 สำหรับตัวอย่างโค้ด ฉันมีความสับสนว่าคุณสามารถใช้ fit_transform กับชุดรถไฟแล้วเปลี่ยนชุดทดสอบได้หรือไม่หรือคุณต้องการความพอดีแยกต่างหากบนรถไฟ
Vivek

4
fit_tranform (.. ) ไม่สามารถใช้กับ X_test ได้เนื่องจากการทดสอบการทดสอบควรใช้μและσที่คำนวณจากชุดข้อมูล X_train fit_tranform (.. ) สามารถใช้ได้กับชุดข้อมูลการฝึกเท่านั้น กรุณาแก้ไขความเข้าใจของฉัน
daya

1
ใช่คุณถูกต้อง. สามารถใช้ได้เฉพาะ transform (.. ) ในการทดสอบเนื่องจากใช้ params ที่เรียนรู้จาก X_train เพื่อสร้างมาตรฐานข้อมูล
X_test

7

ความแตกต่างทั่วไประหว่างวิธีการ:

  • fit (raw_documents [, y]): เรียนรู้พจนานุกรมคำศัพท์ของโทเค็นทั้งหมดในเอกสารดิบ
  • fit_transform (raw_documents [, y]): เรียนรู้พจนานุกรมคำศัพท์และส่งคืนเมทริกซ์เอกสารคำศัพท์ สิ่งนี้เทียบเท่ากับความพอดีตามด้วยการแปลง แต่ใช้งานได้อย่างมีประสิทธิภาพมากขึ้น
  • แปลง (raw_documents): แปลงเอกสารเป็นเมทริกซ์ระยะเอกสาร โทเค็นแยกจะนับออกจากเอกสารข้อความดิบโดยใช้คำศัพท์ที่พอดีกับตัวสร้างหรือที่ให้ไว้กับตัวสร้าง

ทั้ง fit_transform และ transform จะส่งคืนเมทริกซ์ระยะเอกสารเหมือนกัน

ที่มา


4

ความแตกต่างพื้นฐานระหว่าง.fit()& .fit_transform():

. พอดี ():

ใช้ในการเรียนรู้ภายใต้การดูแลโดยมีวัตถุ / พารามิเตอร์สองตัว (x, y) เพื่อให้พอดีกับโมเดลและสร้างโมเดลให้ทำงานโดยที่เรารู้ว่าสิ่งที่เรากำลังจะทำนาย

.fit_transform ():

ใช้ในการเรียนรู้ที่ไม่ได้รับการดูแลโดยมีวัตถุ / พารามิเตอร์เดียว (x) โดยที่เราไม่รู้ว่าเราจะทำนายอะไร


มันไม่แม่นยำมาก fit () สามารถใช้ในการเรียนรู้ที่ไม่มีผู้ดูแลได้เช่นกัน แต่ถ้าคุณพยายามที่จะทำให้เข้าใจง่ายมากขึ้นเพียงเพื่อความกะทัดรัดก็เป็นวิธีที่ดีในการอธิบายให้ผู้เริ่มต้นเข้าใจ
Rajdeep Biswas

3

ในแง่ของคนธรรมดา fit_transform หมายถึงทำการคำนวณบางอย่างแล้วทำการแปลง (พูดว่าคำนวณค่าของคอลัมน์จากข้อมูลบางส่วนแล้วแทนที่ค่าที่ขาดหายไป) ดังนั้นสำหรับชุดฝึกคุณต้องทั้งคำนวณและทำการแปลง

แต่สำหรับชุดการทดสอบการเรียนรู้ของเครื่องจะใช้การทำนายตามสิ่งที่เรียนรู้ในระหว่างชุดการฝึกดังนั้นจึงไม่จำเป็นต้องคำนวณเพียงแค่ทำการเปลี่ยนแปลง


2

ทำไมและเมื่อใช้แต่ละอัน:

คำตอบทั้งหมดค่อนข้างดี แต่ฉันจะเน้นว่าทำไมและเมื่อใช้แต่ละวิธี

พอดี (), แปลง (), fit_transform ()

โดยปกติแล้วเรามีปัญหาการเรียนรู้ภายใต้การดูแลโดยมี (X, y) เป็นชุดข้อมูลและแยกออกเป็นข้อมูลการฝึกอบรมและข้อมูลการทดสอบ:

import numpy as np
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y)

X_train_vectorized = model.fit_transform(X_train)
X_test_vectorized = model.transform(X_test)

ลองนึกภาพว่าเรากำลังปรับโทเค็นให้เหมาะสมถ้าเราพอดีกับ X เรากำลังรวมการทดสอบข้อมูลลงในโทเค็นไนเซอร์ แต่ฉันเห็นข้อผิดพลาดนี้หลายครั้ง!

ที่ถูกต้องคือใส่ได้เฉพาะกับ X_trainเท่านั้นเพราะคุณไม่รู้ "ข้อมูลอนาคตของคุณ" ดังนั้นคุณจึงไม่สามารถใช้ข้อมูล X_test เพื่อปรับแต่งอะไรก็ได้!

จากนั้นคุณสามารถแปลงข้อมูลการทดสอบของคุณ แต่แยกกันนั่นเป็นเหตุผลว่าทำไมจึงมีวิธีการที่แตกต่างกัน

เคล็ดลับสุดท้าย: X_train_transformed = model.fit_transform(X_train)เทียบเท่ากับ: X_train_transformed = model.fit(X_train).transform(X_train)แต่ข้อแรกเร็วกว่า

โปรดทราบว่าสิ่งที่ฉันเรียกว่า "model" มักจะเป็น scaler, tfidf transformer, vectorizer ชนิดอื่น ๆ tokenizer ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.