J'ai commencé l'apprentissage automatique avec le clustering Python, la compression et la visualisation de dimensions

</ i> Introduction

Cela fait un moment depuis le dernier "Prétraitement des données", mais cette fois je vais essayer de regrouper les données textuelles Twitter.

</ i> Résumé en 3 lignes

  • (Enfin) groupé. -Le résultat du clustering a été visualisé avec matplotlib. ――La prochaine fois, cela peut être une route secondaire pour introduire des astuces de visualisation.

</ i> Soudainement le code source (autre que la visualisation)

Dernière fois J'ai ajouté l'implémentation de ** "clustering" **** "dimension compression" ** à l'implémentation de "vectorize". (La source de "visualisation" est un peu longue, donc plus tard)

tw_ml.py(Extrait)


#! /usr/bin/env python
# -*- coding:utf-8 -*-

import MeCab as mc
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.decomposition import TruncatedSVD

MECAB_OPT = "-Ochasen -d C:\\tmp\\mecab-ipadic-neologd\\"

NUM_CLUSTER = 3
SAMPLE_DATA = [
    #Omis car c'est la même chose que la dernière fois
]

def mecab_tokenizer(text):
    #Omis car c'est la même chose que la dernière fois

def main():

    #Initialisation de la classe vectorielle (identique à la dernière fois)
    vectorizer = TfidfVectorizer(
        min_df=1, stop_words=[u"Perfume", u"HTTPS"],
        tokenizer=mecab_tokenizer)
    #Vectorisation des échantillons de données (identique à la dernière fois)
    tfidf_weighted_matrix = vectorizer.fit_transform(SAMPLE_DATA)

    # K-Signifie l'initialisation de la classe d'analyse de cluster
    km_model = KMeans(n_clusters=NUM_CLUSTER)
    #Effectuer une analyse de cluster en alimentant des informations vectorielles
    km_model.fit(tfidf_weighted_matrix)

    #Initialisation de la classe de compression dimensionnelle (décomposition de valeurs singulières)
    lsa = TruncatedSVD(2)
    #Compression bidimensionnelle des données d'échantillon et des informations vectorielles des points centraux de la grappe
    compressed_text_list = lsa.fit_transform(tfidf_weighted_matrix)
    compressed_center_list = lsa.fit_transform(km_model.cluster_centers_)

if __name__ == '__main__':
    main()

Jetons un coup d'œil à ce que nous faisons.

</ i> Clustering

python


# K-Signifie l'initialisation de la classe d'analyse de cluster
km_model = KMeans(n_clusters=NUM_CLUSTER)
#Effectuer une analyse de cluster en alimentant des informations vectorielles
km_model.fit(tfidf_weighted_matrix)

Le contenu du traitement est tel qu'écrit dans le commentaire. Le problème ici est les paramètres passés lors de l'initialisation de la classe KMeans, mais le réglage est presque inutile si vous voulez juste la déplacer pour le moment. Étant donné que le nombre de données traitées cette fois est aussi petit que 5, le nombre de clusters a été modifié de ** 8 ** par défaut à ** 3 **, mais les autres restent la valeur par défaut. (Détails des autres paramètres: sklearn.cluster.KMeans)

Après l'initialisation, alimentez simplement les données avec ajustement et analysez. Les principaux résultats de l'analyse peuvent être confirmés en se référant à ce qui suit de km_model.

Paramètres Contenu Exemple de valeur
km_model.cluster_centers_ Informations vectorielles du point central pour chaque cluster [[0, 0, 0.46369322, 0.46369322, 0, 0.46369322, 0, 0, 0, 0, 0, 0, 0, 0.37410477]...(Autant que le nombre de clusters)]
km_model.labels_ Libellé de chaque élément des données à analyser (valeur indiquant à quel cluster il appartient) [2 1 1 0 1]

Cependant, même si vous pouvez voir ce résultat (liste de valeurs numériques), c'est trop Nanno Kocha, alors visualisons le cluster. La ** compression dimensionnelle ** suivante est requise pour cela.

</ i> Compression dimensionnelle (pour la visualisation)

python


#Initialisation de la classe de compression dimensionnelle (décomposition de valeurs singulières)
lsa = TruncatedSVD(2)
#Compression bidimensionnelle des données d'échantillon et des informations vectorielles des points centraux de la grappe
compressed_text_list = lsa.fit_transform(tfidf_weighted_matrix)
compressed_center_list = lsa.fit_transform(km_model.cluster_centers_)

Lorsque vous entendez «compression dimensionnelle», les ○ antagy finaux V et VIII vous viennent à l'esprit par réflexe. C'est un personnage qui rappelle quelque chose de SF. Cependant, le but est simplement de dire "Je ne peux pas afficher les informations de haute dimension, donc je veux les convertir en 2D de xy (car c'est une approximation) **". Ce n'est pas non plus un mot.

Plus précisément, étant donné que le nombre de dimensions est "le type de mot qui apparaît dans tous les textes" cette fois, les exemples de données sont les données à 14 dimensions suivantes. Il est difficile d'illustrer cela. [0, 0, 0.46369322, 0.46369322, 0, 0.46369322, 0, 0, 0, 0, 0, 0, 0, 0.37410477]

Ceci est fait dans les deux dimensions suivantes par compression de dimension. Si tel est le cas, vous pouvez le tracer sur le diagramme à 2 axes de xy. [9.98647967e-01, 0.00000000e+00]

Il existe différentes méthodes de compression de dimension, mais cette fois j'utiliserai ** Analyse sémantique latente (LSA) **. Cela semble également être fort, mais comme le montre le code source ci-dessus, c'est facile si vous utilisez scicit-lean (cette fois, j'utiliserai le SVD tronqué, mais il semble y en avoir d'autres). Dans la mise en œuvre ci-dessus, les informations vectorielles des données d'échantillon à 14 dimensions et les informations vectorielles du point central du résultat de l'analyse en grappes sont converties en 2 dimensions.

Vous êtes maintenant prêt à visualiser.

</ i> Code source (partie visualisée)

Avec l'implémentation jusqu'à présent, nous avons toutes les informations nécessaires pour visualiser le cluster, ajoutons donc un processus de dessin à l'aide de matplotlib.

tw_ml.py(Extrait de la partie visualisation)



import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.font_manager as fm

FP = fm.FontProperties(
    fname=r'C:\WINDOWS\Fonts\YuGothL.ttc',
    size=7)

def draw_km(text_list, km_text_labels,
            compressed_center_list, compressed_text_list):

    #Commence à dessiner.
    fig = plt.figure()
    axes = fig.add_subplot(111)
    for label in range(NUM_CLUSTER):

        #Couleurs séparées pour chaque étiquette.
        #Laissez la couleur à la carte des couleurs (cool).
        color = cm.cool(float(label) / NUM_CLUSTER)

        #Tracez le centre de l'étiquette
        xc, yc = compressed_center_list[label]
        axes.plot(xc, yc,
                  color=color,
                  ms=6.0, zorder=3, marker="o")

        #Étiquette de cluster également tracée
        axes.annotate(
            label, xy=(xc, yc), fontproperties=FP)

        for text_num, text_label in enumerate(km_text_labels):

            if text_label == label:
                #Tracer le texte avec l'étiquette correspondante
                x, y = compressed_text_list[text_num]
                axes.plot(x, y,
                          color=color,
                          ms=5.0, zorder=2, marker="x")

                #Texte également tracé
                axes.annotate(
                    text_list[text_num], xy=(x, y), fontproperties=FP)

                #Tracez la ligne à partir du point central de l'étiquette
                axes.plot([x, xc], [y, yc],
                          color=color,
                          linewidth=0.5, zorder=1, linestyle="--")

    plt.axis('tight')
    plt.show()

def main():
    #Omis car c'est la même chose jusqu'à la compression dimensionnelle

    #Visualisez les données
    # ※km_model.labels_Vers l'échantillon_Les informations d'étiquette de chaque élément de DATA sont stockées.
    draw_km(SAMPLE_DATA, km_model.labels_,
            compressed_center_list, compressed_text_list)

if __name__ == '__main__':
    main()

Le résultat ressemble à ceci! figure_1.png

texte grappe
Nocchi mignon#Perfume https://t.co/xxx 2
La production de parfum est incroyable#prfm #Perfume_um https://t.co/xxx 1
discothèque au chocolat/ Perfume #NowPlaying https://t.co/xxx 1
Je suis allé à Perfume A Gallery Experience à Londres https://t.co/xxx 0
La production de disco au chocolat est cool. Je veux aller vivre.#Perfume https://t.co/xxx 1

L'apparence est délicate car le nombre de données est faible. Mais d'une manière ou d'une autre, j'ai l'impression de pouvoir les classer!

</ i> Enfin groupé!

La partie tactile du regroupement des données textuelles à l'aide de la méthode K-means est terminée. Nourrir km_models avec de nouvelles données devrait vous donner une solution quant au cluster à classer. (Autrement dit, * classificateur de texte! *)

La prochaine fois, nous classerons les nouvelles données et verrons le résultat de l'augmentation du nombre de données. Je ne suis pas sur la touche, mais j'aimerais imaginer un petit moyen de le montrer dans matplotlib.

Recommended Posts