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 作为单独的特征应用于这些多个列一样。
您需要使用 Vectorizor 和 Pipelines 等其他方法以及 tfidifVectorizor 在多个列上执行此操作。您可以check out this link了解更多信息。
此外,您可以check out this answer 寻求可能的替代解决方案来解决您的问题。
【讨论】:
以上是关于k 表示使用 python 处理结构化数据 - 多于一列的主要内容,如果未能解决你的问题,请参考以下文章