Wprowadzenie

Klasyfikacja według algorytmu 1R polega na wyborze jednej cechy (reguły), która najlepiej dzieli zbiór danych na klasy. Algorytm 1R sprawdza wszystkie możliwe wartości każdej cechy i oblicza liczbę błędów klasyfikacji dla każdej z nich. Następnie wybiera tę cechę i tę wartość, która minimalizuje liczbę błędów. Algorytm 1R jest prosty i szybki, ale nie zawsze daje dokładne wyniki.

library(OneR)
library(dplyr)
load("C:/Users/mbuko/OneDrive/Dokumenty/credit.RData")

Przygotowanie danych

Cześć zmiennych jakościowych występujących w zborze danych credit kodowana jest w postaci liczb. W związku z tym traktowane są przez R jako zmienne ilościowe. Do zmiennych tych należą - rata_%dochodu, zamieszkanie, l_kredytow, l_osob. W ramach przygotowania danych zmienne te zamieniono na zmienne czynnikowe z wykorzystaniem funkcji as.factor. W dalszej kolejności zbiór danych podzielono na zbiór uczący i zbiór testowy w proporcji 75% - 25%.

credit$`rata_%doch`<-as.factor(credit$`rata_%doch`)
credit$zamieszkanie<-as.factor(credit$zamieszkanie)
credit$l_kredytow<-as.factor(credit$l_kredytow)
credit$l_osob<-as.factor(credit$l_osob)

set.seed(121) # for reproducibility


random <- sample(1:nrow(credit), 0.75 * nrow(credit))

Podstawą klasyfikacji z wykorzystaniem klasyfikatora One R są zmienne jakościowe - zmienne ilościowe muszą zosatać dyskretyzowane.

data_train<-bin(credit[random, ], 3)
table(data_train$jakosc)
## 
## dobry   zly 
##   534   216
table(data_train$konto_czekowe, data_train$jakosc)
##        
##         dobry zly
##   < 0     107 106
##   >200     39   9
##   0-200   127  73
##   brak    261  28

Budowa klasyfikatora

Klasyfikacja na podstawie klasyfikatora OneR polega na przypasaniu atrybutu decyzyjnego na podstawie 1 cechy (predyktora), dla którego jakość klasyfikacji jest najlepsza. Poniżej przedstawiono dokładność klasyfikacji przeprowadzonej na podstawie wszystkich predyktorów.

model_train <- OneR(data_train, verbose = TRUE)
## 
##     Attribute      Accuracy
## 1 * historia       73.47%  
## 2   kwota          72%     
## 3   czas           71.47%  
## 4   konto_czekowe  71.2%   
## 4   cel            71.2%   
## 4   oszczednosci   71.2%   
## 4   staz_pracy     71.2%   
## 4   rata_%doch     71.2%   
## 4   plec           71.2%   
## 4   poreczyciel    71.2%   
## 4   zamieszkanie   71.2%   
## 4   zabezpieczenie 71.2%   
## 4   wiek           71.2%   
## 4   inne_zobow     71.2%   
## 4   rodzaj_miesz   71.2%   
## 4   l_kredytow     71.2%   
## 4   kwalifikacje   71.2%   
## 4   l_osob         71.2%   
## 4   telefon        71.2%   
## 4   obcokrajowiec  71.2%   
## ---
## Chosen attribute due to accuracy
## and ties method (if applicable): '*'
summary(model_train)
## 
## Call:
## OneR.data.frame(x = data_train, verbose = TRUE)
## 
## Rules:
## If historia = brak           then jakosc = zly
## If historia = istniejace_spł then jakosc = dobry
## If historia = krytyczne      then jakosc = dobry
## If historia = opoznienia     then jakosc = dobry
## If historia = wszystkie_spł  then jakosc = zly
## 
## Accuracy:
## 551 of 750 instances classified correctly (73.47%)
## 
## Contingency table:
##        historia
## jakosc  brak istniejace_spł krytyczne opoznienia wszystkie_spł Sum
##   dobry   12          * 266     * 197       * 49            10 534
##   zly   * 21            122        32         23          * 18 216
##   Sum     33            388       229         72            28 750
## ---
## Maximum in each column: '*'
## 
## Pearson's Chi-squared test:
## X-squared = 62.942, df = 4, p-value = 6.978e-13

Przeprowadzone obliczenia wskazują na to, że najlepszym predyktorem jest historia, która zapewnia dokładność klasyfikacji w zbiorze uczącym na poziomie 73.47%. Poniżej przestawiono wykres przedstawiajacy rozkład jakości kredytu w zalezności od historia.

plot(model_train)

Ocena jakości klasyfikacji na zbiorze testowym

Wyodrębnienie zbioru testowego możliwe jest na podstawie poniższego kodu:

data_test <- credit[-random, ]

Ocena jakości klasyfikacji może zostać przeprowadzona na podstawie macierzy macierzy błędnych klasyfikacji, która dla zmiennej Y z dwoma wariantami ma postać:

Faktyczny + Faktyczny -
Predykcja + TP FP
Predykcja - FN TN

Na podstawie macierzy możliwe jest obliczenie następujacych parametrów:

  • precyzja (precision):
\(precyzja = \frac{TP}{TP + FP}\),
  • czułość (recall):
\(czulosc = \frac{TP}{TP + FN}\),
  • specyficzność (specificity):
\(specyficznosc = \frac{TN}{TN + FP}\),
  • F miara (średnia harmoniczna z precyzji i czułości):
\(F = \frac{2}{\frac{1}{precyzja}+\frac{1}{czulosc}}\).
prediction <- predict(model_train, data_test)

eval_model(prediction, data_test)
## 
## Confusion matrix (absolute):
##           Actual
## Prediction dobry zly Sum
##      dobry   152  70 222
##      zly      14  14  28
##      Sum     166  84 250
## 
## Confusion matrix (relative):
##           Actual
## Prediction dobry  zly  Sum
##      dobry  0.61 0.28 0.89
##      zly    0.06 0.06 0.11
##      Sum    0.66 0.34 1.00
## 
## Accuracy:
## 0.664 (166/250)
## 
## Error rate:
## 0.336 (84/250)
## 
## Error rate reduction (vs. base rate):
## 0 (p-value = 0.5296)

Obliczony procent błędnych klasyfikacji może być porównany z procentem złych klas przy przyjęciu założenia, że wszystkie nowe obiekty posiadają klasę częściej występującą w zbiorze testowym:

table(data_test$jakosc)
## 
## dobry   zly 
##   166    84
sum(data_test$jakosc == "zly")/nrow(data_test)
## [1] 0.336