Il s'agit de l'enregistrement de la 74e «prédiction» de Language processing 100 knock 2015. La polarité (négative / positive) est prédite (inférée) à l'aide du modèle (entraîné) préalablement formé, et la probabilité de prédiction est également calculée. Jusqu'à présent, je ne l'ai pas posté sur le blog car c'était fondamentalement la même chose que "Traitement du langage amateur 100 coups". , "Chapitre 8: Machine Learning" a été pris au sérieux et modifié dans une certaine mesure. Je posterai. J'utilise principalement scikit-learn.
Lien | Remarques |
---|---|
074.Prévoir.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:74 | Je vous suis toujours redevable de 100 coups de traitement linguistique |
Introduction à Python avec 100 coups de traitement du langage#74 -Apprentissage automatique, scikit-Prédire la régression logistique avec Learn | scikit-Résultat Knock en utilisant Learn |
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
numpy | 1.17.4 |
pandas | 0.25.3 |
scikit-learn | 0.21.3 |
Dans ce chapitre, [jeu de données de polarité des phrases] de Movie Review Data publié par Bo Pang et Lillian Lee. v1.0](http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.README.1.0.txt) est utilisé pour rendre la phrase positive ou négative. Travailler sur la tâche (analyse de polarité) pour classer comme (négative)
En utilisant le modèle de régression logistique appris en> 73, implémentez un programme qui calcule l'étiquette de polarité d'une phrase donnée ("+1" pour un exemple positif, "-1" pour un exemple négatif) et sa probabilité de prédiction.
Fondamentalement, [Précédent "Programme de réponse (analyse) 073_2. Learning (Training) .ipynb"](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6 Prévu à% A2% B0% E5% AD% A6% E7% BF% 92 / 073_2.% E5% AD% A6% E7% BF% 92 (% E8% A8% 93% E7% B7% B4) .ipynb) C'est juste une partie ajoutée.
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
#Classe d'utilisation de la vectorisation de mots dans 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)
#Paramètres de GridSearchCV
PARAMETERS = [
{
'vectorizer__method':['tfidf', 'count'],
'vectorizer__min_df': [0.0003, 0.0004],
'vectorizer__max_df': [0.07, 0.10],
'classifier__C': [1, 3], #J'ai aussi essayé 10 mais le SCORE est faible juste parce qu'il est lent
'classifier__solver': ['newton-cg', 'liblinear']},
]
#Lire le fichier
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 signifie classification
clf = GridSearchCV(
pipline, #
PARAMETERS, #Jeu de paramètres que vous souhaitez optimiser
cv = 5) #Nombre de tests croisés
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:La bonne réponse est positive et la prédiction est positive'
else:
result = 'TN:La bonne réponse est négative et la prédiction est négative'
else:
if y == '1':
result = 'FN:La bonne réponse est positive et la prédiction est négative'
else:
result = 'FP:La bonne réponse est négative et la prédiction est positive'
print(result, y_pred, x)
if i == 29:
break
estimator = train(x_train, y_train, 'gs_result.csv')
validate(estimator, x_test, y_test)
Il est divisé en données d'entraînement et données de test à l'aide de la fonction train_test_split
. Il est naturel que les données entraînées soient plus précises, donc séparez les données qui ne sont pas utilisées pour l'entraînement pour la prédiction.
J'ai étudié dans article précédent "Cours d'introduction à l'apprentissage automatique de Coursera (6ème semaine - Conseils divers)".
x_train, x_test, y_train, y_test = train_test_split(x_all, y_all)
Je fais une prédiction en utilisant la fonction predict_proba
.
Il existe une fonction similaire «prédire», mais dans ce cas, seul le résultat (0 ou 1) est renvoyé sans renvoyer la probabilité.
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:La bonne réponse est positive et la prédiction est positive'
else:
result = 'TN:La bonne réponse est négative et la prédiction est négative'
else:
if y == '1':
result = 'FN:La bonne réponse est positive et la prédiction est négative'
else:
result = 'FP:La bonne réponse est négative et la prédiction est positive'
print(result, y_pred, x)
if i == 29:
break
Le résultat de la sortie de 30 lignes est comme ceci. Pour TP, TN, FP, FN, [Article "[Pour les débutants] Explication de l'indice d'évaluation des problèmes de classification de l'apprentissage automatique (taux de réponse correcte, taux de précision, taux de rappel, etc.)"](https://qiita.com/FukuharaYohei/ Veuillez vous référer aux articles / be89a99c53586fa4e2e4).
TN:La bonne réponse est négative et la prédiction est négative[[0.7839262 0.2160738]] restrain freak show mercenari obviou cerebr dull pretenti engag isl defi easi categor
FN:La bonne réponse est positive et la prédiction est négative[[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:La bonne réponse est négative et la prédiction est négative[[0.87843253 0.12156747]] insuffer movi mean make think existenti suffer instead put sleep
TN:La bonne réponse est négative et la prédiction est négative[[0.90800564 0.09199436]] minut condens episod tv seri pitfal expect
TP:La bonne réponse est positive et la prédiction est positive[[0.12240474 0.87759526]] absorb unsettl psycholog drama
TP:La bonne réponse est positive et la prédiction est positive[[0.42977787 0.57022213]] rodriguez chop smart aleck film school brat imagin big kid
FN:La bonne réponse est positive et la prédiction est négative[[0.59805784 0.40194216]] gangster movi capac surpris
TP:La bonne réponse est positive et la prédiction est positive[[0.29473058 0.70526942]] confront stanc todd solondz take aim polit correct suburban famili
TP:La bonne réponse est positive et la prédiction est positive[[0.21660554 0.78339446]] except act quietli affect cop drama
TP:La bonne réponse est positive et la prédiction est positive[[0.47919199 0.52080801]] steer unexpectedli adam streak warm blood empathi dispar manhattan denizen especi hole
TN:La bonne réponse est négative et la prédiction est négative[[0.67294895 0.32705105]] standard gun martial art clich littl new add
TN:La bonne réponse est négative et la prédiction est négative[[0.66582407 0.33417593]] sweet gentl jesu screenwrit cut past everi bad action movi line histori
TP:La bonne réponse est positive et la prédiction est positive[[0.41463847 0.58536153]] malcolm mcdowel cool paul bettani cool paul bettani play malcolm mcdowel cool
TP:La bonne réponse est positive et la prédiction est positive[[0.33183064 0.66816936]] center humor constant ensembl give buoyant deliveri
TN:La bonne réponse est négative et la prédiction est négative[[0.63371373 0.36628627]] let subtitl fool movi prove holli wood longer monopoli mindless action
TP:La bonne réponse est positive et la prédiction est positive[[0.25740295 0.74259705]] taiwanes auteur tsai ming liang good news fall sweet melancholi spell uniqu director previou film
FN:La bonne réponse est positive et la prédiction est négative[[0.57810652 0.42189348]] turntabl outsel electr guitar
FN:La bonne réponse est positive et la prédiction est négative[[0.52506635 0.47493365]] movi stay afloat thank hallucinatori product design
TN:La bonne réponse est négative et la prédiction est négative[[0.57268778 0.42731222]] non-mysteri mysteri
TP:La bonne réponse est positive et la prédiction est positive[[0.07663805 0.92336195]] beauti piec count heart import humor
TN:La bonne réponse est négative et la prédiction est négative[[0.86860199 0.13139801]] toothless dog alreadi cabl lose bite big screen
FP:La bonne réponse est négative et la prédiction est positive[[0.4918716 0.5081284]] sandra bullock hugh grant make great team predict romant comedi get pink slip
TN:La bonne réponse est négative et la prédiction est négative[[0.61861307 0.38138693]] movi comedi work better ambit say subject willing
FP:La bonne réponse est négative et la prédiction est positive[[0.47041114 0.52958886]] like lead actor lot manag squeez laugh materi tread water best forgett effort
TP:La bonne réponse est positive et la prédiction est positive[[0.26767592 0.73232408]] writer director juan carlo fresnadillo make featur debut fulli form remark assur
FP:La bonne réponse est négative et la prédiction est positive[[0.40931838 0.59068162]] grand fart come director begin resembl crazi french grandfath
FP:La bonne réponse est négative et la prédiction est positive[[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:La bonne réponse est positive et la prédiction est positive[[0.29555115 0.70444885]] perform uniformli good
TP:La bonne réponse est positive et la prédiction est positive[[0.34561148 0.65438852]] droll well act charact drive comedi unexpect deposit feel
TP:La bonne réponse est positive et la prédiction est positive[[0.31537766 0.68462234]] great participatori spectat sport
Recommended Posts