Практические советы по реализации систем извлечения информации

пятница, октября 13, 2006

Обучение классификатора на некачественных данных

В идеальном мире все наши данные точные и полные, в них нет ошибок, пользователи счастливы, а специалисты по data quality торгуют пирожками. Как вы уже догадались, мы живем далеко не в идеальном мире и у наших данных большие проблемы с качеством. Эти проблемы встают особенно остро, когда мы хотим использовать эти данные для обучения систем наподобие классификаторов Байеса. Ведь все очень просто, правильные знания, скорее всего, дадут правильный результат, неправильные — совершенно непредсказуемый.

Напомню нашу задачу. Необходимо классифицировать некие сущности (например, книги или вообще любые товары) по дереву категорий. Для обучения у нас есть некоторый входной массив данных. Нас подстерегают две проблемы с качеством:
  1. Неточная или неправильная классификация сущностей по категориям.
  2. Само дерево категорий может недостаточно точно и/или избыточно отражать реальный мир.
Вторая задача достаточно сложная и достойна отдельного исследования, первую же можно решить достаточно просто и эффективно.

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

Если же у нас не очень много данных (или очень много свободного времени), их можно вообще классифицировать вручную. Не очень много это, действительно, не очень много, у меня не получалось заставить себя обработать больше двух тысяч записей. Соответственно, для больших массивов нам нужно попытаться сделать некоторую выборку таким образом, чтобы в нее попало как можно большее число плохих записей. Использовать в качестве критерия "нехорошести" итоговую вероятность не получится, как большие, так и маленькие ее значения в данном случае очень мало говорят о качестве результата классификации. Гораздо лучшей выборкой оказываются те записи, для которых полученная категория отличается от исходной. На практике, размер такой выборки может быть от 1 до 10 процентов от общего числа обучающих записей. Что же она поможет нам узнать:
  1. Если классификатор сработал правильно, можно предположить, что большая часть подобных записей уже лежит в правильной категории. Для слов из этой записи можно немного повысить вес, пометить ее как "подтвержденную".
  2. Если же классификатор выдал неправильный результат, как правило, это означает обратное: значительной части похожих записей присвоена неправильная категория. Чтобы как можно быстрее вытащить их на белый свет, стоит повысить вес для слов гораздо сильнее, чем в предыдущем случае. На практике, хороший результат достигался умножением на 25.
Результаты такой обработки загружаются в базу знаний, меняются категории у записей, помечается как нужно повысить вес и повторно запускается классификатор. Далее мы делаем точно такую же выборку, которая может быть чуть больше предыдущей, и повторям процесс обработки. Чтобы добиться хороших результатов, обычно достаточно 4-5 таких циклов.

Если данных совсем много, можно применить несколько приемов, которые помогут ускорить процесс обработки:
  1. Выборку можно разделить на две части. Первая, где произошло уточнение категории, то есть мы спустились ниже по дереву. Эта часть обрабатывается гораздо быстрее, так как проще принять решение о правильности результата. Вторая — все остальное. Обработать ее будет тоже чуть проще, потому что она станет значительно меньше.
  2. Можно отдельно стрелять классификатором по подозрительным категориям. Это, в первую очередь, категории, в которые записи были ошибочно отнесены. Так мы сможем достаточно быстро выявить большие некачественные регионы в обучающем массиве.

7 комментариев:

lataupe комментирует...

Я думаю, что тебе интересно было бы посмотреть в сторону нейронных сетей вообще и в сторону самоорганизующихся карт Кохонена, в частности. А в той книжке, которая так и зависла где-то на амазоне, ты найдешь целый кладезь знаний по этой теме, да.

krondix комментирует...

Нейронные сети совсем уж неконтролируемы и непредсказуемы, это не так неинтересно.

lataupe комментирует...

Это очень вредный миф, что нейросеть есть некий черный ящик, куда данные запихнул а результат непредсказуем. На самом деле, вся математика строгая, большинство оценок известно. Ну да дело твое :) Мое дело предложить...

krondix комментирует...

Проблема в другом.
Нельзя понять почему нейросеть сработала так, а не иначе. Вернее, можно, конечно, вот они веса — смотри, наслаждайся. Но к реальности это никакого отношения не имеет.

Собственно, точно такая же проблема и у Байеса. Об этом я в понедельник напишу.

Unknown комментирует...

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

Гм. А на практике как Вы себе это представляете? Мне, например, сложно предстваить как это можно воплотить в реальность (кластеризация - отдельная тема).

krondix комментирует...

На практике, чаще всего бывает ситуация, когда продолжительное время данные жили с ручной или полуавтоматической классификацией. Если классификация была ручной и очень тщательной, то все совсем хорошо. Если ручной и беглой или полуавтоматической каким-нибудь простым методом, то нам может помочь:
1. Подготовить репрезентативную выборку по каждой категории и проверить ее руками. С репрезентативностью сложно, проверить руками долго.
2. Может существовать какой-нибудь другой процесс обработки этих данных, который подтверждает/опровергает результат классификации.

Анонимный комментирует...

интересный алгоритм, спасибо за идейку. Намедни его реализовал, теперь тестирую :)