모델은 원본 데이터를 그대로 이해하지 못한다
머신러닝 모델을 처음 배우면 이런 기대를 하게 됩니다. "데이터만 많이 넣으면 모델이 알아서 배우겠지." 어느 정도는 맞습니다. 하지만 전통적인 머신러닝에서는 그 말이 절반만 맞습니다. 모델은 데이터를 보지만, 사람이 보는 방식으로 보지는 않습니다.
예를 들어 집값 예측 모델을 만든다고 해 봅시다. 우리 눈에는 "서울 강남구", "2024년 3월", "전용면적 84㎡", "지하철역까지 도보 7분", "준공 12년차" 같은 정보가 꽤 자연스럽게 읽힙니다. 하지만 모델 입장에서는 이것들이 그냥 제각각 생긴 입력값입니다. 어떤 값은 문자이고, 어떤 값은 날짜이고, 어떤 값은 숫자이며, 어떤 값은 단위가 붙어 있습니다. 모델은 "강남구"라는 단어에서 집값이 비쌀 가능성을 사람처럼 바로 떠올리지 못합니다. "2024년 3월"이 봄 이사철과 관련 있을 수 있다는 사실도 스스로 알기 어렵습니다.
그래서 원본 데이터를 모델이 배울 수 있는 형태로 바꾸는 과정이 필요합니다. 이것을 특성 엔지니어링이라고 부릅니다. 특성은 모델에 입력되는 정보입니다. 엔지니어링은 그 정보를 목적에 맞게 만들고 다듬는 작업입니다. 쉽게 말해 특성 엔지니어링은 "모델이 알아듣기 좋은 질문지로 데이터를 다시 쓰는 일"입니다.
앞에서 우리는 모델이 예측하고, 실제값과 비교하고, 오차를 줄이는 과정을 반복한다고 배웠습니다. 그런데 모델이 처음부터 엉뚱한 정보를 입력받고 있다면 아무리 열심히 오차를 줄여도 좋은 방향으로 배우기 어렵습니다. 좋은 재료가 있어야 좋은 요리가 나오듯, 좋은 특징이 있어야 모델도 좋은 패턴을 찾기 쉽습니다.

특성 엔지니어링은 번역 작업에 가깝다
특성 엔지니어링을 어렵게 생각할 필요는 없습니다. 핵심은 원본 데이터를 모델이 처리하기 쉬운 숫자 신호로 번역하는 것입니다.
날짜 데이터를 예로 들어 봅시다. "2026-05-12"라는 값은 사람에게는 날짜로 보이지만, 모델에게는 그대로 넣기 애매한 문자열일 수 있습니다. 이 날짜를 연도, 월, 요일, 주말 여부, 공휴일 여부, 가입 후 경과일 같은 값으로 바꾸면 훨씬 쓸모 있는 특징이 됩니다. 쇼핑몰 매출 예측에서는 월과 요일이 중요할 수 있고, 택시 수요 예측에서는 출근 시간대와 주말 여부가 중요할 수 있습니다.
범주 데이터도 마찬가지입니다. "남성/여성", "무료/베이직/프리미엄", "서울/부산/대구", "Chrome/Safari/Edge"처럼 몇 가지 종류 중 하나를 나타내는 값은 그대로는 계산하기 어렵습니다. 모델이 계산할 수 있도록 숫자로 바꾸어야 합니다. 이때 단순히 서울을 1, 부산을 2, 대구를 3으로 바꾸면 조심해야 합니다. 모델이 "대구는 서울보다 2만큼 크다"처럼 실제로는 없는 순서나 거리감을 배울 수 있기 때문입니다. 그래서 순서가 없는 범주는 보통 원-핫 인코딩처럼 각 범주를 별도의 표시값으로 바꾸는 방식을 많이 씁니다.
텍스트 데이터는 더 까다롭습니다. 스팸 메일 분류기를 만든다면 메일 본문 전체를 모델이 곧장 이해하지는 못합니다. 대신 특정 단어가 등장했는지, 링크가 몇 개 있는지, 느낌표가 지나치게 많은지, 제목에 "무료", "당첨", "긴급" 같은 표현이 있는지 등을 특징으로 만들 수 있습니다. 더 발전된 방식으로는 단어를 숫자 벡터로 바꾸는 임베딩을 사용할 수도 있습니다. 앞에서 임베딩을 배웠던 이유가 여기서 다시 살아납니다. 결국 텍스트도 모델에게는 숫자로 표현되어야 합니다.
금액 데이터도 그냥 숫자이니 끝난 것처럼 보이지만, 실제로는 한 번 더 생각해 볼 여지가 많습니다. 고객의 월 결제액 하나보다 최근 3개월 평균 결제액, 이전 달 대비 결제액 변화율, 전체 구매액 중 할인 구매 비율 같은 값이 더 강한 신호가 될 수 있습니다. 원본 금액은 하나의 사실을 말해 주지만, 잘 만든 파생 특징은 고객의 행동 변화를 말해 줍니다.
결측치: 비어 있는 값도 메시지를 가진다
현실의 데이터는 거의 항상 지저분합니다. 어떤 고객은 나이가 비어 있고, 어떤 상품은 카테고리가 누락되어 있으며, 어떤 거래에는 위치 정보가 없습니다. 이렇게 값이 비어 있는 경우를 결측치라고 합니다.
초보자는 결측치를 보면 "이 행은 못 쓰겠네"라고 생각하기 쉽습니다. 물론 결측치가 너무 많거나 중요한 값이 빠져 있다면 해당 데이터를 제외해야 할 때도 있습니다. 하지만 무조건 버리는 것이 정답은 아닙니다. 데이터가 줄어들면 모델이 배울 기회도 줄어들기 때문입니다.
결측치를 처리하는 대표적인 방법은 다음과 같습니다.
비어 있는 행이나 열을 제거한다.
평균값, 중앙값, 최빈값 같은 대표값으로 채운다.
"값이 비어 있었는가"를 나타내는 별도 특징을 만든다.
도메인 규칙에 따라 의미 있는 기본값으로 채운다.
여기서 흥미로운 점은 결측 자체가 중요한 신호일 수 있다는 것입니다. 예를 들어 고객이 전화번호를 입력하지 않았다는 사실은 서비스 이용 적극성과 관련 있을 수 있습니다. 건강검진 데이터에서 특정 검사가 비어 있다는 사실은 단순한 누락이 아니라 의사가 그 검사가 필요 없다고 판단했다는 의미일 수도 있습니다. 온라인 서비스에서 추천인 코드가 비어 있다는 것은 유입 경로를 모른다는 뜻이면서 동시에 광고 유입 고객일 가능성을 암시할 수도 있습니다.
그래서 결측치를 만났을 때는 "어떻게 채울까?"만 묻지 말고, 먼저 "왜 비어 있을까?"를 물어야 합니다. 머신러닝에서 좋은 질문은 종종 좋은 특징으로 이어집니다.
스케일링: 숫자의 크기를 맞춰 주는 일
모델에 들어가는 숫자들은 서로 단위가 다릅니다. 나이는 20에서 80 사이일 수 있고, 연봉은 수천만 단위일 수 있으며, 웹사이트 방문 횟수는 0에서 수만까지 갈 수도 있습니다. 어떤 모델은 이런 숫자 크기의 차이에 민감합니다.
예를 들어 두 고객이 얼마나 비슷한지 거리를 계산하는 모델을 생각해 봅시다. 나이 차이는 5살인데 연봉 차이는 2,000만 원이라면, 단위 때문에 연봉이 거리 계산을 거의 지배해 버릴 수 있습니다. 실제로는 나이, 방문 횟수, 최근 구매 시점이 모두 중요할 수 있는데 숫자의 크기가 큰 특징 하나가 다른 특징들을 덮어 버리는 것입니다.
이럴 때 사용하는 작업이 스케일링입니다. 스케일링은 숫자 특징들의 크기 범위를 비슷하게 맞추는 과정입니다. 대표적으로 평균을 0, 표준편차를 1 근처로 맞추는 표준화가 있고, 값을 0과 1 사이로 압축하는 정규화가 있습니다. 정확한 수식보다 중요한 감각은 이것입니다. 모델이 숫자의 단위 차이에 속지 않도록, 비교하기 쉬운 크기로 맞춰 주는 것입니다.
모든 모델이 스케일링을 똑같이 필요로 하지는 않습니다. 선형회귀, 로지스틱 회귀, K-means, 거리 기반 방법, 경사하강법을 사용하는 모델은 스케일링의 영향을 크게 받을 수 있습니다. 반면 결정트리, 랜덤포레스트, 그래디언트 부스팅 같은 트리 기반 모델은 상대적으로 스케일링에 덜 민감합니다. 트리는 "값이 30보다 큰가?"처럼 기준으로 데이터를 나누기 때문에 단위가 바뀌어도 데이터의 순서가 유지되면 큰 문제가 없는 경우가 많습니다.
하지만 실전에서는 모델을 바꿔 가며 실험하는 일이 많습니다. 그래서 스케일링이 필요한 모델을 사용할 가능성이 있다면 처음부터 전처리 흐름에 포함해 두는 편이 안전합니다.
인코딩: 문자를 숫자로 바꾸되, 의미를 왜곡하지 않기
범주형 데이터를 숫자로 바꾸는 작업을 인코딩이라고 합니다. 인코딩의 목표는 모델이 범주 정보를 사용할 수 있게 만드는 것입니다. 그런데 여기에는 작은 함정이 있습니다. 숫자로 바꾸는 순간, 모델이 그 숫자에 불필요한 의미를 부여할 수 있다는 점입니다.
예를 들어 고객 등급이 "브론즈, 실버, 골드, 플래티넘"이라면 1, 2, 3, 4로 바꾸는 것이 꽤 자연스럽습니다. 실제로 등급에는 순서가 있기 때문입니다. 플래티넘은 골드보다 높은 등급이고, 골드는 실버보다 높은 등급입니다. 이런 경우에는 순서형 인코딩이 잘 맞을 수 있습니다.
반대로 도시 이름은 다릅니다. "서울, 부산, 광주"를 1, 2, 3으로 바꾸면 모델은 광주가 서울보다 크다거나 부산이 서울과 광주의 중간쯤에 있다는 이상한 관계를 배울 수 있습니다. 도시에는 숫자 순서가 없습니다. 이런 경우에는 각 도시를 별도의 칸으로 펼치는 원-핫 인코딩이 더 자연스럽습니다. 서울이면 서울 칸만 1, 부산이면 부산 칸만 1이 되는 방식입니다.
범주의 종류가 너무 많을 때는 또 다른 고민이 생깁니다. 상품 ID가 수십만 개라면 원-핫 인코딩만으로 특징 수가 폭발할 수 있습니다. 이럴 때는 드물게 등장하는 범주를 "기타"로 묶거나, 빈도 기반 특징을 만들거나, 임베딩 같은 방법을 고려할 수 있습니다. 중요한 것은 "문자를 숫자로 바꿨다"에서 멈추지 않는 것입니다. 바꾼 숫자가 모델에게 어떤 의미로 읽힐지까지 생각해야 합니다.
파생 특징: 원본에 숨어 있는 힌트를 꺼내기
특성 엔지니어링의 재미는 파생 특징에서 시작됩니다. 파생 특징은 원본 데이터를 조합하거나 변형해서 새로 만든 특징입니다. 모델이 직접 찾기 어려운 관계를 사람이 힌트로 만들어 주는 셈입니다.
집값 예측을 다시 떠올려 봅시다. 원본 데이터에 건축 연도가 있다면, 현재 연도에서 건축 연도를 빼서 "건물 나이"를 만들 수 있습니다. 전용면적과 방 개수가 있다면 "방 하나당 면적"을 만들 수 있습니다. 지하철역까지의 거리가 있다면 "역세권 여부"라는 특징을 만들 수 있습니다. 단순히 숫자를 넣는 것보다, 집값과 더 직접적으로 연결된 질문으로 바꾸는 것입니다.
고객 이탈 예측에서는 최근 행동 변화가 중요할 수 있습니다. 총 접속 횟수보다 최근 7일 접속 횟수, 최근 30일 접속 감소율, 마지막 접속 후 지난 일수, 고객센터 문의 증가 여부가 더 강한 신호가 될 수 있습니다. 고객은 어느 날 갑자기 떠나는 것처럼 보이지만, 데이터에는 떠나기 전의 작은 흔들림이 남아 있는 경우가 많습니다. 좋은 특징은 그 흔들림을 포착합니다.
스팸 메일 분류에서는 메일 길이, 링크 개수, 대문자 비율, 특정 단어 등장 여부, 발신자 도메인, 첨부파일 개수 같은 특징이 도움이 될 수 있습니다. 추천 시스템에서는 사용자가 최근 본 상품 카테고리, 같은 상품을 본 다른 사용자의 구매율, 사용자와 상품의 과거 상호작용 횟수 같은 특징을 만들 수 있습니다.
파생 특징을 만들 때 자주 쓰는 관점은 다음과 같습니다.
비율: 전체 중 특정 행동이 차지하는 비중은 얼마인가?
변화량: 이전 기간과 비교해 증가했는가, 감소했는가?
누적값: 지금까지 얼마나 많이 쌓였는가?
최근성: 마지막 행동 이후 얼마나 시간이 지났는가?
빈도: 일정 기간 동안 얼마나 자주 발생했는가?
조합: 두 특징을 함께 볼 때 새로운 의미가 생기는가?
이런 특징들은 단순한 숫자 계산처럼 보이지만, 사실은 도메인 지식이 들어간 질문입니다. "고객이 떠날 것인가?"를 예측하려면 고객 행동을 알아야 합니다. "집값이 얼마인가?"를 예측하려면 부동산 시장에서 사람들이 무엇을 중요하게 보는지 알아야 합니다. "메일이 스팸인가?"를 예측하려면 스팸 메일이 어떤 방식으로 사람을 속이는지 알아야 합니다.
전통 머신러닝에서 도메인 지식이 중요한 이유가 여기에 있습니다. 모델은 계산을 잘하지만, 어떤 질문이 중요한지는 사람이 더 잘 알 때가 많습니다.
좋은 특징은 예측 대상과 연결되어 있다
특징을 많이 만든다고 항상 좋은 것은 아닙니다. 모델에게 불필요한 정보를 너무 많이 주면 오히려 혼란스러워질 수 있습니다. 특히 데이터가 많지 않은 상황에서는 쓸데없는 특징이 과적합을 부를 수 있습니다. 앞에서 배운 것처럼 모델이 학습 데이터의 잡음까지 외워 버릴 수 있기 때문입니다.
좋은 특징은 예측 대상과 관련이 있어야 합니다. 집값을 예측하는데 거래 요일은 지역이나 면적보다 덜 중요할 수 있습니다. 고객 이탈을 예측하는데 고객의 생일 월은 서비스 이용 패턴보다 약할 수 있습니다. 물론 의외의 신호가 숨어 있을 수도 있으므로 처음부터 단정할 필요는 없습니다. 하지만 특징을 만들 때마다 "이 값이 예측하려는 대상과 어떤 관계가 있을까?"라고 물어야 합니다.
또 하나 중요한 기준은 안정성입니다. 학습 데이터에서만 우연히 잘 맞고, 앞으로 들어올 데이터에서는 의미가 사라지는 특징은 위험합니다. 예를 들어 특정 이벤트 기간에만 생긴 쿠폰 코드가 구매 여부와 강하게 연결되어 있었다면, 그 이벤트가 끝난 뒤에는 모델 성능이 떨어질 수 있습니다. 모델이 세상의 규칙을 배운 것이 아니라 특정 시기의 우연을 외운 것입니다.
그래서 좋은 특징은 다음 조건을 만족할수록 좋습니다.
예측 대상과 논리적으로 연결되어 있다.
학습 데이터뿐 아니라 앞으로 들어올 데이터에서도 얻을 수 있다.
한 시점의 우연한 패턴에만 지나치게 의존하지 않는다.
모델이 이해하기 쉬운 형태로 정리되어 있다.
머신러닝 프로젝트에서 "좋은 모델을 골랐는데 성능이 별로다"라는 상황은 자주 발생합니다. 이때 모델을 더 복잡하게 바꾸기 전에 특징을 다시 봐야 합니다. 질문지가 엉성하면 아무리 똑똑한 학생도 좋은 답을 하기 어렵습니다.
미래 정보를 몰래 넣으면 안 된다
특성 엔지니어링에서 가장 조심해야 할 것은 미래 정보를 몰래 넣는 일입니다. 이것을 다음 장에서 자세히 다룰 데이터 누수라고 합니다. 여기서는 감각만 먼저 잡아 봅시다.
고객 이탈 예측 모델을 만든다고 해 봅시다. 목표는 "다음 달에 고객이 이탈할지"를 미리 예측하는 것입니다. 그런데 특징에 "해지 신청일"이 들어가 있다면 어떻게 될까요? 모델은 아주 높은 성능을 보일 것입니다. 해지 신청일이 있으면 이탈 고객일 가능성이 높으니까요. 하지만 이것은 예측이 아닙니다. 이미 벌어진 일을 보고 답을 맞힌 것입니다.
타이타닉 생존 예측에서도 비슷한 일이 생길 수 있습니다. 생존 여부를 예측해야 하는데, 구조 이후에 기록된 정보가 특징에 들어간다면 모델은 현실에서는 사용할 수 없는 힌트를 갖게 됩니다. 집값 예측에서도 실제 거래가 끝난 뒤에만 알 수 있는 정보가 들어가면 문제가 됩니다. 모델은 미래를 예측하는 척하지만 사실은 정답지를 훔쳐보고 있는 셈입니다.
특히 파생 특징을 만들 때 미래 정보가 섞이기 쉽습니다. 예를 들어 "고객의 전체 기간 평균 결제액"을 만들었는데, 그 전체 기간 안에 예측 시점 이후의 결제 내역이 포함되어 있다면 누수가 됩니다. "지난 30일"이라는 표현도 기준 시점이 명확하지 않으면 위험합니다. 모델을 실제로 사용할 순간에 알 수 있는 정보만 특징으로 만들어야 합니다.
특성 엔지니어링의 황금 질문은 이것입니다. "예측해야 하는 그 순간에, 이 값을 정말 알고 있었을까?" 답이 아니오라면 그 특징은 모델에 넣으면 안 됩니다.
전처리는 학습 데이터에서 배운 규칙으로 적용한다
앞 장에서 우리는 학습 데이터, 검증 데이터, 테스트 데이터를 나누는 이유를 배웠습니다. 이 구분은 특성 엔지니어링에서도 매우 중요합니다.
예를 들어 결측치를 평균값으로 채운다고 합시다. 이때 평균은 어디에서 계산해야 할까요? 전체 데이터에서 계산하면 안 됩니다. 테스트 데이터의 정보가 학습 과정에 살짝 섞이기 때문입니다. 평균을 계산하는 일도 넓은 의미에서는 데이터를 보고 규칙을 배우는 일입니다. 따라서 평균은 학습 데이터에서만 계산하고, 그 평균으로 검증 데이터와 테스트 데이터의 결측치를 채워야 합니다.
스케일링도 마찬가지입니다. 평균과 표준편차를 전체 데이터에서 구한 뒤 모든 데이터에 적용하면 테스트 데이터의 분포 정보가 미리 들어갑니다. 인코딩에서도 비슷한 문제가 생깁니다. 범주 목록을 만들거나, 드문 범주를 묶거나, 특정 범주의 평균 타깃값을 이용하는 방식은 반드시 학습 데이터 기준으로 처리해야 합니다.
정리하면, 특성 엔지니어링에는 두 종류의 작업이 있습니다. 하나는 단순히 값을 변환하는 작업입니다. 예를 들어 날짜에서 월을 뽑는 것은 각 행의 값만 보고 할 수 있습니다. 다른 하나는 데이터 전체를 보고 규칙을 계산하는 작업입니다. 평균으로 결측치를 채우거나, 스케일링 기준을 계산하거나, 범주별 통계를 만드는 작업이 여기에 해당합니다. 두 번째 종류의 작업은 반드시 학습 데이터에서만 규칙을 배워야 합니다.
이 원칙을 지키면 검증 성능과 테스트 성능을 더 믿을 수 있습니다. 모델이 실제 세상에서 사용할 수 없는 정보를 몰래 본 것이 아니라, 정해진 시점에 주어진 정보만으로 예측했기 때문입니다.
전통 머신러닝에서 특징은 모델의 눈이다
딥러닝은 원본 데이터에서 표현을 스스로 학습하는 능력이 강합니다. 이미지 모델은 픽셀에서 선과 모양을 배우고, 언어 모델은 단어와 문장의 관계를 벡터 공간에 정리합니다. 그래서 딥러닝에서는 특성 엔지니어링의 일부를 모델이 대신하는 경우가 많습니다.
하지만 전통 머신러닝에서는 여전히 사람이 만든 특징이 성능을 크게 좌우합니다. 선형회귀, 로지스틱 회귀, 결정트리, 랜덤포레스트, 그래디언트 부스팅은 모두 좋은 입력을 받았을 때 더 좋은 결과를 냅니다. 특히 데이터가 표 형태로 정리된 업무 문제에서는 특성 엔지니어링이 모델 선택만큼 중요하거나, 때로는 그보다 더 중요합니다.
재미있는 점은 특성 엔지니어링을 잘할수록 데이터에 대한 이해도 깊어진다는 것입니다. 좋은 특징을 만들려면 원본 데이터를 자세히 봐야 합니다. 값이 왜 비어 있는지, 어떤 범주가 자주 나오는지, 시간에 따라 행동이 어떻게 달라지는지, 예측하려는 사건이 발생하기 전에 어떤 징후가 나타나는지 살펴보게 됩니다. 그러다 보면 모델을 만들기 전보다 문제 자체를 더 잘 이해하게 됩니다.
머신러닝은 단순히 알고리즘을 호출하는 일이 아닙니다. 데이터 속에 숨어 있는 신호를 찾아 모델이 볼 수 있게 꺼내는 일입니다. 특성 엔지니어링은 바로 그 신호를 꺼내는 손전등입니다.
작은 예: 고객 이탈 예측 특징 만들기
고객 이탈 예측 모델을 만든다고 상상해 봅시다. 원본 데이터에는 고객 ID, 가입일, 요금제, 월 결제액, 최근 접속일, 고객센터 문의 횟수, 지난달 사용 시간, 이번 달 사용 시간, 이탈 여부가 있습니다. 이 데이터를 그대로 넣을 수도 있지만, 조금만 다듬으면 모델이 훨씬 배우기 쉬운 형태가 됩니다.
가입일은 그대로 쓰기보다 가입 후 경과일로 바꿀 수 있습니다. 오래된 고객과 신규 고객은 이탈 패턴이 다를 수 있기 때문입니다. 요금제는 범주형 데이터이므로 원-핫 인코딩하거나 등급 순서가 분명하다면 순서형 값으로 바꿀 수 있습니다. 월 결제액은 숫자지만, 요금제 대비 결제액이 높은지 낮은지 같은 특징을 추가로 만들 수도 있습니다.
최근 접속일은 "마지막 접속 후 지난 일수"로 바꾸면 더 직접적인 신호가 됩니다. 지난달 사용 시간과 이번 달 사용 시간이 있다면 사용 시간 변화량과 변화율을 만들 수 있습니다. 고객센터 문의 횟수는 단순 총합보다 최근 문의 증가 여부가 중요할 수 있습니다. 서비스에 불만이 커진 고객은 문의가 늘어난 뒤 이탈할 가능성이 있기 때문입니다.
이렇게 원본 데이터는 몇 개 안 되어도, 질문을 바꾸면 훨씬 풍부한 특징 세트가 됩니다. 모델은 이제 단순히 "사용 시간이 몇 시간인가?"만 보는 것이 아니라 "최근 사용이 줄었는가?", "오래된 고객인가?", "문의가 갑자기 늘었는가?", "마지막 접속이 오래전인가?" 같은 더 예측에 가까운 신호를 보게 됩니다.
단, 여기서도 기준 시점이 중요합니다. 다음 달 이탈을 예측한다면, 이번 달 말까지 알 수 있는 정보만 사용해야 합니다. 다음 달 고객센터 문의 횟수나 다음 달 결제 실패 여부를 특징에 넣는 순간, 모델은 미래를 훔쳐보게 됩니다.
특성 엔지니어링을 할 때의 기본 순서
실전에서는 특성 엔지니어링을 한 번에 완벽하게 끝내기 어렵습니다. 보통은 작게 시작해서, 모델을 학습시키고, 평가하고, 다시 특징을 개선하는 과정을 반복합니다. 앞에서 배운 머신러닝의 핵심 흐름과 같습니다. 데이터를 준비하고, 특징을 만들고, 모델이 예측하고, 실제값과 비교하고, 오차를 줄이고, 새로운 데이터에 적용합니다.
처음에는 원본 데이터의 각 열이 무엇을 의미하는지 확인합니다. 숫자인지, 범주인지, 날짜인지, 텍스트인지, 값이 비어 있는지 살펴봅니다. 그다음 모델이 학습할 수 있도록 결측치 처리, 스케일링, 인코딩 같은 기본 전처리를 적용합니다. 이후 도메인 지식을 바탕으로 비율, 변화량, 누적값, 최근성 같은 파생 특징을 만듭니다. 마지막으로 검증 데이터에서 실제로 성능이 좋아지는지 확인합니다.
특징을 만들었는데 검증 성능이 좋아지지 않을 수도 있습니다. 괜찮습니다. 그 특징은 생각보다 신호가 약했거나, 이미 다른 특징이 같은 정보를 담고 있었을 수 있습니다. 중요한 것은 감으로만 결정하지 않는 것입니다. 좋은 아이디어를 특징으로 만들고, 검증 데이터로 확인하고, 결과를 바탕으로 다음 실험을 이어 가면 됩니다.
이 장에서 기억할 것
특성 엔지니어링은 원본 데이터를 모델이 더 잘 배울 수 있는 특징으로 바꾸는 과정입니다. 날짜는 월, 요일, 경과일로 바뀔 수 있고, 범주는 인코딩을 통해 숫자가 될 수 있으며, 텍스트는 단어 등장 여부나 임베딩으로 표현될 수 있습니다. 금액이나 사용량 같은 숫자도 비율, 변화량, 누적값으로 바꾸면 더 강한 신호가 됩니다.
결측치 처리는 단순히 빈칸을 메우는 일이 아니라, 왜 비어 있는지를 해석하는 일입니다. 스케일링은 숫자의 단위 차이 때문에 모델이 특정 특징에 과도하게 끌리지 않도록 돕습니다. 인코딩은 범주 정보를 숫자로 바꾸되, 존재하지 않는 순서나 거리감을 만들지 않도록 조심해야 합니다.
무엇보다 좋은 특징은 예측 대상과 관련이 있어야 하며, 예측 시점에 실제로 알 수 있는 정보여야 합니다. 미래 정보를 몰래 포함한 특징은 검증에서는 놀라운 성능을 보여 줄 수 있지만, 현실에서는 무너집니다. 다음 장에서는 이 위험을 더 본격적으로 다룰 것입니다. 데이터 누수는 머신러닝 모델이 가장 그럴듯하게 실패하는 방식 중 하나입니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.