Я применяю функцию k Nearest Neighbors (k-NN) к набору данных для различных значений k.
Я хочу создать максимально динамичный документ, чтобы его можно было легко использовать для других данных и других значений k.
Я применяю функцию knn в цикле for для различных значений k и сохраняю результаты в переменных, названных в соответствии с k (я покажу код ниже).
Проблема возникает, когда я хочу повторить этот шаблон кода и использовать выходные данные функции knn для получения вероятностей, а также дать имя в соответствии с k, когда я запускаю цикл for.
Данные:
data_train
и data_test
- это фреймы данных со следующей структурой:
v1 v2 v3 v4 v5
1 1 0 1 0 1
2 0 1 1 0 1
3 1 1 1 1 1
4 0 1 1 0 0
5 1 0 1 0 1
train lab
является фактором: "+" "+" "-" "-" "-"
Это код, который работает для применения функции knn()
:
# Using function knn() from class
# the values in ks must have been defined at the top of the document
ks = c(3, 5, 7)
test_pred_names = c()
for (k in ks){
# Assigning different variable names according to kc
test_pred<-paste("test_pred_", k, sep = "")
# Including the argument prob=TRUE outputs the probabilities of the predicted class together with the predicted class for each test case
# Assigning the test_pred name to the output of knn
print(assign(test_pred, knn(train=data_train, test=data_test, cl=train_lab, k, prob = TRUE)))
# Storing the names of the variables for each knn output
test_pred_names = c(test_pred_names, test_pred)
}
# Storing the outputs of knn in a vector under the names defined in test_pred_names
test_preds <-mget(test_pred_names, envir = globalenv())
Затем я использую результаты в test_preds
, чтобы получить вектор только с частью вывода из knn
, вероятности:
test_prob_names = c()
# Extracting the probabilities for each of the outputs of knn
for (test_pred in test_preds){
# assign different variable names according to k
print(a = names(test_pred)) # this returns NULL
# Assigning the test_prob name to the output of attr
print(test_prob<-paste("prob_",a, sep = "")) # this returns "prob_"
print(assign(test_prob, attr(test_pred, "prob")))
test_prob_names = c(test_prob_names, test_prob)
}
Ожидаемый результат:
test_prob_names
> "prob_test_pred_3", "prob_test_pred_5", "prob_test_pred_7"
Фактический результат:
Я получаю желаемый результат (вероятности), но не имена переменных.
test_pred_names
> "test_pred_3", "test_pred_5", "test_pred_7"
test_prob_names
> "prob_", "prob_", "prob_"
Если я просто запусту это вне цикла:
names(test_preds)
> "test_pred_3", "test_pred_5", "test_pred_7"
(Другой комментарий: на самом деле я бы предпочел вырезать имена и использовать только число в "test_pred_5", чтобы имена переменных были похожи на "test_prob_5", но это был мой первый подход).