Utilità di ingegneria delle funzionalità: perché creare nuove funzionalità basate su funzionalità esistenti?


30

Vedo spesso persone creare nuove funzionalità basate su funzionalità esistenti su un problema di apprendimento automatico. Ad esempio, qui: https://triangleinequality.wordpress.com/2013/09/09/basic-feature-engineering-with-the-titanic-data/ people hanno considerato le dimensioni della famiglia di una persona come una nuova funzionalità, in base sul numero di fratelli, sorelle e genitori, che erano caratteristiche esistenti.

Ma che senso ha questo? Non capisco perché sia ​​utile la creazione di nuove funzionalità correlate. Non è compito dell'algoritmo farlo da solo?


Risposte:


30

L'esempio più semplice usato per illustrare questo, è il problema XOR (vedi immagine sotto). Immagina di ricevere dati contenenti e coordinati e la classe binaria da prevedere. Potresti aspettarti che il tuo algoritmo di apprendimento automatico scopra da solo il limite di decisione corretto, ma se hai generato la funzione aggiuntiva , il problema diventa banale poiché ti dà un criterio di decisione quasi perfetto per la classificazione e hai usato solo una semplice aritmetica !Xyz=Xyz>0

Problema XOR

Quindi, mentre in molti casi ci si potrebbe aspettare dall'algoritmo per trovare la soluzione, in alternativa, grazie all'ingegnerizzazione delle funzionalità, è possibile semplificare il problema. I problemi semplici sono più facili e veloci da risolvere e richiedono algoritmi meno complicati. Gli algoritmi semplici sono spesso più robusti, i risultati sono spesso più interpretabili, sono più scalabili (meno risorse computazionali, tempo di formazione, ecc.) E portatili. Puoi trovare altri esempi e spiegazioni nel meraviglioso discorso di Vincent D. Warmerdam, tenuto dalla conferenza PyData a Londra .

Inoltre, non credere a tutto ciò che ti dicono i professionisti del machine learning. Nella maggior parte dei casi gli algoritmi non "apprenderanno da soli". Di solito hai tempo, risorse, potenza di calcolo limitati e i dati hanno di solito dimensioni limitate ed è rumoroso, nessuno dei due aiuta.

Portandolo all'estremo, potresti fornire i tuoi dati come foto di note scritte a mano del risultato dell'esperimento e trasmetterle a complicate reti neurali. Prima imparerebbe a riconoscere i dati sulle immagini, poi imparerebbe a capirli e fare previsioni. Per fare ciò, avresti bisogno di un computer potente e un sacco di tempo per l'addestramento e l'ottimizzazione del modello e hai bisogno di enormi quantità di dati a causa dell'utilizzo di complicate reti neurali. Fornire i dati in formato leggibile da computer (come tabelle di numeri), semplifica enormemente il problema, poiché non è necessario il riconoscimento di tutti i caratteri. Puoi pensare all'ingegnerizzazione delle funzionalità come un passaggio successivo, in cui trasformi i dati in modo tale da creare significaticaratteristiche, in modo che l'algoritmo abbia ancora meno da capire da solo. Per fare un'analogia, è come se volessi leggere un libro in lingua straniera, quindi è necessario prima imparare la lingua, anziché leggerla tradotta nella lingua che capisci.

Nell'esempio dei dati Titanic, il tuo algoritmo dovrebbe capire che la somma dei membri della famiglia ha senso, per ottenere la funzione "dimensione della famiglia" (sì, la sto personalizzando qui). Questa è una caratteristica ovvia per un essere umano, ma non è ovvio se vedi i dati come solo alcune colonne dei numeri. Se non sai quali colonne sono significative se considerate insieme ad altre colonne, l'algoritmo potrebbe capirlo provando ogni possibile combinazione di tali colonne. Certo, abbiamo modi intelligenti per farlo, ma è ancora più semplice se le informazioni vengono fornite immediatamente all'algoritmo.


Grazie, è molto ben spiegato e molto interessante!
Matthieu Veron,

Trovo la tua risposta molto buona, ma penso che sia meglio qualificarla un po '. In particolare, penso che l'ingegnerizzazione delle caratteristiche in termini di termini di interazione non semplifichi molto gli algoritmi come gli RF (anche se può ancora aiutare) poiché gli RF acquisiscono i termini di interazione in una certa misura da soli. Fammi sapere se mi manca qualcosa di importante. Ma sì, in generale l'ingegneria delle funzioni semplifica e aiuta molto le cose.
Poete Maudit,

@PoeteMaudit è vero che l'albero decisionale (e quindi RF) modella una grande interazione, ma è un certo tipo di interazioni, non tutte le possibili interazioni. Inoltre, l'ingegnerizzazione delle funzionalità non riguarda solo le interazioni.
Tim

Sicuramente sono d'accordo con i tuoi punti. Innanzitutto, le RF modellano un certo tipo di interazioni (intendi principalmente x * y?). In secondo luogo, l'ingegneria delle funzionalità non riguarda certamente solo le interazioni.
Poete Maudit,

14

Bene, se prevedi di utilizzare un classificatore semplice e lineare, ha perfettamente senso generare nuove funzionalità che sono una funzione non lineare di quelle esistenti, specialmente se la tua conoscenza del dominio indica che la funzionalità risultante sarà significativa e informativa. Si noti che un classificatore lineare non può prendere in considerazione quelle funzionalità complesse a meno che non vengano fornite esplicitamente.

Idealmente, se si utilizza un algoritmo di classificazione non lineare sufficientemente potente, dovrebbe essere in grado di creare un confine decisionale che consideri trasformazioni arbitrarie non lineari delle funzionalità di input se sono informative per la classificazione. Tuttavia, in pratica la maggior parte dei classificatori non lineari osserva solo alcuni tipi di trasformazioni. Ad esempio, un kernel polinomiale SVM prenderà in considerazione le interazioni polinomiali tra funzionalità, ma forse è possibile creare una funzionalità più informativa applicando altri tipi di trasformazioni ...

In breve, se la conoscenza del dominio indica che una combinazione non lineare di funzionalità elaborata a mano potrebbe essere informativa, ha senso aggiungerla al set di funzionalità esistente.


Ok ho capito ! Ma come posso sapere se le mie funzionalità che ho creato sono significative e informative? Voglio dire, i problemi possono avere spiegazioni controintuitive. Da quello che ho capito, la creazione di funzionalità è un modo per guidare l'algoritmo in una direzione, per risparmiare tempo sulle sue previsioni. Quindi, in alcuni modi, stiamo influenzando l'algoritmo. Come verificare che influenziamo correttamente?
Matthieu Veron,

2
Bene, questo è il punto in cui arriva la conoscenza del dominio. Ad esempio, se stai progettando un sistema di diagnosi medica, puoi parlare con i medici e chiedere loro quali informazioni usano per diagnosticare un paziente. Ad esempio, se un medico dice "Se il paziente ha sia febbre che mal di testa, è probabile che abbia un'influenza". Quella frase potrebbe indicare che includere una nuova caratteristica di bandiera che indica la presenza di febbre e mal di testa potrebbe essere una buona idea (specialmente se si utilizza un classificatore lineare, che non può "vedere" le caratteristiche di interazione polinomiale da sola).
Daniel López,

1
Tuttavia, questa è più un'arte che una scienza. Alla fine, è necessario convalidare l'efficacia delle funzionalità realizzate a mano testando i modelli su un set di test con un protocollo sperimentale imparziale ...
Daniel López,

3

È vero che alcuni dei modelli di apprendimento automatico hanno la capacità di gestire la non linearità e l'interazione tra le variabili, tuttavia, dipende dalla situazione, vedo tre motivi per cui diventa necessario.

  1. Y=1

Confine circolare

X1X2y=X0+c1X1+c2X2y=X0+c1X12+c2X22

  1. Se si conosce in anticipo che alcune funzionalità (dalla conoscenza o esperienza aziendale), potrebbe essere utile crearle per accelerare il runtime del modello e semplificare il modello. Ad esempio, nel tuo esempio dei dati Titanic e se stai usando un modello di classificazione dell'albero decisionale. Se sai che le donne anziane (età e sesso) hanno maggiori probabilità di sopravvivere, creando una singola funzione che acquisisce le informazioni, il tuo albero può fare una divisione sulla nuova variabile invece di fare due parti sulle due variabili. Può accelerare i tempi di calcolo se si sa in anticipo che la funzionalità è significativa.

  2. Nel mondo reale, non otterrai un singolo set di dati come Kaggle fornisce. Invece, ottieni informazioni da tutto il luogo. Ad esempio, se si desidera prevedere l'attrito dei clienti per una società di vendita al dettaglio online come Amazon, si dispone di informazioni sulla demografia dei clienti, informazioni sulla transazione di acquisto. Devi generare molte funzionalità da fonti diverse, in questo caso troverai molte funzioni utili che possono essere ottenute / aggregate a livello di transazione. Come afferma Andrew Ng: Spesso, la capacità di progettare le caratteristiche definisce il successo o il fallimento di un progetto di apprendimento automatico.

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.