使用 sklearn_pandas 为 k 均值聚类查找最重要的词
Find most important words for k-means clustering using sklearn_pandas
我是 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)
预测组 I 运行
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 生成的特征名称。任何帮助将不胜感激。
郑重声明,我在阅读这篇文章后能够解决问题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])
我是 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)
预测组 I 运行
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 生成的特征名称。任何帮助将不胜感激。
郑重声明,我在阅读这篇文章后能够解决问题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])