SVM con gruppi di dimensioni diverse nei dati di allenamento


12

Sto cercando di creare un SVM dai dati di allenamento in cui un gruppo è rappresentato più dell'altro. Tuttavia, i gruppi saranno equamente rappresentati nei dati di prova finali. Pertanto, vorrei utilizzare il class.weightsparametro dell'interfaccia del e1071pacchetto R libsvmper bilanciare l'influenza dei due gruppi nei dati di allenamento.

Dato che non ero sicuro di come specificare questi pesi, ho impostato un piccolo test:

  1. Genera alcuni dati null (funzioni casuali; rapporto 2: 1 tra le etichette di gruppo)
  2. Adatta uno svm al class.weightsset di parametri.
  3. Prevedi un sacco di nuovi set di dati null e osserva le proporzioni della classe.
  4. Replicare più volte l'intero processo per diversi set di addestramento null.

Ecco il codice R che sto usando:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

Da tutta questa cosa mi aspettavo un output di ~ 0,5, tuttavia, non è quello che ho ottenuto:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

Il class.weightsparamter sta lavorando, una sorta di , come il peso mi minore a, più basso è rappresentato in questa simulazione (e se tralascio class.weightsritorna prossimo a 1) ... ma io non capisco perché semplicemente utilizzando pesi di 1: 2 ( per i dati di allenamento 2: 1) non mi porta fino al 50%.

Se sto fraintendendo gli SVM, qualcuno può spiegare questo punto? (o inviare alcuni riferimenti?)

Se sto sbagliando, qualcuno può dirmi il modo corretto di utilizzare il class.weightsparametro?

Potrebbe essere forse un bug? (Penso di no, dal momento che capisco che questo software e il libsvm sottostante sono abbastanza maturi)


Non ho esperienza con libsvm ma con LiblineaR, i pesi di classe sono cruciali. Se impostato correttamente, si ottengono risultati non ottimali se le lezioni sono fortemente squilibrate. Vorrei suggerire: ottenere un set di dati reale con classi sbilanciate e provare diversi valori di class.weights (in LiblineaR wi). LiblineaR è più veloce degli ordini di grandezza per un kernel lineare e ha anche penalizzato i metodi. Nella mia esperienza, prima trovi un peso decente in classe e poi ottimizzi C.
Marbel

Risposte:


7

Penso che possa dipendere dai valori di C e dal numero di schemi che hai. L'SVM tenta di trovare il margine massimo discriminante, quindi se si dispone di dati sparsi, è possibile che l'SVM possa trovare la soluzione del margine fisso senza che nessuno dei moltiplicatori di Lagrange raggiunga i propri limiti superiori (nel qual caso il rapporto delle penalità per ogni la classe è essenzialmente irrilevante in quanto i valori di allentamento sono piccoli o pari a zero. Prova ad aumentare il numero di schemi di allenamento e vedi se questo ha un effetto (in quanto ciò rende meno probabile che la soluzione del margine duro possa essere trovata all'interno dei vincoli del riquadro) .

Ancora più importante, i valori ottimali di C dipendono dai dati, non è possibile semplicemente impostarli su alcuni valori predeterminati, ma invece ottimizzarli minimizzando l'errore di esclusione o alcuni limiti di generalizzazione. Se si hanno classi squilibrate, è possibile correggere il rapporto dei valori per ciascuna classe e ottimizzare la penalità media su tutti i modelli.


Questo ha senso. Quando riduco il numero di funzioni e aumento il numero di osservazioni in questa simulazione, il valore di output si avvicina a 0,5. Tuttavia, non ci arriva mai del tutto, anche con 900 righe e solo 1 colonna.
John Colby,

Ovviamente su dati reali utilizzo sempre il caretpacchetto o la tune()funzione integrata per l'ottimizzazione dei parametri del modello, quindi mi piace in particolare la tua seconda idea su come gestirlo in pratica regolando lo schema di ricampionamento per favorire la classe di minoranza. Molto apprezzato.
John Colby,

felice che il suggerimento sia stato utile. C'è un documento sull'impostazione del rapporto ottimale che potrebbe anche essere utile theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Tuttavia, la correzione teorica ottimale non è sempre ottimale nella pratica, quindi i risultati migliori potrebbero in realtà si ottiene sintonizzando i due parametri C separati senza forzare un particolare rapporto, ma ponderando i modelli in base alla classe quando si valuta il criterio di selezione del modello "one-out-out".
Dikran Marsupial,

2
Aggiungo anche che oggigiorno tendo a usare la regressione della cresta del kernel piuttosto che gli SVM poiché non si hanno questo tipo di problemi contro-intuitivi a causa della discontinuità nella derivata della funzione di perdita. Abbastanza spesso se si sintonizza correttamente un SVM L2, si finisce con un valore molto piccolo di C e tutti i dati sono SV, a quel punto si ha comunque un modello KRR. Più li ho usati, meno utile ho trovato gli SVM in pratica, anche se le intuizioni teoriche che hanno portato sono state fondamentali.
Dikran Marsupial,

0

nella formazione svm trova vettori di supporto per creare un limite discriminatorio e quando ci sono abbastanza vettori di supporto per tutti i dati delle classi per farlo, non sarebbe un problema. nell'accuratezza dei risultati del set di test dovresti tenere conto della quantità di uguaglianza di dati per tutte le classi nel mondo reale e per ottenere risultati reali devi manipolare i dati così come vengono correttamente considerati nella situazione reale.


Questa risposta non è abbastanza chiara al momento - ho considerato di dargli una copia-modifica, ma ci sono molti posti in cui non ero sicuro di ciò che intendevi. La punteggiatura e il grammmar sono importanti per trasmettere significato.
Silverfish,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.