วิธีใช้ผลลัพธ์ของ GridSearch


23

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

วิธีการของฉันคือ:

  1. แบ่งข้อมูลของฉันออกเป็นการฝึกอบรม / ทดสอบ
  2. ใช้ GridSearch พร้อมการตรวจสอบ 5Fold Cross เพื่อฝึกอบรมและทดสอบเครื่องมือประมาณค่าของฉัน (Random Forest, Gradient Boost, SVC และอื่น ๆ ) เพื่อรับเครื่องมือประมาณค่าที่ดีที่สุดด้วยการรวมกันของพารามิเตอร์ไฮเปอร์
  3. จากนั้นฉันคำนวณตัวชี้วัดของตัวประมาณค่าของฉันเช่น Precision, Recall, FMeasure และ Matthews Correlation Coefficient โดยใช้ชุดทดสอบของฉันเพื่อทำนายการจำแนกประเภทและเปรียบเทียบกับฉลากระดับจริง

มันอยู่ในขั้นตอนนี้ที่ฉันเห็นพฤติกรรมแปลก ๆ และฉันไม่แน่ใจว่าจะดำเนินการต่อไปอย่างไร ฉันจะใช้. best_estimator_ จาก GridSearch และใช้สิ่งนี้เป็นผลลัพธ์ 'ดีที่สุด' จากการค้นหากริดและทำการคาดการณ์โดยใช้เครื่องมือประมาณนี้ ถ้าฉันทำสิ่งนี้ฉันพบว่าตัวชี้วัดระยะที่ 3 มักจะต่ำกว่าถ้าฉันฝึกอบรมข้อมูลการฝึกอบรมทั้งหมดและทดสอบในชุดการทดสอบ หรือฉันจะใช้วัตถุ GridSearchCV ผลลัพธ์เป็นตัวประมาณใหม่หรือไม่ ถ้าฉันทำสิ่งนี้ฉันจะได้คะแนนที่ดีขึ้นสำหรับตัวชี้วัดระยะที่ 3 ของฉัน แต่ดูเหมือนว่าแปลกเมื่อใช้วัตถุ GridSearchCV แทนที่จะเป็นตัวจําแนกตามที่ต้องการ (เช่นฟอเรสต์แบบสุ่ม) ...

แก้ไข: ดังนั้นคำถามของฉันคือความแตกต่างระหว่างวัตถุ GridSearchCV กลับมาและแอตทริบิวต์. best_estimator_ คืออะไร ฉันควรใช้วิธีใดในการคำนวณเมตริกเพิ่มเติม ฉันสามารถใช้เอาต์พุตนี้เหมือนลักษณนามปกติ (เช่นใช้ทำนาย) หรือฉันจะใช้มันได้อย่างไร?

คำตอบ:


27

ตัดสินใจที่จะออกไปและค้นหาคำตอบที่จะตอบสนองคำถามของฉันและเขียนพวกเขาที่นี่สำหรับคนอื่นสงสัย

แอ็ตทริบิวต์ .best_estimator_ เป็นตัวอย่างของประเภทรุ่นที่ระบุซึ่งมีการผสม 'ที่ดีที่สุด' ของพารามิเตอร์ที่กำหนดจาก param_grid ว่าอินสแตนซ์นี้มีประโยชน์หรือไม่ขึ้นอยู่กับว่าพารามิเตอร์การปรับตั้งนั้นถูกตั้งค่าเป็น True (โดยค่าเริ่มต้น) ตัวอย่างเช่น:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

จะส่งคืน RandomForestClassifier นี่คือทั้งหมดที่สวยใสจากเอกสาร สิ่งที่ไม่ชัดเจนจากเอกสารประกอบคือสาเหตุที่ตัวอย่างส่วนใหญ่ไม่ได้ใช้. best_estimator_ โดยเฉพาะและทำสิ่งนี้แทน:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

วิธีที่สองนี้ส่งคืนอินสแตนซ์ GridSearchCV พร้อมด้วยระฆังและเสียงนกหวีดทั้งหมดของ GridSearchCV เช่น. best_estimator_, .best_params ฯลฯ ซึ่งสามารถใช้ตัวแยกแยะที่ได้รับการฝึกอบรมเพราะ:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

มันใช้อินสแตนซ์ตัวประมาณที่ดีที่สุดแบบเดียวกันเมื่อทำการคาดการณ์ ดังนั้นในทางปฏิบัติไม่มีความแตกต่างระหว่างสองสิ่งนี้ยกเว้นว่าคุณต้องการให้อินสแตนซ์ตัวประมาณเท่านั้นเอง ในฐานะที่เป็นหมายเหตุด้านความแตกต่างของฉันในการวัดไม่เกี่ยวข้องและลงไปที่ฟังก์ชั่นการถ่วงน้ำหนักระดับบั๊กกี้


ขอบคุณสำหรับการโพสต์ @Dan ของคุณมันมีประโยชน์มาก ฉันต้องการขอคำชี้แจงจากคุณ ในกรณีหลังนี้ถ้าฉันมีrefit=Falseแล้วclf.fitจะไม่ทำกับลักษณนามที่ดีที่สุด?
Poete Maudit

@PoeteMaudit พารามิเตอร์ refit บอกให้ฟังก์ชั่น GridSearchCV ใช้พารามิเตอร์ที่ดีที่สุดที่พบและสั่งสอนแบบจำลองใหม่โดยใช้พารามิเตอร์เหล่านั้นในชุดข้อมูลทั้งหมด หากอานิสงส์ = เท็จจะไม่สามารถใช้งาน best_estimator ได้ตามเอกสาร: scikit-learn.org/stable/modules/generated/ ......
Dan Carter

0

GridSearchCV ช่วยให้คุณสามารถรวมเครื่องมือประมาณค่ากับคำนำตารางการค้นหาเพื่อปรับแต่งพารามิเตอร์ไฮเปอร์ วิธีการเลือกพารามิเตอร์ที่ดีที่สุดจากการค้นหากริดและใช้กับผู้ประเมินที่เลือกโดยผู้ใช้ GridSearchCV สืบทอดวิธีการจากตัวจําแนกดังนั้นใช่คุณสามารถใช้วิธีการ. คะแนน, .predict ฯลฯ .. โดยตรงผ่านอินเทอร์เฟซ GridSearchCV หากคุณต้องการแยกพารามิเตอร์ไฮเปอร์ที่ดีที่สุดที่ระบุโดยการค้นหากริดคุณสามารถใช้. best_params_ และสิ่งนี้จะส่งกลับพารามิเตอร์ไฮเปอร์ที่ดีที่สุด จากนั้นคุณสามารถส่งพารามิเตอร์ไฮเปอร์นี้ไปยังตัวประมาณของคุณแยกกันได้

การใช้ .predict โดยตรงจะให้ผลลัพธ์เหมือนกับการรับพารามิเตอร์ไฮเปอร์ที่ดีที่สุดผ่าน. best_param_ จากนั้นใช้ในโมเดลของคุณ โดยการทำความเข้าใจกับการขีดเส้นใต้ของการค้นหากริดเราสามารถเห็นได้ว่าทำไมถึงเป็นเช่นนี้


ค้นหากริด

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

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

เราจะเลือก k ได้อย่างไร?

บางคนก็ไปกับคำแนะนำจากการศึกษาที่ผ่านมาของประเภทข้อมูล คนอื่นใช้การค้นหากริด วิธีนี้จะสามารถกำหนดได้ดีที่สุดว่า k ใดเหมาะสมที่สุดที่จะใช้กับข้อมูลของคุณ

มันทำงานยังไง?

[1,2,3,...,10]

สิ่งนี้ขัดกับหลักการที่ไม่ใช้ข้อมูลทดสอบ !!

nnn1n

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


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

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

นั่นจะเป็นข้อเสนอแนะที่ดีถ้าฉันมีพารามิเตอร์ hyperparameter เพียงตัวเดียวเพื่อปรับให้เหมาะสม แต่ถ้าฉันมี 4 5? การซ้อนกัน 4/5 ครั้งสำหรับลูปนั้นน่าเกลียดและฉันไม่เห็นว่าจำเป็นต้องบูรณาการล้อที่นี่ซึ่งจะเสียเวลาและนี่เป็นเหตุผลว่าทำไมแพคเกจนี้จึงมีอยู่
Dan Carter

GridSearchCV ช่วยให้คุณสามารถรวมเครื่องมือประมาณค่ากับการตั้งค่า GridSearchCV ดังนั้นมันจึงเป็นสิ่งที่เราเพิ่งพูดถึง จากนั้นจะเลือกพารามิเตอร์ที่ดีที่สุดและใช้กับตัวประมาณที่คุณเลือก GridSearchCV สืบทอดวิธีการจากตัวจําแนกดังนั้นใช่คุณสามารถใช้วิธีการ. คะแนน, .predict ฯลฯ .. โดยตรงผ่านอินเทอร์เฟซ GridSearchCV ฉันไม่แนะนำให้ทำเช่นนี้อย่างไรก็ตามเครื่องมือที่ง่ายขึ้นหมายถึงการควบคุมที่น้อยลง สำหรับบางสิ่งที่ง่ายอย่างการค้นหากริดเพียงแค่เขียนโค้ดด้วยตัวคุณเอง
JahKnows

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