# Для анализа были взяты из репозитория:
# 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%"