Я знаю, что во многих случаях на него отвечали, но так как это зависит от набора данных, мне было интересно, есть ли простой способ найти наилучшее значение 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-значений.
Любая помощь действительно ценится !!!