อะไรคือความแตกต่างระหว่างการถดถอยของแนวสันโดยใช้ glmnet ของ R และ Scikit-Learn ของ Python?


11

ฉันกำลังอ่านส่วน 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


5
ไม่คุ้นเคยกับการถดถอยสัน glmnet โดยสิ้นเชิง แต่โดยปกติsklearn.linear_model.Ridgeจะประมาณค่าตัด unpenalized (มาตรฐาน) และโทษเป็นเช่นนั้นจะลดลงสำหรับ||Xb - y - intercept||^2 + alpha ||b||^2 bอาจมีปัจจัย1/2หรือ1/n_samplesหรือทั้งสองข้างหน้าการลงโทษทำให้ผลลัพธ์ที่แตกต่างทันที หากต้องการแยกแยะปัญหาการปรับสเกลให้ตั้งค่าโทษเป็น 0 ในทั้งสองกรณีแก้ไขความคลาดเคลื่อนใด ๆ ที่นั่นจากนั้นตรวจสอบสิ่งที่เพิ่มโทษกลับ และ btw IMHO ที่นี่เป็นสถานที่ที่เหมาะสมในการถามคำถามนี้

คำตอบ:


9

คำตอบของฉันขาดปัจจัยโปรดดู @visitors คำตอบด้านล่างเพื่อการเปรียบเทียบที่ถูกต้อง1N


ต่อไปนี้เป็นข้ออ้างอิงสองข้อที่ควรอธิบายความสัมพันธ์

เอกสาร sklearnบอกว่าlinear_model.Ridgeปรับฟังก์ชั่นวัตถุประสงค์ดังต่อไปนี้ให้เหมาะสม

|Xβy|22+α|β|22

กระดาษ glmnetบอกว่าตาข่ายยืดหยุ่นปรับฟังก์ชั่นวัตถุประสงค์ดังต่อไปนี้ให้เหมาะสม

|Xβy|22+λ(12(1α)|β|22+α|β|1)

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

เปรียบเทียบสูตรมันมีลักษณะเหมือนการตั้งค่าและใน glmnet จะฟื้นตัวจากการแก้ปัญหาλ = 2 α sklearnα=0λ=2αsklearnlinear_model.Ridge


และฉันก็พลาดไปโดยสิ้นเชิงในคำวิจารณ์ของ @eickenberg เช่นกัน ฉันจะต้องใช้standardize = FALSEในการglmnet()ที่จะได้รับผลเหมือนกัน
Jordi

@Jordi คุณควรสร้างมาตรฐานให้แน่นอนหากใช้linear_model.Ridgeสำหรับการวิเคราะห์ในโลกแห่งความเป็นจริง
Matthew Drury

ฉันเข้าใจว่าlinear_model.Ridgeรุ่นsklearn สร้างมาตรฐานให้กับคุณสมบัติโดยอัตโนมัติ การปรับสภาพเป็นทางเลือก ฉันสงสัยว่าทำไมฉันต้องปิดการใช้งานมาตรฐานglmnet()เพื่อให้ได้แบบจำลองเพื่อให้ได้ผลลัพธ์ที่เหมือนกัน
Jordi

10

คำตอบของ Matthew Drury ควรมีปัจจัย 1 / N อย่างแม่นยำมากขึ้น...

เอกสาร glmnetระบุว่าสุทธิยืดหยุ่นลดฟังก์ชั่นการสูญเสีย

1ยังไม่มีข้อความXβ-Y22+λ(12(1-α)β22+αβ1)

เอกสาร sklearnบอกว่าlinear_model.Ridgeลดขนาดฟังก์ชั่นการสูญเสีย

Xβ-Y22+αβ22

ซึ่งเทียบเท่ากับการย่อขนาด

1ยังไม่มีข้อความXβ-Y22+αยังไม่มีข้อความβ22

ในการรับโซลูชันเดียวกันจาก glmnet และ sklearn ฟังก์ชันการสูญเสียทั้งสองจะต้องเท่ากัน ซึ่งหมายความว่าการตั้งค่าและใน glmnetα=0λ=2ยังไม่มีข้อความαsklearn

library(glmnet)
X = matrix(c(1, 1, 2, 3, 4, 2, 6, 5, 2, 5, 5, 3), byrow = TRUE, ncol = 3)
y = c(1, 0, 0, 1)
reg = glmnet(X, y, alpha = 0, lambda = 2 / nrow(X))
coef(reg)

เอาต์พุต glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955

import numpy as np
from sklearn.linear_model import Ridge
X = np.array([[1, 1, 2], [3, 4, 2], [6, 5, 2], [5, 5, 3]])
y = np.array([1, 0, 0, 1])
reg = Ridge(alpha = 1, fit_intercept = True, normalize = True)
reg.fit(X, y)
np.hstack((reg.intercept_, reg.coef_))

เอาต์พุต sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921


4
คำจำกัดความที่แตกต่างกันของพารามิเตอร์และมาตราส่วนที่ใช้ในไลบรารีต่าง ๆ เป็นแหล่งของความสับสนทั่วไป
AaronDefazio

1
ฉันไม่คาดหวังว่าทั้ง Gung และฉันจะทำผิดนี้
Michael R. Chernick

2
ใช่คุณทั้งคู่เข้าใจผิด เหตุผลของคุณสำหรับการปฏิเสธการแก้ไขของฉันทำให้ชัดเจนว่าคุณทั้งคู่ไม่เห็นความคิดเห็นของฉัน "ปัจจัยที่ขาดหายไปของ 1 / N" ที่ stats.stackexchange.com/review/suggested-edits/139985
ผู้เยี่ยมชม

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

1
@visitor ขออภัยถ้าฉันไม่พอใจ ฉันควรพยายามสื่อสารว่าคุณดูเหมือนจะเป็นผู้มีส่วนร่วมที่ดีต่อเว็บไซต์และฉันต้องการให้คุณได้รับประสบการณ์ที่ดี เรามีบรรทัดฐานทางสังคมเช่นเดียวกับกลุ่มอื่น ๆ และคุณจะมีประสบการณ์ที่ดีขึ้นหากคุณตระหนักถึงพวกเขา ผมยังคิดว่า "คำตอบแมทธิวดรูรี่เป็นสิ่งที่ผิด" คือค่อนข้างรุนแรงมีวิธีที่ดีกว่าก็จะสื่อสารว่าคำตอบของฉันคือไม่สมควรที่ขาดหายไปของปัจจัย{N} "คำตอบของ X ผิด" อ่านเป็นการโจมตีส่วนตัว 1ยังไม่มีข้อความ
Matthew Drury
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.