Kernlab, пользовательское ядро ​​для выбранных переменных - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу создать пользовательское ядро ​​с разными переменными в ядре и объединить их.Кто-нибудь знает, возможно ли это с помощью kernlab или что не так с моим кодом?

Я использую следующие пакеты:

install.packages("caret")
library(caret)
install.packages("kernlab")
library(kernlab)
install.packages("mlbench")
library(mlbench)
data(BreastCancer)

Некоторая очистка данных:

na_index <- which(is.na(BreastCancer[,7]))
BreastCancer <- BreastCancer[-na_index, ]
BreastCancer <- BreastCancer[,-1]

Скажем, я пишу квадратное экспоненциальное ядро ​​(с lengthscale = 1).

k_se_a <- function(x, y){
  res <- exp(-0.5*sum((x - y)^2))
  return(res)
}
class(k_se_a) <- "kernel"

model_0 <- gausspr(Class ~ Cell.size, data = BreastCancer, kernel = k_se_a)
pre_gp <- predict(model_0, BreastCancer[,-10])
conf_0 <- confusionMatrix(pre_gp, BreastCancer$Class, positive = "malignant")
conf_0$byClass[1]
# Sensitivity 
# 0.9497908 

Здесь я обучил модель только одной переменной Cell.size, второй переменной в наборе данных.

Теперь я пытаюсь получить тот же результат, чувствительность = 0,9498, но изменяя пользовательское ядро ​​вместо явной записи его в функцию gausspr().

k_se_b <- function(x, y){
  res <- exp(-0.5*sum((x[c(2,10)] - y[c(2,10)])^2))
  return(res)
}
class(k_se_b) <- "kernel"

model_1 <- gausspr(Class ~ ., data = BreastCancer, kernel = k_se_b)
pre_gp <- predict(model_1, BreastCancer[,-10])
conf_1 <- confusionMatrix(pre_gp, BreastCancer$Class, positive = "malignant")
conf_1$byClass[1]
# Sensitivity 
# 0.2887029 

В результате получается значение 0,2887, а не 0,9498, которое я хотел.Причина, по которой я это делаю, заключается в том, что я хочу объединить ядра с разными переменными, чтобы, например, у меня было выражение ядра SE_2 + SE_3, квадратное экспоненциальное ядро ​​для второй переменной плюс квадратное выражение.ядро на третьей переменной в наборе данных.

k_se_c <- function(x, y){
  res <- exp(-0.5*sum((x[c(2,10)] - y[c(2,10)])^2))+
    exp(-0.5*sum((x[c(3,10)] - y[c(3,10)])^2))
  return(res)
}
class(k_se_c) <- "kernel"

model_2 <- gausspr(Class ~ ., data = BreastCancer, kernel = k_se_c)
pre_gp <- predict(model_2, BreastCancer[,-10])
conf_2 <- confusionMatrix(pre_gp, BreastCancer$Class, positive = "malignant")
conf_2$byClass[1]
#Sensitivity 
#  0.2887029 
...