การใช้การถดถอยของสันเขา: การเลือกกริดอัจฉริยะสำหรับ ?


17

ฉันกำลังใช้ Ridge Regression ในโมดูล Python / C และฉันเจอปัญหา "น้อย" นี้ แนวคิดก็คือฉันต้องการตัวอย่างองศาอิสระที่มีประสิทธิภาพมากกว่าหรือน้อยกว่าระยะห่างเท่ากัน (เช่นพล็อตในหน้า 65 ใน "องค์ประกอบของการเรียนรู้ทางสถิติ" ) เช่นตัวอย่าง: ที่เป็นค่าลักษณะเฉพาะของเมทริกซ์จากเพื่อ P วิธีง่ายๆในการตั้งค่าขีด จำกัด แรกคือให้ (สมมติว่า\ lambda _ {\ max} \ gg d_i ^ 2 ) โดยที่c

df(λ)=i=1pdi2di2+λ,
di2XTXdf(λmax)0df(λmin)=pλmax=ipdi2/cλmaxdi2cเป็นค่าคงที่ขนาดเล็กและแสดงถึงระดับอิสระขั้นต่ำที่คุณต้องการสุ่มตัวอย่าง (เช่นc=0.1 ) ขีด จำกัด ที่สองเป็นของหลักสูตรλmin=0 0

ตามชื่อเรื่องแล้วฉันต้องตัวอย่างλจากλminถึงλmaxในระดับหนึ่งซึ่งdf(λ)ถูกสุ่มตัวอย่าง (โดยประมาณ) พูดใน0.1ช่วงจากcถึงp ... มีวิธีง่ายๆในการทำเช่นนี้หรือไม่? ฉันคิดว่าการแก้สมการdf(λ)สำหรับแต่ละλโดยใช้วิธี Newton-Raphson แต่สิ่งนี้จะเพิ่มการทำซ้ำมากเกินไปโดยเฉพาะเมื่อpมีขนาดใหญ่ ข้อเสนอแนะใด ๆ


1
ฟังก์ชั่นนี้เป็นฟังก์ชั่นที่ลดลงเหตุผลนูนλ00 รากโดยเฉพาะอย่างยิ่งถ้าเลือกมากกว่าตาราง dyadic ควรจะรวดเร็วในการค้นหา
พระคาร์ดินัล

@ cardinal คุณอาจพูดถูก อย่างไรก็ตามถ้าเป็นไปได้ฉันต้องการทราบว่ามีบางตาราง "เริ่มต้น" ตัวอย่างเช่นฉันพยายามรับตารางโดยทำλ=log(s)λmax/log(smax)โดยที่s=(1,2,...,smax)และ ทำงานได้ค่อนข้างดีสำหรับเสรีภาพในระดับหนึ่ง แต่เมื่อdf(λ)pมันระเบิดออกมา นี่ทำให้ฉันสงสัยว่าอาจจะมีวิธีที่ประณีตในการเลือกตารางสำหรับλซึ่งเป็นสิ่งที่ฉันขอ หากสิ่งนี้ไม่มีอยู่ฉันก็จะมีความสุขที่จะรู้ (เช่นฉันสามารถออกจากวิธีการ Newton-Rapson อย่างมีความสุขในรหัสของฉันรู้ว่า "ไม่มีวิธีที่ดีกว่าอยู่")
Néstor

เพื่อให้ได้แนวคิดที่ดีขึ้นเกี่ยวกับปัญหาที่อาจเกิดขึ้นที่คุณเผชิญอยู่ค่าทั่วไปและที่แย่ที่สุดคืออะไร มีอะไรที่คุณรู้ว่าเป็นเรื่องเกี่ยวกับการกระจายค่าลักษณะเฉพาะ? p
พระคาร์ดินัล

@ cardinal ค่าทั่วไปของในแอปพลิเคชันของฉันจะอยู่ในช่วงถึงแต่ฉันต้องการทำให้เป็นค่าทั่วไปที่สุด เกี่ยวกับการกระจายตัวแบบค่าเฉพาะไม่มากจริงๆ เป็นเมทริกซ์ที่มีตัวทำนายในคอลัมน์ซึ่งไม่ใช่ orthogonal 15 40 Xp1540X
Néstor

1
โดยทั่วไปนิวตัน - ราฟสันจะพบความถูกต้องของรากถึงภายในถึงขั้นตอนสำหรับและค่าขนาดเล็ก; เกือบจะไม่เกินขั้นตอน สำหรับค่าที่มากขึ้นจำเป็นต้องมีขั้นตอนมากถึงขั้นตอน เนื่องจากแต่ละขั้นตอนต้องการการคำนวณจำนวนการคำนวณทั้งหมดจึงไม่สำคัญ แน่นอนจำนวนขั้นตอนดูเหมือนจะไม่ขึ้นอยู่กับหากเลือกค่าเริ่มต้นที่ดี (ฉันเลือกขั้นตอนที่คุณจะใช้ถ้าทั้งหมดเท่ากับค่าเฉลี่ย) 3 4 p = 40 d f ( λ ) 6 30 O ( p ) p d i101234p=40df(λ)630O(p)pdi
whuber

คำตอบ:


19

นี่คือคำตอบยาว ดังนั้นขอมอบเวอร์ชั่นสั้นของที่นี่

  • ไม่มีวิธีแก้พีชคณิตที่ดีสำหรับปัญหาการค้นหารูทนี้ดังนั้นเราจึงต้องการอัลกอริธึมเชิงตัวเลข
  • functionมีคุณสมบัติที่ดีมากมาย เราสามารถควบคุมสิ่งเหล่านี้เพื่อสร้างวิธีเฉพาะของนิวตันสำหรับปัญหานี้โดยมีการบรรจบกันแบบ monotonicต่อรากแต่ละอันdf(λ)
  • แม้กระทั่งRรหัสที่ไม่มีสมองความพยายามใด ๆ ในการปรับให้เหมาะสมสามารถคำนวณกริดขนาด 100 ด้วยในไม่กี่วินาที รหัสที่เขียนอย่างระมัดระวังจะลดขนาดลงอย่างน้อย 2-3 คำสั่งp=100000C

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

ตัวอย่าง :และกริดสม่ำเสมอสำหรับองศาอิสระขนาด 100 ค่าลักษณะเฉพาะมีการกระจายพาเรโตจึงเบ้สูง ด้านล่างนี้เป็นตารางจำนวนขั้นตอนของนิวตันเพื่อค้นหาแต่ละรูตp=100000

# Table of Newton iterations per root.
# Without using lower-bound check.
  1  3  4  5  6 
  1 28 65  5  1 
# Table with lower-bound check.
  1  2  3 
  1 14 85 

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

ก่อนที่จะขุดลึกลงไปในสิ่งต่าง ๆ มากเกินไปให้รวบรวมคุณสมบัติและผลที่ตามมาของฟังก์ชั่น

df(λ)=i=1pdi2di2+λ.

อสังหาริมทรัพย์ 0 :เป็นฟังก์ชั่นที่มีเหตุผลของ\(นี่คือที่เห็นได้ชัดจากคำนิยาม.) ผล 0 : ไม่มีการแก้ปัญหาเกี่ยวกับพีชคณิตทั่วไปจะมีอยู่สำหรับการหาราก0 นี่เป็นเพราะมีปัญหาการค้นหารูทพหุนามเทียบเท่าของระดับและดังนั้นหากไม่เล็กมาก (เช่นน้อยกว่าห้า) จะไม่มีวิธีแก้ปัญหาทั่วไป ดังนั้นเราจะต้องใช้วิธีการเชิงตัวเลข λdfλ
df(λ)y=0พีpp

ทรัพย์สิน 1 : ฟังก์ชั่นนูนและลดลงใน0 (รับอนุพันธ์) ผลที่ตามมา 1 (a) : อัลกอริทึมการค้นหารากของนิวตันจะทำงานได้ดีมากในสถานการณ์นี้ Letเป็นองศาที่ต้องการของเสรีภาพและรากที่สอดคล้องกันคือlambda_0) โดยเฉพาะอย่างยิ่งถ้าเราเริ่มต้นด้วยการใด ๆค่าเริ่มต้น (ดังนั้น ) แล้วลำดับของนิวตันขั้นตอนซ้ำจะมาบรรจบกันmonotonicallyไป ทางออกที่ไม่ซ้ำ λ 0dfλ0
λ 0 y = d f ( λ 0 )yλ0y=df(λ0)λ1<λ0df(λ1)>yλ1,λ2,λ0\
ผล 1 (ข) : นอกจากนี้ถ้าเราจะเริ่มต้นด้วยแล้วครั้งแรกขั้นตอนที่จะให้ผลผลิตมาจากไหนมัน monotonically จะเพิ่มขึ้นเป็นวิธีการแก้ปัญหาโดยผลก่อนหน้านี้ (ดูข้อแม้ ด้านล่าง) ความจริงสุดท้ายนี้ตามมาเพราะถ้าเราเริ่มทางด้านขวาของรูตอนุพันธ์ก็คือ "เกินไป" ที่ตื้นเนื่องจากความนูนของดังนั้นขั้นตอนแรกของนิวตันจะพาเราไปทางซ้ายของรูต NBเนื่องจากไม่ได้เป็นแบบทั่วไปสำหรับการลบλ1>λ0λ2λ0dfdfλนี่เป็นเหตุผลที่ดีที่จะเริ่มจากด้านซ้ายของรูตที่ต้องการ มิฉะนั้นเราจะต้องตรวจสอบว่าขั้นตอนของนิวตันยังไม่ได้ส่งผลให้ค่าลบสำหรับรากโดยประมาณซึ่งอาจวางเราที่ไหนสักแห่งในส่วนของ nonconvex \ ผลที่ตามมา 1 (c) : เมื่อเราเจอรูทของและจากนั้นค้นหารูทจากโดยใช้เพื่อให้เป็นการเดาเริ่มต้นของเรา ด้านซ้ายของรูตที่สอง ดังนั้นการบรรจบกันของเรารับประกันว่าจะเป็นแบบโมโนโทนิกจากที่นั่นdf
y1y2<y1λ1df(λ1)=y1

คุณสมบัติ 2 : มีขอบเขตที่สมเหตุสมผลเพื่อให้จุดเริ่มต้น "ปลอดภัย" การใช้ข้อโต้แย้งนูนและความไม่เท่าเทียมของเซ่นเรามีขอบเขต ผลที่ตามมา 2 : สิ่งนี้บอกเราว่ารูททำให้พอใจเชื่อฟัง ดังนั้นขึ้นไปอย่างต่อเนื่องร่วมกันเราได้แซนวิชรากในระหว่างวิธีการประสานและการคำนวณของ 2λ 0 d f ( λ 0 ) = y 1

p1+λpdi2df(λ)pidi2idi2+pλ.
λ0df(λ0)=y
()11pidi2(pyy)λ0(1pidi2)(pyy).
di2

นี้อนุมานว่าสำหรับทุกฉันถ้ากรณีนี้ไม่ได้แล้วที่ถูกผูกไว้เดียวกันถือโดยพิจารณาเพียงบวกและแทนที่จากจำนวนบวกd_iหมายเหตุ : ตั้งแต่สมมติว่า , จากนั้น , ดังนั้นขอบเขตจึงไม่จำเป็นเสมอ (เช่น, ขอบล่างจะไม่เป็นค่าลบเสมอ)di>0idipdidf(0)=pdi>0y(0,p]

นี่คือพล็อตเป็นตัวอย่างที่ "ปกติ" ของกับ400 เราวางตารางขนาด 10 สำหรับองศาอิสระ นี่คือเส้นแนวนอนในเนื้อเรื่อง เส้นสีเขียวแนวตั้งตรงกับขอบเขตล่างในดาว)df(λ)p=400()

Example dof plot with grid and bounds

อัลกอริทึมและตัวอย่างรหัส R

อัลกอริทึมที่มีประสิทธิภาพมากได้รับตารางขององศาที่ต้องการของเสรีภาพในคือการจัดเรียงไว้ในลำดับที่ลดลงแล้วตามลำดับพบว่ารากของแต่ละคนโดยใช้รากก่อนหน้านี้เป็นจุดเริ่มต้นสำหรับต่อไปนี้ หนึ่งเราสามารถปรับแต่งเพิ่มเติมได้โดยตรวจสอบว่าแต่ละรูทนั้นมีค่ามากกว่าขอบเขตล่างสำหรับรูตถัดไปหรือไม่และถ้าไม่เราสามารถเริ่มต้นการทำซ้ำครั้งถัดไปที่ขอบเขตล่างแทนy1,yn(0,p]

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

# Newton's step for finding solutions to regularization dof.

dof <- function(lambda, d) { sum(1/(1+lambda / (d[d>0])^2)) }
dof.prime <- function(lambda, d) { -sum(1/(d[d>0]+lambda / d[d>0])^2) }

newton.step <- function(lambda, y, d)
{ lambda - (dof(lambda,d)-y)/dof.prime(lambda,d) }

# Full Newton step; Finds the root of y = dof(lambda, d).
newton <- function(y, d, lambda = NA, tol=1e-10, smart.start=T)
{
    if( is.na(lambda) || smart.start )
        lambda <- max(ifelse(is.na(lambda),0,lambda), (sum(d>0)/y-1)/mean(1/(d[d>0])^2))
    iter <- 0
    yn   <- Inf
    while( abs(y-yn) > tol )
    {
        lambda <- max(0, newton.step(lambda, y, d)) # max = pedantically safe
        yn <- dof(lambda,d)
        iter = iter + 1
    }
    return(list(lambda=lambda, dof=y, iter=iter, err=abs(y-yn)))
}

ด้านล่างนี้เป็นอัลกอริธึมสุดท้ายที่สมบูรณ์ซึ่งใช้กริดของจุดและเวกเตอร์ของ ( ไม่ใช่ !)di di2

newton.grid <- function(ygrid, d, lambda=NA, tol=1e-10, smart.start=TRUE)
{
    p <- sum(d>0)
    if( any(d < 0) || all(d==0) || any(ygrid > p) 
        || any(ygrid <= 0) || (!is.na(lambda) && lambda < 0) )
        stop("Don't try to fool me. That's not nice. Give me valid inputs, please.")
    ygrid <- sort(ygrid, decreasing=TRUE)
    out    <- data.frame()
    lambda <- NA
    for(y in ygrid)
    {
        out <- rbind(out, newton(y,d,lambda, smart.start=smart.start))
        lambda <- out$lambda[nrow(out)]
    }
    out
}

ฟังก์ชั่นการโทรตัวอย่าง

set.seed(17)
p <- 100000
d <- sqrt(sort(exp(rexp(p, 10)),decr=T))
ygrid <- p*(1:100)/100
# Should take ten seconds or so.
out <- newton.grid(ygrid,d)

ให้ความเห็นชอบคำถามดังนั้นฉันสามารถอ้างถึงคำตอบนี้ได้ ขอบคุณสำหรับการโพสต์การวิเคราะห์รายละเอียดนี้สำคัญ
แมโคร

คำตอบที่น่าทึ่ง :-) ขอบคุณมากสำหรับคำแนะนำและคำตอบ
Néstor

1

นอกจากนี้ยังมีวิธีการสองสามวิธีที่จะคำนวณเส้นทางการทำให้เป็นมาตรฐานที่สมบูรณ์ได้อย่างมีประสิทธิภาพ:

  1. จีพีเอส
  2. glmnet
  3. gcdnet

ข้างต้นเป็นแพ็คเกจ R ทั้งหมดในขณะที่คุณใช้งาน Python scikit-learn จะมี implementations สำหรับ ridge, lasso และ elastic net


1
olsฟังก์ชั่นใน R rmsแพคเกจสามารถใช้การเพิ่มประสิทธิภาพการคำนวณเพื่อหาบทลงโทษที่เหมาะสมโดยใช้ที่มีประสิทธิภาพ AIC แต่คุณต้องให้โทษสูงสุดซึ่งไม่ใช่เรื่องง่ายเสมอไป
Frank Harrell

0

ทางเลือกที่เป็นไปได้ตามแหล่งที่มาด้านล่างน่าจะเป็น:

โซลูชันรูปแบบปิด: df(λ)=tr(X(XX+λIp)1X)

คุณควรจะใช้สมปกติแก้หรือการคำนวณประมาณการความแปรปรวนความแปรปรวนที่คุณควรมีอยู่แล้วคำนวณ 1 วิธีการนี้จะทำงานได้ดีที่สุดถ้าคุณกำลังประเมินค่าสัมประสิทธิ์ที่ต่างๆλ(XX+λIp)1λ

ที่มา: https://onlinecourses.science.psu.edu/stat857/node/155

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