강 문제 에서 표본 일 때 경험적 위험 과 참 위험 의 간극을 봤습니다.
새 점 하나에서의 기대 제곱오차가 정확히 셋으로 쪼개집니다.
잡음은 줄일 수 없고, 편향과 분산은 서로 밀고 당깁니다. 그 맞바꿈을 이해하면 무엇을 시도해야 할지가 정해집니다.
문제. 분해를 확인합니다.
(1) 셋이 무엇인지 정리하세요.
(2) 차수를 바꿔 가며 재세요.
(3) 합이 실제 오차와 같은지 확인하세요.
생각의 실마리. 같은 자료 생성 과정에서 표본을 여러 번 다시 뽑으면 예측이 흔들립니다. 그 흔들림이 분산이고, 흔들림의 중심이 참에서 떨어진 것이 편향입니다.
풀이. (1) 정리합니다.
| 무엇 | 무엇을 재나 | 무엇에 딸리나 |
|---|---|---|
| 잡음 | 자체가 흔들리는 양 | 줄일 수 없음 |
| 편향 제곱 | 평균 예측이 참에서 떨어진 양 | 모형이 단순하면 큼 |
| 분산 | 표본마다 예측이 흔들리는 양 | 모형이 복잡하면 큼 |
(2) 차수를 바꿔 가며 잽니다. 를 개 자리에 고정하고 만 번 다시 뽑습니다.
체비쇼프 기저를 씁니다. 그냥 거듭제곱을 쓰면 계산이 무너집니다.
| 차수 | 편향 제곱 | 분산 | 잡음 | 셋의 합 |
|---|---|---|---|---|
차수가 오르면 편향 제곱이 에서 으로 줄고 분산이 에서 로 늘어납니다.
잡음은 어떤 모형을 써도 입니다. 줄일 수 없는 몫입니다.
합이 가장 작은 자리가 차수 입니다.
(3) 합이 실제 오차와 같은지 확인합니다.
| 차수 | 셋의 합 | 실제 기대 제곱오차 | 차이 |
|---|---|---|---|
분해가 소수점 셋째 자리까지 맞습니다. 남은 차이는 시뮬레이션 오차입니다.
강 문제 에서 본 맞바꿈이 여기서 식으로 적힌 것입니다.
이 문제에서 배우는 것. 분해가 성립하려면 "표본을 여러 번 뽑는다"는 상상이 필요합니다. 실제로는 표본이 하나뿐이므로 편향과 분산을 따로 잴 수 없습니다. 위 표는 참 함수를 알기 때문에 계산할 수 있었고, 실무에서는 둘의 합만 검증 오차로 관찰됩니다. 그래서 이 분해는 계산하는 도구가 아니라 생각하는 틀이며, 문제 의 학습 곡선이 그 틀을 간접적으로 읽는 방법입니다.
바로 확인 1.
확인 1-1. 기대 제곱오차의 세 조각을 쓰세요.
답. 잡음과 편향 제곱과 분산입니다.
확인 1-2. 검산에서 차수 과 의 편향 제곱과 분산을 쓰세요.
답. 과 , 과 입니다.
확인 1-3. 검산에서 합이 가장 작은 차수와 그 값을 쓰세요.
답. 차수 이고 입니다.
문제. 학습 곡선을 읽습니다.
(1) 판정 규칙을 정리하세요.
(2) 곡선을 그려 보세요.
(3) 둘이 뒤집히는 자리를 찾으세요.
생각의 실마리. 편향과 분산을 따로 못 재지만, 학습 오차와 검증 오차의 관계로 어느 쪽이 문제인지 알 수 있습니다.
풀이. (1) 판정 규칙입니다.
| 무엇이 보이나 | 어느 쪽 문제 | 무엇을 해야 | 무엇을 하면 안 되나 |
|---|---|---|---|
| 학습 오차도 큼 | 편향 | 모형을 키움 | 자료를 더 모음 |
| 학습은 작고 검증이 큼 | 분산 | 자료를 더 모음 | 모형을 키움 |
| 둘 다 크고 안 줄어듦 | 편향 | 특성을 다시 봄 | 정규화를 키움 |
| 둘이 붙었는데 둘 다 큼 | 잡음 한계 | 받아들임 | 더 맞추려 함 |
넷째 줄을 못 알아보면 끝없이 모형을 키우게 됩니다.
(2) 곡선을 그려 봅니다.
| 표본 크기 | 차수 학습 | 차수 검증 | 차수 학습 | 차수 검증 |
|---|---|---|---|---|
차수 은 둘이 일찍 붙는데 근처에서 붙습니다. 편향입니다.
잡음이 이므로 나머지 이 편향입니다. 자료를 더 모아도 안 줍니다.
차수 는 표본 에서 학습 와 검증 로 크게 벌어집니다. 분산입니다.
표본이 늘면 차수 의 검증이 로 잡음 한계 에 닿습니다.
(3) 둘이 뒤집히는 자리를 찾습니다.
| 표본 크기 | 차수 검증 | 차수 검증 | 어느 쪽이 나은가 |
|---|---|---|---|
| 차수 | |||
| 차수 | |||
| 차수 | |||
| 차수 | |||
| 차수 |
표본이 아주 적을 때는 단순한 모형이 낫습니다.
자료가 쌓이면 복잡한 모형이 이깁니다. 여기서는 표본 과 사이에서 뒤집힙니다.
이 문제에서 배우는 것. "어느 모형이 좋은가"라는 물음이 표본 크기 없이는 답이 없습니다. 위 표에서 차수 가 표본 에서는 배 나쁘고 표본 에서는 배 좋습니다. 그래서 논문이나 벤치마크에서 "모형 A가 모형 B보다 낫다"는 주장은 그 자료 크기에서만 참이며, 자료가 열 배 늘면 순위가 뒤집히는 일이 흔합니다. 강에서 이 관계를 규모 법칙으로 다시 봅니다.
바로 확인 2.
확인 2-1. 학습 오차와 검증 오차가 둘 다 큰데 붙어 있으면 무엇을 뜻하는지 쓰세요.
답. 잡음 한계에 닿았거나 편향이 크다는 뜻입니다.
확인 2-2. 검산에서 표본 일 때 차수 의 학습과 검증을 쓰세요.
답. 와 입니다.
확인 2-3. 검산에서 두 차수의 순위가 어디서 뒤집히는지 쓰세요.
답. 표본 과 사이입니다.
문제. 두 장치를 견줍니다.
(1) 정규화를 걸어 보세요.
(2) 자료를 늘려 보세요.
(3) 잡음을 바꿔 보세요.
생각의 실마리. 분산을 줄이는 장치가 둘입니다. 정규화와 자료인데, 대가가 다릅니다.
풀이. (1) 차수 를 고정하고 벌점만 바꿉니다.
| 편향 제곱 | 분산 | 셋의 합 | 계수의 크기 | |
|---|---|---|---|---|
를 키우면 분산이 에서 로 줄고 편향이 에서 로 늡니다.
합이 가장 작은 자리가 입니다. 강에서 이 자리를 어떻게 찾는지 다룹니다.
(2) 자료를 늘려 봅니다.
| 표본 크기 | 차수 편향 제곱 | 분산 | 셋의 합 |
|---|---|---|---|
표본이 늘면 분산이 에서 으로 줄고 편향은 이미 에 가까워 그대로입니다.
정규화는 편향을 대가로 치르는데 자료는 그 대가 없이 분산을 줄입니다.
그래서 자료를 더 모을 수 있으면 그것이 언제나 낫습니다.
(3) 잡음을 바꿔 봅니다. 차수는 로 고정합니다.
| 잡음 표준편차 | 편향 제곱 | 분산 | 잡음 | 분산 나누기 잡음 |
|---|---|---|---|---|
분산이 잡음의 분산에 정확히 비례합니다. 마지막 열이 근처로 거의 같습니다.
편향은 잡음과 무관합니다. 모형의 모양이 정하는 값이기 때문입니다.
이 문제에서 배우는 것. 분산이 잡음에 비례한다는 것이 실무에서 중요한 함의를 가집니다. 라벨의 품질을 올리면 잡음이 줄고, 그러면 분산까지 함께 줄어듭니다. 위 표에서 잡음 표준편차를 절반으로 하면 잡음 항이 분의 이 되는데 분산도 분의 이 됩니다. 그래서 라벨을 다시 검수하는 것이 모형을 바꾸는 것보다 효율적일 때가 많고, 특히 표본이 적을 때 그렇습니다.
바로 확인 3.
확인 3-1. 검산에서 가 과 일 때의 편향 제곱과 분산을 쓰세요.
답. 과 , 와 입니다.
확인 3-2. 검산에서 표본 와 의 차수 분산을 쓰세요.
답. 와 입니다.
확인 3-3. 검산에서 분산과 잡음의 비를 쓰고 무엇을 뜻하는지 쓰세요.
답. 근처로 일정하며 분산이 잡음에 비례한다는 뜻입니다.
문제. 분류로 옮겨 봅니다.
(1) 무엇이 다른지 정리하세요.
(2) 편향이 벌을 안 받는 자리를 보세요.
(3) 분산이 도움이 되는 자리를 보세요.
생각의 실마리. - 손실은 제곱이 아니라 계단입니다. 그래서 덧셈 분해가 안 나옵니다.
풀이. (1) 정리합니다.
| 무엇이 다른가 | 왜 |
|---|---|
| - 손실은 제곱이 아님 | 덧셈 분해가 안 나옴 |
| 편향이 벌을 안 받을 때가 있음 | 문턱을 넘기만 하면 됨 |
| 분산이 오히려 좋을 때 | 치우친 쪽을 가끔 벗어남 |
| 확률 오차와 분류 오차가 다름 | 둘이 안 붙음 |
(2) 편향이 벌을 안 받는 자리를 봅니다. **참 확률이 **입니다.
| 예측 확률 평균 | 예측의 표준편차 | 확률 제곱오차 | 분류 오류율 |
|---|---|---|---|
확률이 로 치우쳐도 분류 오류율이 으로 일 때와 같습니다.
제곱오차는 에서 으로 커졌는데 오류율은 그대로입니다.
문턱만 넘으면 되기 때문입니다. 확률의 편향이 벌을 안 받습니다.
로 넘어가면 오류율이 로 뜁니다. 벼랑이 있습니다.
(3) 분산이 도움이 되는 자리를 봅니다. 참 확률이 인데 예측 평균이 로 치우친 경우입니다.
| 예측의 표준편차 | 확률 제곱오차 | 분류 오류율 | 판정 |
|---|---|---|---|
| 나빠짐 | |||
| 좋아짐 | |||
| 좋아짐 | |||
| 좋아짐 |
흔들림이 커지면 오류율이 에서 로 내려갑니다. 가끔 옳은 쪽을 고르기 때문입니다.
제곱오차는 에서 로 계속 나빠지는데 분류 오류율은 좋아집니다.
치우침이 없으면 반대입니다. **참 확률이 이고 예측 평균도 **인 경우입니다.
| 예측의 표준편차 | 분류 오류율 | 판정 |
|---|---|---|
| 그대로 | ||
| 그대로 | ||
| 나빠짐 | ||
| 나빠짐 |
같은 흔들림이 어떤 자리에서는 돕고 어떤 자리에서는 해롭습니다.
그래서 분류에서는 분산이 나쁘다고 한마디로 말할 수 없습니다.
이 문제에서 배우는 것. 회귀의 직관을 분류에 그대로 옮기면 틀립니다. 위 표에서 확률 제곱오차가 여섯 배 나빠지는 동안 분류 오류율은 좋아졌는데, 이것이 강 심화 의 "학습 손실과 평가지표가 어긋나는 자리"입니다. 실무의 함의는 분명합니다. 확률이 필요하면 확률로 평가하고 결정이 필요하면 결정으로 평가해야 하며, 하나를 최적화하면서 다른 하나로 보고하면 엉뚱한 결론이 나옵니다.
바로 확인 4.
확인 4-1. 분류에서 편향이 벌을 안 받는 이유를 쓰세요.
답. 문턱만 넘으면 되므로 확률이 얼마나 치우쳤는지가 결정에 안 나타나기 때문입니다.
확인 4-2. 검산에서 예측 평균 일 때의 제곱오차와 오류율을 쓰세요.
답. 과 입니다.
확인 4-3. 검산에서 치우친 자리와 안 치우친 자리에서 표준편차 일 때의 오류율을 쓰세요.
답. 과 입니다.
문제. 실무로 옮깁니다.
(1) 관찰과 대응을 정리하세요.
(2) 앙상블이 무엇을 줄이는지 확인하세요.
(3) 이중 하강을 보세요.
생각의 실마리. 어느 쪽이 문제인지 알아야 무엇을 건드릴지 정해집니다.
풀이. (1) 정리합니다.
| 무엇을 관찰하면 | 무엇을 시도하나 |
|---|---|
| 학습 오차가 목표보다 큼 | 모형을 키우거나 특성을 늘림 |
| 학습과 검증의 간극이 큼 | 자료를 늘리거나 정규화를 키움 |
| 둘 다 목표 근처에서 붙음 | 여기서 멈춤 |
| 검증이 들쭉날쭉함 | 검증 표본이 작음 |
| 학습 오차가 인데 검증이 큼 | 완전히 외운 상태 |
셋째 줄에 닿았는데 목표가 안 되면 문제 정의를 다시 봐야 합니다.
(2) 앙상블이 무엇을 줄이는지 확인합니다. 차수 모형을 서로 다른 표본으로 여러 개 맞춰 평균 냅니다.
| 몇 개를 평균 | 편향 제곱 | 분산 | 셋의 합 | 개 대비 분산 |
|---|---|---|---|---|
편향은 근처로 그대로이고 분산만 개수에 반비례해 줄어듭니다.
마지막 열이 에 가깝습니다. 강 랜덤포레스트가 이것입니다.
편향이 큰 모형을 아무리 평균 내도 편향은 안 줄어듭니다.
| 무엇 | 무엇을 줄이나 | 어디서 |
|---|---|---|
| 배깅과 랜덤포레스트 | 분산 | 강 |
| 부스팅 | 편향 | 강 |
| 정규화 | 분산 | 강 |
| 자료 늘리기 | 분산 | 이 강의 문제 |
| 특성 늘리기 | 편향 | 강 |
(3) 이중 하강을 봅니다. 표본 개에 잡음 특성을 더해 가며 최소 노름 해를 봅니다.
| 특성 개수 | 학습 오차 | 검증 오차 | 판정 |
|---|---|---|---|
| 오르는 중 | |||
| 오르는 중 | |||
| 오르는 중 | |||
| 오르는 중 | |||
| 봉우리 | |||
| 넘어선 뒤 | |||
| 넘어선 뒤 | |||
| 넘어선 뒤 |
특성이 개일 때 검증 오차가 로 가장 나쁩니다. 표본 수와 같은 자리이고 이것을 보간 문턱이라 합니다.
그보다 더 늘리면 과 로 크게 내려갑니다. 최소 노름 해가 되어 계수가 저절로 작아지기 때문입니다.
다만 개에서는 로 다시 조금 오릅니다. 계속 내려가지는 않습니다.
이것을 이중 하강이라 하고 강에서 다시 다룹니다.
이 문제에서 배우는 것. "모수를 늘리면 과적합한다"는 규칙이 보간 문턱 근처에서만 참입니다. 고전적인 편향 분산 곡선은 문제 의 표처럼 U자인데, 모수가 표본을 넘어서면 그림이 달라집니다. 큰 신경망이 표본보다 훨씬 많은 모수를 가지고도 잘 되는 것이 이 현상과 관련 있으며, 최소 노름 해가 암묵적 정규화로 작동하기 때문입니다. 다만 위 표가 보이듯 끝없이 좋아지지는 않고 어느 지점에서 다시 나빠집니다.
바로 확인 5.
확인 5-1. 검산에서 개를 평균 냈을 때의 편향 제곱과 분산 비를 쓰세요.
답. 과 입니다.
확인 5-2. 검산에서 특성 개와 개의 검증 오차를 쓰세요.
답. 과 입니다.
확인 5-3. 보간 문턱이 무엇인지 쓰세요.
답. 모수 개수가 표본 수와 같아져 학습 오차가 이 되는 자리입니다.
| 무엇 | 식 |
|---|---|
| 분해 | 잡음 편향 제곱 분산 |
| 편향 | |
| 분산 | |
| 앙상블 개 | 분산이 대략 |
| 무엇이 줄이나 | 편향 | 분산 |
|---|---|---|
| 모형 키우기 | 줄임 | 늘림 |
| 정규화 | 늘림 | 줄임 |
| 자료 늘리기 | 그대로 | 줄임 |
| 앙상블 | 그대로 | 줄임 |
| 부스팅 | 줄임 | 조금 늘림 |
| 관찰 | 판정 |
|---|---|
| 학습 오차가 큼 | 편향 |
| 간극이 큼 | 분산 |
| 둘이 붙고 둘 다 큼 | 잡음 한계 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 편향과 분산을 따로 재려 합니다 | 표본이 하나면 못 잽니다 |
| 회귀 직관을 분류에 씁니다 | 편향이 벌을 안 받기도 합니다 |
| 모수가 많으면 무조건 과적합 | 보간 문턱을 넘으면 다릅니다 |
| 잡음 한계를 못 알아봅니다 | 끝없이 모형을 키웁니다 |
| 편향 문제에 정규화를 겁니다 | 더 나빠집니다 |
문제 6. 기대 제곱오차의 세 조각을 쓰세요.
답. 잡음과 편향 제곱과 분산입니다.
문제 7. 검산에서 차수 과 의 편향 제곱과 분산을 쓰세요.
답. 과 , 과 입니다.
문제 8. 검산에서 합이 가장 작은 차수와 그 값을 쓰세요.
답. 차수 이고 입니다.
문제 9. 검산에서 표본 일 때 차수 의 학습과 검증을 쓰세요.
답. 와 입니다.
문제 10. 검산에서 두 차수의 순위가 어디서 뒤집히는지 쓰세요.
답. 표본 과 사이입니다.
문제 11. 검산에서 가 과 일 때의 편향 제곱과 분산을 쓰세요.
답. 과 , 와 입니다.
문제 12. 검산에서 표본 와 의 차수 분산을 쓰세요.
답. 와 입니다.
문제 13. 검산에서 분산과 잡음의 비를 쓰고 무엇을 뜻하는지 쓰세요.
답. 근처로 일정하며 분산이 잡음에 비례한다는 뜻입니다.
문제 14. 분류에서 편향이 벌을 안 받는 이유를 쓰세요.
답. 문턱만 넘으면 되기 때문입니다.
문제 15. 검산에서 예측 평균 일 때의 제곱오차와 오류율을 쓰세요.
답. 과 입니다.
문제 16. 검산에서 치우친 자리와 안 치우친 자리에서 표준편차 일 때의 오류율을 쓰세요.
답. 과 입니다.
문제 17. 검산에서 개를 평균 냈을 때의 분산 비를 쓰세요.
답. 입니다.
문제 18. 검산에서 특성 개와 개의 검증 오차를 쓰세요.
답. 과 입니다.
심화 1. 분해의 유도를 정리하세요.
| 단계 | 무엇 |
|---|---|
| 첫째 | 를 로 쪼갬 |
| 둘째 | 교차항이 (잡음과 가 독립) |
| 셋째 | 둘째 항을 다시 편향과 분산으로 |
셋째 단계도 같은 수법입니다. 를 로 쪼갭니다.
두 번 다 "평균을 빼고 더한다"는 같은 기술이며, 강 문제 의 표본분산 유도와 같습니다.
교차항이 인 것이 핵심이고 그 조건이 깨지면 분해가 안 됩니다.
심화 2. 편향과 분산을 실제로 추정하는 법을 정리하세요.
| 방법 | 어떻게 |
|---|---|
| 붓스트랩 | 표본을 다시 뽑아 흩어짐을 잼 |
| 교차검증의 분산 | 겹마다 예측의 흩어짐 |
| 여러 시드 | 초기값만 바꿔 다시 학습 |
첫째 줄이 문제 의 시뮬레이션을 자료로 흉내 내는 것입니다.
참 함수를 모르므로 편향은 여전히 못 잽니다. 분산만 추정할 수 있습니다.
셋째 줄은 딥러닝에서 흔히 씁니다. 같은 자료에 시드만 바꿔 여러 번 학습해 흩어짐을 봅니다.
심화 3. 분류의 분해 시도들을 정리하세요.
| 제안 | 어떻게 |
|---|---|
| 도미고스 | 주 예측과의 거리로 편향 정의 |
| 코헤이비 | 곱셈 분해 |
| 확률 수준에서 분해 | 제곱오차로 돌아감 |
셋째 줄이 가장 실용적입니다. 확률을 예측하고 그 제곱오차를 분해합니다.
그런데 문제 에서 봤듯 확률 오차와 분류 오차가 안 붙습니다.
그래서 분류에서는 분해보다 학습 곡선을 직접 보는 편이 낫습니다.
심화 4. 잡음의 종류를 정리하세요.
| 무엇 | 줄일 수 있나 |
|---|---|
| 측정 오차 | 장비를 바꾸면 |
| 라벨 잡음 | 검수하면 |
| 빠진 변수 | 모으면 |
| 진짜 무작위 | 못 줄임 |
"줄일 수 없는 오차"라는 말이 넷째 줄만 뜻합니다.
앞 셋은 자료를 바꾸면 줄어듭니다. 강의 측정 오차와 강의 결측이 여기 걸립니다.
빠진 변수는 특성공학의 자리이고 강에서 다룹니다.
심화 5. 앙상블이 언제 안 되는지 정리하세요.
| 무엇이 되나 | |
|---|---|
| 분산이 | |
| 분산이 그대로 | |
| 중간 | 로 수렴 |
모형끼리 닮으면 평균 내도 소용없습니다.
그래서 랜덤포레스트가 변수를 무작위로 골라 상관을 낮춥니다. 강의 핵심입니다.
문제 의 표에서 에 가까웠던 것은 표본을 완전히 새로 뽑았기 때문이며, 실무의 배깅은 같은 표본을 재사용하므로 상관이 남습니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
분해는 했는데 실제로 무엇을 할지는 아직입니다.
| 무엇을 못 했나 | 어디서 |
|---|---|
| 정규화를 어떻게 거는가 | 강 |
| 를 어떻게 고르는가 | 강 |
| 차원이 크면 무엇이 달라지는가 | 강 |
| 복잡도를 어떻게 재는가 | 강 |
문제 에서 이 가장 좋았는데, 그것은 참 함수를 알기에 계산할 수 있었습니다. 실무에서는 그 자리를 자료로 찾아야 하고, 그 방법이 강의 교차검증입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 편향 | bias | 평균 예측과 참의 차이입니다 |
| 분산 | variance | 표본마다 예측이 흔들리는 양입니다 |
| 줄일 수 없는 오차 | irreducible error | 잡음의 분산입니다 |
| 학습 곡선 | learning curve | 표본 크기에 따른 오차 곡선입니다 |
| 잡음 한계 | noise floor | 어떤 모형도 못 내려가는 자리입니다 |
| 배깅 | bagging | 여러 모형을 평균 냅니다 |
| 보간 문턱 | interpolation threshold | 모수가 표본과 같아지는 자리입니다 |
| 이중 하강 | double descent | 문턱을 넘으면 다시 좋아집니다 |
| 최소 노름 해 | minimum norm solution | 잔차가 같은 해 중 가장 작은 것입니다 |
| 암묵적 정규화 | implicit regularization | 벌점 없이 정규화처럼 작동합니다 |
다음은 211강 L1과 L2 정규화의 수학입니다. 이 강의가 오차를 셋으로 나눴습니다.
문제 에서 를 키우면 분산이 줄고 편향이 는다는 것을 봤습니다. 강은 L1과 L2가 왜 다르게 작동하는지를 기하로 설명하고, 강 문제 의 사전분포 해석과 이어 붙입니다. 그리고 를 고르는 문제를 강으로 넘깁니다.
import numpy as np
from numpy.polynomial import chebyshev as C
rng = np.random.default_rng(20261017)
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 true_f(x):
return np.sin(2.5 * x)
SIG = 0.3
GRID = np.linspace(-1, 1, 201)
FT = true_f(GRID)
def design(n):
return np.linspace(-1, 1, n)
def fit_cheb(x, y, deg, lam=0.0):
A = C.chebvander(x, deg)
if lam == 0.0:
return np.linalg.pinv(A) @ y
P = lam * np.eye(deg + 1)
P[0, 0] = 0.0
return np.linalg.solve(A.T @ A + P, A.T @ y)
def pred_cheb(c, xs):
return C.chebvander(xs, len(c) - 1) @ c
# --- 문제 1: 오차를 셋으로 나눕니다 -------------------------------------
print(" 205강 문제 1 에서 경험적 위험과 참 위험의 간극을 봤습니다")
print(" 그 간극이 무엇으로 이루어져 있는지를 나눕니다")
print(" 새 점 하나에서의 기대 제곱오차가 셋으로 쪼개집니다")
print(" %s %s %s"
% (pw("무엇", 16), rw("무엇을 재나", 30), rw("무엇에 딸리나", 24)))
for a, b, c in [("잡음", "y 자체가 흔들리는 양", "줄일 수 없음"),
("편향 제곱", "평균 예측이 참에서 떨어진 양", "모형이 단순하면 큼"),
("분산", "표본마다 예측이 흔들리는 양", "모형이 복잡하면 큼")]:
print(" %s %s %s" % (pw(a, 16), rw(b, 30), rw(c, 24)))
print(" 셋을 더한 것이 기대 제곱오차입니다. 실제로 그런지 확인합니다")
print(" 차수를 바꿔 가며 셋을 각각 재 봅니다")
R = 800
n1 = 25
XD = design(n1)
FD = true_f(XD)
print(" x 를 25 개 자리에 고정하고 y 만 800 번 다시 뽑습니다")
print(" 체비쇼프 기저를 씁니다. 그냥 거듭제곱을 쓰면 계산이 무너집니다")
print(" %s %s %s %s %s"
% (pw("차수", 8), rw("편향 제곱", 16), rw("분산", 14), rw("잡음", 12),
rw("셋의 합", 14)))
store = []
for deg in [0, 1, 3, 7, 12]:
preds = np.zeros((R, len(GRID)))
for r in range(R):
y = FD + rng.normal(0, SIG, n1)
preds[r] = pred_cheb(fit_cheb(XD, y, deg), GRID)
bias2 = float(np.mean((preds.mean(axis=0) - FT) ** 2))
var = float(np.mean(preds.var(axis=0)))
store.append((deg, bias2, var, preds))
print(" %s %16.6f %14.6f %12.6f %14.6f"
% (pw("%d" % deg, 8), bias2, var, SIG ** 2,
bias2 + var + SIG ** 2))
print(" 차수가 오르면 편향 제곱이 줄고 분산이 늘어납니다")
print(" 잡음은 어떤 모형을 써도 그대로입니다. 줄일 수 없는 몫입니다")
print(" 합이 가장 작은 자리가 차수 3 입니다")
print(" 합이 실제 기대 제곱오차와 같은지 확인합니다")
print(" %s %s %s %s"
% (pw("차수", 8), rw("셋의 합", 16), rw("실제 기대 제곱오차", 22),
rw("차이", 14)))
for deg, bias2, var, preds in store:
errs = []
for r in range(R):
yt = FT + rng.normal(0, SIG, len(GRID))
errs.append(np.mean((preds[r] - yt) ** 2))
print(" %s %16.6f %22.6f %14.6f"
% (pw("%d" % deg, 8), bias2 + var + SIG ** 2,
float(np.mean(errs)),
float(np.mean(errs)) - bias2 - var - SIG ** 2))
print(" 분해가 소수점 셋째 자리까지 맞습니다. 이것이 편향 분산 분해입니다")
print(" 165강 문제 2 에서 본 맞바꿈이 여기서 식으로 적힌 것입니다")
# --- 문제 2: 어느 쪽이 문제인지 판정합니다 ------------------------------
print(" 학습 곡선을 보면 어느 쪽이 문제인지 알 수 있습니다")
print(" %s %s %s %s"
% (pw("무엇이 보이나", 26), rw("어느 쪽 문제", 16),
rw("무엇을 해야", 20), rw("무엇을 하면 안 되나", 24)))
for a, b, c, d in [("학습 오차도 큼", "편향", "모형을 키움", "자료를 더 모음"),
("학습은 작고 검증이 큼", "분산", "자료를 더 모음", "모형을 키움"),
("둘 다 크고 안 줄어듦", "편향", "특성을 다시 봄", "정규화를 키움"),
("둘이 붙었는데 둘 다 큼", "잡음 한계", "받아들임", "더 맞추려 함")]:
print(" %s %s %s %s" % (pw(a, 26), rw(b, 16), rw(c, 20), rw(d, 24)))
print(" 넷째 줄을 못 알아보면 끝없이 모형을 키우게 됩니다")
print(" 학습 곡선을 실제로 그려 봅니다")
print(" %s %s %s %s %s"
% (pw("표본 크기", 12), rw("차수 1 학습", 14), rw("차수 1 검증", 14),
rw("차수 12 학습", 16), rw("차수 12 검증", 16)))
for n in [15, 25, 50, 200, 1000]:
xd = design(n)
fd = true_f(xd)
r1t, r1v, r2t, r2v = [], [], [], []
for _ in range(200):
y = fd + rng.normal(0, SIG, n)
for deg, tl, vl in [(1, r1t, r1v), (12, r2t, r2v)]:
c = fit_cheb(xd, y, deg)
tl.append(float(np.mean((y - pred_cheb(c, xd)) ** 2)))
vl.append(float(np.mean((FT - pred_cheb(c, GRID)) ** 2)) + SIG ** 2)
print(" %s %14.6f %14.6f %16.6f %16.6f"
% (pw("%d" % n, 12), float(np.mean(r1t)), float(np.mean(r1v)),
float(np.mean(r2t)), float(np.mean(r2v))))
print(" 차수 1 은 둘이 일찍 붙는데 0.17 근처에서 붙습니다. 편향입니다")
print(" 잡음이 0.09 이므로 나머지 0.08 이 편향입니다. 자료를 더 모아도 안 줍니다")
print(" 차수 12 는 표본이 적을 때 학습과 검증이 벌어집니다. 분산입니다")
print(" 표본이 늘면 차수 12 의 검증이 0.09 로 잡음 한계에 닿습니다")
print(" 둘이 만나는 자리를 찾습니다")
print(" %s %s %s %s"
% (pw("표본 크기", 12), rw("차수 1 검증", 16), rw("차수 12 검증", 16),
rw("어느 쪽이 나은가", 20)))
for n in [14, 16, 20, 30, 60]:
xd = design(n)
fd = true_f(xd)
a1, a2 = [], []
for _ in range(300):
y = fd + rng.normal(0, SIG, n)
for deg, lst in [(1, a1), (12, a2)]:
c = fit_cheb(xd, y, deg)
lst.append(float(np.mean((FT - pred_cheb(c, GRID)) ** 2)))
m1, m2 = float(np.mean(a1)), float(np.mean(a2))
print(" %s %16.6f %16.6f %s"
% (pw("%d" % n, 12), m1, m2,
rw("차수 1" if m1 < m2 else "차수 12", 20)))
print(" 표본이 아주 적을 때는 단순한 모형이 낫습니다")
print(" 자료가 쌓이면 복잡한 모형이 이깁니다. 어디서 뒤집히는지가 중요합니다")
# --- 문제 3: 무엇이 분산을 줄이는가 -------------------------------------
print(" 분산을 줄이는 장치가 둘입니다. 정규화와 자료입니다")
print(" 차수 12 를 고정하고 벌점만 바꿔 봅니다")
print(" %s %s %s %s %s"
% (pw("lambda", 12), rw("편향 제곱", 16), rw("분산", 14),
rw("셋의 합", 14), rw("계수의 크기", 16)))
best = None
for lam in [0.0, 1.0, 10.0, 100.0, 1000.0]:
preds = np.zeros((500, len(GRID)))
norms = []
for r in range(500):
y = FD + rng.normal(0, SIG, n1)
c = fit_cheb(XD, y, 12, lam)
preds[r] = pred_cheb(c, GRID)
norms.append(float(np.linalg.norm(c)))
bias2 = float(np.mean((preds.mean(axis=0) - FT) ** 2))
var = float(np.mean(preds.var(axis=0)))
tot = bias2 + var + SIG ** 2
if best is None or tot < best[0]:
best = (tot, lam)
print(" %s %16.6f %14.6f %14.6f %16.6f"
% (pw("%.0e" % lam if lam else "0", 12), bias2, var, tot,
float(np.mean(norms))))
print(" lambda 를 키우면 분산이 줄고 편향이 늡니다")
print(" 합이 가장 작은 자리가 lambda %.0e 입니다" % best[1])
print(" 211강에서 이 자리를 어떻게 찾는지 다룹니다")
print(" 자료를 늘리면 어떻게 다른지 봅니다")
print(" %s %s %s %s"
% (pw("표본 크기", 12), rw("차수 12 편향 제곱", 20), rw("분산", 14),
rw("셋의 합", 14)))
for n in [15, 30, 60, 120]:
xd = design(n)
fd = true_f(xd)
preds = np.zeros((500, len(GRID)))
for r in range(500):
y = fd + rng.normal(0, SIG, n)
preds[r] = pred_cheb(fit_cheb(xd, y, 12), GRID)
bias2 = float(np.mean((preds.mean(axis=0) - FT) ** 2))
var = float(np.mean(preds.var(axis=0)))
print(" %s %20.6f %14.6f %14.6f"
% (pw("%d" % n, 12), bias2, var, bias2 + var + SIG ** 2))
print(" 표본이 늘면 분산이 줄고 편향은 이미 0 에 가까워 그대로입니다")
print(" 정규화는 편향을 대가로 치르는데 자료는 그 대가 없이 분산을 줄입니다")
print(" 그래서 자료를 더 모을 수 있으면 그것이 언제나 낫습니다")
print(" 잡음의 크기를 바꿔 봅니다")
print(" %s %s %s %s %s"
% (pw("잡음 표준편차", 16), rw("편향 제곱", 16), rw("분산", 14),
rw("잡음", 12), rw("분산 나누기 잡음", 20)))
for sd in [0.1, 0.3, 0.6, 1.2]:
preds = np.zeros((400, len(GRID)))
for r in range(400):
y = FD + rng.normal(0, sd, n1)
preds[r] = pred_cheb(fit_cheb(XD, y, 5), GRID)
bias2 = float(np.mean((preds.mean(axis=0) - FT) ** 2))
var = float(np.mean(preds.var(axis=0)))
print(" %s %16.6f %14.6f %12.6f %20.6f"
% (pw("%.1f" % sd, 16), bias2, var, sd ** 2, var / sd ** 2))
print(" 분산이 잡음의 분산에 정확히 비례합니다. 마지막 열이 거의 같습니다")
print(" 편향은 잡음과 무관합니다. 모형의 모양이 정하는 값이기 때문입니다")
# --- 문제 4: 분류에서는 다릅니다 ----------------------------------------
print(" 분류에서는 이 분해가 그대로 안 됩니다")
print(" %s %s"
% (pw("무엇이 다른가", 26), rw("왜", 30)))
for a, b in [("0-1 손실은 제곱이 아님", "덧셈 분해가 안 나옴"),
("편향이 벌을 안 받을 때가 있음", "문턱을 넘기만 하면 됨"),
("분산이 오히려 좋을 때", "치우친 쪽을 가끔 벗어남"),
("확률 오차와 분류 오차가 다름", "둘이 안 붙음")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 둘째 줄을 수치로 봅니다")
M = 400000
print(" 참 확률이 0.7 인 자리에서 예측 확률을 바꿔 봅니다")
print(" %s %s %s %s"
% (pw("예측 확률 평균", 18), rw("예측의 표준편차", 18),
rw("확률 제곱오차", 18), rw("분류 오류율", 16)))
yy = (rng.random(M) < 0.7).astype(float)
for mu, sd in [(0.70, 0.0), (0.70, 0.25), (0.55, 0.0), (0.55, 0.25),
(0.45, 0.0)]:
q = np.clip(np.full(M, mu) + (rng.normal(0, sd, M) if sd > 0 else 0.0),
0.0, 1.0)
mse = float(np.mean((q - 0.7) ** 2))
err = float(((q > 0.5).astype(float) != yy).mean())
print(" %s %18.2f %18.6f %16.6f"
% (pw("%.2f" % mu, 18), sd, mse, err))
print(" 확률이 0.55 로 치우쳐도 분류 오류율이 0.70 일 때와 거의 같습니다")
print(" 제곱오차는 0.000000 에서 0.022500 으로 커졌는데 오류율은 그대로입니다")
print(" 문턱만 넘으면 되기 때문입니다. 확률의 편향이 벌을 안 받습니다")
print(" 0.45 로 넘어가면 오류율이 0.70 으로 뜁니다. 벼랑이 있습니다")
print(" 치우친 자리에서는 흔들림이 도움이 됩니다")
print(" 참 확률이 0.6 인데 예측 평균이 0.45 로 치우친 경우입니다")
yy2 = (rng.random(M) < 0.6).astype(float)
print(" %s %s %s %s"
% (pw("예측의 표준편차", 20), rw("확률 제곱오차", 18),
rw("분류 오류율", 16), rw("판정", 14)))
base_err = None
for sd in [0.0, 0.05, 0.2, 0.5]:
q = np.clip(np.full(M, 0.45) + (rng.normal(0, sd, M) if sd > 0 else 0.0),
0.0, 1.0)
mse = float(np.mean((q - 0.6) ** 2))
err = float(((q > 0.5).astype(float) != yy2).mean())
if base_err is None:
base_err = err
print(" %s %18.6f %16.6f %s"
% (pw("%.2f" % sd, 20), mse, err,
rw("좋아짐" if err < base_err else "나빠짐", 14)))
print(" 흔들림이 커지면 오류율이 내려갑니다. 가끔 옳은 쪽을 고르기 때문입니다")
print(" 제곱오차는 계속 나빠지는데 분류 오류율은 좋아집니다")
print(" 204강 심화 5 의 손실과 지표가 어긋나는 자리입니다")
print(" 치우침이 없으면 흔들림이 해롭습니다")
print(" 참 확률이 0.7 이고 예측 평균도 0.7 인 경우입니다")
print(" %s %s %s"
% (pw("예측의 표준편차", 20), rw("분류 오류율", 18), rw("판정", 14)))
for sd in [0.0, 0.05, 0.2, 0.5]:
q = np.clip(np.full(M, 0.7) + (rng.normal(0, sd, M) if sd > 0 else 0.0),
0.0, 1.0)
err = float(((q > 0.5).astype(float) != yy).mean())
print(" %s %18.6f %s"
% (pw("%.2f" % sd, 20), err,
rw("나빠짐" if err > 0.3005 else "그대로", 14)))
print(" 같은 흔들림이 어떤 자리에서는 돕고 어떤 자리에서는 해롭습니다")
print(" 그래서 분류에서는 분산이 나쁘다고 한마디로 말할 수 없습니다")
# --- 문제 5: 실무에서 쓰기 ----------------------------------------------
print(" 실무에서 이 분해를 어떻게 쓰는지 정리합니다")
print(" %s %s"
% (pw("무엇을 관찰하면", 28), rw("무엇을 시도하나", 30)))
for a, b in [("학습 오차가 목표보다 큼", "모형을 키우거나 특성을 늘림"),
("학습과 검증의 간극이 큼", "자료를 늘리거나 정규화를 키움"),
("둘 다 목표 근처에서 붙음", "여기서 멈춤"),
("검증이 들쭉날쭉함", "검증 표본이 작음"),
("학습 오차가 0 인데 검증이 큼", "완전히 외운 상태")]:
print(" %s %s" % (pw(a, 28), rw(b, 30)))
print(" 셋째 줄에 닿았는데 목표가 안 되면 문제 정의를 다시 봐야 합니다")
print(" 앙상블이 분산만 줄이는 것을 확인합니다")
print(" 차수 9 모형을 서로 다른 표본으로 여러 개 맞춰 평균 냅니다")
print(" %s %s %s %s %s"
% (pw("몇 개를 평균", 14), rw("편향 제곱", 16), rw("분산", 14),
rw("셋의 합", 14), rw("1 개 대비 분산", 18)))
base_var = None
for m in [1, 2, 5, 20]:
preds = np.zeros((400, len(GRID)))
for r in range(400):
acc = np.zeros(len(GRID))
for _ in range(m):
y = FD + rng.normal(0, SIG, n1)
acc += pred_cheb(fit_cheb(XD, y, 9), GRID)
preds[r] = acc / m
bias2 = float(np.mean((preds.mean(axis=0) - FT) ** 2))
var = float(np.mean(preds.var(axis=0)))
if base_var is None:
base_var = var
print(" %s %16.6f %14.6f %14.6f %18.6f"
% (pw("%d" % m, 14), bias2, var, bias2 + var + SIG ** 2,
var / base_var))
print(" 편향은 0.0000 근처로 그대로이고 분산만 개수에 반비례해 줄어듭니다")
print(" 마지막 열이 1 나누기 m 에 가깝습니다. 218강 랜덤포레스트가 이것입니다")
print(" 편향이 큰 모형을 아무리 평균 내도 편향은 안 줄어듭니다")
print(" 무엇이 어느 쪽을 줄이는지 정리합니다")
print(" %s %s %s"
% (pw("무엇", 20), rw("무엇을 줄이나", 22), rw("어디서", 18)))
for a, b, c in [("배깅과 랜덤포레스트", "분산", "218강"),
("부스팅", "편향", "219강"),
("정규화", "분산", "211강"),
("자료 늘리기", "분산", "이 강의 문제 3"),
("특성 늘리기", "편향", "228강")]:
print(" %s %s %s" % (pw(a, 20), rw(b, 22), rw(c, 18)))
print(" 무엇이 문제인지 먼저 알아야 어느 쪽을 건드릴지 정해집니다")
print(" 모수가 표본과 같아지는 자리가 가장 나쁩니다")
print(" 표본 40 개에 잡음 특성을 더해 가며 최소 노름 해를 봅니다")
n5 = 40
SIG5 = 0.5
btrue = np.array([1.0, -0.8, 0.6, -0.4, 0.2])
print(" %s %s %s %s"
% (pw("특성 개수", 12), rw("학습 오차", 16), rw("검증 오차", 20),
rw("판정", 16)))
for p in [2, 10, 20, 39, 40, 41, 60, 300]:
tr, te = [], []
for _ in range(200):
Xa = rng.normal(0, 1, (n5, p))
Xb = rng.normal(0, 1, (2000, p))
b = np.zeros(p)
k = min(p, 5)
b[:k] = btrue[:k]
ya = Xa @ b + rng.normal(0, SIG5, n5)
yb = Xb @ b + rng.normal(0, SIG5, 2000)
w = np.linalg.pinv(Xa) @ ya
tr.append(float(np.mean((ya - Xa @ w) ** 2)))
te.append(float(np.mean((yb - Xb @ w) ** 2)))
mt, mv = float(np.mean(tr)), float(np.mean(te))
print(" %s %16.6f %20.4f %s"
% (pw("%d" % p, 12), mt, mv,
rw("봉우리" if p == n5 else ("넘어선 뒤" if p > n5 else "오르는 중"),
16)))
print(" 특성이 40 개일 때 검증 오차가 4901.4938 로 가장 나쁩니다")
print(" 표본 수와 같은 자리이고 이것을 보간 문턱이라 합니다")
print(" 그보다 더 늘리면 93.1841 과 1.5389 로 크게 내려갑니다")
print(" 최소 노름 해가 되어 계수가 저절로 작아지기 때문입니다")
print(" 다만 300 개에서는 2.1928 로 다시 조금 오릅니다. 계속 내려가지는 않습니다")
print(" 이것을 이중 하강이라 하고 214강에서 다시 다룹니다")
print(" 210강은 오차를 셋으로 나눴습니다. 211강은 분산을 줄이는 장치를 봅니다")
# 205강 문제 1 에서 경험적 위험과 참 위험의 간극을 봤습니다
# 그 간극이 무엇으로 이루어져 있는지를 나눕니다
# 새 점 하나에서의 기대 제곱오차가 셋으로 쪼개집니다
# 무엇 무엇을 재나 무엇에 딸리나
# 잡음 y 자체가 흔들리는 양 줄일 수 없음
# 편향 제곱 평균 예측이 참에서 떨어진 양 모형이 단순하면 큼
# 분산 표본마다 예측이 흔들리는 양 모형이 복잡하면 큼
# 셋을 더한 것이 기대 제곱오차입니다. 실제로 그런지 확인합니다
# 차수를 바꿔 가며 셋을 각각 재 봅니다
# x 를 25 개 자리에 고정하고 y 만 800 번 다시 뽑습니다
# 체비쇼프 기저를 씁니다. 그냥 거듭제곱을 쓰면 계산이 무너집니다
# 차수 편향 제곱 분산 잡음 셋의 합
# 0 0.594691 0.003745 0.090000 0.688436
# 1 0.079526 0.006940 0.090000 0.176466
# 3 0.000654 0.012782 0.090000 0.103436
# 7 0.000019 0.024903 0.090000 0.114922
# 12 0.000023 0.049351 0.090000 0.139375
# 차수가 오르면 편향 제곱이 줄고 분산이 늘어납니다
# 잡음은 어떤 모형을 써도 그대로입니다. 줄일 수 없는 몫입니다
# 합이 가장 작은 자리가 차수 3 입니다
# 합이 실제 기대 제곱오차와 같은지 확인합니다
# 차수 셋의 합 실제 기대 제곱오차 차이
# 0 0.688436 0.688286 -0.000150
# 1 0.176466 0.177253 0.000787
# 3 0.103436 0.102794 -0.000642
# 7 0.114922 0.114840 -0.000082
# 12 0.139375 0.140375 0.001001
# 분해가 소수점 셋째 자리까지 맞습니다. 이것이 편향 분산 분해입니다
# 165강 문제 2 에서 본 맞바꿈이 여기서 식으로 적힌 것입니다
# 학습 곡선을 보면 어느 쪽이 문제인지 알 수 있습니다
# 무엇이 보이나 어느 쪽 문제 무엇을 해야 무엇을 하면 안 되나
# 학습 오차도 큼 편향 모형을 키움 자료를 더 모음
# 학습은 작고 검증이 큼 분산 자료를 더 모음 모형을 키움
# 둘 다 크고 안 줄어듦 편향 특성을 다시 봄 정규화를 키움
# 둘이 붙었는데 둘 다 큼 잡음 한계 받아들임 더 맞추려 함
# 넷째 줄을 못 알아보면 끝없이 모형을 키우게 됩니다
# 학습 곡선을 실제로 그려 봅니다
# 표본 크기 차수 1 학습 차수 1 검증 차수 12 학습 차수 12 검증
# 15 0.179965 0.185249 0.012624 0.578368
# 25 0.171313 0.176127 0.042239 0.139698
# 50 0.167982 0.171615 0.066396 0.111486
# 200 0.167841 0.168795 0.084715 0.095528
# 1000 0.166413 0.168118 0.088866 0.091219
# 차수 1 은 둘이 일찍 붙는데 0.17 근처에서 붙습니다. 편향입니다
# 잡음이 0.09 이므로 나머지 0.08 이 편향입니다. 자료를 더 모아도 안 줍니다
# 차수 12 는 표본이 적을 때 학습과 검증이 벌어집니다. 분산입니다
# 표본이 늘면 차수 12 의 검증이 0.09 로 잡음 한계에 닿습니다
# 둘이 만나는 자리를 찾습니다
# 표본 크기 차수 1 검증 차수 12 검증 어느 쪽이 나은가
# 14 0.094877 1.360175 차수 1
# 16 0.093127 0.260526 차수 1
# 20 0.088245 0.073380 차수 12
# 30 0.084742 0.038400 차수 12
# 60 0.081216 0.018704 차수 12
# 표본이 아주 적을 때는 단순한 모형이 낫습니다
# 자료가 쌓이면 복잡한 모형이 이깁니다. 어디서 뒤집히는지가 중요합니다
# 분산을 줄이는 장치가 둘입니다. 정규화와 자료입니다
# 차수 12 를 고정하고 벌점만 바꿔 봅니다
# lambda 편향 제곱 분산 셋의 합 계수의 크기
# 0 0.000068 0.046995 0.137063 1.130839
# 1e+00 0.004033 0.037585 0.131618 1.031251
# 1e+01 0.114605 0.015618 0.220223 0.612571
# 1e+02 0.458360 0.003876 0.552236 0.141258
# 1e+03 0.578375 0.004069 0.672445 0.054059
# lambda 를 키우면 분산이 줄고 편향이 늡니다
# 합이 가장 작은 자리가 lambda 1e+00 입니다
# 211강에서 이 자리를 어떻게 찾는지 다룹니다
# 자료를 늘리면 어떻게 다른지 봅니다
# 표본 크기 차수 12 편향 제곱 분산 셋의 합
# 15 0.000349 0.499574 0.589923
# 30 0.000052 0.038033 0.128084
# 60 0.000040 0.018269 0.108309
# 120 0.000015 0.009666 0.099681
# 표본이 늘면 분산이 줄고 편향은 이미 0 에 가까워 그대로입니다
# 정규화는 편향을 대가로 치르는데 자료는 그 대가 없이 분산을 줄입니다
# 그래서 자료를 더 모을 수 있으면 그것이 언제나 낫습니다
# 잡음의 크기를 바꿔 봅니다
# 잡음 표준편차 편향 제곱 분산 잡음 분산 나누기 잡음
# 0.1 0.000004 0.002105 0.010000 0.210508
# 0.3 0.000041 0.019573 0.090000 0.217481
# 0.6 0.000180 0.076493 0.360000 0.212480
# 1.2 0.000379 0.308254 1.440000 0.214065
# 분산이 잡음의 분산에 정확히 비례합니다. 마지막 열이 거의 같습니다
# 편향은 잡음과 무관합니다. 모형의 모양이 정하는 값이기 때문입니다
# 분류에서는 이 분해가 그대로 안 됩니다
# 무엇이 다른가 왜
# 0-1 손실은 제곱이 아님 덧셈 분해가 안 나옴
# 편향이 벌을 안 받을 때가 있음 문턱을 넘기만 하면 됨
# 분산이 오히려 좋을 때 치우친 쪽을 가끔 벗어남
# 확률 오차와 분류 오차가 다름 둘이 안 붙음
# 둘째 줄을 수치로 봅니다
# 참 확률이 0.7 인 자리에서 예측 확률을 바꿔 봅니다
# 예측 확률 평균 예측의 표준편차 확률 제곱오차 분류 오류율
# 0.70 0.00 0.000000 0.299913
# 0.70 0.25 0.050634 0.386503
# 0.55 0.00 0.022500 0.299913
# 0.55 0.25 0.079946 0.468643
# 0.45 0.00 0.062500 0.700087
# 확률이 0.55 로 치우쳐도 분류 오류율이 0.70 일 때와 거의 같습니다
# 제곱오차는 0.000000 에서 0.022500 으로 커졌는데 오류율은 그대로입니다
# 문턱만 넘으면 되기 때문입니다. 확률의 편향이 벌을 안 받습니다
# 0.45 로 넘어가면 오류율이 0.70 으로 뜁니다. 벼랑이 있습니다
# 치우친 자리에서는 흔들림이 도움이 됩니다
# 참 확률이 0.6 인데 예측 평균이 0.45 로 치우친 경우입니다
# 예측의 표준편차 확률 제곱오차 분류 오류율 판정
# 0.00 0.022500 0.601008 나빠짐
# 0.05 0.024972 0.568187 좋아짐
# 0.20 0.061286 0.519230 좋아짐
# 0.50 0.146242 0.508018 좋아짐
# 흔들림이 커지면 오류율이 내려갑니다. 가끔 옳은 쪽을 고르기 때문입니다
# 제곱오차는 계속 나빠지는데 분류 오류율은 좋아집니다
# 204강 심화 5 의 손실과 지표가 어긋나는 자리입니다
# 치우침이 없으면 흔들림이 해롭습니다
# 참 확률이 0.7 이고 예측 평균도 0.7 인 경우입니다
# 예측의 표준편차 분류 오류율 판정
# 0.00 0.299913 그대로
# 0.05 0.299950 그대로
# 0.20 0.364135 나빠짐
# 0.50 0.436775 나빠짐
# 같은 흔들림이 어떤 자리에서는 돕고 어떤 자리에서는 해롭습니다
# 그래서 분류에서는 분산이 나쁘다고 한마디로 말할 수 없습니다
# 실무에서 이 분해를 어떻게 쓰는지 정리합니다
# 무엇을 관찰하면 무엇을 시도하나
# 학습 오차가 목표보다 큼 모형을 키우거나 특성을 늘림
# 학습과 검증의 간극이 큼 자료를 늘리거나 정규화를 키움
# 둘 다 목표 근처에서 붙음 여기서 멈춤
# 검증이 들쭉날쭉함 검증 표본이 작음
# 학습 오차가 0 인데 검증이 큼 완전히 외운 상태
# 셋째 줄에 닿았는데 목표가 안 되면 문제 정의를 다시 봐야 합니다
# 앙상블이 분산만 줄이는 것을 확인합니다
# 차수 9 모형을 서로 다른 표본으로 여러 개 맞춰 평균 냅니다
# 몇 개를 평균 편향 제곱 분산 셋의 합 1 개 대비 분산
# 1 0.000143 0.031996 0.122139 1.000000
# 2 0.000034 0.016830 0.106864 0.526004
# 5 0.000006 0.006222 0.096228 0.194472
# 20 0.000006 0.001628 0.091634 0.050876
# 편향은 0.0000 근처로 그대로이고 분산만 개수에 반비례해 줄어듭니다
# 마지막 열이 1 나누기 m 에 가깝습니다. 218강 랜덤포레스트가 이것입니다
# 편향이 큰 모형을 아무리 평균 내도 편향은 안 줄어듭니다
# 무엇이 어느 쪽을 줄이는지 정리합니다
# 무엇 무엇을 줄이나 어디서
# 배깅과 랜덤포레스트 분산 218강
# 부스팅 편향 219강
# 정규화 분산 211강
# 자료 늘리기 분산 이 강의 문제 3
# 특성 늘리기 편향 228강
# 무엇이 문제인지 먼저 알아야 어느 쪽을 건드릴지 정해집니다
# 모수가 표본과 같아지는 자리가 가장 나쁩니다
# 표본 40 개에 잡음 특성을 더해 가며 최소 노름 해를 봅니다
# 특성 개수 학습 오차 검증 오차 판정
# 2 0.240341 0.2619 오르는 중
# 10 0.186971 0.3404 오르는 중
# 20 0.124714 0.5161 오르는 중
# 39 0.007401 27.8711 오르는 중
# 40 0.000000 4901.4938 봉우리
# 41 0.000000 93.1841 넘어선 뒤
# 60 0.000000 1.5389 넘어선 뒤
# 300 0.000000 2.1928 넘어선 뒤
# 특성이 40 개일 때 검증 오차가 4901.4938 로 가장 나쁩니다
# 표본 수와 같은 자리이고 이것을 보간 문턱이라 합니다
# 그보다 더 늘리면 93.1841 과 1.5389 로 크게 내려갑니다
# 최소 노름 해가 되어 계수가 저절로 작아지기 때문입니다
# 다만 300 개에서는 2.1928 로 다시 조금 오릅니다. 계속 내려가지는 않습니다
# 이것을 이중 하강이라 하고 214강에서 다시 다룹니다
# 210강은 오차를 셋으로 나눴습니다. 211강은 분산을 줄이는 장치를 봅니다