วิธีเลือกจำนวนตัวประมาณสำหรับ Gradient Boosting

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

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

เมื่อสร้างตัวประมาณ Gradient Boosting คุณจะพบไฮเปอร์พารามิเตอร์นี้ n_estimator=100 ด้วยค่าเริ่มต้น 100 ต้นที่จะสร้างเพื่อให้ได้ผลลัพธ์ หลายครั้งเราตั้งค่านี้เป็นค่าเริ่มต้นหรืออาจเพิ่มขึ้นตามต้องการ แม้กระทั่งการใช้เทคนิค Grid Search

ในโพสต์นี้ เราจะพบวิธีง่ายๆ ในการหาเลขตัวเดียวเพื่อใช้ในการฝึกโมเดลของเรา

สามารถโหลด Gradient Boosting ได้จาก Scikit-Learn โดยใช้คลาสนี้ from sklearn.ensemble import GradientBoostingRegressor. อัลกอริทึม Gradient Boosting สามารถใช้สำหรับการจำแนกประเภทหรือแบบจำลองการถดถอย เป็นตัวประมาณค่าแบบต้นไม้ — หมายความว่าประกอบด้วยแผนผังการตัดสินใจจำนวนมาก

ผลของการ ต้นไม้ 1 จะทำให้เกิดข้อผิดพลาด ข้อผิดพลาดเหล่านั้นจะถูกใช้และอินพุตสำหรับ ต้นไม้ 2. อีกครั้ง ข้อผิดพลาดของรุ่นสุดท้ายจะถูกใช้และอินพุตของรุ่นถัดไป จนกว่าจะถึง n_estimators มูลค่า

แต่ละรุ่นจะพอดีกับข้อผิดพลาดของรุ่นก่อนหน้า ภาพโดยผู้เขียน.

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

มาดูวิธีทำกันเลย

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

เริ่มต้นด้วยการเลือกชุดข้อมูล เราจะใช้ รถ_ชน ชุดข้อมูลพื้นเมืองจากห้องสมุดทะเล (ดังนั้นข้อมูลเปิดภายใต้ใบอนุญาต BDS)

#ชุดข้อมูล
df = sns.load_dataset('car_crashes')

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

ชุดข้อมูลการชนของรถ, จากท้องทะเล. ภาพโดยผู้เขียน.

ดูความสัมพันธ์อย่างรวดเร็ว

#สัมพันธ์
df.corr().style.background_gradient(cmap='coolwarm')
ความสัมพันธ์ในชุดข้อมูล ภาพโดยผู้เขียน.

โอเค ไม่มี multicollinearity ที่สำคัญ เราสามารถเห็นได้ว่า ins_premium และ ins_losses ไม่สัมพันธ์กันเป็นอย่างดีกับ total ดังนั้นเราจะไม่พิจารณาพวกเขาในแบบจำลอง

หากเราตรวจสอบข้อมูลที่หายไปแล้วไม่มี

# หายไป
df.isnull().sum()
0

ดี งั้นมาแบ่งข้อมูลกัน

# X และ y
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], แกน=1)
y = df ['ทั้งหมด']
#ข้อสอบรถไฟ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, สุ่มสถานะ=22)

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

ฉันใช้ตัวประมาณ 500 ตัวกับ learning_rate จาก 0.3

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

ขั้นตอน = [('มาตราส่วน', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# ตัวอย่างท่อและพอดี
ท่อ = ไปป์ไลน์ (ขั้นตอน) พอดี (X_train, y_train)
# ทำนาย
การคาดการณ์ = pipe.predict (X_test)

ตอนนี้กำลังประเมิน

# RMSE ของการคาดการณ์
พิมพ์ (f'RMSE: { รอบ (np.sqrt (mean_squared_error (y_test, preds)),1 )}')
[ออก]: RMSE: 1.1# ค่าเฉลี่ยของค่า Y ที่แท้จริง
พิมพ์ (f'ข้อมูล y หมายถึง: {รอบ ( y.mean (),1 )}')
[ออก]: ข้อมูล y หมายถึง: 15.8

ดี. RMSE ของเราอยู่ที่ประมาณ 6.9% ของค่าเฉลี่ย โดยเฉลี่ยแล้วเราลดลงมากขนาดนี้

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

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

# นางแบบ
gbr = GradientBoostingRegressor (n_estimators=500, Learning_rate=0.3).fit(X_train, y_train)

ตอนนี้มันเป็นสิ่งที่ดี มีวิธีการใน Gradient Boosting ที่ช่วยให้เราสามารถวนซ้ำการคาดคะเนของตัวประมาณค่าแต่ละตัวที่ได้รับการฝึกอบรม ตั้งแต่ 1 ถึง 500 ดังนั้น เราจะสร้างลูปที่ผ่านตัวประมาณค่า 500 ตัวใน gbr แบบจำลองทำนายผลลัพธ์โดยใช้วิธีการ staged_predict()คำนวณค่าความคลาดเคลื่อนกำลังสองเฉลี่ยและเก็บผลลัพธ์ไว้ในรายการ errors.

# วนซ้ำสำหรับหมายเลขที่ดีที่สุด
error = [ mean_squared_error(y_test, preds) สำหรับ preds ใน gbr.staged_predict(X_test)]
# จำนวนตัวประมาณที่เหมาะสมที่สุด
optimum_num_estimators = np.argmin(ข้อผิดพลาด) + 1

ต่อไปเราสามารถพล็อตผลลัพธ์ได้

#พล็อต
g=sns.lineplot(x=ช่วง(500), y=ข้อผิดพลาด)
g.set_title(f'จำนวนตัวประมาณที่ดีที่สุดที่ {best_n_estimators}', size=15);
จำนวนตัวประมาณที่ดีที่สุด ภาพโดยผู้เขียน.

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

#ฝึกใหม่
gbr = GradientBoostingRegressor (n_estimators=34, Learning_rate=0.3).fit(X_train, y_train)
#คำทำนาย
preds2 = gbr.predict (X_test)

การประเมิน…

# RMSE ของการคาดการณ์
พิมพ์ (f'RMSE: { รอบ (np.sqrt (mean_squared_error (y_test, preds2)),1 )}')
[ออก]: RMSE: 1.0
# ข้อมูล Y หมายถึง
พิมพ์ (f'ข้อมูล y หมายถึง: {รอบ ( y.mean (),1 )}')
[ออก]: ข้อมูล y หมายถึง: 15.8

เราลดจาก 6.9% เป็น 6.3% ในตอนนี้ ประมาณ ดีขึ้น 9% มาดูคำทำนายกันหน่อย

คำทำนายจากทั้งสองรุ่น ภาพโดยผู้เขียน.

ผลลัพธ์ที่น่าสนใจ การคาดการณ์บางส่วนของรูปแบบที่สองดีกว่ารูปแบบแรก

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

บางครั้ง หลังจากการวนซ้ำไม่กี่ครั้ง โมเดลอาจเริ่มเกินพอดี ดังนั้นมันจะเริ่มเพิ่มความแปรปรวนมากเกินไป ซึ่งส่งผลต่อการคาดการณ์

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

ที่นี่มี รหัสที่สมบูรณ์ใน GitHub.

ถ้าคุณชอบเนื้อหานี้ ติดตามบล็อกของฉัน

ตามหาฉัน LinkedIn.

แบบฝึกหัดนี้อ้างอิงจากตำราที่ยอดเยี่ยมของ Aurélien Géron ในเอกสารอ้างอิง

วิธีเลือกจำนวนตัวประมาณสำหรับ Gradient Boosting เผยแพร่ซ้ำจากแหล่งที่มา 8 ผ่าน https://towardsdatascience.com/feed

<!–

->

ประทับเวลา:

เพิ่มเติมจาก ที่ปรึกษาบล็อคเชน