피처
Feature
개념
머신러닝 모델이 예측에 쓰도록 원본 기록에서 뽑아낸 개별 입력 값으로, 무엇을 뽑느냐가 모델의 성능을 크게 가릅니다.
등장 배경
스팸 계정을 걸러내는 일은 원래 사람이 조건을 적어 두는 방식이었습니다. 페이지덱에서도 태오가 "가입 하루 만에 문서를 50개 넘게 만들면 잠근다" 같은 조건을 하나씩 쌓아 올렸습니다. 조건이 열두 개쯤 되자 정상 계정이 걸리기 시작했고, 예외를 붙이면 이번엔 스팸이 빠져나갔습니다. 조건을 사람이 손으로 고르는 한 이 줄다리기는 끝나지 않습니다.
그래서 조건을 사람이 정하는 대신 데이터에서 찾게 만들자는 쪽으로 넘어갑니다. 정답이 붙은 기록을 주고 경계를 스스로 잡게 하는 지도 학습이 그것입니다. 그런데 막상 넘기려고 보니 문제가 하나 있었습니다. "이 계정" 을 통째로 넘길 방법이 없다는 것입니다. 계정에는 가입 시각, 문서 목록, 초대 기록, 로그인 이력이 뒤섞여 있고 기계는 그중 무엇도 그대로 읽지 못합니다.
기계가 다룰 수 있는 것은 정해진 자리에 놓인 숫자뿐입니다. 그래서 계정 하나를 숫자 몇 개로 옮겨 적습니다. 가입 후 며칠이 지났는지, 하루 평균 문서를 몇 개 만드는지, 몇 명을 초대했는지, 문서 안 링크 중 바깥으로 나가는 비율이 얼마인지. 이렇게 옮겨 적은 값 하나하나가 피처입니다. 어떤 조건이 맞는지는 이제 기계가 찾지만, 무엇을 재료로 줄지는 여전히 사람이 정합니다.
작동 방식
원본 기록 한 건을 정해진 개수의 값으로 옮겨 적으면, 기록 전체가 행과 열이 있는 표 한 장이 됩니다. 한 행이 계정 하나이고 한 열이 피처 하나입니다. 학습 데이터 48,000건이면 48,000행짜리 표이고, 열은 보통 수십에서 수백 개입니다.
값의 모양은 셋으로 나뉩니다.
- 숫자 — 가입 후 경과일, 하루 평균 문서 수처럼 그대로 쓸 수 있는 값입니다.
- 범주 — 요금제 이름이나 가입 경로처럼 종류를 가리키는 값입니다. 기계가 크기로 읽으면 안 되니 "무료 플랜인가" 를 0 또는 1로 두는 식으로 칸을 쪼개 넣습니다. 무료·팀·기업을 1·2·3으로 넣으면 기업이 무료의 세 배라는 엉뚱한 관계가 생깁니다.
- 파생 — 원본에 없던 값을 계산해 만든 것입니다. 문서 수와 사용 일수를 나눠 하루 평균을 만들거나, 이번 주 로그인 수를 지난주로 나눠 추세를 만듭니다.
무엇을 넣느냐만큼 어떻게 넣느냐가 결과를 가릅니다. 하루 평균 문서 수 대신 누적 문서 수를 넣으면 2년째 잘 쓰고 있는 멀쩡한 팀이 전부 스팸 쪽으로 밀려납니다. 오래 썼으니 문서가 많은 것인데, 표에는 그저 큰 숫자로만 보이기 때문입니다.
한 가지는 특히 조심합니다. 예측하려는 시점에 아직 알 수 없는 값을 넣으면 안 됩니다. "계정이 정지된 날짜" 를 피처로 넣으면 학습에서는 정확도가 99퍼센트로 뜹니다. 정지된 계정에만 값이 있으니 답을 그대로 베낀 셈입니다. 실제로 새 계정을 판정할 때 그 칸은 비어 있고 모델은 아무것도 못 합니다. 학습에서만 잘 맞는 상태를 과적합이라고 하는데, 이 경우는 원인이 모델이 아니라 표에 있습니다.
쓰이는 곳
가장 먼저 쓰이는 곳은 모델을 만드는 자리입니다. 스팸이냐 아니냐처럼 정해진 칸 중 하나를 맞히는 분류 과제라면, 어떤 알고리즘을 고를지보다 어떤 값을 넣을지가 점수를 더 크게 움직입니다. 모델을 바꿔 정밀도와 재현율이 2퍼센트포인트 오르는 동안, 초대한 사람 수라는 열 하나를 추가해 8퍼센트포인트가 오르는 일이 드물지 않습니다. 앞은 잡은 것 중 진짜의 비율, 뒤는 진짜 중 잡아낸 비율입니다.
운영에 올린 뒤에도 계속 봅니다. 시간이 지나며 예측이 무뎌지는 모델 드리프트는 대개 모델이 아니라 이 값들이 먼저 변합니다. 새 기능이 나와서 하루 평균 문서 수의 전체 평균이 3에서 9로 올라가면, 3을 기준으로 배운 모델은 그대로인데 세상이 바뀐 것입니다. 그래서 감시 대상은 예측 결과뿐 아니라 입력 값의 분포이기도 합니다.
제품팀에도 일이 걸립니다. 표에 넣을 수 있는 값은 그동안 기록해 둔 것뿐이라, 지현이 어떤 행동을 로그로 남길지 정할 때 이미 몇 달 뒤 모델이 쓸 재료가 정해집니다. "초대 버튼을 눌렀다" 를 남기지 않았다면 그 열은 만들 수 없고, 지금부터 남겨도 과거 48,000건에는 빈칸입니다.
실무 용례
"모델 바꾸기 전에 피처부터 다시 보시죠."
알고리즘을 갈아 끼우는 것보다 입력 값을 손보는 쪽이 성능을 더 올린다는 판단입니다.
"그 피처는 정지 이후에 생기는 값이라 쓰면 안 돼요."
예측하는 시점에는 알 수 없는 값이라 학습 점수만 부풀린다는 지적입니다.
"이 피처 만들려면 로그를 새로 쌓아야 해서 두 달 걸립니다."
필요한 기록이 아직 없으니 모델보다 수집이 먼저라는 뜻입니다.
페이지덱에서 스팸 판정을 붙일 때 태오와 지현이 화이트보드 앞에 마주 섰습니다. 태오가 "스팸 계정과 정상 계정이 무엇이 다른지 아는 대로 말해 주세요" 라고 하자 지현이 열 몇 가지를 댔습니다. 문서를 만들기만 하고 열어 보지 않는다, 초대는 안 하면서 링크는 많이 붙인다, 가입하자마자 몰아서 쓰고 사라진다. 태오는 그 말들을 하나씩 숫자로 옮길 수 있는지 따졌고, 남은 여덟 개가 첫 표의 열이 됐습니다.
흔한 오해
열이 많을수록 좋은 모델이 된다고 생각하기 쉽습니다. 정보가 늘면 판단이 정확해진다는 말이 사람에게는 맞으니 자연스러운 오해입니다. 실제로는 답과 관계없는 열이 늘어날수록 모델은 그 안에서 우연한 규칙을 찾아냅니다. 48,000건 중 새벽 3시에 가입한 계정에 스팸이 몇 개 더 있었다는 우연이 규칙으로 굳습니다. 그대로 두면 학습 점수는 올라가는데 실제 계정에서는 떨어지고, 원인을 모델에서 찾느라 시간을 씁니다. 열을 늘릴 때는 왜 이 값이 답과 관계있는지를 한 줄로 설명할 수 있어야 합니다.
이 일을 데이터 담당이 알아서 하는 기술 작업으로 보는 것도 흔합니다. 표를 만드는 코드를 그 사람이 쓰니 그렇게 보입니다. 하지만 무엇을 열로 삼을지는 제품을 아는 사람에게서 나옵니다. 스팸 계정이 초대를 안 한다는 사실은 데이터에 적혀 있지 않고 매일 계정을 들여다본 사람의 머릿속에 있습니다. 이 단계를 건너뛰면 팀은 흔한 값 몇 개로 표를 만들어 놓고 몇 달 동안 모델만 바꿔 가며 점수가 안 오르는 이유를 찾습니다.
자주 헷갈리는 용어
| 용어 | 무엇을 가리키는가 | 피처와의 차이 |
|---|---|---|
| 학습 데이터 | 모델을 가르치는 데 쓰는 기록 전체 | 표 한 장 전체가 학습 데이터이고, 피처는 그 표의 열 하나입니다. 데이터를 더 모으는 일과 열을 잘 고르는 일은 서로 다른 작업입니다 |
같이 보면 좋은 페이지
마지막 업데이트 2026-09-16