2017-09-21 10 views
0

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, A4A 클래스에 속합니다. 마찬가지로 B1, B2B 클래스에 속합니다. 클래스 내의 모든 서브 클래스를 동등하게 취급 한 후에 통계를 계산하고 싶습니다. Class 및 Out-Class 오류 내에서 비슷한 통계를 생성 할 수있는 함수가 있습니까?

참고 : 실제 응용 프로그램은 이와 유사하지 않으므로 하위 클래스에서 숫자를 제거한 솔루션을 제안하지 마십시오. 단순화 목적으로이 예제를 제공했습니다.

클래스와 하위 클래스 관계가 주어지면 해결책을 얻을 수 있습니까?

답변

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 
+0

감사를 대답. 죄송합니다. 실제 데이터가 이와 유사하지 않으므로이 접근 방식을 사용하지 않도록 언급하는 것을 잊었습니다. 제안한 패턴의 데이터를 제거 할 수 없습니다. – Prradep

+0

"if (class % in % c (subclass4, subclass4, subclass5))" – missuse

+0

그러나 "if (class % in % c (subclass1, subclass2, subclass3) 여전히 클래스 내 오류 통계를 계산할 수는 없습니까? – Prradep