Выбор значения K в KNN с использованием простого набора данных в R - PullRequest
0 голосов
/ 30 января 2019

Я знаю, что во многих случаях на него отвечали, но так как это зависит от набора данных, мне было интересно, есть ли простой способ найти наилучшее значение K в алгоритме KNN с использованием относительно простого набора данных.

Моя переменная ответа - это поведенческий класс (столбец E: Событие), а мои переменные-предикторы - это три оси датчика активности (столбцы B-D).Вот пример того, как выглядят мои данные.

Найдите ниже код, который я написал для запуска моего анализа knn.Объект datanet выглядит так же, как пример загруженного мной изображения.Я использую первые 150 строк в качестве обучения, а остальные [151-240] строк в качестве тестирования.

В этом случае я использовал K-значение 10, но после запуска сценария дляразные K-значения Я, очевидно, получаю разные выходные данные, поэтому мне было интересно, как лучше выбрать K-значение, наиболее подходящее для моего набора данных.Специально, мне нужна помощь для кодирования этого в R.

library(data.table)

#From the file "Collar_#.txt", just select the columns ACTIVITY_X, ACTIVITY_Y, ACTIVITY_Z and Event
dataraw<-fread("Collar_41361.txt", select = c("ACTIVITY_X","ACTIVITY_Y","ACTIVITY_Z","Event"))

#Now, delete all rows containg the string "End"
datanet<-dataraw[!grepl("End", dataraw$Event),]

#Then, read only the columns ACTIVITY_X, ACTIVITY_Y and ACTIVITY_Z for a selected interval that will act as a trainning set
trainset <- datanet[1:150, !"Event"]
View(trainset)

#Create the behavioural classes. Note that the number of rows should be in the same interval as the trainset dataset
behaviour<-datanet[1:150,!1:3]
View(behaviour)

#Test file. This file contains sensor data only, and behaviours would be associated based on the trainset and behaviour datasets
testset<-datanet[151:240,!"Event"]
View(testset)

#Converting inputs into matrix
train = as.matrix(trainset, byrow = T, ncol=3)
test = as.matrix(testset, byrow = T, ncol=3)
classes=as.matrix(behaviour,byrow=T,ncol=1)

library(stats)
library(class)

#Now running the algorithm. But first we set the k value.

for kk=10

kn1 = knn(train, test, classes, k=kk, prob=TRUE)

prob = attributes(.Last.value)
clas1=factor(kn1)

#Write results, this is the classification of the testing set in a single column
filename = paste("results", kk, ".csv", sep="")
write.csv(clas1, filename)

#Write probs to file, this is the proportion of k nearest datapoints that contributed to the winning class
fileprobs = paste("probs", kk, ".csv", sep="")
write.csv (prob$prob, fileprobs)

Я также загружаю образец изображение вывода моего скрипта.См. В столбце D «реальный поведенческий класс» для значений в столбцах от A до C, а в столбцах E, G, I, K, M и O - классы, назначенные алгоритмом на основе обучения из строк [1:150], для различных K-значений.

Любая помощь действительно ценится !!!

1 Ответ

0 голосов
/ 30 января 2019

Найти K - непростая миссия в KNN. Небольшое значение K означает, что шум будет иметь большее влияние на результат, а большое значение сделает его вычислительно дорогим.

Iобычно видят людей, использующих: K = SQRT(N).Но, если вы не хотите находить лучше K для своего кенарио, используйте KNN из пакета Carret, вот один пример:

library(ISLR)
library(caret)

# Split the data:
data(iris)
indxTrain <- createDataPartition(y = iris$Sepal.Length,p = 0.75,list = FALSE)
training <- iris[indxTrain,]
testing <- iris[-indxTrain,]

# Run k-NN:
set.seed(400)
ctrl <- trainControl(method="repeatedcv",repeats = 3)
knnFit <- train(Species ~ ., data = training, method = "knn", trControl = ctrl, preProcess = c("center","scale"),tuneLength = 20)
knnFit

#Use plots to see optimal number of clusters:
#Plotting yields Number of Neighbours Vs accuracy (based on repeated cross validation)
plot(knnFit)

enter image description here

Это показывает, что 5 имеет самый высокий уровень точности, поэтому значение K равно 5.

...