k 表示使用 python 处理结构化数据 - 多于一列

Posted

技术标签:

【中文标题】k 表示使用 python 处理结构化数据 - 多于一列【英文标题】:k means on structured data using python - more than one column 【发布时间】:2018-03-16 13:43:11 【问题描述】:

在结构化数据中的多列上,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 装置。文本列等和其他单热编码。 【参考方案1】:

不,这是适合多列的错误方式。您基本上只是将多个特征组合在一起,并期望它的行为正确,就像将 kmeans 作为单独的特征应用于这些多个列一样。

您需要使用 Vectorizo​​r 和 Pipelines 等其他方法以及 tfidifVectorizo​​r 在多个列上执行此操作。您可以check out this link了解更多信息。

此外,您可以check out this answer 寻求可能的替代解决方案来解决您的问题。

【讨论】:

以上是关于k 表示使用 python 处理结构化数据 - 多于一列的主要内容,如果未能解决你的问题,请参考以下文章

超级立方体小记

Python多处理池:完成任何k个作业后终止进程

Python高级数据处理与可视化

6.6K Star,比 Pandas 快很多的数据处理库

Python-04-数据结构

Python多处理:超过超时后通过参数终止进程