使用sklearn pairwise_distances计算X和y之间的距离相关

时间:2018-07-03 09:39:26

标签: python scikit-learn distance pairwise

我目前正在尝试各种方法: 1.相关性。 2.相互信息。 3.距离相关 找出X中变量与y中因变量之间关系的强度。  关联是最快和最简单的(样本中1个小时有300万条记录和560个变量)。 相互信息的计算大约需要16个小时。 我也正在研究距离相关性,因为它很有趣: 当且仅当它们独立时,Xi和Y之间的距离相关性为零。 但是,在Python中进行计算时遇到了一个问题。

以下是我的数据:

X

prop_tenure prop_12m    prop_6m prop_3m 
0.04        0.04        0.06    0.08
0           0           0       0
0           0           0       0
0.06        0.06        0.1     0
0.38        0.38        0.25    0
0.61        0.61        0.66    0.61
0.01        0.01        0.02    0.02
0.1         0.1         0.12    0.16
0.04        0.04        0.04    0.09
0.22        0.22        0.22    0.22
0.72        0.72        0.73    0.72
0.39        0.39        0.45    0.64

**y**
status
0
0
1
1
0
0
0
1
0
0
0
1

我想用y捕获X中每个变量的距离相关性并将其存储在数据帧中,因此我正在做。

from sklearn.metrics.pairwise import pairwise_distances

num_metrics_df['distance_correlation'] = pairwise_distances(X,y,metric = 'correlation',njobs = -1)

但是文档中提到以下内容:

If Y is given (default is None), then the returned matrix is the pairwise distance between the arrays from both X and Y.

这需要在X和Y中使用相同数量的功能吗?

如何在python中获取每个Xi和y之间的距离相关性? 有人可以帮我吗?

更新

我尝试了按照X.shape [1]重复y列的方法,然后进行了计算,但是它为10k条记录的样本提供了内存错误:

X = data_col.values

lb = preprocessing.LabelBinarizer()
df_target['drform'] = lb.fit_transform(df_target['status'])

y = df_target.values
n_rep = X.shape[1]
y = np.repeat(y,n_rep,axis = 1)

num_metrics_df['distance_correlation'] = pairwise_distances(X,y,metric = 'correlation',njobs = -1)

Traceback (most recent call last):

  File "<ipython-input-30-0f28f4b76a7e>", line 20, in <module>
    num_metrics_df['distance_correlation'] = pairwise_distances(X,y,metric = 'correlation',njobs = -1)

  File "C:\Users\test\AppData\Local\Continuum\anaconda3.1\lib\site-packages\sklearn\metrics\pairwise.py", line 1247, in pairwise_distances
    return _parallel_pairwise(X, Y, func, n_jobs, **kwds)

  File "C:\Users\test\AppData\Local\Continuum\anaconda3.1\lib\site-packages\sklearn\metrics\pairwise.py", line 1090, in _parallel_pairwise
    return func(X, Y, **kwds)

  File "C:\Users\test\AppData\Local\Continuum\anaconda3.1\lib\site-packages\scipy\spatial\distance.py", line 2381, in cdist
    dm = np.empty((mA, mB), dtype=np.double)

MemoryError

2 个答案:

答案 0 :(得分:1)

您可以为此使用scipy,尽管未明确并行化,但已对其进行了大幅优化/矢量化。我发现它对于大型数据集超级有效。

from scipy.spatial.distance import cdist
import numpy as np

n_samples = 100000
n_features = 50

X = np.random.random((n_samples, n_features))
y = np.random.choice([0, 1], size=(n_samples, 1))
correlations = cdist(X.T, y.T, metric='correlation')

但是请注意,这会返回一个相关距离,但是您可以使用很多不同的指标以及自定义指标。有关更多详细信息,请参见docs page

答案 1 :(得分:0)

确定要计算出想要的吗?似乎scipy使用这种方法基于(皮尔逊)相关性来计算距离。也许您想要Székely的距离相关性,例如https://pypi.org/project/dcor/