Dopisujemy klasy wyłonione z analizy wątku
$type <- tematy_term[tematy][1:37]
eighty_days_text$type <- tematy_term[tematy][38:62] all_moon_text
Łączymy dokumenty
<- rbind(eighty_days_text, all_moon_text) books_df
kable(table(books_df$type), format = "html", align = "c", caption = "Ilość klas") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Var1 | Freq |
---|---|
day | 38 |
moon | 24 |
Do budowy algorytmu wybrano Naiwny Klasyfikator Bayesa.
Zamiana typu zmiennych i stworzenie korpusu
$type <- factor(books_df$type)
books_df
<- Corpus(VectorSource(books_df$text)) books_corpus
Macierz DTM
<- DocumentTermMatrix(books_corpus, control = list(weighting = weightBin))
dtm_binary
<- data.frame(as.matrix(dtm_binary))
dtm_bin $type <- factor(tematy_term[tematy][1:62]) dtm_bin
Utworzenie treningowego i testowego zbioru NOWE
# Losowe wybranie zbioru treningowego
set.seed(123)
<- createDataPartition(dtm_bin$type, p = 0.75, list = FALSE)
train_indices
# Zbiór treningowy
<- dtm_bin[train_indices, ]
dtm_train_bin
# Zbiór testowy
<- dtm_bin[-train_indices, ] dtm_test_bin
Sprawdzenie rozkładu klas w zbiorach
kable(table(dtm_test_bin$type), format = "html", align = "c", caption = "Ilosciowo klasy w zbiorze testowym") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Var1 | Freq |
---|---|
day | 9 |
moon | 6 |
kable(prop.table(table(dtm_train_bin$type)), format = "html", align = "c", caption = "Proporcje klas w zbiorze treningowym") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Var1 | Freq |
---|---|
day | 0.6170213 |
moon | 0.3829787 |
kable(prop.table(table(dtm_test_bin$type)), format = "html", align = "c", caption = "Proporcje klas w zbiorze testowym") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Var1 | Freq |
---|---|
day | 0.6 |
moon | 0.4 |
Rozkład jest w porządku, można kontynuować.
Niezbędne przeksztalcenia
levels(dtm_test_bin$type) <- levels(dtm_train_bin$type)
Utworzenie i testowanie modelu
<- naiveBayes(type ~ ., data = dtm_train_bin)
classifier_bin <- predict(classifier_bin, newdata = dtm_test_bin) predictions_bin
Macierz DTM
<- DocumentTermMatrix(books_corpus, control = list(weighting = weightTf))
dtm_tf
<- log2(as.matrix(dtm_tf) + 1) #Przekształcenie macierzy tf na macierz z wagami logarytmicznymi
dtm_log
<- data.frame(dtm_log)
dtm_log $type <- factor(tematy_term[tematy][1:62]) dtm_log
Utworzenie treningowego i testowego zbioru
# Zbiór treningowy
<- dtm_log[train_indices, ]
dtm_train_log # Zbiór testowy
<- dtm_log[-train_indices, ] dtm_test_log
Niezbędne przeksztalcenia
levels(dtm_test_log$type) <- levels(dtm_train_log$type)
Utworzenie i testowanie modelu
<- naiveBayes(type ~ ., data = dtm_train_log)
classifier_log <- predict(classifier_log, newdata = dtm_test_log) predictions_log
Macierz DTM
<- DocumentTermMatrix(books_corpus, control = list(weighting = weightTfIdf))
dtm_tfidf
<- data.frame(as.matrix(dtm_tfidf))
dtm_tfidf $type <- tematy_term[tematy][1:62] dtm_tfidf
Utworzenie treningowego i testowego zbioru
# Zbiór treningowy
<- dtm_tfidf[train_indices, ]
dtm_train_tfidf # Zbiór testowy
<- dtm_tfidf[-train_indices, ] dtm_test_tfidf
Niezbędne przeksztalcenia
$type <- factor(dtm_tfidf$type)
dtm_tfidf
$type <- factor(dtm_test_tfidf$type, levels = levels(dtm_tfidf$type)) dtm_test_tfidf
Utworzenie i testowanie modelu
<- naiveBayes(type ~ ., data = dtm_tfidf)
classifier_tdidf <- predict(classifier_tdidf, newdata = dtm_test_tfidf) predictions_tfidf
<- confusionMatrix(predictions_bin, dtm_test_bin$type)
confusion_matrix_bin confusion_matrix_bin
## Confusion Matrix and Statistics
##
## Reference
## Prediction day moon
## day 9 6
## moon 0 0
##
## Accuracy : 0.6
## 95% CI : (0.3229, 0.8366)
## No Information Rate : 0.6
## P-Value [Acc > NIR] : 0.60981
##
## Kappa : 0
##
## Mcnemar's Test P-Value : 0.04123
##
## Sensitivity : 1.0
## Specificity : 0.0
## Pos Pred Value : 0.6
## Neg Pred Value : NaN
## Prevalence : 0.6
## Detection Rate : 0.6
## Detection Prevalence : 1.0
## Balanced Accuracy : 0.5
##
## 'Positive' Class : day
##
No Information Rate - 0.6 oznacza, że gdybyśmy klasyfikowali przypadki losowo, oczekiwalibyśmy dokładności 60%.
Wartość P-value - 0.61, co sugeruje, że dokładność modelu nie jest statystycznie istotnie lepsza od przewidzenia klasy dominującej.
W przypadku referencji (Reference) jako “day”, algorytm poprawnie sklasyfikował 9 przypadków jako “day” (True Positive). Nie występują błędne klasyfikacje jako “day” (False Negative).
W przypadku referencji jako “moon”, algorytm błędnie sklasyfikował 6 przypadków jako “day” (False Positive) i nie sklasyfikował poprawnie żadnego przyapdku jako “moon” (True Negative).
Accuracy: 0.6 co jest równoważne z przewidzeniem klasy dominującej (klasy o największej liczbie wystąpień) dla wszystkich przypadków.
Współczynnik Kappa wynosi 0.0, co oznacza, że model nie ma lepszej wydajności niż przewidzenie klasy dominującej.
Sensitivity: 1 oznacza, że algorytm poprawnie sklasyfikował 100% przypadków “day” spośród wszystkich przypadków rzeczywiście należących do klasy “day”.
Specificity: 0 oznacza, że algorytm poprawnie sklasyfikował 0% przypadków “moon” spośród wszystkich przypadków rzeczywiście należących do klasy “moon”.
Pos Pred Value: 0.6 co oznacza, że z przewidzianych przez model przypadków klasy “day” tylko 60% faktycznie należy do tej klasy.
Neg Pred Value: NA oznacza, że nie można obliczyć tej wartości ze względu na brak przypadków sklasyfikowanych jako “day”.
Prevalence: 0.6 oznacza, że klasa “day” stanowi 60% wszystkich przypadków.
Detection Rate: 0.6 oznacza, że algorytm wykrył 60% wszystkich przypadków.
Detection Prevalence: 1 oznacza, że 100% przypadków sklasyfikowanych przez algorytm należy do klasy “day”.
Balanced Accuracy: 0.5 oznacza, że model ma równą skuteczność w identyfikowaniu obu klas.
<- confusionMatrix(predictions_log, dtm_test_log$type)
confusion_matrix_log confusion_matrix_log
## Confusion Matrix and Statistics
##
## Reference
## Prediction day moon
## day 9 1
## moon 0 5
##
## Accuracy : 0.9333
## 95% CI : (0.6805, 0.9983)
## No Information Rate : 0.6
## P-Value [Acc > NIR] : 0.005172
##
## Kappa : 0.8571
##
## Mcnemar's Test P-Value : 1.000000
##
## Sensitivity : 1.0000
## Specificity : 0.8333
## Pos Pred Value : 0.9000
## Neg Pred Value : 1.0000
## Prevalence : 0.6000
## Detection Rate : 0.6000
## Detection Prevalence : 0.6667
## Balanced Accuracy : 0.9167
##
## 'Positive' Class : day
##
No Information Rate - 0.6, co jest równoważne z przewidzeniem klasy dominującej (klasy o największej liczbie wystąpień) dla wszystkich przypadków.
Wartość P-Value - 0.005 co sugeruje, że dokładność modelu jest statystycznie istotnie lepsza od przewidzenia klasy dominującej.
W przypadku referencji (Reference) jako “day”, algorytm sklasyfikował 9 przypadków jako “day” (True Positive). Nie występują błędne klasyfikacje jako “day” (False Negative).
W przypadku referencji jako “moon”, algorytm poprawnie sklasyfikował 5 przypadków jako “moon” (True Negative), ale błędnie sklasyfikował 1 przypadek jako “day” (False Positive).
Accuracy: 0.9333 oznacza, że algorytm poprawnie sklasyfikował 93.33% przypadków.
Współczynnik Kappa wynosi 0.8751, co wskazuje na dobrą zgodność między przewidywaniami modelu a rzeczywistością.
Sensitivity: 1 co oznacza, że model poprawnie zidentyfikował wszystkie przypadki klasy “day”.
Specificity: 0.83 co oznacza, że model poprawnie zidentyfikował 83.33% przypadków klasy “moon”.
Pos Pred Value: 0.9 co oznacza, że z przewidzianych przez model przypadków klasy “day” 90% faktycznie należy do tej klasy.
Neg Pred Value: 1 co oznacza, że wszystkie przewidziane przez model przypadki klasy “moon” są faktycznie poprawne.
Prevalence: 0.6 oznacza, że klasa “day” stanowi 60% wszystkich przypadków.
Detection Rate; 0.6 oznacza, że algorytm wykrył 60% przypadków “day”.
Detection Prevalence: 0.6667 oznacza, że 66.67% przypadków sklasyfikowanych przez algorytm należy do klasy “day”.
Balanced Accuracy: 0.9167 oznacza, że model osiągnął wysoką skuteczność w klasyfikacji obserwacji, uwzględniając proporcje obu klas.
<- confusionMatrix(predictions_tfidf, dtm_test_tfidf$type)
confusion_matrix_tfidf confusion_matrix_tfidf
## Confusion Matrix and Statistics
##
## Reference
## Prediction day moon
## day 9 0
## moon 0 6
##
## Accuracy : 1
## 95% CI : (0.782, 1)
## No Information Rate : 0.6
## P-Value [Acc > NIR] : 0.0004702
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0
## Specificity : 1.0
## Pos Pred Value : 1.0
## Neg Pred Value : 1.0
## Prevalence : 0.6
## Detection Rate : 0.6
## Detection Prevalence : 0.6
## Balanced Accuracy : 1.0
##
## 'Positive' Class : day
##
No Information Rate - 0.6 oznacza, że gdybyśmy klasyfikowali wszystkie przypadki jako najbardziej powszechną klasę, czyli “moon” w tym przypadku, osiągnęlibyśmy dokładność wynoszącą 60%.
Wartość P-value - 0.0004 sugeruje, że istnieje statystycznie istotna różnica między dokładnością modelu a przypadkową dokładnością. Oznacza to, że model jest znacznie lepszy niż przypadkowa klasyfikacja i dokładność jego predykcji nie wynika z przypadkowości.
W przypadku referencji (Reference) jako “day”, algorytm poprawnie sklasyfikował 9 przypadek jako “day” (True Positive). Nie występują żadne błędne klasyfikacje jako “day” (False Negative).
W przypadku referencji jako “moon”, algorytm poprawnie sklasyfikował 6 przypadków jako “moon” (True Negative). Nie występują żadne błędne klasyfikacje jako “moon” (False Positive).
Accuracy: 1 oznacza, że algorytm poprawnie sklasyfikował 100% przypadków.
Współczynnik Kappa wynosi 1, co wskazuje na doskonałą zgodność między klasyfikacją algorytmu a rzeczywistymi etykietami.
Sensitivity: 1 oznacza, że algorytm poprawnie sklasyfikował wszystkie przypadki “day” spośród wszystkich przypadków rzeczywiście należących do klasy “day”.
Specificity: 1 oznacza, że algorytm poprawnie sklasyfikował wszystkie przypadki “moon” spośród wszystkich przypadków rzeczywiście należących do klasy “moon”.
Pos Pred Value: 1 oznacza, że wszystkie przypadki sklasyfikowane jako “day” są prawidłowe.
Neg Pred Value: 1 oznacza, że wszystkie przypadki sklasyfikowane jako “moon” są prawidłowe.
Prevalence: 0.6 oznacza, że klasa “day” stanowi 60% wszystkich przypadków.
Detection Rate: 0.6 oznacza, że algorytm wykrył 60% przypadków “day”.
Detection Prevalence: 1 oznacza, że 100% przypadków sklasyfikowanych przez algorytm należy do klasy “day”.
Balanced Accuracy: 1 wskazuje na doskonałe wyważenie między wrażliwością a swoistością.
Na podstawie powyższych wyników można stwierdzić, że klasyfikator oparty na wagach tfidf osiąga najlepsze rezultaty we wszystkich mierzonych metrykach. Posiada on dokładność wynoszącą 1, co oznacza, że wszystkie obserwacje zostały poprawnie sklasyfikowane. Czułość, specyficzność i wyważona dokładność również wynoszą 1, co wskazuje na doskonałą zdolność klasyfikatora do identyfikacji zarówno pozytywnych, jak i negatywnych przypadków.
Należy jednak zauważyć, że zarówno klasyfikator oaparty na wagach logarytmiczncych jak i tfidf osiągneły taką wartość p-value, która oznacza, że model jest znacznie lepszy niż przypadkowa klasyfikacja i dokładność jego predykcji nie wynika z przypadkowości.