P2-15.2 Part 3로 넘어가기 전 점검¶
Section ID:
P2-15.2Version:v2026.09.15
데이터와 계산의 연결¶
수식은 계산 규칙을, Python은 실행 절차를 표현합니다. NumPy는 배열 계산을, Pandas는 표의 선택과 집계를, Matplotlib은 값의 변화와 분포 확인을 담당합니다. Git에는 코드와 설명을 어떤 이유로 바꾸었는지 기록할 수 있습니다.
flowchart TD
A["수식<br/>계산 규칙"]
B["Python·NumPy<br/>실행·배열 계산"]
C["Pandas<br/>샘플과 열 확인"]
D["Matplotlib<br/>값과 오차 확인"]
E["Git<br/>조건·변경 기록"]
F["머신러닝<br/>입력·학습·평가"]
A --> B --> C --> D --> E --> F
사례 1. 학생 네 명의 입력과 정답¶
시험 전에 학생의 점수를 예측한다고 합시다. 다음 표는 입력과 정답의 관계를 확인하기 위한 가상 자료입니다. 공부 시간·결석 수·연습 퀴즈 수는 예측 시점까지의 기록이며, 시험 점수는 나중에 확인한 정답입니다.
| 학생 | 공부 시간 | 결석 수 | 퀴즈 수 | 시험 점수 |
|---|---|---|---|---|
| A | 2 | 5 | 3 | 50 |
| B | 4 | 3 | 5 | 65 |
| C | 6 | 1 | 7 | 80 |
| D | 8 | 0 | 9 | 90 |
입력 X에는 공부 시간·결석 수·퀴즈 수의 세 열을 넣고, 정답 y에는 시험 점수를 넣습니다. 학생이 행이고 특징이 열이므로 X.shape는 (4, 3), y.shape는 (4,)입니다. 첫 입력 [2, 5, 3]은 정답 50과 짝을 이룹니다.
시험 점수까지 X에 넣으면 (4, 4)가 되지만 시험 전에 알 수 없는 정답을 제공하는 문제가 생깁니다. 열 수가 맞고 코드가 실행된다는 사실만으로 입력 구성이 올바른 것은 아닙니다.
퀴즈 수를 입력에서 빼면 X.shape는 (4, 2)가 되고 y.shape는 그대로입니다. 학생 D의 기록을 제외한다면 X와 y 양쪽에서 같은 학생을 제거해야 합니다.
학생 이름은 행을 연결하는 식별자로 쓰고, 이 예제의 예측 특징에는 넣지 않습니다. X만 공부 시간의 내림차순으로 정렬하고 y를 그대로 두면 첫 행 D의 입력 [8, 0, 9]가 A의 점수 50과 잘못 연결됩니다. 두 배열의 샘플 수가 같아도 학습 자료는 틀릴 수 있습니다.
같은 세 특징을 사용하더라도 예측할 때 열 순서를 바꾸면 문제가 생깁니다. 학습 때 첫 열이 공부 시간이었다면 새 학생의 첫 열도 공부 시간이어야 합니다. (1, 3)이라는 모양은 한 학생과 세 특징을 뜻할 뿐, 각 열의 의미까지 보장하지 않습니다.
학습과 예측 표현¶
scikit-learn에서는 학습 기능을 가진 객체를 estimator라고 부릅니다. 지도학습 예제의 fit(X_train, y_train)은 학습용 입력과 정답으로 모델을 학습시키는 호출입니다. predict(X_test)는 학습된 모델에 테스트 입력을 넣어 예측값을 구하는 호출입니다.
| 표현 | 의미 |
|---|---|
| sample | 데이터 한 건; 위 표에서는 학생 한 명 |
| feature | 입력 속성; 위 표에서는 공부 시간·결석 수·퀴즈 수 |
target, y | 맞혀야 할 정답; 위 표에서는 시험 점수 |
| train data | 모델을 학습시키는 데이터 |
| test data | 학습과 모델 선택에 사용하지 않고 최종 평가에 남겨 둔 데이터 |
fit | 데이터에서 모델의 규칙을 배우는 동작 |
predict | 학습된 모델로 입력의 예측값을 구하는 동작 |
flowchart TD
A["샘플 쌍 분할"]
B["학습 입력·정답<br/>X_train, y_train"]
C["학습<br/>fit"]
D["학습된 모델"]
E["테스트 입력<br/>X_test"]
F["예측<br/>predict"]
G["예측값"]
H["테스트 정답<br/>y_test"]
I["최종 평가"]
A --> B --> C --> D --> F --> G --> I
A --> E --> F
A --> H --> I
테스트 정답은 predict의 입력으로 주지 않습니다. 예측이 끝난 뒤 예측값과 실제 정답을 비교하는 데 사용합니다.
학습·검증·테스트의 역할¶
분할은 X와 y를 따로 섞는 일이 아니라 샘플 쌍을 함께 나누는 일입니다. 표의 A·B·C를 학습용, D를 테스트용으로 정하면 모양은 다음과 같습니다. 이는 흐름 설명을 위한 네 행짜리 예이며 실제 성능을 판단하기에 충분한 자료가 아닙니다.
| 데이터 | 포함 학생 | 입력 모양 | 정답 모양 |
|---|---|---|---|
| 학습 | A·B·C | (3, 3) | (3,) |
| 테스트 | D | (1, 3) | (1,) |
fit은 A·B·C의 입력과 정답을 보고, predict는 D의 입력만 받습니다. 나온 예측값 하나를 D의 실제 점수 90과 비교합니다. D를 하나의 새 샘플로 전달할 때도 특징 행렬의 두 축을 유지해야 합니다.
실제 모델 비교에서는 학습 자료 안에서 별도의 검증 자료를 확보하거나 교차검증을 사용합니다. 검증 결과는 특징·모델·설정을 고르는 데 쓰고, 테스트 자료는 선택을 마친 뒤의 최종 평가에 남겨 둡니다. 테스트 점수를 보면서 특징을 계속 바꾸면 테스트 정보도 선택에 사용되므로 독립적인 최종 평가 역할을 잃습니다.
전처리의 기준도 학습 자료에서 구합니다. 예를 들어 공부 시간에서 평균을 빼려면 A·B·C의 평균 (2+4+6)/3 = 4를 사용합니다. D의 8시간에는 같은 기준을 적용해 8-4 = 4를 얻습니다. 네 학생 전체의 평균 5를 먼저 계산하면 학습 전에 테스트 입력 정보를 사용한 셈입니다.
사례 2. 오차·손실·평가값 구분¶
별도의 계산 연습으로 네 학생의 실제 점수가 [50, 65, 80, 90], 예측 점수가 [55, 60, 80, 85]라고 합시다. 이 예측값은 학습된 모델의 실험 결과가 아니라 지표를 비교하기 위해 정한 값입니다. 실제값에서 예측값을 뺀 오차는 [-5, 5, 0, 5]입니다. 이 오차의 평균은 1.25지만, 양수와 음수가 상쇄되므로 오차 크기를 그대로 나타내지 않습니다.
제곱 오차는 [25, 25, 0, 25]이며 MSE는 75 / 4 = 18.75입니다. 절댓값 오차를 평균내는 MAE는 15 / 4 = 3.75입니다. 같은 예측 결과도 어떤 계산으로 요약하느냐에 따라 값과 의미가 달라집니다.
| 요약값 | 값 | 해석 |
|---|---|---|
| 오차 평균 | 1.25점 | 과대·과소 예측의 부호가 상쇄된 값 |
| MAE | 3.75점 | 절댓값 오차의 평균 |
| MSE | 18.75점² | 제곱 오차의 평균 |
| RMSE | 약 4.330점 | MSE의 제곱근 |
MSE가 MAE보다 숫자가 크다고 성능이 더 나쁘다는 뜻은 아닙니다. 서로 다른 단위와 계산 규칙으로 같은 예측을 요약한 값이기 때문입니다. 모델끼리 비교할 때는 같은 평가 샘플과 같은 지표를 사용합니다.
손실은 학습 과정에서 줄이려는 값이고, 평가 지표는 결과를 평가하는 기준입니다. MSE처럼 같은 계산이 두 역할에 쓰일 수도 있습니다. 어떤 데이터에서 계산했고 무엇을 결정하는 데 쓰는지 함께 밝혀야 합니다.
예측값을 [50, 65, 80, 90]으로 바꾸면 모든 오차와 MSE·MAE가 0이 됩니다. 계산을 점검할 때 사용할 수 있는 작은 확인 사례입니다.
마지막 예측값만 85에서 75로 바꾼다면 MAE와 MSE가 얼마나 달라지는지 계산해 봅니다. 절댓값 오차 합은 25로 늘어 MAE가 6.25가 되고, 제곱 오차 합은 275로 늘어 MSE가 68.75가 됩니다. 한 샘플의 큰 오차가 제곱을 거쳐 더 크게 반영됩니다.
변경 조건 기록¶
입력 특징이나 분할 조건을 바꾸었다면 결과와 함께 기록합니다. 결과 개선만 적으면 무엇을 비교했는지 알 수 없습니다.
| 기록 항목 | 구체적인 예 |
|---|---|
| 입력 변경 | 퀴즈 수 제외, 특징 3개에서 2개로 변경 |
| 유지 조건 | 같은 학습·검증 학생과 같은 모델 설정 사용 |
| 비교 결과 | 변경 전후 검증 MSE와 예측값 표 기록; 선택 완료 후 테스트 평가 |
| 생성 근거 | 코드·데이터 버전과 실행 명령 기록 |
여러 조건을 한꺼번에 바꾸면 결과 차이가 어느 변경에서 왔는지 구분하기 어렵습니다. 비교 목적에 맞게 변경 조건을 정하고 기록해야 합니다.
결과 해석 점검¶
다음 상황에서 숫자를 바로 성능 개선으로 읽어도 되는지 판단합니다.
| 상황 | 판단과 이유 |
|---|---|
| 입력에 시험 점수를 추가하자 오차가 0이 됐다 | 예측 시점에 모를 정답을 제공한 누출이므로 개선 근거가 되지 않는다 |
X에서 한 학생을 빼고 y는 그대로 뒀다 | 샘플 수와 대응이 어긋났으므로 입력 구성을 먼저 고친다 |
| 모델 A의 학습 MSE가 모델 B의 테스트 MSE보다 낮다 | 평가 대상이 달라 두 모델의 일반화 성능을 직접 비교할 수 없다 |
| 같은 검증 자료·같은 지표에서 특징 하나를 뺀 결과가 더 낮다 | 해당 검증 조건에서는 개선이며, 선택 후 별도 테스트 평가가 필요하다 |
코드가 실행되고 숫자가 작아졌다는 사실만으로 충분하지 않습니다. 예측 시점에 알 수 있는 입력인지, 같은 샘플끼리 연결했는지, 같은 평가 조건인지가 함께 맞아야 합니다.
개념별 참고 위치¶
| 확인할 내용 | 관련 본문 |
|---|---|
| 변수와 함수 | P2-2.1 |
| 벡터와 행렬 | P2-3.1 |
| 평균과 분산 | P2-5.2 |
| 손실 함수 | P2-6.1 |
| 경사하강법 | P2-6.3 |
| 배열 모양과 축 | P2-11.2 |
| 입력·정답·데이터 분할 | P2-12.3 |
| 그래프 해석 | P2-13.1 |
| MSE 계산 | P2-15.1 |
체크리스트¶
- 학생 표의 입력 열과 정답 열을 구분할 수 있는가?
- 특징 하나를 빼거나 학생 한 명을 제외할 때
X,y의 모양이 어떻게 달라지는지 설명할 수 있는가? fit과predict에 어떤 데이터를 전달하는지 구분할 수 있는가?- 오차 평균·MSE·MAE를 위 예측값에서 계산할 수 있는가?
- 학습 손실과 테스트 평가값의 역할을 구분할 수 있는가?
- 입력이나 분할을 바꾸었을 때 유지 조건과 결과를 함께 기록할 수 있는가?
- 모양이 같아도 행의 대응이나 특징 순서가 틀리면 문제가 되는 이유를 설명할 수 있는가?
- 검증 결과를 이용한 선택과 테스트를 이용한 최종 평가를 구분할 수 있는가?
- 전처리 기준을 학습 자료에서만 구해야 하는 이유를 수치로 설명할 수 있는가?
출처와 참고 자료¶
- scikit-learn developers, Getting Started 확인 날짜: 2026-09-15. X·y·fit·predict의 기본 구조.
- scikit-learn developers, Glossary 확인 날짜: 2026-09-15. sample·feature·target·estimator 용어.
- scikit-learn developers, Common pitfalls and recommended practices 확인 날짜: 2026-09-15. 누출 방지와 학습 자료에서 전처리 기준을 구하는 원칙.
- scikit-learn developers, Cross-validation: evaluating estimator performance 확인 날짜: 2026-09-15. 검증을 통한 선택과 테스트의 역할 구분.
- scikit-learn developers, Regression metrics 확인 날짜: 2026-09-15. 동일 예측을 MSE·MAE·RMSE로 요약.