이 모듈의 도달 목표

텍스트·이미지 중 나의 데이터 경로 선택하기

텍스트와 이미지가 숫자 특징으로 바뀌는 방식을 비교하고 선택한 데이터 경로에서 최근접 중심 분류기를 완성합니다.

결과물 · 텍스트 또는 이미지 특징 분류기
약 7~10시간
  • 텍스트와 이미지가 서로 다른 전처리를 거쳐 숫자 특징이 되는 과정을 설명한다
  • 텍스트와 픽셀 배열에서 해석 가능한 특징을 추출한다
  • 라벨별 특징 중심을 학습하고 새 입력을 거리로 분류한다
  • 라벨·특징 정렬 오류와 경로별 실패 사례를 확인한다
01

데이터 경로는 문제와 입력 형태에 맞춰 고른다

문장 의미나 문자 패턴이 핵심이면 텍스트 경로를, 픽셀의 밝기·색·모양이 핵심이면 이미지 경로를 고릅니다. 어느 경로든 원본을 숫자로 바꾸고, 라벨과 함께 학습하며, 보지 않은 입력에서 평가하는 공통 흐름은 같습니다.

일상에서 보면같은 목적지라도 화물 종류에 따라 도로와 철도를 고르지만 출발·운송·도착 검사는 공통인 것과 같습니다.
data_kind = 'text'
path = '텍스트 경로' if data_kind == 'text' else '이미지 경로'
print(path)
실행 결과
텍스트 경로
한 줄씩 보기
  1. 다룰 데이터 종류를 확인합니다.
  2. 입력 형태에 맞는 경로를 선택합니다.
  3. 선택 뒤에는 공통 분류 흐름을 적용합니다.
직접 값 바꾸기손글씨 숫자와 고객 후기에는 각각 어느 경로가 맞는지 설명하세요.
흔한 실수유행하는 모델을 먼저 정하고 문제에 맞지 않는 데이터를 억지로 끼우면 목표와 평가가 흐려집니다.

짧은 확인문장 속 느낌표와 숫자 패턴을 분류하려면 어느 경로가 자연스러울까요?

02

텍스트는 측정 가능한 숫자 특징으로 바꾼다

컴퓨터가 문자열을 분류하려면 길이, 특정 문자 수, 단어 빈도처럼 비교 가능한 숫자 벡터로 바꿔야 합니다. 이번 프로젝트는 원리를 선명하게 보기 위해 전체 길이, 숫자 문자 수, 느낌표 수를 사용합니다.

일상에서 보면문장을 그대로 저울에 올리는 대신 글자 수와 특정 표시의 개수를 표로 기록하는 것과 같습니다.
text = 'room 101!'
features = [len(text), sum(c.isdigit() for c in text), text.count('!')]
print(features)
실행 결과
[9, 3, 1]
한 줄씩 보기
  1. 원본 문자열을 준비합니다.
  2. 길이와 숫자 문자 수를 셉니다.
  3. 느낌표 수를 더해 세 특징을 만듭니다.
직접 값 바꾸기문자열에 느낌표를 하나 더 붙였을 때 어느 특징만 변하는지 확인하세요.
흔한 실수학습과 새 입력에 서로 다른 특징 추출 규칙을 쓰면 같은 공간에서 비교할 수 없습니다.

짧은 확인텍스트 특징 벡터 [9, 3, 1]의 각 숫자는 무엇을 뜻할까요?

03

이미지는 픽셀 범위를 맞춘 뒤 밝기 특징을 만든다

이미지는 픽셀 숫자 배열입니다. 0~255 값을 255로 나눠 0~1 범위로 맞추고 평균·최대 밝기와 밝은 픽셀 비율을 구하면 크기가 다른 값도 일관된 기준으로 비교할 수 있습니다.

일상에서 보면서로 다른 단위의 온도를 같은 단위로 맞춘 뒤 평균과 최고값을 비교하는 것과 같습니다.
import numpy as np
pixels = np.array([0, 128, 255]) / 255.0
print(round(pixels.mean(), 2), pixels.max(), round(np.mean(pixels >= 0.5), 2))
실행 결과
0.5 1.0 0.67
한 줄씩 보기
  1. 세 픽셀값을 배열로 만듭니다.
  2. 255로 나눠 0~1로 정규화합니다.
  3. 평균·최대·밝은 비율을 계산합니다.
직접 값 바꾸기모든 픽셀을 0으로 바꾸면 세 특징이 어떻게 되는지 확인하세요.
흔한 실수학습 이미지는 0~1, 새 이미지는 0~255로 두면 거리 계산이 픽셀 범위 차이에 지배됩니다.

짧은 확인픽셀 정규화를 학습과 질의 이미지에 같은 방식으로 적용해야 하는 이유는 무엇일까요?

04

클래스 중심은 같은 라벨 특징의 평균 위치다

같은 라벨의 특징 벡터를 모아 축별 평균을 내면 그 클래스의 대표 위치인 중심이 됩니다. 새 입력은 각 중심까지의 유클리드 거리를 비교해 가장 가까운 라벨로 분류할 수 있습니다.

일상에서 보면여러 도시의 위치에서 지역별 중심점을 구하고 새 위치가 어느 중심에 가까운지 보는 것과 같습니다.
import numpy as np
urgent = np.array([[5, 0, 1], [5, 0, 2]])
print(urgent.mean(axis=0).tolist())
실행 결과
[5.0, 0.0, 1.5]
한 줄씩 보기
  1. 같은 urgent 라벨의 두 특징을 모읍니다.
  2. 각 특징 열의 평균을 구합니다.
  3. 대표 중심 벡터를 얻습니다.
직접 값 바꾸기[7, 0, 3] 샘플을 추가하면 중심이 어느 방향으로 움직이는지 확인하세요.
흔한 실수라벨만 정렬하고 특징 행을 함께 옮기지 않으면 잘못된 클래스에 데이터가 들어갑니다.

짧은 확인클래스 중심을 구할 때 axis=0으로 평균내는 이유는 무엇일까요?

05

거리와 실패 사례로 단순 분류기의 한계를 읽는다

가장 가까운 중심의 라벨이 예측이지만 거리 자체도 중요합니다. 모든 중심에서 멀거나 두 중심의 거리가 비슷하면 확신하기 어렵습니다. 길이·밝기 같은 단순 특징은 이해하기 쉽지만 문맥과 모양을 충분히 담지 못하므로 실패 사례를 기록해야 합니다.

일상에서 보면가장 가까운 병원을 찾았어도 거리가 매우 멀다면 안전하다고 말하기 어려운 것과 같습니다.
import numpy as np
query = np.array([6.0, 0.0, 2.0])
center = np.array([5.0, 0.0, 1.5])
print(round(np.linalg.norm(query - center), 4))
실행 결과
1.118
한 줄씩 보기
  1. 질의 특징과 클래스 중심을 준비합니다.
  2. 두 벡터 차이의 길이를 계산합니다.
  3. 작은 거리일수록 중심과 비슷하다고 해석합니다.
직접 값 바꾸기query의 첫 특징을 20으로 바꾸고 거리가 얼마나 커지는지 확인하세요.
흔한 실수최근접 라벨이 나왔다는 사실만으로 예측이 충분히 신뢰할 만하다고 단정하면 안 됩니다.

짧은 확인예측 거리까지 함께 출력하면 어떤 실패를 발견할 수 있을까요?

텍스트를 숫자 특징으로 바꾸기

  1. 분류에 사용할 측정값을 정합니다.
  2. 문자열에서 각 특징을 계산합니다.
  3. 특징 순서를 고정합니다.
  4. 다른 문자열에도 같은 함수를 적용합니다.
def encode_text(text):
    return [len(text), sum(1 for char in text if char.isdigit()), text.count('!')]

text = input()
features = encode_text(text)
print(f'길이: {features[0]}')
print(f'숫자: {features[1]}')
print(f'느낌표: {features[2]}')
print(f'특징: {features}')

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1데이터 경로를 고르는 가장 중요한 기준은?
2텍스트를 분류 전에 숫자로 바꾸는 이유는?
30~255 픽셀을 0~1로 바꾸는 식은?
4클래스 중심은 어떻게 계산하는가?
5예측 라벨과 함께 거리를 보는 이유는?