如何在集群中找到一组有影响力的特征?

how to find the set of influential features in clusters?

我有 4 个集群,我需要在每个集群中找到一组最有影响力的特征,以便我可以深入了解集群的特征,从而了解这些集群的行为。我该怎么做?

我使用的方法是训练一个分类器来预测每个聚类标签(如果是相应的聚类则为 1,否则为 0),然后使用模型属性来确定每个聚类的最具鉴别力的变量。我一直在用 RandomForest 和 sickit learn 中的 feature_importances_ 属性来做这件事,我总是得到很好的结果。

然后我使用箱线图/密度图来表示这些变量在每个集群中的分布。

您还可以使用更传统的方法,例如比较每个变量的聚类均值,并使用方差分析等统计检验来获得更可靠的结果。

编辑:这是 Python 中的示例:

for cl in data.cluster.unique():


    custom_target = data.cluster.copy()
    custom_target.loc[custom_target != cl] = -1
    custom_target.loc[custom_target == cl] = 1

    clf = RandomForestClassifier(100 , random_state = 10)
    clf.fit(data.values[: , 1:-4], custom_target)

    imps , features = zip(*sorted(zip(clf.feature_importances_, cols) , reverse = True))
    # store the results as you like

解决该问题的基本方法是找到聚类质心特征的描述性统计。

查找影响最大的变量的代码段:

var_influence=cc.describe() #cc contains the cluster centroids 
# The descriptive statistics of the cluster centroids are saved in a Dataframe var_influence. 
# Sorting by standard deviation will give the variables with high standard deviation.
var_influence.sort_values(axis=1, by='std', ascending=False).iloc[:,:10] 

与箱形图方式(随着特征的增加很难可视化)相比,这种方式可以更快更好地找到影响变量。由于所有变量都已标准化,因此很容易跨特征进行比较。

也可以使用最大-最小方法,这将使我们能够看到具有最大带宽的变量。由于所有变量都已归一化,因此 max-min 是验证上述 result.Code 与以下相同

的好方法
pd.Series(var_influence.loc['max']-var_influence.loc['min']).sort_values(ascending=False)[:10]

多class class化

一个更严肃的寻找影响特征的方法是Multi-class classification: 聚类标签被用作目标变量来训练数据的多 class class 化模型。得到的模型系数可用于确定特征的重要性。