지난 시간에는 메일 44통에 규칙을 여덟 개까지 붙여 봤지만 77.3%에서 멈췄습니다.
그래서 "데이터로 배우게 하자"는 데까지 왔지요. 그런데 배우게 하려면 무엇을 배우라고 할지부터
정해야 합니다. 오늘은 우리 학교 급식 잔반 기록 60일치를 놓고 그 칸을 채웁니다.
성취기준 12인기02-01
목표 변수입력 특성성공 기준기준선평균오차 MAE데이터 누수
🎯 학습 목표
하나의 실생활 문제를 목표 변수 · 입력 특성 · 성공 기준 세 칸으로 적을 수 있다.
기준선(baseline)을 직접 계산하고, 그 값과 나란히 놓아야 성공 기준이 뜻을 가진다는 것을 설명할 수 있다.
특성 하나를 켜고 끄며 성능이 어떻게 달라지는지 재고, 데이터 누수가 일어나는 특성을
스스로 만들어 낸 다음 그것이 왜 반칙인지 말할 수 있다.
🤔
여는 장면 — "잔반 좀 줄이자"는 AI에게 시킬 수 없는 말
점심시간이 끝난 급식실 뒤편입니다. 커다란 잔반통 세 개가 거의 가득 찼습니다.
영양 선생님이 한숨을 쉬며 말합니다. "인공지능으로 이것 좀 어떻게 안 될까?"
세 사람이 곧바로 대답합니다. 그런데 세 대답이 서로 다른 문제입니다.
영양 선생님
"남는 밥을 줄이고 싶어요. 예산도 아깝고 환경에도 나쁘잖아요."
→ 목표가 '줄이는 것'이다. 무엇을 맞히라는 말은 아직 없다.
학생회장
"많이 남을 것 같은 날을 전날에 알려 주면 좋겠어요. 홍보라도 하게요."
→ 맞힐 것: 내일 잔반이 많을까 적을까. 답이 둘 중 하나다.
조리실무사님
"저는 몇 킬로그램 남을지 숫자로 알고 싶어요. 그래야 배식량을 조절하죠."
→ 맞힐 것: 오늘 잔반량 몇 kg. 답이 숫자다.
세 사람은 같은 잔반통을 보고 있지만, 컴퓨터에게 시킬 수 있는 일은 뒤의 둘뿐입니다.
"줄이고 싶다"는 바람이고, "많을까 적을까"와 "몇 kg일까"는 물음입니다.
인공지능은 바람을 받지 못합니다. 물음만 받습니다.
그리고 둘 중 어느 물음을 고르느냐에 따라 모으는 데이터도, 답을 채점하는 방법도 통째로 달라집니다.
밥과 돈가스, 깍두기, 파스타 샐러드, 국, 방울토마토가 담긴 급식 한 끼입니다.
이 판에 담긴 음식 가운데 얼마가 잔반통으로 갈까요?
학교마다 정하기 나름이지만, 우리 표라면 이런 날은 메뉴 칸에 '양식'이라고 적었을 겁니다.
우리가 다룰 데이터는 이런 한 끼가 60일치 쌓인 기록입니다.
출처: Laurunia2002, Wikimedia Commons (CC0)
다행히 우리 학교 급식실에는 기록이 있습니다. 조리실무사님이 매일 잔반통을 저울에 올려
무게를 적어 두셨고, 행정실은 급식 인원과 메뉴를 따로 관리하고 있었습니다.
두 기록을 붙였더니 12주 × 5일 = 60일치 표가 나왔습니다. 앞의 여덟 줄만 볼까요.
회차
요일
메뉴
기온(℃)
시험기간
급식인원
만족도
잔반kg
많음
1
월
특식
24.5
0
428
3.8
10.1
0
2
화
중식
23.5
0
417
3.3
12.3
1
3
수
양식
26.0
0
426
2.2
18.8
1
4
목
한식
24.6
0
421
3.3
14.8
1
5
금
분식
22.4
0
420
4.3
6.8
0
6
월
분식
25.1
0
428
3.5
11.3
0
7
화
중식
23.9
0
415
3.6
12.1
1
8
수
한식
22.5
0
420
2.6
18.1
1
60일치 가운데 앞 여덟 줄입니다. 잔반량은 가장 적은 날 3.5kg, 가장 많은 날 20.6kg,
평균 11.49kg이었습니다. 맨 오른쪽 '많음' 칸이 무엇인지는 3절에서 밝힙니다 —
지금은 그냥 0과 1이 적혀 있다고만 보세요.
표를 보면 벌써 눈에 걸리는 것이 있습니다. 3번 날(수요일, 양식)은 18.8kg이 남았고
5번 날(금요일, 분식)은 6.8kg밖에 안 남았습니다. 거의 세 배 차이입니다.
요일 때문일까요, 메뉴 때문일까요, 아니면 그날 유난히 더웠기 때문일까요?
눈으로 보고 짐작하는 것과, 재서 확인하는 것은 다릅니다.
💭 오늘의 물음
우리 학교 급식 잔반 문제를 인공지능에게 넘기려면
무엇을 맞히게 하고, 무엇을 보고 맞히게 하고, 얼마나 맞혀야 성공이라고 부를 것인가?
이 세 물음에 숫자가 붙은 답을 내는 것이 오늘 40분의 목표입니다.
1
문제 정의는 세 칸을 채우는 일이다
인공지능 프로젝트가 실패하는 자리는 대개 알고리즘이 아닙니다. 시작하는 자리입니다.
"무엇을 만들 것인가"가 흐릿한 채로 데이터부터 모으면, 몇 주 뒤에 아무도 그 결과가 좋은지 나쁜지
말하지 못하는 상황이 옵니다. 그것을 막는 장치가 문제 정의이고,
문제 정의는 다음 세 칸을 채우는 일입니다.
문제 정의의 세 칸. 이 차시가 끝날 때 여러분의 공책에 이 세 칸이 채워져 있어야 합니다.
① 목표 변수 — 답이 될 칸 하나를 고른다
목표 변수는
표의 열 하나입니다. 우리 표에서는 잔반kg을 고를 수도 있고 많음을 고를 수도 있습니다.
둘은 같은 잔반 이야기지만 전혀 다른 문제가 됩니다.
고른 목표 변수
답의 모양
문제의 갈래
채점 방법
누가 원했나
잔반kg
숫자 (3.5 ~ 20.6)
회귀
평균 몇 kg 벗어났나
조리실무사님
많음 (0/1)
둘 중 하나
분류
백 번 중 몇 번 맞혔나
학생회장
같은 데이터, 같은 문제 상황인데 목표 변수를 무엇으로 적느냐에 따라 채점 방법까지 달라집니다.
오늘은 회귀 쪽, 그러니까 잔반kg을 목표 변수로 삼아 걸어가겠습니다.
숫자를 맞히는 문제가 성공 기준을 이야기하기에 더 정직하기 때문입니다. 다만 손으로 해 보는 시간에는
분류 쪽도 함께 재 볼 겁니다. 두 답이 어떻게 다르게 생겼는지 눈으로 봐야 하니까요.
⚠️ 목표 변수가 없는 말들
아래 셋은 언뜻 프로젝트 제목처럼 들리지만, 맞힐 것이 없어서 시작할 수 없습니다.
"학교를 더 좋게 만드는 AI" — 무엇을 맞히나요?
"급식 만족도를 높이는 AI" — 높이는 것은 사람이 하는 일입니다. 맞힐 값이 아닙니다.
"학생들의 마음을 이해하는 AI" — '이해'는 표의 열이 될 수 없습니다.
② 입력 특성 — 무엇을 보고 맞힐 것인가
특성은
목표 변수를 뺀 나머지 열 가운데 우리가 쓰기로 고른 것들입니다.
표에 있다고 다 특성이 되는 것이 아닙니다. 여기가 오늘의 진짜 승부처이고, 3절에서 두 개의 체로 거를 겁니다.
③ 성공 기준 — 얼마나 맞혀야 성공인가
세 칸 가운데 학생들이 가장 자주 비워 두는 칸입니다. 비워 두면 어떻게 될까요?
프로젝트가 끝난 날 이런 대화가 오갑니다.
📖 성공 기준이 없는 발표회
— "저희 모델은 정확도 80%가 나왔습니다!"
— "80%면 잘한 건가요?"
— "…네, 열 번 중 여덟 번 맞혔으니까요."
— "아무 생각 없이 늘 '적음'이라고만 찍으면 몇 %인가요?"
— "…재 본 적 없습니다."
이 마지막 물음에 답하지 못하면 80%는 좋은 소식인지 나쁜 소식인지 알 수 없는 숫자입니다.
그 답을 미리 재 두는 것이 다음 절의 기준선입니다.
2
성공 기준은 기준선과 나란히 놓아야 뜻이 생긴다
기준선(baseline)은
학습이라고 부르기도 민망한, 가장 단순한 예측입니다.
우리 문제에서 가장 단순한 예측은 무엇일까요? 아무것도 안 보고 늘 같은 숫자만 답하는 것입니다.
그럼 늘 무슨 숫자를 답하면 좋을까요? 60일치의 전체 평균 11.49kg이 무난합니다.
월요일이든 수요일이든, 한식이든 분식이든, 무조건 "11.49kg 남을 겁니다"라고 답하는 모델입니다.
바보 같아 보이지만 이 모델도 성적을 매길 수 있습니다.
평균오차를 손으로 재 본다
성적을 매기려면 틀린 정도를 숫자 하나로 줄여야 합니다.
가장 쉬운 방법은 하루하루 얼마나 벗어났는지를 재서 평균을 내는 것입니다.
이것을 평균절대오차(MAE,
mean absolute error)라고 부르고, 이 책에서는 그냥 평균오차라고 쓰겠습니다.
앞의 세 날로 직접 해 봅시다.
회차
실제 잔반
예측(늘 평균)
차이
|차이|
1
10.1 kg
11.49 kg
-1.39
1.39
2
12.3 kg
11.49 kg
+0.81
0.81
3
18.8 kg
11.49 kg
+7.31
7.31
세 날의 |차이| 평균은 (1.39 + 0.81 + 7.31) ÷ 3 = 3.17kg입니다.
60일 전부에 대해 같은 계산을 하면 2.628kg이 나옵니다.
⚠️ 절댓값을 빼먹으면 벌어지는 일
위 표에서 |차이| 대신 차이를 그냥 더하면
-1.39 + 0.81 + 7.31이 되어 마이너스와 플러스가 서로 지웁니다.
60일 전부를 그렇게 더하면 값이 거의 정확히 0이 나와요. 평균으로 예측했으니 당연합니다.
"평균 오차 0.00kg!"이라는 결과를 받고 좋아하면 안 됩니다. 그건 잘 맞혔다는 뜻이 아니라
위로 틀린 것과 아래로 틀린 것이 서로 지웠다는 뜻입니다.
오늘 실습 코드의 첫 번째 빈칸이 바로 이 자리입니다.
기준선 사다리 — 특성을 하나씩 더하면 오차가 얼마나 주나
아무것도 안 보는 모델이 2.628kg이었습니다. 이제 요일만 봐 봅시다.
월요일에는 월요일들의 평균을, 수요일에는 수요일들의 평균을 답하는 겁니다.
데이터를 요일별로 다섯 칸에 나눠 담고, 각 칸의 평균을 그 칸의 답으로 쓰는 방법이지요.
60일치의 요일별 평균은 이렇게 나왔습니다.
요일
월
화
수
목
금
평균 잔반(kg)
12.1
11.2
15.4
10.5
8.2
수요일이 유난히 많고 금요일이 유난히 적습니다. 차이가 7.2kg이나 됩니다.
왜 그럴까요? 이 물음은 잠시 접어 두고, 먼저 이 표로 예측하면 오차가 얼마나 주는지부터 봅시다.
같은 방법으로 메뉴별·시험기간별, 그리고 둘·셋을 한꺼번에 묶은 칸까지 만들어 재면
사다리가 하나 나옵니다. 아래는 오늘 실습 코드가 실제로 찍어 주는 값입니다.
무엇을 보고 예측하나
칸 수
평균오차(kg)
기준선 대비
아무것도 안 봄 (늘 전체 평균)
1
2.628
—
요일만
5
1.984
24.5% 감소
메뉴만
5
2.401
8.6% 감소
시험기간만
2
2.465
6.2% 감소
요일 + 메뉴
23
1.116
57.5% 감소
요일 + 메뉴 + 시험기간
31
0.677
칸이 너무 많다
이 여섯 줄은 오늘 실습 코드 【2】가 그대로 찍어 줍니다. 값을 외우지 말고 직접 돌려서 확인하세요.
읽을 것이 세 가지 있습니다.
요일 하나로 24.5%가 줄었다. 2.628 → 1.984kg.
'요일'이라는 낱말 하나를 알려 준 것뿐인데 오차가 4분의 1쯤 사라졌습니다.
좋은 특성 하나가 복잡한 알고리즘보다 낫다는 것을 이 한 줄이 보여 줍니다.
어느 특성이 셀지는 재 봐야 안다. 요일(1.984)이 메뉴(2.401)보다 낫긴 하지만
격차가 크지 않습니다. 실제로 크게 준 것은 둘을 합쳤을 때(1.116)입니다.
"요일이 제일 중요할 거야"라는 짐작만으로 특성을 골랐다면 절반을 놓쳤을 겁니다.
맨 아랫줄은 좋아 보이지만 함정이다. 칸이 31개인데 데이터는 60줄뿐입니다.
칸 하나에 평균 두 줄씩 들어 있어요. 그러니 "칸 평균"이라고 해 봐야 사실상
그 두 날의 값을 외운 것입니다. 이 함정의 이름이 과적합(overfitting)이고,
11차시에서 정면으로 다룹니다.
그래서 합격선은 1.98kg이다
이제 성공 기준을 정할 수 있습니다. 우리가 만들 인공지능은 평균오차 1.98kg보다 잘해야 합니다.
요일별 평균이라는 초등학생도 할 수 있는 방법이 이미 1.984kg을 냈으니까요.
그것을 못 이기는 인공지능은 만들 이유가 없습니다.
💡 왜 0.677kg을 합격선으로 삼으면 안 되나
사다리 맨 아랫줄이 더 낮은데 왜 그걸 합격선으로 안 쓸까요?
기준선은 가장 단순한 모델이어야 하기 때문입니다.
0.677kg은 칸 31개짜리 모델이 자기가 외운 데이터에서 낸 성적입니다.
내일 처음 보는 날에 대해서도 그만큼 할 거라는 보장이 전혀 없어요.
기준선을 부풀리면 진짜 모델이 아무리 잘해도 "기준선도 못 넘었다"는 잘못된 판정을 받습니다.
기준선은 낮게, 그러나 정직하게 잡습니다.
분류 쪽 기준선도 미리 재 둡시다. 많음을 맞히는 문제에서 가장 단순한 방법은
늘 한쪽으로만 찍는 것입니다. 60일 가운데 '많음'이 28일, '적음'이 32일이었으니
무조건 '적음'이라고만 답해도 53.3%가 맞습니다.
아까 발표회에서 나온 "정확도 80%"라는 말은, 이 문제에서라면
53.3%짜리 찍기보다 26.7%포인트 나은 것이라는 뜻이 됩니다. 이제 말에 뜻이 붙었습니다.
평균오차 말고도 오차를 재는 자가 더 있습니다. 크게 틀린 날을 더 무겁게 치는 자인데,
맨 끝 더 알아보기에서 그림으로 견주어 봅니다.
3
무엇으로 맞힐까 — 특성을 거르는 두 개의 체
표에는 열이 아홉 개 있습니다. 목표 변수로 쓸 잔반kg과 많음을 빼면
후보가 일곱 개 남습니다. 회차 · 요일 · 메뉴 · 기온 · 시험기간 · 급식인원 · 만족도.
이 일곱을 전부 넣으면 될까요? 그러면 안 됩니다. 두 개의 체로 걸러야 합니다.
체 ① — 이 특성은 잔반과 함께 움직이는가
첫 번째 체는 쉽습니다. 잔반량이 오르내릴 때 같이 오르내리는가를 봅니다.
두 숫자가 함께 움직이는 정도를 하나의 수로 줄인 것이
상관계수(correlation coefficient)이고
보통 r이라고 씁니다. −1에서 +1 사이 값을 가지며, 0에 가까울수록 "따로 논다"는 뜻입니다.
특성
r
읽는 법
만족도 (1~5)
-0.961
만족도가 낮은 날 잔반이 많다. 압도적으로 세다
시험기간 (0/1)
+0.369
시험 기간에 더 남는다
기온 (℃)
+0.293
더운 날 조금 더 남는다
회차 (1~60)
-0.243
학기가 갈수록 조금 준다
급식인원 (명)
+0.046
거의 아무 관계 없다 — 그럴듯한 미끼
r의 부호는 방향, 크기는 세기입니다. 급식인원은 "사람이 많으면 많이 남겠지"라는 짐작이
그럴듯한데, 실제로는 +0.046으로 거의 무관합니다. 재 보지 않으면 결코 알 수 없는 사실입니다.
여기서 표를 두 번 봐야 합니다. 맨 위가 만족도이고 값이 −0.961입니다.
두 번째로 센 시험기간(+0.369)의 2.6배입니다. 인공지능 프로젝트에서 이런 열을 찾으면 보통은 축제 분위기가 됩니다.
그런데 이 특성은 쓸 수 없습니다. 왜인지는 두 번째 체에서 밝히겠습니다.
⚠️ 상관계수를 쓰면 안 되는 자리 — 순서 없는 값
위 표에 요일과 메뉴가 빠져 있습니다. 사다리에서 가장 셌던 두 특성인데요.
빠뜨린 것이 아니라 넣을 수 없어서 뺐습니다. 상관계수는 숫자에만 쓸 수 있는 자인데
'월요일'과 '한식'은 숫자가 아니니까요.
억지로 번호를 매겨 볼 수는 있습니다. 한식 1, 중식 2, 양식 3, 분식 4, 특식 5.
그렇게 재면 r = -0.474가 나옵니다. 꽤 센 음의 관계처럼 보이지요.
그런데 번호를 매기는 순서만 바꾸면 이렇게 됩니다.
번호를 매긴 순서
r
결론이라고 우기면
한식 중식 양식 분식 특식
-0.474
"뒤쪽 메뉴일수록 덜 남는다"
분식 특식 한식 양식 중식
+0.317
"뒤쪽 메뉴일수록 더 남는다"
특식 분식 중식 양식 한식
+0.480
"뒤쪽 메뉴일수록 훨씬 더 남는다"
같은 데이터, 같은 공식인데 결론이 정반대로 뒤집힙니다.
요일도 마찬가지여서 월화수목금 순은 −0.345, 금목수화월 순은 +0.345입니다. 부호가 통째로 바뀌지요.
순서가 없는 값에 번호를 매겨 상관계수를 재면 안 됩니다.
그럴 때는 2절에서 한 것처럼 칸별 평균을 봅니다. 그 자는 순서를 요구하지 않으니까요.
체 ② — 예측하는 그 순간에 이 값이 내 손에 있는가
두 번째 체가 오늘의 핵심입니다. 상관계수는 과거 데이터 안에서 잰 값입니다.
그러나 우리가 쓸 모델은 미래를 향해 씁니다. 그러니 물어야 합니다.
"예측하려는 그 시각에, 이 값을 실제로 알 수 있는가?"
급식 잔반 예측이 실제로 쓰이려면 아침에 답이 나와야 합니다.
조리실무사님이 배식량을 조절하려면 늦어도 오전에는 알아야 하니까요. 그 시각을 시간 축 위에 놓아 봅시다.
빨간 세로선이 예측 시점입니다. 선 오른쪽에서 만들어지는 값은 특성이 될 수 없습니다.
과거 데이터 표에는 얌전히 적혀 있어서 눈에 잘 안 띕니다.
이렇게 예측 시점에 알 수 없는 값이 특성 속으로 섞여 들어가는 것을
데이터 누수(data leakage)라고 합니다.
누수가 있으면 성적표가 아주 좋게 나오기 때문에 가장 발견하기 어려운 종류의 실패입니다.
우리 표에는 누수가 두 가지 유형으로 심어져 있습니다.
누수 유형 ㉠ — 정답에서 만들어 낸 값
이제 표의 맨 오른쪽 많음 칸이 무엇인지 밝힐 때가 됐습니다.
그 칸은 하늘에서 떨어진 것이 아니라 우리가 만든 값입니다.
많음 = 1 (잔반kg ≥ 11.5) · 0 (그 밖)
급식실에서 "11.5kg 넘게 남으면 많이 남은 날로 친다"고 정한 기준을 그대로 옮겨 적은 것입니다.
그렇다면 잔반kg을 특성으로 넣고 많음을 맞히면 어떻게 될까요?
정확도 100.0%입니다. 당연합니다 — 답을 만들어 낸 재료를 그대로 넣었으니까요.
시험 문제의 답을 문제지 여백에 적어 두고 푼 셈입니다.
누수 유형 ㉡ — 아직 존재하지 않는 값
㉠은 그래도 눈에 띕니다. 잡기 어려운 것은 ㉡입니다. 만족도가 그렇습니다.
행사장에서 방문객이 종이 설문지에 답을 적고 있습니다. 설문은 겪은 뒤에 묻는 것이지요.
급식 만족도도 마찬가지로 급식이 다 끝난 뒤 걷습니다. 그러니 아침 8시 20분에는 존재하지 않는 값입니다.
상관계수는 −0.961로 가장 셌지만, 오늘 예측에는 한 방울도 쓸 수 없습니다.출처: Carin fuerst, Wikimedia Commons (CC BY-SA 3.0 AT)
만족도는 정답 자체가 아닙니다. 그래서 표를 훑어봐도 반칙처럼 보이지 않습니다.
상관계수를 재면 −0.961로 최고이고, 그것 하나로 '많음/적음'을 맞히면 91.7%가 나옵니다.
요일·메뉴·시험기간을 다 합쳐서 낸 85.0%보다 높아요. 아무 의심 없이 쓰게 됩니다.
그런데 만족도 설문은 점심을 다 먹고 난 뒤 걷습니다.
만족도를 알게 되는 시각에는 이미 잔반통 무게도 알고 있습니다. 예측할 것이 남아 있지 않아요.
이 모델은 실제로 쓰는 순간 입력이 비어서 아무 답도 못 냅니다.
💡 누수는 이렇게 생긴다 — 다른 예 셋
병원 진단 모델에 '처방된 약'을 넣는다. 그 약은 의사가 병을 진단한 뒤에 처방한 것입니다.
중고 거래 사기 예측에 '신고 접수 여부'를 넣는다. 신고는 사기가 벌어진 다음에 들어옵니다.
중간고사 성적 예측에 '기말고사 성적'을 넣는다. 아직 치르지도 않은 시험입니다.
셋 다 표 위에서는 아무 문제 없어 보이는 열입니다.
시간 축을 그려 봐야 걸립니다. 그래서 실무자들은 특성 하나하나에
"이 값은 언제 생기는가"를 적어 두는 표를 따로 만듭니다.
두 체를 통과한 특성 목록
후보
체 ① 관계가 있나
체 ② 아침에 있나
판정
요일
칸별 평균 8.2~15.4kg
있다 (달력)
쓴다
메뉴
칸별 평균 9.5~14.1kg
있다 (식단표)
쓴다
기온
r = +0.293
있다 (예보)
쓴다
시험기간
r = +0.369
있다 (학사일정)
쓴다
급식인원
r = +0.046
있다 (예정 인원)
넣어는 보되 기대는 말 것
만족도
r = -0.961
없다 (13:20 설문)
뺀다 — 누수 ㉡
잔반kg
정답 그 자체
없다 (13:10 계량)
뺀다 — 누수 ㉠
회차
r = -0.243
있다
뺀다 — 날짜는 외우기용 번호일 뿐
회차를 빼는 까닭은 손으로 해 보는 시간에 직접 확인합니다. 켜 보면 오차가 0.000kg이 되는데,
그것이 왜 기쁜 일이 아닌지 스스로 밟아 보게 될 겁니다.
4
데이터는 어디서 오고, 이름표는 누가 붙이는가
여기까지는 표가 이미 있다고 치고 이야기했습니다. 실제 프로젝트에서는 그 표를 만드는 일이
전체 시간의 절반을 훌쩍 넘깁니다. 데이터는 어디서 올까요? 크게 네 갈래입니다.
갈래
급식 잔반 예
비용
최신성
믿을 만한가
직접 기록
매일 잔반통을 저울에 올려 적는다
가장 비싸다
오늘 것까지
우리 학교 사정에 딱 맞는다
공공데이터
기상청 기온, 교육청 학교알리미 급식 정보
거의 공짜
보통 며칠~몇 달 늦다
정확하지만 우리 학교 사정은 없다
센서
잔반통 밑에 무게 센서를 달아 자동 기록
설치가 비싸다
실시간
고장·오작동을 사람이 못 알아챈다
기존 시스템 기록
급식 관리 프로그램의 식수·식단 이력
이미 쌓여 있다
최신
다른 목적으로 만든 것이라 빈칸이 많다
우리 문제에는 직접 기록 + 공공데이터(기온)의 조합이 맞습니다.
잔반량은 우리 학교에서만 나오는 값이라 다른 데서 구할 수 없고, 기온은 굳이 우리가 잴 필요가 없으니까요.
이름표(정답)는 공짜가 아니다
여기서 한 가지가 더 남습니다. 표의 목표 변수 칸, 곧
이름표(정답, label)는
누군가 사람이 붙인 것입니다. 기온이나 급식인원은 이미 어딘가에 적혀 있지만,
"이 날은 잔반이 많았다"는 판정은 누군가 저울을 읽고 기준과 견주어 적어야 나옵니다.
이름표의 출발점은 저울 눈금입니다. 사진의 주방용 저울은 메달 묶음을 82g으로 읽었는데,
앞면에 적힌 최대 용량이 10000g입니다 — 잔반이 많은 날의 잔반통은 이 저울로는 잴 수조차 없지요.
어떤 저울을 쓰느냐, 언제 재느냐, 국물을 빼느냐 넣느냐에 따라
같은 날에도 다른 숫자가 적힙니다. 그 흔들림이 그대로 모델의 한계가 됩니다.
출처: Kpubkalanami, Wikimedia Commons (CC BY-SA 4.0)
이름표를 붙이는 일에는 언제나 세 가지 물음이 따라붙습니다.
누가 붙이나. 조리실무사님 한 분이 계속 붙이면 기준이 일정합니다.
당번 학생이 돌아가며 붙이면 사람마다 기준이 달라집니다.
어떤 기준으로 붙이나. 우리는 11.5kg을 경계로 삼았습니다.
그런데 이 숫자는 누가 정했을까요? 근거가 없으면 결과 전체가 흔들립니다.
손으로 해 보는 시간에 이 경계를 직접 움직여 볼 겁니다.
얼마나 드나. 60일치를 모으는 데 12주가 걸렸습니다.
하루 3분씩 60일이면 3시간입니다. 사진 10만 장에 이름표를 붙이는 프로젝트라면
사람 여럿이 몇 달을 씁니다. 이름표는 데이터에서 가장 비싼 부분입니다.
⚠️ 기준이 흔들리면 데이터가 흔들린다
같은 잔반통을 놓고 두 사람이 이렇게 적었다고 해 봅시다.
가 학생 — 국물을 따라 버리고 고형물만 재서 9.2kg, '적음'
나 학생 — 통째로 저울에 올려 13.4kg, '많음'
같은 날인데 이름표가 반대입니다. 이런 줄이 데이터에 섞이면 모델은
서로 모순되는 답을 동시에 배우게 되고, 아무리 좋은 알고리즘을 써도 그 부분은 절대 맞히지 못합니다.
막는 방법은 알고리즘이 아니라 이름표 지침입니다 —
"국물을 포함해 통째로 잰다 · 배식 종료 20분 뒤에 잰다 · 저울은 급식실 A저울로 통일한다"처럼
글로 적어 모두가 같은 것을 보게 만드는 것이지요.
ℹ️ 기준을 바꾸면 성적표가 바뀐다 (실제로 재 본 값)
'많음'의 경계를 11.5kg에서 13.0kg으로 올려 봤습니다.
그러면 '많음'인 날이 28일에서 17일로 줄고, 요일+메뉴+시험기간 모델의 정확도가
85.0% → 91.7%로 올라갑니다. 성적이 좋아졌네요!
그런데 같은 조건에서 늘 '적음'이라고만 찍는 모델의 정확도도
53.3% → 71.7%로 같이 올라갑니다. 기준을 올려 '많음'인 날을 희귀하게 만들었으니
찍기만 해도 잘 맞게 된 것이지요. 91.7%는 실력이 아니라 기준을 바꿔 얻은 숫자입니다.
기준선을 함께 재지 않으면 이 사기를 알아챌 수 없습니다.
이 실험은 오늘 시뮬레이터의 슬라이더로 직접 해 봅니다.
💻
손으로 — 특성을 켜고 끄며 반칙을 직접 만들어 본다
아래 특성 고르기 판은 지금까지 이야기한 그 60일치 기록 그대로입니다.
체크박스를 켜면 그 특성으로 데이터를 칸에 나누고, 칸마다 평균을 내서 60일 전부를 다시 예측한 뒤
그 자리에서 오차와 정확도를 계산합니다. 미리 적어 둔 답을 꺼내는 것이 아닙니다.
공책을 펴 두세요. 적지 않으면 확인 문제를 풀 수 없습니다.
사다리를 다시 만든다.▶ 사다리 자동 재생을 눌러
여섯 단계가 한 걸음씩 지나가는 것을 봅니다. 그다음 체크박스를 직접 켜고 끄며
아래 표 ㉮의 칸 수 · 평균오차 · 정확도를 채웁니다.
오차를 0.00kg으로 만든다. 반칙을 써도 좋습니다.
서로 다른 두 가지 방법이 있습니다. 둘 다 찾아서 어떤 특성을 켰는지 적고,
그때 화면이 무슨 경고를 띄우는지도 적으세요.
문턱을 찾는다. 특성을 요일 + 메뉴 + 시험기간으로 두고
'많음' 기준 슬라이더를 10.0에서 13.0까지 0.5씩 올립니다.
두 값을 찾아 표 ㉯에 적으세요 — ⓐ '늘 한쪽으로만 찍기'가 가장 낮아지는 기준,
ⓑ 모델 정확도가 가장 높아 보이는 기준. 둘은 같은 자리가 아닙니다.
미끼를 잡는다. 다른 것을 다 끄고 급식인원 하나만 켜 보세요.
아무것도 안 볼 때(2.628kg)와 견주어 오차가 어느 쪽으로 움직이는지 적습니다.
🧺 특성 고르기 판 — 급식 잔반 60일치INTERACTIVE
특성을 켜면 그 특성들의 조합마다 칸이 하나씩 생기고,
칸 안에 든 날들의 평균을 그 칸의 예측값으로 씁니다(2절의 그 방법입니다).
화면 ①은 특성마다 잰 상관계수, ②는 지금 조합의 성적, ③은 60일 하루하루의 오차 막대입니다.
빨간 테두리가 쳐진 세 특성은 반칙입니다 — 일부러 켜 보라고 놓아 두었습니다.
아래 계산은 전부 이 페이지 안에서 그 자리에 이루어지며,
요일 · 메뉴 · 시험기간으로 만든 값은 오늘 실습 코드 【2】·【6】에서도 소수점까지 똑같이 나옵니다.
(기온과 급식인원은 코드가 다른 모델로 재기 때문에 숫자가 갈립니다 — 코드 상자 아래에서 다룹니다.)
고른 특성요일
칸 수5
평균오차1.984 kg
기준선 2.628 대비24.5% 감소
많음/적음 정확도73.3%
늘 한쪽으로만 찍기53.3%
특성을 켜고 끄면 여기에 판정이 뜹니다.
[안내]고른 조합이 바뀔 때마다 이 창에 한 줄씩 쌓입니다. 공책에 옮겨 적으세요.
표 ㉮ — 사다리를 내 손으로 다시 만든다
켤 특성
칸 수
평균오차(kg)
많음/적음 정확도
아무것도 안 켬
요일
요일 + 메뉴
요일 + 메뉴 + 시험기간
위 셋 + 기온
급식인원 하나만
표 ㉯ — 반칙과 문턱
찾아야 하는 것
내가 찾은 답
그때 화면이 뭐라고 했나
오차를 0.00kg으로 만드는 방법 ①
오차를 0.00kg으로 만드는 방법 ②
ⓐ '늘 한쪽으로만 찍기'가 가장 낮아지는 기준
ⓑ 모델 정확도가 가장 높아 보이는 기준
급식인원 하나만 켰을 때 오차
💭 재면서 생각할 것
오차를 0.00kg으로 만드는 두 방법은 서로 다른 종류의 반칙입니다.
하나는 정답을 훔쳐본 것이고, 다른 하나는 외운 것이에요.
둘 중 어느 쪽이 더 발견하기 어려울까요? 그리고 여러분이 만들 프로젝트에서
둘 중 어느 쪽을 저지르기 쉬울지 생각해 보세요.
코드로 다시 — 같은 숫자가 나와야 한다
시뮬레이터가 낸 값이 진짜인지 확인할 차례입니다. 아래 코드는 화면과 정확히 같은 60일치를 쓰고
정확히 같은 방법으로 계산합니다. 빈칸이 네 곳 있습니다.
?????를 지우고 채운 뒤 ▶ 실행을 누르세요.
빈칸을 안 채우면 문법 오류가 납니다 — 그건 정상입니다.
💡 빈칸 네 곳의 힌트
빈칸 ①mae() — abs(예측 - 정답)을 다 더한 뒤 며칠치인지로 나눕니다.
abs를 빼면 어떻게 되는지는 2절에서 봤지요.
빈칸 ② 예측값 — f(r)가 그 날이 속한 칸의 이름이고,
table이 칸별 평균표입니다. 표에서 그 칸을 꺼내면 됩니다.
빈칸 ④best_threshold() — 조건식 A if 조건 else B를 씁니다.
direction이 +1이면 t 이상이 '많음', −1이면 t 이하가 '많음'입니다.
한 방향만 보면 만족도를 못 잡습니다.
실행하면 124줄이 찍힙니다. 【1】부터 【8】까지 여덟 토막인데,
그 가운데 【2】의 사다리와 【6】의 정확도는 방금 시뮬레이터에서 본 값과 소수점까지 같아야 합니다.
다르면 빈칸을 잘못 채운 것입니다.
다만 【4】는 다릅니다 — 거기만 모델이 다르거든요. 무슨 말인지 바로 아래에서 봅시다.
⚠️ 【4】와 시뮬레이터의 정확도가 두 자리에서 어긋나는 까닭
두 화면을 나란히 놓으면 기온과 급식인원 두 줄만 숫자가 다릅니다.
특성
【4】 코드
시뮬레이터
기온
65.0%
60.0%
급식인원
55.0%
48.3%
만족도
91.7%
91.7%
잔반kg
100.0%
100.0%
틀린 것이 아니라 모델이 다른 것입니다. 【4】는 "기온 몇 도를 넘으면 많음"이라는
경계값을 가능한 모든 값에서 다 시도해 가장 좋은 것을 고른 결과이고,
시뮬레이터는 기온을 5℃ 구간(급식인원은 5명 구간)으로 나눈 뒤
칸 평균이 기준을 넘으면 많음이라고 답합니다.
아래쪽 두 줄이 같은 값인 것은 우연이 아닙니다 — 그 두 특성에서는 두 모델이 60일 하루하루에 대해 똑같이 답합니다.
같은 특성이라도 어떤 모델에 태우느냐에 따라 성적이 달라집니다.
그래서 "기온의 성능"이라는 말은 성립하지 않아요. "이 모델에서 기온을 썼을 때의 성능"이 있을 뿐입니다.
발표할 때 숫자만 옮겨 적고 어느 모델에서 잰 값인지를 빼면, 듣는 사람은 그 숫자를 확인할 길이 없습니다.
6차시로 넘길 스무 줄
오늘 만든 60일치 말고, 스무 줄짜리 연습용 기록이 하나 더 있습니다.
코드 상자 ①의 【8】에 들어 있는 것이고, 아래 상자 ②는 그 부분만 따로 떼어 낸 것입니다.
6차시(특성 선택)가 이 스무 줄을 글자 그대로 받아 가서 기온과 행사 두 열을 덧붙입니다.
그때 오차가 어디까지 내려가는지가 6차시의 이야기예요. 오늘은 출발점만 만들어 둡니다.
합격선도 데이터마다 따로 붙습니다. 60일치의 합격선은 앞에서 정한 1.98kg이고,
이 스무 줄의 합격선은 0.70kg입니다 — 둘 다 '요일별 평균'이라는 같은 기준선에서 나왔지만
잰 데이터가 다릅니다. 6차시가 "2차시의 합격선 0.70kg"이라고 부르는 것은 이 스무 줄 쪽 값입니다.
두 숫자를 섞어 쓰지 마세요.
⚠️ 스무 줄의 4.5배를 60일치의 결론으로 옮기지 마라
상자 ②에서는 요일 하나로 오차가 3.18 → 0.70kg, 4.5배 줄어듭니다.
극적이지요. 그러나 이 스무 줄은 요일 패턴이 유난히 또렷하게 연습용으로 지어진 것입니다.
같은 일을 현실적인 60일치에서 해 보면 2.628 → 1.984kg, 1.3배입니다.
0.70kg 근처에 닿으려면 요일 하나가 아니라 요일 + 메뉴 + 시험기간 셋이 필요했지요(0.677kg).
발표할 때 "요일 하나로 4.5배 줄었습니다"라고 말하면 거짓말이 됩니다.
어느 데이터에서 잰 값인지를 늘 함께 말하세요.
과제 ① — 표 ㉮
켠 특성
칸 수
평균오차(kg)
정확도
아무것도 안 켬
1
2.628
53.3%
요일
5
1.984
73.3%
요일 + 메뉴
23
1.116
81.7%
요일 + 메뉴 + 시험기간
31
0.677
85.0%
위 셋 + 기온
53
0.047
100.0%
급식인원 하나만
5
2.671
48.3%
다섯째 줄을 보세요. 칸이 53개인데 데이터는 60줄입니다. 칸 하나에 한 줄씩 들어간 셈이라
오차가 0.047kg까지 떨어지고 정확도가 100%가 됩니다. 이것은 잘하는 것이 아니라 외운 것입니다.
과제 ② — 오차를 0.00kg으로 만드는 두 길
방법 ①잔반kg을 켠다 → 칸 50개, 오차 0.000kg, 정확도 100.0%.
맞히려는 값을 그대로 입력에 넣었으니 당연합니다. 정답을 훔쳐본 반칙이고,
화면에 빨간 경고 "데이터 누수"가 뜹니다.
방법 ②회차를 켠다 → 칸 60개, 오차 0.000kg, 정확도 100.0%.
날짜 하나에 칸 하나씩이니 60일치를 통째로 외운 것입니다. 외운 반칙이고,
역시 빨간 경고가 뜹니다. 회차는 아침에 알 수 있는 값이라 누수는 아니지만,
내일(61회차)에 대해서는 칸이 아예 없어서 아무 답도 못 냅니다.
둘 중 방법 ②가 훨씬 발견하기 어렵습니다. '잔반kg'은 이름만 봐도 수상하지만
'회차'나 '학번'이나 '주문번호' 같은 열은 아무 잘못 없어 보이거든요.
과제 ③ — 문턱 두 개
'많음' 기준
많음인 날
늘 한쪽으로만 찍기
요일+메뉴+시험기간
10.0 kg
42일
70.0%
90.0%
10.5 kg
36일
60.0%
91.7%
11.0 kg
33일
55.0%
85.0%
11.5 kg
28일
53.3%
85.0%
12.0 kg
24일
60.0%
90.0%
12.5 kg
20일
66.7%
91.7%
13.0 kg
17일
71.7%
91.7%
ⓐ 11.5kg에서 '늘 한쪽으로만 찍기'가 53.3%로 가장 낮습니다.
'많음'과 '적음'이 28일 : 32일로 가장 반반에 가까운 자리라 찍기가 가장 안 통하지요.
기준선이 가장 낮다는 것은 그 문제가 가장 어렵다는 뜻이고, 동시에
모델이 실력을 보여 줄 자리가 가장 넓다는 뜻이기도 합니다.
ⓑ 10.5 / 12.5 / 13.0kg에서 모델 정확도가 91.7%로 가장 높습니다.
그런데 13.0kg에서는 찍기만 해도 71.7%예요. 91.7%와 71.7%의 차이는 20.0%포인트뿐입니다.
11.5kg에서는 85.0%와 53.3%의 차이가 31.7%포인트였고요.
큰 숫자가 나오는 기준이 좋은 기준은 아닙니다.
발표 자료에 91.7%만 적고 71.7%를 안 적으면 그것이 곧 속임수가 됩니다.
과제 ④ — 미끼
급식인원 하나만 켜면 오차가 2.671kg입니다.
아무것도 안 볼 때의 2.628kg보다 오히려 커졌습니다. 정확도도 53.3% → 48.3%로 떨어지고요.
상관계수가 +0.046이었던 그 특성입니다.
왜 나빠질까요? 급식인원은 잔반과 아무 관계가 없는데도 데이터를 다섯 칸으로 갈라 놓습니다.
그러면 칸마다의 평균이 진짜 규칙이 아니라 그날그날의 우연을 따라 조금씩 흔들리고,
그 흔들림이 그대로 오차가 됩니다. 쓸모없는 특성은 그냥 쓸모없는 데 그치지 않고 해롭습니다.
"일단 다 넣고 보자"가 왜 나쁜 습관인지를 이 한 줄이 보여 줍니다.
📖
정리 — 세 칸이 채워졌다
오늘 우리 조의 문제 정의는 이렇게 완성됐습니다. 이 세 줄이 오늘의 산출물입니다.
① 목표 변수
그날의 급식 잔반량(kg)
숫자를 맞히는 회귀 문제. 학생회장이 원한 '많음/적음'은 이 값에 11.5kg 경계를 씌우면 언제든 만들 수 있다.
② 입력 특성
요일 · 메뉴 · 기온예보 · 시험기간 · 급식예정인원
다섯 개 모두 아침 8시 20분에 손에 있다. 만족도와 잔반kg은 뺐다 — 그 시각에는 없는 값이다.
③ 성공 기준
평균오차 1.98kg 미만
요일별 평균만 답하는 기준선이 1.984kg이었다. 이걸 못 이기면 인공지능을 쓸 이유가 없다.
그리고 오늘 얻은 것 가운데 세 칸에 안 적히는 것이 더 중요할지도 모릅니다.
기준선 없는 성능은 뜻이 없다. "정확도 80%"는 좋은 소식일 수도 나쁜 소식일 수도 있습니다.
늘 한쪽으로만 찍어도 53.3%인 문제에서라면 80%는 겨우 그만큼이고,
기준을 13kg로 올려 71.7%가 된 문제에서라면 80%는 거의 아무것도 아닙니다.
성능은 언제나 짝을 지어 적습니다.
상관계수는 특성을 고르는 도구지 결론이 아니다.
가장 센 특성(만족도 −0.961)이 가장 쓸모없었고,
순서 없는 값에 번호를 매기면 같은 데이터에서 −0.474와 +0.480이 동시에 나왔습니다.
성능이 갑자기 아주 좋아지면 의심부터 한다. 100%, 오차 0.00kg 같은 숫자는
기뻐할 일이 아니라 어디가 새는지 찾을 신호입니다.
오늘 우리는 그 신호를 두 번 직접 만들어 봤습니다.
쓸모없는 특성은 해롭기까지 하다. 급식인원 하나를 넣었더니
오차가 2.628에서 2.671kg으로 늘었습니다. 특성은 많이 넣는 것이 아니라 골라 넣는 것입니다.
ℹ️ 오늘 만든 것이 어디로 이어지나
3차시 — 오늘 우리는 60일치를 하나로 뭉쳐 평균을 냈습니다.
그런데 그 평균이 어떤 집단에게는 전혀 안 맞을 수 있습니다. 데이터 편향 이야기가 거기서 시작됩니다.
6차시 — 오늘 상자 ②에 남겨 둔 스무 줄을 그대로 받아 갑니다.
기온과 행사 두 열을 덧붙이면 알고리즘을 하나도 안 바꾸고 오차가 0.70kg에서 0.32kg까지 내려갑니다.
특성을 고르는 눈이 얼마나 힘이 센지를 그때 숫자로 봅니다.
11차시 — 오늘 두 번 만난 "칸이 데이터만큼 많아지는 함정"을 정면으로 다룹니다.
데이터를 훈련용과 테스트용으로 나누는 방법이 거기서 나옵니다.
15차시 — 오늘 정의한 이 급식 잔반 문제를 신경망으로 실제로 풉니다.
다만 60일치는 신경망에 너무 적어서, 그때는 같은 문제를 240일치로 새로 만든 데이터를 씁니다.
✅
확인 문제
✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.
1. 문제 정의의 세 칸이 각각 무엇인지 이름을 쓰고,
급식 잔반 문제로 그 세 칸을 채우시오. 그리고 세 칸 가운데 하나를 비워 두면 무슨 일이 벌어지는지
한 칸마다 한 줄씩 쓰시오.
📖 모범 답안
① 목표 변수 — 무엇을 맞히나. 그날의 급식 잔반량(kg).
비워 두면 학습이 시작되지 않는다. 정답 칸이 없으면 모델은 무엇에 가까워져야 할지 모른다.
② 입력 특성 — 무엇을 보고 맞히나.
요일 · 메뉴 · 기온예보 · 시험기간 · 급식예정인원.
비워 두면 입력이 없다. 아무것도 안 보고 답하는 것은 늘 같은 수를 말하는 것과 같고,
그것이 곧 기준선(2.628kg)이다.
③ 성공 기준 — 얼마나 맞혀야 하나. 평균오차 1.98kg 미만.
비워 두면 언제 끝났는지 모른다. 결과가 나와도 좋은지 나쁜지 판정할 수 없어
"그럭저럭 되는 것 같습니다"로 끝난다.
세 칸이 다 채워져야 만들 수도 있고 평가할 수도 있는 상태가 된다.
2. 오늘 실습에서 만든 기준선 사다리의 값을 쓰시오 —
ⓐ 아무것도 안 볼 때, ⓑ 요일만 볼 때, ⓒ 요일+메뉴+시험기간을 볼 때의 평균오차.
그리고 우리 조의 합격선을 ⓑ로 정하고 ⓒ로 정하지 않은 까닭을 설명하시오.
(오늘 직접 잰 값을 쓸 것)
합격선은 1.98kg이다. 기준선은 가장 단순한 방법이 낸 성적이어야 하기 때문이다.
요일별 평균은 초등학생도 계산할 수 있는 방법이고, 그래서 "이것보다 못하면 인공지능이 필요 없다"는
말이 성립한다.
0.677kg을 합격선으로 삼으면 안 되는 까닭 — 그 값은 칸이 31개인 모델이
자기가 이미 본 60일에서 낸 성적이다. 칸 하나에 데이터가 평균 두 줄뿐이라
사실상 그 두 날을 외운 것이고, 내일 처음 보는 날에도 그만큼 할 거라는 근거가 없다.
기준선을 이렇게 부풀리면 정직하게 만든 모델이 아무리 잘해도 "기준선도 못 넘었다"는
잘못된 판정을 받게 된다.
3. 특성 고르기 판에서 평균오차를 0.00kg으로 만드는 두 가지 방법을
찾아 각각 어떤 특성을 켰는지, 그때 칸 수와 정확도가 얼마였는지 쓰시오.
두 방법이 서로 다른 종류의 반칙인 까닭을 설명하고, 같은 종류의 반칙을 하나씩 더 지어내 보시오.
(오늘 직접 만든 화면을 보고 쓸 것)
📖 모범 답안
방법 ① 잔반kg을 켠다. 칸 50개 · 오차 0.000kg ·
정확도 100.0%. 맞히려는 값 자체를 입력에 넣었다.
이것이 데이터 누수이고, 그중에서도 '정답 또는 정답에서 만들어 낸 값'을 넣은 유형이다.
(표의 많음 칸이 잔반kg ≥ 11.5로 만들어진 파생 열이라는 것을 떠올릴 것.)
방법 ② 회차를 켠다. 칸 60개 · 오차 0.000kg ·
정확도 100.0%. 날짜 하나에 칸 하나씩이라 60일치를 통째로 외운 것이다.
회차는 아침에도 알 수 있는 값이라 누수는 아니지만, 칸이 데이터 줄 수만큼 많아진
과적합이다. 내일(61회차)에는 해당하는 칸이 아예 없어 아무 답도 못 낸다.
같은 종류로 하나씩 더 —
누수 쪽: 시험 성적 예측에 '재시험 대상자 명단'을 넣는다(명단은 성적이 나온 뒤 만들어진다). /
병 진단에 '처방된 약'을 넣는다. / 배송 지연 예측에 '고객 항의 접수'를 넣는다.
외우기 쪽: 학번이나 주문번호, 사진 파일명을 특성으로 넣는다.
줄마다 값이 다르니 칸이 줄 수만큼 생기고, 훈련 성적은 완벽해지지만 새 줄에는 쓸 수 없다.
어느 쪽이 더 위험한가 — 외우기 쪽이다. '잔반kg'이나 '처방된 약'은 이름만 봐도
수상하지만, '학번'이나 '회차'는 아무 잘못 없어 보여서 그냥 넣게 된다.
4. 상관계수 표에서 가장 값이 큰 특성은 만족도(−0.961)였지만
우리는 그것을 뺐다. 까닭을 쓰시오. 또 메뉴에 번호를 매겨 상관계수를 재면
−0.474 · +0.317 · +0.480 세 값이 모두 나올 수 있다. 이때 무엇이 잘못된 것이며,
메뉴가 잔반과 관계있는지를 어떻게 확인해야 하는가?
📖 모범 답안
만족도를 뺀 까닭 — 만족도 설문은 급식이 끝난 뒤(13:20) 걷는다.
우리가 예측해야 하는 시각은 아침 8시 20분이고, 그때 만족도는 아직 존재하지 않는다.
상관계수가 아무리 세도 예측 시점에 손에 없는 값은 특성이 될 수 없다.
이것이 데이터 누수의 두 번째 유형(미래 정보)이다.
이 열을 그냥 넣으면 평가 성적은 91.7%로 아주 좋게 나오지만, 실제로 쓰는 순간
입력이 비어 아무 답도 못 낸다.
메뉴 쪽의 잘못 — 메뉴는 순서가 없는 값이다.
한식이 중식보다 '작다'거나 '앞이다'라는 말은 성립하지 않는다.
그런데 상관계수는 "한쪽이 커질 때 다른 쪽도 커지는가"를 재는 자라서
순서가 있어야만 쓸 수 있다. 순서 없는 값에 억지로 번호를 매기면
그 번호를 어떻게 매기느냐가 곧 답이 되어 버려, 같은 데이터에서 정반대 결론이 동시에 나온다.
올바른 확인 방법 — 칸별 평균을 본다.
메뉴마다 칸을 만들어 각 칸의 평균 잔반량을 재면 한식 14.1 · 중식 12.1 · 양식 12.2 ·
분식 9.5 · 특식 9.6kg이다. 이 방법은 순서를 요구하지 않는다.
그리고 실제로 메뉴만으로 예측했을 때 오차가 2.628 → 2.401kg으로 줄었으니,
메뉴는 관계가 있다고 말할 수 있다.
5. 다음 문장에는 성공 기준이 없다 —
"AI가 학교 분실물을 잘 찾아 준다." 이 문장을 세 칸이 채워진 문제 정의로 다시 쓰시오.
성공 기준에는 반드시 숫자와 기준선이 함께 들어가야 한다.
📖 모범 답안
답은 하나가 아니다. 아래는 한 예이고, 세 칸이 다 채워져 있고 성공 기준에
숫자와 기준선이 있으면 맞는 답이다.
① 목표 변수 — 분실물 사진 한 장이 주인에게 돌아갈 물건 종류
(우산 · 실내화 · 이어폰 · 물병 · 체육복 · 기타의 6가지 중 하나).
② 입력 특성 — 습득한 사진, 습득 장소(층·구역), 습득 시각, 요일.
'주인이 찾아갔는지 여부'는 넣을 수 없다 — 그건 답이 정해진 뒤에 생기는 값이다.
③ 성공 기준 — 처음 보는 분실물 사진 100장에서 종류를 맞히는 정확도가
70% 이상. 기준선은 가장 많은 종류로만 찍기이고,
그 값은 작년 분실물 목록을 세어 먼저 재야 나온다.
(만약 우산이 41%였다면 기준선은 41%이고, 목표 70%는 29%포인트 나은 것이다.
우산이 68%였다면 같은 70%가 겨우 2%포인트 나은 것이 된다.
기준선을 먼저 재지 않고 "정확도 70% 목표"라고만 쓰면, 그 70%가 대단한 건지
찍기보다 조금 나은 건지 아무도 모른다.)
흔한 오답 — "정확도를 최대한 높인다", "사용자 만족도를 높인다",
"빠르게 찾아 준다". 셋 다 숫자가 없고, 언제 끝났는지 판정할 수 없다.
6. 급식실 당번 두 사람이 같은 날 잔반통을 재고 서로 다른 이름표를 붙였다.
가 학생은 국물을 버리고 재서 9.2kg('적음'), 나 학생은 통째로 재서 13.4kg('많음')이라고 적었다.
ⓐ 이런 줄이 데이터에 섞이면 모델에 무슨 일이 생기는가?
ⓑ 알고리즘을 바꿔서 해결할 수 있는 문제인가?
ⓒ 이 일을 줄이려면 무엇을 만들어야 하는가? 지침 문장을 세 줄 이상 직접 써 보시오.
📖 모범 답안
ⓐ 같은 상황(같은 요일·같은 메뉴·같은 기온)에 서로 반대되는 정답이 붙는다.
모델은 그 칸에서 무엇을 답해도 절반은 틀리게 되고, 그 부분은
아무리 좋은 알고리즘을 써도 절대 맞힐 수 없는 한계가 된다.
더 나쁜 것은, 이런 줄이 얼마나 섞여 있는지 데이터만 봐서는 알 수 없다는 점이다.
ⓑ아니다. 이것은 알고리즘의 문제가 아니라 데이터를 만드는 절차의 문제다.
더 좋은 모델을 가져와도 서로 모순되는 정답을 화해시킬 방법은 없다.
고칠 자리는 코드가 아니라 저울 앞이다.
ⓒ 이름표 지침을 글로 만들어 모두가 같은 것을 보게 한다. 예를 들어 —
잔반통은 국물을 포함해 통째로 잰다. 따라 버리지 않는다.
재는 시각은 배식 종료 20분 뒤로 고정한다.
저울은 급식실 A저울 하나만 쓰고, 매주 월요일 0점을 맞춘다.
통 무게 4.0kg은 빼고 적는다.
판단이 애매하면 적지 말고 비워 둔 뒤 표시한다. (억지로 채운 값이 가장 나쁘다.)
실무에서는 여기에 보기 사진을 붙이고, 새 사람이 오면 이미 이름표가 붙은
데이터 몇 줄로 연습시켜 기준이 맞는지 확인한 뒤 투입한다.
🔎
더 알아보기
오차를 재는 또 다른 자, 기온 뒤에 숨은 것, 그리고 저울을 대신하는 센서
원리 더 깊이
오차를 재는 또 다른 자 — RMSE는 큰 실수를 무겁게 친다
오늘은 |차이|를 평균 낸 평균오차(MAE)로 채점했습니다. 자주 쓰는 자가 하나 더 있어요.
차이를 제곱해서 평균을 낸 뒤 제곱근을 씌우는 RMSE(root mean squared error)입니다.
제곱을 거치면 0.5kg은 0.25로 작아지고 10kg은 100으로 커집니다. 큰 실수일수록 훨씬 무겁게 들어가는 자인 셈이지요.
그림의 두 예측은 스무 날 동안 틀린 양을 다 더하면 똑같이 10kg이라 평균오차가 둘 다 0.50kg입니다.
그런데 RMSE로 재면 A는 0.50kg, B는 2.24kg입니다.
오늘의 60일치에서도 재 보면 늘 전체 평균은 평균오차 2.628 → RMSE 3.452,
요일별 평균은 1.984 → 2.528로 커집니다. RMSE는 평균오차보다 작아지는 일이 없어요.
어느 자를 쓸지는 "크게 한 번 틀리는 것이 얼마나 곤란한가"로 정합니다.
배식량을 맞추는 조리실무사님에게는 0.5kg씩 스무 번보다 10kg 한 번이 훨씬 난처하겠지요. 그럴 때는 RMSE가 맞습니다.
다만 자를 바꾸면 합격선도 같은 자로 다시 재야 합니다 — 평균오차 1.98kg을 RMSE 값과 견주면 안 됩니다.
코드 상자 ②의 도전 ③이 바로 이 자로 두 기준선을 다시 재 보는 문제이고, 채점 자를 고르는 이야기는 12차시에서 이어집니다.
오해 바로잡기
더우면 남는다? — 기온 뒤에 숨은 '학기의 흐름'
기온과 잔반의 상관계수는 +0.293이었습니다. "더우면 밥맛이 없어서 남는다"고 설명하고 싶어지지요.
그런데 우리 60일치에서 기온과 회차의 상관계수를 재면 −0.976입니다.
학기가 흐를수록 날이 거의 한결같이 추워졌다는 뜻이고, 기온은 사실상 '학기 앞쪽이냐 뒤쪽이냐'를 함께 실어 나르고 있었습니다.
그림에서 보라 점(앞 30일)은 따뜻한 오른쪽에, 분홍 점(뒤 30일)은 추운 왼쪽에 모여 있고,
잔반 평균도 앞쪽이 12.4kg, 뒤쪽이 10.6kg입니다. 그래서 60일을 한꺼번에 재면 '더울수록 많다'처럼 보입니다.
하지만 앞 30일 안에서만 재면 +0.148, 뒤 30일 안에서만 재면 +0.137로 약해집니다.
+0.293의 상당 부분은 두 시기를 견준 데서 나온 것이지, 같은 시기 안에서 더운 날과 덜 더운 날을 견준 데서 나온 것이 아닙니다.
잔반이 준 까닭이 추위였는지, 학기 뒤쪽이라 다른 무엇이 달라졌기 때문인지는 이 표만으로 가를 수 없어요.
수요일 물음도 같습니다. 수요일 평균 15.4kg, 금요일 8.2kg이라는 차이는 데이터가 보여 주지만,
왜인지는 말해 주지 않습니다. '국물 요리 여부', '6교시 종료 시각' 같은 새 열을 모아야 확인할 수 있지요.
데이터를 보고 → 물음이 생기고 → 새 열을 모으고 → 다시 잽니다. 상관과 인과를 가르는 이야기는 6차시에서 아이스크림 판매량과 물놀이 사고로 제대로 다룹니다.
현장
저울 대신 센서가 적는다 — 음식물쓰레기 수거함
사진은 제주 서귀포시 길가의 음식물쓰레기 수거함입니다. 수거함마다 카드를 대는 자리와
숫자 표시창이 달려 있어요. 이런 수거함은 카드로 누가 버리는지 알아본 뒤,
버린 음식물의 무게를 재서 기록하고 그 무게만큼 수수료를 매깁니다. 버린 만큼 내는 음식물쓰레기 종량제의 한 방식입니다.
4절의 표에서 본 센서 갈래가 바로 이것입니다. 사람이 저울을 읽지 않으니
'국물을 빼고 쟀나, 통째로 쟀나' 같은 사람마다의 흔들림이 줄고, 기록이 날마다 빠짐없이 쌓입니다.
우리 급식실이 잔반통 밑에 이런 센서를 달았다면, 60일치를 모으느라 조리실무사님이 매일 저울 앞에 설 필요가 없었겠지요.
대신 표에 적었던 약점도 그대로 따라옵니다. 센서가 고장 나거나 영점이 틀어져도 숫자는 멀쩡해 보이게 계속 찍히고,
그걸 알아채는 것은 결국 사람의 몫입니다. 그리고 센서는 무게만 적습니다 —
'많음'의 경계를 몇 kg으로 할지, 그날 메뉴를 무엇으로 분류할지는 여전히 사람이 정한 이름표 지침에서 나옵니다.