[PYTHON] [Übersetzung] scikit-learn 0.18 Benutzerhandbuch 4.2 Merkmalsextraktion

Google übersetzte http://scikit-learn.org/0.18/modules/feature_extraction.html [scikit-learn 0.18 Benutzerhandbuch 4. Datensatzkonvertierung](http://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF Von% E3% 82% BB% E3% 83% 83% E3% 83% 88% E5% A4% 89% E6% 8F% 9B)


4.2 Merkmalsextraktion

Das Modul "sklearn.feature_extraction" kann verwendet werden, um Features in Formaten zu extrahieren, die von Algorithmen für maschinelles Lernen unterstützt werden, aus Datensätzen von Formaten wie Text und Bildern.

** Hinweis ** Die Feature-Extraktion unterscheidet sich stark von der Feature-Auswahl (http://qiita.com/nazoking@github/items/b9eb61f0c981af2cbdd0). .. Ersteres besteht darin, beliebige Daten wie Text und Bilder in numerische Merkmale umzuwandeln, die für maschinelles Lernen verwendet werden können. Letzteres ist eine maschinelle Lerntechnik, die auf diese Merkmalswerte angewendet wird.

4.2.1 Laden von Funktionen aus Diktaten

Die Klasse DictVectorizer ist eine Feature-Menge, die als Liste von Standard-Python-Dikt-Objekten dargestellt wird. Es kann verwendet werden, um ein Array in die NumPy / SciPy-Darstellung zu konvertieren, die vom Scikit-Learn-Schätzer verwendet wird. Obwohl Pythons Diktat nicht besonders schnell ist, bietet es den Vorteil, dass es einfach zu verwenden, spärlich ist (keine Notwendigkeit, nicht vorhandene Features zu speichern) und neben Werten auch Feature-Namen speichern kann. DictVectorizer implementiert eine Eins-zu-Eins-Codierung oder eine "One-Hot" -Codierung für Kategorien (oder diskrete Nennwerte). Kategorieattribute sind "Attribut-Wert" -Paare, die auf eine ungeordnete Liste diskreter Werte (Themenkennungen, Objekttypen, Tags, Namen usw.) beschränkt sind. Im Folgenden ist "Stadt" ein Kategorieattribut und "Temperatur" eine herkömmliche numerische Merkmalsgröße.

>>> measurements = [
...     {'city': 'Dubai', 'temperature': 33.},
...     {'city': 'London', 'temperature': 12.},
...     {'city': 'San Fransisco', 'temperature': 18.},
... ]

>>> from sklearn.feature_extraction import DictVectorizer
>>> vec = DictVectorizer()

>>> vec.fit_transform(measurements).toarray()
array([[  1.,   0.,   0.,  33.],
       [  0.,   1.,   0.,  12.],
       [  0.,   0.,   1.,  18.]])

>>> vec.get_feature_names()
['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']

DictVectorizer ist eine nützliche Ausdruckstransformation zum Trainieren von Satzklassifizierern in Modellen zur Verarbeitung natürlicher Sprache (normalerweise Extrahieren von Merkmalen um ein bestimmtes interessierendes Wort). Angenommen, Sie haben einen ersten Algorithmus, der Teilwort-Tags (PoS) aus einem Satz extrahiert. Das folgende Diktat ist ein solches Merkmal, das aus dem Wort "saß" im Satz "Die Katze saß auf der Matte" extrahiert wurde.

>>> pos_window = [
...     {
...         'word-2': 'the',
...         'pos-2': 'DT',
...         'word-1': 'cat',
...         'pos-1': 'NN',
...         'word+1': 'on',
...         'pos+1': 'PP',
...     },
...     #In einer realen Anwendung werden Sie viele solcher Diktate extrahieren
... ]

Diese Daten können in eine spärliche zweidimensionale Matrix vektorisiert werden, die zum Zuführen des Klassifikators (text.TfidfTransformer zur Normalisierung geeignet ist. Nach dem Weiterleiten an modules / generate / sklearn.feature_extraction.text.TfidfTransformer.html # sklearn.feature_extraction.text.TfidfTransformer).

>>> vec = DictVectorizer()
>>> pos_vectorized = vec.fit_transform(pos_window)
>>> pos_vectorized                
<1x6 sparse matrix of type '<... 'numpy.float64'>'
    with 6 stored elements in Compressed Sparse ... format>
>>> pos_vectorized.toarray()
array([[ 1.,  1.,  1.,  1.,  1.,  1.]])
>>> vec.get_feature_names()
['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat', 'word-2=the']

Wie Sie sich vorstellen können, führt das Extrahieren eines solchen Kontexts um einzelne Wörter im Dokumentenkorpus zu einer sehr breiten Matrix (viele One-Hot-Features), fast Null. Wird sein. Um die resultierende Datenstruktur im Speicher zu speichern, verwendet die Klasse "DictVectorizer" standardmäßig die Matrix "scipy.sparse" anstelle von "numpy.ndarray".

4.2.2. Feature-Hash

Die Klasse FeatureHasher ist ein Feature-Hash oder "[Hashing-Trick](https: //) en.wikipedia.org/wiki/Feature_hashing) ist ein schneller Vektorisierer mit wenig Speicher, der eine Technologie verwendet, die als bekannt ist. Anstatt eine Feature-Value-Konvertierungstabelle zu erstellen, wendet FeatureHasher eine Hash-Funktion auf die Feature-Werte an, um die Spaltennummern in der Beispielmatrix direkt zu bestimmen. Infolgedessen wird die Geschwindigkeit erhöht und die Speichernutzung auf Kosten der Überprüfbarkeit verringert. Hasher erinnert sich nicht an das Auftreten von Eingabemerkmalwerten und verfügt nicht über eine "inverse_transform" -Methode. Hash-Funktionen können Konflikte zwischen (irrelevanten) Features verursachen. Daher werden signierte Hash-Funktionen verwendet, und das Vorzeichen des Hash-Werts bestimmt das Vorzeichen des in der Feature-Wert-Ausgabematrix gespeicherten Werts. Auf diese Weise werden Kollisionen wahrscheinlich eher ausgeglichen als kumuliert, und der erwartete Durchschnitt der Ausgangscharakteristikwerte ist Null. Wenn "non_negative = True" an den Konstruktor übergeben wird, wird der absolute Wert abgerufen. Dies macht einen Teil der Konfliktbehandlung rückgängig, erwartet jedoch nicht negative Eingaben sklearn.naive_bayes.MultinomialNB. html # sklearn.naive_bayes.MultinomialNB) Estimator und sklearn.feature_selection.chi2 Features Sie können die Ausgabe an einen Selektor usw. übergeben. FeatureHasher akzeptiert Zuordnungen (wie Pythons Diktat und seine Varianten im Modul "Sammlungen"), "(Feature, Wert)" Paare oder Listen von Zeichenfolgen, abhängig vom Konstruktorparameter "input_type". Die Zuordnung wird als Liste von "(Merkmal, Wert)" behandelt, wobei "[" feat1 "," feat2 "," feat3 "]" [("feat1", 1), ("feat2", 1), ( Interpretiert als "feat3", 1)] ". Wenn ein Merkmalswert im Beispiel mehrmals vorkommt, werden die zugehörigen Werte summiert (also sind "(" feat ", 2)" und "(" feat ", 3.5)" "(" feat ", 5.5)" ) . Die Ausgabe von FeatureHasher ist immer eine scipy.sparse Matrix im CSR-Stil. Feature-Hashes können für die Dokumentklassifizierung verwendet werden, aber text.CountVectorizer, FeatureHasher führt keine andere Wortaufteilung oder andere Vorverarbeitung als die Unicode-zu-UTF-8-Codierung durch. Informationen zur Tokenisierung / Hasher-Kombination finden Sie unter [Vektorisieren eines großen Textkorpus mithilfe von Hash-Tricks](# 4238-% E3% 83% 8F% E3% 83% 83% E3% 82% B7% E3). % 83% A5% E3% 83% 88% E3% 83% AA% E3% 83% 83% E3% 82% AF% E3% 82% 92% E4% BD% BF% E7% 94% A8% E3% 81 % 97% E3% 81% A6% E5% A4% A7% E3% 81% 8D% E3% 81% AA% E3% 83% 86% E3% 82% AD% E3% 82% B9% E3% 83% 88 % E3% 82% B3% E3% 83% BC% E3% 83% 91% E3% 82% B9% E3% 82% 92% E3% 83% 99% E3% 82% AF% E3% 83% 88% E3 Siehe% 83% AB% E5% 8C% 96% E3% 81% 99% E3% 82% 8B). Stellen Sie sich als Beispiel eine Aufgabe zur Verarbeitung natürlicher Sprache auf Wortebene vor, für die Features erforderlich sind, die aus einem Paar (Token, part_of_speech) extrahiert wurden. Sie können Python-Generatorfunktionen verwenden, um Funktionen zu extrahieren:

def token_features(token, part_of_speech):
    if token.isdigit():
        yield "numeric"
    else:
        yield "token={}".format(token.lower())
        yield "token,pos={},{}".format(token, part_of_speech)
    if token[0].isupper():
        yield "uppercase_initial"
    if token.isupper():
        yield "all_uppercase"
    yield "pos={}".format(part_of_speech)

Dann kann das an FeatureHasher.transform gelieferte "raw_X" erstellt werden mit:

 raw_X = (token_features(tok, pos_tagger(tok)) for tok in corpus)

Es wird der Waschmaschine wie folgt zugeführt.

hasher = FeatureHasher(input_type='string')
X = hasher.transform(raw_X)

Holen Sie sich die scipy.sparse Matrix X. Beachten Sie den Generator, der das Extrahieren von Features erleichtert. Token werden nur auf Anfrage von Hasher verarbeitet.

4.2.2.1. Implementierungsdetails

FeatureHasher verwendet eine signierte 32-Bit-Version von MurmurHash3. Infolgedessen (und aufgrund der Einschränkungen von scipy.sparse) wird derzeit maximal $ 2 ^ {31} -1 $ unterstützt. In der ursprünglichen Hashing-Trick-Formulierung von Weinberger et al. Wurden zwei separate Hash-Funktionen $ h $ und $ \ xi $ verwendet, um die Spaltennummer bzw. das Vorzeichen der Merkmalswerte zu bestimmen. Die aktuelle Implementierung geht davon aus, dass die MurmurHash3-Codebits unabhängig von den anderen Bits sind. Es wird empfohlen, eine Potenz von 2 als Parameter "n_features" zu verwenden, da einfach der Rest der Division verwendet wird, um die Hash-Funktion in eine Spaltennummer zu konvertieren. Andernfalls werden die Feature-Werte nicht gleichmäßig zugeordnet.

--Referenz:

  • Killian Weinberger, Anirban Dasgupta, John Langford, Alex Smola, Josh Attenberg (2009) (http://alex.smola.org/papers/2009/Weinbergeretal09.pdf) Proc. ICML.

4.2.3. Extraktion von Textfunktionen

4.2.3.1. Darstellung durch Wortbeutel

Die Textanalyse ist eine Hauptanwendung von Algorithmen für maschinelles Lernen. In Rohdaten kann der Satz von Symbolen jedoch nicht direkt an den Algorithmus selbst geliefert werden. Da die meisten von ihnen numerische Merkmalsvektoren mit fester Größe anstelle von Rohtextdokumenten mit variabler Länge erwarten. Um dies zu beheben, bietet scicit-learn auf die gängigste Weise ein Dienstprogramm zum Extrahieren numerischer Merkmale aus Textinhalten.

  • Geben Sie für jedes mögliche Token eine Ganzzahl-ID an, z. B. das Tokenisieren einer Zeichenfolge und die Verwendung von Leerzeichen und Satzzeichen als Token-Trennzeichen. --Zählen Sie das Erscheinungsbild von Token in jedem Dokument.
  • Normalisieren und gewichten Sie mit weniger wichtigen Token, die in den meisten Proben / Dokumenten vorkommen.

In diesem Schema werden Merkmale und Beispiele wie folgt definiert:

  • Die Häufigkeit des Auftretens einzelner Token wird als Merkmalsmenge behandelt (kann normalisiert werden oder nicht).
  • Ein Vektor aller Tokenfrequenzen in einem bestimmten Dokument wird als multivariate Stichprobe betrachtet.

Somit kann ein Korpus eines Dokuments durch eine Matrix mit einer Zeile pro Dokument und einer Spalte für jedes Token (z. B. Wort) dargestellt werden, das im Korpus erscheint. Die Vektorisierung ist der allgemeine Prozess zum Konvertieren eines Satzes von Textdokumenten in einen numerischen Merkmalsvektor. Diese spezielle Strategie (Tokenisierung, Zählen, Normalisierung) wird als Bag of Words- oder "Bag of n-Gramm" -Darstellung bezeichnet. Das Dokument wird durch die Anzahl der Vorkommen des Wortes beschrieben, wobei die relativen Positionsinformationen des Wortes im Dokument vollständig ignoriert werden.

4.2.3.2. Spärlich

Die meisten Dokumente verwenden nur einige der in Korpora gebräuchlichen Wörter, sodass die resultierende Matrix viele Null-Merkmalswerte (normalerweise 99% oder mehr) enthält. Beispielsweise verwendet ein Satz von 10.000 kurzen Dokumenten (z. B. E-Mail) insgesamt 100.000 Wortschatzreihenfolgen, und jedes Dokument verwendet 100 bis 1000 eindeutige Wörter. Implementierungen können solche Matrizen nicht nur im Speicher speichern, sondern verwenden normalerweise auch eine spärliche Darstellung des Pakets "scipy.sparse", um algebraische Matrizen / Vektoren zu beschleunigen.

4.2.3.3 Verwendung des allgemeinen Vektorisierers

CountVectorizer bietet sowohl Tokenisierung als auch Anzahl der Vorkommen. Es ist in einer Klasse implementiert.

>>> from sklearn.feature_extraction.text import CountVectorizer

Es gibt viele Parameter in diesem Modell, aber die Standardwerte sind sehr vernünftig (weitere Informationen finden Sie in der Referenzdokumentation (http://scikit-learn.org/stable/modules/classes.html#text-feature-extraction-). ref)) ::

>>> vectorizer = CountVectorizer(min_df=1)
>>> vectorizer                     
CountVectorizer(analyzer=...'word', binary=False, decode_error=...'strict',
        dtype=<... 'numpy.int64'>, encoding=...'utf-8', input=...'content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), preprocessor=None, stop_words=None,
        strip_accents=None, token_pattern=...'(?u)\\b\\w\\w+\\b',
        tokenizer=None, vocabulary=None)

Verwenden Sie diese Option, um das Auftreten von Wörtern im minimalen Korpus von Textdokumenten zu tokenisieren und zu zählen.

>>> corpus = [
...     'This is the first document.',
...     'This is the second second document.',
...     'And the third one.',
...     'Is this the first document?',
... ]
>>> X = vectorizer.fit_transform(corpus)
>>> X                              
<4x9 sparse matrix of type '<... 'numpy.int64'>'
    with 19 stored elements in Compressed Sparse ... format>

Die Standardeinstellung ist das Extrahieren von Wörtern mit zwei oder mehr Zeichen und das Tokenisieren der Zeichenfolge. Die spezifische Funktion, die diesen Schritt ausführt, kann explizit angefordert werden.

>>> analyze = vectorizer.build_analyzer()
>>> analyze("This is a text document to analyze.") == (
...     ['this', 'is', 'text', 'document', 'to', 'analyze'])
True

Jedem vom Analysator während der Anpassung erkannten Term wird ein eindeutiger ganzzahliger Index zugewiesen, der der Spalte der resultierenden Matrix entspricht. Sie können die Interpretation dieser Spalte wie folgt erhalten:

>>> vectorizer.get_feature_names() == (
...     ['and', 'document', 'first', 'is', 'one',
...      'second', 'the', 'third', 'this'])
True

>>> X.toarray()           
array([[0, 1, 1, 1, 0, 0, 1, 0, 1],
       [0, 1, 0, 1, 0, 2, 1, 0, 1],
       [1, 0, 0, 0, 1, 0, 1, 1, 0],
       [0, 1, 1, 1, 0, 0, 1, 0, 1]]...)

Die umgekehrte Zuordnung von Merkmalswerten zu Spaltenindizes wird im Attribut vocabulary_ des Vektorisierers gespeichert.

>>> vectorizer.vocabulary_.get('document')
1

Daher werden Wörter, die nicht im Trainingskorpus enthalten sind, bei zukünftigen Aufrufen der Konvertierungsmethode vollständig ignoriert.

>>> vectorizer.transform(['Something completely new.']).toarray()
...                           
array([[0, 0, 0, 0, 0, 0, 0, 0, 0]]...)

Beachten Sie, dass im vorherigen Korpus das erste und das letzte Dokument genau dieselben Wörter haben und mit einem Gleichheitsvektor codiert sind. Insbesondere verlieren Sie die Information, dass das letzte Dokument im fraglichen Format vorliegt. Um Bestellinformationen zu speichern, können Sie zusätzlich zu 1 Gramm (einzelne Wörter) 2 Gramm Wörter extrahieren.

>>> bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
...                                     token_pattern=r'\b\w+\b', min_df=1)
>>> analyze = bigram_vectorizer.build_analyzer()
>>> analyze('Bi-grams are cool!') == (
...     ['bi', 'grams', 'are', 'cool', 'bi grams', 'grams are', 'are cool'])
True

Das von diesem Vektorisierer extrahierte Vokabular ist viel größer und kann die Mehrdeutigkeit von Positionsinformationen der Wortreihenfolge beim Codieren auflösen.

>>>
>>> X_2 = bigram_vectorizer.fit_transform(corpus).toarray()
>>> X_2
...                           
array([[0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0],
       [0, 0, 1, 0, 0, 1, 1, 0, 0, 2, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0],
       [1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1]]...)

Insbesondere existiert der Fragensatz "Ist dies" nur im letzten Dokument.

>>> feature_index = bigram_vectorizer.vocabulary_.get('is this')
>>> X_2[:, feature_index]     
array([0, 0, 0, 1]...)

4.2.3.4. Tf-idf-Gewichtung

In einem großen Textkorpus gibt es so viele Wörter (z. B. "the", "a", "is" auf Englisch), die wenig aussagekräftige Informationen über den Inhalt des Dokuments enthalten. Durch die direkte Bereitstellung von Frequenzinformationen für den Klassifizierer wird die Häufigkeit seltener, aber interessanter Begriffe für sehr häufig verwendete Begriffe ausgeblendet. Es ist sehr üblich, die tf-idf-Transformation zu verwenden, um die Frequenzinformationen für den Klassifizierer geeignet zu machen. Tf-idf bedeutet die Anzahl der Wortvorkommen (tf) und die umgekehrte Anzahl der Erscheinungssätze (idf) und $ \ text {tf-idf (t, d)} = \ text {tf (t, d)} \ times \ text {idf (t)} $. Die Standardeinstellung für TfidfTransformer`` TfidfTransformer (norm = 'l2', use_idf = True, glatt_idf = True, sublinear_tf = False) Die Worthäufigkeit, die Häufigkeit, mit der ein Wort in einem bestimmten Dokument vorkommt, wird mit der IDF-Komponente multipliziert, die wie folgt berechnet wird:

\text{idf}(t) = log{\frac{1 + n_d}{1+\text{df}(d,t)}} + 1

Dabei ist $ n_d $ die Gesamtzahl der Dokumente und $ \ text {df} (d, t) $ die Anzahl der Dokumente, die das Wort $ t $ enthalten. Der resultierende tf-idf-Vektor wird durch die euklidische Norm normalisiert.

v_{norm} = \frac{v}{||v||_2} = \frac{v}{\sqrt{v{\_1}^2 + v{\_2}^2 + \dots + v{\_n}^2}}

Dies war ursprünglich eine Wortgewichtungsmethode (Suchmaschinen-Suchergebnis-Ranking-Funktion), die für das Abrufen von Informationen entwickelt wurde und häufig bei der Klassifizierung und Clusterbildung von Dokumenten verwendet wird. Wie genau tf-idfs berechnet wird, erfahren Sie im folgenden Abschnitt unter [TfidfTransformer] von scikit-learn (http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html) Berechnet mit # sklearn.feature_extraction.text.TfidfTransformer) und TfidfVectorizer. Zeigt an, ob sich die angegebenen tf-idfs ein wenig von der Standard-Lehrbuchnotation unterscheiden, die idf wie folgt definiert:

\text{idf}(t) = log{\frac{n_d}{1+\text{df}(d,t)}}

In TfidfTransformer und TfidfVectorizer fügt glatt_idf = False idf anstelle des Nenners von idf" 1 "hinzu.

\text{idf}(t) = log{\frac{n_d}{\text{df}(d,t)}} + 1

Diese Normalisierung wird von der TfidfTransformer-Klasse implementiert.

>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> transformer = TfidfTransformer(smooth_idf=False)
>>> transformer   
TfidfTransformer(norm=...'l2', smooth_idf=False, sublinear_tf=False,
                 use_idf=True)

Weitere Informationen zu allen Parametern finden Sie im Referenzdokument (http://scikit-learn.org/stable/modules/classes.html#text-feature-extraction-ref). Betrachten Sie das folgende Beispiel. Die Erscheinungsrate des ersten Wortes beträgt 100%, was nicht sehr interessant ist. Die Erscheinungsrate der beiden anderen Features beträgt weniger als 50%, was wahrscheinlich den Inhalt des Dokuments besser darstellt.

>>> counts = [[3, 0, 1],
...           [2, 0, 0],
...           [3, 0, 0],
...           [4, 0, 0],
...           [3, 2, 0],
...           [3, 0, 2]]
...
>>> tfidf = transformer.fit_transform(counts)
>>> tfidf                         
<6x3 sparse matrix of type '<... 'numpy.float64'>'
    with 9 stored elements in Compressed Sparse ... format>

>>> tfidf.toarray()                        
array([[ 0.81940995,  0.        ,  0.57320793],
       [ 1.        ,  0.        ,  0.        ],
       [ 1.        ,  0.        ,  0.        ],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.47330339,  0.88089948,  0.        ],
       [ 0.58149261,  0.        ,  0.81355169]])

Jede Zeile ist normalisiert, um einen einheitlichen euklidischen Standard zu haben:

v\_{norm} = \frac{v}{||v||\_2} = \frac{v}{\sqrt{v{\_1}^2 + v{\_2}^2 + \dots + v{_n}^2}}

Beispielsweise können Sie tf-idf im ersten Term des ersten Dokuments im Zählarray wie folgt berechnen:

n_{d, {\text{term1}}} = 6  \\
\text{df}(d, t)_{\text{term1}} = 6  \\
\text{idf}(d, t)_{\text{term1}} = log \frac{n_d}{\text{df}(d, t)} + 1 = log(1)+1 = 1  \\
\text{tf-idf}_{\text{term1}} = \text{tf} \times \text{idf} = 3 \times 1 = 3

Das Wiederholen dieser Berechnung für die verbleibenden zwei Begriffe im Dokument ergibt:

\text{tf-idf}_{\text{term2}} = 0 \times log(6/1)+1 = 0 \\
\text{tf-idf}_{\text{term3}} = 1 \times log(6/2)+1 \approx 2.0986

Roher tf-idfs-Vektor:

\text{tf-idf}_raw = [3, 0, 2.0986]

Als nächstes ergibt die Anwendung der euklidischen (L2) Norm die folgenden tf-idfs für Dokument 1.

\frac{[3, 0, 2.0986]}{\sqrt{\big(3^2 + 0^2 + 2.0986^2\big)}}
= [ 0.819,  0,  0.573]

Zusätzlich fügt der Standardparameter "glatt_idf = wahr" dem Molekül und dem Nenner eine "1" hinzu. Es sieht so aus, als ob das zusätzliche Dokument für jeden Begriff in der Sammlung genau einmal enthält. Verhindert null Prozent.

\text{idf}(t) = log{\frac{1 + n_d}{1+\text{df}(d,t)}} + 1

Mit dieser Änderung wird die tf-idf in Abschnitt 3 von Dokument 1 in 1.8473 geändert.

\text{tf-idf}_{\text{term3}} = 1 \times log(7/3)+1 \approx 1.8473

Und der L2 normalisierte tf-idf

\frac{[3, 0, 1.8473]}{\sqrt{\big(3^2 + 0^2 + 1.8473^2\big)}} = [0.8515, 0, 0.5243]
>>> transformer = TfidfTransformer()
>>> transformer.fit_transform(counts).toarray()
array([[ 0.85151335,  0.        ,  0.52433293],
       [ 1.        ,  0.        ,  0.        ],
       [ 1.        ,  0.        ,  0.        ],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.55422893,  0.83236428,  0.        ],
       [ 0.63035731,  0.        ,  0.77630514]])

Das Gewicht jedes durch den Methodenaufruf "fit" berechneten Features wird im Modellattribut gespeichert.

>>> transformer.idf_                       
array([ 1. ...,  2.25...,  1.84...])

Da tf-idf für Textfunktionen so beliebt ist, gibt es eine andere Klasse namens TfidfVectorizer, die alle Optionen von CountVectorizer und TfidfTransformer in einem einzigen Modell kombiniert:

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> vectorizer = TfidfVectorizer(min_df=1)
>>> vectorizer.fit_transform(corpus)
...                                
<4x9 sparse matrix of type '<... 'numpy.float64'>'
    with 19 stored elements in Compressed Sparse ... format>

Die TF-IDF-Normalisierung ist oft sehr nützlich, aber es kann Beispiele geben, bei denen binäre Generierungsmarker bessere Funktionen bieten. Dies kann mithilfe des binären Parameters des CountVectorizers erreicht werden. Insbesondere Schätzer wie Bernoulli Naive Bayes modellieren explizit diskrete boolesche probabilistische Variablen. .. Außerdem kann sehr kurzer Text mit tf-idf verrauscht sein, während Informationen zur binären Generierung stabiler sind. Wie immer besteht die beste Möglichkeit zum Anpassen von Merkmalsextraktionsparametern darin, eine kreuzvalidierte Rastersuche zu verwenden, indem beispielsweise der Merkmalsextraktor mit einem Klassifizierer per Pipeline versehen wird.

  • [Beispiel-Pipeline zum Extrahieren und Auswerten von Textfunktionen](http://scikit-learn.org/stable/auto_examples/model_selection/grid_search_text_feature_extraction.html#sphx-glr-auto-examples-model-selection-grid- Suchtext-Feature-Extraktion-py)

4.2.3.5. Textdateien dekodieren

Der Text besteht aus Buchstaben, aber die Datei besteht aus Bytes. Diese Bytes repräsentieren Zeichen gemäß einer bestimmten Codierung. Um mit einer Textdatei in Python zu arbeiten, müssen Sie dieses Byte in einen Zeichensatz namens Unicode dekodieren. Übliche Codierungen sind ASCII, Latin-1 (Westeuropa), KOI8-R (Russisch), Universal Encodings UTF-8 und UTF-16. Es gibt viele andere.

Hinweis: Die Codierung wird manchmal als "Zeichensatz" bezeichnet, aber dieser Begriff ist weniger genau. Es können mehrere Codierungen für einen einzelnen Zeichensatz vorhanden sein.

Der Scikit-Learn-Textfunktionsextraktor weiß, wie eine Textdatei dekodiert wird, wird jedoch nur angezeigt, wenn Sie angeben, wie die Datei codiert werden soll. Zu diesem Zweck verfügt CountVectorizer über einen Codierungsparameter. Ich werde es nehmen. Für moderne Textdateien ist die korrekte Codierung wahrscheinlich UTF-8, was die Standardeinstellung ist (encoding =" utf-8 "). Wenn der Text, den Sie laden, jedoch nicht UTF-8-codiert ist, erhalten Sie einen "UnicodeDecodeError". Bei Dekodierungsfehlern können Sie den Vektorisierer stumm schalten, indem Sie den Parameter decode_error auf "ignorieren" oder "ersetzen" setzen. Geben Sie an der Python-Eingabeaufforderung help (bytes.decode) ein, um die Dokumentation zur Python-Funktion bytes.decode anzuzeigen. Wenn Sie Probleme beim Dekodieren von Text haben, probieren Sie es aus:

--Überprüfen Sie die tatsächliche Kodierung des Textes. Die Datei kann einen Codierungsheader oder eine README-Datei haben. Es kann auch Standardcodierungen geben, die basierend auf der Quelle des Textes angenommen werden können.

  • Sie können die UNIX-Befehlsdatei verwenden, um herauszufinden, welche Codierungen häufig sind. Das Chardet-Modul von Python enthält ein Skript namens "chardetect.py", das eine bestimmte Codierung errät, aber ich kann nicht erraten, dass es korrekt ist.
  • Sie können auch UTF-8 ausprobieren und den Fehler ignorieren. Sie können die Byte-Zeichenfolge mit "bytes.decode (fehler =" ersetzen ")" dekodieren und alle Dekodierungsfehler durch bedeutungslose Zeichen ersetzen oder "decode_error =" ersetzen "im Vektorisierer setzen. .. Dies kann die Nützlichkeit von Merkmalsmengen beeinträchtigen.
  • Der eigentliche Text kann aus verschiedenen Quellen stammen, die möglicherweise unterschiedliche Codierungen verwenden, und kann versehentlich in einer anderen Codierung als der codierten codiert werden. Dies ist häufig bei Text der Fall, der aus dem Web abgerufen wird. Das Python-Paket ftfy kann die Dekodierungsfehler einiger Klassen automatisch sortieren, sodass unbekannter Text als Latin-1 dekodiert wird. Sie können ftfy verwenden, um den Fehler zu beheben.
  • Wenn Sie eine Mischung von Codierungen haben, bei denen der Text schwer zu sortieren ist (z. B. das 20 Newsgroups-Dataset), können Sie zu einer einfachen Einzelbyte-Codierung wie Latin-1 zurückkehren. Einige Texte werden möglicherweise nicht richtig angezeigt, aber zumindest die Bytes in derselben Reihenfolge repräsentieren immer dieselbe Funktion.

Das folgende Snippet verwendet beispielsweise Chardet (nicht mit scicit-learn ausgeliefert und muss separat installiert werden), um die Codierung der drei Texte zu ermitteln. Vektorisieren Sie dann den Text und drucken Sie das erlernte Vokabular aus. Die Ausgabe wird hier nicht angezeigt.

>>> import chardet    
>>> text1 = b"Sei mir gegr\xc3\xbc\xc3\x9ft mein Sauerkraut"
>>> text2 = b"holdselig sind deine Ger\xfcche"
>>> text3 = b"\xff\xfeA\x00u\x00f\x00 \x00F\x00l\x00\xfc\x00g\x00e\x00l\x00n\x00 \x00d\x00e\x00s\x00 \x00G\x00e\x00s\x00a\x00n\x00g\x00e\x00s\x00,\x00 \x00H\x00e\x00r\x00z\x00l\x00i\x00e\x00b\x00c\x00h\x00e\x00n\x00,\x00 \x00t\x00r\x00a\x00g\x00 \x00i\x00c\x00h\x00 \x00d\x00i\x00c\x00h\x00 \x00f\x00o\x00r\x00t\x00"
>>> decoded = [x.decode(chardet.detect(x)['encoding'])
...            for x in (text1, text2, text3)]        
>>> v = CountVectorizer().fit(decoded).vocabulary_    
>>> for term in v: print(v)                           

(Abhängig von der Version von chardet kann die erste falsch sein.) Eine Übersicht über die Unicode- und Zeichencodierung finden Sie unter Joel Spolskys Absolute Minimums, die jeder Softwareentwickler über Unicode wissen muss. Bitte.

4.2.3.6. Anwendungen und Beispiele

Die Darstellung von Bag of Words ist sehr einfach, aber tatsächlich überraschend nützlich. Insbesondere in den ** überwachten Einstellungen ** kann es gut mit einem schnellen und skalierbaren linearen Modell kombiniert werden, um den ** Dokumentklassifizierer ** zu trainieren.

  • [Klassifizierung von Textdokumenten mit spärlichen Funktionen](http://scikit-learn.org/stable/auto_examples/text/document_classification_20newsgroups.html#sphx-glr-auto-examples-text-document-classification-20newsgroups- py)

In der unbeaufsichtigten Einstellung werden ähnliche Dokumente mithilfe eines Clustering-Algorithmus wie K-means zusammengestellt. Kann gruppiert werden.

Schließlich durch Lockerung der harten Zuordnungsbeschränkungen beim Clustering, z. B. durch Verwendung der nicht-negativen Matrixzerlegung (NMF oder NNMF) (http://scikit-learn.org/stable/modules/decomposition.html#nmf). Es ist möglich, die Hauptthemen des Korpus zu entdecken.

  • [Themenextraktion unter Verwendung nicht negativer Matrixzerlegung und potenzieller Jilliclet-Zuweisung](http://scikit-learn.org/stable/auto_examples/applications/topics_extraction_with_nmf_lda.html#sphx-glr-auto-examples-applications-topics-extraction -mit-nmf-lda-py)

4.2.3.7. Einschränkungen des Ausdrucks in Bag of Words

Der Satz von Unigrammen (die Tasche des Wortes) kann keine Phrasen oder Ausdrücke mit mehreren Wörtern erfassen und ignoriert effektiv Abhängigkeiten der Wortreihenfolge. Darüber hinaus erklärt das Bag of Words-Modell keine möglichen Rechtschreibfehler oder Wortableitungen. N Gramm zur Rettung! Anstatt einen einfachen Satz von Unigrammen (n = 1) zu konstruieren, könnte man einen Satz von Bigrammen (n = 2) bevorzugen, die das Auftreten aufeinanderfolgender Wortpaare zählen. Alternativ können Sie eine Reihe von N-Gramm-Buchstaben als belastbaren Ausdruck für Rechtschreibfehler und Ableitungen betrachten. Angenommen, Sie haben es mit einem Korpus von zwei Dokumenten "[" Wörter "," wprds "]" zu tun. Das zweite Dokument enthält eine Rechtschreibfehler des Wortes "Wort". Eine einfache Bag of Words-Darstellung betrachtet diese beiden Dokumente als sehr unterschiedliche Dokumente und unterscheidet sich in beiden möglichen Merkmalen. Die 2-Gramm-Darstellung von Zeichen kann jedoch Dokumente finden, die mit 4 der 8 Merkmale übereinstimmen, was dem bevorzugten Klassifizierer helfen kann, bessere Entscheidungen zu treffen.

>>> ngram_vectorizer = CountVectorizer(analyzer='char_wb', ngram_range=(2, 2), min_df=1)
>>> counts = ngram_vectorizer.fit_transform(['words', 'wprds'])
>>> ngram_vectorizer.get_feature_names() == (
...     [' w', 'ds', 'or', 'pr', 'rd', 's ', 'wo', 'wp'])
True
>>> counts.toarray().astype(int)
array([[1, 1, 1, 0, 1, 1, 1, 0],
       [1, 1, 0, 1, 1, 1, 0, 1]])

Im obigen Beispiel wird der Analysator "char_wb" verwendet. Es werden n Gramm nur aus Zeichen innerhalb von Wortgrenzen erstellt (mit auf beiden Seiten eingebetteten Leerzeichen). Stattdessen erstellt der "char" -Analysator ein n-Gramm, das Wörter umfasst:

>>>
>>> ngram_vectorizer = CountVectorizer(analyzer='char_wb', ngram_range=(5, 5), min_df=1)
>>> ngram_vectorizer.fit_transform(['jumpy fox'])
...                                
<1x4 sparse matrix of type '<... 'numpy.int64'>'
   with 4 stored elements in Compressed Sparse ... format>
>>> ngram_vectorizer.get_feature_names() == (
...     [' fox ', ' jump', 'jumpy', 'umpy '])
True

>>> ngram_vectorizer = CountVectorizer(analyzer='char', ngram_range=(5, 5), min_df=1)
>>> ngram_vectorizer.fit_transform(['jumpy fox'])
...                                
<1x5 sparse matrix of type '<... 'numpy.int64'>'
    with 5 stored elements in Compressed Sparse ... format>
>>> ngram_vectorizer.get_feature_names() == (
...     ['jumpy', 'mpy f', 'py fo', 'umpy ', 'y fox'])
True

Die wortgrenzenbewusste Variante "char_wb" ist besonders interessant in Sprachen, die Leerzeichen für die Worttrennung verwenden. Für solche Sprachen können sowohl die Vorhersagegenauigkeit als auch die Konvergenzgeschwindigkeit trainierter Klassifizierer erhöht werden, während die Robustheit für Rechtschreibfehler und Wortableitung erhalten bleibt. Sie können eine Wortreihenfolge speichern, indem Sie ngrams anstelle einzelner Wörter extrahieren. Der Wortbeutel und der n-Gramm-Beutel zerstören jedoch den größten Teil der internen Struktur eines Dokuments und seiner internen Struktur. Zerstöre den größten Teil der Bedeutung von. Um die umfassenderen Herausforderungen beim Verständnis der natürlichen Sprache zu bewältigen, müssen wir die lokale Struktur von Sätzen und Absätzen berücksichtigen. Viele solcher Modelle werden als "strukturierte Ausgabe" -Probleme betrachtet, die derzeit nicht von Scicit-Learn abgedeckt werden.

4.2.3.8. Vektorisieren Sie große Textkorpusse mit Hash-Tricks

Das obige Vektorisierungsschema ist einfach, behält jedoch die Zuordnung von Zeichenfolge zu Index (vocabulary_attribute) im Speicher bei, was beim Umgang mit großen Datenmengen zu Problemen führt.

―― Je größer der Korpus, desto größer der Wortschatz und desto mehr Speicher wird verwendet. --Die Anpassung erfordert die Zuweisung einer Zwischendatenstruktur, deren Größe proportional zur Größe des Originaldatensatzes ist.

  • Um eine Wortzuordnung zu erstellen, müssen Sie den gesamten Datensatz einmal laden. Daher ist es nicht möglich, einen Textklassifizierer ausschließlich online anzupassen.
  • Die Serialisierung / Deserialisierung von Vektorisierern mit großem Wortschatz ist sehr langsam (normalerweise viel langsamer als die Serialisierung / Deserialisierung flacher Datenstrukturen wie NumPy-Arrays derselben Größe).
  • Da das Attribut vocabulary_ eine feinkörnige Synchronisationsbarriere aufweist, ist es nicht einfach, die Vektorisierungsarbeit in parallele Unteraufgaben zu unterteilen. Das heißt, die Zuordnung von der Token-Zeichenfolge zum Feature-Index erfordert, dass die Token aufgrund ihrer ersten Erscheinungsreihenfolge gemeinsam genutzt werden, was die Parallelisierungsleistung gegenüber der sequentiellen Verarbeitung verlangsamen kann.

sklearn.feature_extraction.FeatureHasher "Hashing trick" ([feature] Hash](http://scikit-learn.org/stable/modules/feature_extraction.html#feature-hashing) und [CountVectorizer](http://scikit-learn.org/stable/modules/generated/sklearn. Sie können diese Einschränkungen überwinden, indem Sie die Funktionen zur Textvorverarbeitung und Tokenisierung von feature_extraction.text.CountVectorizer.html # sklearn.feature_extraction.text.CountVectorizer kombinieren. Diese Kombination ist eine Transklasse HashingVectorizer, die größtenteils mit CountVectorizer kompatibel ist. .HashingVectorizer) ist implementiert. HashingVectorizer ist zustandslos. Das heißt, Sie müssen es nicht nennen.

>>> from sklearn.feature_extraction.text import HashingVectorizer
>>> hv = HashingVectorizer(n_features=10)
>>> hv.transform(corpus)
...                                
<4x10 sparse matrix of type '<... 'numpy.float64'>'
    with 16 stored elements in Compressed Sparse ... format>

In der Vektorausgabe sehen Sie, dass 16 Feature-Token ungleich Null extrahiert wurden. Dies ist weniger als die 19 Nicht-Nullen, die zuvor vom Count Vectorizer desselben Spielzeugkorpus extrahiert wurden. Diese Diskrepanz ist auf Hash-Funktionskonflikte aufgrund des niedrigen Werts des Parameters "n_features" zurückzuführen. In realen Einstellungen kann der Parameter n_features auf seinem Standardwert von 2 ** 20 belassen werden (ca. 1 Million mögliche Features). Wenn der Speicher oder die Größe des nachgeschalteten Modells von Bedeutung ist, hilft Ihnen die Auswahl eines niedrigeren Werts, z. B. "2 ^ 18", ohne zu viele zusätzliche Konflikte in eine typische Textklassifizierungsaufgabe einzuführen. .. Die Anzahl der Dimensionen beeinflusst nicht die CPU-Trainingszeit der Algorithmen, die mit der CSR-Matrix arbeiten ("LinearSVC (dual = True)", "Perceptron", "SGDClassifier", "PassiveAggressive"), sondern die Algorithmen, die mit der CSC-Matrix arbeiten (" Beachten Sie, dass dies "LinearSVC (dual = False)", "Lasso ()" usw. betrifft. Versuchen Sie es erneut mit den Standardeinstellungen:

>>> hv = HashingVectorizer()
>>> hv.transform(corpus)
...                               
<4x1048576 sparse matrix of type '<... 'numpy.float64'>'
    with 19 stored elements in Compressed Sparse ... format>
>>>

Wir bekommen keine Kollisionen mehr, aber dies geht zu Lasten der größeren Dimensionalität des Ausgaberaums. Natürlich können andere als die hier verwendeten Begriffe immer noch miteinander in Konflikt stehen. HashingVectorizer unterliegt außerdem den folgenden Einschränkungen:

  • Aufgrund der Einwegnatur der Hash-Funktion, die das Mapping ausführt, können Sie das Modell nicht umkehren (ohne die Methode "inverse_transform") oder auf die ursprüngliche Zeichenfolgendarstellung der Feature-Menge zugreifen.
  • Es wird keine IDF-Gewichtung durchgeführt, um zu verhindern, dass das Modell einen Status aufweist. TfidfTransformer sollte nach Bedarf in die Pipeline aufgenommen werden. Ich kann.

4.2.3.9. Führen Sie mit HashingVectorizer eine Out-of-Core-Skalierung durch

Eine interessante Entwicklung mit HashingVectorizer ist Out-of-Core. Die Fähigkeit zur Skalierung. Mit anderen Worten, Sie können aus Daten lernen, die nicht in den Hauptspeicher Ihres Computers passen. Die Strategie zur Implementierung der Out-of-Core-Skalierung besteht darin, die Daten im Mini-Batch in den Schätzer zu streamen. Jeder Mini-Batch wird mit dem HashingVectorizer vektorisiert, um sicherzustellen, dass der Eingabebereich des Schätzers immer die gleichen Abmessungen hat. Daher ist die zu einem bestimmten Zeitpunkt verwendete Speichermenge durch die Größe des Mini-Batches begrenzt. Die Datenmenge, die mit einem solchen Ansatz erfasst werden kann, ist unbegrenzt. Aus praktischer Sicht wird die Trainingszeit jedoch häufig durch die für die Aufgabe aufgewendete CPU-Zeit begrenzt. Ein umfassendes Beispiel für die Out-of-Core-Skalierung in einer Textklassifizierungsaufgabe finden Sie unter Out-of-Core-Klassifizierung von Textdokumenten (http://scikit-learn.org/stable/auto_examples/applications/plot_out_of_core_classification.html#) Siehe sphx-glr-auto-beispiele-anwendungen-plot-out-of-core-klassifikation-py).

4.2.3.10 Anpassung der Vektorisierungsklasse

Sie können das Verhalten anpassen, indem Sie das Callable an den Vectorizer-Konstruktor übergeben.

>>> def my_tokenizer(s):
...     return s.split()
...
>>> vectorizer = CountVectorizer(tokenizer=my_tokenizer)
>>> vectorizer.build_analyzer()(u"Some... punctuation!") == (
...     ['some...', 'punctuation!'])
True

Speziell,

--preprocessor: Ein aufrufbares Objekt, das das gesamte Dokument als Eingabe (als einzelne Zeichenfolge) aufrufen und das konvertierte Dokument zurückgeben kann. Es kann verwendet werden, um HTML-Tags zu entfernen oder das gesamte Dokument zu verkleinern. -- Tokenizer: Ein aufrufbares Objekt, das die Ausgabe des Präprozessors in Token aufteilt und eine Liste davon zurückgibt. --analyzer: Ein aufrufbares Objekt, das den Präprozessor und den Tokenizer ersetzt. Alle Standardanalysatoren rufen den Präprozessor und den Tokenizer auf, aber benutzerdefinierte Analysatoren überspringen dies. Die N-Gramm-Extraktion und die Stoppwortfilterung werden auf Analysatorebene durchgeführt, sodass benutzerdefinierte Analysatoren diese Schritte reproduzieren müssen.

(Lucene-Benutzer erkennen diese Namen möglicherweise, beachten Sie jedoch, dass das Scicit-Learn-Konzept möglicherweise nicht eins zu eins mit dem Lucene-Konzept übereinstimmt.) Anstatt benutzerdefinierte Funktionen zu übergeben, können Sie von der Klasse ableiten und die Factory-Methoden build_preprocessor, build_tokenizer und build_analyzer überschreiben, damit Präprozessor, Tokenizer und Analysator die Modellparameter erkennen können.

Einige Tipps und Tricks:

--Wenn das Dokument von einem externen Paket vorab mit einem Token versehen wurde, speichern Sie die durch Leerzeichen getrennten Token in einer Datei (oder Zeichenfolge) und übergeben Sie analyzer = str.split

  • Eine großartige Token-Level-Analyse wie Stemming, Morph-Splitting, Compound-Splitting, partizipative Filterung usw. ist nicht in der Scicit-Learning-Codebasis enthalten, kann jedoch durch Anpassen des Tokenizers oder des Analysators hinzugefügt werden. Hier ist ein CountVectorizer mit einem Tokenizer und Rematizer unter Verwendung von NLTK:
>>> from nltk import word_tokenize          
>>> from nltk.stem import WordNetLemmatizer 
>>> class LemmaTokenizer(object):
...     def __init__(self):
...         self.wnl = WordNetLemmatizer()
...     def __call__(self, doc):
...         return [self.wnl.lemmatize(t) for t in word_tokenize(doc)]
...
>>> vect = CountVectorizer(tokenizer=LemmaTokenizer()) 

(Beachten Sie, dass dies keine Interpunktion ausschließt.)

Die Anpassung von Vectorizer ist auch nützlich, wenn Sie mit asiatischen Sprachen arbeiten, die keine expliziten Worttrennzeichen wie Leerzeichen verwenden.

4.2.4. Extraktion von Bildmerkmalen

4.2.4.1 Patch-Extraktion

extract_patches_2 Die Funktion ist ein als zweidimensionales Array gespeichertes Bild. Oder extrahieren Sie ein 3D-Patch mit Farbinformationen entlang der 3. Achse. Um das Image aus allen Patches neu zu erstellen, klicken Sie auf [refresh_from_patches_2d](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.image.reconstruct_from_patches_2d.html#sklearn.feature_extraction.image.reconst_ Verwenden Sie die. Beispielsweise wird es verwendet, um ein 4x4-Pixel-Bild mit 3 Farbkanälen (z. B. RGB-Format) zu erzeugen.

>>> import numpy as np
>>> from sklearn.feature_extraction import image

>>> one_image = np.arange(4 * 4 * 3).reshape((4, 4, 3))
>>> one_image[:, :, 0]  # R channel of a fake RGB picture
array([[ 0,  3,  6,  9],
       [12, 15, 18, 21],
       [24, 27, 30, 33],
       [36, 39, 42, 45]])

>>> patches = image.extract_patches_2d(one_image, (2, 2), max_patches=2,
...     random_state=0)
>>> patches.shape
(2, 2, 2, 3)
>>> patches[:, :, :, 0]
array([[[ 0,  3],
        [12, 15]],

       [[15, 18],
        [27, 30]]])
>>> patches = image.extract_patches_2d(one_image, (2, 2))
>>> patches.shape
(9, 2, 2, 3)
>>> patches[4, :, :, 0]
array([[15, 18],
       [27, 30]])

Versuchen wir, das Originalbild aus dem Patch zu rekonstruieren, indem wir die überlappenden Bereiche mitteln.

>>> reconstructed = image.reconstruct_from_patches_2d(patches, (4, 4, 3))
>>> np.testing.assert_array_equal(one_image, reconstructed)

PatchExtractor Die Klasse funktioniert genauso wie extract_patches_2d, jedoch Unterstützt mehrere Bilder als Eingabe. Als Schätzer implementiert, kann es in Pipelines verwendet werden.

>>> five_images = np.arange(5 * 4 * 4 * 3).reshape(5, 4, 4, 3)
>>> patches = image.PatchExtractor((2, 2)).transform(five_images)
>>> patches.shape
(45, 2, 2, 3)

4.2.4.2. Bildkonnektivitätsdiagramm

Einige Schätzungen von Scikit-Learn können Funktionen oder Verbindungsinformationen zwischen Beispielen verwenden. Zum Beispiel kann Ward Clustering (Hierarchical Clustering (http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering)) nur benachbarte Pixel in einem Bild gruppieren Es kann ein durchgehender Fleck gebildet werden.

../_images/sphx_glr_plot_face_ward_segmentation_0011.png

Zu diesem Zweck verwendet der Schätzer eine "Konnektivitäts" -Matrix, die angibt, welche Abtastwerte verbunden sind. Die Funktion img_to_graph ist eine solche Matrix aus einem 2D- oder 3D-Bild. Kehrt zurück. In ähnlicher Weise wird grid_to_graph durch die Form dieser Bilder angegeben. Erstellen Sie eine verkettete Matrix für die resultierenden Bilder. Diese Matrizen können verwendet werden, um Schätzern, die Konnektivitätsinformationen verwenden, wie z. B. Ward Clustering (hierarchisches Clustering), Konnektivität aufzuerlegen. Es kann auch verwendet werden, um einen vorberechneten Kernel oder eine Ähnlichkeitsmatrix zu erstellen.

--Beispiel

  • [Demo des strukturierten Wortclusters auf dem Laclone-Gesichtsbild](http://scikit-learn.org/stable/auto_examples/cluster/plot_face_ward_segmentation.html#sphx-glr-auto-examples-cluster-plot-face-ward] -Segmentierung-py)
  • Spektrum-Clustering für die Bildsegmentierung
  • [Feature Agglomeration vs. One Variant Selection](http://scikit-learn.org/stable/auto_examples/cluster/plot_feature_agglomeration_vs_univariate_selection.html#sphx-glr-auto-examples-cluster-plot-feature-agglomeration-vs- univariate-selection-py)

[scikit-learn 0.18 Benutzerhandbuch 4. Datensatzkonvertierung](http://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF Von% E3% 82% BB% E3% 83% 83% E3% 83% 88% E5% A4% 89% E6% 8F% 9B)

© 2010 - 2016, Entwickler von Scikit-Learn (BSD-Lizenz).

Recommended Posts