{
  "id": 459597,
  "title": "4th Place Solution (penguin46 part)",
  "url": "/competitions/child-mind-institute-detect-sleep-states/discussion/459597",
  "author_name": "",
  "post_date": "2023-12-06T00:22:21.405720300Z",
  "votes": 64,
  "comment_count": 4,
  "views": 0,
  "content": "<p>First, I would like to thank the competition hosts for organizing such a very interesting competition and the kaggle team for facilitating it so smoothly. Also, congratulations to all the top winners.</p>\n<p>And of course, a big thank you to my teammate <a href=\"https://www.kaggle.com/nikhilmishradev\" target=\"_blank\">@nikhilmishradev</a> for competeing with me for the last 3 weeks. Without him, we could not have achieved this great result.</p>\n<p>In this post I will mainly explain the model I developed. Check out <a href=\"https://www.kaggle.com/nikhilmishradev\" target=\"_blank\">@nikhilmishradev</a> 's post for the main stream (<a href=\"https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/459637\" target=\"_blank\">link</a>).</p>\n<p>My solution is an ensemble of 4 NN models and 2 GBDT models. In all models, target is a gaussian with variance 36 steps. I explain in detail below.</p>\n<h2>NN Models</h2>\n<p>The input is a series of 19200 steps patched every 12 steps. In other words, they have 1600 (=19200//12) length and the shape is (bs, 1600, 12*num_features). Predictions are made by minute. This patching is important for training models on long series in a short time without overfitting. During training and inference, input series is shifted by 1/8 length of input. That is, each position is predicted approximately 8 times and averaged at the end. The input is transformed by transformer, wavenet or 1dcnn and finally GRU is applied. Single model CV of theese models are 0.805~0.814. Finally, I seed averaged predictions with 1~2 seeds.</p>\n<p>The input features are as follows:</p>\n<ul>\n<li><p>standardized_anglez and enmo</p></li>\n<li><p>perfectly matched counts in 24-hour cycles</p>\n<ul>\n<li>This is useful for identifying deficiencies because the GGIR replaces deficiencies with the average of the same time on other days.</li></ul>\n<pre><code>n_days = ((df) // DAY_STEPS) + \ndf[] = \n day  (-n_days, n_days + ):\n     day == :\n        \n    df[] = df[].diff(DAY_STEPS * day)\n    df[] = df[].fillna()\n    df[] += (df[] == ).astype()\ndf[] = (df[].clip(, ) - ) / \n</code></pre></li>\n<li><p>large anglez.diff() or not (i.e. <code>anglez.diff() &gt; 5</code>)</p></li>\n<li><p>is_longest_sleep_episode and is_sleep_block from <a href=\"https://www.kaggle.com/tatamikenn\" target=\"_blank\">@tatamikenn</a> ‘s notebook.</p>\n<ul>\n<li><a href=\"https://www.kaggle.com/code/tatamikenn/sleep-hdcza-a-pure-heuristic-approach-lb-0-447\" target=\"_blank\">https://www.kaggle.com/code/tatamikenn/sleep-hdcza-a-pure-heuristic-approach-lb-0-447</a></li></ul></li>\n<li><p>lag features of the above features</p></li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3962786%2F5bcbf85dc70115602ffe62032b00192c%2Fimage.png?generation=1706561255845081&amp;alt=media\" alt=\"\"></p>\n<h2>GBDT Models</h2>\n<p>GBDT also makes a prediction every minute. The features created were mainly those used in above NNs, but it was especially important to add rich lag features. I trained XGBoost and LightGBM. Their CV are 0.7941 and 0.7934, respectively. The richer features improved these CVs to 0.7998 and 0.7978, but were not employed because the final CV did not change after ensemble.</p>\n<h2>tubo Models</h2>\n<p>It is based on <a href=\"https://www.kaggle.com/tubotubo\" target=\"_blank\">@tubotubo</a> ‘s excellent repo. I added described features and sliding window. CV is 0.789.</p>\n<h2>Post Processing</h2>\n<p>This part is important. While the task of this competition is essentially ranking, we can submit a large number of low confidence forecasts with no risk. My post-process is similar to NMS, but allows for predictions of non-peaks as well. Specifically, the process is as follows:</p>\n<ol>\n<li><p>leave only the 12n+6 (n&gt;=0) steps to eliminate the steps that are too close.</p></li>\n<li><p>repeat the following steps until there are more than 1000 predictions for each series. Also initialize the reduce_rate array with [1, 1, …, 1].</p></li>\n<li><p>Select the triplet of (step, event, score) with the highest confidence (=score / reduce_rate) and add it to submission.</p></li>\n<li><p>add <code>((RANGE - |r|) / RANGE) ** EXP * COEFF(|r| &lt; RANGE)</code> to reduce_rate. (RANGE, EXP and COEFF are hyper params to be tuned.)</p></li>\n</ol>\n<p>This process was further refined by Nikhil so his post processing was used in the final team submissions.</p>\n<h2>Ensemble</h2>\n<p>Finally, averaged preds with NN:GBDT:tubo = 5:2:3 weights is the output of my part. The final CV of my part is 0.825, public LB is 0.784 and privete LB is 0.840 with my post-process.</p>\n<h2>Not Worked</h2>\n<ul>\n<li>longer series</li>\n<li>BigBird-like sparse attention.</li>\n<li>re-ranking by ranker<ul>\n<li>regresses on the number of matches with target directly, not on soft label targets.</li>\n<li>I thought that close predictions could cooperatively modify their confidence, but the metric did not change.</li></ul></li>\n<li>data augmentation<ul>\n<li>copy&amp;paste, time flip, etc…</li></ul></li>\n<li>hand labeling on unlabeled training data.</li>\n<li>focal loss</li>\n<li>pseudo labeling during submission</li>\n</ul>\n<p>etc…</p>\n<p>Thank you for reading.</p>\n<hr>\n<p>Edit:<br>\nI published my training repositories.</p>\n<ul>\n<li><a href=\"https://github.com/penguin-prg/child-mind-institute-detect-sleep-states\" target=\"_blank\">https://github.com/penguin-prg/child-mind-institute-detect-sleep-states</a></li>\n<li><a href=\"https://github.com/penguin-prg/cmi-tubo-base\" target=\"_blank\">https://github.com/penguin-prg/cmi-tubo-base</a></li>\n</ul>",
  "messages": [
    {
      "id": "2550272",
      "postDate": "12/06/2023 00:22:21",
      "content": "<p>First, I would like to thank the competition hosts for organizing such a very interesting competition and the kaggle team for facilitating it so smoothly. Also, congratulations to all the top winners.</p>\n<p>And of course, a big thank you to my teammate <a href=\"https://www.kaggle.com/nikhilmishradev\" target=\"_blank\">@nikhilmishradev</a> for competeing with me for the last 3 weeks. Without him, we could not have achieved this great result.</p>\n<p>In this post I will mainly explain the model I developed. Check out <a href=\"https://www.kaggle.com/nikhilmishradev\" target=\"_blank\">@nikhilmishradev</a> 's post for the main stream (<a href=\"https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/459637\" target=\"_blank\">link</a>).</p>\n<p>My solution is an ensemble of 4 NN models and 2 GBDT models. In all models, target is a gaussian with variance 36 steps. I explain in detail below.</p>\n<h2>NN Models</h2>\n<p>The input is a series of 19200 steps patched every 12 steps. In other words, they have 1600 (=19200//12) length and the shape is (bs, 1600, 12*num_features). Predictions are made by minute. This patching is important for training models on long series in a short time without overfitting. During training and inference, input series is shifted by 1/8 length of input. That is, each position is predicted approximately 8 times and averaged at the end. The input is transformed by transformer, wavenet or 1dcnn and finally GRU is applied. Single model CV of theese models are 0.805~0.814. Finally, I seed averaged predictions with 1~2 seeds.</p>\n<p>The input features are as follows:</p>\n<ul>\n<li><p>standardized_anglez and enmo</p></li>\n<li><p>perfectly matched counts in 24-hour cycles</p>\n<ul>\n<li>This is useful for identifying deficiencies because the GGIR replaces deficiencies with the average of the same time on other days.</li></ul>\n<pre><code>n_days = ((df) // DAY_STEPS) + \ndf[] = \n day  (-n_days, n_days + ):\n     day == :\n        \n    df[] = df[].diff(DAY_STEPS * day)\n    df[] = df[].fillna()\n    df[] += (df[] == ).astype()\ndf[] = (df[].clip(, ) - ) / \n</code></pre></li>\n<li><p>large anglez.diff() or not (i.e. <code>anglez.diff() &gt; 5</code>)</p></li>\n<li><p>is_longest_sleep_episode and is_sleep_block from <a href=\"https://www.kaggle.com/tatamikenn\" target=\"_blank\">@tatamikenn</a> ‘s notebook.</p>\n<ul>\n<li><a href=\"https://www.kaggle.com/code/tatamikenn/sleep-hdcza-a-pure-heuristic-approach-lb-0-447\" target=\"_blank\">https://www.kaggle.com/code/tatamikenn/sleep-hdcza-a-pure-heuristic-approach-lb-0-447</a></li></ul></li>\n<li><p>lag features of the above features</p></li>\n</ul>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3962786%2F5bcbf85dc70115602ffe62032b00192c%2Fimage.png?generation=1706561255845081&amp;alt=media\" alt=\"\"></p>\n<h2>GBDT Models</h2>\n<p>GBDT also makes a prediction every minute. The features created were mainly those used in above NNs, but it was especially important to add rich lag features. I trained XGBoost and LightGBM. Their CV are 0.7941 and 0.7934, respectively. The richer features improved these CVs to 0.7998 and 0.7978, but were not employed because the final CV did not change after ensemble.</p>\n<h2>tubo Models</h2>\n<p>It is based on <a href=\"https://www.kaggle.com/tubotubo\" target=\"_blank\">@tubotubo</a> ‘s excellent repo. I added described features and sliding window. CV is 0.789.</p>\n<h2>Post Processing</h2>\n<p>This part is important. While the task of this competition is essentially ranking, we can submit a large number of low confidence forecasts with no risk. My post-process is similar to NMS, but allows for predictions of non-peaks as well. Specifically, the process is as follows:</p>\n<ol>\n<li><p>leave only the 12n+6 (n&gt;=0) steps to eliminate the steps that are too close.</p></li>\n<li><p>repeat the following steps until there are more than 1000 predictions for each series. Also initialize the reduce_rate array with [1, 1, …, 1].</p></li>\n<li><p>Select the triplet of (step, event, score) with the highest confidence (=score / reduce_rate) and add it to submission.</p></li>\n<li><p>add <code>((RANGE - |r|) / RANGE) ** EXP * COEFF(|r| &lt; RANGE)</code> to reduce_rate. (RANGE, EXP and COEFF are hyper params to be tuned.)</p></li>\n</ol>\n<p>This process was further refined by Nikhil so his post processing was used in the final team submissions.</p>\n<h2>Ensemble</h2>\n<p>Finally, averaged preds with NN:GBDT:tubo = 5:2:3 weights is the output of my part. The final CV of my part is 0.825, public LB is 0.784 and privete LB is 0.840 with my post-process.</p>\n<h2>Not Worked</h2>\n<ul>\n<li>longer series</li>\n<li>BigBird-like sparse attention.</li>\n<li>re-ranking by ranker<ul>\n<li>regresses on the number of matches with target directly, not on soft label targets.</li>\n<li>I thought that close predictions could cooperatively modify their confidence, but the metric did not change.</li></ul></li>\n<li>data augmentation<ul>\n<li>copy&amp;paste, time flip, etc…</li></ul></li>\n<li>hand labeling on unlabeled training data.</li>\n<li>focal loss</li>\n<li>pseudo labeling during submission</li>\n</ul>\n<p>etc…</p>\n<p>Thank you for reading.</p>\n<hr>\n<p>Edit:<br>\nI published my training repositories.</p>\n<ul>\n<li><a href=\"https://github.com/penguin-prg/child-mind-institute-detect-sleep-states\" target=\"_blank\">https://github.com/penguin-prg/child-mind-institute-detect-sleep-states</a></li>\n<li><a href=\"https://github.com/penguin-prg/cmi-tubo-base\" target=\"_blank\">https://github.com/penguin-prg/cmi-tubo-base</a></li>\n</ul>",
      "rawMarkdown": "First, I would like to thank the competition hosts for organizing such a very interesting competition and the kaggle team for facilitating it so smoothly. Also, congratulations to all the top winners.\n\nAnd of course, a big thank you to my teammate @nikhilmishradev for competeing with me for the last 3 weeks. Without him, we could not have achieved this great result.\n\nIn this post I will mainly explain the model I developed. Check out @nikhilmishradev 's post for the main stream ([link](https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/459637)).\n\nMy solution is an ensemble of 4 NN models and 2 GBDT models. In all models, target is a gaussian with variance 36 steps. I explain in detail below.\n\n## NN Models\n\nThe input is a series of 19200 steps patched every 12 steps. In other words, they have 1600 (=19200//12) length and the shape is (bs, 1600, 12*num_features). Predictions are made by minute. This patching is important for training models on long series in a short time without overfitting. During training and inference, input series is shifted by 1/8 length of input. That is, each position is predicted approximately 8 times and averaged at the end. The input is transformed by transformer, wavenet or 1dcnn and finally GRU is applied. Single model CV of theese models are 0.805~0.814. Finally, I seed averaged predictions with 1~2 seeds.\n\nThe input features are as follows:\n\n- standardized_anglez and enmo\n- perfectly matched counts in 24-hour cycles\n    - This is useful for identifying deficiencies because the GGIR replaces deficiencies with the average of the same time on other days.\n    \n    ```python\n    n_days = int(len(df) // DAY_STEPS) + 1\n    df[\"same_count\"] = 0\n    for day in range(-n_days, n_days + 1):\n        if day == 0:\n            continue\n        df[\"_anglez_diff\"] = df[\"anglez\"].diff(DAY_STEPS * day)\n        df[\"_anglez_diff\"] = df[\"_anglez_diff\"].fillna(1)\n        df[\"same_count\"] += (df[\"_anglez_diff\"] == 0).astype(int)\n    df[\"same_count\"] = (df[\"same_count\"].clip(0, 5) - 2.5) / 2.5\n    ```\n    \n- large anglez.diff() or not (i.e. `anglez.diff() > 5`)\n- is_longest_sleep_episode and is_sleep_block from @tatamikenn ‘s notebook.\n    - https://www.kaggle.com/code/tatamikenn/sleep-hdcza-a-pure-heuristic-approach-lb-0-447\n- lag features of the above features\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3962786%2F5bcbf85dc70115602ffe62032b00192c%2Fimage.png?generation=1706561255845081&alt=media)\n\n## GBDT Models\n\nGBDT also makes a prediction every minute. The features created were mainly those used in above NNs, but it was especially important to add rich lag features. I trained XGBoost and LightGBM. Their CV are 0.7941 and 0.7934, respectively. The richer features improved these CVs to 0.7998 and 0.7978, but were not employed because the final CV did not change after ensemble.\n\n## tubo Models\n\nIt is based on @tubotubo ‘s excellent repo. I added described features and sliding window. CV is 0.789.\n\n## Post Processing\n\nThis part is important. While the task of this competition is essentially ranking, we can submit a large number of low confidence forecasts with no risk. My post-process is similar to NMS, but allows for predictions of non-peaks as well. Specifically, the process is as follows:\n\n1. leave only the 12n+6 (n>=0) steps to eliminate the steps that are too close.\n\n2. repeat the following steps until there are more than 1000 predictions for each series. Also initialize the reduce_rate array with [1, 1, ..., 1].\n\n3. Select the triplet of (step, event, score) with the highest confidence (=score / reduce_rate) and add it to submission.\n\n4. add `((RANGE - |r|) / RANGE) ** EXP * COEFF(|r| < RANGE)` to reduce_rate. (RANGE, EXP and COEFF are hyper params to be tuned.)\n\nThis process was further refined by Nikhil so his post processing was used in the final team submissions.\n\n## Ensemble\n\nFinally, averaged preds with NN:GBDT:tubo = 5:2:3 weights is the output of my part. The final CV of my part is 0.825, public LB is 0.784 and privete LB is 0.840 with my post-process.\n\n## Not Worked\n\n- longer series\n- BigBird-like sparse attention.\n- re-ranking by ranker\n    - regresses on the number of matches with target directly, not on soft label targets.\n    - I thought that close predictions could cooperatively modify their confidence, but the metric did not change.\n- data augmentation\n    - copy&paste, time flip, etc…\n- hand labeling on unlabeled training data.\n- focal loss\n- pseudo labeling during submission\n\netc…\n\nThank you for reading.\n\n-----\n\nEdit:\nI published my training repositories.\n- https://github.com/penguin-prg/child-mind-institute-detect-sleep-states\n- https://github.com/penguin-prg/cmi-tubo-base",
      "votes": null
    },
    {
      "id": "2550286",
      "postDate": "12/06/2023 00:33:56",
      "content": "<p>Wow, great pipeline! Congrats to both of you guys! Especially the tabular part, I lost my hope on those models way too early after seeing the tubo's repo.</p>",
      "rawMarkdown": "Wow, great pipeline! Congrats to both of you guys! Especially the tabular part, I lost my hope on those models way too early after seeing the tubo's repo.",
      "votes": null
    },
    {
      "id": "2550296",
      "postDate": "12/06/2023 00:46:55",
      "content": "<p>Thanks! His model is very powerful and we learned a lot also from him!</p>",
      "rawMarkdown": "Thanks! His model is very powerful and we learned a lot also from him!",
      "votes": null
    },
    {
      "id": "2551087",
      "postDate": "12/06/2023 13:55:30",
      "content": "<p>Congratulations <a href=\"https://www.kaggle.com/PENGUIN46\" target=\"_blank\">@PENGUIN46</a> !</p>",
      "rawMarkdown": "Congratulations @PENGUIN46 !",
      "votes": null
    },
    {
      "id": "2552196",
      "postDate": "12/07/2023 09:30:18",
      "content": "<p>Congratulations on securing fourth position in this competition. Thanks for sharing useful insights into the ML part. </p>",
      "rawMarkdown": "Congratulations on securing fourth position in this competition. Thanks for sharing useful insights into the ML part.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 2550286,
      "author_name": "snnclsr",
      "author_url": "",
      "post_date": "12/06/2023 00:33:56",
      "content": "<p>Wow, great pipeline! Congrats to both of you guys! Especially the tabular part, I lost my hope on those models way too early after seeing the tubo's repo.</p>",
      "votes": null,
      "replies": [
        {
          "id": 2550296,
          "author_name": "ryotayoshinobu",
          "author_url": "",
          "post_date": "12/06/2023 00:46:55",
          "content": "<p>Thanks! His model is very powerful and we learned a lot also from him!</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 2551087,
      "author_name": "abhasmalguri",
      "author_url": "",
      "post_date": "12/06/2023 13:55:30",
      "content": "<p>Congratulations <a href=\"https://www.kaggle.com/PENGUIN46\" target=\"_blank\">@PENGUIN46</a> !</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 2552196,
      "author_name": "crsuthikshnkumar",
      "author_url": "",
      "post_date": "12/07/2023 09:30:18",
      "content": "<p>Congratulations on securing fourth position in this competition. Thanks for sharing useful insights into the ML part. </p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "2550272": "First, I would like to thank the competition hosts for organizing such a very interesting competition and the kaggle team for facilitating it so smoothly. Also, congratulations to all the top winners.\n\nAnd of course, a big thank you to my teammate @nikhilmishradev for competeing with me for the last 3 weeks. Without him, we could not have achieved this great result.\n\nIn this post I will mainly explain the model I developed. Check out @nikhilmishradev 's post for the main stream ([link](https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/459637)).\n\nMy solution is an ensemble of 4 NN models and 2 GBDT models. In all models, target is a gaussian with variance 36 steps. I explain in detail below.\n\n## NN Models\n\nThe input is a series of 19200 steps patched every 12 steps. In other words, they have 1600 (=19200//12) length and the shape is (bs, 1600, 12*num_features). Predictions are made by minute. This patching is important for training models on long series in a short time without overfitting. During training and inference, input series is shifted by 1/8 length of input. That is, each position is predicted approximately 8 times and averaged at the end. The input is transformed by transformer, wavenet or 1dcnn and finally GRU is applied. Single model CV of theese models are 0.805~0.814. Finally, I seed averaged predictions with 1~2 seeds.\n\nThe input features are as follows:\n\n- standardized_anglez and enmo\n- perfectly matched counts in 24-hour cycles\n    - This is useful for identifying deficiencies because the GGIR replaces deficiencies with the average of the same time on other days.\n    \n    ```python\n    n_days = int(len(df) // DAY_STEPS) + 1\n    df[\"same_count\"] = 0\n    for day in range(-n_days, n_days + 1):\n        if day == 0:\n            continue\n        df[\"_anglez_diff\"] = df[\"anglez\"].diff(DAY_STEPS * day)\n        df[\"_anglez_diff\"] = df[\"_anglez_diff\"].fillna(1)\n        df[\"same_count\"] += (df[\"_anglez_diff\"] == 0).astype(int)\n    df[\"same_count\"] = (df[\"same_count\"].clip(0, 5) - 2.5) / 2.5\n    ```\n    \n- large anglez.diff() or not (i.e. `anglez.diff() > 5`)\n- is_longest_sleep_episode and is_sleep_block from @tatamikenn ‘s notebook.\n    - https://www.kaggle.com/code/tatamikenn/sleep-hdcza-a-pure-heuristic-approach-lb-0-447\n- lag features of the above features\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F3962786%2F5bcbf85dc70115602ffe62032b00192c%2Fimage.png?generation=1706561255845081&alt=media)\n\n## GBDT Models\n\nGBDT also makes a prediction every minute. The features created were mainly those used in above NNs, but it was especially important to add rich lag features. I trained XGBoost and LightGBM. Their CV are 0.7941 and 0.7934, respectively. The richer features improved these CVs to 0.7998 and 0.7978, but were not employed because the final CV did not change after ensemble.\n\n## tubo Models\n\nIt is based on @tubotubo ‘s excellent repo. I added described features and sliding window. CV is 0.789.\n\n## Post Processing\n\nThis part is important. While the task of this competition is essentially ranking, we can submit a large number of low confidence forecasts with no risk. My post-process is similar to NMS, but allows for predictions of non-peaks as well. Specifically, the process is as follows:\n\n1. leave only the 12n+6 (n>=0) steps to eliminate the steps that are too close.\n\n2. repeat the following steps until there are more than 1000 predictions for each series. Also initialize the reduce_rate array with [1, 1, ..., 1].\n\n3. Select the triplet of (step, event, score) with the highest confidence (=score / reduce_rate) and add it to submission.\n\n4. add `((RANGE - |r|) / RANGE) ** EXP * COEFF(|r| < RANGE)` to reduce_rate. (RANGE, EXP and COEFF are hyper params to be tuned.)\n\nThis process was further refined by Nikhil so his post processing was used in the final team submissions.\n\n## Ensemble\n\nFinally, averaged preds with NN:GBDT:tubo = 5:2:3 weights is the output of my part. The final CV of my part is 0.825, public LB is 0.784 and privete LB is 0.840 with my post-process.\n\n## Not Worked\n\n- longer series\n- BigBird-like sparse attention.\n- re-ranking by ranker\n    - regresses on the number of matches with target directly, not on soft label targets.\n    - I thought that close predictions could cooperatively modify their confidence, but the metric did not change.\n- data augmentation\n    - copy&paste, time flip, etc…\n- hand labeling on unlabeled training data.\n- focal loss\n- pseudo labeling during submission\n\netc…\n\nThank you for reading.\n\n-----\n\nEdit:\nI published my training repositories.\n- https://github.com/penguin-prg/child-mind-institute-detect-sleep-states\n- https://github.com/penguin-prg/cmi-tubo-base",
    "2550286": "Wow, great pipeline! Congrats to both of you guys! Especially the tabular part, I lost my hope on those models way too early after seeing the tubo's repo.",
    "2550296": "Thanks! His model is very powerful and we learned a lot also from him!",
    "2551087": "Congratulations @PENGUIN46 !",
    "2552196": "Congratulations on securing fourth position in this competition. Thanks for sharing useful insights into the ML part."
  },
  "source": "meta"
}