Введение в канонический корреляционный анализ с помощью Python
Мы, специалисты по данным, тратим большую часть времени на анализ взаимосвязей и закономерностей в наших данных. Однако большинство наших исследовательских инструментов ориентированы на индивидуальные отношения. Но что, если мы хотим получить более общее представление и найти общие черты и закономерности между определенными группами переменных?
Этот пост включает:
- введение в канонический корреляционный анализ, который позволяет нам одновременно выявлять ассоциации между группами переменных.
- учебник CCA на Python о том, как школьная среда влияет на успеваемость учащихся.
Так что же такое CCA?
Предположим, мы хотим выяснить, как атмосфера в школе влияет на успеваемость учащихся. С одной стороны, у нас есть переменные, касающиеся уровня поддержки, доверия и сотрудничества в их учебной среде. С другой стороны, у нас есть успеваемость студентов и результаты тестов.
CCA позволяет нам исследовать связи между этими двумя наборами переменных в целом, а не рассматривать их по отдельности. Грубо говоря, мы придумываем коллективное представление (скрытая переменная, называемая канонической переменной) для каждого из этих наборов переменных таким образом, чтобы корреляция между этими переменными была максимальной.
Прежде всего, почему полезен CCA?
Прежде чем погрузиться в груду уравнений, давайте посмотрим, почему это того стоит.
С CCA мы можем:
- Выясните, являются ли два набора переменных независимыми, или измерьте степень их взаимосвязи, если таковая существует.
- Интерпретируйте характер их взаимосвязи, оценив вклад каждой переменной в канонические переменные (т. Е. Компоненты) и выясните, какие измерения являются общими для этих двух наборов.
- Обобщите отношения в меньшее количество статистических данных.
- Проведите уменьшение размерности с учетом наличия определенных групп переменных.
Построение канонических переменных
Даны два набора переменных:
Мы строим первую пару канонических переменных как линейные комбинации переменных в каждой группе:
где веса (a1,… ap), (b1,…, bq) выбираются таким образом, чтобы корреляция между двумя переменными была максимальной.
Имея нашу пару ковариат:
Коэффициент канонической корреляции - это корреляция между каноническими переменными CVX и CVY.
Чтобы вычислить вторую пару ковариат, мы проводим тот же процесс, добавляя еще одно ограничение: каждая новая переменная должна быть ортогональной и некоррелированной с предыдущими.
Мы вычисляем min (p, q) пары аналогичным образом и в итоге получаем min (p, q) компоненты, готовые к исследованию. (Обратите внимание, что количество переменных в каждом наборе не обязательно должно быть одинаковым.)
Как и в PCA, мы проецируем наши данные на минимальные (p, q) скрытые измерения. Однако не все из них могут быть информативными и важными. Давайте посмотрим на структуру и интерпретацию наших канонических вариаций в примере ниже.
Данные о школах Нью-Йорка
Мы будем использовать две группы переменных из набора данных школ Нью-Йорка:
Группа 1: Показатели окружающей среды
- Строгая инструкция%
- Совместные учителя%
- Благоприятная среда%
- Эффективное руководство школой%
- Семейно-общественные связи%
- Доверять %
Группа 2: показатели производительности
- Средний уровень владения английским языком
- Средний уровень владения математикой
Что касается инструмента, мы будем использовать реализацию pyrcca.
Начнем с разделения каждой из наших групп переменных в одном фрейме данных:
import pandas as pd import numpy as np df = pd.read_csv('2016 School Explorer.csv') # choose relevant features df = df[['Rigorous Instruction %', 'Collaborative Teachers %', 'Supportive Environment %', 'Effective School Leadership %', 'Strong Family-Community Ties %', 'Trust %','Average ELA Proficiency', 'Average Math Proficiency']] # drop missing values df = df.dropna() # separate X and Y groups X = df[['Rigorous Instruction %', 'Collaborative Teachers %', 'Supportive Environment %', 'Effective School Leadership %', 'Strong Family-Community Ties %', 'Trust %' ]] Y = df[['Average ELA Proficiency', 'Average Math Proficiency']]
Преобразуйте группу X в числовые переменные и стандартизируйте данные:
for col in X.columns: X[col] = X[col].str.strip('%') X[col] = X[col].astype('int') # Standardise the data from sklearn.preprocessing import StandardScaler sc = StandardScaler(with_mean=True, with_std=True) X_sc = sc.fit_transform(X) Y_sc = sc.fit_transform(Y)
После соответствующей предварительной обработки мы готовы применить CCA. Обратите внимание, что мы установили для параметра регуляризации значение 0, поскольку регуляризованный CCA выходит за рамки этой публикации (хотя мы вернемся к этому в будущих публикациях).
import pyrcca nComponents = 2 # min(p,q) components cca = pyrcca.CCA(kernelcca = False, reg = 0., numCC = nComponents,) # train on data cca.train([X_sc, Y_sc]) print('Canonical Correlation Per Component Pair:',cca.cancorrs) print('% Shared Variance:',cca.cancorrs**2)
Значение цифр
Каннонические корреляции
>> Canonical Correlation Per Component Pair: [0.46059902 0.18447786] >> % Shared Variance: [0.21215146 0.03403208]
Для наших двух пар канонических переменных у нас есть канонические корреляции 0,46 и 0,18 соответственно. Таким образом, скрытые представления школьной атмосферы и успеваемости учащихся действительно имеют положительную корреляцию 0,46 и разделяют 21 процент дисперсии.
Квадратная каноническая корреляция представляет собой общую дисперсию скрытых представлений наборов переменных, а не дисперсию, выведенную из самих наборов переменных.
Канонические веса
Чтобы получить доступ к весам, присвоенным нашим стандартизованным переменным (a1,…, ap) и (b1,…, bq), мы используем cca.ws
:
cca.ws >> [array([[-0.00375779, 0.0078263 ], [ 0.00061439, -0.00357358], [-0.02054012, -0.0083491 ], [-0.01252477, 0.02976148], [ 0.00046503, -0.00905069], [ 0.01415084, -0.01264106]]), array([[ 0.00632283, 0.05721601], [-0.02606459, -0.05132531]])]
С учетом этих весов канонические переменные множества Y, например, были вычислены по следующей формуле:
где веса можно интерпретировать как коэффициенты в модели линейной регрессии. Мы должны принять во внимание, что не рекомендуется полагаться на веса при интерпретации вклада отдельных переменных в ковариаты.
Вот почему:
- Вес может изменяться от образца к образцу.
- На веса может сильно влиять мультиколлинеарность (что довольно часто встречается для групп переменных с одним и тем же контекстом).
Вместо этого полагаться на канонические загрузки - более распространенная практика.
Канонические загрузки
Канонические нагрузки - это не что иное, как корреляция между исходной переменной и канонической вариацией этого набора. Например, чтобы оценить вклад Доверия в представление школьной среды, мы вычисляем корреляцию между переменной Доверие и полученной вариацией для набора переменных X.
Расчет нагрузок для группы Y по первому варианту:
print('Loading for Math Score:',np.corrcoef(cca.comps[0][:,0],Y_sc[:,0])[0,1]) print('Loading for ELA Score:',np.corrcoef(cca.comps[0][:,0],Y_sc[:,1])[0,1]) >> Loading for Math Score: -0.4106778140971078 >> Loading for ELA Score: -0.4578120954218724
Канонические ковариаты
Наконец, мы могли бы захотеть получить прямой доступ к ковариатным значениям, будь то для визуализации или для любых других целей.
Для этого нам понадобятся:
# CVX cca.comps[0] # First CV for X cca.comps[0][:,0] # Second CV for X cca.comps[0][:,1] # CVY cca.comps[1] # First CV for Y cca.comps[1][:,0] # Second CV for Y cca.comps[1][:,1]
Вот и все!
Надеюсь, вы найдете это полезным и будете больше использовать CCA в своей рутине EDA.
-Продолжайте изучать
Ссылка:
[1] Биленко Н., Галлан., 2016, Pyrcca: Канонический корреляционный анализ регуляризованного ядра в Python и его приложения к нейровизуализации, Границы нейроинфоматики
[2] Даттало, П.В., 2014, Демонстрация канонического корреляционного анализа с ортогональным вращением для облегчения интерпретации