K 均值聚类 - 处理非数值数据
K Means Clustering - Handling Non-Numerical Data
我有要聚类的 Twitter 数据。它是文本数据,我了解到 K 表示无法处理非数值数据。我想根据推文对数据进行聚类。数据看起来像这样。
我发现这段代码可以将文本转换为数值数据。
def handle_non_numerical_data(df):
columns = df.columns.values
for column in columns:
text_digit_vals = {}
def convert_to_int(val):
return text_digit_vals[val]
if df[column].dtype != np.int64 and df[column].dtype != np.float64:
column_contents = df[column].values.tolist()
unique_elements = set(column_contents)
x = 0
for unique in unique_elements:
if unique not in text_digit_vals:
text_digit_vals[unique] = x
x += 1
df[column] = list(map(convert_to_int, df[column]))
return df
df = handle_non_numerical_data(data)
print(df.head())
产出
label tweet
0 9 24
1 5 11
2 17 45
3 14 138
4 18 112
我对此很陌生,我认为这不是我拟合数据所需要的。处理这种性质的非数字数据(文本)的更好方法是什么?
编辑:当 运行 K 表示原始文本数据上的聚类算法时,我收到此错误。
ValueError: 无法将字符串转换为浮点数
处理非数值数据最典型的方法是将单个列转换为多个二进制列。这称为 "getting dummy variables" 或 "one hot encoding"(在许多其他势利的术语中)。
还有其他方法可以将数据转换为数字,例如 sentiment analysis(即将每条推文分类为快乐、悲伤、有趣、愤怒等...),分析推文以确定它们是否与某个主题有关(即这条推文是否谈论病毒?),每条推文中的单词数,每条推文的空格数,它是否具有良好的语法等。你可以看,你问的是一个非常广泛的主题。
将数据转换为二进制列时,您会得到列中唯一值的数量,并创建那么多新列,每个列都用 0 和 1 填充。
让我们关注您的第一列:
import pandas as pd
df = pd.DataFrame({'account':['realdonaldtrump','naredramodi','pontifex','pmoindia','potus']})
account
0 realdonaldtrump
1 narendramodi
2 pontifex
3 pmoindia
4 potus
这相当于:
pd.get_dummies(df, columns=['account'], prefix='account')
account_naredramodi account_pmoindia account_pontifex account_potus \
0 0 0 0 0
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
4 0 0 0 1
account_realdonaldtrump
0 1
1 0
2 0
3 0
4 0
这是众多方法中的一种。您可以查看这篇关于 one hot encoding here.
的文章
注意:当你有很多唯一值时,这样做会给你很多列并且一些算法会由于没有足够的自由度而崩溃(变量太多,不是足够的观察)。最后,如果您要 运行 回归,如果不删除其中一列,您将 运行 进入完全多重共线性。
回到你的例子,如果你想把你所有的列都变成这种数据,试试:
pd.get_dummies(df)
但是,我不会对 tweet
列执行此操作,因为每条推文都有其独特的价值。
由于 k-means 是一种矢量量化方法,您应该以某种方式对文本数据进行矢量化。
我有要聚类的 Twitter 数据。它是文本数据,我了解到 K 表示无法处理非数值数据。我想根据推文对数据进行聚类。数据看起来像这样。
我发现这段代码可以将文本转换为数值数据。
def handle_non_numerical_data(df):
columns = df.columns.values
for column in columns:
text_digit_vals = {}
def convert_to_int(val):
return text_digit_vals[val]
if df[column].dtype != np.int64 and df[column].dtype != np.float64:
column_contents = df[column].values.tolist()
unique_elements = set(column_contents)
x = 0
for unique in unique_elements:
if unique not in text_digit_vals:
text_digit_vals[unique] = x
x += 1
df[column] = list(map(convert_to_int, df[column]))
return df
df = handle_non_numerical_data(data)
print(df.head())
产出
label tweet
0 9 24
1 5 11
2 17 45
3 14 138
4 18 112
我对此很陌生,我认为这不是我拟合数据所需要的。处理这种性质的非数字数据(文本)的更好方法是什么?
编辑:当 运行 K 表示原始文本数据上的聚类算法时,我收到此错误。
ValueError: 无法将字符串转换为浮点数
处理非数值数据最典型的方法是将单个列转换为多个二进制列。这称为 "getting dummy variables" 或 "one hot encoding"(在许多其他势利的术语中)。
还有其他方法可以将数据转换为数字,例如 sentiment analysis(即将每条推文分类为快乐、悲伤、有趣、愤怒等...),分析推文以确定它们是否与某个主题有关(即这条推文是否谈论病毒?),每条推文中的单词数,每条推文的空格数,它是否具有良好的语法等。你可以看,你问的是一个非常广泛的主题。
将数据转换为二进制列时,您会得到列中唯一值的数量,并创建那么多新列,每个列都用 0 和 1 填充。
让我们关注您的第一列:
import pandas as pd
df = pd.DataFrame({'account':['realdonaldtrump','naredramodi','pontifex','pmoindia','potus']})
account
0 realdonaldtrump
1 narendramodi
2 pontifex
3 pmoindia
4 potus
这相当于:
pd.get_dummies(df, columns=['account'], prefix='account')
account_naredramodi account_pmoindia account_pontifex account_potus \
0 0 0 0 0
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
4 0 0 0 1
account_realdonaldtrump
0 1
1 0
2 0
3 0
4 0
这是众多方法中的一种。您可以查看这篇关于 one hot encoding here.
的文章注意:当你有很多唯一值时,这样做会给你很多列并且一些算法会由于没有足够的自由度而崩溃(变量太多,不是足够的观察)。最后,如果您要 运行 回归,如果不删除其中一列,您将 运行 进入完全多重共线性。
回到你的例子,如果你想把你所有的列都变成这种数据,试试:
pd.get_dummies(df)
但是,我不会对 tweet
列执行此操作,因为每条推文都有其独特的价值。
由于 k-means 是一种矢量量化方法,您应该以某种方式对文本数据进行矢量化。