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.
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 |
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 |
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.
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.
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)
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)
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