熊猫数据框python中的部分相关性

机器算法验证 回归 统计模型 偏相关
2022-03-25 02:32:08

我在熊猫数据框中有一个数据,例如:

df = 

    X1  X2  X3  Y
0   1   2   10  5.077
1   2   2   9   32.330
2   3   3   5   65.140
3   4   4   4   47.270
4   5   2   9   80.570

我想做多元回归分析。这里 Y 是因变量,X1、X2 和 X3 是自变量。每个自变量与因变量之间的相关性为:

df.corr():

      X1          X2            X3         Y
X1  1.000000    0.353553    -0.409644   0.896626
X2  0.353553    1.000000    -0.951747   0.204882
X3  -0.409644   -0.951747   1.000000    -0.389641
Y   0.896626    0.204882    -0.389641   1.000000

正如我们在这里看到的,Y 与 X1 的相关性最高,所以我选择 X1 作为第一个自变量。在这个过程之后,我试图选择与 X 具有最高偏相关性的第二个自变量。所以我的问题是在这种情况下如何找到偏相关性?

您的帮助将不胜感激。

2个回答

AFAIU 从您的评论中,您正在谈论递归特征消除,特别是使用线性回归。如此处所述

递归特征消除基于重复构建模型(例如 SVM 或回归模型)并选择性能最佳或最差特征(例如基于系数)的思想,将特征放在一边,然后重复该过程其余的功能。应用此过程,直到数据集中的所有特征都用尽。然后根据被淘汰的时间对特征进行排名。因此,它是一种贪心优化,用于寻找性能最佳的特征子集。

对于您的情况,您可以执行以下操作sklearn

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression

features = ['X1', 'X2', 'X3']
X = df[features]
y = df['Y']

prd = LinearRegression()
rfe = RFE(prd, n_features_to_select=1)
rfe.fit(X, y)

您应该能够看到 中的行列rfe.ranking_

这将为您提供您所要求的:

from scipy import stats, linalg

def partial_corr(C):
    """
    Returns the sample linear partial correlation coefficients between pairs of variables in C, controlling 
    for the remaining variables in C.
    Parameters
    ----------
    C : array-like, shape (n, p)
        Array with the different variables. Each column of C is taken as a variable
    Returns
    -------
    P : array-like, shape (p, p)
        P[i, j] contains the partial correlation of C[:, i] and C[:, j] controlling
        for the remaining variables in C.
    """

    C = np.asarray(C)
    p = C.shape[1]
    P_corr = np.zeros((p, p), dtype=np.float)
    for i in range(p):
        P_corr[i, i] = 1
        for j in range(i+1, p):
            idx = np.ones(p, dtype=np.bool)
            idx[i] = False
            idx[j] = False
            beta_i = linalg.lstsq(C[:, idx], C[:, j])[0]
            beta_j = linalg.lstsq(C[:, idx], C[:, i])[0]

            res_j = C[:, j] - C[:, idx].dot( beta_i)
            res_i = C[:, i] - C[:, idx].dot(beta_j)

            corr = stats.pearsonr(res_i, res_j)[0]
            P_corr[i, j] = corr
            P_corr[j, i] = corr

    return P_corr

partial_corr_array = df.as_matrix(columns = ['price', 'sqft_living', 'sqft_living15'])

# Calculate the partial correlation coefficients
partial_corr(partial_corr_array)