본 프로젝트는 Speed Dating 데이터셋을 기반으로
전처리 및 피처 엔지니어링을 통해 단순 수집된 정보를 넘어서 변수 간의 관계와 의미를 확장한 새로운 피처를 설계하고, 이를 함수화하여 재활용 가능한 코드로 패키징하는 것을 목표로 한다.
아래의 두 단계로 나누어 진행하였다.
피처 엔지니어링
✓ feature-engineering-dating.ipynb 파일에서 다양한 전처리 및 변수 변환 기법을 활용하여 피처 엔지니어링 수행
모듈화 및 패키징
✓ 실습에 사용된 주요 전처리 로직들을 함수로 분리하여 .py 파일로 모듈화
✓ src/ 디렉토리에 저장한 후, 해당 함수들을 불러와 동일한 실습을 함수 기반으로 재현
✓ 이를 통해 코드의 재사용성과 유지 보수성을 높이는 과정을 경험
본 프로젝트에서 사용된 데이터는 소개팅(Speed Dating) 데이터셋으로
한 사람(A)이 여러 명의 이성(B)들과 짧은 시간 동안 대화를 나눈 뒤, 서로에 대한 평가를 남긴 결과를 수집한 설문 기반 데이터이다.
이 데이터는 참가자가 중요하게 생각하는 특성, 실제 상대에 대한 평가 점수, 그리고 최종적으로 매칭이 성사되었는지를 나타내는 결과 컬럼 등으로 구성되어 있다.
예측 목표(종속변수)는 match 컬럼이며, 이를 기반으로 상대방과의 매칭 여부를 예측하는 모델을 구성할 수 있다.
| 그룹 | 예시 컬럼 | 설명 |
|---|---|---|
| 참가자 정보 | gender, age, race | 참가자 본인의 성별, 나이, 인종 |
| 파트너 정보 | age_o, race_o | 해당 줄에서의 상대방 성향 |
| 중요도 (가중치) | pref_o_*, *_important | 이성에게 중요하다고 생각하는 특성에 대한 가중치 (총합 100) |
| 파트너 평가 점수 | o_* | 참가자에 대해 파트너가 준 평가 점수 (1~10) |
| 참가자 평가 점수 | *_partner | 파트너에 대해 참가자가 준 평가 점수 (1~10) |
| 기타 지표 | interests_correlate, like, guess_prob_liked 등 | 취향 유사도, 만족도 예측, 기대 지표 등 |
| 예측 대상 | match | 실제 매칭 여부 (1: 매칭됨, 0: 매칭되지 않음) |
attractive 외모/매력sincere 진심/성격intelligence 지능/똑똑함funny 유머감각ambitious 목표/야망shared_interests 취미/관심사 유사도pref_o_* 컬럼들의 합은 반드시 100이어야 함 → 가중치 비율 정규화 필요_o)에 10을 초과하는 비정상 값(예: 10.5, 11) 존재 → 정제 필요interests_correlate는 1 ~ 1 범위의 상관계수 개념 → 연속형 변수로 해석match는 분류 모델의 Target → 결측치 제거 필요feature-engineering-dating/
├── feature-engineering-dating.ipynb # 피처 엔지니어링 실습 노트북
├── .gitignore
├── README.md
└── src/ # 전처리 함수 모듈
├── code_function_dating.ipynb # 함수화된 전처리 흐름을 재구성한 노트북
├── col_rename.py # 컬럼명 일괄 변경
├── missing_func.py # 결측치 처리 함수
├── outlier_func.py # 이상치 제거 로직
├── imp_func.py # 가중치 비율 계산
├── age_gap_func.py # 나이 차이 파생 변수 생성
├── race_func.py # 동일 인종 여부로 가중치 부여
├── rating_func.py # 평가 점수 평균 계산
├── sel_one_func.py # 모델링을 위한 컬럼 정리
├── pre_func.py # 전체 전처리 파이프라인 통합
└── ...
[1] 컬럼명 정리 및 통일
pref_o_, attractive_o 등 통일성이 부족한 컬럼명을 o_important_, i_score_와 같은 구조로 일관되게 재정의
→ 변수 그룹(상대 평가/본인 평가/중요도 등)을 명확히 구분하여 후속 처리와 시각화, 분석의 확장성과 가독성을 높이기 위함
[2] 결측치 및 무응답 처리
6가지 주요 평가 항목 중 2개 이상 누락된 항목이 발견되어 drop하는 방향으로 처리
일부 항목의 결측치는 -99로 처리하여 무응답 정보를 유지
→ 응답 누락이 단순 결측이라기보다 참가자 성향의 일부일 수 있으므로, 무작정 제거하지 않고 분석 가능한 형태로 변환
[3] Feature Engineering - 중요도 비율화
6가지 주요 평가 항목의 합이 100이 되지 않는 경우, 총합을 기준으로 비율을 재계산하여 정규화된 가중치 반영
→ 합이 100은 아니어도 사용자 의도가 담긴 상대적 중요도는 유의미하다고 보고
→ 정규화된 비중을 기반으로 모델이 각 항목의 중요도를 학습할 수 있게 하기 위함
[4] Feature Engineering - Age
두 성별 간의 '나이차'를 계산 후 결측치를 -99로 유지하여 파생 변수에도 반영
→ 단순한 수치보다도 나이 차이의 방향성(남성이 많음/여성이 많음)도 관계 형성에 영향을 줄 수 있기 때문에 이를 별도의 컬럼으로 생성
[5] Feature Engineering - Race
참가자와 상대방의 인종이 같은지 여부를 same_race 변수로 생성
인종이 다를 경우 same_race = -1로 처리하여 차이를 명확히 표현
→ 단순히 같은지 여부만 보는 것보다, 중요도(importance_same_race)에 따라 의미가 달라질 수 있기 때문
[6] Feature Engineering - Rating
o_rating_total, i_rating_total, 그리고 두 값을 활용한 조화 평균(rating_mean) 계산
o_important가 0인 항목은 평균 산출에서 제외하기 위해 -99로 처리
→ 평가 항목별로 중요도와 점수 간의 불균형을 보정하기 위함
→ 조화 평균은 두 값이 모두 높을 때 가장 높게 나타나는 특성이 있어, 매칭 예측력 향상에 적합한 변수로 판단
[7] 모듈화 및 패키징
전처리 단계별 로직을 함수로 분리하여 코드 재사용 가능하도록 구조화
→ 실습의 목적이었던 구조적 피처 엔지니어링의 재현 가능성 확보를 위해, 같은 로직을 반복 재사용할 수 있도록 설계된 파이프라인 방식으로 정리
결측치, 이상치 외에도 각각의 행이 지니는 의미도 충분히 이해해야 한다.
→ 해당 데이터셋에서는 본인을 판별하는 ID 등의 정보가 없기 때문에 데이터를 더 들여다보고 이해해야 한다.
종속변수 컬럼에 결측치가 있는 경우 평균이나 임의의 값으로 채울 수 없고 drop 시켜야 한다.
→ match 등의 종속변수는 예측해야 하는 일종의 정답이므로 틀어져 버리면 노이즈 그 이상으로 잘못된 예측이 될 수 있다.
가중치 재정규화에서는 총합이 100이라는 조건을 만족시키기 위한 비율 계산이 필요하며, 이는 변수 간 중요도 해석에 직접적인 영향을 주기 때문에 데이터 신뢰도를 높이는 핵심 작업이다.
이후 어떤 머신러닝 알고리즘을 사용할 것인가에 따라 스케일링 단계를 고려해야 한다.
→ 해당 데이터에서는 트리 모델이 가장 적합한데, 그렇다면 스케일링이 크게 중요하지 않으므로 스케일링 과정은 생략하였다.
평가 점수 계산이나 결측치 처리 로직처럼 조건 기반의 연산이 반복적으로 사용되는 경우,
→ 노트북에서 일일이 작성하던 로직을 함수로 빼둠으로써 훨씬 효율적이고 실용적으로 처리할 수 있다.
함수화를 통해 전처리 과정을 구조화한 경험을 통해 유사한 문제 해결에서 재사용 가능성과 유지 보수 편의성을 높일 수 있는 인사이트를 얻을 수 있었다.
피처 엔지니어링에는 정답이 없다.
그래서 어렵고, 그래서 재밌는 것이다 :)데이터에서 주어진 정보 이상의 것들을 끌어내는 연습을 하자.