Using devices such as Jawbone Up, Nike FuelBand, and Fitbit it is now possible to collect a large amount of data about personal activity relatively inexpensively. These type of devices are part of the quantified self movement - a group of enthusiasts who take measurements about themselves regularly to improve their health, to find patterns in their behavior, or because they are tech geeks. One thing that people regularly do is quantify how much of a particular activity they do, but they rarely quantify how well they do it. In this project, your goal will be to use data from accelerometers on the belt, forearm, arm, and dumbell of 6 participants. They were asked to perform barbell lifts correctly and incorrectly in 5 different ways. More information is available from the website here (see the section on the Weight Lifting Exercise Dataset).
The goal of the project is to predict the manner in which they did the exercise. This is the “classe” variable in the training set.
I will solve the problem using Random Forests. I will then also use XGBoost Classifiers (A high level Gradient Boosting technique) to solve the problem. The performance & results for both the methods will then be compared against each other.
library(caret)
library(caTools)
library(randomForest)
train_raw <- read.csv("https://d396qusza40orc.cloudfront.net/predmachlearn/pml-training.csv")
validate <- read.csv("https://d396qusza40orc.cloudfront.net/predmachlearn/pml-testing.csv")
str(train_raw)
## 'data.frame': 19622 obs. of 160 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ user_name : Factor w/ 6 levels "adelmo","carlitos",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ raw_timestamp_part_1 : int 1323084231 1323084231 1323084231 1323084232 1323084232 1323084232 1323084232 1323084232 1323084232 1323084232 ...
## $ raw_timestamp_part_2 : int 788290 808298 820366 120339 196328 304277 368296 440390 484323 484434 ...
## $ cvtd_timestamp : Factor w/ 20 levels "02/12/2011 13:32",..: 9 9 9 9 9 9 9 9 9 9 ...
## $ new_window : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ num_window : int 11 11 11 12 12 12 12 12 12 12 ...
## $ roll_belt : num 1.41 1.41 1.42 1.48 1.48 1.45 1.42 1.42 1.43 1.45 ...
## $ pitch_belt : num 8.07 8.07 8.07 8.05 8.07 8.06 8.09 8.13 8.16 8.17 ...
## $ yaw_belt : num -94.4 -94.4 -94.4 -94.4 -94.4 -94.4 -94.4 -94.4 -94.4 -94.4 ...
## $ total_accel_belt : int 3 3 3 3 3 3 3 3 3 3 ...
## $ kurtosis_roll_belt : Factor w/ 397 levels "","-0.016850",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ kurtosis_picth_belt : Factor w/ 317 levels "","-0.021887",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ kurtosis_yaw_belt : Factor w/ 2 levels "","#DIV/0!": 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_roll_belt : Factor w/ 395 levels "","-0.003095",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_roll_belt.1 : Factor w/ 338 levels "","-0.005928",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_yaw_belt : Factor w/ 2 levels "","#DIV/0!": 1 1 1 1 1 1 1 1 1 1 ...
## $ max_roll_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ max_picth_belt : int NA NA NA NA NA NA NA NA NA NA ...
## $ max_yaw_belt : Factor w/ 68 levels "","-0.1","-0.2",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ min_roll_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ min_pitch_belt : int NA NA NA NA NA NA NA NA NA NA ...
## $ min_yaw_belt : Factor w/ 68 levels "","-0.1","-0.2",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ amplitude_roll_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ amplitude_pitch_belt : int NA NA NA NA NA NA NA NA NA NA ...
## $ amplitude_yaw_belt : Factor w/ 4 levels "","#DIV/0!","0.00",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ var_total_accel_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ avg_roll_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ stddev_roll_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ var_roll_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ avg_pitch_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ stddev_pitch_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ var_pitch_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ avg_yaw_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ stddev_yaw_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ var_yaw_belt : num NA NA NA NA NA NA NA NA NA NA ...
## $ gyros_belt_x : num 0 0.02 0 0.02 0.02 0.02 0.02 0.02 0.02 0.03 ...
## $ gyros_belt_y : num 0 0 0 0 0.02 0 0 0 0 0 ...
## $ gyros_belt_z : num -0.02 -0.02 -0.02 -0.03 -0.02 -0.02 -0.02 -0.02 -0.02 0 ...
## $ accel_belt_x : int -21 -22 -20 -22 -21 -21 -22 -22 -20 -21 ...
## $ accel_belt_y : int 4 4 5 3 2 4 3 4 2 4 ...
## $ accel_belt_z : int 22 22 23 21 24 21 21 21 24 22 ...
## $ magnet_belt_x : int -3 -7 -2 -6 -6 0 -4 -2 1 -3 ...
## $ magnet_belt_y : int 599 608 600 604 600 603 599 603 602 609 ...
## $ magnet_belt_z : int -313 -311 -305 -310 -302 -312 -311 -313 -312 -308 ...
## $ roll_arm : num -128 -128 -128 -128 -128 -128 -128 -128 -128 -128 ...
## $ pitch_arm : num 22.5 22.5 22.5 22.1 22.1 22 21.9 21.8 21.7 21.6 ...
## $ yaw_arm : num -161 -161 -161 -161 -161 -161 -161 -161 -161 -161 ...
## $ total_accel_arm : int 34 34 34 34 34 34 34 34 34 34 ...
## $ var_accel_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ avg_roll_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ stddev_roll_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ var_roll_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ avg_pitch_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ stddev_pitch_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ var_pitch_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ avg_yaw_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ stddev_yaw_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ var_yaw_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ gyros_arm_x : num 0 0.02 0.02 0.02 0 0.02 0 0.02 0.02 0.02 ...
## $ gyros_arm_y : num 0 -0.02 -0.02 -0.03 -0.03 -0.03 -0.03 -0.02 -0.03 -0.03 ...
## $ gyros_arm_z : num -0.02 -0.02 -0.02 0.02 0 0 0 0 -0.02 -0.02 ...
## $ accel_arm_x : int -288 -290 -289 -289 -289 -289 -289 -289 -288 -288 ...
## $ accel_arm_y : int 109 110 110 111 111 111 111 111 109 110 ...
## $ accel_arm_z : int -123 -125 -126 -123 -123 -122 -125 -124 -122 -124 ...
## $ magnet_arm_x : int -368 -369 -368 -372 -374 -369 -373 -372 -369 -376 ...
## $ magnet_arm_y : int 337 337 344 344 337 342 336 338 341 334 ...
## $ magnet_arm_z : int 516 513 513 512 506 513 509 510 518 516 ...
## $ kurtosis_roll_arm : Factor w/ 330 levels "","-0.02438",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ kurtosis_picth_arm : Factor w/ 328 levels "","-0.00484",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ kurtosis_yaw_arm : Factor w/ 395 levels "","-0.01548",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_roll_arm : Factor w/ 331 levels "","-0.00051",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_pitch_arm : Factor w/ 328 levels "","-0.00184",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_yaw_arm : Factor w/ 395 levels "","-0.00311",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ max_roll_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ max_picth_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ max_yaw_arm : int NA NA NA NA NA NA NA NA NA NA ...
## $ min_roll_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ min_pitch_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ min_yaw_arm : int NA NA NA NA NA NA NA NA NA NA ...
## $ amplitude_roll_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ amplitude_pitch_arm : num NA NA NA NA NA NA NA NA NA NA ...
## $ amplitude_yaw_arm : int NA NA NA NA NA NA NA NA NA NA ...
## $ roll_dumbbell : num 13.1 13.1 12.9 13.4 13.4 ...
## $ pitch_dumbbell : num -70.5 -70.6 -70.3 -70.4 -70.4 ...
## $ yaw_dumbbell : num -84.9 -84.7 -85.1 -84.9 -84.9 ...
## $ kurtosis_roll_dumbbell : Factor w/ 398 levels "","-0.0035","-0.0073",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ kurtosis_picth_dumbbell : Factor w/ 401 levels "","-0.0163","-0.0233",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ kurtosis_yaw_dumbbell : Factor w/ 2 levels "","#DIV/0!": 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_roll_dumbbell : Factor w/ 401 levels "","-0.0082","-0.0096",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_pitch_dumbbell : Factor w/ 402 levels "","-0.0053","-0.0084",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ skewness_yaw_dumbbell : Factor w/ 2 levels "","#DIV/0!": 1 1 1 1 1 1 1 1 1 1 ...
## $ max_roll_dumbbell : num NA NA NA NA NA NA NA NA NA NA ...
## $ max_picth_dumbbell : num NA NA NA NA NA NA NA NA NA NA ...
## $ max_yaw_dumbbell : Factor w/ 73 levels "","-0.1","-0.2",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ min_roll_dumbbell : num NA NA NA NA NA NA NA NA NA NA ...
## $ min_pitch_dumbbell : num NA NA NA NA NA NA NA NA NA NA ...
## $ min_yaw_dumbbell : Factor w/ 73 levels "","-0.1","-0.2",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ amplitude_roll_dumbbell : num NA NA NA NA NA NA NA NA NA NA ...
## [list output truncated]
#We can see that a lot of columns with NA values. Lets count the no. of NA values
sapply(train_raw, function(x) sum(is.na(x)))
## X user_name raw_timestamp_part_1
## 0 0 0
## raw_timestamp_part_2 cvtd_timestamp new_window
## 0 0 0
## num_window roll_belt pitch_belt
## 0 0 0
## yaw_belt total_accel_belt kurtosis_roll_belt
## 0 0 0
## kurtosis_picth_belt kurtosis_yaw_belt skewness_roll_belt
## 0 0 0
## skewness_roll_belt.1 skewness_yaw_belt max_roll_belt
## 0 0 19216
## max_picth_belt max_yaw_belt min_roll_belt
## 19216 0 19216
## min_pitch_belt min_yaw_belt amplitude_roll_belt
## 19216 0 19216
## amplitude_pitch_belt amplitude_yaw_belt var_total_accel_belt
## 19216 0 19216
## avg_roll_belt stddev_roll_belt var_roll_belt
## 19216 19216 19216
## avg_pitch_belt stddev_pitch_belt var_pitch_belt
## 19216 19216 19216
## avg_yaw_belt stddev_yaw_belt var_yaw_belt
## 19216 19216 19216
## gyros_belt_x gyros_belt_y gyros_belt_z
## 0 0 0
## accel_belt_x accel_belt_y accel_belt_z
## 0 0 0
## magnet_belt_x magnet_belt_y magnet_belt_z
## 0 0 0
## roll_arm pitch_arm yaw_arm
## 0 0 0
## total_accel_arm var_accel_arm avg_roll_arm
## 0 19216 19216
## stddev_roll_arm var_roll_arm avg_pitch_arm
## 19216 19216 19216
## stddev_pitch_arm var_pitch_arm avg_yaw_arm
## 19216 19216 19216
## stddev_yaw_arm var_yaw_arm gyros_arm_x
## 19216 19216 0
## gyros_arm_y gyros_arm_z accel_arm_x
## 0 0 0
## accel_arm_y accel_arm_z magnet_arm_x
## 0 0 0
## magnet_arm_y magnet_arm_z kurtosis_roll_arm
## 0 0 0
## kurtosis_picth_arm kurtosis_yaw_arm skewness_roll_arm
## 0 0 0
## skewness_pitch_arm skewness_yaw_arm max_roll_arm
## 0 0 19216
## max_picth_arm max_yaw_arm min_roll_arm
## 19216 19216 19216
## min_pitch_arm min_yaw_arm amplitude_roll_arm
## 19216 19216 19216
## amplitude_pitch_arm amplitude_yaw_arm roll_dumbbell
## 19216 19216 0
## pitch_dumbbell yaw_dumbbell kurtosis_roll_dumbbell
## 0 0 0
## kurtosis_picth_dumbbell kurtosis_yaw_dumbbell skewness_roll_dumbbell
## 0 0 0
## skewness_pitch_dumbbell skewness_yaw_dumbbell max_roll_dumbbell
## 0 0 19216
## max_picth_dumbbell max_yaw_dumbbell min_roll_dumbbell
## 19216 0 19216
## min_pitch_dumbbell min_yaw_dumbbell amplitude_roll_dumbbell
## 19216 0 19216
## amplitude_pitch_dumbbell amplitude_yaw_dumbbell total_accel_dumbbell
## 19216 0 0
## var_accel_dumbbell avg_roll_dumbbell stddev_roll_dumbbell
## 19216 19216 19216
## var_roll_dumbbell avg_pitch_dumbbell stddev_pitch_dumbbell
## 19216 19216 19216
## var_pitch_dumbbell avg_yaw_dumbbell stddev_yaw_dumbbell
## 19216 19216 19216
## var_yaw_dumbbell gyros_dumbbell_x gyros_dumbbell_y
## 19216 0 0
## gyros_dumbbell_z accel_dumbbell_x accel_dumbbell_y
## 0 0 0
## accel_dumbbell_z magnet_dumbbell_x magnet_dumbbell_y
## 0 0 0
## magnet_dumbbell_z roll_forearm pitch_forearm
## 0 0 0
## yaw_forearm kurtosis_roll_forearm kurtosis_picth_forearm
## 0 0 0
## kurtosis_yaw_forearm skewness_roll_forearm skewness_pitch_forearm
## 0 0 0
## skewness_yaw_forearm max_roll_forearm max_picth_forearm
## 0 19216 19216
## max_yaw_forearm min_roll_forearm min_pitch_forearm
## 0 19216 19216
## min_yaw_forearm amplitude_roll_forearm amplitude_pitch_forearm
## 0 19216 19216
## amplitude_yaw_forearm total_accel_forearm var_accel_forearm
## 0 0 19216
## avg_roll_forearm stddev_roll_forearm var_roll_forearm
## 19216 19216 19216
## avg_pitch_forearm stddev_pitch_forearm var_pitch_forearm
## 19216 19216 19216
## avg_yaw_forearm stddev_yaw_forearm var_yaw_forearm
## 19216 19216 19216
## gyros_forearm_x gyros_forearm_y gyros_forearm_z
## 0 0 0
## accel_forearm_x accel_forearm_y accel_forearm_z
## 0 0 0
## magnet_forearm_x magnet_forearm_y magnet_forearm_z
## 0 0 0
## classe
## 0
#Remove the 1st 7 columns
train_raw <- train_raw[,-seq(1:7)]
#Remove columns with NAs
flag <- colSums(is.na(train_raw)) == 0
train_raw <- train_raw[,flag]
result <- train_raw$classe
#Conduct Near Zero Variance in order to remove variables which do not contribute to the variability in the data
zero_var <- nearZeroVar(train_raw[-as.numeric(ncol(train_raw))],saveMetrics = T)
train_raw <- train_raw[,zero_var$nzv==F]
set.seed(13579)
split <- sample.split(train_raw,0.7)
train <- subset(train_raw,split==T)
test <- subset(train_raw,split==F)
set.seed(13579)
system.time(opt_mod <- tuneRF(train[-as.numeric(ncol(train))],train$classe,ntreeTry = 150, stepFactor = 2, improve = 0.05,
trace = T, plot = T, doBest = F))
## mtry = 7 OOB error = 0.47%
## Searching left ...
## mtry = 4 OOB error = 0.71%
## -0.4923077 0.05
## Searching right ...
## mtry = 14 OOB error = 0.55%
## -0.1692308 0.05
## user system elapsed
## 28.85 0.02 28.87
mtry_fin <- opt_mod[as.numeric(which.min(opt_mod[,"OOBError"])),"mtry"]
system.time(rf_fin <- randomForest(classe~.,data=train, mtry=mtry_fin, ntree=501,
keep.forest=TRUE, proximity=TRUE, importance=TRUE,test=testing))
## user system elapsed
## 203.08 3.81 207.08
plot(rf_fin, log="y", main ="Out-of-bag (OOB) error estimate per Number of Trees")
varImpPlot(rf_fin, main="Mean Decrease of Accuracy and Gini per variable")
# results with training set
pred <- predict(rf_fin, newdata=train)
confusionMatrix(pred,train$classe)
## Confusion Matrix and Statistics
##
## Reference
## Prediction A B C D E
## A 3893 0 0 0 0
## B 0 2653 0 0 0
## C 0 0 2387 0 0
## D 0 0 0 2246 0
## E 0 0 0 0 2517
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.9997, 1)
## No Information Rate : 0.2842
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: A Class: B Class: C Class: D Class: E
## Sensitivity 1.0000 1.0000 1.0000 1.000 1.0000
## Specificity 1.0000 1.0000 1.0000 1.000 1.0000
## Pos Pred Value 1.0000 1.0000 1.0000 1.000 1.0000
## Neg Pred Value 1.0000 1.0000 1.0000 1.000 1.0000
## Prevalence 0.2842 0.1937 0.1743 0.164 0.1838
## Detection Rate 0.2842 0.1937 0.1743 0.164 0.1838
## Detection Prevalence 0.2842 0.1937 0.1743 0.164 0.1838
## Balanced Accuracy 1.0000 1.0000 1.0000 1.000 1.0000
#Testing Data
pred_test <- predict(rf_fin,test)
confusionMatrix(pred_test,test$classe)
## Confusion Matrix and Statistics
##
## Reference
## Prediction A B C D E
## A 1684 7 0 0 0
## B 3 1137 4 0 0
## C 0 0 1030 8 0
## D 0 0 1 960 0
## E 0 0 0 2 1090
##
## Overall Statistics
##
## Accuracy : 0.9958
## 95% CI : (0.9938, 0.9973)
## No Information Rate : 0.2847
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9947
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: A Class: B Class: C Class: D Class: E
## Sensitivity 0.9982 0.9939 0.9952 0.9897 1.0000
## Specificity 0.9983 0.9985 0.9984 0.9998 0.9996
## Pos Pred Value 0.9959 0.9939 0.9923 0.9990 0.9982
## Neg Pred Value 0.9993 0.9985 0.9990 0.9980 1.0000
## Prevalence 0.2847 0.1930 0.1747 0.1637 0.1839
## Detection Rate 0.2842 0.1919 0.1738 0.1620 0.1839
## Detection Prevalence 0.2854 0.1930 0.1752 0.1622 0.1843
## Balanced Accuracy 0.9983 0.9962 0.9968 0.9947 0.9998
res_fin <- as.matrix(as.integer(train$classe)-1)
require(xgboost)
param1 <- list("objective" = "multi:softmax", # multiclass classification
"eval_metric" = "merror", # evaluation metric
"nthread" = 8, # number of threads to be used
"max_depth" = 10, # maximum depth of tree
"eta" = 0.2, # step size shrinkage
"gamma" = 0, # minimum loss reduction
"subsample" = 0.66, # part of data instances to grow tree
"colsample_bytree" = 0.75, # subsample ratio of columns when constructing each tree
"min_child_weight" = 5 # minimum sum of instance weight needed in a child
)
system.time(xgb_m1 <- xgboost(data=xgb.DMatrix(model.matrix(~.,data=train),label=res_fin),
verbose=1,
num_class=5,
nrounds=200,
early.stop.round=3,
params=param1))
## [0] train-merror:0.000000
## [1] train-merror:0.000000
## [2] train-merror:0.000146
## [3] train-merror:0.000000
## Stopping. Best iteration: 1
## user system elapsed
## 1.03 0.10 1.97
#Train Data Visualization
system.time(xgb_train <- predict(xgb_m1,newdata=xgb.DMatrix(model.matrix(~.,data=train),label=res_fin)))
## user system elapsed
## 0.03 0.00 0.03
confusionMatrix(xgb_train,res_fin)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1 2 3 4
## 0 3893 0 0 0 0
## 1 0 2653 0 0 0
## 2 0 0 2387 0 0
## 3 0 0 0 2246 0
## 4 0 0 0 0 2517
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.9997, 1)
## No Information Rate : 0.2842
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2 Class: 3 Class: 4
## Sensitivity 1.0000 1.0000 1.0000 1.000 1.0000
## Specificity 1.0000 1.0000 1.0000 1.000 1.0000
## Pos Pred Value 1.0000 1.0000 1.0000 1.000 1.0000
## Neg Pred Value 1.0000 1.0000 1.0000 1.000 1.0000
## Prevalence 0.2842 0.1937 0.1743 0.164 0.1838
## Detection Rate 0.2842 0.1937 0.1743 0.164 0.1838
## Detection Prevalence 0.2842 0.1937 0.1743 0.164 0.1838
## Balanced Accuracy 1.0000 1.0000 1.0000 1.000 1.0000
#Test Data Validation
test_res <- as.matrix(as.integer(test$classe)-1)
system.time(xgb_test <- predict(xgb_m1,newdata=xgb.DMatrix(model.matrix(~.,data=test),label=test_res)))
## user system elapsed
## 0.02 0.00 0.02
confusionMatrix(xgb_test,test_res)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1 2 3 4
## 0 1686 0 0 0 0
## 1 0 1144 0 0 0
## 2 0 0 1035 0 0
## 3 0 0 0 970 0
## 4 1 0 0 0 1090
##
## Overall Statistics
##
## Accuracy : 0.9998
## 95% CI : (0.9991, 1)
## No Information Rate : 0.2847
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9998
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2 Class: 3 Class: 4
## Sensitivity 0.9994 1.000 1.0000 1.0000 1.0000
## Specificity 1.0000 1.000 1.0000 1.0000 0.9998
## Pos Pred Value 1.0000 1.000 1.0000 1.0000 0.9991
## Neg Pred Value 0.9998 1.000 1.0000 1.0000 1.0000
## Prevalence 0.2847 0.193 0.1747 0.1637 0.1839
## Detection Rate 0.2845 0.193 0.1747 0.1637 0.1839
## Detection Prevalence 0.2845 0.193 0.1747 0.1637 0.1841
## Balanced Accuracy 0.9997 1.000 1.0000 1.0000 0.9999