Измерение частоты ошибок между списками рангов - PullRequest
2 голосов
/ 03 декабря 2010

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

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

                ALGO    TRUTH
CATEGORY A:     0.35     0.50
CATEGORY B:     0.30     0.30
CATEGORY C:     0.25     0.15
CATEGORY D:     0.10     0.05

Веса всегда будут составлять ровно 1,0, длявсе выбранные узлы категории (из которых в классификационной таксономии около 200).

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

                ALGO    TRUTH
CATEGORY A:     0.40     0.10
CATEGORY B:     0.35     0.15
CATEGORY C:     0.15     0.35
CATEGORY D:     0.10     0.40

Таким образом, результат, подобный этому, должен получить очень низкую оценку.

Один последний пример демонстрирует распространенный случай, когда созданная человеком основополагающая истина содержит двойные значения веса:

                ALGO    TRUTH
CATEGORY A:     0.40     0.50
CATEGORY B:     0.35     0.50
CATEGORY C:     0.15     0.00
CATEGORY D:     0.10     0.00

Итакважно, чтобы алгоритм допускал списки без идеального упорядочения рангов (например,только основную истину можно правильно истолковать как ABCD, ABDC, BACD или BADC)

Материал, который я пробовал до сих пор:

  • Коренное среднее значение в квадратеОшибка (RMSE) : очень проблематично.Это не относится к соглашению о порядке рангов, что означает, что грубые разногласия между категориями в верхней части списка подпадают под соглашение по категориям в нижней части списка.

  • Ранговая корреляция Спирмена : Несмотря на то, что он учитывает различия в ранге, он придает одинаковый вес ранговым соглашениям вверху списка и тем, которые находятся внизу списка.Меня не особо волнуют расхождения на низком уровне, если расхождения на высоком уровне способствуют метрике ошибки.Он также не обрабатывает случаи, когда несколько категорий могут иметь ранговые значения.

  • Коэффициент корреляции ранга Кендалла Тау : имеет те же основные свойства и ограничения, что и у СпирменаКорреляция рангов, насколько я могу судить.

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

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Хорошо, я решил внедрить взвешенную RMSE. напрямую не учитывает отношения упорядочения рангов, но система взвешивания автоматически выделяет эти записи в верхней части списка.

Только для обзора (для тех, кто не знаком с RMSE), уравнение выглядит следующим образом, предполагая два разных классификатора A и B, результаты которых содержатся в массиве с одинаковым именем:

Среднеквадратичное уравнение http://benjismith.net/images/rmse.png

В Java реализация выглядит следующим образом:

double[] A = getAFromSomewhere();
double[] B = getBFromSomewhere();

// Assumes that A and B have the same length. If not, your classifier is broken.
int count = A.length;

double sumSquaredError = 0;
for (int i = 0; i < count; i++) {
   double aElement = A[i];
   double bElement = B[i];
   double error = aElement - bElement;
   double squaredError = error * error;
   sumSquaredError += squaredError;
}
double meanSquaredError = sumSquaredError / count;
double rootMeanSquaredError = Math.sqrt(meanSquaredError);

Это отправная точка для моей модифицированной реализации. Мне нужно было придумать систему взвешивания, которая учитывает объединенную величину двух значений (из обоих классификаторов). Поэтому я умножу каждое значение квадрата ошибки на SQRT(Ai^2 + Bi^2), которое является простой евклидовой функцией расстояния.

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

Я называю новую метрику "RMWSE", так как это среднее значение Взвешенное Квадратная ошибка. Вот как выглядит новое уравнение:

Уравнение RMWSE http://benjismith.net/images/rmwse.png

А вот как это выглядит в Java:

double[] A = getAFromSomewhere();
double[] B = getBFromSomewhere();

// Assumes that A and B have the same length. If not, your classifier is broken.
int count = A.length;

double sumWeightedSquaredError = 0;
double sumWeights = 0;
for (int i = 0; i < count; i++) {
   double aElement = A[i];
   double bElement = B[i];
   double error = aElement - bElement;
   double squaredError = error * error;
   double weight = Math.sqrt((aElement * aElement) + (bElement * bElement));
   double weightedSquaredError = weight * squaredError;
   sumWeightedSquaredError += weightedSquaredError;
   sumWeights += weight;
}
double meanWeightedSquaredError = sumWeightedSquaredError / sumWeights;
double rootMeanWeightedSquaredError = Math.sqrt(meanWeightedSquaredError);

Чтобы дать вам представление о том, как этот вес работает на практике, скажем, два моих классификатора выдают значения 0.95 и 0.85 для некоторой категории. Ошибка между этими двумя значениями составляет 0.10, но вес равен 1.2748 (к которому я пришел, используя SQRT(0.95^2 + 0.85^2)). Взвешенная ошибка 0.12748.

Аналогичным образом, если классификаторы выдают 0.45 и 0.35 для какой-либо другой категории, ошибка по-прежнему составляет всего 0.10, но вес составляет только 0.5701, и поэтому взвешенная ошибка составляет всего 0.05701.

Таким образом, любая категория с высокими значениями из обоих классификаторов будет иметь больший вес, чем категории с высоким значением только из одного классификатора или категории с низкими значениями из обоих классификаторов.

Это работает лучше всего, когда мои значения классификации перенормированы, так что максимальные значения в A и B равны 1,0, а все остальные значения пропорционально увеличены. Следовательно, измерения больше не составляют до 1,0 для любого данного классификатора, но это не имеет никакого значения, поскольку я не использовал это свойство для чего-либо полезного.

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

1 голос
/ 03 декабря 2010

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

Например, рассчитать Спирмена только для верхних k категорий. Я думаю, что вы должны получить совершенно законные ответы.

Вы также можете выполнить z-преобразование и т. Д., Чтобы отобразить все в [0,1], сохранив то, что вы считаете "важными" частями вашего набора данных (дисперсия, разница и т. Д.). Затем вы можете воспользоваться из большого числа доступных функций проверки гипотез.

(Примечание: вы можете изменить Spearman's для учета связей. См. Wikipedia .)

...