Kernlab,选定变量的用户定义内核

时间:2019-04-13 14:28:02

标签: r user-defined-functions kernlab

我想制作一个用户定义的内核,在内核中使用不同的变量并将其组合。有人知道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,即第二个变量的平方指数内核加上平方exp。数据集中第三个变量的内核。

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 

0 个答案:

没有答案