# Для анализа были взяты из репозитория:
#  http://archive.ics.uci.edu/ml/datasets/Glass+Identification

glassdata = read.table("D:/R/Tree/glass.data", header = FALSE, sep=",")


# Узнаем объём выборки и число признаков
dims = dim(glassdata) # n x m
dims
## [1] 214  11
n = dims[1] # объём выборки # 214
n
## [1] 214
m = dims[2] # количество факторов # 11
m
## [1] 11
#(изначально - 11 факторов + переменная отклика)
# Переменная отклика - № класса - последний столбец
# Первый столбец – идентификатор образца, не
# является фактором, поэтому исключим его:
glassdata = glassdata[-1]

# Добавим названия столбцов
colnames(glassdata) = c('RI','Na','Mg','Al','Si','K','Ca','Ba','Fe','Type')
# glassdata

# Можем посмотреть на структуру прочитанных данных
str(glassdata)
## 'data.frame':    214 obs. of  10 variables:
##  $ RI  : num  1.52 1.52 1.52 1.52 1.52 ...
##  $ Na  : num  13.6 13.9 13.5 13.2 13.3 ...
##  $ Mg  : num  4.49 3.6 3.55 3.69 3.62 3.61 3.6 3.61 3.58 3.6 ...
##  $ Al  : num  1.1 1.36 1.54 1.29 1.24 1.62 1.14 1.05 1.37 1.36 ...
##  $ Si  : num  71.8 72.7 73 72.6 73.1 ...
##  $ K   : num  0.06 0.48 0.39 0.57 0.55 0.64 0.58 0.57 0.56 0.57 ...
##  $ Ca  : num  8.75 7.83 7.78 8.22 8.07 8.07 8.17 8.24 8.3 8.4 ...
##  $ Ba  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Fe  : num  0 0 0 0 0 0.26 0 0 0 0.11 ...
##  $ Type: int  1 1 1 1 1 1 1 1 1 1 ...
# Часть выборки, например, 150 записей, будем использовать как обучающую выборку
n_train = 150

# Как можно увидеть, данные в файле glass.data упорядочены по номеру класса,
# т.е. сначала «идут» единицы, потом двойки и т.д.
# Обучающая выборка должна быть репрезентативной -
# т.е. каждый класс должен быть представлен в ней
# в той же пропорции, что и во всей выборке.
# Подсчитаем частоты встречаемости классов в исходной выборке
# (выразим эти частоты в %, округлив до десятых)
# ВНИМАНИЕ: Теперь номер класса содержится в 10-ом столбце!

round(prop.table(table(glassdata[10]))*100, digits = 1)
## 
##    1    2    3    5    6    7 
## 32.7 35.5  7.9  6.1  4.2 13.6
# ВНИМАНИЕ: Не забыть включить в ОТЧЁТ частоты классов!
table(glassdata[10])
## 
##  1  2  3  5  6  7 
## 70 76 17 13  9 29
# Чтобы обеспечить репрезентативность выборки, перемешаем её
set.seed(12345) # Псевдослучайное число, для повторяемости рачтетов

glassdata_mixed=glassdata[order(runif(n)),]
# Сортируем данные в случайном порядке

# Выберем обучающую выборку
train_data = glassdata_mixed[1:n_train,]
# train_data - имя обучающей выборки (метки классов здесь пока присутствуют!)

# Сохраним номера классов для строк обучающей выборки в переменной train_data_labels
train_data_labels = train_data[,10]
train_data_labels
##   [1] 1 1 7 2 2 2 2 1 1 2 1 1 2 7 2 1 2 7 2 2 7 1 2 2 1 2 1 7 7 1 6 5 1 2 2 1 5
##  [38] 6 3 1 2 2 1 1 1 7 2 1 6 1 7 7 2 2 7 2 7 5 7 1 2 1 1 1 2 7 3 1 1 3 2 7 5 2
##  [75] 5 2 1 1 1 5 2 1 6 1 3 1 1 1 7 1 1 5 3 1 2 2 1 2 7 2 2 2 2 2 1 7 3 2 2 7 3
## [112] 1 2 3 2 2 1 2 2 1 2 2 1 7 2 2 7 2 1 3 2 2 2 7 2 1 6 1 2 2 2 1 1 1 1 1 3 5
## [149] 2 5
# ОЧЕНЬ ВАЖНО! Необходимо использовать функцию factor для формирования 
#меток соответствующих уровней значения переменной отклика
train_data_labels = factor(train_data_labels,levels=c(1,2,3,5,6,7),labels=c("1","2","3","5","6","7"))

# Подсчитаем частоту присутствия каждого класса в обучающей выборке
# и сравним с соответствующими частотами в исходной выборке
round(prop.table(table(train_data_labels))*100, digits = 1)
## train_data_labels
##    1    2    3    5    6    7 
## 33.3 36.7  6.7  6.0  3.3 14.0
# Оставшуюся часть "перемешанной выборки" будем использовать как тестовую выборку
test_data = glassdata_mixed[(n_train+1):n, ]
test_data_labels = test_data[,10]
#test_data_labels = factor(test_data_labels)

# Заметим, что процентное содержание каждого класса в тестовой выборке нам не важно!

# ===============================================
# Подключим пакет rpart
##############################################################
library(rpart) #classification and regression trees
glass.tree = rpart( Type~., data = train_data, method="class") # построение классификации
library(rpart.plot) 
rpart.plot(glass.tree, 
           type = 2, 
           extra = 2,
           cex = 0.8, tweak = 1)

summary(glass.tree)
## Call:
## rpart(formula = Type ~ ., data = train_data, method = "class")
##   n= 150 
## 
##           CP nsplit rel error    xerror       xstd
## 1 0.23684211      0 1.0000000 1.0736842 0.06013834
## 2 0.08421053      2 0.5263158 0.5473684 0.06135437
## 3 0.02105263      4 0.3578947 0.3894737 0.05557390
## 4 0.01000000      5 0.3368421 0.4105263 0.05654895
## 
## Variable importance
## Al Mg Ca Ba RI  K Na Si 
## 21 18 16 14 12  9  6  4 
## 
## Node number 1: 150 observations,    complexity param=0.2368421
##   predicted class=2  expected loss=0.6333333  P(node) =1
##     class counts:    50    55    10     9     5    21
##    probabilities: 0.333 0.367 0.067 0.060 0.033 0.140 
##   left son=2 (128 obs) right son=3 (22 obs)
##   Primary splits:
##       Ba < 0.335    to the left,  improve=20.28231, (0 missing)
##       Al < 1.815    to the left,  improve=17.11495, (0 missing)
##       Mg < 2.24     to the right, improve=16.67387, (0 missing)
##       Na < 14.09    to the left,  improve=14.90312, (0 missing)
##       RI < 1.517195 to the right, improve=10.72734, (0 missing)
##   Surrogate splits:
##       Al < 1.92     to the left,  agree=0.933, adj=0.545, (0 split)
##       Mg < 0.165    to the right, agree=0.900, adj=0.318, (0 split)
##       Na < 14.09    to the left,  agree=0.893, adj=0.273, (0 split)
##       K  < 0.055    to the right, agree=0.873, adj=0.136, (0 split)
##       Ca < 6.7      to the right, agree=0.867, adj=0.091, (0 split)
## 
## Node number 2: 128 observations,    complexity param=0.2368421
##   predicted class=2  expected loss=0.578125  P(node) =0.8533333
##     class counts:    49    54    10     9     5     1
##    probabilities: 0.383 0.422 0.078 0.070 0.039 0.008 
##   left son=4 (74 obs) right son=5 (54 obs)
##   Primary splits:
##       Al < 1.42     to the left,  improve=14.534440, (0 missing)
##       RI < 1.517155 to the right, improve=11.074540, (0 missing)
##       Ca < 8.235    to the right, improve= 9.387610, (0 missing)
##       Mg < 2.55     to the right, improve= 8.249961, (0 missing)
##       K  < 0.625    to the left,  improve= 6.028006, (0 missing)
##   Surrogate splits:
##       Ca < 8.235    to the right, agree=0.766, adj=0.444, (0 split)
##       RI < 1.517155 to the right, agree=0.758, adj=0.426, (0 split)
##       K  < 0.625    to the left,  agree=0.742, adj=0.389, (0 split)
##       Mg < 2.55     to the right, agree=0.633, adj=0.130, (0 split)
##       Na < 14.815   to the left,  agree=0.602, adj=0.056, (0 split)
## 
## Node number 3: 22 observations
##   predicted class=7  expected loss=0.09090909  P(node) =0.1466667
##     class counts:     1     1     0     0     0    20
##    probabilities: 0.045 0.045 0.000 0.000 0.000 0.909 
## 
## Node number 4: 74 observations,    complexity param=0.08421053
##   predicted class=1  expected loss=0.3918919  P(node) =0.4933333
##     class counts:    45    19     8     1     1     0
##    probabilities: 0.608 0.257 0.108 0.014 0.014 0.000 
##   left son=8 (64 obs) right son=9 (10 obs)
##   Primary splits:
##       Ca < 10.405   to the left,  improve=7.996115, (0 missing)
##       Mg < 1.86     to the right, improve=5.826986, (0 missing)
##       RI < 1.522175 to the left,  improve=3.440622, (0 missing)
##       Si < 72.835   to the right, improve=2.163110, (0 missing)
##       Na < 13.315   to the left,  improve=1.889255, (0 missing)
##   Surrogate splits:
##       Mg < 1.86     to the right, agree=0.973, adj=0.8, (0 split)
##       RI < 1.522175 to the left,  agree=0.919, adj=0.4, (0 split)
##       Si < 71.3     to the right, agree=0.905, adj=0.3, (0 split)
##       K  < 0.01     to the right, agree=0.905, adj=0.3, (0 split)
##       Na < 11.695   to the right, agree=0.892, adj=0.2, (0 split)
## 
## Node number 5: 54 observations,    complexity param=0.08421053
##   predicted class=2  expected loss=0.3518519  P(node) =0.36
##     class counts:     4    35     2     8     4     1
##    probabilities: 0.074 0.648 0.037 0.148 0.074 0.019 
##   left son=10 (43 obs) right son=11 (11 obs)
##   Primary splits:
##       Mg < 1.985    to the right, improve=11.080810, (0 missing)
##       Ca < 9.635    to the left,  improve= 6.553535, (0 missing)
##       RI < 1.51874  to the left,  improve= 6.134921, (0 missing)
##       Na < 13.89    to the left,  improve= 3.401891, (0 missing)
##       K  < 0.385    to the right, improve= 3.357488, (0 missing)
##   Surrogate splits:
##       Ca < 9.9      to the left,  agree=0.926, adj=0.636, (0 split)
##       RI < 1.51874  to the left,  agree=0.870, adj=0.364, (0 split)
##       Al < 2.085    to the left,  agree=0.870, adj=0.364, (0 split)
##       Si < 73.375   to the left,  agree=0.852, adj=0.273, (0 split)
##       K  < 0.035    to the right, agree=0.833, adj=0.182, (0 split)
## 
## Node number 8: 64 observations,    complexity param=0.02105263
##   predicted class=1  expected loss=0.296875  P(node) =0.4266667
##     class counts:    45    11     8     0     0     0
##    probabilities: 0.703 0.172 0.125 0.000 0.000 0.000 
##   left son=16 (53 obs) right son=17 (11 obs)
##   Primary splits:
##       RI < 1.51707  to the right, improve=4.038218, (0 missing)
##       Fe < 0.115    to the left,  improve=3.014644, (0 missing)
##       Si < 72.92    to the right, improve=2.266321, (0 missing)
##       Ca < 8.425    to the right, improve=1.899159, (0 missing)
##       Mg < 3.755    to the left,  improve=1.352112, (0 missing)
##   Surrogate splits:
##       K  < 0.665    to the left,  agree=0.859, adj=0.182, (0 split)
##       Ca < 8.06     to the right, agree=0.844, adj=0.091, (0 split)
## 
## Node number 9: 10 observations
##   predicted class=2  expected loss=0.2  P(node) =0.06666667
##     class counts:     0     8     0     1     1     0
##    probabilities: 0.000 0.800 0.000 0.100 0.100 0.000 
## 
## Node number 10: 43 observations
##   predicted class=2  expected loss=0.1860465  P(node) =0.2866667
##     class counts:     4    35     2     0     1     1
##    probabilities: 0.093 0.814 0.047 0.000 0.023 0.023 
## 
## Node number 11: 11 observations
##   predicted class=5  expected loss=0.2727273  P(node) =0.07333333
##     class counts:     0     0     0     8     3     0
##    probabilities: 0.000 0.000 0.000 0.727 0.273 0.000 
## 
## Node number 16: 53 observations
##   predicted class=1  expected loss=0.2075472  P(node) =0.3533333
##     class counts:    42     8     3     0     0     0
##    probabilities: 0.792 0.151 0.057 0.000 0.000 0.000 
## 
## Node number 17: 11 observations
##   predicted class=3  expected loss=0.5454545  P(node) =0.07333333
##     class counts:     3     3     5     0     0     0
##    probabilities: 0.273 0.273 0.455 0.000 0.000 0.000
# Можем распечатать совокупность правил дерева, но они довольно громоздки


# Протестируем построенное дерево
# Теперь, когда дерево уже построено,
# номера классов (10-й столбец) нужно удалить
test_data <- test_data[-10]
# "Спрогнозируем" значение переменной отклика для тестовых данных
glass_pred <- predict(glass.tree,
                      test_data,
                      type="class")


# Для оценки качества прогноза подключим библиотеку gmodels
library(gmodels)
# Построим кросс-валидационную таблицу:
CrossTable(x = test_data_labels, y = glass_pred, prop.chisq=FALSE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  64 
## 
##  
##                  | glass_pred 
## test_data_labels |         1 |         2 |         3 |         5 |         7 | Row Total | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                1 |        18 |         2 |         0 |         0 |         0 |        20 | 
##                  |     0.900 |     0.100 |     0.000 |     0.000 |     0.000 |     0.312 | 
##                  |     0.562 |     0.133 |     0.000 |     0.000 |     0.000 |           | 
##                  |     0.281 |     0.031 |     0.000 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                2 |         9 |         9 |         1 |         2 |         0 |        21 | 
##                  |     0.429 |     0.429 |     0.048 |     0.095 |     0.000 |     0.328 | 
##                  |     0.281 |     0.600 |     0.200 |     0.400 |     0.000 |           | 
##                  |     0.141 |     0.141 |     0.016 |     0.031 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                3 |         3 |         2 |         2 |         0 |         0 |         7 | 
##                  |     0.429 |     0.286 |     0.286 |     0.000 |     0.000 |     0.109 | 
##                  |     0.094 |     0.133 |     0.400 |     0.000 |     0.000 |           | 
##                  |     0.047 |     0.031 |     0.031 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                5 |         0 |         0 |         0 |         3 |         1 |         4 | 
##                  |     0.000 |     0.000 |     0.000 |     0.750 |     0.250 |     0.062 | 
##                  |     0.000 |     0.000 |     0.000 |     0.600 |     0.143 |           | 
##                  |     0.000 |     0.000 |     0.000 |     0.047 |     0.016 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                6 |         1 |         2 |         1 |         0 |         0 |         4 | 
##                  |     0.250 |     0.500 |     0.250 |     0.000 |     0.000 |     0.062 | 
##                  |     0.031 |     0.133 |     0.200 |     0.000 |     0.000 |           | 
##                  |     0.016 |     0.031 |     0.016 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                7 |         1 |         0 |         1 |         0 |         6 |         8 | 
##                  |     0.125 |     0.000 |     0.125 |     0.000 |     0.750 |     0.125 | 
##                  |     0.031 |     0.000 |     0.200 |     0.000 |     0.857 |           | 
##                  |     0.016 |     0.000 |     0.016 |     0.000 |     0.094 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##     Column Total |        32 |        15 |         5 |         5 |         7 |        64 | 
##                  |     0.500 |     0.234 |     0.078 |     0.078 |     0.109 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
## 
## 
#Точность
Acc <- mean(glass_pred == test_data_labels)
paste("Точность=", round(100*Acc, 2), "%", sep = "")
## [1] "Точность=59.38%"
# Проведем эксперименты с новыми данными,
# для которых неизвестно значение фактора (класса)
# Данные для классификации хранятся в файле new_Glass.txt

# Считаем данные из файла
new_glasstest=read.table("D:/R/Tree/new_glass.txt", sep = ",", header = FALSE)
# Проверим размерность
dim(new_glasstest)
## [1] 30  9
# Проверим размерность
dim(new_glasstest)
## [1] 30  9
# Присвоим столбцам имена
colnames(new_glasstest)= c('RI','Na','Mg','Al','Si','K','Ca','Ba','Fe')
# Применим наше дерево решений для тестовых данных
new_glass_pred <- predict(glass.tree,
                          new_glasstest,
                          type="class")
new_glass_pred
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
##  1  3  2  1  2  2  2  2  2  1  2  2  3  2  1  3  3  5  5  5  5  5  2  1  2  7 
## 27 28 29 30 
##  7  7  7  7 
## Levels: 1 2 3 5 6 7
# Эти данные сравнивать нам не с чем!
#Осталось сравнить полученные результаты с результатами,
#полученными для той же выборки другими методами.


# Классификатор - Случайный лес
library(randomForest)
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
model <- randomForest(Type~., data = glassdata,  importance = TRUE)
model
## 
## Call:
##  randomForest(formula = Type ~ ., data = glassdata, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##           Mean of squared residuals: 0.9281945
##                     % Var explained: 78.93
#importance(model)

#tree1 <- getTree(model, 1, labelVar = TRUE)
#head(tree1)


##############################################################
glass.tree = rpart( Type ~., data = glassdata) # построение классификации
rpart.plot(glass.tree) # график

glass.tree = rpart( Type ~ Al+Ca, data = glassdata) # построение классификации
rpart.plot(glass.tree) # график

glass.tree = rpart( Type ~ Mg+Ca, data = glassdata) # построение классификации
rpart.plot(glass.tree) # график

glass.tree = rpart( Type ~ Mg+Al, data = glassdata) # построение классификации
rpart.plot(glass.tree) # график

##############################################################
# Классификатор - Наивный Байес
##############################################################
train_data = train_data[-10] 
# Подключим пакет e1071:
library(e1071)

# Вызовем наивный Байесовский классификатор:
classifierNB = naiveBayes(train_data, train_data_labels)
# Передаём обучающую выборку: факторы (train_data)
#и метки классов (train_data_labels)
# Определим ("спрогнозируем") метки для тестовых данных
data_test_pred = predict(classifierNB, test_data) 
# Передаём классификатор и тестовую выборку (только факторы, без меток)

# Для оценки качества прогноза построим кросс-валидационную таблицу:
CrossTable(x = test_data_labels, y = data_test_pred, prop.chisq=TRUE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## | Chi-square contribution |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  64 
## 
##  
##                  | data_test_pred 
## test_data_labels |         1 |         2 |         3 |         5 |         6 |         7 | Row Total | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##                1 |        16 |         0 |         3 |         0 |         1 |         0 |        20 | 
##                  |     1.433 |     0.625 |     0.675 |     1.562 |     0.900 |     1.562 |           | 
##                  |     0.800 |     0.000 |     0.150 |     0.000 |     0.050 |     0.000 |     0.312 | 
##                  |     0.421 |     0.000 |     0.500 |     0.000 |     0.125 |     0.000 |           | 
##                  |     0.250 |     0.000 |     0.047 |     0.000 |     0.016 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##                2 |        16 |         1 |         1 |         3 |         0 |         0 |        21 | 
##                  |     1.000 |     0.180 |     0.477 |     1.126 |     2.625 |     1.641 |           | 
##                  |     0.762 |     0.048 |     0.048 |     0.143 |     0.000 |     0.000 |     0.328 | 
##                  |     0.421 |     0.500 |     0.167 |     0.600 |     0.000 |     0.000 |           | 
##                  |     0.250 |     0.016 |     0.016 |     0.047 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##                3 |         5 |         0 |         2 |         0 |         0 |         0 |         7 | 
##                  |     0.171 |     0.219 |     2.751 |     0.547 |     0.875 |     0.547 |           | 
##                  |     0.714 |     0.000 |     0.286 |     0.000 |     0.000 |     0.000 |     0.109 | 
##                  |     0.132 |     0.000 |     0.333 |     0.000 |     0.000 |     0.000 |           | 
##                  |     0.078 |     0.000 |     0.031 |     0.000 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##                5 |         0 |         1 |         0 |         1 |         1 |         1 |         4 | 
##                  |     2.375 |     6.125 |     0.375 |     1.512 |     0.500 |     1.512 |           | 
##                  |     0.000 |     0.250 |     0.000 |     0.250 |     0.250 |     0.250 |     0.062 | 
##                  |     0.000 |     0.500 |     0.000 |     0.200 |     0.125 |     0.200 |           | 
##                  |     0.000 |     0.016 |     0.000 |     0.016 |     0.016 |     0.016 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##                6 |         0 |         0 |         0 |         0 |         4 |         0 |         4 | 
##                  |     2.375 |     0.125 |     0.375 |     0.312 |    24.500 |     0.312 |           | 
##                  |     0.000 |     0.000 |     0.000 |     0.000 |     1.000 |     0.000 |     0.062 | 
##                  |     0.000 |     0.000 |     0.000 |     0.000 |     0.500 |     0.000 |           | 
##                  |     0.000 |     0.000 |     0.000 |     0.000 |     0.062 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##                7 |         1 |         0 |         0 |         1 |         2 |         4 |         8 | 
##                  |     2.961 |     0.250 |     0.750 |     0.225 |     1.000 |    18.225 |           | 
##                  |     0.125 |     0.000 |     0.000 |     0.125 |     0.250 |     0.500 |     0.125 | 
##                  |     0.026 |     0.000 |     0.000 |     0.200 |     0.250 |     0.800 |           | 
##                  |     0.016 |     0.000 |     0.000 |     0.016 |     0.031 |     0.062 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
##     Column Total |        38 |         2 |         6 |         5 |         8 |         5 |        64 | 
##                  |     0.594 |     0.031 |     0.094 |     0.078 |     0.125 |     0.078 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
## 
## 
#Точность
Acc <- mean(data_test_pred == test_data_labels)
paste("Точность=", round(100*Acc, 2), "%", sep = "")
## [1] "Точность=43.75%"
##############################################################
# Классификатор - kNN
############################################################## 

library(class)
classifierkNN = knn(train = train_data, 
                    test = test_data, 
                    train_data_labels, k=12)


CrossTable(x = test_data_labels, y = classifierkNN, prop.chisq=TRUE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## | Chi-square contribution |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  64 
## 
##  
##                  | classifierkNN 
## test_data_labels |         1 |         2 |         3 |         5 |         7 | Row Total | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                1 |        16 |         4 |         0 |         0 |         0 |        20 | 
##                  |     4.113 |     1.202 |     0.312 |     1.250 |     1.875 |           | 
##                  |     0.800 |     0.200 |     0.000 |     0.000 |     0.000 |     0.312 | 
##                  |     0.516 |     0.182 |     0.000 |     0.000 |     0.000 |           | 
##                  |     0.250 |     0.062 |     0.000 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                2 |         6 |        13 |         0 |         2 |         0 |        21 | 
##                  |     1.711 |     4.630 |     0.328 |     0.360 |     1.969 |           | 
##                  |     0.286 |     0.619 |     0.000 |     0.095 |     0.000 |     0.328 | 
##                  |     0.194 |     0.591 |     0.000 |     0.500 |     0.000 |           | 
##                  |     0.094 |     0.203 |     0.000 |     0.031 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                3 |         5 |         1 |         1 |         0 |         0 |         7 | 
##                  |     0.764 |     0.822 |     7.252 |     0.438 |     0.656 |           | 
##                  |     0.714 |     0.143 |     0.143 |     0.000 |     0.000 |     0.109 | 
##                  |     0.161 |     0.045 |     1.000 |     0.000 |     0.000 |           | 
##                  |     0.078 |     0.016 |     0.016 |     0.000 |     0.000 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                5 |         0 |         1 |         0 |         2 |         1 |         4 | 
##                  |     1.938 |     0.102 |     0.062 |    12.250 |     1.042 |           | 
##                  |     0.000 |     0.250 |     0.000 |     0.500 |     0.250 |     0.062 | 
##                  |     0.000 |     0.045 |     0.000 |     0.500 |     0.167 |           | 
##                  |     0.000 |     0.016 |     0.000 |     0.031 |     0.016 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                6 |         3 |         0 |         0 |         0 |         1 |         4 | 
##                  |     0.583 |     1.375 |     0.062 |     0.250 |     1.042 |           | 
##                  |     0.750 |     0.000 |     0.000 |     0.000 |     0.250 |     0.062 | 
##                  |     0.097 |     0.000 |     0.000 |     0.000 |     0.167 |           | 
##                  |     0.047 |     0.000 |     0.000 |     0.000 |     0.016 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##                7 |         1 |         3 |         0 |         0 |         4 |         8 | 
##                  |     2.133 |     0.023 |     0.125 |     0.500 |    14.083 |           | 
##                  |     0.125 |     0.375 |     0.000 |     0.000 |     0.500 |     0.125 | 
##                  |     0.032 |     0.136 |     0.000 |     0.000 |     0.667 |           | 
##                  |     0.016 |     0.047 |     0.000 |     0.000 |     0.062 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
##     Column Total |        31 |        22 |         1 |         4 |         6 |        64 | 
##                  |     0.484 |     0.344 |     0.016 |     0.062 |     0.094 |           | 
## -----------------|-----------|-----------|-----------|-----------|-----------|-----------|
## 
## 
#Точность
Acc <- mean(classifierkNN == test_data_labels)
paste("Точность=", round(100*Acc, 2), "%", sep = "")
## [1] "Точность=56.25%"