Skip to main content
Summary

이 장에서 배울 것

머신러닝이 문제를 푸는 방식에서는 머신러닝이 데이터를 통해 규칙을 배우는 방식과, X와 y의 기본 의미를 살펴보았다. 이번 장에서는 실제 프로젝트를 시작하기 전에 데이터를 어떻게 읽고, 무엇을 예측할지 어떻게 정하는지 배운다.

이 장의 목표는 모델을 고르는 것이 아니다. 코드를 많이 쓰는 것도 아니다. 먼저 데이터셋을 행과 열의 관점에서 읽고, 예측할 대상인 타깃과 예측에 사용할 특징을 정하는 힘을 기르는 것이다.

이 장을 끝내면 다음을 할 수 있어야 한다.

  • 데이터셋에서 샘플, 특징, 타깃을 구분한다.

  • 수치형 변수와 범주형 변수를 구분한다.

  • 타깃의 형태를 보고 분류 문제와 회귀 문제를 판단한다.

  • 결측치, 이상치, 중복 데이터, 단위 오류 같은 기본 품질 문제를 점검한다.

  • 데이터 누수가 무엇인지 설명하고 피할 수 있다.

  • 간단한 데이터 명세서와 문제 정의 문장을 작성한다.

데이터셋과 문제 정의

왜 이 주제가 중요한가

초보자는 머신러닝을 시작할 때 종종 이렇게 묻는다.

"이 데이터에는 어떤 모델을 써야 하나요?"

하지만 더 먼저 물어야 할 질문은 따로 있다.

"무엇을 예측하려는가?"
"언제 그 예측을 사용할 것인가?"
"그 시점에 실제로 알 수 있는 정보는 무엇인가?"

문제가 흐릿하면 좋은 모델을 써도 결과가 흔들린다. 예를 들어 고객 이탈을 예측한다고 해보자. 타깃을 "다음 달에 해지했는가"로 정할 수도 있고, "앞으로 7일 안에 해지할 가능성이 높은가"로 정할 수도 있다. 두 문제는 비슷해 보이지만 필요한 데이터와 의사결정 방식이 다르다.

머신러닝 프로젝트는 데이터에서 시작하는 것처럼 보이지만, 실제로는 문제 정의에서 시작한다. 데이터는 문제를 풀기 위한 재료이고, 모델은 그 재료를 사용하는 도구다. 재료와 도구보다 먼저 정해야 할 것은 "무엇을 만들 것인가"이다.

핵심 개념 설명

행과 열로 데이터셋 읽기

대부분의 머신러닝 데이터는 표 형태로 생각할 수 있다.

  • 행(row): 하나의 관측 대상이다. 머신러닝에서는 보통 샘플(sample)이라고 부른다.

  • 열(column): 샘플에 대해 기록된 정보다. 예측에 쓰는 열은 특징(feature)이라고 부른다.

  • 타깃(target): 예측하고 싶은 정답 열이다. 보통 y라고 부른다.

예를 들어 학생의 시험 점수를 예측한다고 하자.

학생공부 시간이전 시험 점수출석률최종 점수
A3700.9078
B5800.9588
C1550.7060

여기서 한 학생은 하나의 샘플이다. 공부 시간, 이전 시험 점수, 출석률은 특징이 될 수 있다. 최종 점수를 예측하려 한다면 최종 점수가 타깃이다.

즉, 머신러닝 문제를 만들 때는 다음처럼 나누어 생각한다.

  • X: 예측에 사용할 정보 묶음

  • y: 예측하고 싶은 값

좋은 문제 정의는 X와 y를 명확히 나누는 일에서 시작한다.

수치형 변수와 범주형 변수

데이터의 열은 크게 두 종류로 나눌 수 있다.

수치형 변수는 숫자로 크기와 차이를 비교할 수 있는 값이다. 나이, 소득, 온도, 거리, 이용 시간 등이 여기에 해당한다. 예를 들어 40도는 20도보다 높고, 10km는 5km보다 멀다.

범주형 변수는 종류를 나타내는 값이다. 성별, 지역, 상품 종류, 결제 수단, 가입 경로 등이 여기에 해당한다. 숫자로 저장되어 있어도 의미가 범주라면 범주형 변수다. 예를 들어 지역코드=1, 지역코드=2는 계산을 위한 숫자가 아니라 지역을 구분하는 이름표에 가깝다.

이 구분은 중요하다. 모델은 숫자를 계산하지만, 모든 숫자가 같은 의미를 갖지는 않는다. 나이 30과 나이 60은 크기 차이가 의미 있다. 하지만 상품코드 30과 상품코드 60 사이에 "두 배 차이"가 있다고 말할 수는 없다.

분류와 회귀 판단하기

머신러닝 문제를 처음 정의할 때 가장 먼저 구분할 것은 분류와 회귀다.

분류(classification)는 정해진 범주 중 하나를 예측하는 문제다.

  • 이메일이 스팸인지 아닌지

  • 고객이 이탈할지 유지될지

  • 사진 속 동물이 고양이인지 강아지인지

  • 대출 신청이 승인될지 거절될지

타깃 값이 예/아니오, A/B/C, 정상/비정상처럼 범주라면 대체로 분류 문제다.

회귀(regression)는 연속적인 숫자 값을 예측하는 문제다.

  • 집값 예측

  • 다음 달 매출 예측

  • 배송 소요 시간 예측

  • 상품 수요량 예측

타깃 값이 가격, 시간, 점수, 온도처럼 숫자 크기를 갖고 있다면 대체로 회귀 문제다.

단, 숫자라고 해서 무조건 회귀는 아니다. 0=정상, 1=불량처럼 숫자로 저장된 범주는 분류 타깃이다. 반대로 점수처럼 숫자이지만 실제 의사결정이 "합격/불합격"이라면, 회귀보다 분류로 바꾸어 정의할 수도 있다.

중요한 기준은 두 가지다.

  1. 타깃 값의 형태가 범주인가, 연속적인 숫자인가?

  2. 실제 의사결정에서 필요한 출력이 범주인가, 숫자인가?

쉬운 비유 또는 사례

머신러닝 문제 정의는 병원 접수 문진표를 만드는 일과 비슷하다.

의사가 환자를 보기 전에 문진표를 만든다고 하자. 문진표에 어떤 항목을 넣을지는 진료 목적에 따라 달라진다. 감기 가능성을 판단하려면 체온, 기침 여부, 인후통 여부가 중요할 수 있다. 하지만 발목 부상 여부를 판단하는 데는 운동 중 충격, 통증 위치, 부기 정도가 더 중요하다.

데이터셋도 마찬가지다. 모든 열을 무작정 모델에 넣는 것이 좋은 접근은 아니다. 예측 목적에 맞는 특징을 골라야 한다. 또 진료가 끝난 뒤에야 알 수 있는 정보는 처음 진단할 때 사용할 수 없다. 머신러닝에서도 예측 시점에 알 수 없는 정보를 특징으로 넣으면 안 된다.

예를 들어 배송 지연을 예측한다고 하자.

  • 주문 시간

  • 배송 지역

  • 상품 종류

  • 물류센터 위치

  • 출고 예정 시간

이런 정보는 배송 전에 알 수 있으므로 특징으로 사용할 수 있다. 하지만 다음 정보는 조심해야 한다.

  • 실제 배송 완료 시간

  • 고객의 지연 신고 여부

  • 배송 지연 보상 지급 여부

이 값들은 배송이 끝난 뒤에야 알 수 있다. 배송 전에 지연 여부를 예측하는 모델에 이런 열을 넣으면 모델은 미래 정보를 몰래 본 셈이 된다. 이것을 데이터 누수(data leakage)라고 한다.

데이터 누수가 있으면 테스트 성능은 좋아 보일 수 있다. 하지만 실제 서비스에서는 같은 정보를 쓸 수 없기 때문에 성능이 무너진다. 데이터 누수는 초보자가 가장 자주 놓치는 문제 중 하나다.

직접 해보는 실습

이번 실습에서는 scikit-learn에 포함된 예제 데이터를 사용해 데이터셋을 읽고 문제를 정의한다. 아직 모델을 학습하지 않는다. 목표는 "무엇을 예측할지"와 "어떤 열을 특징으로 쓸지"를 정하는 것이다.

1단계: 데이터 불러오기

from sklearn.datasets import load_breast_cancer
import pandas as pd

raw = load_breast_cancer()

df = pd.DataFrame(raw.data, columns=raw.feature_names)
df["target"] = raw.target

print(df.shape)
print(df.head())

df.shape는 데이터의 크기를 보여준다. 앞의 숫자는 행의 개수, 뒤의 숫자는 열의 개수다. 행은 샘플 수이고, 열은 특징과 타깃을 포함한 변수 수다.

2단계: 타깃 확인하기

print(raw.target_names)
print(df["target"].value_counts())

target 열은 예측하고 싶은 값이다. 값이 몇 개의 범주로 나뉘어 있다면 분류 문제로 볼 수 있다. 이 데이터에서는 타깃이 두 범주 중 하나이므로 이진 분류 문제다.

주의할 점이 있다. 이 데이터는 학습용 예제 데이터다. 실제 의료 판단에 사용하기 위한 것이 아니다. 우리는 여기서 데이터셋을 읽고 문제를 정의하는 연습만 한다.

3단계: 특징과 타깃 나누기

X = df.drop(columns=["target"])
y = df["target"]

print(X.shape)
print(y.shape)

X는 모델이 참고할 입력 정보다. y는 모델이 맞혀야 할 정답이다. 이 구분이 흐릿하면 이후 모든 과정이 흔들린다.

4단계: 데이터 품질 점검하기

print(df.isna().sum())        # 결측치 확인
print(df.duplicated().sum())  # 중복 행 확인
print(df.describe())          # 수치 범위 확인

결측치는 값이 비어 있는 상태다. 예를 들어 나이 열에 빈칸이 있거나, 측정값이 기록되지 않은 경우다.

중복 데이터는 같은 샘플이 두 번 이상 들어간 경우다. 중복이 많으면 모델이 특정 사례를 과하게 학습할 수 있다.

describe()는 평균, 표준편차, 최솟값, 최댓값 등을 보여준다. 이를 통해 이상치를 의심할 수 있다. 예를 들어 나이가 999로 기록되어 있거나, 가격이 음수로 들어가 있다면 단순한 숫자가 아니라 데이터 오류일 수 있다.

5단계: 데이터 명세서 작성하기

아래 양식을 채워보자.

데이터셋 이름:
샘플 한 행의 의미:
타깃 열:
타깃 값의 의미:
문제 유형: 분류 / 회귀
사용할 특징:
예측 시점:
예측 시점에 사용할 수 없는 열:
주의할 데이터 품질 문제:

이 양식을 쓰는 이유는 간단하다. 분석을 시작하기 전에 생각을 문장으로 고정하기 위해서다. 좋은 프로젝트는 좋은 메모에서 시작된다.

6단계: 문제 정의 문장 만들기

다음 문장을 완성해보자.

우리는 [예측 시점]에 알 수 있는 [특징]을 사용하여,
[타깃]을 예측하는 [분류/회귀] 문제를 푼다.
이 예측은 [의사결정 목적]에 사용된다.

예시는 다음과 같다.

우리는 검사 시점에 측정된 세포 특성 값을 사용하여,
종양의 범주를 예측하는 분류 문제를 푼다.
이 예측은 머신러닝 분류 흐름을 학습하는 데 사용된다.

실무에서는 마지막 문장이 특히 중요하다. 예측 결과가 어디에 쓰이는지 알아야 평가 기준도 정할 수 있다. 고객 이탈 예측은 마케팅 대상 선별에 쓰일 수 있고, 불량품 예측은 생산 라인 점검에 쓰일 수 있다. 목적이 다르면 좋은 모델의 기준도 달라진다.

흔한 실수와 오류 분석

1. 타깃을 정하지 않고 모델부터 고른다

"랜덤 포레스트를 써볼까요?" 같은 질문은 너무 이르다. 먼저 타깃을 정해야 한다. 타깃이 없으면 문제도 없다. 문제 유형이 정해져야 모델 후보도 좁힐 수 있다.

2. 숫자 타깃을 무조건 회귀로 본다

0, 1, 2로 저장된 값이 등급이나 종류를 뜻할 수 있다. 이 경우 숫자는 계산 대상이 아니라 범주 이름이다. 값의 저장 형태보다 의미를 봐야 한다.

3. 모든 열을 특징으로 넣는다

열이 많다고 항상 좋은 것은 아니다. 예측 시점에 알 수 없는 열, 타깃을 거의 그대로 복사한 열, 식별자에 가까운 열은 조심해야 한다. 예를 들어 고객 ID는 고객을 구분하는 이름표일 뿐, 일반화 가능한 패턴이 아닐 수 있다.

4. 데이터 누수를 놓친다

데이터 누수는 모델이 정답과 너무 가까운 정보를 몰래 보는 상황이다. 예를 들어 대출 연체를 예측하는 모델에 연체 후 독촉 횟수를 넣으면 안 된다. 연체가 일어난 뒤에야 생기는 정보이기 때문이다.

누수를 피하려면 항상 이렇게 질문하자.

"예측해야 하는 그 순간에 이 값을 정말 알고 있었는가?"

대답이 아니오라면 그 열은 특징에서 제외해야 한다.

5. 데이터 품질을 확인하지 않는다

결측치, 이상치, 중복, 잘못된 단위는 모델 성능에 직접 영향을 준다. 예를 들어 어떤 행은 키가 cm 단위이고, 어떤 행은 m 단위라면 모델은 혼란스러운 패턴을 배운다. 데이터 품질 점검은 귀찮은 준비 작업이 아니라 모델링의 일부다.

요약

이번 장에서는 머신러닝 프로젝트의 출발점인 데이터셋 읽기와 문제 정의를 배웠다.

핵심은 다음과 같다.

  • 행은 샘플, 열은 변수다.

  • 예측에 사용하는 열은 특징, 예측하려는 정답 열은 타깃이다.

  • 수치형 변수와 범주형 변수는 의미가 다르다.

  • 타깃이 범주면 분류, 연속적인 숫자면 회귀로 보는 것이 기본이다.

  • 숫자로 저장되어 있어도 의미가 범주라면 분류 문제일 수 있다.

  • 결측치, 이상치, 중복, 단위 오류는 먼저 확인해야 한다.

  • 예측 시점에 알 수 없는 정보를 특징으로 쓰면 데이터 누수가 발생한다.

  • 좋은 모델은 좋은 문제 정의에서 시작된다.

퀴즈

  1. 데이터셋에서 한 행은 보통 무엇을 의미하는가?

  2. 특징과 타깃의 차이를 설명해보자.

  3. 고객 등급이 1, 2, 3으로 저장되어 있다. 이 변수는 수치형 변수인가, 범주형 변수인가? 이유도 함께 말해보자.

  4. 집값을 예측하는 문제는 분류인가, 회귀인가?

  5. 이메일이 스팸인지 아닌지 예측하는 문제는 분류인가, 회귀인가?

  6. 배송 지연 예측 모델에 실제 배송 완료 시간을 넣으면 왜 문제가 될 수 있는가?

  7. 결측치와 이상치는 각각 무엇인가?

  8. 문제 정의 문장에 반드시 들어가야 할 요소 세 가지를 말해보자.

체크리스트

다음 항목에 스스로 답할 수 있으면 이 장의 목표를 달성한 것이다.

  • 데이터셋의 행과 열이 무엇을 의미하는지 설명할 수 있다.

  • 샘플, 특징, 타깃을 구분할 수 있다.

  • 수치형 변수와 범주형 변수를 구분할 수 있다.

  • 타깃 값을 보고 분류와 회귀를 판단할 수 있다.

  • 결측치, 이상치, 중복 데이터를 기본 코드로 확인할 수 있다.

  • 예측 시점에 알 수 없는 열을 찾아낼 수 있다.

  • 데이터 누수의 위험을 쉬운 예로 설명할 수 있다.

  • 데이터 명세서와 문제 정의 문장을 작성할 수 있다.

다음 장 연결

이제 우리는 데이터셋을 읽고, 무엇을 예측할지 정할 수 있다. 다음 단계는 데이터를 어떻게 나누어 모델을 훈련하고 평가할지 배우는 것이다.

같은 데이터를 모델 학습에도 쓰고 성능 확인에도 쓰면, 모델이 정말 새로운 데이터에 잘 작동하는지 알기 어렵다. 그래서 다음 장에서는 훈련 데이터와 테스트 데이터를 나누는 이유를 배운다. 이 과정은 머신러닝 평가의 출발점이다.

책 목록

AI 교육 2권 : 머신러닝 기초: 데이터로 배우고 검증하는 첫 모델

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기