[PYTHON] 100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction

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 de référence

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

environnement

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

Tâche

Chapitre 8: Machine Learning

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)

74. Prévisions

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.

Répondre

Programme de réponse [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)

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)

Répondre au commentaire

Répartition des données

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)

Prévoir

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

100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
100 coups de traitement linguistique (2020): 28
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 traitements linguistiques knock-77 (en utilisant scicit-learn): mesure du taux de réponse
100 Language Processing Knock-33 (en utilisant des pandas): nom sahen
100 Language Processing Knock-39 (en utilisant des pandas): la loi de Zipf
100 traitement de langage knock-34 (utilisant des pandas): "B of A"
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
100 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement de 100 langues knock-98 (en utilisant des pandas): Clustering par méthode Ward
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
100 coups de traitement du langage avec Python 2015
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
100 coups de traitement du langage amateur: Résumé
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock-84 (en utilisant des pandas): Création d'une matrice de contexte de mots
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances