Kaggle勉強会の題材として、分子の性質を予測する「Predicting Molecular Properties」を検討していました。ところが、現在ダウンロードできるsample submissionを提出すると、行数エラーで採点に失敗します。
調べてみると、開催当時のデータの公開バックアップが残っていました。旧データと提出IDを照合し、試験提出でスコアが付くことまで確認できたので、今回はその経緯と勉強会で使うための手順をまとめます。
確認日は2026年10月7日です。現在の公式配布データと旧データは混ぜず、同じ版のtrain・test・structures・sampleをセットで使ってください。
分子の何を予測するコンペ?
Predicting Molecular Propertiesは、分子の中の2つの原子について、磁気的な相互作用を表すscalar coupling constantを予測する回帰コンペです。
trainとtestには分子名、2つの原子の番号、結合タイプが入り、structuresには各原子の種類と3次元座標が入っています。原子間距離などを特徴量にして予測するため、表形式の機械学習と分子構造を扱うモデルの両方を学べそうな題材です。
2019年に終了したコンペですが、Late Submissionの入口は現在も残っています。
公式sampleを提出すると、352行足りない
まず、手元のデータを全行確認しました。現在のtest.csvとsample_submission.csvは、どちらも2,505,190行。IDの不足・余分・重複はなく、並び順も一致していました。sampleはKaggleから再取得したファイルとも、バイト単位で一致しています。
それでも公式sampleをそのまま提出すると、次のエラーが出ました。
Evaluation Exception: Submission must have 2505542 rows
| 確認対象 | データ行数 |
|---|---|
| 現在の公式test.csv | 2,505,190 |
| 現在の公式sample_submission.csv | 2,505,190 |
| 採点側が要求する行数 | 2,505,542 |
| 差 | 352 |
行数はヘッダーを除く件数です。配布ファイル同士は整合していますが、採点側が要求する件数とは違っていました。過去のDiscussionにも、同じエラーでLate Submissionに失敗するという投稿がありました。
この段階では「Late Submission自体が壊れているのかも」と考えました。ただ、リーダーボードや当時の解法が残っているなら、開催当時の形式で試す余地はありそうです。
開催当時の提出IDとデータが残っていた
まず、主催者inversionのAtomic Distance Benchmarkを調べました。2019年5月29日に実行した公開ノートブックの出力に、当時の提出CSVが残っていました。
そのCSVは2,505,542行。IDは4658147〜7163688で、採点側の要求件数に一致しました。現在のtestとはIDの開始・終了も異なるので、単純に352行を追加すれば済む話ではありません。
続いて、linhlpvさんが公開しているchamps-scalar-oldから、旧train・旧test・旧structures・旧sampleを取得しました。
| ファイル | データ行数・分子数 |
|---|---|
| train.csv | 4,658,147行、85,003分子 |
| test.csv | 2,505,542行、45,772分子 |
| sample_submission.csv | 2,505,542行 |
| structures.csv | 130,775分子の原子座標 |
旧testの全IDと並び順は、先ほどのベンチマーク出力に一致しました。旧trainと旧testの分子重複は0。全原子対についてstructuresに対応する両原子が存在し、IDの重複や空欄もありませんでした。
今回は公開バックアップを取得して整合性を確認したもので、開催当時の公式ファイルの独立したハッシュとの照合までは行っていません。取得元と検証結果を記録しておくことにしました。
全行0の試験提出で、採点が通った
当時のIDを使い、scalar_coupling_constantをすべて0.0にしたCSVを作って提出しました。結果は次のとおりです。
| 項目 | 結果 |
|---|---|
| 提出ID | 56896644 |
| 採点状態 | complete |
| Public Score | 1.99898 |
| Private Score | 1.99903 |
旧データの形式ならLate Submissionで採点されることを確認できました。 このスコアは全行0の動作確認であり、学習したモデルの性能ではありません。
今回分かったのは、現在の配布データと採点側の要求に不整合があること、当時のIDで提出すると採点機能が動くことです。Kaggle側の障害原因やデータ更新の経緯を確定したわけではありません。
旧データの入手先
検証に使用した旧データは、Kaggleで公開されているバックアップから取得できます。
旧データ ZIP:約340MB
開催当時のtrain・test・structures・sample_submissionを含む公開バックアップです。
取得元:linhlpv / champs-scalar-old
Kaggleからダウンロードする旧データ全体のZIPは約340MBです(2026年10月7日のDownloadメニュー表示)。Data Explorerに表示される全ファイルの容量は約1.04GBです。全体版には、上記4つのCSVに加え、追加の物性データや約13万個の分子構造ファイルが含まれます。
一方、今回手元でまとめた約133MBのZIPは、検証済みのtrain・test・structures・sample_submissionの4つのCSVと説明・検証記録だけを収録したものです。容量差は主に収録範囲の違いによるもので、圧縮方法でも変わります。4つのCSVだけでも学習とLate Submissionに必要な基本データはそろいます。この記事の取得リンクはKaggleの全体版なので、ダウンロード容量の目安は340MBです。
データセットのDownloadボタンから取得して展開し、train.csv・test.csv・structures.csv・sample_submission.csvの4ファイルを同じフォルダに置きます。Kaggle CLIを使う場合は、認証を設定したうえで次のコマンドです。
kaggle datasets download -d linhlpv/champsscalarold -p champs_historical_data --unzip
コンペの参加手続きとルールへの同意を済ませて利用してください。元データはCHAMPSのコンペデータで、旧版の取得元はlinhlpvさんの公開バックアップです。当ブログでは、再配布条件の確認が必要なためデータZIPを直接公開せず、取得元を案内しています。
現在のtrainと混ぜると、データ漏洩になる
今回、特に気になったのがtrainとの重複です。現在の公式trainと旧testを照合すると、29,715分子が重複していました。旧testの約65%に当たります。
現在のtrainで学習し、旧testへ提出すると、評価対象の分子を学習時に見てしまいます。スコアが良くなっても、未知の分子への予測性能を比較したことにはなりません。
勉強会では、取得した旧train・旧test・旧structures・旧sampleで統一してください。現在のtrain向け追加データも、そのまま混ぜないようにします。
読み込みから試験提出まで
旧データを展開したフォルダをdataとして読み込みます。パスは各自の環境に合わせて変更してください。
from pathlib import Path
import pandas as pd
data = Path("champs_historical_data")
train = pd.read_csv(data / "train.csv")
test = pd.read_csv(data / "test.csv")
structures = pd.read_csv(data / "structures.csv")
sample = pd.read_csv(data / "sample_submission.csv")
assert len(train) == 4_658_147
assert len(test) == len(sample) == 2_505_542
assert test["id"].equals(sample["id"])
assert set(train["molecule_name"]).isdisjoint(
test["molecule_name"]
)
# 最初は提出・採点の動作確認
submission = sample[["id"]].copy()
submission["scalar_coupling_constant"] = 0.0
submission.to_csv("submission_zero.csv", index=False)
Kaggleで必要な参加手続きとルールへの同意を済ませ、submission_zero.csvをLate Submissionで提出します。APIを使う場合は、Kaggle CLIと認証を設定したうえで、次のコマンドです。
kaggle competitions submit -c champs-scalar-coupling -f submission_zero.csv -m "Historical data smoke test"
学習したモデルを使うときは、testの全行を同じ順序で予測し、0.0の部分を予測値で置き換えます。予測件数・IDの対応・欠損値を確認してから保存しましょう。
勉強会では、分子単位の検証もセットに
最初の題材としては、structuresから2つの原子の座標を結合し、原子間距離を作るところから始められそうです。
ローカル検証ではmolecule_nameをグループにして、同じ分子が学習側と検証側に入らないように分割します。評価は通常のMAEだけでなく、8種類の結合タイプごとのMAEを対数化して平均するコンペの公式指標を使います。スコアは小さいほど良い値です。
全データはtrainだけで約466万行あるため、初回は分子単位で一部を選んで実験し、提出時には旧testの全行を予測する進め方がよさそうです。開催前に参加者それぞれのアカウントで1件の試験提出をしておくと、当日の作業を進めやすくなります。
出典と利用条件
- CHAMPS公式コンペ
- 旧データの公開バックアップ:linhlpv / champs-scalar-old
- 提出IDの照合に使用したAtomic Distance Benchmark
- Competition Rules
公式規約にはCompetition DataのCC-BYの記載があります。一方、非参加者への再配布を制限する条項もあります。データの利用時には出典を明示し、該当するライセンスとKaggleの規約を確認してください。当ブログは旧データの取得元と検証手順を紹介しています。
以上は2026年10月7日の検証結果です。Kaggle側の仕様や配布データが変わる可能性があるため、利用時にも試験提出を確認してください。