ในกล่องเครื่องมือ sklearn-python มีสองฟังก์ชันtransform
และfit_transform
เกี่ยวกับsklearn.decomposition.RandomizedPCA
. คำอธิบายของสองฟังก์ชันมีดังต่อไปนี้
แต่อะไรคือความแตกต่างระหว่างพวกเขา?
ในกล่องเครื่องมือ sklearn-python มีสองฟังก์ชันtransform
และfit_transform
เกี่ยวกับsklearn.decomposition.RandomizedPCA
. คำอธิบายของสองฟังก์ชันมีดังต่อไปนี้
แต่อะไรคือความแตกต่างระหว่างพวกเขา?
คำตอบ:
.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 ของเมทริกซ์เพื่อเมทริกซ์X
Z
fit_transform
คือการรวมกันของสองฟังก์ชันfit
และtransform
?
ในscikit เรียนรู้ API ประมาณการ ,
fit()
: ใช้สำหรับสร้างพารามิเตอร์โมเดลการเรียนรู้จากข้อมูลการฝึกอบรม
transform()
: พารามิเตอร์ที่สร้างจากfit()
วิธีการใช้กับโมเดลเพื่อสร้างชุดข้อมูลที่แปลงแล้ว
fit_transform()
: การรวมกันของfit()
และtransform()
api ในชุดข้อมูลเดียวกัน
ชำระเงินบทที่ 4จากหนังสือเล่มนี้และคำตอบจากstackexchangeเพื่อความชัดเจนยิ่งขึ้น
วิธีการเหล่านี้ใช้เพื่อกำหนดขนาดกลาง / คุณลักษณะของข้อมูลที่กำหนด โดยพื้นฐานแล้วจะช่วยทำให้ข้อมูลเป็นปกติภายในช่วงเฉพาะ
สำหรับสิ่งนี้เราใช้วิธี Z-score
เราทำสิ่งนี้ในชุดข้อมูลการฝึกอบรม
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)
เราใช้การเปลี่ยนแปลงพารามิเตอร์เดียวกัน (ชุดการฝึกที่เหมือนกันสองพารามิเตอร์μและσ (ค่า)) กับชุดทดสอบของเรา
ความแตกต่างทั่วไประหว่างวิธีการ:
ทั้ง fit_transform และ transform จะส่งคืนเมทริกซ์ระยะเอกสารเหมือนกัน
ความแตกต่างพื้นฐานระหว่าง.fit()
& .fit_transform()
:
ใช้ในการเรียนรู้ภายใต้การดูแลโดยมีวัตถุ / พารามิเตอร์สองตัว (x, y) เพื่อให้พอดีกับโมเดลและสร้างโมเดลให้ทำงานโดยที่เรารู้ว่าสิ่งที่เรากำลังจะทำนาย
ใช้ในการเรียนรู้ที่ไม่ได้รับการดูแลโดยมีวัตถุ / พารามิเตอร์เดียว (x) โดยที่เราไม่รู้ว่าเราจะทำนายอะไร
ในแง่ของคนธรรมดา fit_transform หมายถึงทำการคำนวณบางอย่างแล้วทำการแปลง (พูดว่าคำนวณค่าของคอลัมน์จากข้อมูลบางส่วนแล้วแทนที่ค่าที่ขาดหายไป) ดังนั้นสำหรับชุดฝึกคุณต้องทั้งคำนวณและทำการแปลง
แต่สำหรับชุดการทดสอบการเรียนรู้ของเครื่องจะใช้การทำนายตามสิ่งที่เรียนรู้ในระหว่างชุดการฝึกดังนั้นจึงไม่จำเป็นต้องคำนวณเพียงแค่ทำการเปลี่ยนแปลง
คำตอบทั้งหมดค่อนข้างดี แต่ฉันจะเน้นว่าทำไมและเมื่อใช้แต่ละวิธี
พอดี (), แปลง (), 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 ...
est.fit_transform(X)
เทียบเท่าเสมอest.fit(X).transform(X)
แต่มักจะเร็วกว่า