1
votes

L'analyse des sentiments multi-classes BERT a une faible précision?

Je travaille sur un petit ensemble de données qui:

  • Contient 1500 articles de presse.

  • Tous ces articles ont été classés par des êtres humains en fonction de leur sentiment / degré de positif sur une échelle de 5 points.

  • Propre en termes de fautes d'orthographe. J'ai utilisé la feuille google pour vérifier l'orthographe avant de l'importer dans l'analyse. Il y a encore des caractères qui ne sont pas correctement codés, mais pas beaucoup.

  • La longueur moyenne est supérieure à 512 mots.

  • Ensemble de données légèrement déséquilibré.

Je considère cela comme un problème de classification multi-classes et je veux affiner BERT avec cet ensemble de données. Pour ce faire, j'ai utilisé le package Ktrain et je suis essentiellement le tutoriel. Voici mon code:

begin training using onecycle policy with max lr of 1e-05...
Train on 1405 samples
Epoch 1/4
1405/1405 [==============================] - 186s 133ms/sample - loss: 0.7220 
- accuracy: 0.5431
Epoch 2/4
1405/1405 [==============================] - 167s 119ms/sample - loss: 0.6866 
- accuracy: 0.5843
Epoch 3/4
1405/1405 [==============================] - 166s 118ms/sample - loss: 0.6565 
- accuracy: 0.6335
Epoch 4/4
1405/1405 [==============================] - 166s 118ms/sample - loss: 0.5321 
- accuracy: 0.7587

             precision    recall  f1-score   support

       1       0.77      0.69      0.73       241
       2       0.46      0.56      0.50       111

accuracy                           0.65       352
macro avg       0.61      0.63      0.62       352
weighted avg       0.67      0.65      0.66       352

array([[167,  74],
       [ 49,  62]])

Cependant, je n'obtiens qu'une précision de validation d'environ 25%, ce qui est bien trop faible.

training data: 956 samples (excluding those classified as neutural)
truncation strategy: use the first 128 and last 128 tokens
(x_train,  y_train), (x_test, y_test), preproc_l1 = 
                     text.texts_from_array(x_train=x_train, y_train=y_train,    
                     x_test=x_test, y_test=y_test                      
                     class_names=categories_1,                      
                     preprocess_mode='bert',                                                          
                     maxlen=  256,                                                                  
                     max_features=35000)
Results:
              precision    recall  f1-score   support

       1       0.65      0.80      0.72       151
       2       0.45      0.28      0.35        89

accuracy                               0.61       240
macro avg          0.55      0.54      0.53       240
weighted avg       0.58      0.61      0.58       240

array([[121,  30],
       [ 64,  25]])


1 commentaires

Le batch_size recommandé pour bert est 16,32, essayez de l'utiliser. Voici un article sur la classification de texte multi-classes utilisant BERT qui pourrait être utile: pysnacks.com/machine-learning/... En outre, je recommanderais d'augmenter la taille du lot plutôt que de décomposer l'apprentissage basé sur cet article de Google: arxiv .org / abs / 1711.00489


3 Réponses :


0
votes

Essayez de traiter le problème comme une tâche de régression de texte comme ce modèle de sentiment Yelp , qui a été formé à l'aide de ktrain .


1 commentaires

Merci pour votre suggestion. J'ai essayé d'exécuter cela comme une régression de texte. J'ai finalement obtenu un MAE à environ 1,1, étant donné qu'il s'agit d'une échelle de 1 à 5, mae à 1,1 semble être assez grand. Ai-je raison?



1
votes

Essayer l'optimisation des hyperparamètres.

Avant de faire Learner.fit_onecycle (2e-5, 4) . Essayez: Learner.lr_find (show_plot = True, max_epochs = 2)

Toutes les classes ont-elles un poids d'environ 20%? Essayez peut-être quelque chose de cette façon:

MODEL_NAME = 'bert'
t = text.Transformer(MODEL_NAME, maxlen=500, class_names=train_b.target_names)

.....
.....

# the one we got most wrong
learner.view_top_losses(n=1, preproc=t)

Pour la classe ci-dessus, augmentez la pondération.

L'ensemble de validation a-t-il un échantillonnage stratifié ou un échantillonnage aléatoire? P >


2 commentaires

Merci pour vos commentaires. Je viens de mettre à jour mon message. Sur la base de vos suggestions, je n'ai pas constaté d'amélioration significative. L'ensemble de validation a un échantillonnage aléatoire.


À ce stade, je vous suggère d'essayer un modèle de base RNN pour avoir une idée de base. J'ai travaillé sur un problème . J'espère que cela aide.



1
votes

La forme de votre courbe d'apprentissage n'est pas attendue.

 Courbe LR pour un problème similaire Ma courbe (ci-dessus) montre que le TR devrait être autour de 1e-5, mais le vôtre est plat.

Essayez de prétraiter vos données:

  • Supprimez les chiffres et les émoticônes.
  • Vérifiez à nouveau vos données pour détecter les erreurs (généralement dans y_train).
  • Utilisez votre modèle de langue ou multilingue si ce n'est pas l'anglais.

Vous avez dit que:

La longueur moyenne est supérieure à 512 mots.

Essayez de diviser chaque texte en 512 jetons, car vous pouvez perdre beaucoup d'informations pour la classification lorsque le modèle BERT le tronque.


2 commentaires

Merci beaucoup pour vos commentaires. J'ai mis à jour mon message en fonction de vos suggestions. Ils sont meilleurs, mais n'ont toujours pas répondu à mes attentes. J'utilise actuellement une stratégie Head + tail pour traiter les articles de plus de 512. Est-ce ce que vous suggérez? ou voulez-vous dire que je sépare chaque article en différentes parties et les agrège d'une manière ou d'une autre?


Vous pouvez transformer chaque texte en plusieurs échantillons. Si vous avez, par exemple, un texte de 2000 jetons, vous pouvez générer quatre env. Échantillons de 500 longs avec des phrases choisies au hasard. ce n'est qu'une tentative, mais cela peut fonctionner. J'obtiens des résultats plus rapides et meilleurs avec la classification NBSVM. Essayez de les comparer.