首页 > 解决方案 > K 均值聚类 - 处理非数值数据

问题描述

我有想要聚类的 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:无法将字符串转换为浮点数

标签: pythonk-means

解决方案


处理非数值数据的最典型方法是将单个列转换为多个二进制列。这被称为“获取虚拟变量”或“一个热编码”(在许多其他势利的术语中)。

您还可以做其他事情将数据转换为数字,例如情绪分析(即将每条推文分类为快乐、悲伤、有趣、愤怒等),分析推文以确定它们是否与某个主题有关与否(即这条推文是否谈论病毒?),每条推文中的单词数,每条推文的空格数,是否有良好的语法等等。如你所见,你问的是一个非常广泛的主题。

将数据转换为二进制列时,您会获得列中唯一值的数量并创建许多新列,每个列都填充零和一。

让我们专注于您的第一列:

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

这是许多方法之一。您可以在此处查看有关一种热编码的文章。

注意:当您有许多唯一值时,这样做会给您提供很多列,并且由于没有足够的自由度(变量太多,观察不足),某些算法会崩溃。最后,如果您正在运行回归,如果您不删除其中一列,您将遇到完美的多重共线性。

回到您的示例,如果您想将所有列转换为此类数据,请尝试:

pd.get_dummies(df)

但是,我不会为tweet专栏这样做,因为每条推文都有其独特的价值。


推荐阅读