首页 > 解决方案 > 聚类数据后如何根据其他列生成新列?

问题描述

我有一个这样的带有列的数据框 -["A","B","C",D"]

A --> Categorical feature with 2 values, say Yes or No
B --> Categorical feature with 10 unique values, like "AAXX-10","BBYY-20" etc
C --> A date-time field
D --> Text-based column, describing if a person was interested in the movie or not based on short text(basically their comments after coming out of theatre)

样本df

A  | B | C | D
------------------------------------------------------------------------------
Yes|AAXX-10|8/10/2018|"Yes I liked the movie, it was great"
------------------------------------------------------------------------------
Yes|BBYY-20|8/10/2017|"I liked the performance of the cast in the movie but as a whole, It was just average"
------------------------------------------------------------------------------
No |AANN-88|8/10/2013|"Never seen a ridiculous movie like this"

我在这里有两个问题-

  1. 我想根据包含 4 个类别的“D”列创建第五列,例如“兴趣” ["Liked", "Didn't like", "Average", "Cannot comment"]。我怎么能那样做?

--在“D”的基础上,“兴趣”栏应该有[“喜欢”、“平均”、“不喜欢”]--。

  1. 由于大多数列是分类和日期时间,而一列是文本。我应该如何继续在这个特定场景中进行特征工程以便能够提供给 Kmeans?

如何从作为文本特征的“D”列中获取特征?

我应该将 A 列转换为二进制 0 和 1 吗?

我应该对第二列进行一次热编码/标签编码吗?

如何利用聚类中的日期时间特性?

我尝试过的事情 -

我对A列(转换为二进制)、B(标签编码)、C(从日期转换为年月特征)和D(忽略了这个特征,因为不知道如何使用它)进行了预处理和特征工程。

基于此,我使用 得到了集群kmeans.labels_,但这些集群是数字1,2,3,4

我怎样才能真正将它们映射到["Liked", "Didn't like", "Average", "Cannot comment"]?如何有效地使用文本列来制作集群?

只需简短回答我的查询即可。我不需要任何实现。

标签: pythonmachine-learningdata-sciencek-meansunsupervised-learning

解决方案


先回答第二个问题:

A:可以转二进制

B:你可以通过编码从一个唯一字符串列表中得到什么信息?编码后,您将得到单位矩阵(One-Hot)或单调递增整数列表(标签编码)

C:如果日期范围允许,您最好转换为 Timestamp unix epoch,这可以让您正确计算距离。

D:这是项目的基础。处理步骤非常复杂,但总结一下:

基本配方包括但不限于:

  1. 文本规范化:
    • 转换为小写或大写
    • 将数字转换为单词或删除数字,
    • 删除标点符号、重音符号和其他变音符号,
    • 删除前导或尾随空格
  2. 语料库标记化(将每一行拆分为单个单词的列表)
    • 删除停用词,(a,the ..)它们包含非常少的信息并且很常见
  3. 词干化或词形还原。Tese 将单词简化为基本形式。词干提取非常粗糙,可能会产生无效的单词,但速度很快。词形还原根据字典生成有效单词,但速度较慢....更多的东西。使用 TF-IDF 进行特征提取,这是一种为每个单词赋予重要性分数的编码。这种方法的工作原理是当一个单词在文档中出现多次时增加它的权重,当它在许多文档中很常见时降低它的权重。

td-idf 示例:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
    'This is the first document.',
    'This document is the second document.',
    'And this is the third one.',
    'Is this the first document?',
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())

print(X.shape)

经过这n个步骤,您就得到了第一个问题的答案;输出可能如下所示:

在此处输入图像描述

你可以在这里找到如何做所有这些事情的代码(使用 NLTK)。但是,您可能不允许使用 NLTK,在这种情况下,您将很难完成所有这些步骤。


推荐阅读