6
votes

Le score de cohérence 0,4 est-il bon ou mauvais?

J'ai besoin de savoir si un score de cohérence de 0,4 est bon ou mauvais? J'utilise LDA comme algorithme de modélisation de sujets.

Quel est le score de cohérence moyen dans ce contexte.


0 commentaires

3 Réponses :


34
votes

La cohérence mesure la distance relative entre les mots dans un sujet. Il existe deux types principaux C_V typiquement 0

  • .3 est mauvais

    .4 est faible

    .55 ça va

    .65 pourrait être aussi bon qu'il le sera

    .7 c'est bien

    .8 est peu probable et

    .9 est probablement faux

  • Corrections de faible cohérence:

    • ajustez vos paramètres alpha = .1, beta = .01 ou .001, random_state = 123, etc.

    • obtenir de meilleures données

    • à .4, vous avez probablement le mauvais nombre de sujets à consulter https://datascienceplus.com/evaluation-of-topic-modeling-topic-coherence/ pour ce que l'on appelle la méthode du coude - il vous donne un graphique du nombre optimal de sujets pour une plus grande cohérence dans votre base de données. J'utilise un maillet qui a une assez bonne cohérence, voici du code pour vérifier la cohérence pour différents nombres de sujets:

    def compute_coherence_values(dictionary, corpus, texts, limit, start=2, step=3):
        """
        Compute c_v coherence for various number of topics
    
        Parameters:
        ----------
        dictionary : Gensim dictionary
        corpus : Gensim corpus
        texts : List of input texts
        limit : Max num of topics
    
        Returns:
        -------
        model_list : List of LDA topic models
        coherence_values : Coherence values corresponding to the LDA model with respective number of topics
        """
        coherence_values = []
        model_list = []
        for num_topics in range(start, limit, step):
            model = gensim.models.wrappers.LdaMallet(mallet_path, corpus=corpus, num_topics=num_topics, id2word=id2word)
            model_list.append(model)
            coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v')
            coherence_values.append(coherencemodel.get_coherence())
    
        return model_list, coherence_values
    # Can take a long time to run.
    model_list, coherence_values = compute_coherence_values(dictionary=id2word, corpus=corpus, texts=data_lemmatized, start=2, limit=40, step=6)
    # Show graph
    limit=40; start=2; step=6;
    x = range(start, limit, step)
    plt.plot(x, coherence_values)
    plt.xlabel("Num Topics")
    plt.ylabel("Coherence score")
    plt.legend(("coherence_values"), loc='best')
    plt.show()
    
    # Print the coherence scores
    for m, cv in zip(x, coherence_values):
        print("Num Topics =", m, " has Coherence Value of", round(cv, 4))
        
    # Select the model and print the topics
    optimal_model = model_list[3]
    model_topics = optimal_model.show_topics(formatted=False)
    pprint(optimal_model.print_topics(num_words=10))

    J'espère que cela vous aidera :)


    3 commentaires

    une idée de ce à quoi correspondent les paramètres alpha, beta que vous mentionnez dans le modèle lda de Gensim? ( radimrehurek.com/gensim/models/ldamodel.html )


    @Vincent Alpha est le paramètre de concentration de Dirichlet-prior de la distribution de rubrique par document où en tant que bêta est le même paramètre de la distribution de mot par rubrique. Veuillez consulter ce lien. thinkvector.io/blog/…


    Pouvez-vous suggérer un article dans lequel les scores et les niveaux que vous avez fournis sont définis dans des expériences?



    0
    votes

    En plus de l'excellente réponse de Sara:

    Cohérence UMass mesurer la fréquence à laquelle les deux mots (Wi, Wj) ont été vus ensemble dans le corpus. Il est défini comme suit:

    D(Wi, Wj) = log [ (D(Wi, Wj) + EPSILON) / D(Wi) ]
    

    Où: D (Wi, Wj) est le nombre de fois où le mot Wi et le mot Wj sont apparus ensemble

    D (Wi) est le nombre de fois où le mot Wi est apparu seul dans le corpus

    EPSILON est un petit valeur (comme 1e-12) ajoutée au numérateur pour éviter les valeurs 0

    Si Wi et Wj n'apparaissent jamais ensemble, alors il en résulte un log (0) qui brisera l'univers. La valeur EPSILON est une sorte de hack pour résoudre ce problème.

    En conclusion, vous pouvez obtenir une valeur d'un très grand nombre négatif jusqu'à environ 0. L'interprétation est la même que celle que Sara a écrite, plus la valeur est grande. nombre le mieux, où 0 serait manifestement faux.


    0 commentaires

    0
    votes

    Je voudrais juste ajouter que le bien ou le mal est relatif au corpus sur lequel vous travaillez et aux scores des autres clusters.

    Dans le lien fourni par Sara, l'article montre 33 sujets comme optimaux avec un score de cohérence de ~ 0,33, mais comme l'auteur le mentionne, il se peut qu'il y ait des termes répétés dans ce groupe. Dans ce cas, vous devrez comparer les termes / extraits de la décomposition de cluster optimale à un score de cohérence inférieur pour voir si les résultats sont plus ou moins interprétables.

    Bien sûr, vous devriez ajuster les paramètres de votre modèle mais le score dépend du contexte, et je ne pense pas que vous puissiez nécessairement dire qu'un score de cohérence spécifique a regroupé vos données de manière optimale sans d'abord comprendre à quoi ressemblent les données. Cela dit, comme Sara l'a mentionné, ~ 1 ou ~ 0 sont probablement faux.

    Vous pouvez comparer votre modèle à un jeu de données de référence et s'il a une plus grande cohérence, alors vous avez une meilleure mesure de l'efficacité de votre modèle.

    Ce document m'a été utile: https://rb.gy/kejxkz


    0 commentaires