9

Sto cercando qui alcune indicazioni esperte su quale sia l'approccio migliore per risolvere un problema. Ho studiato alcuni sistemi di apprendimento automatico, reti neurali e cose del genere. Ho studiato weka, una sorta di soluzione baesiana .. R .. molte cose diverse. Non sono sicuro di come procedere, comunque. Ecco il mio problemaIl miglior approccio a quello che ritengo sia un problema di apprendimento automatico

Ho o avrà una vasta collezione di eventi .. alla fine circa 100.000 circa. Ogni evento consiste di diverse variabili indipendenti (30-50) e 1 variabile dipendente a cui tengo. Alcune variabili indipendenti sono più importanti di altre nel determinare il valore della variabile dipendente. E questi eventi sono rilevanti nel tempo. Le cose che accadono oggi sono più importanti degli eventi accaduti 10 anni fa.

Mi piacerebbe essere in grado di alimentare un qualche tipo di motore di apprendimento un evento, e farlo predire la variabile dipendente. Quindi, conoscendo la vera risposta per la variabile dipendente per questo evento (e per tutti gli eventi precedenti), mi piacerebbe che si formassero ulteriori ipotesi.

Una volta che ho un'idea di quale direzione di programmazione andare, posso fare la ricerca e capire come trasformare la mia idea in codice. Ma il mio background è in programmazione parallela e non roba del genere, quindi mi piacerebbe avere alcuni suggerimenti e indicazioni su questo.

Grazie!

Modifica: ecco alcuni dettagli in più sul problema che sto cercando di risolvere: si tratta di un problema di prezzo. Diciamo che voglio fare previsioni sui prezzi di un fumetto a caso. Il prezzo è l'unica cosa a cui tengo. Ma ci sono molte variabili indipendenti che si potrebbero creare. È un fumetto di Superman o un fumetto di Hello Kitty. Quanti anni ha? Qual è la condizione? ecc. ecc. Dopo essermi allenato per un po ', voglio essere in grado di dargli informazioni su un libro di fumetti che potrei prendere in considerazione, e di darmi un ragionevole valore atteso per il fumetto. OK. Quindi i fumetti potrebbero essere un falso esempio. Ma hai un'idea generale. Finora, dalle risposte, sto facendo qualche ricerca su Support vector machines e Naive Bayes. Grazie per tutto il tuo aiuto finora.

+1

Penso che il tag "classificazione" e "regressione" si escludano a vicenda. È o "classificazione", o è "regressione". Non può essere entrambi. –

risposta

1

Se si dispone di alcuni dati classificati - una serie di problemi di esempio accoppiati con le risposte corrette -, iniziare allenando alcuni semplici algoritmi come K-Nearest-Neighbor e Perceptron e vedendo se ne esce fuori qualcosa di significativo. Non preoccuparti di cercare di risolverlo in modo ottimale finché non sai se puoi risolverlo semplicemente o affatto.

Se non si dispone di dati classificati, o non molto, avviare la ricerca di algoritmi di apprendimento senza supervisione.

8

Sembra che tu sia un candidato per Support Vector Machines.

Go get libsvm. Leggi "Una guida pratica alla classificazione SVM", che distribuiscono, ed è breve.

In sostanza, si sta andando a prendere i vostri eventi e formattare di loro come:

dv1 1:iv1_1 2:iv1_2 3:iv1_3 4:iv1_4 ... 
dv2 1:iv2_1 2:iv2_2 3:iv2_3 4:iv2_4 ... 

corsa attraverso la loro utilità SVM-scala, e quindi utilizzare il loro scritto grid.py per cercare gli opportuni parametri del kernel . L'algoritmo di apprendimento dovrebbe essere in grado di capire la diversa importanza delle variabili, anche se potresti essere in grado di pesare anche le cose. Se pensi che il tempo sarà utile, aggiungi il tempo come un'altra variabile indipendente (funzione) per l'algoritmo di allenamento da utilizzare.

Se libsvm non è in grado di ottenere la precisione desiderata, prendere in considerazione il passaggio a SVMlight. Solo leggermente più difficile da gestire e molte più opzioni.

Bishop's Pattern Recognition and Machine Learning è probabilmente il primo libro di testo da cercare per i dettagli su ciò che libsvm e SVMlight stanno effettivamente facendo con i tuoi dati.

+0

Ottima idea, LIBSVM è fantastico. –

1

Sembra che qualsiasi tipo di classificatore debba funzionare per questo problema: trovare la classe migliore (la variabile dipendente) per un'istanza (i propri eventi). Un semplice punto di partenza potrebbe essere la classificazione Naive Bayes.

1

Questo è sicuramente un problema di apprendimento automatico. Weka è una scelta eccellente se conosci Java e vuoi una buona GPL lib in cui tutto ciò che devi fare è selezionare il classificatore e scrivere della colla. Probabilmente R non lo taglierà per molte istanze (eventi, come lo hai definito tu) perché è piuttosto lento. Inoltre, in R hai ancora bisogno di trovare o scrivere libs di machine learning, anche se questo dovrebbe essere facile dato che è un linguaggio statistico.

Se credete che le vostre caratteristiche (variabili indipendenti) siano condizionalmente indipendenti (nel senso, indipendente data la variabile dipendente), l'ingenuo Bayes è il classificatore perfetto, poiché è veloce, interpretabile, preciso e facile da implementare. Tuttavia, con 100.000 istanze e solo 30-50 funzionalità è possibile implementare uno schema di classificazione piuttosto complesso che cattura gran parte della struttura delle dipendenze nei dati. La tua scommessa migliore sarebbe probabilmente una macchina vettoriale di supporto (SMO in Weka) o una foresta casuale (Sì, è un nome stupido, ma ha aiutato la foresta casuale ad attecchire.) Se vuoi il vantaggio di un'interpretabilità facile del tuo classificatore anche a spese di una certa precisione, forse un albero delle decisioni J48 dritto funzionerebbe. Lo raccomanderei contro le reti neurali, poiché sono molto lente e in pratica non funzionano meglio delle SVM e delle foreste casuali.

1

Il libro Programming Collective Intelligence ha un esempio funzionante con codice sorgente di un predittore di prezzo per laptop che probabilmente sarebbe un buon punto di partenza per voi.

1

Gli SVM sono spesso il miglior classificatore disponibile. Tutto dipende dal tuo problema e dai tuoi dati. Per alcuni problemi altri algoritmi di apprendimento automatico potrebbero essere migliori. Ho visto problemi che le reti neurali (in particolare le reti neurali ricorrenti) erano più capaci di risolvere. Non c'è una risposta giusta a questa domanda poiché è altamente dipendente dalla situazione, ma sono d'accordo con dsimcha e Jay che gli SVM sono il posto giusto per iniziare.

1

Credo che il tuo problema sia un problema regression, non un problema di classificazione. La differenza principale: nella classificazione stiamo cercando di imparare il valore di una variabile discreta, mentre nella regressione stiamo cercando di imparare il valore di uno continuo. Le tecniche coinvolte possono essere simili, ma i dettagli sono diversi. Linear Regression è ciò che molte persone provano prima. Ci sono molte altre tecniche di regressione, se la regressione lineare non fa il trucco.

1

Hai detto che hai 30-50 variabili indipendenti, e alcune sono più importanti del resto. Quindi, supponendo che tu abbia dati storici (o quello che abbiamo chiamato un set di allenamento), puoi usare PCA (Principal Componenta Analysis) o altri metodi di riduzione della dimensionalità per ridurre il numero di variabili indipendenti. Questo passaggio è ovviamente facoltativo. A seconda delle situazioni, è possibile ottenere risultati migliori mantenendo tutte le variabili, ma aggiungendo un peso a ciascuna di esse in base alla pertinenza. Qui, PCA può aiutarti a calcolare quanto sia "rilevante" la variabile.

Hai anche detto che gli eventi che si sono verificati più di recente dovrebbero essere più importanti. In tal caso, è possibile aumentare l'evento recente più alto e abbassare l'evento meno recente. Si noti che l'importanza dell'evento non deve crescere in modo lineare accodandosi al tempo. Potrebbe avere più senso se cresce in modo esponenziale, quindi puoi giocare con i numeri qui. Oppure, se non ti mancano i dati di allenamento, forse puoi considerare di eliminare i dati troppo vecchi.

Come ha detto Yuval F, questo sembra più un problema di regressione che un problema di classificazione. Pertanto, è possibile provare SVR (Support Vector Regression), che è la versione di regressione di SVM (Support Vector Machine).

alcune altre cose si può provare sono:

  1. Giocare con il modo di scalare il campo di valori delle variabili indipendenti. Di ', di solito [-1 ... 1] o [0 ... 1]. Ma puoi provare altri intervalli per vedere se aiutano. A volte lo fanno. Il più delle volte non lo fanno.
  2. Se si sospetta che ci sia un vettore di funzionalità "nascosto" con una dimensione inferiore, ad esempio N < < 30 ed è di natura non lineare, sarà necessaria una riduzione di dimensionalità non lineare. Puoi leggere sul kernel PCA o più recentemente, molteplice scultura.
1

Quello che hai descritto è un classico problema di classificazione. E secondo me, perché codificare algoritmi freschi quando hai uno strumento come Weka in giro. Se fossi in te, vorrei esaminare un elenco di algoritmi di apprendimento supervisionato (non capisco completamente che le persone del siero di latte suggeriscano l'apprendimento senza supervisione prima quando questo è chiaramente un problema di classificazione) usando la convalida incrociata di 10 volte (o di un k-fold) , che è l'impostazione predefinita in Weka se ricordo, e vedere quali risultati ottieni! Vorrei provare:

-Neural Nets
-SVMs
-Decisione Alberi (questo ha funzionato molto bene per me quando stavo facendo un problema simile)
-Boosting con alberi di decisione/ceppi
-Anything altro !

Weka rende le cose così semplici e puoi davvero ottenere alcune informazioni utili. Ho appena seguito un corso di machine learning e ho fatto esattamente quello che stai cercando di fare con gli algoritmi di cui sopra, quindi so dove sei. Per me la spinta con i ceppi decisionali ha funzionato incredibilmente bene. (BTW, il potenziamento è in realtà un meta-algoritmo e può essere applicato alla maggior parte delle regole di apprendimento supervisionate per migliorare i loro risultati.)

Una cosa carina aobut utilizzando Decision Trees (se si utilizza l'ID3 o una varietà simile) è che sceglie gli attributi da suddividere in ordine di quanto essi differientiano i dati - in altre parole, quali attributi determinano la classificazione in modo più rapido. Quindi puoi controllare l'albero dopo aver eseguito l'algoritmo e vedere quale attributo di un libro a fumetti determina il prezzo in modo più deciso - dovrebbe essere la radice dell'albero.

Edit: Penso che Yuval abbia ragione, non stavo prestando attenzione al problema di discretizzare il valore del prezzo per la classificazione. Tuttavia, non so se la regressione è disponibile in Weka, e puoi ancora applicare facilmente le tecniche di classificazione a questo problema. È necessario creare classi di valori di prezzo, come in, un numero di intervalli di prezzi per i fumetti, in modo da poter avere un numero discreto (come da 1 a 10) che rappresenta il prezzo del fumetto. Quindi puoi facilmente eseguire la classificazione.