【发布时间】: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
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:k 表示使用 python 处理结构化数据 – 多于一列 - Python技术站