오늘은 향취 분자 데이터의 구조 품질을 점검하고, 향후 모델링에 사용할 데이터의 전처리 기준을 정리했다.
원본 데이터는 총 8,806행이었지만, 같은 분자가 여러 행에 중복되어 존재했다. 이를 단순히 drop_duplicates()로 제거하지 않고, canonical_isomeric을 기준으로 동일한 구조를 하나의 분자로 묶었다.
예를 들어 같은 분자가 한 행에서는 FRUITY, 다른 행에서는 SWEET으로 기록돼 있다면 이를 서로 다른 분자로 보지 않고 다음처럼 통합했다.
분자 A → FRUITY, SWEET
이 과정을 거쳐 최종적으로 8,746개의 고유 분자와 101개의 컬럼으로 구성된 후보 데이터를 만들었다. 한 분자가 여러 향취를 가질 수 있으므로 최종 데이터는 다중 라벨 분류 문제로 정의했다.
구조 품질 분류
전체 8,746개 분자에 대해 구조 및 라벨 상태를 확인한 결과는 다음과 같았다.
구분분자 수의미
| KEEP | 8,005 | 자동 검사에서 특별한 문제가 발견되지 않음 |
| REVIEW | 404 | 구조 또는 라벨에 추가 확인이 필요함 |
| EXCLUDE | 337 | 단일 분자 향취 모델에 사용하기 어려움 |
KEEP는 단일 분자로 구성돼 있고, SMILES가 정상적으로 처리되며 명확한 구조 문제가 발견되지 않은 데이터이다.
REVIEW에는 금속, 염, 수화물, 비중성 전하, OTHERS-only, ODORLESS와 다른 향취의 충돌 등 자동으로 최종 판단하기 어려운 사례가 포함됐다.
EXCLUDE에는 복수 유기물 혼합물, 무기 다성분 구조, 라디칼, 독립 수소, SMILES와 MolBlock의 연결성 불일치 등 단일 분자 향취 예측에 적합하지 않은 구조가 포함됐다.
수동으로 모든 REVIEW 데이터를 확인하기 어려우므로 첫 모델에서는 KEEP 데이터만 사용하고, REVIEW와 EXCLUDE는 별도 파일로 관리하기로 했다.
결측치 및 MolBlock 확인
분자량, LogP, TPSA, HBD, HBA, 회전 가능한 결합 수, 전체 고리 수, 방향족 고리 수, FractionCSP3 등 주요 분자 물성은 8,746개 분자에서 모두 정상적으로 계산됐다.
MolBlock은 46개 분자에서 누락됐지만, 해당 분자들은 SMILES가 정상적으로 읽혔고 필요한 분자 Feature도 계산됐다.
최종 모델은 SMILES에서 Feature를 생성할 예정이므로 MolBlock이 없다는 이유만으로 데이터를 삭제하지 않기로 했다.
다만 향취 라벨이 없는 2개 분자는 지도학습의 정답값이 없기 때문에 메인 모델링 데이터에서는 제외할 예정이다.
중복 구조와 라벨 충돌
구조 기준으로 중복 데이터를 통합한 결과, 원본 8,806행에서 8,746개의 고유 구조가 남았다.
중복 구조 자체는 동일한 분자를 반복해서 학습하는 문제를 방지하기 위해 하나로 통합했다. 하지만 동일한 구조에 서로 다른 향취 라벨이 기록된 라벨 충돌 사례도 일부 확인됐다.
특히 다음과 같은 경우는 라벨을 단순히 합치면 모델에 모순된 정답을 줄 수 있다.
같은 구조
출처 1 → ODORLESS
출처 2 → 특정 향취
따라서 단순 중복은 통합하지만, 라벨 충돌이 있는 구조는 REVIEW로 분리해 메인 모델에서 제외하기로 했다.
염·수화물·혼합물 확인
분자 구조가 하나의 fragment로 구성돼 있는지, 여러 성분이 함께 포함돼 있는지를 확인했다.
주요 문제 유형은 다음과 같았다.
- 복수 유기물 혼합물
- 염 또는 카운터이온 후보
- 무기 다성분 구조
- 수화물 또는 용매화물
- 미분류 다성분 구조
복수 유기물 혼합물은 어떤 성분이 실제 향취를 만드는지 알기 어렵기 때문에 단일 분자 예측 모델에는 부적절하다고 판단했다.
염이나 수화물은 작은 fragment를 제거하면 중심 유기 분자를 추출할 수 있지만, 기존 향취 라벨이 수정된 parent 구조의 향취인지 확신할 수 없다. 따라서 구조를 임의로 수정하지 않고 REVIEW로 보관하기로 했다.
금속·전하·독립 수소 확인
금속 포함 구조는 359개, 전체 formal charge가 0이 아닌 구조는 75개, 독립 수소가 포함된 구조는 4개가 확인됐다.
특히 비중성 전하 구조 중 일부는 기존 KEEP 안에도 포함돼 있었다. 이는 처음 자동 Gate만으로는 구조의 모든 특성을 완전히 확인하기 어렵다는 점을 보여준다.
다만 전하가 있다고 해서 무조건 잘못된 구조는 아니며, 실제 이온이나 염일 가능성도 있다. 현재 프로젝트에서는 수동 출처 확인이 어렵기 때문에 이러한 구조는 메인 모델에서 제외하고 REVIEW 대상으로 유지하기로 했다.
독립 수소나 라디칼처럼 일반적인 안정 단일 분자로 보기 어려운 구조는 EXCLUDE 대상으로 판단했다.
입체이성질체와 MolBlock 문제
같은 원자 연결 구조를 가지지만 3차원 배열이 다른 입체이성질체 그룹도 확인했다.
입체이성질체는 같은 기본 골격을 가지더라도 R형과 S형에 따라 향취가 달라질 수 있다. 따라서 입체정보가 없는 구조와 입체이성질체별 라벨이 서로 다른 구조는 모델 학습에 노이즈를 만들 가능성이 있다.
입체정보가 명확한 구조는 canonical_isomeric을 기준으로 각각 유지하고, 향후 Train·Validation·Test를 분할할 때는 같은 기본 골격이 서로 다른 데이터셋에 나뉘지 않도록 canonical_no_stereo 기준의 그룹 분할이 필요하다고 판단했다.
MolBlock이 누락됐더라도 SMILES가 정상이라면 유지할 수 있지만, SMILES와 MolBlock의 연결 구조가 서로 다른 경우에는 정확한 분자를 판단할 수 없으므로 제외하는 것이 안전하다.
분자 물성 이상치와 상관관계
IQR 기준으로 분자량, LogP, TPSA, 고리 수 등에서 이상치 후보가 확인됐다.
하지만 화학 데이터에서는 값이 크다는 이유만으로 오류라고 볼 수 없다. 실제로 분자량이 크거나 극성이 높고 고리가 많은 분자가 존재할 수 있기 때문이다.
따라서 이상치를 자동으로 삭제하지 않고 KEEP 데이터라면 그대로 유지하기로 했다. 대신 모델링 과정에서 연속형 Feature를 Train 데이터 기준으로 스케일링하고, 이상치에 민감한 모델과 비교적 강건한 모델을 비교할 예정이다.
상관관계 분석에서는 TPSA와 HBA, TPSA와 HBD 등 일부 물성이 높은 상관관계를 보였다. 그러나 각 물성이 향취 예측에 서로 다른 역할을 할 수 있으므로 현재 단계에서는 삭제하지 않고 모두 유지하기로 했다.
SMARTS 부분구조 확인
총 26개의 SMARTS 부분구조에 대해 존재 여부와 개수를 확인했다.
자주 등장한 구조는 ether, alkene, aromatic ring, ester 등이었고, sulfoxide나 sulfone처럼 매우 적게 등장한 구조도 있었다.
희귀 구조는 학습 사례가 적어 안정적인 예측이 어려울 수 있지만, 특정 향취를 구분하는 중요한 단서가 될 가능성이 있다. 따라서 전처리 단계에서는 삭제하지 않고 모델링 과정에서 Feature 기여도를 비교하기로 했다.
모델링에서는 다음 Feature 조합을 비교할 예정이다.
- 분자 물성 9개
- 물성 9개 + SMARTS 존재 여부 26개
- 물성 9개 + SMARTS 존재 여부 26개 + SMARTS 개수 26개
향취 라벨 정리
전체 향취 라벨은 200개이며, 라벨별 빈도 차이가 매우 컸다.
FRUITY, GREEN, FLORAL처럼 자주 등장하는 라벨이 있는 반면, 학습 사례가 매우 적은 희귀 라벨도 존재했다.
첫 모델부터 전체 200개 라벨을 모두 예측하면 희귀 라벨의 학습과 평가가 불안정할 수 있다. 따라서 첫 모델은 빈도가 높은 라벨부터 시작하고, 모델링이 정상적으로 수행되면 점진적으로 라벨 범위를 확대하기로 했다.
OTHERS는 구체적인 향취명이 아니므로 다른 향취와 함께 있는 경우 라벨 목록에서 제거한다.
OTHERS만 있는 경우에는 제거 후 정답 라벨이 없어지기 때문에 메인 모델에서 제외한다.
ODORLESS만 존재하는 경우에는 유지하지만, ODORLESS와 다른 구체적인 향취가 함께 존재하면 의미가 충돌하므로 REVIEW로 분리하기로 했다.