使用 sklearn pairwise_distances 计算 X 和 y 之间的距离相关性
using sklearn pairwise_distances to compute distance correlation between X and y
我目前正在尝试各种方法:
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
我想捕获 X 中每个变量与 y 的距离相关性并将其存储在数据框中,因此我正在做。
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
您可以为此使用 scipy
,虽然没有明确并行化,但它非常 optimised/vectorised。我发现它对于大型数据集的运行速度非常快。
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')
但请注意,此 returns 是一个相关距离,但您可以使用许多不同的指标以及自定义指标。更多详情请见 docs page.
你确定你已经计算出你想要的了吗?似乎 scipy 使用这种方法计算基于(Pearson)相关性的距离。也许您想要 Székely 的距离相关性,如 https://pypi.org/project/dcor/.
我目前正在尝试各种方法: 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
我想捕获 X 中每个变量与 y 的距离相关性并将其存储在数据框中,因此我正在做。
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
您可以为此使用 scipy
,虽然没有明确并行化,但它非常 optimised/vectorised。我发现它对于大型数据集的运行速度非常快。
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')
但请注意,此 returns 是一个相关距离,但您可以使用许多不同的指标以及自定义指标。更多详情请见 docs page.
你确定你已经计算出你想要的了吗?似乎 scipy 使用这种方法计算基于(Pearson)相关性的距离。也许您想要 Székely 的距离相关性,如 https://pypi.org/project/dcor/.