[PYTHON] 100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität

Dies ist die Aufzeichnung des 75. "Gewichts der Natur" von Language Processing 100 Knock 2015. Es gibt aus, welche Eigenschaften für die Klassifizierung im trainierten (trainierten) Modell wichtig sind. Im Gegensatz zu Deep Learning sollte es beschreibend sein. Bis jetzt habe ich es nicht in den Block gepostet, da es im Grunde dasselbe war wie "Amateur-Sprachverarbeitung 100 Klopfen". , "Kapitel 8: Maschinelles Lernen" wurde ernst genommen und teilweise geändert. Ich werde posten. Ich benutze hauptsächlich scikit-learn.

Referenzlink

Verknüpfung Bemerkungen
075.Gewicht der Identität.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:75 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet
Einführung in Python mit 100 Klopfen Sprachverarbeitung#75 -Maschinelles Lernen, Scikit-coef lernen_Eigentum scikit-Klopfen Sie das Ergebnis mit lernen

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.

Art Ausführung
matplotlib 3.1.1
numpy 1.17.4
pandas 0.25.3
scikit-learn 0.21.3

Aufgabe

Kapitel 8: Maschinelles Lernen

In diesem Kapitel [Satzpolaritätsdatensatz] von Movie Review Data, veröffentlicht von Bo Pang und Lillian Lee. v1.0](http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.README.1.0.txt) wird verwendet, um den Satz positiv oder negativ zu machen. Arbeiten Sie an der Aufgabe (Polaritätsanalyse), um sie als (negativ) zu klassifizieren.

75. Gewicht der Identität

Überprüfen Sie die Top 10 Merkmale mit hohem Gewicht und die Top 10 Merkmale mit niedrigem Gewicht im logistischen Regressionsmodell, das in> 73 gelernt wurde.

Antworten

Antwortprogramm [075. Gewicht der Identität.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7 % BF% 92 / 075.% E7% B4% A0% E6% 80% A7% E3% 81% AE% E9% 87% 8D% E3% 81% BF.ipynb)

Grundsätzlich [Vorheriges "Antwortprogramm (Analyse) 074. Forecast.ipynb"](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2% B0% E5% AD% A6% E7% BF% 92/074.% E4% BA% 88% E6% B8% AC.ipynb) mit der Gewichtsanzeigelogik der Identität hinzugefügt.

import csv

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin

#Klasse zur Verwendung der Wortvektorisierung in GridSearchCV
class myVectorizer(BaseEstimator, TransformerMixin):
    def __init__(self, method='tfidf', min_df=0.0005, max_df=0.10):
        self.method = method
        self.min_df = min_df
        self.max_df = max_df

    def fit(self, x, y=None):
        if self.method == 'tfidf':
            self.vectorizer = TfidfVectorizer(min_df=self.min_df, max_df=self.max_df)
        else:
            self.vectorizer = CountVectorizer(min_df=self.min_df, max_df=self.max_df)
        self.vectorizer.fit(x)
        return self

    def transform(self, x, y=None):
        return self.vectorizer.transform(x)
		
#Parameter für GridSearchCV
PARAMETERS = [
    {
        'vectorizer__method':['tfidf', 'count'], 
        'vectorizer__min_df': [0.0003, 0.0004], 
        'vectorizer__max_df': [0.07, 0.10], 
        'classifier__C': [1, 3],    #Ich habe auch 10 ausprobiert, aber der SCORE ist niedrig, nur weil er langsam ist
        'classifier__solver': ['newton-cg', 'liblinear']},
    ]

#Datei lesen
def read_csv_column(col):
    with open('./sentiment_stem.txt') as file:
        reader = csv.reader(file, delimiter='\t')
        header = next(reader)
        return [row[col] for row in reader]    
		
x_all = read_csv_column(1)
y_all = read_csv_column(0)
x_train, x_test, y_train, y_test = train_test_split(x_all, y_all)

def train(x_train, y_train, file):
    pipline = Pipeline([('vectorizer', myVectorizer()), ('classifier', LogisticRegression())])
    
    #clf steht für Klassifizierung
    clf = GridSearchCV(
            pipline, # 
            PARAMETERS,           #Parametersatz, den Sie optimieren möchten
            cv = 5)               #Anzahl der Kreuztests
    
    clf.fit(x_train, y_train)
    pd.DataFrame.from_dict(clf.cv_results_).to_csv(file)

    print('Grid Search Best parameters:', clf.best_params_)
    print('Grid Search Best validation score:', clf.best_score_)
    print('Grid Search Best training score:', clf.best_estimator_.score(x_train, y_train))    
    
    #Ausgabe des Elementgewichts
    output_coef(clf.best_estimator_)
    
    return clf.best_estimator_

#Ausgabe des Elementgewichts
def output_coef(estimator):
    vec = estimator.named_steps['vectorizer']
    clf = estimator.named_steps['classifier']

    coef_df = pd.DataFrame([clf.coef_[0]]).T.rename(columns={0: 'Coefficients'})
    coef_df.index = vec.vectorizer.get_feature_names()
    coef_sort = coef_df.sort_values('Coefficients')
    coef_sort[:10].plot.barh()
    coef_sort.tail(10).plot.barh()

def validate(estimator, x_test, y_test):
    
    for i, (x, y) in enumerate(zip(x_test, y_test)):
        y_pred = estimator.predict_proba([x])
        if y == np.argmax(y_pred).astype( str ):
            if y == '1':
                result = 'TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv'
            else:
                result = 'TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ'
        else:
            if y == '1':
                result = 'FN:Die richtige Antwort ist positiv und die Vorhersage ist negativ'
            else:
                result = 'FP:Die richtige Antwort ist negativ und die Vorhersage ist positiv'
        print(result, y_pred, x)
        if i == 29:
            break

estimator = train(x_train, y_train, 'gs_result.csv')
validate(estimator, x_test, y_test)

Kommentar beantworten

Ich versuche mit der Funktion output_coef die besten hohen Parameter im Training zu erhalten.

#Ausgabe des Elementgewichts
output_coef(clf.best_estimator_)

Da es sich um eine Pipeline handelt, ist sie in Schritte unterteilt. Rufen Sie jeden Schritt aus dem Attribut "named_steps" ab.

vec = estimator.named_steps['vectorizer']
clf = estimator.named_steps['classifier']

Speichern Sie das Gewicht im DataFrame von Pandas und transponieren Sie es. Ändern Sie zu diesem Zeitpunkt den Spaltennamen.

coef_df = pd.DataFrame([clf.coef_[0]]).T.rename(columns={0: 'Coefficients'})

Nach Gewichtswert sortieren, mit Index als Merkmal.

coef_df.index = vec.vectorizer.get_feature_names()
coef_sort = coef_df.sort_values('Coefficients')

Schließlich wird es als Balkendiagramm ausgegeben.

coef_sort[:10].plot.barh()
coef_sort.tail(10).plot.barh()

Ergebnis der Ausgabe des Elementgewichts

Top 10 Qualitäten mit geringem Gewicht

Negative Wörter wie schlecht und langweilig stehen in einer Reihe. Ist Fernsehen ein Rezensionssatz wie "Fernsehen ist interessant"? image.png

Top 10 der höchsten Gewichte

Positive Wörter wie bearuti (schön) und join sind in einer Reihe. Führen Sie ein Wort wie "Kostenleistung" durch? Ich denke nicht, dass Fehler ein sehr gutes Wort ist, aber dieses Mal werde ich nicht so viel darauf eingehen. image.png

Recommended Posts

100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
100 Sprachverarbeitung Knock-77 (mit Scicit-Learn): Messung der korrekten Antwortrate
100-Sprach-Verarbeitung Knock-79 (mit Scikit-Learn): Präzisions-Recall-Grafikzeichnung
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-33 (mit Pandas): Sahen Nomen
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
Sprachverarbeitung 100 Knocks-44: Visualisierung abhängiger Bäume
100 Sprachverarbeitung Knock-26: Entfernen von hervorgehobenem Markup
100 Sprachverarbeitung Knock-39 (mit Pandas): Zipf-Gesetz
100 Sprachverarbeitung Knock-34 (mit Pandas): "B von A"
100 Sprachverarbeitung Knock-96 (unter Verwendung von Gensim): Extraktion des Vektors in Bezug auf den Ländernamen
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung Knock-90 (mit Gensim): Lernen mit word2vec
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung Knock-93 (unter Verwendung von Pandas): Berechnung der Genauigkeitsrate der Analogie-Aufgabe
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
100-Sprach-Verarbeitung Knock-98 (unter Verwendung von Pandas): Clustering nach Ward-Methode
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
Funktionen der Go-Sprache
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
Lernen Sie mit "Google Colaboratory" ganz einfach 100 Sprachverarbeitungsklopfen 2020.
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Parallele Verarbeitung mit Parallel von Scikit-Learn
Python: Grundlagen der Verwendung von Scikit-Learn ①
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit