Il s'agit de l'enregistrement du 76e «étiquetage» de 100 langues de traitement knock 2015. Le contenu de la question de Knock est étiqueté avec des prédictions pour les données d'entraînement, mais cette fois, j'ose le faire avec des données de test. Jusqu'à présent, je ne l'ai pas posté dans le bloc 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 |
---|---|
076.Étiquetage.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:76 | Je vous suis toujours redevable de 100 coups de traitement linguistique |
Introduction à Python avec 100 coups de traitement du langage#76 -Apprentissage automatique, scikit-Probabilité de prédiction en apprentissage | 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 |
---|---|
matplotlib | 3.1.1 |
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. Travaillez sur la tâche (analyse de polarité) à classer comme (négative).
Appliquez le modèle de régression logistique aux données d'entraînement et produisez le bon libellé, le libellé prévu et la probabilité prédite au format délimité par des tabulations.
Cette fois, la partie "pour les données d'apprentissage" est ignorée et les données de test sont utilisées. Je pensais que les données de test seraient plus utiles que les données de formation.
Fondamentalement [Précédent "Programme de réponse (analyse) 075. Poids de l'identité.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 ) Avec logique de prédiction et de sortie de fichier.
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
#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))
#Sortie de poids d'élément
output_coef(clf.best_estimator_)
return clf.best_estimator_
#Sortie de poids d'élément
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: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
#Sortie de liste TSV
y_pred = estimator.predict(x_test)
y_prob = estimator.predict_proba(x_test)
results = pd.DataFrame([y_test, y_pred, y_prob.T[1], x_test]).T.rename(columns={ 0: 'Bonne réponse', 1 : 'Prévoir', 2: 'Prévoir確率(positif)', 3 :'Chaîne de mots'})
results.to_csv('./predict.txt' , sep='\t')
estimator = train(x_train, y_train, 'gs_result.csv')
validate(estimator, x_test, y_test)
Le fichier délimité par des tabulations suivant est généré par la fonction to_csv
de pandas
.
Colonne | article | Exemple | |
---|---|---|---|
1ère rangée | Étiquette de réponse correcte | もともと持っていたÉtiquette de réponse correcte | 0(0 est négatif) |
2e rangée | Étiquette de prédiction | predict_proba Résultat de prédiction obtenu à l'aide de la fonction |
0(0 est négatif) |
3e rangée | Probabilité de prédiction | predict_proba 関数を使って取得したProbabilité de prédiction。La deuxième colonne de la valeur de retour de la fonction est la probabilité d'être positive |
0.4436 |
4e rangée | Chaîne de mots | もともと持っていたChaîne de motsの説明変数 | empti shell epic rather real deal |
#Sortie de liste TSV
y_pred = estimator.predict(x_test)
y_prob = estimator.predict_proba(x_test)
results = pd.DataFrame([y_test, y_pred, y_prob.T[1], x_test]).T.rename(columns={ 0: 'Bonne réponse', 1 : 'Prévoir', 2: 'Prévoir確率(positif)', 3 :'Chaîne de mots'})
results.to_csv('./predict.txt' , sep='\t')
Fichier de sortie [predict.txt](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF% 92 / predict.txt) est sur GitHub.
Recommended Posts