이 선이 쓸 만한지 어떻게 알까?
회귀 모델은 여러 방법으로 만들 수 있습니다. 어느 쪽이 더 나은지 고르려면 잘 맞는다를 숫자로 나타내야 합니다.
최소 제곱법이나 의사결정트리로 선을 만드는 것과, 그 모델이 얼마나 믿을 만한지 측정하는 것은 서로 다른 일입니다.
산점도를 눈으로 보면 「그럭저럭 맞는 것 같다」는 느낌은 옵니다. 그러나 느낌으로는 두 모델의 우열을 판단할 수 없고, 다른 사람에게 전할 수도 없습니다. 최소 제곱법이 눈대중 대신 오차 제곱합이라는 숫자를 쓰는 것과 같은 이유로, 모델의 성능에도 숫자가 필요합니다.
측정하는 방법은 크게 두 갈래입니다. 방향이 서로 반대이니 헷갈리지 않도록 처음부터 구분해 두겠습니다.
오차 함수
얼마나 틀리는가를 측정합니다. 작을수록 좋습니다. 틀린 양을 그대로 측정하므로 단위가 붙습니다(만 원, 분, 점).
결정 계수
얼마나 설명하는가를 측정합니다. 클수록 좋습니다. 비율이므로 단위가 없습니다. 모델을 만들 때 쓴 데이터로 측정하면 0에서 1 사이이고, 본 적 없는 데이터로 채점하면 0보다 작아질 수도 있습니다.
틀린 양을 하나의 숫자로 모으려면?
점이 여섯 개면 오차도 여섯 개입니다. 이것을 하나로 줄여야 비교할 수 있습니다.
실젯값과 예측값의 차이를 하나의 숫자로 모으는 함수를 오차 함수(error function)라고 합니다. 모으는 방식이 여러 가지라서 이름도 여럿입니다. 가장 널리 쓰이는 셋을 자전거 데이터로 직접 구해 보겠습니다.
| 사용 연수 | 실젯값 | 예측값 −6x + 45 |
오차 | 오차의 절댓값 | 오차² |
|---|---|---|---|---|---|
| 1 | 41 | 39 | +2 | 2 | 4 |
| 2 | 30 | 33 | −3 | 3 | 9 |
| 3 | 28 | 27 | +1 | 1 | 1 |
| 4 | 22 | 21 | +1 | 1 | 1 |
| 5 | 12 | 15 | −3 | 3 | 9 |
| 6 | 11 | 9 | +2 | 2 | 4 |
| 합계 | 0 | 12 | 28 | ||
여기에 「평균」만 씌우면 세 가지 성능 지표가 모두 나옵니다.
평균절대오차
MAE — mean absolute error
오차의 절댓값을 평균 냅니다.
12 ÷ 6 = 2 만 원
모든 오차를 똑같이 셉니다. 그래서 유난히 크게 벗어난 값 하나가 있어도 덜 휘둘립니다.
평균제곱오차
MSE — mean squared error
오차의 제곱을 평균 냅니다.
28 ÷ 6 ≈ 4.67
크게 벗어난 값에 큰 벌점을 줍니다. 대신 단위가 「만 원의 제곱」이 되어 값의 크기를 가늠하기 어렵습니다.
평균제곱근오차
RMSE — root mean squared error
MSE에 제곱근을 씌웁니다.
√4.67 ≈ 2.16 만 원
제곱으로 큰 오차를 무겁게 센 성질은 남기면서 단위를 원래대로 되돌립니다.
MAE는 2인데 RMSE는 2.16입니다
두 값이 벌어진 것은 오차의 크기가 고르지 않기 때문입니다. 우리 오차는 1이 두 번, 2가 두 번, 3이 두 번이었습니다. 만약 여섯 오차가 모두 똑같았다면 MAE와 RMSE는 정확히 같아집니다. 거꾸로 말해 둘의 차이가 벌어질수록 「유난히 크게 빗나간 점이 섞여 있다」는 신호입니다. RMSE는 결코 MAE보다 작아지지 않습니다.
다른 데이터의 모델끼리 비교할 수 없습니다
자전거 모델의 RMSE는 2.16만 원입니다. 놀이공원 대기 시간을 예측하는 모델이라면 RMSE는 8분처럼 분 단위로 나옵니다. 2.16만 원과 8분 중 어느 쪽이 더 좋은 모델일까요? 답할 수 없습니다. 단위가 다르기 때문입니다. 같은 이유로 「RMSE가 5면 좋은 모델인가」도 답할 수 없습니다. 값이 수백만인 데이터라면 5는 아주 훌륭하고, 값이 0에서 10 사이인 데이터라면 5는 형편없습니다. 오차 함수는 같은 데이터를 두고 여러 모델을 비교할 때 쓰는 잣대입니다.
자전거 여섯 대 중 한 대의 실젯값이 11만 원이 아니라 41만 원이었다고 해 봅시다 (아주 아껴 탄 자전거였습니다). 오차 하나가 크게 벌어집니다. 이때 MAE와 RMSE 중 어느 쪽이 더 크게 흔들릴까요? 그리고 흔들리는 쪽이 나쁜 지표인가요? 어떤 상황에서 어느 쪽을 고를지 이야기해 보세요.
단위 없이 측정하려면 무엇과 비교해야 할까?
「좋다」는 언제나 무엇에 비해 좋은 것입니다. 비교할 상대를 정합시다.
가장 성의 없는 예측을 상상해 봅시다. 자전거 값을 물을 때마다 사용 연수를 아예 보지 않고 「다들 24만 원쯤 해요」라고만 답하는 것입니다. 24는 여섯 대의 평균입니다. 이렇게 답해도 아주 틀리지는 않습니다. 이것이 바닥선입니다.
평균만 답할 때
회색 선이 평균 24만 원입니다. 빨간 막대가 길고 많습니다.
회귀선으로 답할 때
파란 선이 회귀선입니다. 빨간 막대가 눈에 띄게 짧아졌습니다.
두 그림의 빨간 막대를 제곱해서 더한 값을 비교하면 회귀선이 얼마나 도움이 되었는지 비율로 말할 수 있습니다.
| 무엇으로 예측했나 | 각 오차 | 오차 제곱합 |
|---|---|---|
| 평균 24만 원 (바닥선) | +17, +6, +4, −2, −12, −13 | 658 |
| 회귀선 −6x + 45 | +2, −3, +1, +1, −3, +2 | 28 |
회귀선이 없앤 오차의 몫
(658 − 28) ÷ 658 = 630 ÷ 658 ≈ 0.957
이 값을 결정 계수(coefficient of determination)라 하고 R²으로 씁니다
0.957은 「평균만 답할 때 생기던 오차의 95.7%를 회귀선이 없앴다」는 뜻입니다. 바꾸어 말하면 자전거 값의 차이 중 95.7%가 사용 연수로 설명된다는 것입니다. 나머지 4.3%는 자전거의 상태, 브랜드, 파는 사람의 사정처럼 모델에 넣지 않은 것들이 만든 차이입니다.
R² ≈ 0
평균만 답하는 것과 다를 바 없다
R² ≈ 0.5
차이의 절반쯤을 설명한다
R² ≈ 1
점들이 선 위에 거의 놓여 있다
프로그램이 r²로 적기도 합니다
CODAP 같은 프로그램이 최소제곱선과 함께 보여 주는 r²도 이 결정 계수입니다. 단순 선형 회귀에서는 이 값이 상관계수 r을 제곱한 것과 정확히 같아지기 때문에 프로그램이 소문자 r²로 적기도 합니다.
R²이 높다고 해서 — 세 가지 주의
- 인과가 밝혀진 것이 아닙니다. R²은 평균만 답할 때보다 오차가 얼마나 줄었는지를 측정한 값일 뿐입니다. 사용 연수가 값을 떨어뜨린 원인인지는 여전히 따로 판단해야 합니다.
- 데이터 밖에서도 잘 맞는다는 뜻이 아닙니다. R²은 모델을 만들 때 쓴 데이터에 대해 측정한 값입니다. 회귀선 −6x + 45에 사용 연수 8년을 넣으면 −3만 원이라는 음수 가격이 나오는데, 이 문제는 R²이 0.957이어도 그대로 남아 있습니다.
- 독립 변수를 늘리면 거의 언제나 올라갑니다. 「자전거 색깔」처럼 아무 상관 없는 속성을 넣어도 R²은 조금 오릅니다. 그러니 R²이 올랐다는 것만으로 더 좋은 모델이 되었다고 말할 수 없습니다.
R²이 0에 가깝게 나온 모델을 만났다고 합시다. 이때 「두 속성 사이에는 아무 관계가 없다」고 결론지어도 될까요? 올랐다가 내려가는 산 모양 데이터에 직선을 그으면 어떻게 될지 떠올려 보세요.
실습 — 공부 시간과 시험 점수
회귀 분석과 성능 평가를 진짜 데이터에 한 번에 적용합니다.
문제 상황
시험이 코앞인데 자꾸 놀고 싶습니다. 문득 궁금해집니다. 공부 시간과 시험 점수는 정말 관련이 있을까? 있다면 얼마나 있을까? 한 시간을 더 앉아 있으면 점수가 몇 점쯤 달라질까?
이 물음에 답하려면 회귀 분석이 필요합니다. 회귀 분석에는 통계적 방법과 기계학습 방법, 두 가지 길이 있으니, 같은 데이터를 두 갈래로 나누어 분석하고 마지막에 비교해 보겠습니다.
스프레드시트 — 통계적 회귀 분석
최소 제곱법으로 직선 하나를 구하고, 오차 함수와 결정 계수를 수식으로 직접 계산합니다.
오렌지 — 기계학습 회귀 분석
의사결정트리와 k-최근접 이웃으로 모델을 만들고, 프로그램이 계산해 준 성능 값을 읽습니다.
실습 순서
| 순서 | 하는 일 | 내용 |
|---|---|---|
| 1 | 문제 정의하기 | 공부 시간과 시험 점수는 정말 관련이 있을까? — 무엇을 독립 변수로, 무엇을 종속 변수로 둘지 정한다 |
| 2 | 데이터 수집하기 | 공개 데이터셋을 내려받는다 |
| 3 | 데이터 불러오기 | 스프레드시트와 오렌지에 각각 올리고 내용을 살펴본다 |
| 4 | 회귀 모델 만들기 | 스프레드시트는 회귀식을, 오렌지는 · 모델을 만든다 |
| 5 | 성능 평가하기 | 양쪽 모두 오차 함수와 결정 계수를 구한다 |
| 6 | 결과 비교하기 | 두 갈래의 결과를 나란히 놓고 무엇이 어떻게 다른지 읽는다 |
실습 순서 1 · 2 — 문제를 정하고 데이터를 구합니다
독립 변수 — 넣는 값
Hours — 공부한 시간
종속 변수 — 얻는 값
Scores — 시험 점수
내려받을 데이터
학생의 공부 시간과 시험 점수가 담긴 공개 데이터셋입니다.
내려받으면 student_scores.csv 파일이 생깁니다.
25명분이라 손으로 따라가며 확인하기에 알맞은 크기입니다.
kaggle.com/datasets/kamleshsam/student-scores
시작하기 전에 한 가지
이 데이터는 여러 학생을 한 번씩 관찰한 것이지, 한 학생의 공부 시간을 늘려 가며 시험을 여러 번 치른 것이 아닙니다. 그러니 결과가 아무리 뚜렷해도 「한 시간 더 공부하면 점수가 오른다」가 아니라 「한 시간 더 공부한 학생이 점수가 높더라」로 읽어야 합니다. 실습이 끝난 뒤 결과를 말로 옮길 때 이 점을 잊기 쉽습니다.
스프레드시트로 회귀식 구하기
실습 순서 3 · 4
데이터 불러오기
구글 스프레드시트에서 → 로 student_scores.csv를 올립니다. Hours와 Scores 두 열이 25행에 걸쳐 들어 있는지 확인합니다.
아래 설명은 데이터가 A열에 Hours, B열에 Scores로 들어가고 1행은 열 이름, 2행부터 25명분이라고 보고 쓴 것입니다. 즉 값이 든 칸은 A2:A26과 B2:B26입니다.
회귀 모델 만들기
두 가지 방법으로 만들어 보고 같은 값이 나오는지 확인합니다.
(1) 차트로 구하기
- A2:A26과 B2:B26을 함께 선택하고 → 를 고릅니다.
- 차트 종류를 분산형으로 바꿉니다.
- → → 을 켭니다.
- 에서 을 고르고 를 켭니다.
차트 위에 회귀식과 결정 계수가 함께 나타납니다.
(2) 함수로 구하기
빈 칸 세 개에 아래 수식을 넣습니다. 차트가 알려 준 값과 똑같이 나와야 합니다.
| 구할 값 | 수식 |
|---|---|
| 기울기 | =SLOPE(B2:B26, A2:A26) |
| 절편 | =INTERCEPT(B2:B26, A2:A26) |
| 결정 계수 | =RSQ(B2:B26, A2:A26) |
세 함수 모두 y 범위를 앞에, x 범위를 뒤에 씁니다. 순서를 바꾸면 오류 없이 엉뚱한 값이 나옵니다.
결과를 적어 둡시다
| 기울기 | 절편 | 회귀식 | 결정 계수 |
|---|---|---|---|
| 점수 = × 공부 시간 + |
다 하고 나서 눌러 확인하기
기울기는 약 9.78, 절편은 약 2.48, 결정 계수는 약 0.95가 나옵니다. 소수점 아랫자리는 반올림에 따라 조금 다를 수 있습니다.
읽어 보면 — 공부 시간이 1시간 더 긴 학생이 점수가 평균 9.78점 높았고, 점수 차이의 95%쯤이 공부 시간으로 설명된다는 뜻입니다. 절편 2.48은 공부 시간이 0인 곳에서 선이 내놓는 값입니다. 이 데이터에는 공부 시간이 가장 짧은 학생도 1시간이 넘으므로, 공부를 안 한 학생의 점수가 아니라 선을 데이터 밖까지 늘였을 때의 값일 뿐입니다.
스프레드시트로 성능 평가하기
실습 순서 5 — 앞에서 손으로 채웠던 표를 25행짜리로 만듭니다.
자전거 여섯 대에서 했던 일과 완전히 같습니다. 예측값 열을 만들고, 오차 열을 만들고, 절댓값과 제곱을 구한 뒤 평균을 냅니다. 다만 25행이라 손 대신 수식을 씁니다.
| 순서 | 만들 열 | 수식 |
|---|---|---|
| ① | 예측값 | 기울기 × Hours + 절편. 기울기와 절편이 든 칸은 모든 행에서 같은 칸을 봐야 하므로 $F$1처럼 절대 참조로 씁니다 |
| ② | 오차 | 실젯값 − 예측값. 즉 =B2-C2 꼴 |
| ③ | 오차의 절댓값 | =ABS(오차칸) |
| ④ | 오차의 제곱 | =POWER(오차칸, 2) |
네 열을 25행까지 끌어 채웠다면, 이제 평균만 씌우면 끝입니다.
| 지표 | 수식 | 내가 얻은 값 |
|---|---|---|
| 평균절대오차 MAE | =AVERAGE(절댓값 열 범위) | |
| 평균제곱오차 MSE | =AVERAGE(제곱 열 범위) | |
| 평균제곱근오차 RMSE | =SQRT(MSE가 든 칸) | |
| 결정 계수 R² | =RSQ(B2:B26, A2:A26) |
다 하고 나서 눌러 확인하기
MAE는 약 5점, MSE는 약 29, RMSE는 약 5.4점이 나옵니다.
MAE 5점과 RMSE 5.4점의 차이를 눈여겨보세요. 자전거 데이터에서 2와 2.16이 벌어졌던 것과 같은 이유입니다. MSE 29는 「점의 제곱」이라 몇 점쯤 틀리는지 가늠할 수 없지만, RMSE로 바꾸면 「대체로 5점 안팎으로 빗나간다」고 말할 수 있습니다. 결과를 사람에게 설명할 때 MSE보다 RMSE가 쓸모 있는 까닭입니다.
오차 열의 합도 구해 보세요. 0에 아주 가까운 값이 나올 것입니다. 자전거 데이터에서는 정확히 0이었습니다. 왜 이런 일이 벌어지는지, 그리고 이 값으로는 왜 성능을 측정할 수 없는지 설명해 보세요.
오렌지로 기계학습 회귀 분석하기
같은 데이터를 의사결정트리와 k-최근접 이웃에 넣어 봅니다.
오렌지에서는 네모 하나가 기능 하나이고, 네모를 선으로 이으면 데이터가 그 방향으로 흘러갑니다. 우리가 만들 흐름은 이렇습니다.
데이터 불러오기
위젯으로 student_scores.csv를 엽니다. 위젯 아래쪽 정보란에 데이터 25건, 속성 2개, 결측치 없음이라고 나오는지 확인합니다.
그다음이 가장 중요한 설정입니다. Scores의 역할(Role)을 으로 바꿉니다.
오렌지는 종속 변수를 , 독립 변수를 라는 역할 이름으로 부릅니다. 이것을 정해 주지 않으면 오렌지는 무엇을 맞혀야 하는지 모릅니다.
회귀 모델 만들기
- 에 를 잇고 비율을 70%로 맞춥니다. 25건 중 18건이 모델을 만드는 데 쓰이고 나머지 7건이 남습니다.
- 에 를 잇습니다. 모양을 눈으로 보고 싶으면 를 하나 더 답니다.
- 에 도 잇습니다. 이웃의 수를 바꿀 수 있으니 k를 3과 5로 바꿔 가며 살펴보세요.
왜 데이터를 70%와 30%로 나눌까요?
모델을 만들 때 쓴 데이터로 그 모델을 채점하면 시험 문제를 미리 보고 시험을 치르는 것과 같습니다. 점수는 잘 나오지만 실력은 알 수 없습니다. 그래서 데이터를 미리 나눠 둡니다. 70%는 훈련 데이터로 모델을 만들고, 모델이 본 적 없는 30%는 테스트 데이터로 채점합니다.
k-최근접 이웃에서 k = 1은 가장 가까운 데이터 하나의 값을 그대로 답합니다. 그래서 모델을 만든 데이터로 채점하면 자기 자신이 가장 가까운 이웃이 되어 거의 완벽하게 맞힙니다(같은 공부 시간에 점수가 다른 학생이 있을 때만 빗나갑니다). 그 함정을 걸러 내는 장치가 바로 이 나누기입니다.
성능 평가하기
위젯을 두 모델에 모두 잇고, 가 남겨 둔 30% 데이터도 함께 잇습니다. 그러면 MAE · MSE · RMSE · R²이 표로 나옵니다. 스프레드시트에서 수식으로 하나하나 만들었던 그 값들입니다.
결과를 적어 둡시다
| 모델 | MAE | RMSE | R² |
|---|---|---|---|
| Tree — 의사결정트리 | |||
| kNN — k-최근접 이웃 |
어느 18건을 고르는지에 따라 값이 달라집니다
는 25건 중 18건을 무작위로 고릅니다. 고른 18건이 다르면 만들어지는 모델도 달라지고, 채점 결과도 달라집니다. 다만 처음 설정대로 이 체크되어 있으면 같은 데이터에서는 늘 같은 18건을 고르므로, 옆 친구와 같은 값이 나오는 것이 보통입니다. 이 체크를 풀면 다시 실행할 때마다 고르는 18건이 바뀌어 값이 달라지고, 데이터가 25건뿐이라 흔들림이 특히 큽니다. 소수점 아랫자리가 아니라 대략적인 크기를 보세요.
어느 정도 값이 나오면 정상인가요?
두 모델 모두 R²이 0.9 안팎으로 나오고, 의사결정트리와 k-최근접 이웃 사이에 큰 차이는 나지 않습니다. 공부 시간이 점수 차이의 90%쯤을 설명한다는 뜻입니다. 체크를 풀고 여러 번 실행하면 0.8대나 0.95가 나오는 일도 흔합니다. 만약 R²이 음수로 나왔다면 놀라지 마세요 — 평균만 답하는 것보다도 못했다는 뜻이고, 7건뿐인 테스트 데이터가 유난히 까다롭게 뽑히면 실제로 일어납니다.
두 갈래의 결과를 비교하면
실습 순서 6
| 모델 | 만든 방법 | R² | 내 결과에서 읽은 것 |
|---|---|---|---|
| 선형 회귀 | 스프레드시트 | ||
| 의사결정트리 | 오렌지 | ||
| k-최근접 이웃 | 오렌지 |
세 숫자를 그대로 비교하면 안 됩니다
표를 채우고 나면 스프레드시트 쪽 R²이 더 높게 나오는 경우가 많습니다. 그런데 이것을 근거로 「선형 회귀가 더 좋은 모델」이라고 말할 수 없습니다. 두 값은 채점 조건이 달랐기 때문입니다.
| 쪽 | 무엇으로 모델을 만들었나 | 무엇으로 채점했나 |
|---|---|---|
| 스프레드시트 | 데이터 25건 전부 | 같은 25건 — 본 문제로 시험 |
| 오렌지 | 무작위로 고른 18건 | 남겨 둔 7건 — 처음 보는 문제 |
본 문제로 친 시험 점수가 더 높은 것은 당연합니다. 공정하게 비교하려면 스프레드시트 쪽도 같은 18건으로 회귀식을 만들고 같은 7건으로 채점해야 합니다. 여유가 있다면 직접 해 보세요. 조건을 맞추면 세 모델의 차이가 줄어드는 경우가 많습니다.
그래도 남는 진짜 차이
성능이 엇비슷하다면 무엇을 보고 골라야 할까요? 이 데이터에서는 선형 회귀 쪽이 쓸모가 큽니다. 「공부 시간이 1시간 더 긴 학생이 점수가 평균 9.78점 높더라」라는 한 문장을 얻을 수 있기 때문입니다. 의사결정트리와 k-최근접 이웃은 예측은 해 주지만 이런 문장으로 요약해 주지는 못합니다.
거꾸로 올랐다가 내려가는 산 모양의 데이터였다면 선형 회귀는 쓸모 있는 말을 해 주지 못했을 것입니다. 데이터의 모양이 방법을 정합니다.
실습 결과를 한 문장으로 정리해 친구에게 설명해 보세요. 이때 「공부하면 점수가 오른다」라고 말하지 않으려면 문장을 어떻게 고쳐야 할까요? 그리고 이 데이터만으로는 알 수 없는 것에 무엇이 있을지도 함께 이야기해 보세요.
핵심 정리
오차 함수
error function
- MAE — 오차 절댓값의 평균. 모든 오차를 똑같이 센다
- MSE — 오차 제곱의 평균. 큰 오차에 큰 벌점, 단위가 제곱
- RMSE — MSE의 제곱근. 단위를 되돌린다
결정 계수
coefficient of determination · R²
- 평균만 답할 때의 오차에 비해 얼마나 줄였는지의 비율
- 만든 데이터로 측정하면 0~1 사이. 단위가 없다
- 높다고 인과도, 데이터 밖 예측력도 보장되지 않는다
- 상관없는 독립 변수를 더 넣어도 조금씩 오른다. 좋은 숫자가 나오면 어떤 조건에서 나온 값인지부터 묻는다
훈련 데이터와 테스트 데이터를 나눈다
70% 와 30%
- 만들 때 쓴 데이터로 채점하면 본 문제로 시험을 치는 셈
- 모델이 본 적 없는 데이터로 채점해야 실력을 안다
- 성능을 비교할 때는 채점 조건이 같은지 먼저 본다
실습에서 쓴 것
스프레드시트 · 오렌지
- SLOPE · INTERCEPT · RSQ · ABS · POWER · SQRT
- → → · →
- 종속 변수는 역할, 독립 변수는 역할로 둔다(오렌지의 역할 이름)
확인 퀴즈
배운 내용을 확인해 봅시다.
평균제곱오차(MSE) 대신 평균제곱근오차(RMSE)를 즐겨 쓰는 가장 큰 까닭은?
자전거 데이터에서 MAE는 2, RMSE는 2.16이었습니다. 이 차이가 알려 주는 것은?
결정 계수는 회귀 모델을 무엇과 비교해 얻은 값인가?
오렌지에서 로 데이터를 70%와 30%로 나누는 까닭은?
실습에서 스프레드시트 쪽 결정 계수가 오렌지 쪽보다 높게 나왔습니다. 이때 가장 먼저 확인해야 할 것은?