{
  "fetched_at": "2026-10-19T07:15:02Z",
  "source_url": "https://www.kaggle.com/competitions/affinity5/data",
  "pages": [
    {
      "name": "data-description",
      "content": "<p>Overview</p>\r\n<p>In a common for crystallographers form, protein structures are stored as lists of atom names and atom coordinates, you can read more about PDB format here. The input to the network is, typically, a 3D matrix for which empty space (cubic angstrom) is marked as 0, and every atom is marked with a certain number N. Since every cube has a few orders of magnitude more zeros than numbers, especially, if the size of the cell is small, it’s more efficient to read the images as sparse tensors and perform conversion on GPU.</p>\r\n<p><br />Luckily, all of the structures ever crystallized are stored in a single place called Protein Data Bank. We provide a hand-cleaned dataset created from a whole PDB in which proteins and ligands are split and stored in different folders.</p>\r\n<p><br />Since Protein Data Bank contains only structures observed in reality, fake structures have to be generated separately. In our task we dock the ligands back to their targets and select best (lowest in terms of negative binding energy) structures in which position of the ligand is incorrect enough to consider the ligand as a negative example.</p>\r\n<p>There are two datasets available for this task:</p>\r\n<p><br />Primary dataset (6589 Positive examples, 292075 Negative Examples).</p>\r\n<p><br />Contains all of the existing in the PDB drug-protein complexes from Protein Data Bank (Oct 2016) with 10 or more atoms for which there exists a record in bindingDB. There are up to 50 decoys for each of the positive examples.<br />Decoys have been generated with AutoDock <g class=\"gr_ gr_53 gr-alert gr_spell gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"53\" data-gr-id=\"53\">Smina</g> by docking ligands back to their targets and selecting ones with most negative binding energy and RMSD &gt; 6A. Only the ligands that have 10 or more atoms have been considered in this dataset.<br />We have extracted 10% of the primary dataset and masked <g class=\"gr_ gr_52 gr-alert gr_spell gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"52\" data-gr-id=\"52\">protein protein</g> and ligand names to use it as evaluation set for Kaggle.</p>\r\n<p><br />Auxiliary dataset (43 775 positive examples 1 844 074 negative examples)<br />Contains the same data as primary dataset, except absence in BindingDB is not considered for exclusion. While this dataset is much bigger, it has some positives labeled incorrectly. This appears because small molecular weight compounds can be added to protein to increase the quality of the crystal.</p>\r\n<p>File descriptions</p>\r\n<p>labeled_pdb.zip - the training set in <g class=\"gr_ gr_54 gr-alert gr_spell gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"54\" data-gr-id=\"54\">pdb</g> format<br />labeled_npy.zip - the training set in <g class=\"gr_ gr_55 gr-alert gr_spell gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"55\" data-gr-id=\"55\">npy</g> format (in this case every structure is saved as <g class=\"gr_ gr_56 gr-alert gr_spell gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"56\" data-gr-id=\"56\">numpy</g> array with 4 columns of float32. First column is a hash for atom type. Three following columns are the atom coordinate.<br />unlabeled_pdb.zip - set with hidden labels for submission<br />unlabeled_npy.zip - set with hidden labels in <g class=\"gr_ gr_57 gr-alert gr_spell gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"57\" data-gr-id=\"57\">npy</g> format</p>",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Description",
      "content": "<p>Structure-based virtual screening is an approach by which a very small percentage of small molecules, usually tenth or hundreds are sifted out from a gigantic space of possible millions, or even billions possible chemical structures. These small molecules represent potential drug candidates and have to be further validated in biological assays such as human cells, zebrafish, or mice. Drug validation is a lengthy process that can take many years. That’s why scientists are usually testing molecules in small batches of 50-200, and if none of the molecules is both safe and efficient enough, the whole process has to be repeated again.</p>\r\n<p><br />Chemical space of drug-like molecules is estimated to be &gt; 50B <g class=\"gr_ gr_15 gr-alert gr_gramm gr_run_anim Punctuation only-del replaceWithoutSep\" id=\"15\" data-gr-id=\"15\">structures,</g> and should have a cure for every disease, if only we could find it.</p>\r\n<p><br />In this competition, you will be given a set of 3D drug-protein structures (images) some of which represent strongly bound drug-protein complexes (positives) and some of which are drug and protein artificially attached together in an incorrect position (negatives). Your task will be to distinguish real from fake binders, even though they look almost the same to human eyes.</p>\r\n<p>Our dataset is huge, it contains 1,887,849 images. Intuitively, the right approach would be to train a deep convolutional neural network (DNN), but you do not have to limit yourself ! Git clones our working example to get started.</p>",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Evaluation",
      "content": "<p>The evaluation metric for this competition is a Mean Average Precision at cutoff K. In our case K=1.</p>\r\n<p>average precision</p>\r\n<p>\\[ ap@n = \\sum_{k=1}^{n}P(k)/ min(m,n) \\]</p>\r\n<p>mean average precision</p>\r\n<p>\\[ MAP@n = \\sum_{i = 1}^{N} ap@n_i/N \\]</p>\r\n<p>Submission Format</p>\r\n<p>One row should correspond to every protein in the dataset. Protein name comes first, separated with comma sign from it's ligands. All of the ligands in the list should be separated by spaces from each other.</p>\r\n<p>The file should contain a header and have the following format:</p>\r\n<p>Id,Prediction<br />P27158,L4318 L7825 L7859 L29531 L19463 L30570 L7109 L5317 <br />P8841,L30357 L10900 L29805 L23864 L11980 L2484 L14284 L4135 L4864 <br />P8840,L9193 L10588 L30590 L14513 L19725 L25892 L3481 L27267 L19194 <br />P12340,L3387 L18759 L14519 L451 L9513</p>",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "rules",
      "content": "\r\n\t<!-- Begin Base Rules -->\r\n    <h3>One account per participant</h3>\r\n    <p>You cannot sign up to Kaggle from multiple accounts and therefore you cannot submit from multiple accounts.</p>\r\n    <h3>No private sharing outside teams</h3>\r\n    <p>\r\n        Privately sharing code or data outside of teams is not permitted.\r\n        It's okay to share code if made available to all participants on the forums.\r\n    </p>\r\n    <h3>Team Mergers</h3>\r\n    <p>Team mergers are not allowed in this competition.</p>\r\n\r\n    <h3>Team Limits</h3>\r\n    <p>There is no maximum team size.</p>\r\n    <h3>Submission Limits</h3>\r\n    <p>You may submit a maximum of 2 entries per day.</p>\r\n    <p>You may select up to 2 final submissions for judging.</p>\r\n    <h3>Competition Timeline</h3>\r\n    <p>Start Date: <strong>1/21/2017 12:03 AM UTC</strong></p>\r\n    <p>Merger Deadline: <strong>None</strong></p>\r\n    <p>Entry Deadline: <strong>None</strong></p>\r\n    <p>End Date: <strong>6/1/2017 11:59 PM UTC</strong></p>\r\n\t<!-- End Base Rules -->\r\n<p>You are limited to 2 <g class=\"gr_ gr_7 gr-alert gr_gramm gr_disable_anim_appear Grammar multiReplace\" id=\"7\" data-gr-id=\"7\">submission</g> per day.</p>",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}