Обучение классификатора на некачественных данных
В идеальном мире все наши данные точные и полные, в них нет ошибок, пользователи счастливы, а специалисты по data quality торгуют пирожками. Как вы уже догадались, мы живем далеко не в идеальном мире и у наших данных большие проблемы с качеством. Эти проблемы встают особенно остро, когда мы хотим использовать эти данные для обучения систем наподобие классификаторов Байеса. Ведь все очень просто, правильные знания, скорее всего, дадут правильный результат, неправильные — совершенно непредсказуемый.
Напомню нашу задачу. Необходимо классифицировать некие сущности (например, книги или вообще любые товары) по дереву категорий. Для обучения у нас есть некоторый входной массив данных. Нас подстерегают две проблемы с качеством:
Первое, что необходимо сделать (если это возможно, конечно), это попытаться выделить каким-либо образом среди всего обучающего массива записи, которые отклассифицированы правильно. Как правило, для этого используются какие-либо внешние источники данных или результаты обработки массива другой системой. Все, конечно, сильно зависит от конкретного случая. После выделения таких записей, словам из них можно дать больший вес, например, умножить их частоту встречаемости на 2.
Если же у нас не очень много данных (или очень много свободного времени), их можно вообще классифицировать вручную. Не очень много это, действительно, не очень много, у меня не получалось заставить себя обработать больше двух тысяч записей. Соответственно, для больших массивов нам нужно попытаться сделать некоторую выборку таким образом, чтобы в нее попало как можно большее число плохих записей. Использовать в качестве критерия "нехорошести" итоговую вероятность не получится, как большие, так и маленькие ее значения в данном случае очень мало говорят о качестве результата классификации. Гораздо лучшей выборкой оказываются те записи, для которых полученная категория отличается от исходной. На практике, размер такой выборки может быть от 1 до 10 процентов от общего числа обучающих записей. Что же она поможет нам узнать:
Напомню нашу задачу. Необходимо классифицировать некие сущности (например, книги или вообще любые товары) по дереву категорий. Для обучения у нас есть некоторый входной массив данных. Нас подстерегают две проблемы с качеством:
- Неточная или неправильная классификация сущностей по категориям.
- Само дерево категорий может недостаточно точно и/или избыточно отражать реальный мир.
Первое, что необходимо сделать (если это возможно, конечно), это попытаться выделить каким-либо образом среди всего обучающего массива записи, которые отклассифицированы правильно. Как правило, для этого используются какие-либо внешние источники данных или результаты обработки массива другой системой. Все, конечно, сильно зависит от конкретного случая. После выделения таких записей, словам из них можно дать больший вес, например, умножить их частоту встречаемости на 2.
Если же у нас не очень много данных (или очень много свободного времени), их можно вообще классифицировать вручную. Не очень много это, действительно, не очень много, у меня не получалось заставить себя обработать больше двух тысяч записей. Соответственно, для больших массивов нам нужно попытаться сделать некоторую выборку таким образом, чтобы в нее попало как можно большее число плохих записей. Использовать в качестве критерия "нехорошести" итоговую вероятность не получится, как большие, так и маленькие ее значения в данном случае очень мало говорят о качестве результата классификации. Гораздо лучшей выборкой оказываются те записи, для которых полученная категория отличается от исходной. На практике, размер такой выборки может быть от 1 до 10 процентов от общего числа обучающих записей. Что же она поможет нам узнать:
- Если классификатор сработал правильно, можно предположить, что большая часть подобных записей уже лежит в правильной категории. Для слов из этой записи можно немного повысить вес, пометить ее как "подтвержденную".
- Если же классификатор выдал неправильный результат, как правило, это означает обратное: значительной части похожих записей присвоена неправильная категория. Чтобы как можно быстрее вытащить их на белый свет, стоит повысить вес для слов гораздо сильнее, чем в предыдущем случае. На практике, хороший результат достигался умножением на 25.
Если данных совсем много, можно применить несколько приемов, которые помогут ускорить процесс обработки:
- Выборку можно разделить на две части. Первая, где произошло уточнение категории, то есть мы спустились ниже по дереву. Эта часть обрабатывается гораздо быстрее, так как проще принять решение о правильности результата. Вторая — все остальное. Обработать ее будет тоже чуть проще, потому что она станет значительно меньше.
- Можно отдельно стрелять классификатором по подозрительным категориям. Это, в первую очередь, категории, в которые записи были ошибочно отнесены. Так мы сможем достаточно быстро выявить большие некачественные регионы в обучающем массиве.
7 комментариев:
Я думаю, что тебе интересно было бы посмотреть в сторону нейронных сетей вообще и в сторону самоорганизующихся карт Кохонена, в частности. А в той книжке, которая так и зависла где-то на амазоне, ты найдешь целый кладезь знаний по этой теме, да.
Нейронные сети совсем уж неконтролируемы и непредсказуемы, это не так неинтересно.
Это очень вредный миф, что нейросеть есть некий черный ящик, куда данные запихнул а результат непредсказуем. На самом деле, вся математика строгая, большинство оценок известно. Ну да дело твое :) Мое дело предложить...
Проблема в другом.
Нельзя понять почему нейросеть сработала так, а не иначе. Вернее, можно, конечно, вот они веса — смотри, наслаждайся. Но к реальности это никакого отношения не имеет.
Собственно, точно такая же проблема и у Байеса. Об этом я в понедельник напишу.
"Первое, что необходимо сделать (если это возможно, конечно), это попытаться выделить каким-либо образом среди всего обучающего массива записи, которые отклассифицированы правильно. Как правило, для этого используются какие-либо внешние источники данных или результаты обработки массива другой системой."
Гм. А на практике как Вы себе это представляете? Мне, например, сложно предстваить как это можно воплотить в реальность (кластеризация - отдельная тема).
На практике, чаще всего бывает ситуация, когда продолжительное время данные жили с ручной или полуавтоматической классификацией. Если классификация была ручной и очень тщательной, то все совсем хорошо. Если ручной и беглой или полуавтоматической каким-нибудь простым методом, то нам может помочь:
1. Подготовить репрезентативную выборку по каждой категории и проверить ее руками. С репрезентативностью сложно, проверить руками долго.
2. Может существовать какой-нибудь другой процесс обработки этих данных, который подтверждает/опровергает результат классификации.
интересный алгоритм, спасибо за идейку. Намедни его реализовал, теперь тестирую :)
Отправить комментарий