【问题标题】:Find most important words for k-means clustering using sklearn_pandas使用 sklearn_pandas 查找 k-means 聚类最重要的词
【发布时间】:2020-09-13 02:35:16
【问题描述】:

我是 sklearn 的新手。我希望我的代码基于文本列和一些其他分类变量使用 k-means 聚类对数据进行分组。 CountVectorizer 将文本转换为词袋,OneHotEncoder 将分类变量转换为虚拟变量集。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.feature_extraction.text import CountVectorizer
from sklearn_pandas import DataFrameMapper
from sklearn.cluster import MiniBatchKMeans

def import_vectorizer():   
    vectorizer = CountVectorizer(lowercase   = True,  
                             ngram_range = (1,1),
                             min_df      = .00005,  
                             max_df      = .01)
    return vectorizer

sklearn_pandas 的 DataFrameMapper 将词袋与虚拟变量结合起来。

def get_X(df):
    mapper = DataFrameMapper(
        [
            ('text_col', import_vectorizer()),
            (['cat_col1', 'cat_col2', 'cat_col3', 'cat_col4'], OneHotEncoder())
        ]
    )
    return mapper.fit_transform(df)

预测我运行的组

df = pd.read_json(mydata.json)
X = get_X(df)
kmeans = MiniBatchKMeans(n_clusters=50)
kmeans.fit(X)

现在我想看看哪些特征在预测组时最重要。有类似的帖子

print("Top terms per cluster:")
order_centroids = kmeans.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i in range(50):
    print("Cluster %d:" % i),
    for ind in order_centroids[i, :10]:
        print(' %s' % terms[ind])

但是,这在这种情况下不起作用,因为

terms = vectorizer.get_feature_names()

将仅包含词袋中的特征名称,而不包含 OneHotEncoder 生成的特征名称。任何帮助将不胜感激。

【问题讨论】:

    标签: python scikit-learn k-means sklearn-pandas


    【解决方案1】:

    作为记录,我在阅读此post 后能够解决问题。

    修改get_X函数:

    def get_X(df):
        mapper = DataFrameMapper(
            [
            ('text_col', import_vectorizer()),
            (['cat_col1', 'cat_col2', 'cat_col3', 'cat_col4'], OneHotEncoder())
           ]
        )
    
        X = mapper.fit_transform(df)
        X_cols = (
                mapper.features[0][1].get_feature_names()
                + mapper.features[1][1].get_feature_names().tolist()
                )
        return X, X_cols
    

    然后最后运行下面的代码。

    print("Top terms per cluster:")
    order_centroids = kmeans.cluster_centers_.argsort()[:, ::-1]
    for i in range(50):
        print("Cluster %d:" % i),
        for ind in order_centroids[i, :10]:
            print(' %s' % X_cols[ind])
    

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 2020-10-08
      • 2018-02-26
      • 2015-04-11
      • 2021-10-11
      • 2016-07-28
      • 2011-08-13
      • 2013-08-08
      相关资源
      最近更新 更多