Python - sklearn.pipeline.Pipeline คืออะไร?


118

ฉันคิดไม่ออกว่ามันsklearn.pipeline.Pipelineทำงานอย่างไร

มีคำอธิบายที่ไม่กี่คนในที่มีเอกสาร ตัวอย่างเช่นพวกเขาหมายถึงอะไร:

ท่อส่งของการแปลงด้วยตัวประมาณค่าสุดท้าย

เพื่อให้คำถามของฉันชัดเจนขึ้นมีstepsอะไรบ้าง? พวกเขาทำงานอย่างไร?

แก้ไข

ขอบคุณสำหรับคำตอบที่ทำให้คำถามของฉันชัดเจนขึ้น:

เมื่อฉันเรียกไปป์ไลน์และผ่านเป็นขั้นตอนหม้อแปลงสองตัวและตัวประมาณหนึ่งตัวเช่น:

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

จะเกิดอะไรขึ้นเมื่อฉันเรียกสิ่งนี้

pipln.fit()
OR
pipln.fit_transform()

ฉันคิดไม่ออกว่าตัวประมาณจะเป็นหม้อแปลงได้อย่างไรและจะติดตั้งหม้อแปลงได้อย่างไร


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

1
queirozf.com/entries/scikit-learn-pipeline-examples ที่ฉันพบว่ามีประโยชน์
randomSampling

คำตอบ:


180

Transformerใน scikit-learn - คลาสบางคลาสที่มี fit and transform method หรือ fit_transform method

Predictor - คลาสบางคลาสที่มีเมธอดที่เหมาะสมและทำนายหรือเมธอด fit_predict

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

นี่คือตัวอย่างที่ดีของการใช้งานไปป์ไลน์ ไปป์ไลน์ให้อินเทอร์เฟซเดียวสำหรับการแปลงทั้ง 3 ขั้นตอนและตัวประมาณผลลัพธ์ มันห่อหุ้มหม้อแปลงและตัวทำนายไว้ข้างในและตอนนี้คุณสามารถทำสิ่งต่างๆเช่น:

    vect = CountVectorizer()
    tfidf = TfidfTransformer()
    clf = SGDClassifier()

    vX = vect.fit_transform(Xtrain)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

    # Now evaluate all steps on test set
    vX = vect.fit_transform(Xtest)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

ด้วยเพียง:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

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


1
คุณหมายถึงpredicted = pipeline.fit(Xtrain).predict(Xtrain)อะไร?
farhawa

@farhawa ชั้นเรียนทำนายเรื่องชุดฝึก.
Ibraim Ganiev

4
ทำไมถึงไม่มีคะแนนโหวตมากกว่านี้? ควรเป็นบล็อกโพสต์
R Claven

1
@iamgin อินเทอร์เฟซของหม้อแปลง scikit-learn ส่วนใหญ่ไม่อนุญาตให้เลือกคอลัมน์ที่จำเป็นที่เราต้องการเปลี่ยน แต่คุณสามารถเขียน "Item Selector" ของคุณเองซึ่งจะช่วยให้คุณป้อนหม้อแปลงเฉพาะกับคอลัมน์ที่จำเป็นเท่านั้น นี่คือตัวอย่างที่ดีสำหรับ ItemSelector และ FeatureUnion scikit-learn.org/stable/auto_examples/…
Ibraim Ganiev

1
ในตัวอย่างแรกคุณไม่ต้องการหลีกเลี่ยงการติดตั้งอีกครั้งกับชุดทดสอบหรือไม่? ไม่ควรเรียกว่า transform แทน fit_transform ใช่หรือไม่? และในทำนองเดียวกันไปป์ไลน์ทำนายภายในเรียกว่า fit_transform หรือเพียงแค่แปลงร่าง? สามารถควบคุมได้หรือไม่?
Steven

18

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

  1. หม้อแปลงชั้นเรียนที่ใช้ทั้งในและfit() transform()คุณอาจจะคุ้นเคยกับบางส่วนของ sklearn preprocessing เครื่องมือเช่นและTfidfVectorizer Binarizerหากคุณดูเอกสารสำหรับเครื่องมือก่อนการประมวลผลเหล่านี้คุณจะเห็นว่าพวกเขาใช้ทั้งสองวิธีนี้ สิ่งที่ฉันคิดว่าค่อนข้างเจ๋งก็คือตัวประมาณค่าบางตัวสามารถใช้เป็นขั้นตอนการเปลี่ยนแปลงได้เช่นกันLinearSVC!

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

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

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

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

print bin.classes_  

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อลองสิ่งนี้:

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

แต่เมื่อคุณพอดีกับ binarizer ในvecรายการ:

bin.fit(vec)

แล้วลองอีกครั้ง

print bin.classes_

ฉันได้รับสิ่งต่อไปนี้:

['cat' 'dog']


print bin.transform(vec)

และตอนนี้หลังจากเรียกการแปลงร่างบนvecวัตถุแล้วเราจะได้รับสิ่งต่อไปนี้:

[[0]
 [1]
 [1]
 [1]]

สำหรับตัวประมาณที่ใช้เป็นหม้อแปลงให้เราใช้DecisionTreeลักษณนามเป็นตัวอย่างของตัวแยกคุณลักษณะ ต้นไม้ตัดสินใจนั้นยอดเยี่ยมด้วยเหตุผลหลายประการ แต่สำหรับจุดประสงค์ของเราสิ่งที่สำคัญคือพวกมันมีความสามารถในการจัดอันดับคุณสมบัติที่ต้นไม้พบว่ามีประโยชน์สำหรับการทำนาย เมื่อคุณเรียกtransform()บนต้นไม้การตัดสินใจก็จะใช้การป้อนข้อมูลของคุณและหาสิ่งที่มันคิดว่าเป็นคุณสมบัติที่สำคัญที่สุด ดังนั้นคุณสามารถคิดว่ามันเปลี่ยนเมทริกซ์ข้อมูลของคุณ (n แถวตามคอลัมน์ m) เป็นเมทริกซ์ที่เล็กกว่า (n แถวตาม k คอลัมน์) โดยที่คอลัมน์ k เป็นคุณสมบัติที่สำคัญที่สุดของโครงสร้างการตัดสินใจที่พบ


อะไรคือความแตกต่างระหว่างfit()และtransform()เป็นหม้อแปลง? , วิธีใช้ตัวประมาณเป็นหม้อแปลงได้อย่างไร?
farhawa

2
fit()เป็นวิธีที่คุณเรียกให้พอดีหรือ 'ฝึก' หม้อแปลงของคุณเช่นเดียวกับที่คุณใช้ลักษณนามหรือแบบจำลองการถดถอย ในฐานะที่เป็นtransform()ที่เป็นวิธีการที่คุณโทรไปจริงเปลี่ยนการป้อนข้อมูลเป็นข้อมูลการส่งออก ยกตัวอย่างเช่นการโทรBinarizer.transform([8,2,2])(หลังจากที่เหมาะสม!) [[1,0],[0,1],[0,1]]อาจส่งผลให้ สำหรับการใช้ตัวประมาณเป็นตัวแปลงฉันจะแก้ไขตัวอย่างสั้น ๆ ในคำตอบของฉัน
NBartley

9

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

ML pipelines คืออะไรและทำงานอย่างไร?

ไปป์ไลน์คือชุดของขั้นตอนในการแปลงข้อมูล มันมาจากรูปแบบการออกแบบ "pipe and filter" แบบเก่า (เช่นคุณอาจนึกถึงคำสั่ง unix bash ที่มีไพพ์“ |” หรือตัวดำเนินการเปลี่ยนเส้นทาง“>”) อย่างไรก็ตามไปป์ไลน์เป็นวัตถุในรหัส ดังนั้นคุณอาจมีคลาสสำหรับตัวกรองแต่ละตัว (หรือที่เรียกว่าแต่ละขั้นตอนไปป์ไลน์) จากนั้นคลาสอื่นเพื่อรวมขั้นตอนเหล่านั้นลงในไปป์ไลน์ขั้นสุดท้าย ท่อบางท่ออาจรวมไปป์ไลน์อื่น ๆ เป็นอนุกรมหรือขนานกันมีอินพุตหรือเอาต์พุตหลายตัวและอื่น ๆ เราชอบดูไปป์ไลน์ Machine Learning เป็น:

  • ท่อและฟิลเตอร์ ขั้นตอนของไปป์ไลน์ประมวลผลข้อมูลและจัดการสถานะภายในซึ่งสามารถเรียนรู้ได้จากข้อมูล
  • คอมโพสิต . ไปป์ไลน์สามารถซ้อนกันได้: ตัวอย่างเช่นไปป์ไลน์ทั้งหมดสามารถถือว่าเป็นขั้นตอนไปป์ไลน์เดียวในไปป์ไลน์อื่น ขั้นตอนไปป์ไลน์ไม่จำเป็นต้องเป็นไปป์ไลน์ แต่อย่างน้อยไปป์ไลน์ก็เป็นขั้นตอนตามนิยาม
  • กำกับวัฏจักรกราฟ (DAG) เอาต์พุตของขั้นตอนไปป์ไลน์อาจถูกส่งไปยังขั้นตอนอื่น ๆ จากนั้นผลลัพธ์ที่ได้จะสามารถรวมกันใหม่ได้และอื่น ๆ หมายเหตุด้านข้าง: แม้ว่าไปป์ไลน์จะเป็นแบบไม่สมมาตร แต่ก็สามารถประมวลผลได้หลายรายการทีละรายการและหากสถานะเปลี่ยนไป (เช่น: ใช้วิธี fit_transform ทุกครั้ง) ก็สามารถมองได้ว่าเป็นไปตามกาลเวลาโดยคงสถานะไว้ (คิดเช่น RNN) นั่นเป็นวิธีที่น่าสนใจในการดูท่อสำหรับการเรียนรู้ออนไลน์เมื่อนำไปใช้ในการผลิตและฝึกอบรมเกี่ยวกับข้อมูลเพิ่มเติม

วิธีการของ Scikit-Learn Pipeline

ท่อ (หรือขั้นตอนในท่อ) ต้องมีสองวิธีดังกล่าว :

  • พอดี ” ที่จะเรียนรู้เกี่ยวกับข้อมูลและรับสถานะ (เช่นน้ำหนักประสาทของโครงข่ายประสาทเป็นสถานะดังกล่าว)
  • " แปลง " (หรือ "ทำนาย") เพื่อประมวลผลข้อมูลและสร้างการคาดการณ์

นอกจากนี้ยังสามารถเรียกวิธีนี้ว่าเชื่อมโยงทั้งสอง:

  • fit_transform ” ให้พอดีแล้วแปลงข้อมูล แต่ในการส่งครั้งเดียวจะช่วยให้สามารถเพิ่มประสิทธิภาพโค้ดได้เมื่อทั้งสองวิธีต้องทำทีละวิธีโดยตรง

ปัญหาของคลาส sklearn.pipeline.Pipeline

รูปแบบการออกแบบ "ท่อและตัวกรอง" ของ Scikit-Learn นั้นสวยงามมาก แต่จะใช้กับ Deep Learning, AutoML และไปป์ไลน์ระดับการผลิตที่ซับซ้อนได้อย่างไร?

Scikit เรียนรู้มีการเปิดตัวครั้งแรกในปี 2007 ซึ่งเป็นยุคก่อนการเรียนรู้ลึก อย่างไรก็ตามนี่เป็นหนึ่งในไลบรารีการเรียนรู้ของเครื่องที่เป็นที่รู้จักและได้รับการยอมรับมากที่สุดและยังคงเติบโต เหนือสิ่งอื่นใดมันใช้รูปแบบการออกแบบท่อและตัวกรองเป็นรูปแบบสถาปัตยกรรมซอฟต์แวร์ซึ่งเป็นสิ่งที่ทำให้ Scikit-Learn ยอดเยี่ยมมากซึ่งเพิ่มเข้าไปในความจริงที่ว่าอัลกอริทึมพร้อมใช้งาน อย่างไรก็ตามมีปัญหาใหญ่เมื่อต้องทำสิ่งต่อไปนี้ซึ่งเราควรจะทำได้ในปี 2020 แล้ว:

  • การเรียนรู้ของเครื่องอัตโนมัติ (AutoML)
  • ท่อส่งการเรียนรู้เชิงลึก
  • ไปป์ไลน์ Machine Learning ที่ซับซ้อนมากขึ้น

แนวทางแก้ไขที่เราพบสำหรับปัญหาเหล่านั้นของ Scikit-Learn

แน่นอนว่า Scikit-Learn สะดวกและสร้างมาอย่างดี อย่างไรก็ตามต้องมีการรีเฟรช นี่คือโซลูชันของเรากับNeuraxleเพื่อทำให้ Scikit-Learn สดใหม่และใช้งานได้ภายในโครงการคอมพิวเตอร์สมัยใหม่!

วิธีการไปป์ไลน์และคุณสมบัติเพิ่มเติมที่นำเสนอผ่านNeuraxle

หมายเหตุ: หากขั้นตอนของไปป์ไลน์ไม่จำเป็นต้องมีวิธีการพอดีหรือวิธีการแปลงอย่างใดอย่างหนึ่งก็สามารถสืบทอดจากNonFittableMixinหรือNonTransformableMixinเพื่อให้การดำเนินการเริ่มต้นของวิธีการใดวิธีการหนึ่งเหล่านั้นไม่ต้องทำอะไรเลย

ในฐานะผู้เริ่มต้นเป็นไปได้ที่ไปป์ไลน์หรือขั้นตอนของพวกเขาจะกำหนดวิธีการเหล่านั้นด้วยตัวเลือก :

  • การตั้งค่า ” ซึ่งจะเรียกวิธีการ“ ตั้งค่า” ในแต่ละขั้นตอน ตัวอย่างเช่นหากขั้นตอนหนึ่งมีเครือข่ายประสาทเทียม TensorFlow, PyTorch หรือ Keras ขั้นตอนเหล่านี้อาจสร้างกราฟประสาทและลงทะเบียนกับ GPU ในวิธี "การตั้งค่า" ก่อนที่จะพอดี ไม่แนะนำให้สร้างกราฟโดยตรงในตัวสร้างของขั้นตอนด้วยเหตุผลหลายประการเช่นหากมีการคัดลอกขั้นตอนก่อนที่จะรันหลายครั้งโดยมีพารามิเตอร์หลายตัวที่แตกต่างกันภายในอัลกอริทึมการเรียนรู้ของเครื่องจักรอัตโนมัติที่ค้นหาไฮเปอร์พารามิเตอร์ที่ดีที่สุดสำหรับคุณ
  • teardown ” ซึ่งตรงข้ามกับวิธีการ“ ตั้งค่า”: จะล้างทรัพยากร

วิธีต่อไปนี้จะให้มาโดยเริ่มต้นเพื่อให้การจัดการ hyperparameters:

  • get_hyperparams ” จะส่งคืนพจนานุกรมของไฮเปอร์พารามิเตอร์ หากไปป์ไลน์ของคุณมีไปป์ไลน์มากขึ้น (ไปป์ไลน์ที่ซ้อนกัน) คีย์ของไฮเปอร์พารามิเตอร์จะถูกโยงด้วยเครื่องหมายขีดล่างสองตัว "__"
  • set_hyperparams ” จะช่วยให้คุณตั้งค่าไฮเปอร์พารามิเตอร์ใหม่ในรูปแบบเดียวกับเวลาที่คุณได้รับ
  • get_hyperparams_space ” ช่วยให้คุณได้พื้นที่ของไฮเปอร์พารามิเตอร์ซึ่งจะไม่ว่างเปล่าหากคุณกำหนดไว้ ดังนั้นความแตกต่างเพียงประการเดียวของ“ get_hyperparams” ที่นี่คือคุณจะได้รับการแจกแจงทางสถิติเป็นค่าแทนที่จะเป็นค่าที่แน่นอน ตัวอย่างเช่นไฮเปอร์พารามิเตอร์หนึ่งตัวสำหรับจำนวนเลเยอร์อาจเป็นRandInt(1, 3)1 ถึง 3 เลเยอร์ คุณสามารถเรียกใช้คำสั่ง.rvs()นี้ให้เลือกค่าแบบสุ่มและส่งไปที่“ set_hyperparams” เพื่อลองฝึกใช้งาน
  • set_hyperparams_space ” สามารถใช้เพื่อตั้งค่าช่องว่างใหม่โดยใช้คลาสการแจกแจงไฮเปอร์พารามิเตอร์เดียวกันกับใน“ get_hyperparams_space”

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโซลูชันที่แนะนำของเราโปรดอ่านรายการในรายการใหญ่พร้อมลิงก์ด้านบน

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