2016-02-04 6 views
11

Der Versuch, Doc-Klassifizierung in Spark zu tun. Ich bin mir nicht sicher, was das Hashing in HashingTF macht; opfert es irgendeine Genauigkeit? Ich bezweifle es, aber ich weiß es nicht. Der Funken-Doc sagt, dass er den "Hashing-Trick" benutzt ... nur ein weiteres Beispiel für wirklich schlechte/verwirrende Namen, die von Ingenieuren benutzt werden (ich bin auch schuldig). CountVectorizer erfordert auch das Festlegen der Wortschatzgröße, aber es verfügt über einen anderen Parameter, einen Schwellenwertparameter, der zum Ausschließen von Wörtern oder Token verwendet werden kann, die unterhalb eines bestimmten Schwellenwerts im Textcorpus angezeigt werden. Ich verstehe den Unterschied zwischen diesen beiden Transformern nicht. Was dies wichtig macht, sind die nachfolgenden Schritte im Algorithmus. Wenn ich zum Beispiel SVD an der resultierenden tfidf-Matrix durchführen möchte, dann bestimmt die Wortschatzgröße die Größe der Matrix für SVD, was sich auf die Laufzeit des Codes und die Modellleistung etc. auswirkt. Ich habe generell Schwierigkeiten Finden Sie eine Quelle zu Spark MLlib über API-Dokumentation und wirklich triviale Beispiele ohne Tiefe.Was ist der Unterschied zwischen HashingTF und CountVectorizer in Spark?

Antwort

13

Einige wichtige Unterschiede:

  • teilweise reversible (CountVectorizer) vs irreversible (HashingTF) - da Hashing nicht reversibel ist, können Sie nicht original Eingabe von einem Hash-Vektor wiederherzustellen. Andererseits kann Zählvektor mit Modell (Index) verwendet werden, um eine ungeordnete Eingabe wiederherzustellen. Als Konsequenz können Modelle, die mit Hash-Eingaben erstellt wurden, viel schwieriger zu interpretieren und zu überwachen sein.
  • Speicher und Rechenaufwand - HashingTF erfordert nur einen einzigen Datenscan und keinen zusätzlichen Speicher über den ursprünglichen Eingang und Vektor hinaus. CountVectorizer erfordert zusätzlichen Scan über die Daten, um ein Modell und zusätzlichen Speicher zu erstellen, um Vokabular (Index) zu speichern. Im Falle eines Unigramm-Sprachmodells ist dies normalerweise kein Problem, aber bei höheren n-Grammen kann es unerschwinglich teuer oder nicht durchführbar sein.
  • Hashing ist abhängig von eine Größe des Vektors, Hash-Funktion und ein Dokument. Das Zählen hängt von der Größe des Vektors, des Trainingskorpus und des Dokuments ab.
  • eine Quelle für den Informationsverlust - im Fall von HashingTF ist es Dimensionalitätsreduktion mit möglichen Kollisionen. CountVectorizer verwirft seltene Token. Wie es Downstream-Modelle beeinflusst, hängt von einem bestimmten Anwendungsfall und Daten ab.
3

Der Hashing-Trick ist eigentlich der andere Name des Feature Hashing.

ich unter Berufung auf Wikipedia-Definition:

In maschinellem Lernen, Feature-Hashing, die auch als Hashing-Trick bekannt, in Analogie zu dem Kernel Trick, ist eine schnelle und platzsparende Art und Weise der Vektorisierung Funktionen, dh, willkürliche Merkmale in Indizes in einem Vektor oder einer Matrix zu verwandeln. Es funktioniert, indem eine Hash-Funktion auf die Features angewendet wird und ihre Hash-Werte direkt als Indizes verwendet werden, anstatt die Indizes in einem assoziativen Array nach oben zu durchsuchen.

Sie können mehr darüber in this paper lesen.

Also eigentlich eigentlich für platzsparende Vektorisierung.

Während CountVectorizer nur eine Vokabular-Extraktion durchführt und in Vektoren umwandelt.

+0

Dank. Also kann Hashing für zwei verschiedene Features denselben Index in den Feature-Vektor erzeugen, richtig? Ist das nicht falsch? z.B. Wenn der Hash den gleichen Index für das Feature Länge und die Feature-Breite eines Objekts berechnet, habe ich das richtig verstanden? In der Textklassifikation kann HashingTF den gleichen Index für zwei sehr unterschiedliche Wörter berechnen. – Kai

+0

Ja, es kann Kollisionen geben. – zero323

+0

Es kann zu Kollisionen kommen wie jede Hash-Funktion. Trotzdem ist die Wahrscheinlichkeit dafür sehr gering, wenn man bedenkt, wie viele Wörter Sie haben. – eliasah

3

Gemäß der Funken 2.1.0 Dokumentation

Sowohl HashingTF und CountVectorizer kann der Begriff Frequenzvektoren zu erzeugen, verwendet werden.

HashingTF

HashingTF ist ein Transformator, der Sätze von Bedingungen und wandelt jene Sätze in fester Länge Merkmalsvektoren erfolgt. In der Textverarbeitung könnte ein "Satz von Begriffen" eine Tüte mit Wörtern sein. HashingTF nutzt den Hashing-Trick. Ein Roh-Feature wird in einen Index (Term) durch Anwenden einer Hash-Funktion abgebildet. Die hier verwendete Hash-Funktion ist MurmurHash 3. Dann werden die Terme basierend auf den gemappten Indizes berechnet. Dieser Ansatz vermeidet die Notwendigkeit, eine globale Begriff-zu-Index-Karte, die teuer für einen großen Korpus sein kann, aber es leidet an möglichen Hash- Kollisionen, wo verschiedene unformatierte Eigenschaften können die gleiche Begriff nach Hashing werden.

Um die Wahrscheinlichkeit einer Kollision zu verringern, können wir die Zielobjektdimension erhöhen, d. H. Die Anzahl der Buckets der Hash-Tabelle . Da ein einfacher Modulo verwendet wird, um die Hash-Funktion in einen Spaltenindex zu transformieren, ist es ratsam, eine Zweierpotenz als Feature Dimension zu verwenden, andernfalls werden die Features nicht gleichmäßig auf die Spalten abgebildet. Die Standardmerkmaldimension ist 2^18 = 262.144. Ein optionaler binärer Toggle-Parameter steuert die Häufigkeit der Terme. Wenn auf true gesetzt ist, werden alle Zählungen ungleich Null auf 1 gesetzt. Dies ist besonders nützlich für diskrete probabilistische Modelle, die binäre, Modelle anstelle von ganzen Zahlen modellieren.

CountVectorizer

CountVectorizer und CountVectorizerModel darauf abzielen, eine Sammlung von Textdokumenten zu Vektoren von Tokenzählungen zu helfen, zu konvertieren. Wenn ein a-priori-Wörterbuch nicht verfügbar ist, kann CountVectorizer als ein Estimator verwandt werden, um das -Vokabular zu extrahieren, und ein CountVectorizerModel generiert. Das Modell erzeugt spärliche Darstellungen für die Dokumente über das Vokabular, die dann zu anderen Algorithmen wie LDA weitergeleitet werden können.

Während des Anpassungsvorgangs wählt CountVectorizer die oberen vocabSize-Wörter aus, sortiert nach Häufigkeit des Terms über den Korpus. Ein optionaler Parameter minDF beeinflusst auch den Anpassungsprozess durch , wobei die minimale Anzahl (oder Bruch, wenn < 1.0) von Dokumenten ein Begriff angegeben werden muss, um in das Vokabular aufgenommen zu werden. Ein weiterer optionaler binärer Umschaltparameter steuert den Ausgabevektor. Wenn der Wert auf "True" gesetzt ist, werden alle Nicht-Null-Werte von auf 1 gesetzt.Dies ist besonders nützlich für diskrete probabilistische Modelle, die binäre anstelle von ganzen Zahlen modellieren.

Beispielcode

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) 

Ausgang ist als unten

enter image description here

Hashing TF das Vokabular fehlt, die für Techniken wie LDA wesentlich ist. Dazu muss die CountVectorizer-Funktion verwendet werden. Unabhängig von der Vokabulargröße schätzt die CountVectorizer-Funktion den Häufigkeitsbezeichner ohne weitere Näherung, anders als in HashingTF.

Referenz:

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

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

+0

was meinst du Hashing TF "vermisst das Vokabular"? Es kann zu Kollisionen kommen, bei denen verschiedene Wörter/Token auf denselben Behälter (Feature) abgebildet werden, aber es wird nicht "vermisst". Die Anzahl der Kollisionen wird durch Steuern von numFeatures param minimiert. LEBENSLAUF. ist genau - keine seltenen ausgeschlossenen Tokens berücksichtigen -. Sie können eine Wortzählung durchführen, um eine Vorstellung davon zu erhalten, welcher Wert für numFeatures angemessen ist. Ich denke, abhängig von der Situation, Vokabelgröße können Sie entweder verwenden. Ich sehe keinen großen Unterschied. CountVectorizer funktioniert für Sie, wenn Sie eine Anwendung haben, bei der sich beispielsweise die Größe des Vokabulars ändert. – Kai

Verwandte Themen