Кто как решал задачу "предсказание CC3"?

15.07.2017, 23:37:22
Добрый вечер.
Коротко распишу решение:

0. Чистил данные, но не сильно, правил в основном колонки с давлением.

1. Сгенерировал набор простейших признаков из основных с помощью арифметических операций "+, -, *, /", а так же сделал комбинации из базовых столбцов. Так же считал среднее значение таргета по некоторым признакам. Все признаки строил вручную, делал только самые "логичные", без логарифмов и сложных нелинейностей, например, weight/height, пара (age, weight) или пара (age, ap_hi) и т.д. Итого получилось не более 70 признаков.

2. Признаки отбирал вручную: добавлял по одному, многие признаки немного ухудшали локальный (и одновременно публичный) скор, особенно признаки, связанные с подсчетом среднего таргета. Если данный признак значительно не улучшал CV скор, то его я выкидывал. В конце осталось около 40 признаков.

3. Кросс-валидация: Stratified 10Fold, отличная корреляция между локальным скором и паблик скором. Финальные сабмишены выбирал по наилучшему локальному результату.

4. Модели: LGBM, нейросеть (на Keras) и RGF.

LGBM (усреднял модели с несколькими разными сидами):
0.5371 CV / 0.5429 Public / 0.5306 Private.

Нейронка: 0.5378 CV / 0.5435 Public / 0.5310 Private.
RGF: 0.5382 CV / 0.5444 Public / 0.5319 Private.

Финальная модель - линейная комбинация LGBM, нейросети и RGF.
Итого: 0.5368 CV / 0.5427 Public / 0.53029 Private.
16.07.2017, 10:25:04
Yngvi X
Рим, поздравляю с прекрасным результатом! И спасибо за код, очень познавательное и элегантное решение. Вы выбирали способы дискретизации признаков исходя из CV, или из своего опыта? Мне, например, это в голову не пришло, ведь XGB и нейронные сети вполне хорошо работают с непрерывными данными. Возраст только дискретизировал, потому что там есть цикличность с периодом ровно 2 года.

Спасибо! Я выбирал дискретизацию по CV, некоторые пороги посмотрел, проверил на графиках адекватность. Идея была сделать модель более консервативной. Все модели полученные над такими признаками очень хорошо в итоге усреднились с моделями без дискретизации.
16.07.2017, 10:36:57
Никита Чуркин
…Так же считал среднее значение таргета по некоторым признакам…
А можно вот этот момент немного поподробнее? Первые две недели потратил на эксперементы с этой техникой, испробовал много разных способов, но так и не смог получить выгоду на паблике и решил что это переобучение (но нет, ликов старался не допускать).
16.07.2017, 11:12:46
Никита Чуркин
Добрый вечер.
Нейронка: 0.5378 CV / 0.5435 Public / 0.5310 Private.
У меня с нейросетью чего-то интересного не получилось. Результат был немного хуже деревьев, и в ансамбле улучшения не дал. Я пробовал 2-3-слойные, по 64-512 нейронов, с дропаутами и без, с relu, elu и т.д.
16.07.2017, 12:46:40
По поводу кодирования средним: все делал, как рассказывал Станислав Семенов в видео по конкурсу Кэггла от BNP Paribas (см. https://www.youtube.com/watch?v=g335THJxkto). Коэффициент альфа выбрал равным 1 и не пытался его менять. Некоторые признаки, посчитанные таким способом, действительно ухудшали качество локально, я их просто не включал в модель, все признаки проверял по одному.
Итого подобных признаков было штук 9.

По поводу нейронки: слои по 90 и 60 нейронов, дропаут 0.1, активация - LeakyRelu. Блендинг с LGBM хорошо улучшал результат локально и на ЛБ.
16.07.2017, 12:54:04
Меня нейронка сильно сбила с толку тем, что на ЛБ давала лучшие показатели, чем XGB, хотя на локальной CV была хуже. В результате потратил на них кучу времени и они вошли в финальный микс. Если бы не включил нейронки, то один XGB тянул минимум на 3 место по приватной борде. На ЛБ вообще лучше было не ориентироваться при выборе моделей.
16.07.2017, 14:07:56
Кодирование средним применяют для категориальных переменных с высокой кардинальностью,
см. "A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems" by Daniele Micci-Barreca. Например, номера домов или названия улиц. Здесь таких переменных не было. С этим кодированием желательно применять 2-х-уровневую кроссвалидацию. На одноуровневой она приводит к некоторому оверфиттингу.
Отредактировано 16.07.2017, 14:12:23
16.07.2017, 14:11:23
Никита Чуркин
По поводу нейронки: слои по 90 и 60 нейронов, дропаут 0.1, активация - LeakyRelu. Блендинг с LGBM хорошо улучшал результат локально и на ЛБ.
Возможно, я что-то недоглядел, потому что у меня улучшения с деревьями не было. Может быть дело в том, что я использовал всего 2 дополнительные фичи. А какой был оптимизатор и батч? Я пробовал SGD с разными параметрами и Adam, а батч от 32 до 1024 и остановился на 256.
16.07.2017, 14:22:58
Обошелся грубой силой - взял несколько подходов к чистке данных, добавил штук 10 ручных признаков, kmeans/усреднения, десятка 2 колонок, сделанных из текстового представления исходных данных (просто побил на символы). Разные комбинации этого добра пошли на вход в нейронки (3 слоя размерами сотни-десятки-десяток, остальное менялось от модели к модели), lgb, xgb, et, rf. Итого получилось 70 моделей первого уровня. Разные подмножества из этих 70 состакал через ridge (все вместе или после жадного отбора) и выбрал 1 с лучшим пабликом и 1 с лучшим cv из тех где паблик лучше 0.543.

Все кроме нейронок тюнилось гипероптом, выбор чем стакать - тоже гиперопт. Особенно приятно было на полпути изнать о bootstrapping-е в нем.
16.07.2017, 15:02:08
Рим Шаяхметов
Всем привет!

Локально лучшее и довольно простое решение я получил усреднением двух XGB моделей с очисткой и преобразованием признаков. Данное решение доступно по https://github.com/shayakhmetov/mlbootcampV, которое соответсвтует финальному 0.5305696 (что было бы тоже вторым местом). Решение на лидерборде было получено путём усреднения с весами различных XGB моделей с разными видами чистки и дополнительными признаками, однако это не сказалось на финальном месте.

Рим, хорошее решение, спасибо. Посмотрел код, у тебя там какая-то функция есть convert_probabilities, которая нигде не определена - можешь добавить?
Отредактировано 16.07.2017, 15:02:22


Зарегистрируйтесь или войдите, чтобы оставить сообщение.