Wstępne sprawdzenie danych.

Sprawdźmy czy w danych występują jakieś wartości nieliczbowe lub nieznane.

Nie musimy poprawiać danych (Nie wymagają imputacji).

## [1] 0

Zobaczmy czy dane wymagają skalowania (Czy pojawiają sie jakieś wartości odstające).

## [1] 0

Zobaczmy jakie są typy poszczególnych zmiennych.

##      A         B         Class    
## [1,] "numeric" "numeric" "integer"
## [1] "factor"

Jedynie typ zmiennej zależnej musiał zostać zmieniony na factor.

Klasyfikacja za pomocą algorytmu LDA.

Zobaczymy wstępny wykres danych.

Zmienna decyzyjna przyjmuje 3 wartości, które jak widać na wykresie nie są liniowo separowalne. Zobaczmy, czy za pomocą dwóch zmiennych kanonicznych uda się odseparować obserwacje.

Stwórzmy nową ramkę danych w celu przedstawienia na wykresie nowych zmiennych.

##     zm_kan1   zm_kan2 Class
## 1 -1.957068 0.6989997     1
## 2 -1.812319 0.8514414     1
## 3 -1.655686 0.9525571     1
## 4 -1.623739 0.9016658     1

W metodzie LDA rzutujemy nasze obserwacje względem wektorów kanonicznych, w celu zwiększenia odległości pomiędzy środkami poszególnych klas oraz zmniejszeniu wariancji wewnątrz klas. Jeżeli dane są lepiej od siebie odseparowane to klasyfikator będzie działał lepiej, popełniając mniej błędów.

Zobaczmy wykres klasyfikacji po przeprowadzeniu algorytmu

Punkty leżące na wykresie nie są liniowo separowalne. Zrzutowanie obserwacji na nową przestrzeń nie pomogło. Jest to spowodowane tym, że zmienne kanoniczne są kombinacją liniową oryginalnych zmiennych a nie ich funkcją liniową. Mówimy tutaj w szczególności o punktach z klasy 3, będących otoczonymi przez punkty z klasy 2, które nie mogą być odseparowane poprzez wykonanie jedynie algorytmu.

Spróbujmy wykonać transformację obserwacji z klasy 3 w celu zwiększenie separowalności danych wejściowych.

Wszelkie transformacje pokroju pierwiastka kwadratowego,logarytmu, czy potęgi nie dawały zamierzonych rezultatów.

Zobaczmy jak wyglądają obserwacje ze zmiennej 3 po pomnożeniu przez 1.5.

Stwórzmy model jeszcze raz. Teraz zastosujemy przekształcone dane.

Sprawdźmy jak model radzi sobie z nowymi danymi. Wykorzystam w tym celu n-krotną i 10-krotną kroswalidację.

## Linear Discriminant Analysis 
## 
## 266 samples
##   2 predictor
##   3 classes: '1', '2', '3' 
## 
## No pre-processing
## Resampling: Leave-One-Out Cross-Validation 
## Summary of sample sizes: 265, 265, 265, 265, 265, 265, ... 
## Resampling results:
## 
##   Accuracy  Kappa
##   1         1

Zarówno Współczynnik Accuracy jak i statystyka Kappa wyniosły 1. Oznacza to, że klasyfikator nie pomylił się nawet raz.

## Linear Discriminant Analysis 
## 
## 266 samples
##   2 predictor
##   3 classes: '1', '2', '3' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 240, 240, 239, 239, 240, 238, ... 
## Resampling results:
## 
##   Accuracy  Kappa
##   1         1

W przypadku 10-krotnej kroswalidacji również otrzymaliśmy idealne klasyfikatory.

Ponieważ wejściowy zbiór danych nie był liniowo separowalny zarówno na początku jak i po zamianie na zmienne kanoniczne, wymagana była pewna transformacja obserwacji z klasy 3. W sytuacji gdybyśmy chcieli zaklasyfikować nową obserwację o nieznanej wartości zmiennej celu, mającej cechy obserwacji z klasy 3 przed transformacją, to powinniśmy ją również przekształcić w celu poprawnej klasyfikacji. Zaobrazuję to przykładem.

Założmy, że nowa obserwacja ma podane wartości zmiennych niezależnych: 0.010693628 oraz 0.02116404. Zaznaczmy ją na wykresie.

Tak jak widać byłaby zaklasyfikowana do klasy 2. Po przekształceniu 1.5 powinna znaleźć się w poprawnej klasie.

Wykres klasyfikacji obserwacji dla zmiennych kanonicznych.

Model regresji logistycznej

Wykonajmy najpierw zwykłą regresję logistyczną.

## # weights:  12 (6 variable)
## initial  value 292.230869 
## iter  10 value 207.293629
## iter  20 value 123.193205
## iter  30 value 73.901166
## iter  40 value 47.857767
## iter  50 value 34.336162
## iter  60 value 32.966796
## iter  70 value 24.142201
## iter  80 value 18.731936
## iter  90 value 14.105316
## iter 100 value 13.045677
## final  value 13.045677 
## stopped after 100 iterations
##    predykcje
##       1   2   3
##   1  92   0   0
##   2   0 158   0
##   3   0   0  16

Podobnie jak w przypadku LDA, chcąc stworzyć obszary decyzyjne, obserwacje muszą być liniowo separowalne. Z tego powodu wykorzystałem przetransformowane dane. Jest to spowodowane tym, że granicą decyzyjną w regresji logistycznej jest pewna funkcja liniowa. W tym przypadku mamy do czynienia z regresją softmax, o 3 wartościach zmiennej decyzyjnej więc będą to 2 funkcje liniowe jako funkcje decyzyjne.

Wykonajmy model regresji logistycznej z karą.

## glmnet 
## 
## 266 samples
##   2 predictor
##   3 classes: '1', '2', '3' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 239, 239, 240, 239, 241, 240, ... 
## Resampling results across tuning parameters:
## 
##   lambda  Accuracy   Kappa    
##   1e-05   0.9813289  0.9626332
##   1e-04   0.9813289  0.9626332
##   1e-03   0.9813289  0.9626332
##   1e-02   0.9813289  0.9626332
##   1e-01   0.9329862  0.8633509
##   1e+00   0.7831465  0.5163804
## 
## Tuning parameter 'alpha' was held constant at a value of 0
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were alpha = 0 and lambda = 0.01.
## glmnet 
## 
## 266 samples
##   2 predictor
##   3 classes: '1', '2', '3' 
## 
## No pre-processing
## Resampling: Leave-One-Out Cross-Validation 
## Summary of sample sizes: 265, 265, 265, 265, 265, 265, ... 
## Resampling results across tuning parameters:
## 
##   lambda  Accuracy   Kappa    
##   1e-05   0.9812030  0.9634234
##   1e-04   0.9812030  0.9634234
##   1e-03   0.9812030  0.9634234
##   1e-02   0.9812030  0.9634234
##   1e-01   0.9323308  0.8618899
##   1e+00   0.7706767  0.4902293
## 
## Tuning parameter 'alpha' was held constant at a value of 0
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were alpha = 0 and lambda = 0.01.

W modelu regresji logistycznej z karą model pomylił się w paru przypadkach.

Wykonajmy teraz model regresji logistycznej na danych wejściowych(nieliniowych) przy wykorzystaniu funkcji bazowych.

Stwórzmy nowe zmienne będące zmiennymi objaśniającymi w nowym modelu.

##         V1       V2       V3       V4       V5       V6
## 1 7.085764 4.332795 1.737287 1.715581 4.306770 7.059272
## 2 7.085339 4.332380 1.736949 1.715947 4.307198 7.059705
## 3 7.085007 4.332073 1.736775 1.716369 4.307604 7.060098
## 4 7.085082 4.332170 1.736954 1.716485 4.307625 7.060095

Powyższe wykresy tworzą wiele różnych współczynników dla modelu ze względu na parametr lambdy w regresji grzebietowej. Algorytm testował model na wielu różnych lambdach, lecz na osi OX umieścił z nich logarytm. Zauważmy, że duże wartości lambdy powodują, iż wspołczynniki zbliżają się do 0. Powoduje to niedoucznie modelu. Dlatego staramy się wybierać mniejszą lambdę w celu stworzenia odpowieniego modelu.

Musimy wybrać najlepszy parametr lambda oraz najbardziej zoptymalizowane współczynniki dla naszego modelu. W tym celu wykorzystamy kroswalidację.

## 
## Call:  cv.glmnet(x = as.matrix(nowa_ramka[, 1:6]), y = nowa_ramka$Class,      type.measure = "class", nfolds = 10, family = "multinomial",      alpha = 0) 
## 
## Measure: Misclassification Error 
## 
##     Lambda Index Measure      SE Nonzero
## min 0.2784    79 0.06015 0.01385       6
## 1se 0.4433    74 0.07143 0.01512       6

W przypadku funkcji glmnet błąd klasyfikacji wyniósł jedynie 0.06015 dla lambdy wyznaczonej przez funkcję.

Zobaczmy jak wygląda model dla mniejszej ilości zmiennych powstałych z funkcji radialnych.

## 
## Call:  cv.glmnet(x = as.matrix(nowa_ramka2[, 1:4]), y = nowa_ramka$Class,      type.measure = "class", nfolds = 10, family = "multinomial",      alpha = 0) 
## 
## Measure: Misclassification Error 
## 
##     Lambda Index Measure      SE Nonzero
## min 0.3350    77 0.06015 0.01385       4
## 1se 0.5334    72 0.07143 0.01703       4

W przypadku zmniejszenia ilości zmiennych bazowych do 4 dokładność modelu była ponownie 0.06015. Możemy więc uznać, że poprzedni model był odpowiedni.

Sprawdźmy klasyfikację dla innej funkcji bazowej

## glmnet 
## 
## 266 samples
##   6 predictor
##   3 classes: '1', '2', '3' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 239, 239, 238, 240, 240, 240, ... 
## Resampling results across tuning parameters:
## 
##   alpha  lambda        Accuracy   Kappa    
##   0.10   0.0007902465  0.9401506  0.8786778
##   0.10   0.0079024653  0.9401506  0.8786778
##   0.10   0.0790246526  0.9401506  0.8786778
##   0.55   0.0007902465  0.9401506  0.8786778
##   0.55   0.0079024653  0.9401506  0.8786778
##   0.55   0.0790246526  0.9401506  0.8786778
##   1.00   0.0007902465  0.9401506  0.8786778
##   1.00   0.0079024653  0.9401506  0.8786778
##   1.00   0.0790246526  0.9401506  0.8786778
## 
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were alpha = 0.1 and lambda = 0.07902465.
## glmnet 
## 
## 266 samples
##   4 predictor
##   3 classes: '1', '2', '3' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 239, 239, 238, 240, 240, 240, ... 
## Resampling results across tuning parameters:
## 
##   alpha  lambda        Accuracy   Kappa    
##   0.10   0.0007903057  0.9401506  0.8786778
##   0.10   0.0079030567  0.9401506  0.8786778
##   0.10   0.0790305666  0.9401506  0.8786778
##   0.55   0.0007903057  0.9401506  0.8786778
##   0.55   0.0079030567  0.9401506  0.8786778
##   0.55   0.0790305666  0.9328755  0.8633345
##   1.00   0.0007903057  0.9401506  0.8786778
##   1.00   0.0079030567  0.9401506  0.8786778
##   1.00   0.0790305666  0.9328755  0.8633345
## 
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were alpha = 0.1 and lambda = 0.07903057.

Dla obu funkcji bazowych poziom poprawnej klasyfikacji był wysoki. Największą trudność dla klasyfikatora stanowiły obserwacje z klasy 3, których nie potrafił odseparować od pozostałych i wyłącznie dla nich pojawiał się błąd klasyfikacji.

Zmiany współczynników l oraz m_i nie zmieniały obszarów klasyfikacji.