강 문제 에서 를 키우니 분산이 에서 로 줄었습니다. 벌점이 분산을 줄인다는 것은 확인했습니다.
계수를 누르는 방법은 하나가 아닙니다. 제곱의 합으로 누르느냐 절댓값의 합으로 누르느냐에 따라 해가 질적으로 달라집니다.
한쪽은 계수를 조금씩 줄이기만 하고, 다른 쪽은 일부를 정확히 으로 만듭니다. 그 차이가 어디서 오는지, 그리고 그 차이가 언제 이득이 되는지를 봅니다.
문제. 릿지와 라소의 차이를 봅니다.
() 둘의 성질을 정리하세요.
() 변수 하나짜리 문제에서 해를 직접 구하세요.
() 왜 그 차이가 나는지 미분으로 설명하세요.
생각의 실마리. 벌점이 목적함수에 더해지면 근처에서 벌점이 얼마나 센가가 해를 정합니다. 제곱은 근처에서 평평하고 절댓값은 에서 꺾입니다.
풀이. () 정리합니다.
| 무엇 | 벌점 | 해의 성질 | 어디서 왔나 |
|---|---|---|---|
| 릿지 | 계수 제곱의 합 | 모두 조금씩 줄어듦 | 정규 사전분포 |
| 라소 | 계수 절댓값의 합 | 일부가 정확히 | 라플라스 사전분포 |
| 엘라스틱넷 | 둘을 섞음 | 묶인 변수를 함께 남김 | 둘의 곱 |
| 없음 | 최소제곱 | 균등 사전분포 |
강 문제 에서 벌점과 사전분포의 이 대응을 수치로 확인했습니다. 정규화는 베이즈의 사전분포를 다른 말로 적은 것입니다.
() 변수 하나짜리 문제를 풉니다. 최소제곱 해가 이고 설계가 표준화되어 있으면 두 해가 닫힌 꼴로 나옵니다.
로 재면 이렇습니다.
| 최소제곱 해 | 릿지 해 | 라소 해 | 라소가 인가 |
|---|---|---|---|
| 아니오 | |||
| 예 | |||
| 예 | |||
| 예 | |||
| 아니오 |
릿지는 언제나 같은 비율로 줄입니다. 이 이 되고 이 이 되는데 둘 다 배입니다. 아무리 줄여도 에는 못 갑니다.
라소는 만큼 빼고 에서 멈춥니다. 이 이 되는 것은 를 뺀 것이고, 은 보다 작으므로 **정확히 **이 됩니다. 이 연산을 연성 문턱(soft threshold)이라 합니다.
() 왜 그런지 미분으로 봅니다.
| 벌점 | 에서의 기울기 | 무엇을 뜻하나 |
|---|---|---|
| 계수 제곱 | 을 특별히 여기지 않음 | |
| 절댓값 | 왼쪽 오른쪽 | 에서 꺾여 붙잡음 |
의 미분은 이므로 가 으로 가면 당기는 힘도 으로 사라집니다. 의 미분은 부호뿐이라 가 아무리 작아져도 힘이 그대로입니다.
| 계수의 크기 | 제곱 벌점의 기울기 | 절댓값 벌점의 기울기 | 어느 쪽이 센가 |
|---|---|---|---|
| 제곱 | |||
| 절댓값 | |||
| 절댓값 | |||
| 절댓값 |
계수가 작아질수록 절댓값 벌점이 상대적으로 훨씬 세집니다. 에서 절댓값 벌점의 힘은 제곱 벌점의 배입니다. 그 힘이 계수를 까지 밀어붙입니다.
이 문제에서 배우는 것. 두 벌점의 차이는 에서 미분 가능한가라는 한 가지에서 나옵니다. 제곱은 에서 매끄러워 당기는 힘이 사라지고, 절댓값은 에서 꺾여 힘이 남습니다. 꺾인 자리가 해를 붙잡습니다.
확인 1-1. 릿지와 라소의 해의 성질을 각각 한 마디로 쓰세요.
답. 모두 조금씩 줄어드는 것과 일부가 정확히 이 되는 것입니다.
확인 1-2. 검산에서 최소제곱 해 의 릿지 해와 라소 해를 쓰세요.
답. 과 입니다.
확인 1-3. 검산에서 계수 크기 일 때 두 벌점의 기울기를 쓰세요.
답. 과 입니다.
문제. 실제 문제에서 둘을 견줍니다.
() 참 계수가 드문 경우를 재세요.
() 참 계수가 조밀한 경우를 재세요.
() 변수끼리 닮았을 때를 보세요.
생각의 실마리. 벌점은 가정입니다. 라소는 "참 계수 대부분이 이다"라고 가정하고, 릿지는 "참 계수가 다 작다"라고 가정합니다. 가정이 맞으면 이깁니다.
풀이. () 드문 경우를 잽니다. 표본 에 변수 이고 참으로 이 아닌 계수는 개입니다.
| 방법 | 이 아닌 계수 수 | 참 계수를 몇 개 찾나 | 검증 오차 | 계수 오차 |
|---|---|---|---|---|
| 최소제곱 | ||||
| 릿지 | ||||
| 릿지 | ||||
| 라소 | ||||
| 라소 |
검증 오차가 릿지의 에서 라소의 으로 떨어집니다. 스물아홉 배 차이입니다. "참 계수를 몇 개 찾나" 열에서 릿지가 인 것은 릿지가 잘해서가 아니라 개를 전부 살려 두므로 자동으로 다 포함되기 때문입니다. 이 열은 이 아닌 계수 수와 함께 읽어야 합니다.
다만 라소도 참 변수 개 중 개만 찾습니다. 놓친 둘을 봅니다.
| 무엇 | 참 계수의 절댓값 |
|---|---|
| 놓친 변수 | 과 |
| 찾은 변수 중 가장 작은 둘 | 와 |
참 계수가 잡음 에 묻힐 만큼 작으면 라소도 못 꺼냅니다. 놓친 둘은 과 로 잡음의 퍼센트도 안 됩니다. 이것은 라소의 결함이 아니라 자료에 그 정보가 없다는 사실입니다.
() 조밀한 경우를 잽니다. 이번에는 개 계수가 모두 이 아닙니다.
| 방법 | 이 아닌 계수 수 | 검증 오차 | 계수 오차 |
|---|---|---|---|
| 릿지 | |||
| 릿지 | |||
| 라소 | |||
| 라소 |
이번에는 릿지가 낫습니다. 으로 만들 계수가 없는데 개 중 개를 으로 만들었으니 그만큼 손해입니다.
어느 쪽이 좋은지는 참 구조가 정하고, 참 구조는 미리 알 수 없습니다. 그래서 강의 교차검증으로 자료에게 물어봅니다.
() 변수끼리 닮았을 때를 봅니다. 앞의 세 변수가 서로 거의 같고 셋 다 참 계수가 입니다.
| 방법 | 앞 세 계수 | 합 | 인 개수 |
|---|---|---|---|
| 최소제곱 | , , | ||
| 릿지 | , , | ||
| 라소 | , , | ||
| 엘라스틱넷 | , , |
최소제곱은 부호까지 뒤집힌 값을 냅니다. 참 계수가 셋 다 인데 둘째가 입니다. 강 문제 에서 본 공선성의 무너짐이 그대로 나왔습니다.
릿지는 셋에 거의 똑같이 나눠 줍니다. , , 입니다.
라소는 셋 중 하나를 으로 죽이고 남은 둘에 불균등하게 얹습니다. 과 과 입니다. 셋이 거의 같은 변수인데 어느 것을 죽일지는 잡음이 정합니다.
엘라스틱넷은 릿지처럼 고르게 나누면서 잡음 변수 개는 으로 만듭니다. 두 성질을 함께 가집니다.
셋의 합은 넷 다 근처로 비슷합니다. 강 문제 에서 자료가 아는 것이 개별 계수가 아니라 합뿐이라고 한 자리가 여기입니다. 어디에 두느냐만 방법이 정합니다.
이 문제에서 배우는 것. 벌점을 고르는 것은 참 구조에 대한 가정을 고르는 것입니다. 드물면 라소, 조밀하면 릿지, 묶여 있으면 엘라스틱넷입니다. 그리고 자료가 못 담은 정보는 어떤 벌점으로도 못 꺼냅니다.
확인 2-1. 검산에서 드문 문제의 릿지 과 라소 의 검증 오차를 쓰세요.
답. 과 입니다.
확인 2-2. 검산에서 라소가 놓친 두 참 계수의 절댓값을 쓰세요.
답. 과 입니다.
확인 2-3. 검산에서 닮은 변수 문제의 최소제곱 둘째 계수를 쓰세요.
답. 입니다.
문제. 왜 라소만 을 내는지 그림으로 봅니다.
() 제약 영역의 모양을 정리하세요.
() 축에 닿는 비율을 세세요.
() 직교 설계에서 닫힌 해를 유도하세요.
생각의 실마리. 벌점이 붙은 최소화는 제약 아래의 최소화와 같습니다. 잔차 등고선이 제약 영역과 처음 만나는 자리가 해이고, 영역의 모양이 만나는 자리를 정합니다.
풀이. () 모양을 정리합니다.
| 벌점 | 같은 값의 자취 | 왜 그 성질이 나오나 |
|---|---|---|
| 제곱의 합 | 원 또는 타원 | 모서리가 없어 축에 안 닿음 |
| 절댓값의 합 | 마름모 | 모서리가 축 위에 있음 |
| 둘을 섞음 | 모서리가 둥근 마름모 | 축에 닿되 덜 급함 |
마름모는 모서리에서 만나기 쉽고 그 모서리가 축 위입니다. 축 위라는 말은 나머지 좌표가 이라는 뜻입니다. 원은 모서리가 없어 아무 데서나 만나므로 좌표가 정확히 일 확률이 입니다.
() 축에 닿는 비율을 셉니다. 두 변수 문제에서 최소제곱 해를 여러 방향으로 번 두고 셉니다.
| 한 계수가 인 비율 | 둘 다 인 비율 | 릿지가 인 비율 | |
|---|---|---|---|
라소는 가 커질수록 축에 닿는 비율이 늘어납니다. 에서는 절반이 넘는 이 아예 둘 다 입니다. "한 계수가 "이 의 을 정점으로 다시 줄어드는 것은 둘 다 인 쪽으로 넘어갔기 때문입니다.
릿지는 어떤 에서도 이 안 됩니다. 네 줄 모두 입니다.
() 직교 설계에서 닫힌 해를 유도합니다. 설계행렬의 열이 서로 직교하면 변수끼리 얽히지 않아 변수마다 따로 풀립니다.
으로 확인합니다.
| 최소제곱 | 릿지 공식 | 릿지 실제 | 라소 공식 | 라소 실제 |
|---|---|---|---|---|
공식과 실제가 소수점 여섯 자리까지 맞습니다. 릿지는 나누고 라소는 뺍니다. 참 계수가 인 두 변수뿐 아니라 참 계수 짜리 변수도 최소제곱 추정 이 보다 작아 이 됐습니다.
직교가 아니면 이 공식이 안 맞습니다. 변수끼리 얽히면 한 계수를 바꿀 때 다른 계수의 최적값도 바뀌기 때문입니다. 그래도 성질은 그대로입니다. 하나는 줄이고 하나는 으로 만듭니다.
이 문제에서 배우는 것. 라소가 을 내는 것은 알고리즘의 우연이 아니라 제약 영역의 기하입니다. 마름모의 모서리가 축 위에 있고, 볼록 영역의 접점은 모서리에 걸리기 쉽습니다. 직교 설계에서는 그 기하가 한 줄 공식으로 적힙니다.
확인 3-1. 라소와 릿지의 제약 영역 모양을 쓰세요.
답. 마름모와 원 또는 타원입니다.
확인 3-2. 검산에서 일 때 둘 다 인 비율을 쓰세요.
답. 입니다.
확인 3-3. 검산에서 최소제곱 의 릿지 해와 라소 해를 쓰세요.
답. 와 입니다.
문제. 를 바꿔 가며 해가 어떻게 움직이는지 봅니다.
() 라소의 경로를 재세요.
() 릿지의 경로를 재세요.
() 특이값으로 릿지가 하는 일을 읽으세요.
생각의 실마리. 는 하나의 값이 아니라 손잡이입니다. 손잡이를 돌리면 해가 연속적으로 움직이고, 그 궤적을 정규화 경로라 합니다.
풀이. () 라소의 경로를 잽니다. 문제 의 드문 문제를 씁니다.
| 이 아닌 계수 수 | 검증 오차 | 참 변수 중 찾은 수 | |
|---|---|---|---|
를 줄이면 계수가 하나씩 들어옵니다. 개에서 개, 개, 개, 개로 늘어납니다.
너무 줄이면 잡음 변수까지 들어와 검증 오차가 다시 오릅니다. 에서 로 올라갑니다.
여기서 눈여겨볼 것이 있습니다. 검증 오차가 가장 낮은 은 계수 개를 살렸는데 그중 참 변수는 개뿐입니다. 잡음 변수 개를 함께 안고 있습니다. 참 변수만 남기는 자리는 인데 그때 검증 오차는 로 더 나쁩니다.
가장 잘 맞히는 자리와 변수를 골라 내는 자리는 다릅니다. 예측이 목적이면 , 해석이 목적이면 입니다. 강 문제 의 변수 선택이 여기서 연속적인 손잡이가 됐습니다.
() 릿지의 경로를 잽니다.
| 계수의 크기 | 가장 큰 계수 | 검증 오차 | |
|---|---|---|---|
릿지는 계수가 연속적으로 줄어들 뿐 이 되지 않습니다. 계수의 크기가 에서 까지 매끄럽게 내려갑니다. 그래서 경로 그림이 매끄럽고, 라소는 계수가 들어오고 나가는 꺾인 자리가 있습니다.
() 특이값으로 릿지를 읽습니다. 강 심화 에서 본 대로 방향마다 배율이 다릅니다.
| 정규화한 특이값 | 최소제곱 배율 | 릿지 배율 | 몇 퍼센트 남나 |
|---|---|---|---|
특이값이 큰 방향은 거의 그대로 두고 작은 방향만 크게 줄입니다. 가장 큰 방향은 퍼센트가 남고 가장 작은 방향은 퍼센트만 남습니다.
정보가 적은 방향만 골라 누르는 것이 릿지가 하는 일입니다. 강 문제 의 공선성이 바로 이 작은 특이값이었고, 릿지는 그 방향에서만 크게 물러섭니다.
이 문제에서 배우는 것. 는 켜고 끄는 스위치가 아니라 연속 손잡이입니다. 라소에서는 변수가 들어오고 나가는 경로가 되고, 릿지에서는 특이값 방향마다 다른 배율이 됩니다. 그리고 최적의 는 목적에 따라 다릅니다.
확인 4-1. 검산에서 라소 의 이 아닌 계수 수와 검증 오차를 쓰세요.
답. 개와 입니다.
확인 4-2. 검산에서 릿지 과 의 계수 크기를 쓰세요.
답. 과 입니다.
확인 4-3. 검산에서 가장 작은 정규화 특이값의 릿지 배율이 몇 퍼센트 남는지 쓰세요.
답. 입니다.
문제. 정규화를 실제로 걸 때 확인할 것을 정리합니다.
() 점검 목록을 만드세요.
() 라소가 고른 변수가 얼마나 안정적인지 재세요.
() 정규화를 쓰지 말아야 할 때를 보세요.
생각의 실마리. 벌점은 계수의 크기에 걸립니다. 크기는 변수의 눈금에 딸리므로, 눈금을 안 맞추면 벌점이 불공평해집니다.
풀이. () 점검 목록을 만듭니다.
| 무엇 | 왜 |
|---|---|
| 변수를 표준화했는가 | 눈금이 다르면 벌점이 불공평 |
| 절편을 뺐는가 | 으로 당길 이유가 없음 |
| 를 어떻게 골랐는가 | 강 교차검증 |
| 참 구조가 드문가 | 라소인지 릿지인지 |
| 변수끼리 묶여 있는가 | 엘라스틱넷을 고려 |
둘째 줄이 자주 빠집니다. 절편은 의 평균 높이일 뿐 복잡도가 아니므로 벌점에서 빼야 합니다. 강 문제 에서 앞 두 줄을 수치로 확인했습니다.
() 라소가 고른 변수가 얼마나 안정적인지 잽니다. 같은 분포에서 표본만 번 바꿔 가며 어떤 변수가 뽑히는지 셉니다.
| 무엇 | 값 | 몇 개 중 |
|---|---|---|
| 참 변수의 평균 선택률 | ||
| 잡음 변수의 평균 선택률 | ||
| 번 다 뽑힌 변수 수 | ||
| 한 번도 안 뽑힌 변수 수 |
한 번도 안 뽑힌 변수가 개입니다. 개 전부가 번 중 적어도 한 번은 뽑혔습니다. 잡음 변수의 평균 선택률 는 매 회 잡음 개 중 개쯤이 딸려 들어온다는 뜻입니다.
참 변수도 매번 뽑히지는 않습니다. 평균이 인 것은 개가 매번 뽑히고 문제 에서 본 작은 계수 개가 거의 안 뽑히기 때문입니다.
강 문제 의 선택 후 추론 문제가 그대로 남아 있습니다. 자료로 변수를 고르고 같은 자료로 그 계수를 검정하면 유의성이 부풀려집니다.
여러 번 뽑아 자주 나오는 변수만 남기는 방법을 안정성 선택이라 합니다.
| 몇 번 이상 뽑히면 | 고른 변수 수 | 참 변수 중 | 잡음 중 |
|---|---|---|---|
문턱을 에서 로 올리는 것만으로 잡음 개가 전부 걸러집니다. 대신 참 변수도 개에서 개로 줄어듭니다. 걸러진 둘은 애초에 잡음에 묻힌 그 둘입니다.
() 정규화를 쓰지 말아야 할 때를 봅니다.
| 어떤 상황 | 왜 쓰면 안 되나 |
|---|---|
| 편향이 문제일 때 | 편향을 더 키움 |
| 계수를 해석해야 할 때 | 치우친 값이 됨 |
| 변수가 이미 적을 때 | 얻을 것이 적음 |
| 표본이 아주 많을 때 | 분산이 이미 작음 |
마지막 줄을 수치로 봅니다. 변수 개를 고정하고 표본만 늘립니다.
| 표본 크기 | 정규화 없이 | 가장 좋은 릿지 | 얼마나 좋아지나 |
|---|---|---|---|
표본 에서는 절반 가까이 좋아지지만 표본 에서는 얻는 것이 없습니다. 마지막 줄의 은 최적 가 사실상 이라는 뜻입니다.
강 문제 에서 자료를 늘리는 것이 분산을 공짜로 줄인다고 한 것과 같은 이야기입니다. 분산이 이미 작으면 편향을 주고 살 것이 없습니다.
이 문제에서 배우는 것. 정규화는 분산이 클 때만 이득입니다. 표본이 넉넉하면 얻을 것이 없고, 계수를 해석해야 하면 오히려 방해가 됩니다. 그리고 라소가 고른 변수 목록은 그 표본에서만 그렇다는 것을 안정성 선택으로 확인해야 합니다.
확인 5-1. 벌점을 걸기 전에 변수에 무엇을 해야 하는지 쓰세요.
답. 표준화해야 합니다.
확인 5-2. 검산에서 잡음 변수의 평균 선택률을 쓰세요.
답. 입니다.
확인 5-3. 검산에서 표본 와 일 때 정규화로 얼마나 좋아지는지 쓰세요.
답. 와 입니다.
| 유형 | 무엇을 묻나 | 어디를 보나 |
|---|---|---|
| 벌점 구분 | 릿지인지 라소인지 | 문제 |
| 연성 문턱 | 만큼 빼고 에서 멈춤 | 문제 , 문제 |
| 구조 판정 | 드문지 조밀한지 | 문제 |
| 공선성 | 셋에 어떻게 나누나 | 문제 |
| 기하 | 마름모의 모서리 | 문제 |
| 직교 닫힌 해 | 나누기와 빼기 | 문제 |
| 정규화 경로 | 가 무엇을 조절하나 | 문제 |
| 특이값 배율 | 작은 방향만 누름 | 문제 |
| 안정성 선택 | 표본이 바뀌면 목록도 바뀜 | 문제 |
| 쓰지 말아야 할 때 | 표본이 많으면 얻을 것 없음 | 문제 |
핵심 공식을 한자리에 모읍니다.
| 무엇 | 릿지 | 라소 |
|---|---|---|
| 이 되나 | 안 됨 | 됨 |
| 닫힌 해 | 있음 | 직교일 때만 |
| 닮은 변수 | 고르게 나눔 | 하나만 고름 |
| 유리한 경우 | 조밀한 참 계수 | 드문 참 계수 |
| 사전분포 | 정규 | 라플라스 |
문제 6. 릿지와 라소의 해의 성질을 각각 한 마디로 쓰세요.
답. 모두 조금씩 줄어드는 것과 일부가 정확히 이 되는 것입니다.
문제 7. 검산에서 최소제곱 해 의 릿지 해와 라소 해를 쓰세요.
답. 과 입니다.
문제 8. 검산에서 계수 크기 일 때 두 벌점의 기울기를 쓰세요.
답. 과 입니다.
문제 9. 검산에서 드문 문제의 릿지 과 라소 의 검증 오차를 쓰세요.
답. 과 입니다.
문제 10. 검산에서 라소가 놓친 두 참 계수의 절댓값을 쓰세요.
답. 과 입니다.
문제 11. 검산에서 닮은 변수 문제의 최소제곱 둘째 계수를 쓰세요.
답. 입니다.
문제 12. 검산에서 일 때 둘 다 인 비율을 쓰세요.
답. 입니다.
문제 13. 검산에서 최소제곱 의 릿지 해와 라소 해를 쓰세요.
답. 와 입니다.
문제 14. 검산에서 라소 의 이 아닌 계수 수와 검증 오차를 쓰세요.
답. 개와 입니다.
문제 15. 검산에서 릿지 과 의 계수 크기를 쓰세요.
답. 과 입니다.
문제 16. 검산에서 가장 작은 정규화 특이값의 릿지 배율이 몇 퍼센트 남는지 쓰세요.
답. 입니다.
문제 17. 검산에서 잡음 변수의 평균 선택률을 쓰세요.
답. 입니다.
문제 18. 검산에서 표본 와 일 때 정규화로 얼마나 좋아지는지 쓰세요.
답. 와 입니다.
심화 1. 라소에 닫힌 해가 없는 이유를 정리하세요.
는 에서 미분 가능하지 않으므로 기울기를 으로 두는 식을 세울 수 없습니다. 대신 열미분(subgradient) 조건을 씁니다.
| 무엇 | 릿지 | 라소 |
|---|---|---|
| 조건 | 등식 하나 | 경우가 나뉨 |
| 어떤 변수가 인가 | 없음 | 미리 모름 |
| 풀이 | 선형계 한 번 | 반복 또는 경로 알고리즘 |
어떤 변수가 이 될지 미리 모르는 것이 핵심입니다. 알면 그 변수를 빼고 최소제곱을 풀면 되지만, 그것을 알려면 먼저 풀어야 합니다. 직교 설계에서만 변수마다 따로 풀려 닫힌 해가 나옵니다.
심화 2. 근위 경사법이 왜 연성 문턱을 쓰는지 유도하세요.
매끄러운 부분은 경사를 밟고 꺾인 부분은 따로 처리합니다. 한 걸음이 이렇습니다.
이 문제는 좌표마다 분리되고 각 좌표의 답이 연성 문턱입니다.
| 단계 | 무엇 |
|---|---|
| 첫째 | 매끄러운 항만 보고 한 걸음 감 |
| 둘째 | 그 자리에서 벌점을 근위 연산으로 처리 |
| 셋째 | 좌표마다 분리되므로 한 줄 공식 |
검산의 soft 함수가 정확히 이 연산이고 lasso 함수가 이 두 단계를 반복합니다.
심화 3. 엘라스틱넷이 왜 묶인 변수를 함께 남기는지 설명하세요.
두 변수가 정확히 같으면 라소의 목적함수는 둘 사이 배분에 대해 평평합니다. 가 만 고정되면 부호가 같은 한 어디에 두든 같기 때문입니다. 그래서 해가 유일하지 않고 잡음이 배분을 정합니다.
제곱 항을 조금 섞으면 가 똑같이 나눌 때 최소가 되므로 평평함이 사라집니다.
| 무엇 | 배분에 대해 | 결과 |
|---|---|---|
| 만 | 평평 | 잡음이 정함 |
| 를 섞음 | 가운데가 최소 | 고르게 나눔 |
검산의 닮은 변수 표에서 라소가 과 과 을 낸 반면 엘라스틱넷이 과 와 을 낸 것이 이것입니다.
심화 4. 릿지가 왜 언제나 풀리는지 설명하세요.
의 고유값이 모두 이상이므로 의 고유값은 모두 이상입니다.
| 무엇이 보장되나 | |
|---|---|
| 열이 종속이면 특이 | |
| 언제나 가역이고 조건수가 유한 |
강 문제 에서 잔차 인 해가 무한히 많던 문제가 이면 유일해집니다. 변수가 표본보다 많아도 답이 하나로 정해집니다. 그 답을 정하는 것은 자료가 아니라 **우리가 넣은 **입니다.
심화 5. 라소의 편향을 줄이는 방법을 정리하세요.
라소는 살아남은 계수도 만큼 깎으므로 큰 계수까지 치우칩니다.
| 방법 | 무엇을 하나 | 무엇을 잃나 |
|---|---|---|
| 완화 라소 | 고른 변수로 최소제곱 다시 | 선택 후 추론 문제 |
| 적응 라소 | 계수마다 다른 | 초기 추정이 필요 |
| SCAD와 MCP | 큰 계수는 안 깎는 벌점 | 볼록성을 잃음 |
셋 다 같은 값을 씁니다. 변수 선택은 라소에 맡기고 크기 추정은 벌점 없이 하자는 것입니다. 다만 같은 자료로 고르고 같은 자료로 재는 강 문제 의 함정이 그대로 남습니다.
심화 6. 벌점과 제약이 같은 문제인 이유를 설명하세요.
강의 라그랑주 승수가 이 둘을 잇습니다. 가 곧 승수이고, 각 에 대응하는 가 하나 있습니다.
| 관점 | 손잡이 | 무엇이 직관적인가 |
|---|---|---|
| 벌점 | 계산하기 쉬움 | |
| 제약 | 기하로 보기 쉬움 |
문제 의 마름모 그림은 제약 관점이고 검산의 반복 계산은 벌점 관점입니다. 같은 해를 두 각도에서 본 것입니다. 대응이 단조라서 를 키우면 가 줄어듭니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 릿지 | ridge | 계수 제곱의 합을 벌점으로 씁니다 |
| 라소 | lasso | 계수 절댓값의 합을 벌점으로 씁니다 |
| 엘라스틱넷 | elastic net | 두 벌점을 섞어 씁니다 |
| 연성 문턱 | soft threshold | 문턱만큼 빼고 에서 멈춥니다 |
| 열미분 | subgradient | 꺾인 자리에서의 기울기 집합입니다 |
| 근위 경사법 | proximal gradient | 매끄러운 항과 꺾인 항을 나눠 처리합니다 |
| 정규화 경로 | regularization path | 에 따른 해의 궤적입니다 |
| 안정성 선택 | stability selection | 여러 표본에서 자주 뽑힌 변수만 남깁니다 |
| 완화 라소 | relaxed lasso | 고른 변수로 최소제곱을 다시 풉니다 |
| 축소 | shrinkage | 계수를 쪽으로 당깁니다 |
다음은 212강 교차검증과 추정의 분산입니다. 이 강의가 라는 손잡이를 만들었습니다. 다음 강의는 그 손잡이를 어디에 둘지 자료에게 묻는 법을 봅니다.
import numpy as np
rng = np.random.default_rng(20261018)
def pw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return str(s) + " " * max(k, 0)
def rw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return " " * max(k, 0) + str(s)
def soft(z, t):
return np.sign(z) * np.maximum(np.abs(z) - t, 0.0)
def lasso(X, y, lam, steps=6000, lr=None):
n, p = X.shape
if lr is None:
lr = 1.0 / (np.linalg.norm(X, 2) ** 2 / n)
w = np.zeros(p)
for _ in range(steps):
g = X.T @ (X @ w - y) / n
w = soft(w - lr * g, lr * lam)
return w
def enet(X, y, lam, alpha, steps=6000):
n, p = X.shape
lr = 1.0 / (np.linalg.norm(X, 2) ** 2 / n + lam * (1 - alpha))
w = np.zeros(p)
for _ in range(steps):
g = X.T @ (X @ w - y) / n + lam * (1 - alpha) * w
w = soft(w - lr * g, lr * lam * alpha)
return w
def ridge(X, y, lam):
p = X.shape[1]
return np.linalg.solve(X.T @ X / len(y) + lam * np.eye(p),
X.T @ y / len(y))
# --- 문제 1: 두 벌점이 무엇을 다르게 하는가 -----------------------------
print(" 210강 문제 3 에서 lambda 를 키우면 분산이 준다고 했습니다")
print(" 이제 벌점의 모양이 무엇을 바꾸는지 봅니다")
print(" %s %s %s %s"
% (pw("무엇", 14), rw("벌점", 20), rw("해의 성질", 22),
rw("어디서 왔나", 18)))
for a, b, c, d in [("릿지", "계수 제곱의 합", "모두 조금씩 줄어듦", "정규 사전분포"),
("라소", "계수 절댓값의 합", "일부가 정확히 0", "라플라스 사전분포"),
("엘라스틱넷", "둘을 섞음", "묶인 변수를 함께 남김", "둘의 곱"),
("없음", "0", "최소제곱", "균등 사전분포")]:
print(" %s %s %s %s" % (pw(a, 14), rw(b, 20), rw(c, 22), rw(d, 18)))
print(" 206강 문제 4 에서 이 대응을 수치로 확인했습니다")
print(" 변수 하나짜리 문제에서 해를 직접 봅니다")
print(" 최소제곱 해가 b 일 때 두 벌점의 해가 어떻게 되는지 봅니다")
print(" %s %s %s %s"
% (pw("최소제곱 해", 14), rw("릿지 해", 16), rw("라소 해", 16),
rw("라소가 0 인가", 18)))
lam1 = 0.5
for b in [-2.0, -0.3, 0.0, 0.3, 2.0]:
r = b / (1.0 + lam1)
l = float(soft(np.array([b]), lam1)[0])
if abs(l) < 1e-12:
l = 0.0
print(" %s %16.6f %16.6f %s"
% (pw("%.1f" % b, 14), r, l,
rw("예" if abs(l) < 1e-12 else "아니오", 18)))
print(" 릿지는 언제나 같은 비율로 줄입니다. 0 이 되지는 않습니다")
print(" 라소는 lambda 만큼 빼고 0 에서 멈춥니다. 이것을 연성 문턱이라 합니다")
print(" 절댓값이 lambda 보다 작으면 정확히 0 이 됩니다")
print(" 왜 그런지 미분으로 봅니다")
print(" %s %s %s"
% (pw("벌점", 16), rw("0 에서의 기울기", 22), rw("무엇을 뜻하나", 26)))
for a, b, c in [("계수 제곱", "0", "0 을 특별히 여기지 않음"),
("절댓값", "왼쪽 -1 오른쪽 +1", "0 에서 꺾여 붙잡음")]:
print(" %s %s %s" % (pw(a, 16), rw(b, 22), rw(c, 26)))
print(" 제곱은 0 근처에서 평평해 당기는 힘이 사라집니다")
print(" 절댓값은 0 에서도 힘이 그대로라 0 으로 밀어붙입니다")
print(" %s %s %s %s"
% (pw("계수의 크기", 14), rw("제곱 벌점의 기울기", 22),
rw("절댓값 벌점의 기울기", 24), rw("어느 쪽이 센가", 18)))
for w in [1.0, 0.1, 0.01, 0.001]:
g2 = 2.0 * w
g1 = 1.0
print(" %s %22.6f %24.6f %s"
% (pw("%.3f" % w, 14), g2, g1,
rw("절댓값" if g1 > g2 else "제곱", 18)))
print(" 계수가 작아질수록 절댓값 벌점이 상대적으로 훨씬 세집니다")
# --- 문제 2: 실제 문제에서 견줍니다 -------------------------------------
print(" 변수가 많고 참 계수가 드문 문제에서 둘을 견줍니다")
n2, p2 = 80, 200
k_true = 8
Xs = rng.normal(0, 1, (n2, p2))
w_true = np.zeros(p2)
idx_true = rng.choice(p2, k_true, replace=False)
w_true[idx_true] = rng.normal(0, 1.0, k_true) * 2.0
y2 = Xs @ w_true + rng.normal(0, 0.5, n2)
Xt = rng.normal(0, 1, (4000, p2))
yt = Xt @ w_true + rng.normal(0, 0.5, 4000)
print(" 표본 80 에 변수 200 이고 참으로 0 이 아닌 계수는 8 개입니다")
print(" %s %s %s %s %s"
% (pw("방법", 20), rw("0 이 아닌 계수 수", 20), rw("참 계수를 몇 개 찾나", 22),
rw("검증 오차", 14), rw("계수 오차", 14)))
rows = []
for nm, w in [("최소제곱", np.linalg.pinv(Xs) @ y2),
("릿지 lambda 0.01", ridge(Xs, y2, 0.01)),
("릿지 lambda 0.5", ridge(Xs, y2, 0.5)),
("라소 lambda 0.05", lasso(Xs, y2, 0.05)),
("라소 lambda 0.5", lasso(Xs, y2, 0.5))]:
nz = int((np.abs(w) > 1e-8).sum())
hit = int(((np.abs(w) > 1e-8) & (w_true != 0)).sum())
te = float(np.mean((yt - Xt @ w) ** 2))
ce = float(np.linalg.norm(w - w_true))
rows.append((nm, nz, hit, te, ce))
print(" %s %20d %22d %14.6f %14.6f"
% (pw(nm, 20), nz, hit, te, ce))
print(" 릿지는 200 개 계수를 다 살려 둡니다. 하나도 0 이 안 됩니다")
print(" 검증 오차가 릿지의 10.93 에서 라소의 0.3753 으로 떨어집니다")
print(" 참 계수가 드문 문제에서는 라소가 확실히 낫습니다")
wl = lasso(Xs, y2, 0.05)
miss = np.sort(np.abs(w_true[(w_true != 0) & (np.abs(wl) <= 1e-8)]))
hitm = np.sort(np.abs(w_true[(w_true != 0) & (np.abs(wl) > 1e-8)]))
print(" 다만 참 변수 8 개 중 6 개만 찾습니다. 놓친 둘을 봅니다")
print(" %s %s" % (pw("무엇", 22), rw("참 계수의 절댓값", 24)))
print(" %s %s" % (pw("놓친 변수", 22),
rw(" ".join("%.4f" % v for v in miss), 24)))
print(" %s %s" % (pw("찾은 변수 중 가장 작은 둘", 22),
rw(" ".join("%.4f" % v for v in hitm[:2]), 24)))
print(" 참 계수가 잡음 0.5 에 묻힐 만큼 작으면 라소도 못 꺼냅니다")
print(" 반대로 참 계수가 고르게 퍼져 있으면 어떤지 봅니다")
w_dense = rng.normal(0, 0.3, p2)
y3 = Xs @ w_dense + rng.normal(0, 0.5, n2)
yt3 = Xt @ w_dense + rng.normal(0, 0.5, 4000)
print(" 이번에는 200 개 계수가 모두 0 이 아닙니다")
print(" %s %s %s %s"
% (pw("방법", 20), rw("0 이 아닌 계수 수", 20), rw("검증 오차", 16),
rw("계수 오차", 14)))
for nm, w in [("릿지 lambda 0.1", ridge(Xs, y3, 0.1)),
("릿지 lambda 1.0", ridge(Xs, y3, 1.0)),
("라소 lambda 0.05", lasso(Xs, y3, 0.05)),
("라소 lambda 0.5", lasso(Xs, y3, 0.5))]:
nz = int((np.abs(w) > 1e-8).sum())
print(" %s %20d %16.6f %14.6f"
% (pw(nm, 20), nz, float(np.mean((yt3 - Xt @ w) ** 2)),
float(np.linalg.norm(w - w_dense))))
print(" 이번에는 릿지가 낫습니다. 0 으로 만들 계수가 없기 때문입니다")
print(" 어느 쪽이 좋은지는 참 구조가 정합니다. 미리 알 수 없습니다")
print(" 그래서 212강의 교차검증으로 자료에게 물어봅니다")
print(" 변수끼리 닮았을 때를 봅니다")
n4 = 100
z = rng.normal(0, 1, n4)
X4 = np.stack([z + rng.normal(0, 0.01, n4) for _ in range(3)]
+ [rng.normal(0, 1, n4) for _ in range(5)], axis=1)
w4 = np.zeros(8)
w4[:3] = 1.0
y4 = X4 @ w4 + rng.normal(0, 0.3, n4)
print(" 앞의 세 변수가 서로 거의 같고 셋 다 참 계수가 1.0 입니다")
print(" %s %s %s %s"
% (pw("방법", 22), rw("앞 세 계수", 34), rw("합", 12), rw("0 인 개수", 14)))
for nm, w in [("최소제곱", np.linalg.pinv(X4) @ y4),
("릿지 lambda 0.1", ridge(X4, y4, 0.1)),
("라소 lambda 0.1", lasso(X4, y4, 0.1)),
("엘라스틱넷 alpha 0.5", enet(X4, y4, 0.2, 0.5))]:
print(" %s %s %12.4f %14d"
% (pw(nm, 22),
rw(" ".join("%.4f" % v for v in w[:3]), 34),
float(w[:3].sum()),
int((np.abs(w) < 1e-8).sum())))
print(" 릿지는 셋에 거의 똑같이 나눠 줍니다")
print(" 라소는 셋 중 하나를 0 으로 죽이고 남은 둘에 불균등하게 얹습니다")
print(" 최소제곱은 부호까지 뒤집힌 값을 냅니다. 187강 문제 2 의 무너짐입니다")
print(" 셋의 합은 넷 다 2.8 근처로 비슷합니다. 어디에 두느냐만 다릅니다")
print(" 엘라스틱넷은 릿지처럼 고르게 나누면서 잡음 변수는 0 으로 만듭니다")
print(" 187강 문제 2 에서 자료가 아는 것이 합뿐이라고 한 자리입니다")
# --- 문제 3: 기하로 읽습니다 --------------------------------------------
print(" 두 벌점의 모양이 왜 다른 답을 내는지 기하로 봅니다")
print(" %s %s %s"
% (pw("벌점", 14), rw("같은 값의 자취", 22), rw("왜 그 성질이 나오나", 28)))
for a, b, c in [("제곱의 합", "원 또는 타원", "모서리가 없어 축에 안 닿음"),
("절댓값의 합", "마름모", "모서리가 축 위에 있음"),
("둘을 섞음", "모서리가 둥근 마름모", "축에 닿되 덜 급함")]:
print(" %s %s %s" % (pw(a, 14), rw(b, 22), rw(c, 28)))
print(" 제약 영역과 잔차 등고선이 처음 만나는 자리가 해입니다")
print(" 마름모는 모서리에서 만나기 쉽고 그 모서리가 축 위입니다")
print(" 두 변수 문제에서 해가 어디에 닿는지 셉니다")
print(" 최소제곱 해를 여러 방향으로 두고 라소 해가 축에 닿는 비율을 봅니다")
print(" %s %s %s %s"
% (pw("lambda", 12), rw("한 계수가 0 인 비율", 22),
rw("둘 다 0 인 비율", 20), rw("릿지가 0 인 비율", 20)))
T = 20000
ang = rng.uniform(0, 2 * np.pi, T)
rad = rng.uniform(0.2, 2.0, T)
B = np.stack([rad * np.cos(ang), rad * np.sin(ang)], axis=1)
for lam in [0.1, 0.3, 0.6, 1.0]:
L = soft(B, lam)
one = float(np.mean((np.abs(L) < 1e-12).sum(axis=1) == 1))
both = float(np.mean((np.abs(L) < 1e-12).sum(axis=1) == 2))
R = B / (1.0 + lam)
rz = float(np.mean((np.abs(R) < 1e-12).any(axis=1)))
print(" %s %22.6f %20.6f %20.6f"
% (pw("%.1f" % lam, 12), one, both, rz))
print(" 라소는 lambda 가 커질수록 축에 닿는 비율이 늘어납니다")
print(" 릿지는 어떤 lambda 에서도 0 이 안 됩니다")
print(" 마름모의 모서리가 축 위에 있다는 사실이 이 표를 만듭니다")
print(" 직교 설계에서는 닫힌 해가 있습니다")
n5 = 200
Q, _ = np.linalg.qr(rng.normal(0, 1, (n5, 6)))
X5 = Q * np.sqrt(n5)
w5 = np.array([2.0, 1.0, 0.4, 0.15, 0.0, 0.0])
y5 = X5 @ w5 + rng.normal(0, 0.3, n5)
b_ols = X5.T @ y5 / n5
print(" 설계행렬의 열이 서로 직교하면 변수마다 따로 풀립니다")
print(" %s %s %s %s %s"
% (pw("최소제곱", 14), rw("릿지 공식", 16), rw("릿지 실제", 16),
rw("라소 공식", 16), rw("라소 실제", 16)))
lam5 = 0.3
w_r5 = ridge(X5, y5, lam5)
w_l5 = lasso(X5, y5, lam5, steps=20000)
for i in range(6):
vs = [b_ols[i] / (1.0 + lam5), w_r5[i],
float(soft(np.array([b_ols[i]]), lam5)[0]), w_l5[i]]
vs = [v if abs(v) > 1e-12 else 0.0 for v in vs]
print(" %s %16.6f %16.6f %16.6f %16.6f"
% (pw("%.4f" % b_ols[i], 14), vs[0], vs[1], vs[2], vs[3]))
print(" 공식과 실제가 맞습니다. 릿지는 나누고 라소는 뺍니다")
print(" 직교가 아니면 이 공식이 안 맞습니다. 변수끼리 얽히기 때문입니다")
print(" 그래도 성질은 그대로입니다. 하나는 줄이고 하나는 0 으로 만듭니다")
# --- 문제 4: 정규화 경로 -------------------------------------------------
print(" lambda 를 바꿔 가며 계수가 어떻게 움직이는지 봅니다")
print(" 라소는 계수가 하나씩 들어옵니다")
lams = np.geomspace(1.0, 0.005, 40)
print(" %s %s %s %s"
% (pw("lambda", 12), rw("0 이 아닌 계수 수", 20), rw("검증 오차", 16),
rw("참 변수 중 찾은 수", 22)))
for lam in [1.0, 0.5, 0.2, 0.1, 0.05, 0.02]:
w = lasso(Xs, y2, lam)
nz = int((np.abs(w) > 1e-8).sum())
hit = int(((np.abs(w) > 1e-8) & (w_true != 0)).sum())
print(" %s %20d %16.6f %22d"
% (pw("%.3f" % lam, 12), nz,
float(np.mean((yt - Xt @ w) ** 2)), hit))
print(" lambda 를 줄이면 계수가 하나씩 들어옵니다")
print(" 너무 줄이면 잡음 변수까지 들어와 검증 오차가 다시 오릅니다")
print(" 검증 오차가 가장 낮은 자리는 잡음 변수 12 개를 함께 안고 있습니다")
print(" 가장 잘 맞히는 자리와 변수를 골라 내는 자리는 다릅니다")
print(" 189강 문제 2 의 변수 선택이 연속적인 손잡이가 된 것입니다")
print(" 릿지의 경로도 봅니다")
print(" %s %s %s %s"
% (pw("lambda", 12), rw("계수의 크기", 16), rw("가장 큰 계수", 16),
rw("검증 오차", 16)))
for lam in [100.0, 10.0, 1.0, 0.1, 0.01]:
w = ridge(Xs, y2, lam)
print(" %s %16.6f %16.6f %16.6f"
% (pw("%.3f" % lam, 12), float(np.linalg.norm(w)),
float(np.abs(w).max()), float(np.mean((yt - Xt @ w) ** 2))))
print(" 릿지는 계수가 연속적으로 줄어들 뿐 0 이 되지 않습니다")
print(" 그래서 경로 그림이 매끄럽습니다. 라소는 꺾인 자리가 있습니다")
print(" 특이값으로 릿지를 읽습니다")
U, S, Vt = np.linalg.svd(Xs, full_matrices=False)
SN = S / np.sqrt(n2)
print(" 207강 심화 2 에서 본 대로 방향마다 배율이 다릅니다")
print(" %s %s %s %s"
% (pw("정규화한 특이값", 18), rw("최소제곱 배율", 18), rw("릿지 배율", 16),
rw("몇 퍼센트 남나", 18)))
lam6 = 0.1
for i in [0, 20, 50, 79]:
sv = float(SN[i])
a = 1.0 / sv
b = sv / (sv * sv + lam6)
print(" %s %18.6f %16.6f %18.6f"
% (pw("%.4f" % sv, 18), a, b, b / a))
print(" 특이값이 큰 방향은 거의 그대로 두고 작은 방향만 크게 줄입니다")
print(" 정보가 적은 방향만 골라 누르는 것이 릿지가 하는 일입니다")
print(" 187강 문제 3 의 공선성이 작은 특이값이었습니다")
# --- 문제 5: 실무에서 쓰기 -----------------------------------------------
print(" 실무에서 정규화를 걸 때 확인할 것을 정리합니다")
print(" %s %s"
% (pw("무엇", 26), rw("왜", 30)))
for a, b in [("변수를 표준화했는가", "눈금이 다르면 벌점이 불공평"),
("절편을 뺐는가", "0 으로 당길 이유가 없음"),
("lambda 를 어떻게 골랐는가", "212강 교차검증"),
("참 구조가 드문가", "라소인지 릿지인지"),
("변수끼리 묶여 있는가", "엘라스틱넷을 고려")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 207강 문제 5 에서 앞 두 줄을 수치로 확인했습니다")
print(" 라소로 고른 변수를 그대로 믿으면 안 됩니다")
print(" 같은 분포에서 표본만 바꿔 가며 어떤 변수가 뽑히는지 봅니다")
sel_count = np.zeros(p2)
Rr = 60
for r in range(Rr):
Xr = rng.normal(0, 1, (n2, p2))
yr = Xr @ w_true + rng.normal(0, 0.5, n2)
wr = lasso(Xr, yr, 0.08)
sel_count += (np.abs(wr) > 1e-8).astype(float)
true_mask = w_true != 0
print(" %s %s %s"
% (pw("무엇", 26), rw("값", 18), rw("몇 개 중", 16)))
print(" %s %18.4f %16d"
% (pw("참 변수의 평균 선택률", 26),
float(sel_count[true_mask].mean() / Rr), int(true_mask.sum())))
print(" %s %18.4f %16d"
% (pw("잡음 변수의 평균 선택률", 26),
float(sel_count[~true_mask].mean() / Rr), int((~true_mask).sum())))
print(" %s %18d %16d"
% (pw("60 번 다 뽑힌 변수 수", 26),
int((sel_count == Rr).sum()), p2))
print(" %s %18d %16d"
% (pw("한 번도 안 뽑힌 변수 수", 26),
int((sel_count == 0).sum()), p2))
print(" 참 변수도 매번 뽑히지는 않습니다. 잡음 변수도 가끔 뽑힙니다")
print(" 189강 문제 3 의 선택 후 추론 문제가 그대로 남아 있습니다")
print(" 여러 번 뽑아 자주 나오는 변수만 남기는 방법을 안정성 선택이라 합니다")
print(" 안정성 선택을 해 봅니다")
print(" %s %s %s %s"
% (pw("몇 번 이상 뽑히면", 20), rw("고른 변수 수", 16),
rw("참 변수 중", 16), rw("잡음 중", 14)))
for th in [1, 15, 30, 45, 55]:
m = sel_count >= th
print(" %s %16d %16d %14d"
% (pw("%d" % th, 20), int(m.sum()), int((m & true_mask).sum()),
int((m & ~true_mask).sum())))
print(" 문턱을 올리면 잡음 변수가 빠르게 걸러집니다")
print(" 참 변수도 조금 잃습니다. 어디서 멈출지는 목적이 정합니다")
print(" 정규화를 언제 쓰지 말아야 하는지도 봅니다")
print(" %s %s"
% (pw("어떤 상황", 26), rw("왜 쓰면 안 되나", 30)))
for a, b in [("편향이 문제일 때", "편향을 더 키움"),
("계수를 해석해야 할 때", "치우친 값이 됨"),
("변수가 이미 적을 때", "얻을 것이 적음"),
("표본이 아주 많을 때", "분산이 이미 작음")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 마지막 줄을 수치로 봅니다")
print(" %s %s %s %s"
% (pw("표본 크기", 12), rw("정규화 없이", 18), rw("가장 좋은 릿지", 20),
rw("얼마나 좋아지나", 20)))
for n in [25, 50, 200, 2000]:
Xn = rng.normal(0, 1, (n, 20))
wn = rng.normal(0, 0.5, 20)
yn = Xn @ wn + rng.normal(0, 1.0, n)
Xv = rng.normal(0, 1, (4000, 20))
yv = Xv @ wn + rng.normal(0, 1.0, 4000)
e0 = float(np.mean((yv - Xv @ (np.linalg.pinv(Xn) @ yn)) ** 2))
eb = min(float(np.mean((yv - Xv @ ridge(Xn, yn, l)) ** 2))
for l in np.geomspace(1e-4, 10, 30))
print(" %s %18.6f %20.6f %20.6f"
% (pw("%d" % n, 12), e0, eb, (e0 - eb) / e0))
print(" 표본이 늘수록 정규화로 얻는 것이 줄어듭니다")
print(" 210강 문제 3 에서 자료가 분산을 공짜로 줄인다고 한 것과 같습니다")
print(" 211강은 벌점의 모양을 봤습니다. 212강은 lambda 를 고르는 법을 봅니다")
# 210강 문제 3 에서 lambda 를 키우면 분산이 준다고 했습니다
# 이제 벌점의 모양이 무엇을 바꾸는지 봅니다
# 무엇 벌점 해의 성질 어디서 왔나
# 릿지 계수 제곱의 합 모두 조금씩 줄어듦 정규 사전분포
# 라소 계수 절댓값의 합 일부가 정확히 0 라플라스 사전분포
# 엘라스틱넷 둘을 섞음 묶인 변수를 함께 남김 둘의 곱
# 없음 0 최소제곱 균등 사전분포
# 206강 문제 4 에서 이 대응을 수치로 확인했습니다
# 변수 하나짜리 문제에서 해를 직접 봅니다
# 최소제곱 해가 b 일 때 두 벌점의 해가 어떻게 되는지 봅니다
# 최소제곱 해 릿지 해 라소 해 라소가 0 인가
# -2.0 -1.333333 -1.500000 아니오
# -0.3 -0.200000 0.000000 예
# 0.0 0.000000 0.000000 예
# 0.3 0.200000 0.000000 예
# 2.0 1.333333 1.500000 아니오
# 릿지는 언제나 같은 비율로 줄입니다. 0 이 되지는 않습니다
# 라소는 lambda 만큼 빼고 0 에서 멈춥니다. 이것을 연성 문턱이라 합니다
# 절댓값이 lambda 보다 작으면 정확히 0 이 됩니다
# 왜 그런지 미분으로 봅니다
# 벌점 0 에서의 기울기 무엇을 뜻하나
# 계수 제곱 0 0 을 특별히 여기지 않음
# 절댓값 왼쪽 -1 오른쪽 +1 0 에서 꺾여 붙잡음
# 제곱은 0 근처에서 평평해 당기는 힘이 사라집니다
# 절댓값은 0 에서도 힘이 그대로라 0 으로 밀어붙입니다
# 계수의 크기 제곱 벌점의 기울기 절댓값 벌점의 기울기 어느 쪽이 센가
# 1.000 2.000000 1.000000 제곱
# 0.100 0.200000 1.000000 절댓값
# 0.010 0.020000 1.000000 절댓값
# 0.001 0.002000 1.000000 절댓값
# 계수가 작아질수록 절댓값 벌점이 상대적으로 훨씬 세집니다
# 변수가 많고 참 계수가 드문 문제에서 둘을 견줍니다
# 표본 80 에 변수 200 이고 참으로 0 이 아닌 계수는 8 개입니다
# 방법 0 이 아닌 계수 수 참 계수를 몇 개 찾나 검증 오차 계수 오차
# 최소제곱 200 8 10.941730 3.279516
# 릿지 lambda 0.01 200 8 10.929741 3.277396
# 릿지 lambda 0.5 200 8 11.316896 3.326208
# 라소 lambda 0.05 38 6 0.375322 0.363897
# 라소 lambda 0.5 6 6 1.969100 1.308891
# 릿지는 200 개 계수를 다 살려 둡니다. 하나도 0 이 안 됩니다
# 검증 오차가 릿지의 10.93 에서 라소의 0.3753 으로 떨어집니다
# 참 계수가 드문 문제에서는 라소가 확실히 낫습니다
# 다만 참 변수 8 개 중 6 개만 찾습니다. 놓친 둘을 봅니다
# 무엇 참 계수의 절댓값
# 놓친 변수 0.0081 0.0322
# 찾은 변수 중 가장 작은 둘 0.5419 0.8643
# 참 계수가 잡음 0.5 에 묻힐 만큼 작으면 라소도 못 꺼냅니다
# 반대로 참 계수가 고르게 퍼져 있으면 어떤지 봅니다
# 이번에는 200 개 계수가 모두 0 이 아닙니다
# 방법 0 이 아닌 계수 수 검증 오차 계수 오차
# 릿지 lambda 0.1 200 10.753929 3.208173
# 릿지 lambda 1.0 200 11.607617 3.332787
# 라소 lambda 0.05 73 15.159153 3.828247
# 라소 lambda 0.5 32 14.968722 3.796583
# 이번에는 릿지가 낫습니다. 0 으로 만들 계수가 없기 때문입니다
# 어느 쪽이 좋은지는 참 구조가 정합니다. 미리 알 수 없습니다
# 그래서 212강의 교차검증으로 자료에게 물어봅니다
# 변수끼리 닮았을 때를 봅니다
# 앞의 세 변수가 서로 거의 같고 셋 다 참 계수가 1.0 입니다
# 방법 앞 세 계수 합 0 인 개수
# 최소제곱 3.7396 -2.8847 2.1514 3.0063 0
# 릿지 lambda 0.1 0.9658 0.9582 0.9658 2.8897 0
# 라소 lambda 0.1 1.5423 0.0000 1.3416 2.8839 6
# 엘라스틱넷 alpha 0.5 0.9273 0.9175 0.9277 2.7725 5
# 릿지는 셋에 거의 똑같이 나눠 줍니다
# 라소는 셋 중 하나를 0 으로 죽이고 남은 둘에 불균등하게 얹습니다
# 최소제곱은 부호까지 뒤집힌 값을 냅니다. 187강 문제 2 의 무너짐입니다
# 셋의 합은 넷 다 2.8 근처로 비슷합니다. 어디에 두느냐만 다릅니다
# 엘라스틱넷은 릿지처럼 고르게 나누면서 잡음 변수는 0 으로 만듭니다
# 187강 문제 2 에서 자료가 아는 것이 합뿐이라고 한 자리입니다
# 두 벌점의 모양이 왜 다른 답을 내는지 기하로 봅니다
# 벌점 같은 값의 자취 왜 그 성질이 나오나
# 제곱의 합 원 또는 타원 모서리가 없어 축에 안 닿음
# 절댓값의 합 마름모 모서리가 축 위에 있음
# 둘을 섞음 모서리가 둥근 마름모 축에 닿되 덜 급함
# 제약 영역과 잔차 등고선이 처음 만나는 자리가 해입니다
# 마름모는 모서리에서 만나기 쉽고 그 모서리가 축 위입니다
# 두 변수 문제에서 해가 어디에 닿는지 셉니다
# 최소제곱 해를 여러 방향으로 두고 라소 해가 축에 닿는 비율을 봅니다
# lambda 한 계수가 0 인 비율 둘 다 0 인 비율 릿지가 0 인 비율
# 0.1 0.165550 0.000000 0.000000
# 0.3 0.393700 0.075750 0.000000
# 0.6 0.477700 0.271000 0.000000
# 1.0 0.422050 0.517100 0.000000
# 라소는 lambda 가 커질수록 축에 닿는 비율이 늘어납니다
# 릿지는 어떤 lambda 에서도 0 이 안 됩니다
# 마름모의 모서리가 축 위에 있다는 사실이 이 표를 만듭니다
# 직교 설계에서는 닫힌 해가 있습니다
# 설계행렬의 열이 서로 직교하면 변수마다 따로 풀립니다
# 최소제곱 릿지 공식 릿지 실제 라소 공식 라소 실제
# 1.9691 1.514703 1.514703 1.669114 1.669114
# 0.9743 0.749449 0.749449 0.674284 0.674284
# 0.4082 0.313965 0.313965 0.108154 0.108154
# 0.1821 0.140043 0.140043 0.000000 0.000000
# -0.0025 -0.001896 -0.001896 0.000000 0.000000
# 0.0351 0.026963 0.026963 0.000000 0.000000
# 공식과 실제가 맞습니다. 릿지는 나누고 라소는 뺍니다
# 직교가 아니면 이 공식이 안 맞습니다. 변수끼리 얽히기 때문입니다
# 그래도 성질은 그대로입니다. 하나는 줄이고 하나는 0 으로 만듭니다
# lambda 를 바꿔 가며 계수가 어떻게 움직이는지 봅니다
# 라소는 계수가 하나씩 들어옵니다
# lambda 0 이 아닌 계수 수 검증 오차 참 변수 중 찾은 수
# 1.000 5 6.614685 5
# 0.500 6 1.969100 6
# 0.200 6 0.536287 6
# 0.100 18 0.357213 6
# 0.050 38 0.375322 6
# 0.020 60 0.470841 6
# lambda 를 줄이면 계수가 하나씩 들어옵니다
# 너무 줄이면 잡음 변수까지 들어와 검증 오차가 다시 오릅니다
# 검증 오차가 가장 낮은 자리는 잡음 변수 12 개를 함께 안고 있습니다
# 가장 잘 맞히는 자리와 변수를 골라 내는 자리는 다릅니다
# 189강 문제 2 의 변수 선택이 연속적인 손잡이가 된 것입니다
# 릿지의 경로도 봅니다
# lambda 계수의 크기 가장 큰 계수 검증 오차
# 100.000 0.080191 0.040055 18.720408
# 10.000 0.610168 0.313339 16.310565
# 1.000 1.979096 1.067327 11.945608
# 0.100 2.787750 1.515192 10.904837
# 0.010 2.954539 1.600334 10.929741
# 릿지는 계수가 연속적으로 줄어들 뿐 0 이 되지 않습니다
# 그래서 경로 그림이 매끄럽습니다. 라소는 꺾인 자리가 있습니다
# 특이값으로 릿지를 읽습니다
# 207강 심화 2 에서 본 대로 방향마다 배율이 다릅니다
# 정규화한 특이값 최소제곱 배율 릿지 배율 몇 퍼센트 남나
# 2.5520 0.391854 0.385928 0.984877
# 1.8778 0.532547 0.517860 0.972422
# 1.2634 0.791499 0.744837 0.941046
# 0.5621 1.778900 1.351287 0.759620
# 특이값이 큰 방향은 거의 그대로 두고 작은 방향만 크게 줄입니다
# 정보가 적은 방향만 골라 누르는 것이 릿지가 하는 일입니다
# 187강 문제 3 의 공선성이 작은 특이값이었습니다
# 실무에서 정규화를 걸 때 확인할 것을 정리합니다
# 무엇 왜
# 변수를 표준화했는가 눈금이 다르면 벌점이 불공평
# 절편을 뺐는가 0 으로 당길 이유가 없음
# lambda 를 어떻게 골랐는가 212강 교차검증
# 참 구조가 드문가 라소인지 릿지인지
# 변수끼리 묶여 있는가 엘라스틱넷을 고려
# 207강 문제 5 에서 앞 두 줄을 수치로 확인했습니다
# 라소로 고른 변수를 그대로 믿으면 안 됩니다
# 같은 분포에서 표본만 바꿔 가며 어떤 변수가 뽑히는지 봅니다
# 무엇 값 몇 개 중
# 참 변수의 평균 선택률 0.7750 8
# 잡음 변수의 평균 선택률 0.0942 192
# 60 번 다 뽑힌 변수 수 6 200
# 한 번도 안 뽑힌 변수 수 0 200
# 참 변수도 매번 뽑히지는 않습니다. 잡음 변수도 가끔 뽑힙니다
# 189강 문제 3 의 선택 후 추론 문제가 그대로 남아 있습니다
# 여러 번 뽑아 자주 나오는 변수만 남기는 방법을 안정성 선택이라 합니다
# 안정성 선택을 해 봅니다
# 몇 번 이상 뽑히면 고른 변수 수 참 변수 중 잡음 중
# 1 200 8 192
# 15 6 6 0
# 30 6 6 0
# 45 6 6 0
# 55 6 6 0
# 문턱을 올리면 잡음 변수가 빠르게 걸러집니다
# 참 변수도 조금 잃습니다. 어디서 멈출지는 목적이 정합니다
# 정규화를 언제 쓰지 말아야 하는지도 봅니다
# 어떤 상황 왜 쓰면 안 되나
# 편향이 문제일 때 편향을 더 키움
# 계수를 해석해야 할 때 치우친 값이 됨
# 변수가 이미 적을 때 얻을 것이 적음
# 표본이 아주 많을 때 분산이 이미 작음
# 마지막 줄을 수치로 봅니다
# 표본 크기 정규화 없이 가장 좋은 릿지 얼마나 좋아지나
# 25 4.873716 2.565759 0.473552
# 50 1.395153 1.334988 0.043124
# 200 1.208248 1.202882 0.004441
# 2000 1.005420 1.005421 -0.000001
# 표본이 늘수록 정규화로 얻는 것이 줄어듭니다
# 210강 문제 3 에서 자료가 분산을 공짜로 줄인다고 한 것과 같습니다
# 211강은 벌점의 모양을 봤습니다. 212강은 lambda 를 고르는 법을 봅니다