{
  "id": 589574,
  "title": "3rd Place (Public) / 4th Place (Private) Solution — Alpha Summer Challenge",
  "url": "/competitions/alpha-summer-challenge/discussion/589574",
  "author_name": "Nikolay Slobodchuk",
  "post_date": "2025-07-13T21:09:50.261000",
  "votes": 6,
  "comment_count": 0,
  "views": 0,
  "content": "<h1>🏆 3-е место на паблике / 4-е место на приватном лидерборде — Alpha Summer Challenge</h1>\n<p>📘 Ознакомиться с полным ноутбуком: <a href=\"https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution\" target=\"_blank\">Alfa Summer Challenge - LSTM Solution</a></p>\n<p>В этом соревновании требовалось предсказать <strong>группу минимального баланса клиента</strong> на следующий месяц.  <br>\nЦелевая переменная — целое число от <code>0</code> (нулевой баланс) до <code>6</code> (высокий баланс), отражающее уровень минимального остатка клиента за месяц.</p>\n<hr>\n<h2>🧠 Общее описание решения</h2>\n<p>Финальный сабмит был получен путём <strong>усреднения предсказаний трёх моделей</strong> на основе Bidirectional LSTM:</p>\n<ul>\n<li>Модель, обученная <strong>локально на MacBook</strong></li>\n<li>Модель, обученная в <strong>Kaggle Notebook</strong></li>\n<li>Модель с <strong>немного изменёнными гиперпараметрами</strong></li>\n</ul>\n<p>Такой простой ансамбль позволил занять:</p>\n<ul>\n<li>🥉 <strong>3-е место на публичном лидерборде</strong></li>\n<li>🎖️ <strong>4-е место на приватном лидерборде</strong></li>\n</ul>\n<hr>\n<h2>📊 Обработка данных и построение признаков</h2>\n<h3>1. Глобальные признаки клиента</h3>\n<p>Для каждого клиента рассчитаны глобальные статистики:</p>\n<ul>\n<li>Логарифмированные: <code>mean</code>, <code>std</code>, <code>max</code>, <code>sum</code> по <code>amount</code></li>\n<li>Количество уникальных <code>mcc_code</code> и <code>merchant_name</code></li>\n<li>Нормализованные timestamps первых и последних транзакций</li>\n</ul>\n<h3>2. Агрегации по дням</h3>\n<p>Для каждой пары <code>(client, date)</code>:</p>\n<ul>\n<li>Считаются метрики: <code>sum</code>, <code>count</code>, <code>mean</code>, <code>std</code>, <code>min</code>, <code>max</code></li>\n<li>Количество уникальных MCC и мерчантов в этот день</li>\n</ul>\n<h3>3. Top-N категорий</h3>\n<p>Для <code>mcc_code</code> и <code>merchant_name</code> выделяются <strong>топ-5 категорий</strong> по количеству транзакций.  <br>\nДля каждой позиции в топе рассчитываются:</p>\n<ul>\n<li>Сумма операций</li>\n<li>Количество</li>\n<li>Доля от дневного объёма</li>\n</ul>\n<h3>4. Сетка client × date</h3>\n<p>Создаётся полная сетка <code>client_num × date</code>, чтобы учесть все дни, даже без транзакций.  <br>\nВсе признаки объединяются в один датафрейм.</p>\n<h3>5. Временные признаки</h3>\n<p>Добавлены:</p>\n<ul>\n<li>День недели (<code>day_of_week</code>)</li>\n<li>День года (<code>day_of_year</code>)</li>\n<li>Номер недели (<code>week</code>)</li>\n<li>Месяц (<code>month</code>)</li>\n<li>Относительное положение во времени (<code>timestep_ratio</code>)</li>\n</ul>\n<h3>6. Финальная обработка</h3>\n<ul>\n<li>Пропуски заполнены</li>\n<li>Логарифмирование числовых агрегатов</li>\n<li>Объединение с глобальными фичами клиента</li>\n<li>Стандартизация числовых признаков с <code>StandardScaler</code></li>\n</ul>\n<hr>\n<h2>🤖 Модель: Bidirectional LSTM</h2>\n<p>Каждый клиент представлен как последовательность ежедневных признаков (длина ~93 дня).  <br>\nЭта последовательность подаётся в модель:</p>\n<h3>Вход:</h3>\n<ul>\n<li>Числовые признаки (стандартизированы)</li>\n<li>Эмбеддинги категориальных признаков (MCC, мерчант, дата и др.)</li>\n</ul>\n<h3>Архитектура:</h3>\n<ul>\n<li>Bidirectional LSTM (3 слоя, <code>hidden_size=1024</code>)</li>\n<li>Mean-пулинг по последним 20 шагам</li>\n<li>Полносвязный слой → одно предсказание</li>\n</ul>\n<h3>Функция потерь: Weighted MAE (WMAE)</h3>\n<p>Ошибки по классам с низким балансом штрафуются сильнее:</p>\n<pre><code>class_weights = {\n    : , : , : , : ,\n    : , : , : , : \n}\n</code></pre>\n<hr>\n<h2>🧪 Валидация</h2>\n<ul>\n<li>Стратифицированный сплит 80/20 по таргету</li>\n<li>Оценка модели с помощью <code>WMAE</code> по raw и округлённым предсказаниям</li>\n<li>Сохранялись лучшие веса по обеим метрикам</li>\n</ul>\n<hr>\n<h2>🧬 Ансамбль</h2>\n<p>Финальный сабмит — <strong>усреднение трёх моделей</strong>:</p>\n<ul>\n<li>Модель, обученная локально</li>\n<li>Модель, обученная на Kaggle</li>\n<li>Модель с другими параметрами (<code>hidden_size</code>, <code>learning_rate</code>, <code>num_layers</code>)</li>\n</ul>\n<p>Этот подход помог уменьшить переобучение и повысить стабильность.</p>\n<hr>\n<h2>📤 Предсказания и сабмит</h2>\n<ul>\n<li>Предсказания были <strong>округлены до диапазона [0, 6]</strong></li>\n<li>Сохранены в формате <code>submission.csv</code></li>\n</ul>\n<pre><code>pred_df[] = np.clip(np.(pred_df[]), , ).astype()\n</code></pre>\n<hr>\n<h2>📌 Результаты</h2>\n<p>📈 <strong>Public LB</strong>: 3-е место  <br>\n🏁 <strong>Private LB</strong>: 4-е место</p>\n<hr>\n<h2>🧷 Выводы</h2>\n<ul>\n<li>Временные ряды по клиентам отлично подходят под LSTM-архитектуру  </li>\n<li>WMAE — эффективная метрика, отражающая целевую функцию</li>\n<li>Даже простое усреднение моделей даёт ощутимую пользу</li>\n</ul>\n<p>📘 Ознакомиться с полным ноутбуком: <a href=\"https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution\" target=\"_blank\">Alfa Summer Challenge - LSTM Solution</a></p>\n<hr>\n<p>🔥 Спасибо всем участникам и организаторам!  <br>\nЕсли есть вопросы — пишите в комментарии, с радостью отвечу 🙌</p>",
  "messages": [
    {
      "id": 3248032,
      "postDate": "2025-07-13T21:09:50.260Z",
      "content": "<h1>🏆 3-е место на паблике / 4-е место на приватном лидерборде — Alpha Summer Challenge</h1>\n<p>📘 Ознакомиться с полным ноутбуком: <a href=\"https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution\" target=\"_blank\">Alfa Summer Challenge - LSTM Solution</a></p>\n<p>В этом соревновании требовалось предсказать <strong>группу минимального баланса клиента</strong> на следующий месяц.  <br>\nЦелевая переменная — целое число от <code>0</code> (нулевой баланс) до <code>6</code> (высокий баланс), отражающее уровень минимального остатка клиента за месяц.</p>\n<hr>\n<h2>🧠 Общее описание решения</h2>\n<p>Финальный сабмит был получен путём <strong>усреднения предсказаний трёх моделей</strong> на основе Bidirectional LSTM:</p>\n<ul>\n<li>Модель, обученная <strong>локально на MacBook</strong></li>\n<li>Модель, обученная в <strong>Kaggle Notebook</strong></li>\n<li>Модель с <strong>немного изменёнными гиперпараметрами</strong></li>\n</ul>\n<p>Такой простой ансамбль позволил занять:</p>\n<ul>\n<li>🥉 <strong>3-е место на публичном лидерборде</strong></li>\n<li>🎖️ <strong>4-е место на приватном лидерборде</strong></li>\n</ul>\n<hr>\n<h2>📊 Обработка данных и построение признаков</h2>\n<h3>1. Глобальные признаки клиента</h3>\n<p>Для каждого клиента рассчитаны глобальные статистики:</p>\n<ul>\n<li>Логарифмированные: <code>mean</code>, <code>std</code>, <code>max</code>, <code>sum</code> по <code>amount</code></li>\n<li>Количество уникальных <code>mcc_code</code> и <code>merchant_name</code></li>\n<li>Нормализованные timestamps первых и последних транзакций</li>\n</ul>\n<h3>2. Агрегации по дням</h3>\n<p>Для каждой пары <code>(client, date)</code>:</p>\n<ul>\n<li>Считаются метрики: <code>sum</code>, <code>count</code>, <code>mean</code>, <code>std</code>, <code>min</code>, <code>max</code></li>\n<li>Количество уникальных MCC и мерчантов в этот день</li>\n</ul>\n<h3>3. Top-N категорий</h3>\n<p>Для <code>mcc_code</code> и <code>merchant_name</code> выделяются <strong>топ-5 категорий</strong> по количеству транзакций.  <br>\nДля каждой позиции в топе рассчитываются:</p>\n<ul>\n<li>Сумма операций</li>\n<li>Количество</li>\n<li>Доля от дневного объёма</li>\n</ul>\n<h3>4. Сетка client × date</h3>\n<p>Создаётся полная сетка <code>client_num × date</code>, чтобы учесть все дни, даже без транзакций.  <br>\nВсе признаки объединяются в один датафрейм.</p>\n<h3>5. Временные признаки</h3>\n<p>Добавлены:</p>\n<ul>\n<li>День недели (<code>day_of_week</code>)</li>\n<li>День года (<code>day_of_year</code>)</li>\n<li>Номер недели (<code>week</code>)</li>\n<li>Месяц (<code>month</code>)</li>\n<li>Относительное положение во времени (<code>timestep_ratio</code>)</li>\n</ul>\n<h3>6. Финальная обработка</h3>\n<ul>\n<li>Пропуски заполнены</li>\n<li>Логарифмирование числовых агрегатов</li>\n<li>Объединение с глобальными фичами клиента</li>\n<li>Стандартизация числовых признаков с <code>StandardScaler</code></li>\n</ul>\n<hr>\n<h2>🤖 Модель: Bidirectional LSTM</h2>\n<p>Каждый клиент представлен как последовательность ежедневных признаков (длина ~93 дня).  <br>\nЭта последовательность подаётся в модель:</p>\n<h3>Вход:</h3>\n<ul>\n<li>Числовые признаки (стандартизированы)</li>\n<li>Эмбеддинги категориальных признаков (MCC, мерчант, дата и др.)</li>\n</ul>\n<h3>Архитектура:</h3>\n<ul>\n<li>Bidirectional LSTM (3 слоя, <code>hidden_size=1024</code>)</li>\n<li>Mean-пулинг по последним 20 шагам</li>\n<li>Полносвязный слой → одно предсказание</li>\n</ul>\n<h3>Функция потерь: Weighted MAE (WMAE)</h3>\n<p>Ошибки по классам с низким балансом штрафуются сильнее:</p>\n<pre><code>class_weights = {\n    : , : , : , : ,\n    : , : , : , : \n}\n</code></pre>\n<hr>\n<h2>🧪 Валидация</h2>\n<ul>\n<li>Стратифицированный сплит 80/20 по таргету</li>\n<li>Оценка модели с помощью <code>WMAE</code> по raw и округлённым предсказаниям</li>\n<li>Сохранялись лучшие веса по обеим метрикам</li>\n</ul>\n<hr>\n<h2>🧬 Ансамбль</h2>\n<p>Финальный сабмит — <strong>усреднение трёх моделей</strong>:</p>\n<ul>\n<li>Модель, обученная локально</li>\n<li>Модель, обученная на Kaggle</li>\n<li>Модель с другими параметрами (<code>hidden_size</code>, <code>learning_rate</code>, <code>num_layers</code>)</li>\n</ul>\n<p>Этот подход помог уменьшить переобучение и повысить стабильность.</p>\n<hr>\n<h2>📤 Предсказания и сабмит</h2>\n<ul>\n<li>Предсказания были <strong>округлены до диапазона [0, 6]</strong></li>\n<li>Сохранены в формате <code>submission.csv</code></li>\n</ul>\n<pre><code>pred_df[] = np.clip(np.(pred_df[]), , ).astype()\n</code></pre>\n<hr>\n<h2>📌 Результаты</h2>\n<p>📈 <strong>Public LB</strong>: 3-е место  <br>\n🏁 <strong>Private LB</strong>: 4-е место</p>\n<hr>\n<h2>🧷 Выводы</h2>\n<ul>\n<li>Временные ряды по клиентам отлично подходят под LSTM-архитектуру  </li>\n<li>WMAE — эффективная метрика, отражающая целевую функцию</li>\n<li>Даже простое усреднение моделей даёт ощутимую пользу</li>\n</ul>\n<p>📘 Ознакомиться с полным ноутбуком: <a href=\"https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution\" target=\"_blank\">Alfa Summer Challenge - LSTM Solution</a></p>\n<hr>\n<p>🔥 Спасибо всем участникам и организаторам!  <br>\nЕсли есть вопросы — пишите в комментарии, с радостью отвечу 🙌</p>",
      "rawMarkdown": "# 🏆 3-е место на паблике / 4-е место на приватном лидерборде — Alpha Summer Challenge\n📘 Ознакомиться с полным ноутбуком: [Alfa Summer Challenge - LSTM Solution](https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution)\n\nВ этом соревновании требовалось предсказать **группу минимального баланса клиента** на следующий месяц.  \nЦелевая переменная — целое число от `0` (нулевой баланс) до `6` (высокий баланс), отражающее уровень минимального остатка клиента за месяц.\n\n---\n\n## 🧠 Общее описание решения\n\nФинальный сабмит был получен путём **усреднения предсказаний трёх моделей** на основе Bidirectional LSTM:\n- Модель, обученная **локально на MacBook**\n- Модель, обученная в **Kaggle Notebook**\n- Модель с **немного изменёнными гиперпараметрами**\n\nТакой простой ансамбль позволил занять:\n- 🥉 **3-е место на публичном лидерборде**\n- 🎖️ **4-е место на приватном лидерборде**\n\n---\n\n## 📊 Обработка данных и построение признаков\n\n### 1. Глобальные признаки клиента\nДля каждого клиента рассчитаны глобальные статистики:\n- Логарифмированные: `mean`, `std`, `max`, `sum` по `amount`\n- Количество уникальных `mcc_code` и `merchant_name`\n- Нормализованные timestamps первых и последних транзакций\n\n### 2. Агрегации по дням\nДля каждой пары `(client, date)`:\n- Считаются метрики: `sum`, `count`, `mean`, `std`, `min`, `max`\n- Количество уникальных MCC и мерчантов в этот день\n\n### 3. Top-N категорий\nДля `mcc_code` и `merchant_name` выделяются **топ-5 категорий** по количеству транзакций.  \nДля каждой позиции в топе рассчитываются:\n- Сумма операций\n- Количество\n- Доля от дневного объёма\n\n### 4. Сетка client × date\nСоздаётся полная сетка `client_num × date`, чтобы учесть все дни, даже без транзакций.  \nВсе признаки объединяются в один датафрейм.\n\n### 5. Временные признаки\nДобавлены:\n- День недели (`day_of_week`)\n- День года (`day_of_year`)\n- Номер недели (`week`)\n- Месяц (`month`)\n- Относительное положение во времени (`timestep_ratio`)\n\n### 6. Финальная обработка\n- Пропуски заполнены\n- Логарифмирование числовых агрегатов\n- Объединение с глобальными фичами клиента\n- Стандартизация числовых признаков с `StandardScaler`\n\n---\n\n## 🤖 Модель: Bidirectional LSTM\n\nКаждый клиент представлен как последовательность ежедневных признаков (длина ~93 дня).  \nЭта последовательность подаётся в модель:\n\n### Вход:\n- Числовые признаки (стандартизированы)\n- Эмбеддинги категориальных признаков (MCC, мерчант, дата и др.)\n\n### Архитектура:\n- Bidirectional LSTM (3 слоя, `hidden_size=1024`)\n- Mean-пулинг по последним 20 шагам\n- Полносвязный слой → одно предсказание\n\n### Функция потерь: Weighted MAE (WMAE)\n\nОшибки по классам с низким балансом штрафуются сильнее:\n\n```python\nclass_weights = {\n    0: 1.00, 1: 0.72, 2: 0.52, 3: 0.37,\n    4: 0.27, 5: 0.19, 6: 0.14, 7: 0.10\n}\n```\n\n---\n\n## 🧪 Валидация\n\n- Стратифицированный сплит 80/20 по таргету\n- Оценка модели с помощью `WMAE` по raw и округлённым предсказаниям\n- Сохранялись лучшие веса по обеим метрикам\n\n---\n\n## 🧬 Ансамбль\n\nФинальный сабмит — **усреднение трёх моделей**:\n- Модель, обученная локально\n- Модель, обученная на Kaggle\n- Модель с другими параметрами (`hidden_size`, `learning_rate`, `num_layers`)\n\nЭтот подход помог уменьшить переобучение и повысить стабильность.\n\n---\n\n## 📤 Предсказания и сабмит\n\n- Предсказания были **округлены до диапазона [0, 6]**\n- Сохранены в формате `submission.csv`\n\n```python\npred_df[\"target\"] = np.clip(np.round(pred_df[\"prediction\"]), 0, 6).astype(int)\n```\n\n---\n\n## 📌 Результаты\n\n📈 **Public LB**: 3-е место  \n🏁 **Private LB**: 4-е место\n\n---\n\n## 🧷 Выводы\n\n- Временные ряды по клиентам отлично подходят под LSTM-архитектуру  \n- WMAE — эффективная метрика, отражающая целевую функцию\n- Даже простое усреднение моделей даёт ощутимую пользу\n\n📘 Ознакомиться с полным ноутбуком: [Alfa Summer Challenge - LSTM Solution](https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution)\n\n---\n\n🔥 Спасибо всем участникам и организаторам!  \nЕсли есть вопросы — пишите в комментарии, с радостью отвечу 🙌\n",
      "votes": 6
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "3248032": "# 🏆 3-е место на паблике / 4-е место на приватном лидерборде — Alpha Summer Challenge\n📘 Ознакомиться с полным ноутбуком: [Alfa Summer Challenge - LSTM Solution](https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution)\n\nВ этом соревновании требовалось предсказать **группу минимального баланса клиента** на следующий месяц.  \nЦелевая переменная — целое число от `0` (нулевой баланс) до `6` (высокий баланс), отражающее уровень минимального остатка клиента за месяц.\n\n---\n\n## 🧠 Общее описание решения\n\nФинальный сабмит был получен путём **усреднения предсказаний трёх моделей** на основе Bidirectional LSTM:\n- Модель, обученная **локально на MacBook**\n- Модель, обученная в **Kaggle Notebook**\n- Модель с **немного изменёнными гиперпараметрами**\n\nТакой простой ансамбль позволил занять:\n- 🥉 **3-е место на публичном лидерборде**\n- 🎖️ **4-е место на приватном лидерборде**\n\n---\n\n## 📊 Обработка данных и построение признаков\n\n### 1. Глобальные признаки клиента\nДля каждого клиента рассчитаны глобальные статистики:\n- Логарифмированные: `mean`, `std`, `max`, `sum` по `amount`\n- Количество уникальных `mcc_code` и `merchant_name`\n- Нормализованные timestamps первых и последних транзакций\n\n### 2. Агрегации по дням\nДля каждой пары `(client, date)`:\n- Считаются метрики: `sum`, `count`, `mean`, `std`, `min`, `max`\n- Количество уникальных MCC и мерчантов в этот день\n\n### 3. Top-N категорий\nДля `mcc_code` и `merchant_name` выделяются **топ-5 категорий** по количеству транзакций.  \nДля каждой позиции в топе рассчитываются:\n- Сумма операций\n- Количество\n- Доля от дневного объёма\n\n### 4. Сетка client × date\nСоздаётся полная сетка `client_num × date`, чтобы учесть все дни, даже без транзакций.  \nВсе признаки объединяются в один датафрейм.\n\n### 5. Временные признаки\nДобавлены:\n- День недели (`day_of_week`)\n- День года (`day_of_year`)\n- Номер недели (`week`)\n- Месяц (`month`)\n- Относительное положение во времени (`timestep_ratio`)\n\n### 6. Финальная обработка\n- Пропуски заполнены\n- Логарифмирование числовых агрегатов\n- Объединение с глобальными фичами клиента\n- Стандартизация числовых признаков с `StandardScaler`\n\n---\n\n## 🤖 Модель: Bidirectional LSTM\n\nКаждый клиент представлен как последовательность ежедневных признаков (длина ~93 дня).  \nЭта последовательность подаётся в модель:\n\n### Вход:\n- Числовые признаки (стандартизированы)\n- Эмбеддинги категориальных признаков (MCC, мерчант, дата и др.)\n\n### Архитектура:\n- Bidirectional LSTM (3 слоя, `hidden_size=1024`)\n- Mean-пулинг по последним 20 шагам\n- Полносвязный слой → одно предсказание\n\n### Функция потерь: Weighted MAE (WMAE)\n\nОшибки по классам с низким балансом штрафуются сильнее:\n\n```python\nclass_weights = {\n    0: 1.00, 1: 0.72, 2: 0.52, 3: 0.37,\n    4: 0.27, 5: 0.19, 6: 0.14, 7: 0.10\n}\n```\n\n---\n\n## 🧪 Валидация\n\n- Стратифицированный сплит 80/20 по таргету\n- Оценка модели с помощью `WMAE` по raw и округлённым предсказаниям\n- Сохранялись лучшие веса по обеим метрикам\n\n---\n\n## 🧬 Ансамбль\n\nФинальный сабмит — **усреднение трёх моделей**:\n- Модель, обученная локально\n- Модель, обученная на Kaggle\n- Модель с другими параметрами (`hidden_size`, `learning_rate`, `num_layers`)\n\nЭтот подход помог уменьшить переобучение и повысить стабильность.\n\n---\n\n## 📤 Предсказания и сабмит\n\n- Предсказания были **округлены до диапазона [0, 6]**\n- Сохранены в формате `submission.csv`\n\n```python\npred_df[\"target\"] = np.clip(np.round(pred_df[\"prediction\"]), 0, 6).astype(int)\n```\n\n---\n\n## 📌 Результаты\n\n📈 **Public LB**: 3-е место  \n🏁 **Private LB**: 4-е место\n\n---\n\n## 🧷 Выводы\n\n- Временные ряды по клиентам отлично подходят под LSTM-архитектуру  \n- WMAE — эффективная метрика, отражающая целевую функцию\n- Даже простое усреднение моделей даёт ощутимую пользу\n\n📘 Ознакомиться с полным ноутбуком: [Alfa Summer Challenge - LSTM Solution](https://www.kaggle.com/code/nslobodchuk/alfa-summer-challenge-lstm-solution)\n\n---\n\n🔥 Спасибо всем участникам и организаторам!  \nЕсли есть вопросы — пишите в комментарии, с радостью отвечу 🙌\n"
  }
}