sdpython / papierstat

Lectures on Machine Learning (French)
http://www.xavierdupre.fr/app/papierstat/helpsphinx/index.html
MIT License
8 stars 2 forks source link

Choix des classificateurs dans Classification de phrases avec word2vect #25

Open didier-devel opened 4 years ago

didier-devel commented 4 years ago

Bonjour. J'ai utilisé votre Notebook http://www.xavierdupre.fr/app/papierstat/helpsphinx/notebooks/text_sentiment_wordvec.html comme point d'entrée pour découvrir les possibilités de traitement de texte en machine learning. Je l'ai trouvé très instructif et pédagogique et rempli de pointeurs très intéressants. Merci pour ça. Voici en retour quelques remarques, au cas ou vous les trouvez utiles. Je n'ai pas trouvé d'autre moyen pour vous les communiquer, alors j'utilise une issue github pour cela.

Les remarques couvrent:

Choix du classificateur: Le randomforest ne semble pas le meilleur classificateur possible. Intuitivement, il y a un grand risque d'overfitting dans une espace à plusieurs centaines de dimensions, et donc quasiment vide d'échantillons. Des classificateurs linéaires semblent mieux marcher, notamment le Multinomial Naive Bayes (utilisé pour la détection de spam je crois), qui marche très bien sur les sacs de mots, et dans tous les cas la régression logistique. LinearSVM est assez efficace aussi sur ce modèle.

Ces classificateurs améliorent sensiblement les performance des modèles (voir table ci-dessous et exemple de code Python 2.7 attaché), sans toutefois changer les conclusions de votre notebook, à savoir que les n-grammes n'améliorent pas significativement les performances, TSVD, appris avec ce petit corpus, détériore les performances, et word2vect améliore légèrement les performances.

Dérivation de features utilisant word2vect avec classificateur classiques.

La moyenne des vecteurs des mots d'une phrase semble donner de meilleurs résultat que la somme.
Cela se voit surtout avec les classificateurs autre que RandomForest.

Démontrer l'intérêt de word2vect:

Sur les expériences que vous proposez dans le notebook, l'intérêt de word2vect est limité.
Par contre, il est bien plus visible avec des réseaux de neurones.
Sur une architecture  layer d'embedding / layer récurrent GRU / layer dense pour la classification, on a une nette amélioration si on remplace l'embedding par celui de word2vect.
C'est d'ailleurs la méthode qui donne le meilleur résultat parmi celles que j'ai testées.

Voici pour information un résumé (produit par le code python 2.7 / tensorflow 2 en attachement) des différentes expériences. Les résultat varient de quelques % d'une exécution à l'autre, en fonction su split train/test et autres paramètres aléatoires des modèles, mais la hiérarchie suivante est respectée la plupart du temps:

RandomForest < autres classificateurs Word2Vect legerement > sac de mots pour classificateurs classiques Word2Vect + moyenne legerement > Word2Vect + somme Word2Vect + réseaux de neurone > tout le reste.

                                   Pipe               Classifier  Score

0 Sac de mots simple RandomForest 0.79 1 Sac de mots simple Logit 0.83 2 Sac de mots simple Multinomial Naive Bayes 0.84 3 Sac de mots simple Linear SVC 0.85 4 Sac de N-grammes (1,2) RandomForest 0.77 5 Sac de N-grammes (1,2) Logit 0.82 6 Sac de N-grammes (1,2) Multinomial Naive Bayes 0.85 7 Sac de N-grammes (1,2) Linear SVC 0.84 8 Truncated SVD (300 dim) RandomForest 0.71 9 Truncated SVD (300 dim) Logit 0.79 10 Truncated SVD (300 dim) Linear SVC 0.80 11 Vecteurs word2vect (somme par phrase) RandomForest 0.79 12 Vecteurs word2vect (somme par phrase) Logit 0.82 13 Vecteurs word2vect (somme par phrase) Linear SVC 0.70 14 Vecteurs word2vect (moyenne par phrase) RandomForest 0.79 15 Vecteurs word2vect (moyenne par phrase) Logit 0.86 16 Vecteurs word2vect (moyenne par phrase) Linear SVC 0.84 17 Token sequence RN Embedding + GRU 0.83 18 Vector sequence from Word2Vect GRU 0.90

summary.py.gz

alexsg69 commented 4 years ago

Chers, J'ai utilisé le document de Xavier. Très intéressant. Pour des besoins de TP (enseignements), j'ai ajouté une méthode k-folds avec MNB et j'ai atteint un peut mieux que 85%. Je vais utiliser le fichier de didier (.py) et ferais un retour. Merci encore pour c ejob.

Alex

alexsg69 commented 4 years ago

AU fait : le qq lignes de code

import numpy as np mnb2 = MultinomialNB() Scores=[]

for i in range(Nb_folds) : res=next(k_fold.split(feattrain2), None) xtrain = feattrain2[res[0]] xtest = feattrain2[res[1]] ytrain = y_all.iloc[res[0]] ytest = y_all.iloc[res[1]] model__ = mnb2.fit(xtrain, ytrain) predictions_ = mnb2.predict(xtest) Scores.append(model__.score(xtest, ytest)) print('TRACE : Scores de chaque itération : ', Scores) print('La moyenn : ', np.mean(Scores))

Bien à vous