Как справиться с проблемой двоичной классификации, когда экземпляры в отрицательном классе очень похожи? [дубликат]
Допустим, кто-то хочет определить, есть ли на картинке фиксированного размера кота. Но в качестве набора данных у вас есть 10000 изображений кошек и 30000 изображений, которые не содержат кошек, но очень похожи друг на друга. Например, предположим, что 30000 изображений в классе «не кошка» содержат только изображения одного или двух видов пауков.
При обучении CNN вы обнаружите, что получаете высокий балл на тестовом наборе (здесь высокий балл = почти полностью диагональная матрица путаницы), но когда вы хотите использовать CNN в реальном мире, вы обнаружите, что почти все классифицируется как кошка.
Почему в этом случае сеть плохо обобщается? Даже если набор данных не представляет собой тип данных, CNN увидит в реальном мире, разве CNN не будет легко сказать: «Я видел 10000 примеров кошек, поэтому все, что не похоже на кошка не кошка »?
Как можно решить эту проблему (помимо сбора дополнительных данных)?
Ответы
CNN в этом случае узнает не о том, что такое кошка, а скорее о том, что отличает изображение с кошкой от изображения без кошки.
Если все ваши изображения «без кошек» содержат паука (ов), CNN также может сойтись, только обнаружив паука (ов): изображения с пауком (ами) принадлежат «не-кошке», а другие - «кошке» . Это объясняет, почему у вас такая хорошая матрица путаницы с данными тестирования и такая низкая производительность в реальном мире.
У вас есть несколько способов избежать такой ситуации:
- добавьте другие изображения в ярлык "без кошек", как вы сказали (например, используя общедоступные наборы данных)
- попробуйте подходы одноклассной классификации . Если вы знакомы с нейронными сетями, вы могли бы покопаться в ошибке реконструкции автоэнкодеров (см. Этот пост: Как использовать набор данных только с одной категорией данных или это руководство по sklearn )
Надеюсь, это поможет