【问题标题】:Keep only one feature, among those ones which are correlated between each other, based on higher correlation with target variable基于与目标变量的更高相关性,在彼此相关的那些特征中只保留一个特征
【发布时间】:2021-09-30 12:45:53
【问题描述】:

我有一个这样的数据集

Target  Politics    Medicine    School  Hospital    Domestic
        -1  0   0   0   0   0
        -1  0   1   0   0   1
        -1  0   0   0   1   0
        -1  0   0   0   0   0
        1   0   0   0   0   1
        1   0   0   0   0   0

Target 是我的目标变量,它可以取值 -1 或 1;其他列是布尔值,它们可以取值 0/1。 我正在计算这些变量之间的相关性如下:

import seaborn as sn

corr = df.corr(method = 'pearson')
sn.heatmap(corr, annot = True)
plt.show()

这会生成一个包含目标变量和布尔变量的相关矩阵。 我的变量之间有一些相关性,例如医学和学校(想象一下由上述代码生成的以下输出,使用完整的数据集):

    index       Target   Politics   Medicine    School   Hospital   Domestic
   Target       1         0.02          -0.08     0.04      0           0.001
   Politics     0.02      1             0         0.002     0           0
   Medicine     -0.08     0.            1         0.76      0           0
   School       0.04      0.002          0.76       1      0.24         0
   Hospital     0            0              0       0       1           0
   Domestic     0.001        0              0     0.24      0           1

(上表仅用于为您提供相关变量的示例)。 我将阈值设置为 0.5 以上,因此学校和医学是相关的。基于与目标变量的最佳相关性,我只想保留其中一个(医学的值为 -0.08,而学校的值为 0.04)。我想将这种方法概括如下:

  • 如果两个变量相互关联,则需要对目标变量进行进一步分析,以便仅保留与目标具有较高相关性的变量。

我试过如下:

threshold=0.5
a=abs(corr)
result=a[a>threshold]
result=pd.DataFrame(data=a).reset_index()

但结果未显示我需要与 Target 的相应相关值进行比较的预期输出(仅限学校和医学)。

我的预期输出将是一个最终数据集,就像上面的第一个一样,包含 Target、Politics、Medicine、Hospital 和 Domestic 列,即,School 将被排除在外,因为它与 Medicine 相关并且与目标相比的绝对值较低医学。

我想创建一个函数,如果它还不存在,它会自动检查。

【问题讨论】:

  • 预期结果不明确。请您提供示例表的输出吗?
  • 只是上面的数据集,没有学校:Target Politics Medicine Hospital Domestic。我不仅对删除该列感兴趣,而且对证明选择的合理性感兴趣,在遵循上述步骤(变量之间的相关性,然后与目标之间的相关性)之后创建这个最终数据集。如果您需要,很乐意提供更多信息。在这种情况下,只有两个变量相互关联,但我也有许多变量相关的数据集,所以我想自动选择和移动

标签: python pandas


【解决方案1】:

假设 df 是原始数据帧并且 corr_df 是相关数据帧,您可以使用 np.argwhere 获取超过 th 单元格的坐标,删除身份并找到与目标相关性较小的并将其删除:

th = 0.5
target_col = 'Target'
corr_df = corr_df.abs()

high_cor_xy = set([tuple(sorted(x)) for x in np.argwhere(corr_df.values>=th) if x[0]!=x[1]])
high_cor_col_idx_raw = [(corr_df.columns[x[0]], corr_df.columns[x[1]]) for x in high_cor_xy]
high_cor_col_idx = [t for t in high_cor_col_idx_raw if target_col not in t]
target_corr_dict = corr_df[target_col].to_dict()
cols_to_drop = [sorted(list(t), key=target_corr_dict.get)[::-1][0] for t in high_cor_col_idx]

df = df.drop(cols_to_drop, axis=1)

【讨论】:

  • 非常感谢您的帮助和解释
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 2018-05-20
相关资源
最近更新 更多