【问题标题】:k means on structured data using python - more than one columnk 表示使用 python 处理结构化数据 - 多于一列
【发布时间】:2023-04-07 10:35:01
【问题描述】:

在结构化数据中的多列上,k 是如何表示的?

在下面的示例中,它在 1 列(名称)上完成

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

这里只使用了名称,但说我们想使用名称和国家/地区,我是否应该将国家/地区添加到同一列中,如下所示?

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

它从代码的角度工作,我仍在尝试理解结果(我实际上有很多列)数据,但我想知道当有多个列时这是否是正确的方法

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]

【问题讨论】:

  • KMeans 适用于二维数据。您是否尝试过在原始数据集上使用 Kmeans(没有将它们组合成单列)并将它们转换为数字列(如 one-hot 编码或二值化)
  • 感谢您的评论,我还没有尝试过,但是我有很多列,如果我最终要使用大约 30 多个列,您认为这是要走的路吗? (其中一些是描述,编码不起作用)
  • 对于有文本的列,tfidf 很好,对于分类列,one-hot 编码会很好。除非您的数据(行)非常少,否则您拥有多少列并不重要。如果行足够大,那么这是基本的方法。分析完数据后,就可以应用其他高级特征选择和工程技术。
  • 我有大约 100 列,但尚未弄清楚要使用哪些列。大约有 5000 行。我会按照您的建议尝试一下,如果我理解正确,您说我可以将整个数据框传递给 K 装置。文本列等和其他单热编码。

标签:
python
scikit-learn
k-means
sklearn-pandas