Kaggle Growth 기록: ROGII Wellbore에서 첫 회귀 베이스라인 제출하기

ROGII Wellbore Geology Prediction 대회에서 데이터 구조를 읽고, TVT_input interpolation baseline으로 첫 valid Kaggle notebook submission을 만든 과정을 정리합니다.

Kaggle Growth 기록: ROGII Wellbore에서 첫 회귀 베이스라인 제출하기

Kaggle Growth Lab에서 Orbit Wars가 agent와 simulation을 연습하는 트랙이었다면, ROGII Wellbore Geology Prediction은 훨씬 더 정석적인 머신러닝 트랙이다. 데이터를 읽고, target을 이해하고, baseline을 만들고, validation을 의심하고, submission.csv를 제출하는 흐름이 뚜렷하다.

이번 글은 ROGII - Wellbore Geology Prediction 대회에서 첫 valid submission을 만든 기록이다. 목표는 높은 점수를 주장하는 것이 아니라, Kaggle 회귀 대회를 다루는 기본 루프를 남기는 것이다.

이번 결과

먼저 결과부터 적어둔다.

항목
Kaggle status Succeeded
Public RMSE 15.883
Notebook notebook7f0789fa3b
Version V2
Runtime 36s
Baseline TVT_input interpolation + median fallback
submission rows 14151
NaN count 0

ROGII V2 public score 15.883

이 점수는 “모델이 좋다”는 증거라기보다, 제출 파이프라인이 처음으로 끝까지 연결됐다는 증거에 가깝다. Kaggle notebook에서 competition data를 붙이고, internet을 끄고, submission.csv를 만들고, 대회에 제출해서 평가까지 받은 것이다.

문제를 어떻게 이해했나

이 대회는 horizontal wellbore를 따라 tvt를 예측하는 회귀 문제다. tvt는 True Vertical Thickness를 의미한다. 지질학 도메인을 깊게 안다고 말할 수는 없지만, Kaggle 관점에서 먼저 확인해야 할 것은 비교적 명확했다.

데이터는 well 단위로 나뉜다. 각 training well에는 대략 다음 파일이 있다.

1
2
3
{WELLNAME}__horizontal_well.csv
{WELLNAME}__typewell.csv
{WELLNAME}.png

horizontal_well.csv에는 측정 깊이, 좌표, gamma ray log, target인 TVT, 그리고 TVT_input 같은 값이 들어 있다. typewell.csv에는 vertical reference에 가까운 TVT, GR, Geology가 들어 있다. PNG는 사람이 구조를 이해하는 데 도움을 주지만, 첫 baseline에는 쓰지 않았다.

처음부터 복잡한 모델을 만들기보다, 나는 세 가지 질문만 잡았다.

  1. sample_submission.csv가 요구하는 row는 무엇인가?
  2. TVT_input은 target과 어떤 관계인가?
  3. 같은 well 안의 row를 random split해도 되는가?

이 세 질문이 첫 baseline의 방향을 결정했다.

왜 random row split을 경계했나

이 대회에서 가장 조심해야 할 것은 validation leakage다.

wellbore 데이터는 같은 well 안의 row들이 서로 독립적이지 않다. 같은 trajectory, 같은 local geology, 비슷한 gamma ray pattern, 같은 typewell reference를 공유한다. 그래서 row를 무작위로 섞어 train/validation으로 나누면, validation set이 사실상 이미 본 well의 이웃 row가 될 수 있다.

그렇게 만든 validation score는 실제 hidden test 성능보다 좋아 보일 가능성이 높다. 그래서 이 대회에서는 모델보다 validation 설계가 먼저다.

내가 잡은 원칙은 단순하다.

1
2
나쁜 출발점: random row split
더 나은 출발점: well-level group validation

즉, 어떤 well은 통째로 학습에 쓰고, 어떤 well은 통째로 검증에 남겨야 한다. 그리고 실제 evaluation zone과 비슷하게 TVT_input을 일부 구간에서 가려보는 방식이 필요하다.

이번 첫 제출에서는 아직 정교한 validation을 완성하지 않았다. 대신 “제출 가능한 baseline을 먼저 만들고, 그다음 validation을 강화한다”는 순서로 진행했다.

첫 baseline: TVT_input interpolation

첫 baseline은 매우 단순하다. TVT_input이 존재하는 구간을 이용해 evaluation zone의 missing 값을 well 내부에서 보간한다. 남는 결측은 per-well median이나 global median으로 채운다.

이 접근이 가능한 이유는 TVT_input이 evaluation zone 밖에서는 target인 TVT의 복사본에 가깝기 때문이다. 물론 이것만으로 충분한 모델이라고 볼 수는 없다. 하지만 지질 위치가 well을 따라 어느 정도 연속적으로 변한다면, interpolation은 제출 가능한 첫 기준선이 될 수 있다.

전략은 이렇게 정리했다.

1
2
3
4
5
6
7
1. test horizontal well 파일을 읽는다.
2. sample_submission의 id에서 well name과 row index를 분리한다.
3. 해당 row의 TVT_input을 확인한다.
4. 같은 well 안에서 TVT_input을 row order 또는 MD 기준으로 interpolate한다.
5. 남은 NaN은 per-well median으로 채운다.
6. 그래도 남으면 train global median으로 채운다.
7. id,tvt 형식의 submission.csv를 만든다.

중요한 것은 예측값 자체보다 submission contract다. Kaggle은 submission.csv의 형식이 틀리면 모델 성능을 보기 전에 실패한다.

이번 제출에서 확인한 contract는 다음과 같다.

1
2
3
4
5
columns: id,tvt
rows: 14151
NaN: 0
internet: disabled
runtime: 36s

이런 체크는 지루하지만 중요하다. Kaggle에서 첫날 해야 하는 일은 대단한 모델을 만드는 것이 아니라, 실패하지 않는 제출 루프를 만드는 것이다.

public score 15.883을 어떻게 볼 것인가

Public RMSE 15.883은 첫 benchmark로 기록했다. 하지만 이 숫자를 과하게 해석하지 않으려고 한다.

이 baseline은 interpolation이 잘 먹히는 구간에서는 괜찮을 수 있다. 반대로 evaluation zone이 길거나, 주변에 쓸 만한 TVT_input anchor가 부족한 well에서는 약할 가능성이 크다. 또한 public leaderboard는 hidden evaluation 전체를 대표하지 않을 수 있다.

그래서 이 점수의 의미는 하나다.

이제 비교할 수 있는 첫 기준선이 생겼다.

앞으로 어떤 tabular model이나 typewell correlation feature를 추가하더라도, 최소한 이 interpolation baseline과 비교해야 한다. 더 복잡한 모델이 이 기준선을 이기지 못한다면 복잡함을 추가할 이유가 없다.

공개 notebook은 어떻게 다룰 것인가

ROGII에는 강한 public notebook도 있다. 예를 들어 ridge artifact, particle filter, projection 같은 domain-specific 구조를 활용하는 reference가 있었다.

이런 notebook은 공부할 가치가 크다. 하지만 첫 제출을 public solution 기반으로 시작하면 내 실험 기록이 흐려진다. 그래서 순서를 분리했다.

1
2
3
4
5
1. 내 손으로 단순 EDA와 interpolation baseline을 만든다.
2. valid submission을 먼저 만든다.
3. well-level validation notes를 정리한다.
4. 그다음 public notebook을 study target으로 검토한다.
5. 참고한 아이디어와 artifact dependency를 기록한다.

이 순서는 포트폴리오 관점에서도 중요하다. 좋은 점수를 낸 코드보다 더 중요한 것은, 내가 어떤 문제를 어떤 기준으로 이해하고 개선했는지 설명할 수 있는 기록이다.

다음 실험

다음 단계는 score chasing이 아니라 validation 강화다.

우선순위는 이렇게 잡았다.

  1. well-level group validation 만들기
  2. TVT_input interpolation baseline의 local validation 점수 기록
  3. MD, X, Y, Z, GR, row position 기반 light tabular model 만들기
  4. interpolation baseline과 tabular model 비교하기
  5. typewell GR correlation feature를 천천히 실험하기

특히 GR은 이 대회에서 중요한 신호일 수 있다. horizontal well의 gamma ray log와 typewell의 gamma ray signature가 잘 맞는다면, 지질 위치를 추정하는 데 도움이 될 수 있다. 다만 이것은 첫 제출 이후의 작업이다.

마무리

ROGII 첫 제출에서 배운 것은 간단하다.

Kaggle 회귀 대회의 첫 목표는 모델링이 아니라 제출 가능한 기준선을 만드는 것이다. 데이터 구조를 읽고, leakage 위험을 적고, baseline을 만들고, 제출 형식을 검증하고, public score를 첫 benchmark로 남긴다.

이 과정을 거치면 다음 실험이 훨씬 분명해진다. 이제 질문은 “무슨 모델을 써볼까?”가 아니라 “이 baseline을 어떤 검증 기준에서 이길 수 있을까?”가 된다.

Kaggle Growth Lab에서는 이 차이를 계속 기록하려고 한다. 점수보다 중요한 것은 재현 가능한 실험 루프다.

Comments

댓글

GitHub 계정으로 의견을 남길 수 있습니다. 댓글은 GitHub Discussions에 저장됩니다.