Найдите наиболее важные слова для кластеризации k-средних с помощью sklearn_pandas - PullRequest
0 голосов
/ 26 мая 2020

Я новичок в sklearn. Я хочу, чтобы мой код группировал данные с помощью кластеризации k-средних на основе текстового столбца и некоторых дополнительных категориальных переменных. 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

DataFrameMapper из sklearn_ pandas объединяет набор слов с фиктивными переменными.

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. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 26 мая 2020

Для записи, я смог решить проблему после прочтения этого сообщения .

Модифицированная функция 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...