Tôi đang cố gắng sử dụng tổn thất bình phương để phân loại nhị phân trên tập dữ liệu đồ chơi.
Tôi đang sử dụng mtcars
tập dữ liệu, sử dụng dặm trên mỗi gallon và trọng lượng để dự đoán loại truyền. Biểu đồ bên dưới hiển thị hai loại dữ liệu loại truyền có màu khác nhau và ranh giới quyết định được tạo bởi chức năng mất khác nhau. Sự mất mát bình phương là
nơi là nhãn thực địa (0 hoặc 1) và là dự đoán khả . Nói cách khác, tôi thay thế mất logistic bằng mất bình phương trong cài đặt phân loại, các phần khác đều giống nhau.
Đối với một ví dụ đồ chơi có mtcars
dữ liệu, trong nhiều trường hợp, tôi đã có một mô hình "tương tự" với hồi quy logistic (xem hình dưới đây, với hạt giống ngẫu nhiên 0).
Nhưng trong một số thời điểm (nếu chúng ta làm set.seed(1)
), mất bình phương dường như không hoạt động tốt.
Chuyện gì đang xảy ra ở đây? Tối ưu hóa không hội tụ? Mất logistic dễ dàng hơn để tối ưu hóa so với mất bình phương? Bất kỳ trợ giúp sẽ được đánh giá cao.
Mã
d=mtcars[,c("am","mpg","wt")]
plot(d$mpg,d$wt,col=factor(d$am))
lg_fit=glm(am~.,d, family = binomial())
abline(-lg_fit$coefficients[1]/lg_fit$coefficients[3],
-lg_fit$coefficients[2]/lg_fit$coefficients[3])
grid()
# sq loss
lossSqOnBinary<-function(x,y,w){
p=plogis(x %*% w)
return(sum((y-p)^2))
}
# ----------------------------------------------------------------
# note, this random seed is important for squared loss work
# ----------------------------------------------------------------
set.seed(0)
x0=runif(3)
x=as.matrix(cbind(1,d[,2:3]))
y=d$am
opt=optim(x0, lossSqOnBinary, method="BFGS", x=x,y=y)
abline(-opt$par[1]/opt$par[3],
-opt$par[2]/opt$par[3], lty=2)
legend(25,5,c("logisitc loss","squared loss"), lty=c(1,2))
optim
nói với bạn rằng nó chưa kết thúc, đó là tất cả: nó đang hội tụ. Bạn có thể học được rất nhiều bằng cách chạy lại mã của bạn với đối số bổ sung control=list(maxit=10000)
, vẽ sơ đồ mức độ phù hợp của nó và so sánh các hệ số của nó với mã gốc.