我想对二元分类问题进行逻辑回归,该问题可预测泰坦尼克号毒蛇是否幸存。这是keggle.com的泰坦尼克号比赛。我有一个混合数据,所以我有一些分类变量和连续变量。
我使用glm并获得了理想的结果。我的准确度是0.76。
glm.fit <- glm("Survived ~ Embarked.Q + Embarked.S + Fare + Parch + SibSp + Age + Sex.male + Pclass.3 + Pclass.2",
data = dummified_train, family = binomial)
但是,出于实践目的,我想手动进行此优化,并且还添加了正则化以获得更好的结果。至少看看正则化如何影响准确性。所以我做了以下事情:
首先,我编写了S型,成本和梯度函数。
sigmoid = function(x,par) {
#theta nx1 column vector of parameters
#x mxn matrix
#n is the number of features
#m is the number of obs
1/(1+exp(-as.matrix(x)%*%par))
}
#X mxn matrix of obs
#y target vector
#theta nx1 vector of parameters
#lambda regularization parameter
costreg <- function(x,y,par,lambda) {
m <- dim(x)[1]
n <- dim(x)[2]
J <- 0
temptheta <- par
temptheta[1] <- 0
for (i in 1:m){
J <- J - y[i,] * log(sigmoid(x[i,],par)) - (1-y[i,])*log(sigmoid(x[i,],par))
}
J <- (J + lambda/2*sum(temptheta^2))/m
return(J)
gradreg <- function(x,y,par,lambda) {
m <- dim(x)[1]
grad = rep(0, length(par))
temptheta <- par
temptheta[1] <- 0
names(x) <- NULL
grad <- (1/m)*(t(as.matrix(x)) %*% (sigmoid(as.matrix(x),par)-as.matrix(y)) +lambda/m*temptheta)
}
我对变量进行了预处理和虚拟化。这是我的数据的样子:https://imgur.com/a/LuPBEbd
当我将glm fit参数用作初始参数并将正则化项lambda设置为0时,我期望对glm产生的激活类似。我使用优化函数优化参数。
result <- optim(par = init_param, fn = costreg, gr = gradreg, x= dummified_train, y = train_target, lambda = 0, method = "BFGS" )
但是,我什至得到了负面的激活,而且我的结果没有任何意义。我看不到我在做什么错。任何帮助或评论表示赞赏。