我们如何才能在热图中仅显示与某个阈值相关的特征?
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,它正在运行!谢谢!!以上是关于我们如何才能在热图中仅显示与某个阈值相关的特征?的主要内容,如果未能解决你的问题,请参考以下文章