184강부터 여기까지 모형이 주어져 있었습니다. 이제 모형을 고릅니다.
185강 문제 4에서 잡음 변수만 넣어도 이 오르는 것을 봤고, 186강 문제 5에서 곱 항까지 세면 개가 되는 것을 봤습니다. 으로는 못 고릅니다.
| 기준 | 무엇을 최소화 |
|---|---|
| 조정 R^ | 잔차분산 추정 |
| AIC | |
| BIC | |
| 교차검증 | 새 자료 예측 오차 |
넷이 서로 다른 모형을 고릅니다. 어느 것이 옳은지는 무엇을 하려는지가 정합니다.
그리고 이 강의의 절반은 경고입니다. 고르는 절차를 자료로 돌리는 순간 178강 문제 2의 문제가 가장 큰 규모로 되돌아옵니다. 참 효과가 하나도 없어도 절차는 무언가를 고르고, 고른 뒤의 값과 구간은 못 씁니다.
문제. 기준들을 계산합니다.
(1) 변수를 늘려 가며 다섯 지표를 재세요.
(2) 벌점의 크기를 견주세요.
생각의 실마리. 은 벌점이 없어 반드시 오릅니다. 벌점을 어떻게 물릴지가 기준마다의 차이입니다.
풀이. (1) 관측 개에 변수 개이고 앞의 개만 참입니다.
| 넣은 변수 수 | R^ | 조정 R^ | 오차 sd 추정 | AIC | BIC |
|---|---|---|---|---|---|
은 에서 까지 끝까지 오릅니다.
나머지 넷은 개에서 가장 좋아집니다. 오차 sd 추정이 으로 참값 에 닿고, AIC와 BIC가 각각 와 로 최소입니다.
에서 AIC와 BIC의 차이가 벌어집니다. 과 이며, BIC가 훨씬 세게 벌합니다.
(2) 벌점을 견줍니다.
| 기준 | 무엇을 최소화 | 변수 하나의 값 |
|---|---|---|
| 조정 R^ | 잔차분산 추정 | 자유도 하나 |
| AIC | 로그우도 | |
| AICc | AIC 작은 표본 보정 | 보다 큼 |
| BIC | 로그우도 |
이 이면 이 입니다. BIC가 AIC보다 두 배 넘게 엄격합니다.
| 표본 크기 | AIC 벌점 | BIC가 몇 배 | |
|---|---|---|---|
AIC의 벌점은 표본 크기와 무관하게 입니다. BIC는 으로 계속 자랍니다.
둘은 다른 목표를 갖습니다. 문제 2에서 그 차이가 결과로 나타납니다.
이 문제에서 배우는 것. 조정 과 AIC가 비슷해 보이는데 실제로는 조정 이 훨씬 헐겁습니다. 조정 은 잔차분산 추정을 최소화하는 것과 같고, 그것은 변수 하나를 넣을 때 가 만 넘으면 이득이라고 판정합니다. AIC는 대략 를 요구하므로 더 엄격합니다. 위 표에서 조정 이 에서 으로 의 와 거의 같은 것이 그 헐거움이며, 문제 2에서 조정 이 평균 개를 고르는 이유입니다.
바로 확인 1.
확인 1-1. AIC와 BIC의 벌점을 각각 쓰세요.
답. 와 입니다.
확인 1-2. 검산에서 참 변수 수 에서의 오차 sd 추정과 AIC를 쓰세요.
답. 과 입니다.
확인 1-3. 검산에서 일 때 BIC 벌점이 AIC의 몇 배인지 쓰세요.
답. 배입니다.
문제. 기준별 선택을 모의로 재세요.
(1) 참 변수 개에서 각 기준이 고른 크기를 세세요.
(2) 신호 세기를 바꿔 보세요.
생각의 실마리. 기준이 다르면 결과도 다릅니다. 어느 쪽으로 다른지를 세어 보면 각 기준의 목표가 드러납니다.
풀이. (1) 참 변수가 개인 자료를 번 만듭니다.
| 기준 | 고른 크기의 평균 | 정확히 개 | 참을 다 담음 | 잡음도 담음 |
|---|---|---|---|---|
| 조정 R^ | ||||
| AIC | ||||
| AICc | ||||
| BIC |
조정 이 평균 개를 고릅니다. 참 변수의 두 배가 넘으며, 퍼센트에서 잡음을 함께 담습니다.
BIC는 퍼센트에서 정확히 개를 맞힙니다. 벌점이 세기 때문입니다.
네 기준 모두 참을 빠뜨리는 일은 없습니다. 신호가 으로 충분히 세기 때문이며, 문제는 잡음을 얹는 것뿐입니다.
(2) 신호 세기를 바꿔 봅니다.
| 참 계수의 크기 | AIC가 고른 크기 | BIC가 고른 크기 | AIC가 참을 담음 | BIC가 참을 담음 |
|---|---|---|---|---|
신호가 로 약하면 BIC가 참 변수를 퍼센트에서만 다 담습니다. 세 번에 두 번은 진짜 변수를 빠뜨립니다.
AIC는 같은 자리에서 퍼센트입니다. 더 많이 담는 대신 잡음도 함께 담습니다.
목표가 다르므로 "어느 것이 더 좋은가"에 답이 없습니다.
이 문제에서 배우는 것. BIC가 참 모형을 맞힌다는 성질은 "참 모형이 후보 안에 있다"는 전제 위에 있습니다. 실제 자료에서 참 모형이 우리가 적은 선형식일 리 없으므로, 그 전제부터 성립하지 않습니다. 그럴 때 BIC는 가장 가까운 근사 중 가장 단순한 것을 고르는데, 그것이 예측에 좋다는 보장은 없습니다. 반대로 AIC는 처음부터 예측 오차를 겨냥하므로 참 모형이 없어도 뜻이 유지되며, 문제 4에서 그것을 확인합니다.
바로 확인 2.
확인 2-1. 검산에서 네 기준이 고른 크기의 평균을 쓰세요.
답. , , , 입니다.
확인 2-2. 검산에서 신호가 일 때 두 기준이 참을 담은 비율을 쓰세요.
답. AIC가 이고 BIC가 입니다.
확인 2-3. AIC와 BIC의 목표를 각각 한 문장으로 쓰세요.
답. AIC는 예측을 잘하려 하고 BIC는 참 모형을 맞히려 합니다.
문제. 단계적 선택을 검사합니다.
(1) 효과가 없는 자료에서 무엇을 고르는지 세세요.
(2) 고른 뒤의 계수와 값을 재세요.
생각의 실마리. 절차가 자동이면 객관적으로 느껴집니다. 그런데 자료를 보고 고르는 것이라는 사실은 변하지 않습니다.
풀이. (1) 값이 가장 작은 것부터 넣고 를 못 넘으면 멈춥니다. 참 효과가 하나도 없는 자료에서 돌립니다.
| 후보 변수 수 | 하나라도 고를 비율 | 고른 변수 수의 평균 | 독립이면 |
|---|---|---|---|
후보가 개면 효과가 하나도 없는데도 퍼센트에서 무언가를 고릅니다.
개면 평균 개를 고릅니다. 전부 가짜인데 모형에 두 개 넘게 들어갑니다.
182강 문제 5의 눈으로 고르기와 같습니다. 절차가 자동일 뿐 비교의 수는 똑같이 셉니다.
(2) 골라낸 변수의 값을 봅니다. 참 효과가 없는 개 후보입니다.
| 무엇 | 값 |
|---|---|
| 고른 변수의 계수 절댓값 평균 | |
| 참 계수 | |
| 고른 뒤 값의 평균 | |
| 고른 뒤 가 아래일 비율 |
참 계수가 인데 골라낸 계수의 절댓값이 입니다.
고른 뒤 값의 평균이 입니다. 참이 없는 자료에서 값은 **고르게 퍼져 평균이 **여야 하는데, 고르는 행위가 그것을 로 끌어내렸습니다.
183강 문제 3의 승자의 저주가 변수 선택에서 그대로 일어납니다. 가 가장 큰 것을 고르는 것이 효과 크기의 선택 편향을 만듭니다.
고른 뒤의 값을 그대로 보고하면 안 됩니다. 고르는 과정을 안 셌기 때문입니다.
이 문제에서 배우는 것. 단계적 선택이 여전히 널리 쓰이는 이유가 자동이라 손이 안 가기 때문입니다. 그런데 자동이라는 것이 객관을 뜻하지 않으며, 오히려 몇 번 비교했는지 사람이 세지 않게 만들어 더 위험합니다. 이 절차의 결과를 보고할 때는 최소한 후보가 몇 개였는지 적어야 하고, 그것만으로도 독자가 위 표를 떠올릴 수 있습니다. 그리고 계수와 값을 함께 실으면 안 되며, 고르기까지 포함한 절차를 새 자료에서 재현해야 정직합니다.
바로 확인 3.
확인 3-1. 검산에서 후보가 개일 때 고른 변수 수의 평균을 쓰세요.
답. 개이며 참 효과는 하나도 없습니다.
확인 3-2. 검산에서 골라낸 계수의 절댓값 평균과 참값을 쓰세요.
답. 과 입니다.
확인 3-3. 검산에서 고른 뒤 값의 평균을 쓰고 왜 문제인지 쓰세요.
답. 이며 참이 없으면 고르게 퍼져 여야 하기 때문입니다.
문제. 예측 오차로 고릅니다.
(1) 새 자료 오차와 AIC를 견주세요.
(2) 교차검증으로 같은 자리를 찾으세요.
(3) 선택을 겹 안에 넣으세요.
생각의 실마리. 예측이 목적이면 예측 오차를 직접 재면 됩니다. 그런데 새 자료가 없으면 훈련 자료를 나눠 씁니다.
풀이. (1) 훈련 개로 고르고 새 자료 개에서 잽니다.
| 넣은 변수 수 | 훈련 평균제곱오차 | 새 자료 오차 | AIC | BIC |
|---|---|---|---|---|
훈련 오차는 에서 로 계속 내려갑니다. 새 자료 오차는 에서 로 최소이고 그 뒤 다시 오릅니다.
AIC가 같은 자리에서 최소입니다. 이며, AIC가 예측 오차의 추정이라는 것이 여기서 드러납니다.
(2) 교차검증으로도 같은 자리를 찾습니다.
| 넣은 변수 수 | 겹 교차검증 오차 | 새 자료 오차 | 차이 |
|---|---|---|---|
교차검증 오차도 에서 최소입니다. 새 자료 오차를 잘 따라갑니다.
다만 조금 크게 나옵니다. 훈련 자료가 분의 로 줄어 모형이 조금 나빠지기 때문이며, 차이가 에서 입니다.
(3) 선택까지 교차검증 안에 넣어야 합니다. 참 효과가 없는 자료에서 두 절차를 견줍니다.
| 무엇을 겹 안에서 하는가 | 교차검증 오차 평균 | 참값 |
|---|---|---|
| 고르기를 밖에서 함 | ||
| 고르기를 겹 안에서 함 |
밖에서 고르면 오차가 으로 참값 보다 작게 나옵니다. 관계가 하나도 없는데 잘 맞히는 것처럼 보입니다.
겹 안에서 고르면 로 위로 올라옵니다. 변수 개를 헛되이 넣었으니 그만큼 나빠지는 것이 맞습니다.
162강 문제 2의 누출 그대로입니다. 검증 자료가 고르기에 이미 쓰였으면 검증이 아닙니다.
이 문제에서 배우는 것. "교차검증을 했습니다"가 안전을 뜻하지 않습니다. 겹을 나누기 전에 상관이 높은 변수를 골랐거나, 전체 자료로 표준화했거나, 결측을 채웠다면 전부 같은 누출입니다. 위 표에서 와 의 차이가 그 대가이며, 실제 성능을 퍼센트 낙관하게 만듭니다. 규칙은 하나인데, 자료를 만지는 모든 단계를 겹 안으로 넣는 것입니다. 162강에서 파이프라인을 구조로 만들라고 한 이유가 이것입니다.
바로 확인 4.
확인 4-1. 검산에서 훈련 오차와 새 자료 오차의 최소 자리를 각각 쓰세요.
답. 훈련은 개에서 최소이고 새 자료는 개에서 최소입니다.
확인 4-2. 교차검증 오차가 새 자료 오차보다 큰 이유를 쓰세요.
답. 훈련 자료가 줄어 모형이 조금 나빠지기 때문입니다.
확인 4-3. 검산에서 고르기를 밖과 안에서 했을 때의 오차를 쓰세요.
답. 와 이며 참값은 입니다.
문제. 목적별 판단을 세웁니다.
(1) 목적에 따른 기준을 정리하세요.
(2) 선택 후 구간의 포함률을 재세요.
(3) 정직한 방법들을 정리하세요.
생각의 실마리. 문제 2에서 기준마다 목표가 달랐습니다. 무엇을 하려는지를 먼저 정해야 기준이 정해집니다.
풀이. (1) 목적별로 정리합니다.
| 목적 | 무엇을 쓰는가 | 왜 |
|---|---|---|
| 예측이 목적 | AIC나 교차검증 | 예측 오차를 최소화 |
| 참 모형을 찾음 | BIC | 표본이 크면 맞힙니다 |
| 한 계수의 해석 | 고르지 않습니다 | 그림이 정합니다 |
| 변수가 아주 많음 | 라쏘나 정규화 | 한꺼번에 줄입니다 |
| 보고할 값 | 선택 후 추론 | 고른 과정을 세야 합니다 |
셋째 줄이 185강 문제 5의 결론입니다. 해석이 목적이면 자료로 고르면 안 됩니다.
(2) 선택 후 구간의 포함률을 잽니다. 참 효과가 하나도 없는 개 변수에서 두 가지 구간을 만듭니다.
| 무엇 | 포함률 | 구간의 평균 폭 | 목표 |
|---|---|---|---|
| 미리 정한 첫 변수 | |||
| 가 가장 큰 변수 |
미리 정한 변수는 로 목표를 지킵니다. 고른 변수는 로 무너집니다.
구간의 폭은 와 으로 거의 같습니다. 폭이 문제가 아니라 중심이 밀린 것입니다.
문제 3에서 골라낸 계수가 이었던 것이 그대로 구간을 옮깁니다. 폭이 이면 반폭이 이므로, 중심이 밀리면 이 겨우 경계에 놓입니다.
182강 문제 5와 같습니다. 보정할 비교의 수를 셀 수가 없습니다.
(3) 정직하게 하는 방법들을 정리합니다.
| 방법 | 무엇을 하는가 |
|---|---|
| 자료 분할 | 고르는 몫과 재는 몫을 나눕니다 |
| 선택 후 추론 | 고른 사건을 조건으로 답니다 |
| 안정성 선택 | 여러 부분표본에서 자주 뽑히는 것만 |
| 정규화 | 고르는 대신 다 넣고 줄입니다 |
| 미리 정하기 | 자료를 보기 전에 목록을 적습니다 |
첫째 줄이 가장 단순하고 확실합니다. 대신 표본을 절반 씁니다.
마지막 줄이 178강부터 되풀이된 결론입니다. 자료를 보고 고르면 안 됩니다.
이 문제에서 배우는 것. 변수 선택과 계수 해석을 같은 자료에서 함께 하려는 것이 애초에 불가능한 요구입니다. 자료가 가진 정보는 한 번뿐인데 고르는 데 쓰고 재는 데 또 쓰면, 두 번째 쓸 때는 이미 정보가 소모되어 있습니다. 그래서 실무의 정직한 답이 자료 분할이며, 표본을 절반 쓰는 대가로 남은 절반의 값과 구간이 그대로 유효해집니다. 182강 심화 5의 탐색과 확인 분리가 여기서도 같은 답이고, 그것이 재현 위기 이후 표준이 되어 가는 방향입니다.
바로 확인 5.
확인 5-1. 해석이 목적일 때 변수를 어떻게 고르는지 쓰세요.
답. 자료로 고르지 않고 그림과 도메인 지식이 정합니다.
확인 5-2. 검산에서 두 구간의 포함률과 폭을 쓰세요.
답. 와 이며 폭은 과 로 비슷합니다.
확인 5-3. 자료 분할이 무엇을 얻고 무엇을 잃는지 쓰세요.
답. 남은 절반의 추론이 유효해지고 표본의 절반을 잃습니다.
| 기준 | 벌점 | 목표 |
|---|---|---|
| R^ | 없음 | 쓰면 안 됩니다 |
| 조정 R^ | 자유도 | 헐겁습니다 |
| AIC | 예측 | |
| AICc | 이상 | 작은 표본의 예측 |
| BIC | 참 모형 | |
| 교차검증 | 직접 잽니다 | 예측 |
| 무엇이 문제인가 | 어디서 |
|---|---|
| 고르면 계수가 부풉니다 | 문제 3 |
| 고르면 값이 작아집니다 | 문제 3 |
| 고르면 구간이 못 담습니다 | 문제 5 |
| 겹 밖에서 고르면 누출 | 문제 4 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 으로 모형을 고릅니다 | 반드시 오릅니다 |
| 단계적 선택을 객관적이라 봅니다 | 자료를 보고 고르는 것입니다 |
| 고른 뒤의 값을 보고합니다 | 고르는 과정을 안 셌습니다 |
| 겹 밖에서 변수를 고릅니다 | 성능이 낙관됩니다 |
| AIC와 BIC 중 하나가 옳다고 봅니다 | 목표가 다릅니다 |
| 해석과 선택을 같은 자료로 합니다 | 정보를 두 번 씁니다 |
문제 6. AIC와 BIC의 벌점을 각각 쓰세요.
답. 와 입니다.
문제 7. 검산에서 참 변수 수 에서의 오차 sd 추정과 AIC를 쓰세요.
답. 과 입니다.
문제 8. 검산에서 일 때 BIC 벌점이 AIC의 몇 배인지 쓰세요.
답. 배입니다.
문제 9. 검산에서 네 기준이 고른 크기의 평균을 쓰세요.
답. , , , 입니다.
문제 10. 검산에서 신호가 일 때 두 기준이 참을 담은 비율을 쓰세요.
답. AIC가 이고 BIC가 입니다.
문제 11. AIC와 BIC의 목표를 각각 한 문장으로 쓰세요.
답. AIC는 예측을 잘하려 하고 BIC는 참 모형을 맞히려 합니다.
문제 12. 검산에서 후보가 개일 때 하나라도 고를 비율을 쓰세요.
답. 이며 참 효과는 하나도 없습니다.
문제 13. 검산에서 골라낸 계수의 절댓값 평균과 참값을 쓰세요.
답. 과 입니다.
문제 14. 검산에서 고른 뒤 값의 평균을 쓰고 왜 문제인지 쓰세요.
답. 이며 참이 없으면 고르게 퍼져 여야 하기 때문입니다.
문제 15. 검산에서 훈련 오차와 새 자료 오차의 최소 자리를 각각 쓰세요.
답. 훈련은 개에서 최소이고 새 자료는 개에서 최소입니다.
문제 16. 검산에서 고르기를 밖과 안에서 했을 때의 오차를 쓰세요.
답. 와 이며 참값은 입니다.
문제 17. 검산에서 두 구간의 포함률을 쓰세요.
답. 와 입니다.
문제 18. 자료 분할이 무엇을 얻고 무엇을 잃는지 쓰세요.
답. 남은 절반의 추론이 유효해지고 표본의 절반을 잃습니다.
심화 1. AIC가 왜 예측 오차의 추정인지 정리하세요.
로그우도가 훈련 자료에서 낙관적이라는 것이 출발점입니다. 그 낙관의 크기가 **대략 **입니다.
| 무엇 | 값 |
|---|---|
| 훈련 로그우도의 기댓값 | 참값보다 만큼 큽니다 |
| 그것을 보정 | |
| 를 곱함 |
그래서 AIC가 새 자료의 기대 로그우도를 추정합니다. 문제 4에서 AIC와 새 자료 오차가 같은 자리에서 최소였던 것이 우연이 아닙니다.
이 작으면 이 근사가 깨집니다. 그때 쓰는 것이 AICc이며, 보정항이 입니다.
심화 2. 선택 후 추론을 정리하세요.
문제 5에서 고른 뒤의 구간이 이었습니다. 고른 사건을 조건으로 걸면 고칠 수 있습니다.
| 무엇을 하는가 | 어떻게 |
|---|---|
| 선택 사건을 부등식으로 | |
| 그 조건 아래의 분포 | 잘린 정규분포 |
| 그 분포로 구간 | 비대칭이고 넓습니다 |
잘린 정규분포의 분위수를 쓰는 것이 핵심입니다. 179강 문제 4의 절단이 여기서 도구가 됩니다.
구간이 넓어지고 비대칭이 됩니다. 고르는 데 쓴 정보만큼 되돌려 주는 것이며, 공짜가 없다는 원칙 그대로입니다.
라쏘에도 같은 이론이 있습니다. 어느 변수가 살아남았는지를 조건으로 걸면 정확한 구간이 나오며, 다만 계산이 무겁습니다.
심화 3. 안정성 선택을 정리하세요.
한 번 고르는 대신 여러 번 고르고 자주 뽑히는 것만 남깁니다.
| 단계 | 무엇을 하는가 |
|---|---|
| 표본의 절반을 무작위로 뽑습니다 | |
| 거기서 변수를 고릅니다 | |
| 번 되풀이합니다 | |
| 뽑힌 빈도가 문턱을 넘는 것만 |
빈도가 안정성의 척도입니다. 참 변수는 어느 부분표본에서도 뽑히고, 잡음은 운에 따라 들쭉날쭉합니다.
187강 문제 2에서 표본마다 계수 부호가 뒤집혔던 것이 여기서 신호가 됩니다. 그런 변수는 빈도가 낮게 나옵니다.
잘못된 선택의 기대 개수에 상한을 줄 수 있습니다. 문턱과 평균 선택 개수로부터 계산되며, 182강의 FDR 통제와 비슷한 보장입니다.
심화 4. 라쏘로 고르는 법을 정리하세요.
187강 심화 2에서 라쏘가 계수를 정확히 으로 만든다고 했습니다. 그것이 곧 선택입니다.
| 무엇을 얻는가 | 무엇을 잃는가 |
|---|---|
| 고르기와 추정을 한 번에 | 계수가 쪽으로 치우칩니다 |
| 변수가 관측보다 많아도 됨 | 얽힌 변수 중 하나만 고릅니다 |
| 하나로 조절 | 를 골라야 합니다 |
단계적 선택보다 안정적입니다. 한 번에 전체를 보고 정하므로, 문제 3처럼 한 변수가 들어가면 그다음이 바뀌는 연쇄가 덜합니다.
그래도 선택 후 추론 문제는 남습니다. 라쏘가 고른 변수로 다시 최소제곱을 돌려 값을 내는 관행이 흔한데, 문제 5와 같은 이유로 못 씁니다.
는 교차검증으로 고릅니다. 그러면 문제 4의 겹 안 규칙이 그대로 적용됩니다.
심화 5. 모형이 여럿일 때 평균 내는 법을 정리하세요.
하나를 고르는 대신 여럿을 섞을 수도 있습니다.
| 방법 | 가중치 |
|---|---|
| AIC 가중 | 에 비례 |
| BIC 가중 | 사후확률의 근사 |
| 쌓기 | 교차검증으로 가중치를 학습 |
첫째 줄이 간단합니다. 최소 AIC와의 차이가 이내면 거의 같은 무게를 받고, 이 넘으면 거의 입니다.
모형 선택의 불확실성을 담는다는 것이 이점입니다. 하나를 고르면 "이것이 맞는 모형"이라고 단정하는 셈인데, 평균은 그러지 않습니다.
그래서 예측 구간이 더 정직해집니다. 다만 해석은 더 어려워지며, 계수 하나를 말하기가 곤란해집니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 이산 결과 | 로지스틱의 변수 선택 | 190강 |
| 정규화 | 라쏘와 능형 | 211강 |
| 교차검증 | 분산과 겹 수 | 212강 |
| 과적합 | 복잡도와 일반화 | 214강 |
셋째 줄이 이 강의의 문제 4를 이론으로 다룹니다. 겹을 몇 개로 나눌지, 교차검증 오차 자체의 분산이 얼마인지가 212강의 주제입니다.
그리고 214강이 이 강의 전체를 다시 씁니다. 모형 복잡도와 일반화 오차의 관계를 모형 클래스 수준에서 다루며, 변수 선택이 그 특수한 경우가 됩니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| AIC | 아카이케 정보기준 | 입니다 |
| AICc | 보정 AIC | 작은 표본용 AIC입니다 |
| BIC | 베이즈 정보기준 | 입니다 |
| 조정 R^ | adjusted R-squared | 자유도로 벌점을 문 입니다 |
| 단계적 선택 | stepwise selection | 하나씩 넣고 빼는 절차입니다 |
| 교차검증 | cross-validation | 자료를 겹으로 나눠 재는 방법입니다 |
| 누출 | leakage | 검증 자료가 학습에 새어 든 것입니다 |
| 선택 후 추론 | post-selection inference | 고른 사건을 조건으로 답니다 |
| 안정성 선택 | stability selection | 부분표본에서 자주 뽑히는 것만 |
| 모형 평균 | model averaging | 여럿을 가중해 섞습니다 |
| 자료 분할 | sample splitting | 고르는 몫과 재는 몫을 나눕니다 |
| 승자의 저주 | winner's curse | 고르면 효과가 부풉니다 |
다음은 190강 로지스틱 회귀와 오즈비입니다. 여기까지 결과가 연속인 자료였습니다.
181강에서 범주형 결과를 교차표로 다뤘는데, 다른 변수를 통제할 자리가 없다는 한계가 있었습니다. 190강은 그 한계를 회귀로 푸는데, 직선을 그냥 쓰면 확률이 아래나 위로 나가는 문제가 먼저 나타납니다. 그것을 로그 오즈로 옮겨 풀고, 181강 문제 3의 오즈비가 계수의 지수로 되돌아옵니다.
import numpy as np
rng = np.random.default_rng(20260926)
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 erf(x):
a = abs(float(x))
if a > 6.0:
return 1.0 if x > 0 else -1.0
t, ssum, kk = 1.0, 1.0, 0
while True:
kk += 1
t *= 2.0 * a * a / (2.0 * kk + 1.0)
ssum += t
if t < 1e-18 * ssum:
break
v = 2.0 * a / np.sqrt(np.pi) * np.exp(-a * a) * ssum
return v if x > 0 else -v
def p2(z):
return 1.0 - erf(abs(float(z)) / np.sqrt(2.0))
def ols(y, X):
A = np.concatenate([np.ones((len(y), 1)), X], axis=1) if X.size else np.ones((len(y), 1))
b, *_ = np.linalg.lstsq(A, y, rcond=None)
e = y - A @ b
n, p = A.shape
sse = float((e ** 2).sum())
sst = float(((y - y.mean()) ** 2).sum())
s2 = sse / max(n - p, 1)
try:
se = np.sqrt(s2 * np.diag(np.linalg.inv(A.T @ A)))
except np.linalg.LinAlgError:
se = np.full(p, np.nan)
return dict(b=b, se=se, sse=sse, sst=sst, n=n, p=p, s2=s2,
r2=1.0 - sse / sst,
adj=1.0 - (sse / sst) * (n - 1) / max(n - p, 1))
def crit(m):
n, p, sse = m["n"], m["p"], m["sse"]
ll = -0.5 * n * (np.log(2 * np.pi * sse / n) + 1.0)
return dict(aic=-2 * ll + 2 * p,
aicc=-2 * ll + 2 * p + 2.0 * p * (p + 1) / max(n - p - 1, 1),
bic=-2 * ll + np.log(n) * p,
mallows=sse, ll=ll)
def make(n, k, ntrue, beta=0.6, sd=1.0):
X = rng.normal(0, 1, (n, k))
b = np.zeros(k)
b[:ntrue] = beta
y = X @ b + rng.normal(0, sd, n)
return X, y, b
# --- 문제 1: 왜 고르는 일이 필요한가 ------------------------------------
print(" 185강 문제 4 에서 잡음 변수만 넣어도 R^2 이 올랐습니다")
print(" 그러면 무엇으로 모형을 고릅니까")
N1, K1 = 120, 20
X1, y1, b1 = make(N1, K1, 5)
print(" 관측 120 개에 변수 20 개이고 앞의 5 개만 참입니다. 참 계수는 0.6 입니다")
print(" %s %s %s %s %s %s"
% (pw("넣은 변수 수", 14), rw("R^2", 12), rw("조정 R^2", 12),
rw("오차 sd 추정", 14), rw("AIC", 12), rw("BIC", 12)))
for k in [1, 3, 5, 8, 12, 20]:
m = ols(y1, X1[:, :k])
c = crit(m)
print(" %s %12.6f %12.6f %14.6f %12.4f %12.4f"
% (pw("%d" % k, 14), m["r2"], m["adj"], np.sqrt(m["s2"]),
c["aic"], c["bic"]))
print(" R^2 은 끝까지 오릅니다. 나머지 넷은 5 근처에서 가장 좋아집니다")
print(" AIC 와 BIC 는 작을수록 좋습니다. 벌점이 서로 다릅니다")
print(" 네 기준의 벌점을 나란히 씁니다")
print(" %s %s %s" % (pw("기준", 16), rw("무엇을 최소화", 30), rw("변수 하나의 값", 18)))
for a, b, c in [("조정 R^2", "잔차분산 추정", "자유도 하나"),
("AIC", "-2 로그우도 + 2p", "2"),
("AICc", "AIC + 작은 표본 보정", "2 보다 큼"),
("BIC", "-2 로그우도 + log(n) p", "log(n)")]:
print(" %s %s %s" % (pw(a, 16), rw(b, 30), rw(c, 18)))
print(" n 이 120 이면 log(n) 이 %.4f 라 BIC 가 AIC 보다 두 배 넘게 엄격합니다"
% np.log(120))
print(" %s %s %s %s" % (pw("표본 크기", 12), rw("log(n)", 12), rw("AIC 벌점", 12),
rw("BIC 가 몇 배", 14)))
for n in [20, 100, 1000, 100000]:
print(" %s %12.4f %12.1f %14.4f"
% (pw("%d" % n, 12), np.log(n), 2.0, np.log(n) / 2.0))
print(" 표본이 커질수록 BIC 가 점점 더 엄격해집니다. 둘은 다른 목표를 갖습니다")
# --- 문제 2: 기준마다 다른 모형을 고릅니다 ------------------------------
print(" 같은 자료에서 기준마다 다른 모형을 고릅니다")
R2 = 600
print(" 참 변수가 5 개인 자료를 600 번 만들어 각 기준이 고른 크기를 셉니다")
print(" %s %s %s %s %s"
% (pw("기준", 14), rw("고른 크기의 평균", 20), rw("정확히 5 개", 14),
rw("참을 다 담음", 16), rw("잡음도 담음", 16)))
res2 = {}
for nm in ["adj", "aic", "aicc", "bic"]:
sizes, exact, allin, extra = [], 0, 0, 0
for _ in range(R2):
X, y, _ = make(120, 20, 5)
best, bk = None, 0
for k in range(1, 21):
m = ols(y, X[:, :k])
c = crit(m)
v = -m["adj"] if nm == "adj" else c[nm]
if best is None or v < best:
best, bk = v, k
sizes.append(bk)
if bk == 5:
exact += 1
if bk >= 5:
allin += 1
if bk > 5:
extra += 1
res2[nm] = (float(np.mean(sizes)), exact / R2, allin / R2, extra / R2)
print(" %s %20.4f %14.4f %16.4f %16.4f"
% (pw(nm, 14), *res2[nm]))
print(" 조정 R^2 과 AIC 는 참보다 큰 모형을 자주 고릅니다")
print(" BIC 는 정확히 5 개를 가장 자주 맞힙니다. 벌점이 세기 때문입니다")
print(" 네 기준 모두 참을 빠뜨리는 일은 드뭅니다. 문제는 잡음을 얹는 것입니다")
print(" 신호가 약하면 이야기가 달라집니다")
print(" %s %s %s %s %s"
% (pw("참 계수의 크기", 16), rw("AIC 가 고른 크기", 18), rw("BIC 가 고른 크기", 18),
rw("AIC 가 참을 담음", 18), rw("BIC 가 참을 담음", 18)))
for beta in [0.2, 0.4, 0.6, 1.0]:
sa, sb, ia, ib = [], [], 0, 0
for _ in range(300):
X = rng.normal(0, 1, (120, 20))
bb = np.zeros(20)
bb[:5] = beta
y = X @ bb + rng.normal(0, 1.0, 120)
pick = {}
for nm in ["aic", "bic"]:
best, bk = None, 0
for k in range(1, 21):
v = crit(ols(y, X[:, :k]))[nm]
if best is None or v < best:
best, bk = v, k
pick[nm] = bk
sa.append(pick["aic"])
sb.append(pick["bic"])
ia += 1 if pick["aic"] >= 5 else 0
ib += 1 if pick["bic"] >= 5 else 0
print(" %s %18.4f %18.4f %18.4f %18.4f"
% (pw("%.1f" % beta, 16), float(np.mean(sa)), float(np.mean(sb)),
ia / 300.0, ib / 300.0))
print(" 신호가 0.2 로 약하면 BIC 가 참 변수를 자주 빠뜨립니다")
print(" AIC 는 더 많이 담는 대신 잡음도 함께 담습니다. 목표가 다릅니다")
print(" BIC 는 참 모형을 맞히려 하고 AIC 는 예측을 잘하려 합니다")
# --- 문제 3: 단계적 선택의 함정 -----------------------------------------
print(" 변수를 하나씩 넣고 빼는 절차가 널리 쓰입니다")
print(" p 값이 가장 작은 것부터 넣고 0.05 를 못 넘으면 멈춥니다")
R3 = 2000
print(" 참 효과가 하나도 없는 자료에서 그 절차를 돌립니다")
print(" %s %s %s %s"
% (pw("후보 변수 수", 14), rw("하나라도 고를 비율", 20),
rw("고른 변수 수의 평균", 20), rw("독립이면", 12)))
for k in [1, 5, 10, 20, 40]:
picked = []
for _ in range(R3 // 4):
X = rng.normal(0, 1, (100, k))
y = rng.normal(0, 1, 100)
chosen = []
rest = list(range(k))
while rest:
best, bi = None, None
for j in rest:
m = ols(y, X[:, chosen + [j]])
tv = abs(m["b"][-1] / m["se"][-1])
if best is None or tv > best:
best, bi = tv, j
m = ols(y, X[:, chosen + [bi]])
pv = p2(m["b"][-1] / m["se"][-1])
if pv < 0.05:
chosen.append(bi)
rest.remove(bi)
else:
break
picked.append(len(chosen))
picked = np.array(picked)
print(" %s %20.4f %20.4f %12.4f"
% (pw("%d" % k, 14), float((picked > 0).mean()), float(picked.mean()),
1.0 - 0.95 ** k))
print(" 후보가 20 개면 효과가 하나도 없는데도 절반 넘게 무언가를 고릅니다")
print(" 182강 문제 5 의 눈으로 고르기와 같습니다. 절차가 자동일 뿐입니다")
print(" 고른 뒤의 p 값과 계수가 부풀어 있습니다")
R4 = 3000
print(" 참 효과가 없는 20 개 후보에서 골라낸 변수의 값을 봅니다")
print(" %s %s" % (pw("무엇", 30), rw("값", 16)))
tops, ps = [], []
for _ in range(R4):
X = rng.normal(0, 1, (100, 20))
y = rng.normal(0, 1, 100)
ts = []
for j in range(20):
m = ols(y, X[:, [j]])
ts.append(abs(m["b"][1] / m["se"][1]))
ts = np.array(ts)
j = int(np.argmax(ts))
m = ols(y, X[:, [j]])
tops.append(abs(m["b"][1]))
ps.append(p2(m["b"][1] / m["se"][1]))
tops = np.array(tops)
ps = np.array(ps)
print(" %s %16.6f" % (pw("고른 변수의 계수 절댓값 평균", 30), float(tops.mean())))
print(" %s %16.6f" % (pw("참 계수", 30), 0.0))
print(" %s %16.6f" % (pw("고른 뒤 p 값의 평균", 30), float(ps.mean())))
print(" %s %16.6f" % (pw("고른 뒤 p 가 0.05 아래일 비율", 30), float((ps < 0.05).mean())))
print(" 참 계수가 0 인데 골라낸 계수의 절댓값이 %.4f 입니다" % float(tops.mean()))
print(" 183강 문제 3 의 승자의 저주가 변수 선택에서 그대로 일어납니다")
print(" 고른 뒤의 p 값을 그대로 보고하면 안 됩니다. 고르는 과정을 안 셌기 때문입니다")
# --- 문제 4: 예측으로 고르기 --------------------------------------------
print(" 기준 대신 새 자료의 예측 오차로 고를 수도 있습니다")
N5, K5 = 200, 20
X5, y5, b5 = make(N5, K5, 5)
Xn = rng.normal(0, 1, (5000, K5))
yn = Xn @ b5 + rng.normal(0, 1.0, 5000)
print(" 훈련 200 개로 고르고 새 자료 5000 개에서 오차를 잽니다")
print(" %s %s %s %s %s"
% (pw("넣은 변수 수", 14), rw("훈련 평균제곱오차", 20), rw("새 자료 오차", 16),
rw("AIC", 12), rw("BIC", 12)))
for k in [1, 3, 5, 8, 12, 20]:
m = ols(y5, X5[:, :k])
c = crit(m)
A = np.concatenate([np.ones((5000, 1)), Xn[:, :k]], axis=1)
te = float(((yn - A @ m["b"]) ** 2).mean())
print(" %s %20.6f %16.6f %12.4f %12.4f"
% (pw("%d" % k, 14), m["sse"] / N5, te, c["aic"], c["bic"]))
print(" 훈련 오차는 계속 내려가고 새 자료 오차는 5 근처에서 가장 낮습니다")
print(" AIC 가 새 자료 오차와 같은 자리에서 가장 작아집니다. 그것이 AIC 의 목표입니다")
print(" 교차검증으로도 같은 자리를 찾습니다")
print(" 훈련 자료를 5 겹으로 나눠 돌려 가며 잽니다")
print(" %s %s %s %s"
% (pw("넣은 변수 수", 14), rw("5겹 교차검증 오차", 20), rw("새 자료 오차", 16),
rw("차이", 12)))
idx = rng.permutation(N5)
folds = np.array_split(idx, 5)
for k in [1, 3, 5, 8, 12, 20]:
acc = 0.0
for f in folds:
tr = np.setdiff1d(idx, f)
m = ols(y5[tr], X5[np.ix_(tr, range(k))])
A = np.concatenate([np.ones((len(f), 1)), X5[np.ix_(f, range(k))]], axis=1)
acc += float(((y5[f] - A @ m["b"]) ** 2).sum())
cv = acc / N5
m = ols(y5, X5[:, :k])
A = np.concatenate([np.ones((5000, 1)), Xn[:, :k]], axis=1)
te = float(((yn - A @ m["b"]) ** 2).mean())
print(" %s %20.6f %16.6f %12.6f"
% (pw("%d" % k, 14), cv, te, cv - te))
print(" 교차검증 오차가 새 자료 오차를 잘 따라갑니다. 조금 크게 나오는 편입니다")
print(" 훈련 자료가 5 분의 4 로 줄어 모형이 조금 나빠지기 때문입니다")
print(" 선택까지 교차검증 안에 넣어야 합니다")
R6 = 300
print(" 참 효과가 없는 자료에서 두 절차의 교차검증 오차를 견줍니다")
print(" %s %s %s" % (pw("무엇을 겹 안에서 하는가", 30), rw("교차검증 오차 평균", 20),
rw("참값", 12)))
out_naive, out_ok = [], []
for _ in range(R6):
X = rng.normal(0, 1, (100, 40))
y = rng.normal(0, 1, 100)
ii = rng.permutation(100)
ff = np.array_split(ii, 5)
cors = np.array([abs(np.corrcoef(X[:, j], y)[0, 1]) for j in range(40)])
top = np.argsort(-cors)[:5]
acc = 0.0
for f in ff:
tr = np.setdiff1d(ii, f)
m = ols(y[tr], X[np.ix_(tr, top)])
A = np.concatenate([np.ones((len(f), 1)), X[np.ix_(f, top)]], axis=1)
acc += float(((y[f] - A @ m["b"]) ** 2).sum())
out_naive.append(acc / 100.0)
acc = 0.0
for f in ff:
tr = np.setdiff1d(ii, f)
c2 = np.array([abs(np.corrcoef(X[tr, j], y[tr])[0, 1]) for j in range(40)])
t2 = np.argsort(-c2)[:5]
m = ols(y[tr], X[np.ix_(tr, t2)])
A = np.concatenate([np.ones((len(f), 1)), X[np.ix_(f, t2)]], axis=1)
acc += float(((y[f] - A @ m["b"]) ** 2).sum())
out_ok.append(acc / 100.0)
print(" %s %20.6f %12.1f"
% (pw("고르기를 밖에서 함", 30), float(np.mean(out_naive)), 1.0))
print(" %s %20.6f %12.1f"
% (pw("고르기를 겹 안에서 함", 30), float(np.mean(out_ok)), 1.0))
print(" 밖에서 고르면 오차가 1.0 보다 작게 나옵니다. 관계가 없는데도 잘 맞힙니다")
print(" 겹 안에서 고르면 1.0 위로 올라옵니다. 162강 문제 2 의 누출 그대로입니다")
# --- 문제 5: 무엇을 위해 고르는가 ---------------------------------------
print(" 목적에 따라 고르는 기준이 달라집니다")
print(" %s %s %s" % (pw("목적", 20), rw("무엇을 쓰는가", 22), rw("왜", 26)))
for a, b, c in [("예측이 목적", "AIC 나 교차검증", "예측 오차를 최소화"),
("참 모형을 찾음", "BIC", "표본이 크면 맞힙니다"),
("한 계수의 해석", "고르지 않습니다", "그림이 정합니다"),
("변수가 아주 많음", "라쏘나 정규화", "한꺼번에 줄입니다"),
("보고할 p 값", "선택 후 추론", "고른 과정을 세야 합니다")]:
print(" %s %s %s" % (pw(a, 20), rw(b, 22), rw(c, 26)))
print(" 셋째 줄이 185강 문제 5 의 결론입니다. 해석이 목적이면 자료로 고르면 안 됩니다")
print(" 선택한 뒤의 구간은 포함률을 잃습니다")
R7 = 4000
print(" 참 효과가 하나도 없는 20 개 변수에서 두 가지 구간을 만듭니다")
print(" 하나는 미리 정한 첫 변수이고 하나는 t 가 가장 큰 변수입니다")
cov_pre, cov_sel, w_pre, w_sel = 0, 0, [], []
for _ in range(R7):
X = rng.normal(0, 1, (80, 20))
y = rng.normal(0, 1, 80)
m0 = ols(y, X[:, [0]])
lo, hi = m0["b"][1] - 1.9600 * m0["se"][1], m0["b"][1] + 1.9600 * m0["se"][1]
w_pre.append(hi - lo)
if lo <= 0.0 <= hi:
cov_pre += 1
ts, ms = [], []
for j in range(20):
mj = ols(y, X[:, [j]])
ts.append(abs(mj["b"][1] / mj["se"][1]))
ms.append(mj)
j = int(np.argmax(ts))
mj = ms[j]
lo, hi = mj["b"][1] - 1.9600 * mj["se"][1], mj["b"][1] + 1.9600 * mj["se"][1]
w_sel.append(hi - lo)
if lo <= 0.0 <= hi:
cov_sel += 1
print(" %s %s %s %s"
% (pw("무엇", 26), rw("포함률", 12), rw("구간의 평균 폭", 18), rw("목표", 10)))
print(" %s %12.4f %18.6f %10.2f"
% (pw("미리 정한 첫 변수", 26), cov_pre / R7, float(np.mean(w_pre)), 0.95))
print(" %s %12.4f %18.6f %10.2f"
% (pw("t 가 가장 큰 변수", 26), cov_sel / R7, float(np.mean(w_sel)), 0.95))
print(" 구간의 폭은 거의 같은데 포함률만 무너집니다")
print(" 폭이 아니라 중심이 밀린 것입니다. 고르는 순간 계수가 0 에서 멀어집니다")
print(" 182강 문제 5 와 같습니다. 보정할 비교의 수를 셀 수가 없습니다")
print(" 정직하게 하는 방법들을 정리합니다")
print(" %s %s" % (pw("방법", 26), rw("무엇을 하는가", 30)))
for a, b in [("자료 분할", "고르는 몫과 재는 몫을 나눕니다"),
("선택 후 추론", "고른 사건을 조건으로 답니다"),
("안정성 선택", "여러 부분표본에서 자주 뽑히는 것만"),
("정규화", "고르는 대신 다 넣고 줄입니다"),
("미리 정하기", "자료를 보기 전에 목록을 적습니다")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 첫째 줄이 가장 단순하고 확실합니다. 대신 표본을 절반 씁니다")
print(" 마지막 줄이 178강부터 되풀이된 결론입니다. 자료를 보고 고르면 안 됩니다")
# 185강 문제 4 에서 잡음 변수만 넣어도 R^2 이 올랐습니다
# 그러면 무엇으로 모형을 고릅니까
# 관측 120 개에 변수 20 개이고 앞의 5 개만 참입니다. 참 계수는 0.6 입니다
# 넣은 변수 수 R^2 조정 R^2 오차 sd 추정 AIC BIC
# 1 0.169810 0.162774 1.464538 434.0979 439.6729
# 3 0.441993 0.427562 1.210999 390.4239 401.5739
# 5 0.626179 0.609784 0.999843 346.3525 363.0774
# 8 0.630949 0.604351 1.006779 350.8114 375.8989
# 12 0.641672 0.601486 1.010418 355.2730 391.5104
# 20 0.673228 0.607213 1.003131 360.2109 418.7482
# R^2 은 끝까지 오릅니다. 나머지 넷은 5 근처에서 가장 좋아집니다
# AIC 와 BIC 는 작을수록 좋습니다. 벌점이 서로 다릅니다
# 네 기준의 벌점을 나란히 씁니다
# 기준 무엇을 최소화 변수 하나의 값
# 조정 R^2 잔차분산 추정 자유도 하나
# AIC -2 로그우도 + 2p 2
# AICc AIC + 작은 표본 보정 2 보다 큼
# BIC -2 로그우도 + log(n) p log(n)
# n 이 120 이면 log(n) 이 4.7875 라 BIC 가 AIC 보다 두 배 넘게 엄격합니다
# 표본 크기 log(n) AIC 벌점 BIC 가 몇 배
# 20 2.9957 2.0 1.4979
# 100 4.6052 2.0 2.3026
# 1000 6.9078 2.0 3.4539
# 100000 11.5129 2.0 5.7565
# 표본이 커질수록 BIC 가 점점 더 엄격해집니다. 둘은 다른 목표를 갖습니다
# 같은 자료에서 기준마다 다른 모형을 고릅니다
# 참 변수가 5 개인 자료를 600 번 만들어 각 기준이 고른 크기를 셉니다
# 기준 고른 크기의 평균 정확히 5 개 참을 다 담음 잡음도 담음
# adj 11.6633 0.2117 1.0000 0.7883
# aic 6.2850 0.6583 1.0000 0.3417
# aicc 5.6850 0.7333 1.0000 0.2667
# bic 5.0550 0.9533 1.0000 0.0467
# 조정 R^2 과 AIC 는 참보다 큰 모형을 자주 고릅니다
# BIC 는 정확히 5 개를 가장 자주 맞힙니다. 벌점이 세기 때문입니다
# 네 기준 모두 참을 빠뜨리는 일은 드뭅니다. 문제는 잡음을 얹는 것입니다
# 신호가 약하면 이야기가 달라집니다
# 참 계수의 크기 AIC 가 고른 크기 BIC 가 고른 크기 AIC 가 참을 담음 BIC 가 참을 담음
# 0.2 5.9400 3.2033 0.7900 0.3367
# 0.4 6.1933 5.0133 1.0000 0.9867
# 0.6 6.5633 5.0600 1.0000 1.0000
# 1.0 6.5467 5.0333 1.0000 1.0000
# 신호가 0.2 로 약하면 BIC 가 참 변수를 자주 빠뜨립니다
# AIC 는 더 많이 담는 대신 잡음도 함께 담습니다. 목표가 다릅니다
# BIC 는 참 모형을 맞히려 하고 AIC 는 예측을 잘하려 합니다
# 변수를 하나씩 넣고 빼는 절차가 널리 쓰입니다
# p 값이 가장 작은 것부터 넣고 0.05 를 못 넘으면 멈춥니다
# 참 효과가 하나도 없는 자료에서 그 절차를 돌립니다
# 후보 변수 수 하나라도 고를 비율 고른 변수 수의 평균 독립이면
# 1 0.0680 0.0680 0.0500
# 5 0.2500 0.2720 0.2262
# 10 0.4000 0.5020 0.4013
# 20 0.6900 1.0980 0.6415
# 40 0.8920 2.3900 0.8715
# 후보가 20 개면 효과가 하나도 없는데도 절반 넘게 무언가를 고릅니다
# 182강 문제 5 의 눈으로 고르기와 같습니다. 절차가 자동일 뿐입니다
# 고른 뒤의 p 값과 계수가 부풀어 있습니다
# 참 효과가 없는 20 개 후보에서 골라낸 변수의 값을 봅니다
# 무엇 값
# 고른 변수의 계수 절댓값 평균 0.218636
# 참 계수 0.000000
# 고른 뒤 p 값의 평균 0.044666
# 고른 뒤 p 가 0.05 아래일 비율 0.672333
# 참 계수가 0 인데 골라낸 계수의 절댓값이 0.2186 입니다
# 183강 문제 3 의 승자의 저주가 변수 선택에서 그대로 일어납니다
# 고른 뒤의 p 값을 그대로 보고하면 안 됩니다. 고르는 과정을 안 셌기 때문입니다
# 기준 대신 새 자료의 예측 오차로 고를 수도 있습니다
# 훈련 200 개로 고르고 새 자료 5000 개에서 오차를 잽니다
# 넣은 변수 수 훈련 평균제곱오차 새 자료 오차 AIC BIC
# 1 2.661679 2.431732 767.3668 773.9634
# 3 1.782735 1.668986 691.2051 704.3984
# 5 1.009668 0.997357 581.4998 601.2897
# 8 0.994236 1.016895 584.4192 614.1041
# 12 0.971258 1.038984 587.7427 630.6208
# 20 0.951440 1.066518 599.6197 668.8844
# 훈련 오차는 계속 내려가고 새 자료 오차는 5 근처에서 가장 낮습니다
# AIC 가 새 자료 오차와 같은 자리에서 가장 작아집니다. 그것이 AIC 의 목표입니다
# 교차검증으로도 같은 자리를 찾습니다
# 훈련 자료를 5 겹으로 나눠 돌려 가며 잽니다
# 넣은 변수 수 5겹 교차검증 오차 새 자료 오차 차이
# 1 2.701272 2.431732 0.269540
# 3 1.923790 1.668986 0.254804
# 5 1.077981 0.997357 0.080624
# 8 1.110120 1.016895 0.093225
# 12 1.150691 1.038984 0.111707
# 20 1.252993 1.066518 0.186475
# 교차검증 오차가 새 자료 오차를 잘 따라갑니다. 조금 크게 나오는 편입니다
# 훈련 자료가 5 분의 4 로 줄어 모형이 조금 나빠지기 때문입니다
# 선택까지 교차검증 안에 넣어야 합니다
# 참 효과가 없는 자료에서 두 절차의 교차검증 오차를 견줍니다
# 무엇을 겹 안에서 하는가 교차검증 오차 평균 참값
# 고르기를 밖에서 함 0.939609 1.0
# 고르기를 겹 안에서 함 1.197855 1.0
# 밖에서 고르면 오차가 1.0 보다 작게 나옵니다. 관계가 없는데도 잘 맞힙니다
# 겹 안에서 고르면 1.0 위로 올라옵니다. 162강 문제 2 의 누출 그대로입니다
# 목적에 따라 고르는 기준이 달라집니다
# 목적 무엇을 쓰는가 왜
# 예측이 목적 AIC 나 교차검증 예측 오차를 최소화
# 참 모형을 찾음 BIC 표본이 크면 맞힙니다
# 한 계수의 해석 고르지 않습니다 그림이 정합니다
# 변수가 아주 많음 라쏘나 정규화 한꺼번에 줄입니다
# 보고할 p 값 선택 후 추론 고른 과정을 세야 합니다
# 셋째 줄이 185강 문제 5 의 결론입니다. 해석이 목적이면 자료로 고르면 안 됩니다
# 선택한 뒤의 구간은 포함률을 잃습니다
# 참 효과가 하나도 없는 20 개 변수에서 두 가지 구간을 만듭니다
# 하나는 미리 정한 첫 변수이고 하나는 t 가 가장 큰 변수입니다
# 무엇 포함률 구간의 평균 폭 목표
# 미리 정한 첫 변수 0.9485 0.444180 0.95
# t 가 가장 큰 변수 0.3387 0.432625 0.95
# 구간의 폭은 거의 같은데 포함률만 무너집니다
# 폭이 아니라 중심이 밀린 것입니다. 고르는 순간 계수가 0 에서 멀어집니다
# 182강 문제 5 와 같습니다. 보정할 비교의 수를 셀 수가 없습니다
# 정직하게 하는 방법들을 정리합니다
# 방법 무엇을 하는가
# 자료 분할 고르는 몫과 재는 몫을 나눕니다
# 선택 후 추론 고른 사건을 조건으로 답니다
# 안정성 선택 여러 부분표본에서 자주 뽑히는 것만
# 정규화 고르는 대신 다 넣고 줄입니다
# 미리 정하기 자료를 보기 전에 목록을 적습니다
# 첫째 줄이 가장 단순하고 확실합니다. 대신 표본을 절반 씁니다
# 마지막 줄이 178강부터 되풀이된 결론입니다. 자료를 보고 고르면 안 됩니다