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

oku*_*oub 5 dataframe feature-selection pandas data-science yellowbrick

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

如何做呢?

谢谢

cbh*_*ang 5

免责声明

\n
    \n
  1. 此解决方案未解决可视化问题。仅找到组。
  2. \n
  3. 众所周知,该解决方案是 NP 困难的,因此请注意效率问题。
  4. \n
\n

理论

\n

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

\n

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

\n

代码

\n

该代码使用networkx.algorithms.find_cliques进行搜索任务,它根据文档实现了Bron\xe2\x80\x93Kerbosch 算法。

\n

该代码由两部分组成。np.triu第一部分使用(从这篇文章修改)提取边缘,第二部分将边缘列表输入到 中networkx

\n

关联矩阵

\n

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

\n
np.random.seed(111)  # reproducibility\nx = np.random.normal(0, 1, 100)\ny = np.random.normal(0, 1, 100)\na = x\nb = x + np.random.normal(0, .5, 100)\nc = x + y\nd = y + np.random.normal(0, .5, 100)\ne = y + np.random.normal(0, .5, 100)\n\ndf = pd.DataFrame({"A":a, "B":b, "C":c, "D":d, "E":e})\ncorr = df.corr()\n\ncorr\nOut[24]: \n          A         B         C         D         E\nA  1.000000  0.893366  0.677333 -0.078369 -0.090510\nB  0.893366  1.000000  0.577459 -0.072025 -0.079855\nC  0.677333  0.577459  1.000000  0.587695  0.579891\nD -0.078369 -0.072025  0.587695  1.000000  0.777803\nE -0.090510 -0.079855  0.579891  0.777803  1.000000\n
Run Code Online (Sandbox Code Playgroud)\n

第1部分

\n
# keep only upper triangle elements (excluding diagonal elements)\nmask_keep = np.triu(np.ones(corr.shape), k=1).astype(\'bool\').reshape(corr.size)\n# melt (unpivot) the dataframe and apply mask\nsr = corr.stack()[mask_keep]\n# filter and get names\nedges = sr[sr > 0.5].reset_index().values[:, :2]\n\nedges\nOut[25]: \narray([[\'A\', \'B\'],\n       [\'A\', \'C\'],\n       [\'B\', \'C\'],\n       [\'C\', \'D\'],\n       [\'C\', \'E\'],\n       [\'D\', \'E\']], dtype=object)\n
Run Code Online (Sandbox Code Playgroud)\n

第2部分

\n
import networkx as nx\ng = nx.from_edgelist(edges)\nls_cliques = []\nfor clique in nx.algorithms.find_cliques(g):\n    ls_cliques.append(clique)\n\n# result\nls_cliques\nOut[26]: [[\'C\', \'A\', \'B\'], [\'C\', \'D\', \'E\']]\n
Run Code Online (Sandbox Code Playgroud)\n