我想制作一个用户定义的内核,在内核中使用不同的变量并将其组合。有人知道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