Arhn - архитектура программирования

матрица путаницы с несколькими классами для расчета ошибки внутри класса

Я попробовал классификацию k-NN, используя игрушечные данные, и получил следующие прогнозы:

actual <- c(rep('A1',12), rep('A2',12), rep('A3',7), rep('A4',12), rep('B1',11), rep('B2',17), rep('C1',15))
prediction <- c('A1','A1','A1','A1','A1','A3','A4','A4','B1','B2','C1','C1',
                'A2','A2','A2','A2','A2','A3','A4','A4','A4','B1','B1','C1',
                'A1','A2','A3','A3','A3','A3','B2',
                'A1','A1','A2','A2','A2','A4','A4','A4','A4','A4','A4','B1',
                'A1','A2','A2','A4','B1','B1','B1','B2','B2','B2','B2',
                'A1','A3','B1','B1','B1','B1','B2','B2','B2','B2','B2','B2','B2','B2','B2','C1','C1',
                'A1','A1','A2','B2','B2','C1','C1','C1','C1','C1','C1','C1','C1','C1','C1')

Основное представление о прогнозах можно получить, используя table() как:

table(actual, prediction)
#       prediction
# actual A1 A2 A3 A4 B1 B2 C1
#     A1  5  0  1  2  1  1  2
#     A2  0  5  1  3  2  0  1
#     A3  1  1  4  0  0  1  0
#     A4  2  3  0  6  1  0  0
#     B1  1  2  0  1  3  4  0
#     B2  1  0  1  0  4  9  2
#     C1  2  1  0  0  0  2 10

Есть очень информативная функция caret::confusionMatrix().

caret::confusionMatrix(prediction, actual)
# Confusion Matrix and Statistics
# 
# Reference
# Prediction A1 A2 A3 A4 B1 B2 C1
# A1  5  0  1  2  1  1  2
# A2  0  5  1  3  2  0  1
# A3  1  1  4  0  0  1  0
# A4  2  3  0  6  1  0  0
# B1  1  2  0  1  3  4  0
# B2  1  0  1  0  4  9  2
# C1  2  1  0  0  0  2 10
# 
# Overall Statistics
# 
# Accuracy : 0.4884         
# 95% CI : (0.379, 0.5986)
# No Information Rate : 0.1977         
# P-Value [Acc > NIR] : 1.437e-09      
# 
# Kappa : 0.3975         
# Mcnemar's Test P-Value : NA             
# 
# Statistics by Class:
# 
#                      Class: A1 Class: A2 Class: A3 Class: A4 Class: B1 Class: B2 Class: C1
# Sensitivity            0.41667   0.41667   0.57143   0.50000   0.27273    0.5294    0.6667
# Specificity            0.90541   0.90541   0.96203   0.91892   0.89333    0.8841    0.9296
# Pos Pred Value         0.41667   0.41667   0.57143   0.50000   0.27273    0.5294    0.6667
# Neg Pred Value         0.90541   0.90541   0.96203   0.91892   0.89333    0.8841    0.9296
# Prevalence             0.13953   0.13953   0.08140   0.13953   0.12791    0.1977    0.1744
# Detection Rate         0.05814   0.05814   0.04651   0.06977   0.03488    0.1047    0.1163
# Detection Prevalence   0.13953   0.13953   0.08140   0.13953   0.12791    0.1977    0.1744
# Balanced Accuracy      0.66104   0.66104   0.76673   0.70946   0.58303    0.7067    0.7981

Я заметил, что многие подклассы принадлежат другому классу. Например, A1, A2, A3, A4 относятся к классу A. Точно так же B1, B2 относятся к классу B. Я хотел бы рассчитать статистику после обработки всех подклассов внутри класса как равных. Доступна ли какая-либо функция для создания подобной статистики, как указано выше, для внутриклассовых и внеклассовых ошибок?

Примечание: не предлагайте решения, содержащие удаление номеров из подклассов, так как реальное приложение не похоже на это. Для простоты я привел этот пример.

Можно ли получить решение, если заданы отношения класса и подкласса?


Ответы:


1

Как насчет определения классов вручную, удалив суффикс подкласса:

    actual <- c(rep('A1',12), rep('A2',12), rep('A3',7), rep('A4',12), rep('B1',11), rep('B2',17), rep('C1',15))
    prediction <- c('A1','A1','A1','A1','A1','A3','A4','A4','B1','B2','C1','C1',
                    'A2','A2','A2','A2','A2','A3','A4','A4','A4','B1','B1','C1',
                    'A1','A2','A3','A3','A3','A3','B2',
                    'A1','A1','A2','A2','A2','A4','A4','A4','A4','A4','A4','B1',
                    'A1','A2','A2','A4','B1','B1','B1','B2','B2','B2','B2',
                    'A1','A3','B1','B1','B1','B1','B2','B2','B2','B2','B2','B2','B2','B2','B2','C1','C1',
                    'A1','A1','A2','B2','B2','C1','C1','C1','C1','C1','C1','C1','C1','C1','C1')
    actual = gsub("\\d", "", actual)
    prediction = gsub("\\d", "", prediction)
    caret::confusionMatrix(prediction, actual)

#output
Confusion Matrix and Statistics

          Reference
Prediction  A  B  C
         A 34  6  3
         B  6 20  2
         C  3  2 10

Overall Statistics

               Accuracy : 0.7442          
                 95% CI : (0.6387, 0.8322)
    No Information Rate : 0.5             
    P-Value [Acc > NIR] : 3.272e-06       

                  Kappa : 0.5831          
 Mcnemar's Test P-Value : 1               

Statistics by Class:

                     Class: A Class: B Class: C
Sensitivity            0.7907   0.7143   0.6667
Specificity            0.7907   0.8621   0.9296
Pos Pred Value         0.7907   0.7143   0.6667
Neg Pred Value         0.7907   0.8621   0.9296
Prevalence             0.5000   0.3256   0.1744
Detection Rate         0.3953   0.2326   0.1163
Detection Prevalence   0.5000   0.3256   0.1744
Balanced Accuracy      0.7907   0.7882   0.7981
21.09.2017
  • Спасибо за ответ. Извините, я забыл упомянуть, чтобы не использовать этот подход, так как реальные данные не похожи на это. Невозможно удалить данные по шаблону, как вы предложили. 21.09.2017
  • Еще можно определить if (class %in% c(subclass1, subclass2, subclass3)) "A" else {if (class %in% c(subclass4, subclass4, subclass5)) "B"... 21.09.2017
  • Но все же нельзя ли посчитать внутриклассовую статистику ошибок? 21.09.2017
  • Как бы вы сказали каретке или любой модели обучения с учителем, что что-то является подклассом определенного класса, если бы не предоставили вектор классов той же длины, что и вектор подклассов? С другой стороны, я бы снова запустил kNN с классами, а не с подклассами, и выбрал бы оптимальное значение k. Есть изменение: ошибка прогноза будет ниже, чем если бы вы выбрали текущую дорогу. 21.09.2017
  • Да, я не хочу полностью перекодировать переменные. Мне нужно рассчитать внутриклассовые и внеклассовые ошибки. Просто перекодировав, я бы не получил статистику, подобную приведенной выше? 21.09.2017
  • Как бы вы определили внутриклассовые ошибки? Если, скажем, у вас есть класс A с подклассами A1, A2 и A3 в фактическом векторе, а в векторе предсказания у вас есть смесь A1, A2, A3, B2 и C1, некоторые A1 прогнозируются как A1, некоторые A3 и некоторые B2 и т. д. Единственный способ, который я вижу, - это сделать 1 против всех для всех подклассов, чтобы вычислить ошибки внутри класса. 21.09.2017
  • Давайте продолжим обсуждение в чате. 21.09.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..