ฉันกำลังอ่านส่วน LAB §6.6เกี่ยวกับการถดถอยของสัน / Lasso ในหนังสือ'บทนำสู่การเรียนรู้เชิงสถิติด้วยแอปพลิเคชันใน R'โดย James, Witten, Hastie, Tibshirani (2013)
โดยเฉพาะอย่างยิ่งฉันพยายามใช้โมเดล scikit-Learn Ridge
กับชุดข้อมูล 'Hitters' จากแพ็คเกจ R 'ISLR' ฉันสร้างฟีเจอร์ชุดเดียวกันตามที่แสดงในรหัส R แล้ว อย่างไรก็ตามฉันไม่สามารถใกล้เคียงกับผลลัพธ์จากglmnet()
โมเดลได้ ฉันเลือกพารามิเตอร์การปรับแต่ง L2 หนึ่งพารามิเตอร์เพื่อทำการเปรียบเทียบ (อาร์กิวเมนต์ 'alpha' ใน scikit เรียนรู้)
งูหลาม:
regr = Ridge(alpha=11498)
regr.fit(X, y)
http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb
R:
โปรดทราบว่าการโต้แย้งalpha=0
ในglmnet()
หมายความว่าโทษ L2 ควรใช้ (Ridge ถดถอย) เอกสารเตือนไม่ให้ป้อนค่าเดียวlambda
แต่ผลลัพธ์จะเหมือนกับใน ISL ซึ่งมีการใช้เวกเตอร์
ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)
อะไรทำให้เกิดความแตกต่าง
แก้ไข:
เมื่อใช้penalized()
จากแพ็คเกจที่ถูกลงโทษใน R ค่าสัมประสิทธิ์จะเหมือนกับ scikit-Learn
ridge.mod2 <- penalized(y,x,lambda2=11498)
บางทีคำถามก็อาจเป็นได้: 'อะไรคือความแตกต่างระหว่างglmnet()
และpenalized()
เมื่อทำการถดถอยของสันเขา?
ใหม่ wrapper หลามสำหรับรหัส Fortran จริงที่ใช้ในแพคเกจR glmnet
https://github.com/civisanalytics/python-glmnet
sklearn.linear_model.Ridge
จะประมาณค่าตัด unpenalized (มาตรฐาน) และโทษเป็นเช่นนั้นจะลดลงสำหรับ||Xb - y - intercept||^2 + alpha ||b||^2
b
อาจมีปัจจัย1/2
หรือ1/n_samples
หรือทั้งสองข้างหน้าการลงโทษทำให้ผลลัพธ์ที่แตกต่างทันที หากต้องการแยกแยะปัญหาการปรับสเกลให้ตั้งค่าโทษเป็น 0 ในทั้งสองกรณีแก้ไขความคลาดเคลื่อนใด ๆ ที่นั่นจากนั้นตรวจสอบสิ่งที่เพิ่มโทษกลับ และ btw IMHO ที่นี่เป็นสถานที่ที่เหมาะสมในการถามคำถามนี้