Lojistik lojistik regresyon alternatifleri


55

Lojistik regresyon ile aynı görevi yapan birçok algoritma istiyorum. Bu, bazı açıklayıcı değişken (X) ile ikili bir yanıt (Y) için bir tahmin verebilecek algoritmalar / modellerdir.

Algoritmayı adlandırdıktan sonra, R'de nasıl uygulanacağını gösterirseniz sevinirim: İşte diğer modellerle güncellenebilecek bir kod:

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial)
plot(y~x)
abline(lm(y~x), col='red', lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx, yy, col='blue', lwd=5, lty=2)
title(main='Logistic regression with the "glm" function')

Sabit bir yordayıcı kümesi düşündüğünüzü varsaymak zorunda mıyız, yani tahminleri için güvenilir bir tahmin almakla ilgileniyor musunuz , yoksa da bir tür ? X jkXj(j=1k)
chl

Kişisel çıkarlarım için cezalandırmanın gerekli olmayacağını ve buradaki bilgi uğruna her ikisinin de ilgili cevaplar olduğunu söyleyebilirim :)
Tal Galili 11

Gelecekte başvurmak için: bu soruyu CW olmayan bir soru olarak kabul etmemizi sağlayacak şekilde ifade etmiş olabilirsiniz. Bkz meta.stats.stackexchange.com/questions/290/...
Shane

Shane bağlantısı için teşekkürler. Orada açtığın çok ilginç bir tartışma. Thomasas cevabını okuduktan sonra, bunun hala bir topluluk wiki olması gerektiğine inanıyorum, çünkü niyetim mümkün olduğu kadar çok alternatif bulmaktı (herhangi bir kişinin sağlayabileceği şüpheli bir şey). Yine de, beni bu konuya yönlendirdiğin için teşekkürler!
Tal Galili

Bu gerçekten cevap verilemeyecek kadar geniş değil - şu anda 6 yanıtı var (5 oy verildi). Dahası, soru son derece olumlu ve çokça etkilendi ve CW. Açık kalmalı IMO.
gung - Reinstate Monica

Yanıtlar:


28

Şu anda popüler olan rastgeleForest ve gbm (makine öğrenme literatüründe MART veya Gradient Boost olarak adlandırılır), basit ağaçlar için rpart. Ayrıca popüler olan MAP'yi düzenlileştirme için öncelikli kullanan bayesglm'dir.

install.packages(c("randomForest", "gbm", "rpart", "arm"))

library(randomForest)
library(gbm)
library(rpart)
library(arm)

r1 <- randomForest(y~x)
r2 <- gbm(y~x)
r3 <- rpart(y~x)
r4 <- bayesglm(y ~ x, family=binomial)

yy1 <- predict(r1, data.frame(x=xx))
yy2 <- predict(r2, data.frame(x=xx))
yy3 <- predict(r3, data.frame(x=xx))
yy4 <- predict(r4, data.frame(x=xx), type="response")

24

Aslında, bu ne elde etmek istediğine bağlı. Yalnızca tahminler için lojistik regresyon gerçekleştirirseniz, verilerinize uygun herhangi bir denetimli sınıflandırma yöntemini kullanabilirsiniz. Başka bir olasılık: MASS paketinden diskriminant analizi (lda () ve qda ())

r <- lda(y~x) # use qda() for quadratic discriminant analysis

xx <- seq(min(x), max(x), length=100)
pred <- predict(r, data.frame(x=xx), type='response')
yy <- pred$posterior[,2]

color <- c("red","blue")

plot(y~x,pch=19,col=color[pred$class])
abline(lm(y~x),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='lda implementation')

Öte yandan, tahminlerinizle ilgili güven aralıklarına veya tahminlerinizdeki standart hatalara ihtiyacınız varsa, çoğu sınıflandırma algoritması size yardımcı olmayacaktır. Çok sayıda paketin mevcut olduğu genelleştirilmiş katkı (karma) modelleri kullanabilirsiniz. Sık sık Simon Wood'un mgcv paketini kullanırım. Genelleştirilmiş katkı modelleri, tahminlerinizi modellemek için spline kullanabildiğiniz için lojistik regresyondan daha fazla esneklik sağlar.

set.seed(55)
require(mgcv)
n <- 100
x1 <- c(rnorm(n), 1+rnorm(n))
x2 <- sqrt(c(rnorm(n,4),rnorm(n,6)))
y <- c(rep(0,n), rep(1,n))
r <- gam(y~s(x1)+s(x2),family=binomial)

xx <- seq(min(x1), max(x1), length=100)
xxx <- seq(min(x2), max(x2), length=100)
yy <- predict(r, data.frame(x1=xx,x2=xxx), type='response')

color=c("red","blue")
clustering <- ifelse(r$fitted.values < 0.5,1,2)

plot(y~x1,pch=19,col=color[clustering])
abline(lm(y~x1),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='gam implementation')

Yapacak daha çok şey var:

op <- par(mfrow=c(2,1))
plot(r,all.terms=T)
par(op)

summary(r)
anova(r)

r2 <- gam(y~s(x1),family=binomial)
anova(r,r2,test="Chisq")

...

Genelleştirilmiş Katkı Modelleri hakkında Simon Wood kitabını tavsiye ederim


14

Joe ile aynı fikirdeyim ve şunu ekleyeceğim:

Verilere / duruma bağlı olmasına rağmen, herhangi bir sınıflandırma yöntemi prensipte kullanılabilir. Örneğin, muhtemelen popüler C-SVM modeliyle bir SVM kullanabilirsiniz. İşte radyal temelde çekirdek işlevi kullanan kernlab'den bir örnek:

library(kernlab)
x <- rbind(matrix(rnorm(120),,2),matrix(rnorm(120,mean=3),,2))
y <- matrix(c(rep(1,60),rep(-1,60)))

svp <- ksvm(x,y,type="C-svc")
plot(svp,data=x)

12

Hediye paketi ile eğitilebilen yaklaşık 100 sınıflandırma ve regresyon modeli bulunmaktadır . Sınıflandırma modellerinden herhangi biri sizin için bir seçenek olacaktır (sürekli yanıt gerektiren regresyon modellerinin aksine). Örneğin rastgele bir orman yetiştirmek için:

library(caret)
train(response~., data, method="rf")

Mevcut modellerin tam listesi için dağıtımla birlikte verilen şapka modeli eğitim skeçine bakın. İki kullanımlı ve sınıflandırma modellerine (her ikisini de kullanabilirsiniz) ve sadece regresyona (ki bu kullanamazsınız) ayrılmıştır. caret sizin seçtiğiniz modelin parametrelerini otomatik olarak eğitecektir.


7

Naive Bayes, ikili bir cevap bulmak için iyi ve basit bir eğitim verisidir.

library(e1071)
fitNB <- naiveBayes(y~x)
predict(fitNB, x)

3

Lojistik regresyonda henüz belirtilmemiş iki varyasyon vardır. İlk olarak, lojistik regresyon, kümülativ bir lojistik dağılım (lojistik olarak da bilinir) olan lojistik bir fonksiyon kullanarak olasılıkları tahmin eder. Diğer dağılımlardan türetilen işlevleri kullanarak olasılıkları da tahmin edebilirsiniz. Lojistik regresyondan ayrı olarak en yaygın yol, normal dağılımdan türetilmiş probit regresyonudur. Probit ve logit farklılıkları arasındaki daha ayrıntılı bir tartışma için lütfen aşağıdaki siteyi ziyaret edin.

Logit ve probit modelleri arasındaki fark

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial(link="probit"))
plot(y~x)
abline(lm(y~x),col='red',lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx,yy, col='red', lwd=5, lty=2)
title(main='Probit regression with the "glm" function')

İkinci alternatif, uyguladığınız lojistik fonksiyonun bir haftalığına işaret ediyor. Küçük bir örneklem büyüklüğüne ve / veya eksik değerlere sahipseniz lojistik fonksiyon önerilmez. Dolayısıyla tam bir lojistik regresyon daha iyi bir modeldir. Sonucun log oranları, yordayıcı değişkenlerinin doğrusal bir birleşimi olarak modellenmiştir.

elrm(formula = y ~ x)

Ayrıca belirtilmesi gereken başka alternatifler de var:

  1. İki yönlü beklenmedik durum tablosu
  2. İki grup ayırıcı fonksiyon analizi.
  3. Otelcilik T2.

Son söz: Lojistik regresyon, gizli katmanlara sahip olmayan küçük bir sinir ağı ve son katmanda sadece bir nokta ile aynıdır. Bu nedenle nnet, R'deki gibi sinir ağı paketlerinin uygulamalarını kullanabilirsiniz .

Düzenle:

Birkaç hafta sonra Winnow ve Perceptron algoritmasının da olduğunu anladım . Her ikisi de sınıflandırma için iki gruba ayrılan sınıflayıcılardır, ancak her ikisi de son 15 yıl içinde lehine düştü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.