모델의 성능을 확인할 때 서로 다른 validation set을 사용하게 되면 정확한 성능 비교가 어렵다. 또한, 대회에서는 validation set으로 확인한 점수와 public 점수의 차이가 크면 validation으로 점수를 예상하기 어렵다는 문제가 있다. 그러므로 public 점수와 차이가 작은 validation set을 찾아 실험 데이터셋을 통일하는 과정이 필요하다.

다음 실험을 통해 서로 다른 방법으로 데이터를 나누고 가장 public과 차이가 작은 validation set을 채택하였다.

실험

Baseline으로 실험을 진행하였으며 다음 4가지 split 방법을 실험하였다.

  1. Random split
  2. Bounding box area를 기준으로 split
  3. Class를 기준으로 split
  4. Bounding box area + Class를 기준으로 split

1. Random split

Sklearn의 train_test_split을 이용해 랜덤하게 데이터 셋을 나눈다.

train_image_ids_rand, val_image_ids_rand = train_test_split(image_ids, test_size=0.2, random_state=411)

2. Bounding box area

Bounding box 면적을 기준으로 데이터 셋을 나눈다.

면적은 10,000 이하인 경우, 10,000보다 크고 100,000 이하인 경우, 100,000보다 큰 경우를 0, 1, 2로 라벨링한 다음, 이 라벨이 train, val에 균형있게 분포하도록 한다. Sklearn의 StratifiedGroupKFold를 이용하여 train과 val에 이미지의 중복없이 나눠지도록 한다.

...
# Extract X, y, and groups
X = np.ones((len(df), 1))  # X is just placeholder data
y_area = df['area'].values
y = np.where(y_area <= 10000.0, 0, np.where(y_area <= 100000.0, 1, 2))

groups = df['image_id'].values  # Groups

# StratifiedGroupKFold
cv = StratifiedGroupKFold(n_splits=5, shuffle=True, random_state=411)

for fold, (train_idx, val_idx) in enumerate(cv.split(X, y, groups)):
...