Я попробовал классификацию 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
. Я хотел бы рассчитать статистику после обработки всех подклассов внутри класса как равных. Доступна ли какая-либо функция для создания подобной статистики, как указано выше, для внутриклассовых и внеклассовых ошибок?
Примечание: не предлагайте решения, содержащие удаление номеров из подклассов, так как реальное приложение не похоже на это. Для простоты я привел этот пример.
Можно ли получить решение, если заданы отношения класса и подкласса?
if (class %in% c(subclass1, subclass2, subclass3)) "A" else {if (class %in% c(subclass4, subclass4, subclass5)) "B"...
21.09.2017