Объясните про кросс валидацию?

Ранее для обучения нейросетей я использовал просто метод train/test split. Обучал модель на трейне и проверял качество на тесте. Теперь я освоил как делать кросс валидацию. Получил 5 фолдов, посчитал ошибки обучения в каждом фолде, получил среднюю ошибку по всем фолдам. Все понятно. Я прочитал документацию и инфу на форумах, но понял, что кросс валидация нужна для сравнения перфоманса разных моделей. Т.е. если бы я сделал xgboost и нейросеть, то можно было бы корректно сравнить какой метод лучше. Но, что если я просто обучаю одну модель - нейросеть с помощью кросс валидации. Значит ли это, что каждый фолд - отдельная модель нейросети, обученная на разных наборах данных соответственно? И по итогу, я должен выбрать лучшую модель, которая показала на своем фолде минимальную ошибку. Если это так, то как сохранить эту модель по конкретному фолду, чтобы использовать для предикта с реальными наблюдениями? Если нет, то выходит, что я просто обучаю на 5 фолдах после всех итераций и предсказываю результат через model.predict? Т.е. усредненный прогноз по 5 фолдам уже учитывается в модели? Спасибо заранее за помощь. Я новичок.


Ответы (1 шт):

Автор решения: CrazyElf

Вы путаете сразу несколько вещей между собой, что не удивительно в общем, поначалу это нормально.

Кросс-валидация обычно всё-таки применяется с одной моделью. Чтобы получить как бы больше тестовых оценок на том же количестве данных по сравнению с использованием отложенных данных для теста. И таким образом лучше определить производительность модели. Можно прогнать кросс-валидацию для разных моделей или для одной модели с разными параметрами и выбрать таким образом лучшую модель или лучшие параметры.

Выбирать модель под конкретный фолд смысла нет - вы не знаете, на что будут похожи реальные данные, по которым вам потом нужно будет предсказывать моделью, на этот фолд или на другой. Вы можете только сказать, что при обучении на вот этих данных и проверке на вот тех данных скор хороший, но это вам ничего не скажет о качестве предсказаний модели на новых данных. Модель в идеале должна хорошо предсказывать любые данные, поэтому и смотрят как модель себя ведёт в целом на всех данных при кросс-валидации. Один фолд сам по себе ничего не значит.

А далее, есть ещё такая штука как стекинг, и вот там тоже используется метод разбиения по фолдам. Учим модель на трейне - предсказываем тест. И так несколькими разными моделями. И по всем фолдам. Полученные предсказания объединяем в одну матрицу. И потом уже на этой матрице предсказаний учим ещё одну модель (обычно простую уже совсем - линейную регрессию). И вот эта модель второго уровня как бы сама уже выбирает, как лучше объединить предсказания разных моделей. Это чем-то похоже на кросс-валидацию, но не совсем.

→ Ссылка