python pandas中的等效R"findcorrelation(corr,cutoff = 0.75)"

Ava*_*hra 3 python numpy r pandas scikit-learn

我有dataFrame名为"data".我计算了数据的相关性:

corr = data.corr()
Run Code Online (Sandbox Code Playgroud)

我想从"data"文件中删除相关性大于0.75的列.使用以下命令可以非常轻松地在R中完成此操作:

hc=findCorrelation(corr,cutoff = 0.75)
data <- data[,-c(hc)]
Run Code Online (Sandbox Code Playgroud)

我在python中寻找类似的命令.在熊猫或scikit-learn中是否有任何可以执行类似工作的命令?

Ser*_*nov 6

步骤1.准备一些数据

from scipy.stats import multivariate_normal

covs = np.eye(10)
for i in range(10):
    for j in range(10):
        if i!=j:
            covs[i,j] = (i*j)/100

mvn = multivariate_normal(cov=covs)
data = mvn.rvs(size = 100)
data.shape
(100, 10)
Run Code Online (Sandbox Code Playgroud)

步骤2. Vizualize相关性.

在这里,你有一个二维相关的ndarray.数据按行组织,案例按行排列.为了在列数据上运行相关性,您需要首先转置数组(提示:numpy以行方式运行相关性):

r = np.corrcoef(data.T)
plt.imshow(r, cmap = "coolwarm")
plt.colorbar();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如您可能看到的,某些列(功能,如他们在统计或ML中所说)高度相关.

步骤3.删除相关列

让我们找出哪些相关超过.5阈值,排除对角元素,这显然是完全自相关的:

idx = np.abs(np.tril(r, k= -1)) < .5
idx_drop = np.all(idx, axis=1)
data_uncorr = data[:, idx_drop]
data_uncorr.shape
(100, 8)
Run Code Online (Sandbox Code Playgroud)

这意味着我们摆脱了2个共线列.

第4步.完整性检查

让我们通过视觉和数学方法进行一些检查:

plt.imshow(np.corrcoef(data_uncorr.T), cmap = "coolwarm")
plt.colorbar();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

np.sum(np.abs(np.tril(np.corrcoef(data_uncorr.T), k=-1)) >.5)
0
Run Code Online (Sandbox Code Playgroud)