2016-02-04 9 views
11

Cercando di fare la classificazione del doc in Spark. Non sono sicuro di cosa faccia l'hashing in HashingTF; sacrifica ogni precisione? Ne dubito, ma non lo so. La scintilla doc dice che usa il "trucco di hashing" ... solo un altro esempio di nomi davvero pessimi/confusi usati dagli ingegneri (anch'io sono colpevole). CountVectorizer richiede anche l'impostazione della dimensione del vocabolario, ma ha un altro parametro, un parametro di soglia che può essere utilizzato per escludere parole o token che appaiono al di sotto di una soglia nel corpus di testo. Non capisco la differenza tra questi due Transformer. Ciò che rende questo importante sono i passaggi successivi dell'algoritmo. Ad esempio, se volessi eseguire SVD sulla matrice tfidf risultante, la dimensione del vocabolario determinerà la dimensione della matrice per SVD, che influisce sul tempo di esecuzione del codice e sulle prestazioni del modello, ecc. Sto avendo difficoltà in generale trovare qualsiasi fonte su Spark Mllib oltre la documentazione API e esempi davvero banali senza profondità.Qual è la differenza tra HashingTF e CountVectorizer in Spark?

risposta

13

alcune importanti differenze:

  • parzialmente reversibile (CountVectorizer) vs irreversibile (HashingTF) - in quanto l'hashing non è reversibile, non è possibile ripristinare in ingresso originale da un vettore di hash. Dall'altro lato il vettore di conteggio con il modello (indice) può essere utilizzato per ripristinare l'input non ordinato. Di conseguenza, i modelli creati utilizzando l'input hash possono essere molto più difficili da interpretare e monitorare.
  • overhead di memoria e computazionale - HashingTF richiede solo una singola scansione di dati e nessuna memoria aggiuntiva oltre l'input e il vettore originale. CountVectorizer richiede un'ulteriore scansione dei dati per creare un modello e una memoria aggiuntiva per memorizzare il vocabolario (indice). In caso di modello di linguaggio unigram, di solito non è un problema, ma nel caso di n-grammi più alti può essere proibitivo o non fattibile.
  • hashing dipende da una dimensione del vettore, funzione di hashing e un documento. Il conteggio dipende dalla dimensione del vettore, dal corpus di addestramento e da un documento.
  • una fonte della perdita di informazioni - in caso di HashingTF è la riduzione della dimensionalità con possibili collisioni. CountVectorizer scarta token non frequenti. Il modo in cui influisce sui modelli a valle dipende da un particolare caso d'uso e dati.
3

Il trucco di hashing è in realtà l'altro nome dell'hash di feature.

che sto citando la definizione di Wikipedia:

In machine learning, funzione di hashing, noto anche come il trucco di hashing, per analogia al trucco kernel, è un modo veloce ed efficiente dello spazio di funzioni Vettorizzazione, cioè trasformare le caratteristiche arbitrarie in indici in un vettore o una matrice. Funziona applicando una funzione di hash alle caratteristiche e usando i loro valori di hash come indici direttamente, piuttosto che guardare gli indici in un array associativo.

Ulteriori informazioni a riguardo sono disponibili in this paper.

Quindi, in realtà, per vettorializzare le caratteristiche di spazio efficiente.

Considerando che CountVectorizer esegue solo un'estrazione del vocabolario e si trasforma in Vettori.

+0

grazie. Quindi l'hashing può produrre lo stesso indice nel vettore di funzionalità per due diverse caratteristiche, corretto? non è sbagliato? per esempio. se l'hash ha calcolato lo stesso indice per dire la feature Length e la Feature Width di qualche oggetto .. ho capito bene? in Classificazione testo, HashingTF può calcolare lo stesso indice per due parole molto diverse. – Kai

+0

Sì, ci possono essere collisioni. – zero323

+0

Ci possono essere collisioni come ogni funzione di hash. Tuttavia, la probabilità che ciò accada è molto bassa considerando il numero di parole che potresti avere. – eliasah

3

Come per la documentazione Spark 2.1.0,

Sia HashingTF e CountVectorizer può essere utilizzato per generare i vettori di frequenza termine.

HashingTF

HashingTF è un trasformatore che prende insiemi di termini e converte questi apparecchi in lunghezza fissa vettori di caratteristiche. Nell'elaborazione del testo, un "set di termini" potrebbe essere un sacco di parole. HashingTF utilizza il trucco di hashing. Una caratteristica grezza viene mappata in un indice (termine) applicando una funzione hash . La funzione di hash utilizzata qui è MurmurHash 3. Quindi le frequenze vengono calcolate in base agli indici mappati. Questo approccio evita la necessità di calcolare una mappa globale termine-indice, che può essere costosa per un corpus di grandi dimensioni, ma soffre di potenziali conflitti di hash , in cui diverse funzioni raw possono diventare lo stesso termine dopo l'hashing.

per ridurre la probabilità di collisione, possiamo aumentare la caratteristica dimensione obiettivo, vale a dire il numero di secchi di hash tavolo. Poiché un semplice modulo viene utilizzato per trasformare la funzione di hash in un indice di colonna, è consigliabile utilizzare una potenza di due come dimensione della feature , altrimenti le funzioni non verranno mappate in modo uniforme alle colonne . La dimensione della caratteristica predefinita è 2^18 = 262,144. Un parametro di commutazione binaria facoltativo controlla i conteggi di frequenza del termine. Quando impostato su true tutti i conteggi di frequenza diversi da zero sono impostati su 1. Questo è particolarmente utile per i modelli probabilistici discreti che modellano il valore binario, piuttosto che intero, conteggi.

CountVectorizer

CountVectorizer e CountVectorizerModel lo scopo di contribuire a convertire una raccolta di documenti di testo in vettori di gettone conta. Quando un dizionario a-priori non è disponibile, CountVectorizer può essere utilizzato come un Estimator per estrarre il vocabolario e genera un Modellatore CountVectorizer . Il modello produce rappresentazioni sparse per documenti sul vocabolario, che può essere passato ad altri algoritmi come LDA.

Durante il processo di adattamento, CountVectorizer selezionerà le prime vocabSize parole ordinate per frequenza di frequenza nel corpo. Un parametro facoltativo mindf influisce anche sul processo di adattamento tramite specificando il numero minimo (o frazione se < 1.0) dei documenti che un termine deve apparire per essere incluso nel vocabolario. Un altro parametro di commutazione binaria opzionale controlla il vettore di uscita. Se impostato su true tutti i conteggi diversi da zero sono impostati su 1.Ciò è particolarmente utile per i modelli probabilistici discreti che modellano i conteggi binari anziché interi.

codice di esempio

from pyspark.ml.feature import HashingTF, IDF, Tokenizer 
from pyspark.ml.feature import CountVectorizer 

sentenceData = spark.createDataFrame([ 
    (0.0, "Hi I heard about Spark"), 
    (0.0, "I wish Java could use case classes"), 
    (1.0, "Logistic regression models are neat")], 
["label", "sentence"]) 

tokenizer = Tokenizer(inputCol="sentence", outputCol="words") 
wordsData = tokenizer.transform(sentenceData) 

hashingTF = HashingTF(inputCol="words", outputCol="Features", numFeatures=100) 
hashingTF_model = hashingTF.transform(wordsData) 
print "Out of hashingTF function" 
hashingTF_model.select('words',col('Features').alias('Features(vocab_size,[index],[tf])')).show(truncate=False) 


# fit a CountVectorizerModel from the corpus. 
cv = CountVectorizer(inputCol="words", outputCol="Features", vocabSize=20) 

cv_model = cv.fit(wordsData) 

cv_result = model.transform(wordsData) 
print "Out of CountVectorizer function" 
cv_result.select('words',col('Features').alias('Features(vocab_size,[index],[tf])')).show(truncate=False) 
print "Vocabulary from CountVectorizerModel is \n" + str(cv_model.vocabulary) 

uscita è come sotto

enter image description here

hashing TF manca il vocabolario che è essenziale per tecniche come LDA. Per questo si deve usare la funzione CountVectorizer. Indipendentemente dalla dimensione del vocabol, la funzione CountVectorizer stima il termine frequenza senza alcuna approssimazione, a differenza di HashingTF.

Riferimento:

https://spark.apache.org/docs/latest/ml-features.html#tf-idf

https://spark.apache.org/docs/latest/ml-features.html#countvectorizer

+0

cosa intendi con Hashing TF "manca il vocabolario"? ci possono essere collisioni in cui parole/gettoni diversi sono mappati allo stesso bin (funzione), ma non "manca". Il numero di collisioni è ridotto al minimo controllando numFeatures param. CV. è esatto, non prendendo in considerazione rari segnalini esclusi. Puoi fare un conteggio delle parole per avere un'idea di quale valore per numFeatures sia appropriato. Penso che, a seconda della situazione, la dimensione del vocabol sia utilizzabile. Non vedo alcuna differenza principale. CountVectorizer fa del lavoro per te se hai un'applicazione in cui la dimensione del vocabolario continua a cambiare, ad esempio. – Kai

Problemi correlati