28.2 물성 예측

실습 · 연습문제 1개

scaffold 분할 구현하기 scaffold-split

분자마다 골격(scaffold) 레이블이 주어진다. 같은 골격의 분자가 train과 test에 나뉘어 들어가지 않도록, 골격 단위로 분자를 나누는 함수 scaffold_split(scaffolds, test_frac=0.2)를 완성한다.

규칙은 다음과 같다(결정적 규칙이라 같은 입력에 항상 같은 결과를 낸다).

  1. 골격을 분자 수가 많은 것부터 정렬한다. 분자 수가 같으면 데이터에 먼저 나타난 골격이 앞선다.
  2. 정렬한 순서대로, 그 골격을 train에 넣어도 train 크기가 (1−test_frac)×N(1 - \text{test\_frac}) \times N을 넘지 않으면 train에 넣는다. 넘으면 test에 넣는다.
인자 의미
scaffolds 길이 NN의 골격 레이블 목록(문자열이나 정수)
test_frac test에 둘 분자 비율의 목표값

반환값은 (train_idx, test_idx)로, 각각 정렬된 정수 인덱스 배열이다.

테스트는 다음을 확인한다.

  • 모든 분자가 정확히 한쪽에 들어간다.
  • train과 test가 골격을 공유하지 않는다.
  • 가장 큰 골격은 train에 들어간다.
  • test 비율이 목표에 가깝다.

큰 골격을 train에 두는 이유: test가 작은 골격들, 즉 드물게 탐색된 화학 구조로 채워져 새로운 구조에 대한 일반화를 더 엄격하게 잰다.