Teraz, gdy mamy nasz ostateczny model, musimy zweryfikować jego wyniki, testując go na niewidocznych danych. To da nam pewność, że nasz model jest dobrze wyszkolony i prawdopodobnie da podobne wyniki, gdy zostaną użyte nowe dane. Uważny czytelnik powinien zauważyć, że podczas tworzenia naszych danych analizy sentymentów użyliśmy ramki danych TF-IDF, a nie żadnej z tych, które tworzymy później, z kombinacjami bigramów, SVD i podobieństw cosinusowych, które działają w innej przestrzeni semantycznej z powodu do faktu, że są one przekształceniami oryginalnego DFM. Dlatego zanim będziemy mogli faktycznie użyć naszego wytrenowanego modelu do prognozowania danych testowych, musimy przekształcić go w przestrzeń równoważną z naszymi danymi szkoleniowymi. W przeciwnym razie porównalibyśmy jabłka i pomarańcze, co dałoby nam nonsensowne wyniki. Aby upewnić się, że pracujemy w tej samej przestrzeni semantycznej, zastosujemy wagi TF-IDF do naszych danych testowych. Jeśli jednak się nad tym zastanowić, prawdopodobnie w naszych danych testowych jest wiele terminów, których nie było w naszych danych szkoleniowych. Dlatego nasze DFM będą miały różne wymiary dla naszych zestawów szkoleniowych i testowych. To jest problem i musimy się upewnić, że są takie same. Aby to osiągnąć, tworzymy DFM dla danych testowych i stosujemy do niego filtr, który zachowuje tylko terminy obecne w naszym szkoleniowym DFM:
test.dfm <-build_dfm(test)
test.dfm <- dfm_selet(test.dfm, pattern = train.dfm, selectio = „keep”
Co więcej, jeśli się nad tym zastanowić, część TF-IDF ważąca korpus, czyli IDF, będzie również inna niż te dwa zestawy danych ze względu na zmianę terminu przestrzeń dla korpusu. Dlatego musimy się upewnić, że ignorujemy te terminy, które są nowe (to znaczy nie widzieliśmy ich w naszych danych szkoleniowych) i używamy IDF z naszej procedury szkoleniowej, aby upewnić się, że nasze testy są prawidłowe. Aby to osiągnąć, najpierw obliczymy tylko część IDF TF-IDF dla naszych danych szkoleniowych i użyjemy tego podczas obliczania TF-IDF dla naszych danych testowych:
train.idf <- apply(as.matrixx(train.dfm) , 2, inverse_document_frequency)
test.tfidf <- build_tf_idf(test.dfm, idf = train.idf)
test.tfid.df <- build_dfm_df(test, test.tfidf)
Teraz, gdy mamy dane testowe rzutowane na przestrzeń wektorową danych uczących, my może obliczyć analizę nastrojów dla nowego testowego DFM i obliczyć nasze prognozy:
test.sentiment <- sentyment_by(test$MESSAGE)
test.sentiments.df <- cbind(
test.tfidf.df,
WORD_COUNT = test.sentiment$word_count,
SENTIMENT = test.sentiment$ave_sentiment
)
Zwróć uwagę, że w tym przypadku nie trenujemy nowego modelu, po prostu używamy ostatniego stworzonego przez nas modelu i używamy go do dostarczania prognoz dla testowego DFM:
preditions <-p redict(model.6, test.sentiments.df)
Aby wiedzieć, jak dobrze przewidzieliśmy, możemy po prostu wydrukować model, tak jak robiliśmy to wcześniej, ponieważ po prostu patrzylibyśmy na wyniki procesu uczenia, który nie obejmuje prognoz dla danych testowych. To, co musimy zrobić, to stworzyć macierz pomyłki i obliczyć predykcyjne metryki dokładności, tak jak robiliśmy to wcześniej z funkcją confusionMatrix(). Jak widać, nasze wyniki wydają się być prawidłowe, ponieważ uzyskaliśmy przewidywalną dokładność 71,91% dla wcześniej niewidocznych danych, co jest bardzo zbliżone do przewidywalnej dokładności danych treningowych i jest o 12% większe niż tylko zgadywanie rzeczywistego odsetka wielokrotnych zakupów . W przypadku danych tekstowych i problemu, z którym mamy do czynienia, wyniki te są całkiem dobre. Jeśli wiesz, jak interpretować inne metryki, upewnij się, że porównujesz je z tymi, które mieliśmy dla naszego pierwszego modelu, aby zdać sobie sprawę, jak ewoluowały nasze wyniki w trakcie naszej pracy.
cofusionMatrix(predixtions, test$MULT_PURCHASES)
#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction FALSE TRUE
#> FALSE 11 4
#> TRUE 21 53
#>
#> Accuracy : 0.7191
#> 95% CI : (0.6138, 0.8093)
#> No Information Rate : 0.6404
#> P-Value [Acc > NIR] : 0.073666
#>
#> Kappa : 0.3096
#> Mcnemar’s Test P-Value : 0.001374
#>
#> Sensitivity : 0.3438
#> Specificity : 0.9298
#> Pos Pred Value : 0.7333
#> Neg Pred Value : 0.7162
#> Prevalence : 0.3596
#> Detection Rate : 0.1236
#> Detection Prevalence : 0.1685
#> Balanced Accuracy : 0.6368
#>
#> ‘Positive’ Class : FALSE
Jeśli zamierzasz testować za pomocą DFM, który został utworzony przy użyciu SVD, musisz wykonać odpowiednią transformację, aby upewnić się, że pracujesz we właściwej przestrzeni semantycznej, zanim utworzysz jakiekolwiek przewidywania. Jeśli zastosowałeś procedurę taką jak ta pokazana w tym rozdziale, musisz pomnożyć w lewo testowy DFM (z podobnymi przekształceniami jak twój treningowy DFM) przez wektor osobliwych wartości skorygowanych przez sigma, jednocześnie odpowiednio transponując struktury. Dokładna transformacja będzie zależeć od używanych struktur danych i zastosowanych do nich procesów, ale zawsze pamiętaj, aby upewnić się, że zarówno dane treningowe, jak i testowe działają w tej samej przestrzeni semantycznej:
sigma.inverse <- 1 / train.bigrams.svd$d
u.transpose <- t(train.bigrams.svd$u)
test.bigrams.svd <- t9sigma.inverse * u.transpose %*%
t(test.bigrams.tfidf))
test,bigrams,svd,df <- build_dfm_df(test, test.bigrams.svd)