использование sklearnpairwise_distances для вычисления корреляции расстояний между X и y

В настоящее время я пробую различные методы: 1. Корреляция. 2. Взаимная информация. 3. Дистанционная корреляция, чтобы найти силу связи между переменными в X и зависимой переменной в y. Корреляция самая быстрая и простая (1 час на выборку до 3 миллионов записей и 560 переменных). Расчет взаимной информации занимает примерно 16 часов. Я также рассматриваю корреляцию расстояний из-за ее интересного свойства: корреляция расстояний между Xi и Y равна нулю тогда и только тогда, когда они независимы. Однако я столкнулся с проблемой при выполнении расчетов в Python.

ниже мои данные:

Х

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?

Как я могу получить корреляцию расстояния между каждым Xi и y в python? Может кто-нибудь, пожалуйста, помогите мне с этим?

Обновление:

Я попробовал повторить столбцы y в соответствии с X.shape[1], а затем выполнить расчет, но он дает ошибку памяти для выборки из 10 000 записей:

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

person Shuvayan Das    schedule 03.07.2018    source источник
comment
Разве вы не можете просто продублировать y для каждого из столбцов x или выполнять сравнения по одному столбцу за раз?   -  person M.T    schedule 03.07.2018


Ответы (2)


Вы можете использовать для этого 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')

Но обратите внимание, что это возвращает корреляционное расстояние, но есть множество различных метрик, которые вы можете использовать, а также пользовательские метрики. Дополнительные сведения см. на странице документации. .

person piman314    schedule 03.07.2018
comment
большое спасибо @ncfirth. Это работает как шарм и очень быстро! - person Shuvayan Das; 04.07.2018

Вы уверены, что вычислили то, что хотели? Кажется, что scipy вычисляет расстояние на основе корреляции (Пирсона), используя этот метод. Возможно, вам нужна корреляция расстояния Секели, как в https://pypi.org/project/dcor/. .

person Mabus    schedule 22.09.2018