我们如何才能在热图中仅显示与某个阈值相关的特征?

Posted

技术标签:

【中文标题】我们如何才能在热图中仅显示与某个阈值相关的特征?【英文标题】:How can we show ONLY features that are correlated over a certain threshold in a heatmap? 【发布时间】:2021-01-09 03:45:04 【问题描述】:

我的数据框中的特征太多了。我试图仅绘制与某个阈值相关的特征,比如说超过 80%,并在热图中显示这些特征。我把一些代码放在一起,它运行了,但我仍然看到一些白线,它们没有数据,因此没有相关性。此外,我看到的相关性远低于 80%。这是我尝试过的代码。

import seaborn
c = newdf.corr()
plt.figure(figsize=(10,10))
seaborn.heatmap(c, cmap='RdYlGn_r', mask = (np.abs(c) >= 0.8))
plt.show()

当我运行它时,我看到了这个。

这里有什么问题?

我正在做一个小更新,有一些新发现。

这只会得到 corr>.8.

corr = newdf.corr()
kot = corr[corr>=.8]
plt.figure(figsize=(12,8))
sns.heatmap(kot, cmap="Reds")

这似乎有效,但它仍然给了我很多白色!我认为应该有一种方法只包括相关性超过一定数量的项目。也许您必须将具有>.8 个项目的那些项目复制到一个新的数据框并建立该对象的相关性。我不确定这是如何工作的。

【问题讨论】:

每一列与自身的相关性为1,所以这样的过滤保留所有列。是否要对列重新排序以使强相关列彼此靠近? 是的,或者至少我是这么认为的。有没有办法将所有高度相关的特征复制到一个新的数据框对象中,然后根据该对象绘制热图? 实现所需的一种方法是重新排列特征,因此上面的地图看起来是聚集的。示例在这里:***.com/questions/2982929/… 或者,如果您想将所有特征分成组,您可以使用数据结构:geeksforgeeks.org/union-find 在您的示例中,如果两个节点(特征)的相关性高于 0.8 in幅度。 感谢您的两个建议,但我看不出两者对我有何帮助。现在在纽约已经很晚了。我累了;明天早上我会重温这个。当我想得更多时,我认为最好的解决方案是将具有 >.8% 相关性的特征复制到一个新的数据框中,并以此为基础进行绘图。我认为这是有道理的。我需要对此发表一些看法。 【参考方案1】:

以下代码将高度相关的特征(相关性高于 0.8 幅度)分组为组件,并分别绘制每组组件的相关性。如果它与您想要的不同,请告诉我。

components = list()
visited = set()
print(newdf.columns)
for col in newdf.columns:
    if col in visited:
        continue

    component = set([col, ])
    just_visited = [col, ]
    visited.add(col)
    while just_visited:
        c = just_visited.pop(0)
        for idx, val in corr[c].items():
            if abs(val) > 0.999 and idx not in visited:
                just_visited.append(idx)
                visited.add(idx)
                component.add(idx)
    components.append(component)

for component in components:
    plt.figure(figsize=(12,8))
    sns.heatmap(corr.loc[component, component], cmap="Reds")

【讨论】:

非常感谢!当我运行它时,我收到以下错误: ValueError: zero-size array to reduction operation minimum which has no identity 当我查看“组件”对象时,它似乎是列表中的一个字典,并且没有值在那里,这样可以获得相关性。它真的对你有用吗? 哦,我忘了说我把0.999改成了0.5。没有值被附加到列表中。 嗯... 组件应始终为非空。作为一个简单的修复,尝试将集合组件转换为列表,即components.append(list(component)) 我进行了更改,但仍然遇到与以前相同的错误。 哦,我明白了。我在 corr 中有一些 NAN 结果。我用 0 替换了 NAN,它正在运行!谢谢!!

以上是关于我们如何才能在热图中仅显示与某个阈值相关的特征?的主要内容,如果未能解决你的问题,请参考以下文章

决策树。选择分割对象的阈值

Viola Jones 阈值 Haar 特征误差值

为超过/低于阈值的值制作不同颜色的ggplot2热图

如何确定 SelectFromModel() 中选择特征的阈值?

如何在结果表中仅显示选定的记录

机器学习中连续型特征的二值化与分段,一文读懂