web-dev-qa-db-fra.com

Comprendre le "score" renvoyé par scikit-learn KMeans

J'ai appliqué le regroupement sur un ensemble de documents texte (environ 100). Je les ai converties en vecteurs Tfidf à l'aide de TfIdfVectorizer et ai fourni les vecteurs en tant qu'entrée à scikitlearn.cluster.KMeans(n_clusters=2, init='k-means++', max_iter=100, n_init=10). Maintenant quand je

model.fit()
print model.score()

sur mes vecteurs, je reçois une très petite valeur si tous les documents texte sont très similaires et une très grande valeur négative si les documents sont très différents.

Mon objectif principal est de déterminer quel ensemble de documents sont similaires, mais quelqu'un peut-il m'aider à comprendre ce que signifie exactement cette valeur model.score() pour un ajustement? Comment puis-je utiliser cette valeur pour justifier mes résultats?

14
Prateek Dewan

Dans la documentation, il est écrit:

Returns:    
score : float
Opposite of the value of X on the K-means objective.

Pour comprendre ce que cela signifie, vous devez examiner l'algorithme k-means. Ce que fait k-mean, c'est essentiellement trouver des centres de grappes qui minimisent la somme des distances entre les échantillons de données et leurs centres de grappes associés.

Il s’agit d’un processus en deux étapes, où (a) chaque échantillon de données est associé à son centre de grappe le plus proche, (b) les centres de grappe sont ajustés pour se situer au centre de tous les échantillons qui leur sont associés. Ces étapes sont répétées jusqu'à ce qu'un critère (nombre maximal d'itérations/changement entre les deux dernières itérations) soit rempli.

Comme vous pouvez le constater, il reste une distance entre les échantillons de données et leurs centres de grappes associés, et le objectif de notre minimisation est cette distance (somme de toutes les distances).

Vous obtenez naturellement de grandes distances si vous avez une grande variété d'échantillons de données, si le nombre d'échantillons de données est nettement supérieur au nombre de clusters, qui dans votre cas n'est que de deux. Au contraire, si tous les échantillons de données étaient identiques, vous obtiendriez toujours une distance nulle quel que soit le nombre de clusters.

De la documentation, je m'attendrais à ce que toutes les valeurs soient négatives, cependant. Si vous observez des valeurs négatives et positives, le score est peut-être plus vaste que cela.

Je me demande comment vous avez eu l’idée de vous regrouper en deux groupes.

7
ypnos

ypnos a raison, vous trouverez des détails ici: https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/cluster/k_means_.py#L893

inertia : float
    Sum of distances of samples to their closest cluster center.
"""
4
Mark Yang

Le mot choisi par la documentation est un peu déroutant. On dit "Inverse de la valeur de X sur l'objectif de K-means." Cela signifie négatif de l'objectif de K-moyennes. 

Objectif K-Means

L'objectif dans les K-moyennes est de réduire la somme des carrés des distances des points à partir des centroïdes de leurs groupes respectifs. Il a d'autres noms comme fonction d'erreur J-Squared, J-score ou somme de carrés au sein d'une grappe. Cette valeur indique la cohérence interne des clusters. (Le moins le mieux)

La fonction objectif peut être directement obtenue à l'aide de la méthode suivante.

model.interia_

0