2017-10-05 2 views
0

comment fait-on k signifie sur plusieurs colonnes dans les données structurées?k signifie sur les données structurées en utilisant python - plus d'une colonne

Dans l'exemple ci-dessous son été fait sur 1 colonne (nom)

tfidf_matrix = tfidf_vectorizer.fit_transform (df_new [ « nom »])

ici que le nom est utilisé, mais disons que nous voulions utiliser le nom et pays, devrais-je ajouter un pays à la même colonne comme suit?

df_new['name'] = df_new['name'] + " " + df_new['country'] 
tfidf_matrix = tfidf_vectorizer.fit_transform(df_new['name']) 

Il fonctionne dans une perspective de code et essaie toujours de comprendre les résultats (j'ai en fait des tonnes de colonnes) les données, mais je me demande si c'est la bonne façon de s'adapter quand il y a plus d'une colonne

import os 
import pandas as pd 
import re 
import numpy as np 

df = pd.read_csv('sample-data.csv') 


def split_description(string): 
    # name 
    string_split = string.split(' - ',1) 
    name = string_split[0] 

    return name 


df_new = pd.DataFrame() 
df_new['name'] = df.loc[:,'description'].apply(lambda x: split_description(x)) 
df_new['id'] = df['id'] 


def remove(name): 
    new_name = re.sub("[0-9]", '', name) 
    new_name = ' '.join(new_name.split()) 
    return new_name 

df_new['name'] = df_new.loc[:,'name'].apply(lambda x: remove(x)) 



from sklearn.feature_extraction.text import TfidfVectorizer 


tfidf_vectorizer = TfidfVectorizer(
            use_idf=True, 
            stop_words = 'english', 
            ngram_range=(1,4), min_df = 0.01, max_df = 0.8) 


tfidf_matrix = tfidf_vectorizer.fit_transform(df_new['name']) 

print (tfidf_matrix.shape) 
print (tfidf_vectorizer.get_feature_names()) 


from sklearn.metrics.pairwise import cosine_similarity 
dist = 1.0 - cosine_similarity(tfidf_matrix) 
print (dist) 


from sklearn.cluster import KMeans 
num_clusters = range(1,20) 

KM = [KMeans(n_clusters=k, random_state = 1).fit(tfidf_matrix) for k in num_clusters] 
+0

KMeans fonctionne sur des données 2D. Avez-vous essayé d'utiliser les Kmeans sur votre jeu de données original (sans les combiner en une seule colonne) et juste les convertir en colonnes numériques (comme un codage à chaud, ou binarisation) –

+0

thx pour votre commentaire, je n'ai pas encore essayé, mais J'ai des tonnes de colonnes, pensez-vous que c'est la voie à suivre si je devais utiliser plus de 30 colonnes? (dont certaines sont des descriptions, pour lesquelles le codage ne fonctionnerait pas) –

+0

Pour les colonnes qui ont du texte, tfidf est bon, pour les colonnes catégorielles, le codage à chaud unique sera bon. Peu importe le nombre de colonnes que vous avez, sauf si vous avez très peu de données (lignes). Si les lignes sont suffisamment grandes, c'est l'approche de base à faire. Une fois que vous avez analysé les données, d'autres techniques avancées de sélection de caractéristiques et d'ingénierie peuvent être appliquées. –

Répondre

0

Non, c'est une manière incorrecte de s'adapter à plusieurs colonnes. Vous êtes simplement en train de brouiller ensemble plusieurs entités et vous vous attendez à ce qu'il se comporte correctement comme si kmeans était appliqué sur ces colonnes multiples en tant qu'éléments distincts.

Vous devez utiliser d'autres méthodes comme Vectorizor et Pipelines avec tfidifVectorizor pour le faire sur plusieurs colonnes. Vous pouvez check out this link pour plus d'informations.

En outre, vous pouvez check out this answer pour une solution alternative possible à votre problème.