Dati multi-classe distorti


10

Ho un set di dati che contiene ~ 100.000 campioni di 50 classi. Ho usato SVM con un kernel RBF per addestrare e prevedere nuovi dati. Il problema però è che il set di dati è inclinato verso classi diverse.

Ad esempio, Classe 1 - 30 (~ 3% ciascuno), Classe 31 - 45 (~ 0,6% ciascuno), Classe 46 - 50 (~ 0,2% ciascuno)

Vedo che il modello tende a prevedere molto raramente le classi che si verificano meno frequentemente nel set di training, anche se il set di test ha la stessa distribuzione di classi del set di training.

Sono consapevole che esistono tecniche come il "sottocampionamento" in cui la classe di maggioranza è ridotta alla classe minore. Tuttavia, questo è applicabile qui dove ci sono così tante classi diverse? Ci sono altri metodi per aiutare a gestire questo caso?

Risposte:


5

Ti suggerirei di usare libsvm, che ha già implementato pesi di classe regolabili. Invece di replicare i campioni di addestramento, si modifica il parametro C per diverse classi nell'ottimizzazione SVM. Ad esempio, se i tuoi dati hanno 2 classi e la prima classe è solo il 10% dei dati, dovresti scegliere che i pesi delle classi siano 10 e 1 rispettivamente per la classe 1 e 2. Pertanto, le violazioni dei margini della prima classe costerebbero 10 volte di più rispetto alle violazioni dei margini per la seconda classe e le accuratezze per classe sarebbero più equilibrate.


grazie per il consiglio, sai se libsvm lo fa automaticamente o devo passare manualmente i pesi della classe?
mike1886,

Devi passare manualmente i pesi della classe. Il modo per farlo è diverso in base all'interfaccia che stai utilizzando (python, java, matlab, c). È ben documentato nei file Leggimi se si scarica lo strumento da csie.ntu.edu.tw/~cjlin/libsvm . Anche la dimensione dei tuoi dati sembra essere grande e l'implementazione multi-classe predefinita di libsvm utilizzerà la classificazione uno contro uno che potrebbe richiedere troppo tempo per l'esecuzione. Puoi provare ad allenare 50 classificatori binari uno contro tutti specificando i pesi in modo appropriato.
magicharp,

2

Non sono un'esportazione nell'uso di SVM, ma di solito (se stai usando una libreria di machine learning come Python scikit-learno R libsvm, c'è il class_weightparametro, o class.weights, rispettivamente.

O se dovessi usare un classificatore Bayes, dovresti prendere in considerazione questo "disallineamento" tramite le "probabilità (classe) precedenti" P (ω j )


1

Per quanto riguarda l'approccio, SVM con un kernel RBF fa un buon lavoro, ma le SVM possono essere rallentate da oggetti di grandi dimensioni, a meno che non si stia impiegando CV con ad esempio un decimo dei dati assegnati casualmente a ciascuna piega. Tuttavia, ti sei chiesto perché stai impiegando SVM in primo luogo?

Hai provato di regressione lineare multivariata, , in cui ogni record di è codificato se l' esimo oggetto è in classe e altrimenti? Se l'accuratezza della classificazione è notevolmente elevata utilizzando la regressione lineare, i dati sono separabili linearmente e non sono necessari metodi più complessi come SVM e ANN. Il passaggio 2 dovrebbe mostrare che il vicino k-più vicino, l'ingenua Bayes, l'analisi discriminante lineare (Fisher), la regressione logistica politomica, ecc., Si guastano e falliscono.Y=XβYyij=+1ijyij=1

Per quanto riguarda la terminologia, potresti porre il problema di avere più pesi di classe nel contesto di "proporzioni inferiori di oggetti in determinate classi" o "dimensioni della classe quasi zero". L'inclinazione tende ad essere usata per descrivere la distribuzione dei valori di una caratteristica, come in asimmetria, code grasse, ecc.

Quante funzionalità hai? Hai provato il clustering senza supervisione (rilevamento di classe) sui 100.000 oggetti prima di provare la classificazione supervisionata (previsione di classe) con SVM? Forse i 100.000 oggetti possono essere raggruppati in meno classi di 50, per le quali la nuova appartenenza alla classe potrebbe essere utilizzata come classe target durante l'analisi della classificazione. Ciò può alleviare il problema di avere una classe quasi zero.


1

Ho riscontrato questo problema molte volte durante l'utilizzo di SVM con il kernel Rbf. L'uso del kernel lineare anziché del kernel Rbf ha risolto il mio problema, ma ho gestito un numero minore di classi. I risultati sono stati meno distorti e più accurati con il kernel lineare. Spero che questo risolva il tuo problema.

Modifica: mentre scrivevo la risposta originale, ero abbastanza ingenuo da non considerare la ponderazione delle lezioni come una di esse rispondeva correttamente. Inoltre, durante l'utilizzo del kernel rbf è importante assicurarsi che il parametro di penalità o il valore 'C' secondo il modulo svm di sklearn sia troppo generico. Trovo che il valore predefinito di C = 1 sia troppo generico per la maggior parte del tempo e di solito finisco con un valore di C = 10000. Spero che questo aiuti gli altri che ottengono risultati distorti con svm (rbf) nonostante abbiano una buona distribuzione delle classi nei dati.


Grazie per la risposta! In realtà ho provato numerosi altri algoritmi / kernel e ho ancora lo stesso tipo di problema. Quindi sto cercando più di un approccio come il sottocampionamento o un modo per uniformare le lezioni.
mike1886,

Ok, potresti anche provare a replicare le righe per le classi che contengono dati sparsi, anche se è utile solo se le funzionalità dei dati sparsi sono davvero buone.
user776193
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.