{
  "id": 566756,
  "title": "15th Place Solution",
  "content": "<p>15th place solution</p>\n<p>First of all, I would like to thank the Kaggle community for sharing great ideas and engaging discussions. I would also like to thank the hosts for organizing this interesting task competition.</p>\n<h1>Overview</h1>\n<ul>\n<li>Ensemble which focused on the mechanism of the metric and the performance of the model</li>\n<li>Stacking GBDT models and various transformed targets</li>\n</ul>\n<h1>Target transformation</h1>\n<p>I used public note transform ( Kaplan , Nelson etc. ) and Rank Gauss transform.<br>\nBecause the number of unique values of the target decreases by using Kaplan and so on , I concerned that amount of information decreases.<br>\nTherefore I used Rank Gauss transform as not decreasing uniques , then LB was improved slightly.</p>\n<p>[simple xgb result]</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>CV</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Kaplan</td>\n<td>0.675</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Nelson</td>\n<td>0.680</td>\n<td>0.685</td>\n<td>0.688</td>\n</tr>\n<tr>\n<td>Rank Gauss</td>\n<td>0.680</td>\n<td>0.686</td>\n<td>0.689</td>\n</tr>\n</tbody>\n</table>\n<h1>Model</h1>\n<p>I implemented stacking 30 models twice.<br>\nWhen n time stacking , I use n-1 time OOF as feature.</p>\n<p>30 models = GBDTs(XGB,CAT,LGB) : 3 * Various targets and settings : 10</p>\n<p>[ensemble result(detail below)]</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>CV</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No stack and below ensemble</td>\n<td>0.687</td>\n<td>0.689</td>\n<td>0.693</td>\n</tr>\n<tr>\n<td>1st stack and below ensemble</td>\n<td>0.690</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>2nd stack and below ensemble(final submission)</td>\n<td>0.694</td>\n<td>0.691</td>\n<td>0.695</td>\n</tr>\n</tbody>\n</table>\n<h1>Ensemble</h1>\n<p>I implemented ensembling as follows using Rank Gauss transform target.</p>\n<ol>\n<li>Ensembling efs=1 data trained model and all data trained model </li>\n<li>Substituting all data trained model prediction for above prediction  in case fallling below the threshold ageinst all data trained model prediction.<br>\n<code>y_pred.loc[oof['pred']&lt;threshold,'prediction'] = oof['pred']</code></li>\n</ol>\n<p>I consider that the competition score is calculated from two part. One part (a) is to compare each efs=1 prediction ,other (b) is to compare efs=0 prediction against efs=1 prediction.<br>\nBy training only efs=1 data , ‘a’ part score will be very high. <br>\n‘a’ part score can be improved by ensemble 1.<br>\n‘b’ part score can be improved by ensemble 2.</p>\n<p>[2nd stack result]</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>'a' part (efs=1) CV</th>\n<th>CV(a+b part)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>efs=1 data model</td>\n<td>0.745</td>\n<td>0.561</td>\n</tr>\n<tr>\n<td>All data model</td>\n<td>0.597</td>\n<td>0.686</td>\n</tr>\n<tr>\n<td>Ensemble 1</td>\n<td>0.684</td>\n<td>0.669</td>\n</tr>\n<tr>\n<td>Ensemble 2(final submission)</td>\n<td>0.680</td>\n<td>0.694</td>\n</tr>\n</tbody>\n</table>\n<h1>Didn’t work</h1>\n<p>・Target encoding<br>\n・Umap/t-SNE as a feature</p>",
  "comments": [
    {
      "id": 3146627,
      "author_name": "Miku Tsuchiya",
      "author_url": "",
      "post_date": "2025-03-11T04:26:20.707000",
      "content": "<p><a href=\"https://www.kaggle.com/tamryow\" target=\"_blank\">@tamryow</a> <br>\nCongratulations on the gold medal! I also improved my LB and CV by stacking in the same way.<br>\nI didn't try stacking a second time, so your solution is helpful.<br>\nThank you for sharing!</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3146773,
          "author_name": "tamryow",
          "author_url": "",
          "post_date": "2025-03-11T08:25:24.253000",
          "content": "<p>Thanks!<br>\nI'm glad I could help you.</p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 3143970,
      "author_name": "Vasilis",
      "author_url": "",
      "post_date": "2025-03-07T18:57:57.827000",
      "content": "<p>Also i did not get the number 2 very well: \"Substituting all data trained model prediction for above prediction in case fallling below the threshold ageinst all data trained model prediction.<br>\ny_pred.loc[oof['pred']&lt;threshold,'prediction'] = oof['pred']\"  what is this threshold?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3144218,
          "author_name": "tamryow",
          "author_url": "",
          "post_date": "2025-03-08T05:05:54.297000",
          "content": "<p>The threshold is adjusted to optimize CV.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 3143930,
      "author_name": "Vasilis",
      "author_url": "",
      "post_date": "2025-03-07T18:22:34.020000",
      "content": "<p>Hey congrats on the gold! How do you manage to do all this stacking without overfitting? How do you hyperparam optimize to avoid overfitting? Do you use eval set to early stop or not?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3144200,
          "author_name": "tamryow",
          "author_url": "",
          "post_date": "2025-03-08T04:52:28.267000",
          "content": "<p>Thank you!<br>\nI happy to get a gold medal although I think also I have a luck.<br>\n<br></p>\n<blockquote>\n  <p>How do you manage to do all this stacking without overfitting? </p>\n</blockquote>\n<p>I confirmed CV and LB by simple XGB every stacking.<br>\nBy the second stack, both cv/lb had improved, so i thought there was no overfitting and decided to stack twice.<br>\n<br></p>\n<blockquote>\n  <p>How do you hyperparam optimize to avoid overfitting? </p>\n</blockquote>\n<p>I did not make any fine adjustments to the hyperparameters other than slightly changing the values ​​in the public notebook.<br>\nThe cv/lb values ​​are not very different both the public notebook and my simple xgb , so I thought it don't have overfitting.<br>\n<br></p>\n<blockquote>\n  <p>Do you use eval set to early stop or not?</p>\n</blockquote>\n<p>Yes,i did.<br>\n<br><br>\nIn terms of overfitting, I personally think it was important to avoid overfitting the score elements (a and b parts).</p>",
          "votes": 1,
          "replies": []
        },
        {
          "id": 3144217,
          "author_name": "tamryow",
          "author_url": "",
          "post_date": "2025-03-08T05:05:21.627000",
          "content": "<p>It may seem like hindsight, but I think the reason I was able to win the gold medal this time was because I avoided overfitting score elements(‘a’,’b’part) in CV.</p>\n<p>In a typical model in the public notes, the CV and LB for each part are as follows.</p>\n<p>The model in the public notes neglects the prediction of 'a' part, and it seemed that the prediction results were not reflected in Public LB.</p>\n<p>(There were also some other unreliable CV/LB relationships in Public LB (probably the distribution/trend of one of the races was different from CV, etc.) in my submissions, so I don't think it was just that relationship.)</p>\n<p>In any case, I considered Public LB to be unreliable based on the above, and I worked on it assuming that Private LB, which has more data, would approach the score of CV.</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>'a' part (efs=1) CV</th>\n<th>CV(a+b part)</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Public note model</td>\n<td>0.592</td>\n<td>0.681</td>\n<td>0.691</td>\n<td>0.691</td>\n</tr>\n<tr>\n<td>My final submit model</td>\n<td>0.680</td>\n<td>0.694</td>\n<td>0.691</td>\n<td>0.695</td>\n</tr>\n</tbody>\n</table>",
          "votes": 0,
          "replies": []
        }
      ]
    }
  ],
  "comment_count": 7,
  "messages": [
    {
      "id": 3142873,
      "postDate": "2025-03-06T18:16:52.787Z",
      "content": "<p>15th place solution</p>\n<p>First of all, I would like to thank the Kaggle community for sharing great ideas and engaging discussions. I would also like to thank the hosts for organizing this interesting task competition.</p>\n<h1>Overview</h1>\n<ul>\n<li>Ensemble which focused on the mechanism of the metric and the performance of the model</li>\n<li>Stacking GBDT models and various transformed targets</li>\n</ul>\n<h1>Target transformation</h1>\n<p>I used public note transform ( Kaplan , Nelson etc. ) and Rank Gauss transform.<br>\nBecause the number of unique values of the target decreases by using Kaplan and so on , I concerned that amount of information decreases.<br>\nTherefore I used Rank Gauss transform as not decreasing uniques , then LB was improved slightly.</p>\n<p>[simple xgb result]</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>CV</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Kaplan</td>\n<td>0.675</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Nelson</td>\n<td>0.680</td>\n<td>0.685</td>\n<td>0.688</td>\n</tr>\n<tr>\n<td>Rank Gauss</td>\n<td>0.680</td>\n<td>0.686</td>\n<td>0.689</td>\n</tr>\n</tbody>\n</table>\n<h1>Model</h1>\n<p>I implemented stacking 30 models twice.<br>\nWhen n time stacking , I use n-1 time OOF as feature.</p>\n<p>30 models = GBDTs(XGB,CAT,LGB) : 3 * Various targets and settings : 10</p>\n<p>[ensemble result(detail below)]</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>CV</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No stack and below ensemble</td>\n<td>0.687</td>\n<td>0.689</td>\n<td>0.693</td>\n</tr>\n<tr>\n<td>1st stack and below ensemble</td>\n<td>0.690</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>2nd stack and below ensemble(final submission)</td>\n<td>0.694</td>\n<td>0.691</td>\n<td>0.695</td>\n</tr>\n</tbody>\n</table>\n<h1>Ensemble</h1>\n<p>I implemented ensembling as follows using Rank Gauss transform target.</p>\n<ol>\n<li>Ensembling efs=1 data trained model and all data trained model </li>\n<li>Substituting all data trained model prediction for above prediction  in case fallling below the threshold ageinst all data trained model prediction.<br>\n<code>y_pred.loc[oof['pred']&lt;threshold,'prediction'] = oof['pred']</code></li>\n</ol>\n<p>I consider that the competition score is calculated from two part. One part (a) is to compare each efs=1 prediction ,other (b) is to compare efs=0 prediction against efs=1 prediction.<br>\nBy training only efs=1 data , ‘a’ part score will be very high. <br>\n‘a’ part score can be improved by ensemble 1.<br>\n‘b’ part score can be improved by ensemble 2.</p>\n<p>[2nd stack result]</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>'a' part (efs=1) CV</th>\n<th>CV(a+b part)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>efs=1 data model</td>\n<td>0.745</td>\n<td>0.561</td>\n</tr>\n<tr>\n<td>All data model</td>\n<td>0.597</td>\n<td>0.686</td>\n</tr>\n<tr>\n<td>Ensemble 1</td>\n<td>0.684</td>\n<td>0.669</td>\n</tr>\n<tr>\n<td>Ensemble 2(final submission)</td>\n<td>0.680</td>\n<td>0.694</td>\n</tr>\n</tbody>\n</table>\n<h1>Didn’t work</h1>\n<p>・Target encoding<br>\n・Umap/t-SNE as a feature</p>",
      "rawMarkdown": "15th place solution\n\nFirst of all, I would like to thank the Kaggle community for sharing great ideas and engaging discussions. I would also like to thank the hosts for organizing this interesting task competition.\n\n# Overview\n- Ensemble which focused on the mechanism of the metric and the performance of the model\n- Stacking GBDT models and various transformed targets\n\n# Target transformation\nI used public note transform ( Kaplan , Nelson etc. ) and Rank Gauss transform.\nBecause the number of unique values of the target decreases by using Kaplan and so on , I concerned that amount of information decreases.\nTherefore I used Rank Gauss transform as not decreasing uniques , then LB was improved slightly.\n\n[simple xgb result]\n|  | CV | Public LB | Private LB |\n| --- | --- | --- | --- |\n| Kaplan | 0.675 |  |  |\n| Nelson | 0.680 | 0.685 | 0.688 |\n| Rank Gauss | 0.680 | 0.686 | 0.689 |\n \n# Model\nI implemented stacking 30 models twice.\nWhen n time stacking , I use n-1 time OOF as feature.\n \n30 models = GBDTs(XGB,CAT,LGB) : 3 * Various targets and settings : 10\n \n[ensemble result(detail below)]\n|  | CV | Public LB | Private LB |\n| --- | --- | --- | --- |\n| No stack and below ensemble | 0.687 | 0.689 | 0.693 |\n| 1st stack and below ensemble | 0.690 |  |  |\n| 2nd stack and below ensemble(final submission) | 0.694 | 0.691 | 0.695 |\n \n# Ensemble\nI implemented ensembling as follows using Rank Gauss transform target.\n1. Ensembling efs=1 data trained model and all data trained model \n2. Substituting all data trained model prediction for above prediction  in case fallling below the threshold ageinst all data trained model prediction.\n    `y_pred.loc[oof['pred']<threshold,'prediction'] = oof['pred']`\n \nI consider that the competition score is calculated from two part. One part (a) is to compare each efs=1 prediction ,other (b) is to compare efs=0 prediction against efs=1 prediction.\nBy training only efs=1 data , ‘a’ part score will be very high. \n‘a’ part score can be improved by ensemble 1.\n‘b’ part score can be improved by ensemble 2.\n\n[2nd stack result]\n|  | 'a' part (efs=1) CV | CV(a+b part) |\n| --- | --- | --- |\n| efs=1 data model | 0.745 | 0.561 |\n| All data model | 0.597 | 0.686 |\n| Ensemble 1 | 0.684 | 0.669 |\n| Ensemble 2(final submission) | 0.680 | 0.694 |\n \n# Didn’t work\n・Target encoding\n・Umap/t-SNE as a feature",
      "votes": 12
    },
    {
      "id": 3146627,
      "postDate": "2025-03-11T04:26:20.707Z",
      "content": "<p><a href=\"https://www.kaggle.com/tamryow\" target=\"_blank\">@tamryow</a> <br>\nCongratulations on the gold medal! I also improved my LB and CV by stacking in the same way.<br>\nI didn't try stacking a second time, so your solution is helpful.<br>\nThank you for sharing!</p>",
      "rawMarkdown": "@tamryow \nCongratulations on the gold medal! I also improved my LB and CV by stacking in the same way.\nI didn't try stacking a second time, so your solution is helpful.\nThank you for sharing!",
      "votes": 1,
      "replies": [
        {
          "id": 3146773,
          "postDate": "2025-03-11T08:25:24.253Z",
          "content": "<p>Thanks!<br>\nI'm glad I could help you.</p>",
          "rawMarkdown": "Thanks!\nI'm glad I could help you.",
          "votes": 1
        }
      ]
    },
    {
      "id": 3143970,
      "postDate": "2025-03-07T18:57:57.827Z",
      "content": "<p>Also i did not get the number 2 very well: \"Substituting all data trained model prediction for above prediction in case fallling below the threshold ageinst all data trained model prediction.<br>\ny_pred.loc[oof['pred']&lt;threshold,'prediction'] = oof['pred']\"  what is this threshold?</p>",
      "rawMarkdown": "Also i did not get the number 2 very well: \"Substituting all data trained model prediction for above prediction in case fallling below the threshold ageinst all data trained model prediction.\ny_pred.loc[oof['pred']<threshold,'prediction'] = oof['pred']\"  what is this threshold?",
      "votes": 1,
      "replies": [
        {
          "id": 3144218,
          "postDate": "2025-03-08T05:05:54.297Z",
          "content": "<p>The threshold is adjusted to optimize CV.</p>",
          "rawMarkdown": "The threshold is adjusted to optimize CV."
        }
      ]
    },
    {
      "id": 3143930,
      "postDate": "2025-03-07T18:22:34.020Z",
      "content": "<p>Hey congrats on the gold! How do you manage to do all this stacking without overfitting? How do you hyperparam optimize to avoid overfitting? Do you use eval set to early stop or not?</p>",
      "rawMarkdown": "Hey congrats on the gold! How do you manage to do all this stacking without overfitting? How do you hyperparam optimize to avoid overfitting? Do you use eval set to early stop or not?",
      "votes": 1,
      "replies": [
        {
          "id": 3144200,
          "postDate": "2025-03-08T04:52:28.267Z",
          "content": "<p>Thank you!<br>\nI happy to get a gold medal although I think also I have a luck.<br>\n<br></p>\n<blockquote>\n  <p>How do you manage to do all this stacking without overfitting? </p>\n</blockquote>\n<p>I confirmed CV and LB by simple XGB every stacking.<br>\nBy the second stack, both cv/lb had improved, so i thought there was no overfitting and decided to stack twice.<br>\n<br></p>\n<blockquote>\n  <p>How do you hyperparam optimize to avoid overfitting? </p>\n</blockquote>\n<p>I did not make any fine adjustments to the hyperparameters other than slightly changing the values ​​in the public notebook.<br>\nThe cv/lb values ​​are not very different both the public notebook and my simple xgb , so I thought it don't have overfitting.<br>\n<br></p>\n<blockquote>\n  <p>Do you use eval set to early stop or not?</p>\n</blockquote>\n<p>Yes,i did.<br>\n<br><br>\nIn terms of overfitting, I personally think it was important to avoid overfitting the score elements (a and b parts).</p>",
          "rawMarkdown": "Thank you!\nI happy to get a gold medal although I think also I have a luck.\n<br>\n>How do you manage to do all this stacking without overfitting? \n\nI confirmed CV and LB by simple XGB every stacking.\nBy the second stack, both cv/lb had improved, so i thought there was no overfitting and decided to stack twice.\n<br>\n>How do you hyperparam optimize to avoid overfitting? \n\nI did not make any fine adjustments to the hyperparameters other than slightly changing the values ​​in the public notebook.\nThe cv/lb values ​​are not very different both the public notebook and my simple xgb , so I thought it don't have overfitting.\n<br>\n>Do you use eval set to early stop or not?\n\nYes,i did.\n<br>\nIn terms of overfitting, I personally think it was important to avoid overfitting the score elements (a and b parts).",
          "votes": 1
        },
        {
          "id": 3144217,
          "postDate": "2025-03-08T05:05:21.627Z",
          "content": "<p>It may seem like hindsight, but I think the reason I was able to win the gold medal this time was because I avoided overfitting score elements(‘a’,’b’part) in CV.</p>\n<p>In a typical model in the public notes, the CV and LB for each part are as follows.</p>\n<p>The model in the public notes neglects the prediction of 'a' part, and it seemed that the prediction results were not reflected in Public LB.</p>\n<p>(There were also some other unreliable CV/LB relationships in Public LB (probably the distribution/trend of one of the races was different from CV, etc.) in my submissions, so I don't think it was just that relationship.)</p>\n<p>In any case, I considered Public LB to be unreliable based on the above, and I worked on it assuming that Private LB, which has more data, would approach the score of CV.</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>'a' part (efs=1) CV</th>\n<th>CV(a+b part)</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Public note model</td>\n<td>0.592</td>\n<td>0.681</td>\n<td>0.691</td>\n<td>0.691</td>\n</tr>\n<tr>\n<td>My final submit model</td>\n<td>0.680</td>\n<td>0.694</td>\n<td>0.691</td>\n<td>0.695</td>\n</tr>\n</tbody>\n</table>",
          "rawMarkdown": "It may seem like hindsight, but I think the reason I was able to win the gold medal this time was because I avoided overfitting score elements(‘a’,’b’part) in CV.\n\nIn a typical model in the public notes, the CV and LB for each part are as follows.\n\nThe model in the public notes neglects the prediction of 'a' part, and it seemed that the prediction results were not reflected in Public LB.\n\n(There were also some other unreliable CV/LB relationships in Public LB (probably the distribution/trend of one of the races was different from CV, etc.) in my submissions, so I don't think it was just that relationship.)\n\nIn any case, I considered Public LB to be unreliable based on the above, and I worked on it assuming that Private LB, which has more data, would approach the score of CV.\n\n|  | 'a' part (efs=1) CV | CV(a+b part) | Public LB | Private LB |\n| --- | --- |\n| Public note model | 0.592 | 0.681 | 0.691 | 0.691 |\n| My final submit model | 0.680 | 0.694 | 0.691 | 0.695 |"
        }
      ]
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-19T19:49:14Z",
  "competition_id": 70942,
  "competition_slug": "equity-post-HCT-survival-predictions",
  "team_id": 13224099,
  "solution_url": "/competitions/equity-post-HCT-survival-predictions/writeups/tamryow-15th-place-solution"
}