[PYTHON] 100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage

Dies ist die Aufzeichnung der 74. "Vorhersage" von Sprachverarbeitung 100 Schläge 2015. Die Polarität (negativ / positiv) wird unter Verwendung des zuvor trainierten (trainierten) Modells vorhergesagt (abgeleitet), und die Vorhersagewahrscheinlichkeit wird ebenfalls berechnet. 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
074.Prognose.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:74 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet
Einführung in Python mit 100 Klopfen Sprachverarbeitung#74 -Maschinelles Lernen, Scikit-Prognostizieren Sie die logistische Regression mit learn 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
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.

74. Prognose

Implementieren Sie unter Verwendung des in> 73 erlernten logistischen Regressionsmodells ein Programm, das die Polaritätsbezeichnung eines bestimmten Satzes ("+1" für ein positives Beispiel, "-1" für ein negatives Beispiel) und seine Vorhersagewahrscheinlichkeit berechnet.

Antworten

Antwortprogramm [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)

Grundsätzlich [Vorheriges "Antwortprogramm (Analyse) 073_2. Lernen (Training) .ipynb"](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6 Vorausgesagt zu% A2% B0% E5% AD% A6% E7% BF% 92 / 073_2.% E5% AD% A6% E7% BF% 92 (% E8% A8% 93% E7% B7% B4) .ipynb) Es ist nur ein Teil hinzugefügt.

import csv

import pandas as pd
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))    

    return clf.best_estimator_
	
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

Datenaufteilung

Es wird mit der Funktion train_test_split in Trainingsdaten und Testdaten aufgeteilt. Es ist natürlich, dass die trainierten Daten genauer sind. Trennen Sie daher die Daten, die nicht für das Training zur Vorhersage verwendet werden. Ich habe in Vorheriger Artikel "Coursera Machine Learning-Einführungskurs (6. Woche - verschiedene Ratschläge)" studiert.

x_train, x_test, y_train, y_test = train_test_split(x_all, y_all)

Prognose

Ich mache eine Vorhersage mit der Funktion pred_proba. Es gibt eine ähnliche Funktion "Vorhersagen", aber in diesem Fall wird nur das Ergebnis (0 oder 1) zurückgegeben, ohne die Wahrscheinlichkeit zurückzugeben.

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

Das Ergebnis der Ausgabe von 30 Zeilen ist wie folgt. Für TP, TN, FP, FN, [Artikel "[Für Anfänger] Erläuterung des Bewertungsindex für Klassifizierungsprobleme beim maschinellen Lernen (korrekte Antwortrate, Präzisionsrate, Rückrufrate usw.)"](https://qiita.com/FukuharaYohei/ Bitte beziehen Sie sich auf Artikel / be89a99c53586fa4e2e4).

TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.7839262 0.2160738]] restrain freak show mercenari obviou cerebr dull pretenti engag isl defi easi categor
FN:Die richtige Antwort ist positiv und die Vorhersage ist negativ[[0.6469949 0.3530051]] chronicl man quest presid man singl handedli turn plane full hard bitten cynic journalist essenti campaign end extend public depart
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.87843253 0.12156747]] insuffer movi mean make think existenti suffer instead put sleep
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.90800564 0.09199436]] minut condens episod tv seri pitfal expect
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.12240474 0.87759526]] absorb unsettl psycholog drama
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.42977787 0.57022213]] rodriguez chop smart aleck film school brat imagin big kid
FN:Die richtige Antwort ist positiv und die Vorhersage ist negativ[[0.59805784 0.40194216]] gangster movi capac surpris
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.29473058 0.70526942]] confront stanc todd solondz take aim polit correct suburban famili
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.21660554 0.78339446]] except act quietli affect cop drama
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.47919199 0.52080801]] steer unexpectedli adam streak warm blood empathi dispar manhattan denizen especi hole
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.67294895 0.32705105]] standard gun martial art clich littl new add
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.66582407 0.33417593]] sweet gentl jesu screenwrit cut past everi bad action movi line histori
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.41463847 0.58536153]] malcolm mcdowel cool paul bettani cool paul bettani play malcolm mcdowel cool
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.33183064 0.66816936]] center humor constant ensembl give buoyant deliveri
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.63371373 0.36628627]] let subtitl fool movi prove holli wood longer monopoli mindless action
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.25740295 0.74259705]] taiwanes auteur tsai ming liang good news fall sweet melancholi spell uniqu director previou film
FN:Die richtige Antwort ist positiv und die Vorhersage ist negativ[[0.57810652 0.42189348]] turntabl outsel electr guitar
FN:Die richtige Antwort ist positiv und die Vorhersage ist negativ[[0.52506635 0.47493365]] movi stay afloat thank hallucinatori product design
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.57268778 0.42731222]] non-mysteri mysteri
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.07663805 0.92336195]] beauti piec count heart import humor
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.86860199 0.13139801]] toothless dog alreadi cabl lose bite big screen
FP:Die richtige Antwort ist negativ und die Vorhersage ist positiv[[0.4918716 0.5081284]] sandra bullock hugh grant make great team predict romant comedi get pink slip
TN:Die richtige Antwort ist negativ und die Vorhersage ist negativ[[0.61861307 0.38138693]] movi comedi work better ambit say subject willing
FP:Die richtige Antwort ist negativ und die Vorhersage ist positiv[[0.47041114 0.52958886]] like lead actor lot manag squeez laugh materi tread water best forgett effort
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.26767592 0.73232408]] writer director juan carlo fresnadillo make featur debut fulli form remark assur
FP:Die richtige Antwort ist negativ und die Vorhersage ist positiv[[0.40931838 0.59068162]] grand fart come director begin resembl crazi french grandfath
FP:Die richtige Antwort ist negativ und die Vorhersage ist positiv[[0.43081731 0.56918269]] perform sustain intellig stanford anoth subtl humour bebe neuwirth older woman seduc oscar film founder lack empathi social milieu rich new york intelligentsia
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.29555115 0.70444885]] perform uniformli good
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.34561148 0.65438852]] droll well act charact drive comedi unexpect deposit feel
TP:Die richtige Antwort ist positiv und die Vorhersage ist positiv[[0.31537766 0.68462234]] great participatori spectat sport

Recommended Posts

100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100-Sprach-Verarbeitung Knock-79 (mit Scikit-Learn): Präzisions-Recall-Grafikzeichnung
100 Sprachverarbeitungsklopfen (2020): 28
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
100 Sprachverarbeitung Knock-77 (mit Scicit-Learn): Messung der korrekten Antwortrate
100 Sprachverarbeitung Knock-33 (mit Pandas): Sahen Nomen
100 Sprachverarbeitung Knock-39 (mit Pandas): Zipf-Gesetz
100 Sprachverarbeitung Knock-34 (mit Pandas): "B von A"
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-90 (mit Gensim): Lernen mit word2vec
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100-Sprach-Verarbeitung Knock-98 (unter Verwendung von Pandas): Clustering nach Ward-Methode
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
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)
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
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
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock-84 (mit Pandas): Erstellen einer Wortkontextmatrix
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse