ข้อแตกต่างระหว่าง fit และ fit_transform ในรุ่น scikit_learn หรือไม่?


110

ฉันเป็นมือใหม่ในด้านวิทยาศาสตร์ข้อมูลและฉันไม่เข้าใจความแตกต่างระหว่างfitและfit_transformวิธีการในการเรียนรู้ Scikit ใครช่วยอธิบายได้ไหมว่าทำไมเราถึงต้องแปลงข้อมูล

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



@sds คำตอบข้างต้นให้ลิงก์ไปยังคำถามนี้
Kaushal28

เราใช้fitบนtraining datasetและใช้transformวิธีการในboth- ชุดการฝึกอบรมและชุดทดสอบ
ปรากามาร์

คำตอบ:


117

เมื่อต้องการจัดศูนย์กลางข้อมูล (ทำให้มีค่าเฉลี่ยเป็นศูนย์และข้อผิดพลาดมาตรฐานหน่วย) คุณลบค่าเฉลี่ยแล้วหารผลลัพธ์ด้วยค่าเบี่ยงเบนมาตรฐาน

x=xμσ

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

ดังนั้นการแปลงของ sklearn ทุกตัวจะfit()คำนวณพารามิเตอร์ (เช่นและในกรณีของStandardScaler ) และบันทึกเป็นสถานะวัตถุภายใน หลังจากนั้นคุณสามารถเรียกวิธีการเพื่อนำการแปลงไปใช้กับชุดตัวอย่างเฉพาะσμσtransform()

fit_transform()ร่วมทั้งสองขั้นตอนและจะใช้สำหรับการปรับเริ่มต้นของพารามิเตอร์ในการฝึกอบรมชุดแต่ก็ยังส่งกลับเปลี่ยนx'ภายในมันเพียงโทรก่อนแล้วจึงไปที่ข้อมูลเดียวกันx xxfit()transform()


1
ขอบคุณมากสำหรับคำตอบของคุณเพียงแค่สิ่งเดียวโดยพารามิเตอร์ในรุ่นมันไม่ได้หมายความว่าสำหรับความชันที่มากเกินไปและการสกัดกั้นสำหรับการถดถอย? เมื่อคุณพอดีสมมติว่าการถดถอยเชิงเส้นตัวอย่างเช่นพารามิเตอร์ใดจะพอดีในวิธีการพอดี? พารามิเตอร์การทำให้เป็นมาตรฐานหรือพารามิเตอร์โมเดลเช่นความชันและการสกัดกั้น?
Kaggle

1
ฉันหมายถึงพารามิเตอร์ภายในของการแปลงรูป (และในกรณีของ StandardScaler) วิธีการแปลงใด ๆ ที่ส่งกลับ ดูบทนี้เกี่ยวกับการใส่ตัวอย่างเช่น: scikit-learn.org/stable/modules/ …σμσget_params()
K3 --- rnc

2
ความคิดเห็นก่อนหน้าของฉันผิดจริง ในกรณีของการถดถอยเชิงเส้นพารามิเตอร์ที่ติดตั้งคือcoef_(เช่นความชันและการสกัดกั้น) ไม่ใช่พารามิเตอร์ที่ส่งคืนโดยget_params()(ซึ่งจะส่งคืนชุดของอาร์กิวเมนต์ตัวสร้างแบบจำลองด้วยค่าที่เกี่ยวข้อง)
K3 --- rnc

คำตอบที่ดี! ฉันเจอโพสต์ของคุณในขณะที่ค้นหาในหัวข้อนี้ แต่ฉันต้องชี้แจง นั่นหมายความว่าหากเราต้องการแปลงตัวอย่างชุดถัดไปแต่ละชุดเราไม่ควรเรียกfit_transform()ว่ามันจะไม่อนุญาตให้เราเข้าถึงสถานะวัตถุภายในเพื่อแปลงตัวอย่างที่ตามมาด้วยพารามิเตอร์เดียวกันที่ได้รับfit()จากชุดข้อมูลเริ่มต้น? สิ่งนี้เกิดขึ้นเมื่อคุณมีชุดข้อมูลการทดสอบและต้องการแปลงชุดการทดสอบเพื่อส่งผ่านไปยังลักษณนามที่ผ่านการฝึกอบรมของคุณ
AKKA

หลังจากที่คุณโทรหาt.fit_transform(train_data), t มีการt.transform(test_data)ติดตั้งเพื่อให้คุณได้อย่างปลอดภัยสามารถใช้
K3 --- rnc

10

คำอธิบายดังต่อไปนี้จะขึ้นอยู่กับfit_transformการImputerเรียน แต่ความคิดที่จะเหมือนกันสำหรับfit_transformการเรียน scikit_learn อื่น ๆ MinMaxScalerเช่น


transformแทนที่ค่าที่หายไปด้วยตัวเลข โดยค่าเริ่มต้นตัวเลขนี้เป็นวิธีการของคอลัมน์ของข้อมูลบางอย่างที่คุณเลือก ลองพิจารณาตัวอย่างต่อไปนี้:

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

ตอนนี้อิมพุทเตอร์ได้เรียนรู้การใช้ค่าเฉลี่ย (1 + 8) / 2 = 4.5 สำหรับคอลัมน์แรกและค่าเฉลี่ย (2 + 3 + 5.5) / 3 = 3.5 สำหรับคอลัมน์ที่สองเมื่อนำไปใช้กับข้อมูลสองคอลัมน์:

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

เราได้รับ

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

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

ตอนนี้คำถามของคุณ:

ทำไมเราต้องแปลงข้อมูล

"สำหรับเหตุผลต่างๆหลายชุดข้อมูลโลกแห่งความจริงมีค่าที่ขาดหายไปมักจะเข้ารหัสเป็นช่องว่างแก่นแก้วหรือตัวยึดตำแหน่งอื่น ๆ . ชุดข้อมูลดังกล่าว แต่ไม่เข้ากันกับ scikit เรียนรู้ประมาณซึ่งสมมติว่าค่าทั้งหมดในอาร์เรย์มีตัวเลข" ( แหล่งที่มา )

แบบจำลองการฟิตข้อมูลการฝึกอบรมและการแปลงเป็นข้อมูลการทดสอบหมายความว่าอย่างไร

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


3

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

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


3

วิธีการเหล่านี้ใช้สำหรับการแปลงชุดข้อมูลใน scikit-learn:

ให้เรานำตัวอย่างสำหรับการปรับค่าในชุดข้อมูล:

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

แล้วทำไมเราต้องแยกจากกัน 2 วิธี - พอดีและเปลี่ยน ?

ในทางปฏิบัติเราจำเป็นต้องมีชุดการฝึกอบรมและการทดสอบแยกต่างหากซึ่งเป็นที่ที่มีวิธีการพอดีและการแปลงที่แยกต่างหากช่วย เราใช้พอดีในชุดข้อมูลการฝึกอบรมและการใช้เปลี่ยนวิธีการทั้งบน - ชุดการฝึกอบรมและชุดทดสอบ ดังนั้นชุดฝึกอบรมและชุดทดสอบจะถูกเปลี่ยน (ปรับขนาด) โดยใช้พารามิเตอร์โมเดลที่เรียนรู้เกี่ยวกับการใช้วิธีการพอดีกับชุดข้อมูลการฝึกอบรม

รหัสตัวอย่าง:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

2

นี่ไม่ใช่คำตอบทางเทคนิค แต่หวังว่าจะเป็นประโยชน์ในการสร้างสัญชาตญาณของเรา:

ประการแรกตัวประมาณทั้งหมดได้รับการฝึกอบรม (หรือ "พอดี") กับข้อมูลการฝึกอบรมบางอย่าง ส่วนนั้นค่อนข้างตรงไปตรงมา

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

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

โดยสรุปพอดีดำเนินการฝึกอบรมเปลี่ยนการเปลี่ยนแปลงข้อมูลในไปป์ไลน์เพื่อส่งผ่านไปยังขั้นตอนถัดไปในไปป์ไลน์และfit_transformทำการปรับให้เหมาะสมและการเปลี่ยนรูปในขั้นตอนเดียวที่เหมาะสมที่สุด


"" เราใช้ชุดข้อมูลการฝึกอบรมและใช้วิธีการแปลงทั้ง - ชุดข้อมูลการฝึกอบรมและชุดข้อมูลการทดสอบ "" :) Nice
Prakash Kumar

2
ฉันคิดว่าคุณหมายถึงแสดงความคิดเห็นด้านล่าง ฉันจะส่งต่อไปยัง Prasad Nageshkar (อืม ... ฉันน่าจะได้ถ้ามีชื่อเสียง)
Eric McLachlan

1

โดยการใช้การแปลงคุณกำลังพยายามทำให้ข้อมูลของคุณทำงานตามปกติตัวอย่างเช่นถ้าคุณมีสองตัวแปรและทั้งสองวัดระยะทาง แต่มีหน่วยเป็นเซนติเมตรและมีหน่วยเป็นกิโลเมตรดังนั้นเพื่อเปรียบเทียบทั้งสองนี้ ต้องแปลงมันให้เป็นหน่วยเดียวกัน ... เช่นเดียวกับที่การปฏิรูปกำลังทำพฤติกรรมที่คล้ายกันหรือทำให้มีพฤติกรรมเหมือนการแจกแจงแบบปกติV1V2V1V2

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


0

พิจารณางานที่ต้องให้เราทำข้อมูลให้เป็นมาตรฐาน ตัวอย่างเช่นเราอาจใช้การทำให้เป็นมาตรฐานขั้นต่ำสุดหรือการทำให้เป็นมาตรฐาน z-score มีพารามิเตอร์บางอย่างในโมเดล ค่าต่ำสุดและค่าสูงสุดในการปรับสภาพ min-max และค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานในการปรับมาตรฐาน z-score ฟังก์ชัน fit () คำนวณค่าของพารามิเตอร์เหล่านี้

ผลของการพอดี ()

ฟังก์ชั่นการแปลงใช้ค่าของพารามิเตอร์กับข้อมูลจริงและให้ค่าปกติ

ผลของการแปลง ()

ฟังก์ชัน fit_transform () ดำเนินการทั้งสองอย่างในขั้นตอนเดียวกัน

ผลกระทบของ fit_transform ()

โปรดทราบว่าได้รับค่าเดียวกันไม่ว่าเราจะดำเนินการใน 2 ขั้นตอนหรือในขั้นตอนเดียว


0

"พอดี" คำนวณค่าเฉลี่ยและค่ามาตรฐานที่จะใช้สำหรับการปรับขนาดในภายหลัง (jsut การคำนวณ) ไม่มีอะไรให้คุณเลย

"transform" ใช้ค่าเฉลี่ยที่คำนวณไว้ก่อนหน้านี้และ std เพื่อปรับขนาดข้อมูลโดยอัตโนมัติ (ลบค่าเฉลี่ยจากค่าทั้งหมดแล้วหารด้วย std)

"fit_transform" ทำทั้งสองอย่างในเวลาเดียวกัน ดังนั้นคุณสามารถทำได้ด้วยโค้ด 1 บรรทัดแทน 2

ตอนนี้เรามาดูกันในทางปฏิบัติ:

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

มันง่ายมาก คุณทำได้ดีมาก ติดตามการทำงานที่ดีของคุณเพื่อนของฉัน :-)

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