3 votos

El uso de SparseM/Matrix Sparse Matrix en el entrenamiento de SVM de e1071 devuelve resultados diferentes de los mismos datos en la matriz estándar

El uso de objetos de matriz dispersa en el entrenamiento de svm en e1071 devuelve resultados diferentes a los de la ejecución de los mismos datos representados como matriz estándar:

library(e1071)
library(Matrix)
library(SparseM)
m=10
n=800
#means <- colMeans(myData)
#stdDevs <- apply(myData, 2, sd)
means <- c(0.042154664, 0.010474473, 0.106408354, 0.002237226, 0.089791084, 
0.072792224, 0.001884146, 0.002925725, 0.010788693, 0.151466160)
stdDevs <- c(0.017026132, 0.012720986, 0.026721416, 0.004810966, 0.026454962, 
0.025349870, 0.004165095, 0.005573776, 0.009063219, 0.036368062)
clss = rep(0,n)
clss[sample(1:n,n/2)] <- 1
clss <- factor(clss)
ftrs <- matrix(nrow=n,ncol=m)
for (i in seq(m)){ftrs[,i] <- rnorm(n,means[i],stdDevs[i])}
ftrs[ftrs<0] <- 0
for (i in seq(m)){ftrs[sample(1:n,(n/10)),i]<-0}
ftrs.csr <- as.matrix.csr(ftrs)
ftrs.Mtrx <- Matrix(ftrs, sparse=TRUE)
mod1 <- svm(ftrs,clss, kernel='linear')
mod2 <- svm(ftrs.csr,clss, kernel='linear')
mod3 <- svm(ftrs.Mtrx,clss, kernel='linear')
prf(data.frame(fitted(mod1),clss))
prf(data.frame(fitted(mod2),clss))
prf(data.frame(fitted(mod3),clss))

El código anterior simula un subconjunto de uno de mis conjuntos de características con bastante exactitud, y si se ejecuta repetidamente, los resultados del prf serán a veces muy cercanos y a veces muy diferentes, es decir, pero nunca coinciden:

> prf(data.frame(fitted(mod1),clss))
         Acc   P_0       R_0       F_0    P_1       R_1       F_1
[1,] 0.52125 0.675 0.5162524 0.5850488 0.3675 0.5306859 0.4342688
> prf(data.frame(fitted(mod2),clss))
        Acc   P_0       R_0       F_0  P_1       R_1       F_1
[1,] 0.5025 0.775 0.5016181 0.6090373 0.23 0.5054945 0.3161512
> prf(data.frame(fitted(mod3),clss))
        Acc   P_0       R_0       F_0  P_1       R_1       F_1
[1,] 0.5025 0.775 0.5016181 0.6090373 0.23 0.5054945 0.3161512

> prf(data.frame(fitted(mod1),clss))
       Acc  P_0      R_0     F_0  P_1       R_1      F_1
[1,] 0.545 0.61 0.539823 0.57277 0.48 0.5517241 0.513369
> prf(data.frame(fitted(mod2),clss))
         Acc    P_0       R_0       F_0   P_1    R_1       F_1
[1,] 0.50375 0.2225 0.5085714 0.3095652 0.785 0.5024 0.6126829
> prf(data.frame(fitted(mod3),clss))
         Acc    P_0       R_0       F_0   P_1    R_1       F_1
[1,] 0.50375 0.2225 0.5085714 0.3095652 0.785 0.5024 0.6126829

¿Es algo que estoy haciendo incorrectamente? ¿O es que el entrenamiento con representaciones matriciales dispersas es más inexacto?

Gracias, Rob

Función prf:

prf <- function(predAct){
    ## predAct is two col dataframe of pred,act
    preds = predAct[,1]
    trues = predAct[,2]
    xTab <- table(preds, trues)
    clss <- as.character(sort(unique(preds)))
    r <- matrix(NA, ncol = 7, nrow = 1, 
        dimnames = list(c(),c('Acc',
        paste("P",clss[1],sep='_'), 
        paste("R",clss[1],sep='_'), 
        paste("F",clss[1],sep='_'), 
        paste("P",clss[2],sep='_'), 
        paste("R",clss[2],sep='_'), 
        paste("F",clss[2],sep='_'))))
    r[1,1] <- sum(xTab[1,1],xTab[2,2])/sum(xTab) # Accuracy
    r[1,2] <- xTab[1,1]/sum(xTab[,1]) # Miss Precision
    r[1,3] <- xTab[1,1]/sum(xTab[1,]) # Miss Recall
    r[1,4] <- (2*r[1,2]*r[1,3])/sum(r[1,2],r[1,3]) # Miss F
    r[1,5] <- xTab[2,2]/sum(xTab[,2]) # Hit Precision
    r[1,6] <- xTab[2,2]/sum(xTab[2,]) # Hit Recall
    r[1,7] <- (2*r[1,5]*r[1,6])/sum(r[1,5],r[1,6]) # Hit F
    r}

5voto

Martin O'Leary Puntos 2046

El scale parámetro de svm por defecto es verdadero en general, pero falso en el caso de entrada dispersa. Si establece manualmente scale=F para el enfoque de la matriz densa, obtendrá los mismos resultados que en el caso disperso. Desgraciadamente, no hay forma de utilizar el escalado con datos de entrada dispersos, ya que en general la matriz de entrada escalada ya no es dispersa.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X