Pandas 数据框将特征划分为高相关性组

Posted

技术标签:

【中文标题】Pandas 数据框将特征划分为高相关性组【英文标题】:Pandas dataframe divide features to group of high correlation 【发布时间】:2021-02-02 01:43:40 【问题描述】:

我有一个包含 280 多个特征的数据框。 我运行相关图来检测高度相关的特征组: 现在,我想将特征划分为组,这样每个组都将成为一个“红色区域”,这意味着每个组都将具有彼此相关性 >0.5 的特征。

怎么做?

谢谢

【问题讨论】:

我认为这些群体可能会相交。比如说,特征 [A,B,C] 形成一个红色组,[C,D,E] 形成一个红色组,但 [A,B,C,D,E] 没有。遇到这种情况你是怎么处理的? @BillHuang 我希望每个组内的所有功能都与其他功能“红色”。所以在你建议的情况下 - 一组是 [A,B,C] 一组是 [C,D,E] 【参考方案1】:

免责声明

    此解决方案未解决可视化问题。仅找到组。 已知该解决方案是 NP 难的,因此请注意效率问题。

理论

这个问题本质上是图论中的clique problem,这意味着找到给定图中的所有完整子图(节点> 2)。

想象一个图,所有特征都是节点,满足corr > 0.5 的特征对是边。那么查找所有请求的“组”的任务可以简单地转化为“查找图中所有完整的子图”。

代码

代码使用networkx.algorithms.find_cliques作为搜索任务,根据文档实现Bron–Kerbosch algorithm。

代码由两部分组成。第一部分使用np.triu(修改自this post)提取边缘,第二部分将边缘列表提供给networkx

相关矩阵

特征 [A,B,C] 和 [C,D,E] 分别密切相关,但在 [A,B] 和 [D,E] 之间不相关。

np.random.seed(111)  # reproducibility
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
a = x
b = x + np.random.normal(0, .5, 100)
c = x + y
d = y + np.random.normal(0, .5, 100)
e = y + np.random.normal(0, .5, 100)

df = pd.DataFrame("A":a, "B":b, "C":c, "D":d, "E":e)
corr = df.corr()

corr
Out[24]: 
          A         B         C         D         E
A  1.000000  0.893366  0.677333 -0.078369 -0.090510
B  0.893366  1.000000  0.577459 -0.072025 -0.079855
C  0.677333  0.577459  1.000000  0.587695  0.579891
D -0.078369 -0.072025  0.587695  1.000000  0.777803
E -0.090510 -0.079855  0.579891  0.777803  1.000000

第 1 部分

# keep only upper triangle elements (excluding diagonal elements)
mask_keep = np.triu(np.ones(corr.shape), k=1).astype('bool').reshape(corr.size)
# melt (unpivot) the dataframe and apply mask
sr = corr.stack()[mask_keep]
# filter and get names
edges = sr[sr > 0.5].reset_index().values[:, :2]

edges
Out[25]: 
array([['A', 'B'],
       ['A', 'C'],
       ['B', 'C'],
       ['C', 'D'],
       ['C', 'E'],
       ['D', 'E']], dtype=object)

第 2 部分

import networkx as nx
g = nx.from_edgelist(edges)
ls_cliques = []
for clique in nx.algorithms.find_cliques(g):
    ls_cliques.append(clique)

# result
ls_cliques
Out[26]: [['C', 'A', 'B'], ['C', 'D', 'E']]

【讨论】:

谢谢,但我收到一个错误:在 sr = corr.stack()[mask_keep] 行中,我得到:IndexError: Item wrong length 97344 而不是 78400。mask_keep 的形状是 (97344 ,), corr 是 (312, 312)。但是,corr_mat.stack() 的长度是 78400 导致错误 请清空您的整个工作空间并仔细检查您的变量名。正如 78400=280^2 的事实所表明的那样,您可能会将新掩码提供给旧数据。 也有可能 312 个特征中的一些没有出现在 corr 矩阵中(例如分类特征)。请删除这些功能并重试。

以上是关于Pandas 数据框将特征划分为高相关性组的主要内容,如果未能解决你的问题,请参考以下文章

字典中的 Pandas 数据框将值作为元组返回

pandas计算特征与所有数值特征的相关性并排序可视化:包含pearsonspearmankendall

Mooc数据分析-01基本内容和表示

Pandas 数据框将数据聚合为每组的计数

尝试使用 pandas 数据框将数据附加到 BigQuery 表时出错

pandas 数据框将 INT64 列转换为布尔值