分类特征相关

Categorical features correlation

我的数据中有一些分类特征以及连续特征。热编码类别特征以找到它与标签以及其他连续生物的相关性是好主意还是绝对坏主意?

有一种方法可以在不对类别变量进行单热编码的情况下计算相关系数。 Cramers V 统计量是计算分类变量相关性的一种方法。它可以计算如下。以下 link 有帮助。 Using pandas, calculate Cramér's coefficient matrix对于其他连续值的变量,可以使用cut of pandas.

进行分类
import numpy as np
import pandas as pd
import scipy.stats as ss
import seaborn as sns

print('Pandas version:', pd.__version__)
# Pandas version: 1.3.0

tips = sns.load_dataset("tips")

tips["total_bill_cut"] = pd.cut(tips["total_bill"],
                                np.arange(0, 55, 5),
                                include_lowest=True,
                                right=False)

def cramers_v(confusion_matrix):
    """ calculate Cramers V statistic for categorial-categorial association.
        uses correction from Bergsma and Wicher,
        Journal of the Korean Statistical Society 42 (2013): 323-328
    """
    chi2 = ss.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum()
    phi2 = chi2 / n
    r, k = confusion_matrix.shape
    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))
    rcorr = r - ((r-1)**2)/(n-1)
    kcorr = k - ((k-1)**2)/(n-1)
    return np.sqrt(phi2corr / min((kcorr-1), (rcorr-1)))

confusion_matrix = pd.crosstab(tips["day"], tips["time"])
cramers_v(confusion_matrix.values)
# Out[2]: 0.9386619340722221

confusion_matrix = pd.crosstab(tips["total_bill_cut"], tips["time"])
cramers_v(confusion_matrix.values)
# Out[3]: 0.1649870749498837

请注意,自版本 0.23.0 起,.as_matrix() 在 pandas 中已弃用。使用 .values 代替

我想在 BigQuery 中做同样的事情。 对于数字特征,您可以使用内置的 CORR(x,y) 函数。 对于分类特征,您可以将其计算为: 基数(cat1 x cat2)/最大(基数(cat1),基数(cat2)。 这转化为以下 SQL:

SELECT 
COUNT(DISTINCT(CONCAT(cat1, cat2))) / GREATEST (COUNT(DISTINCT(cat1)), COUNT(DISTINCT(cat2))) as cat1_2,
COUNT(DISTINCT(CONCAT(cat1, cat3))) / GREATEST (COUNT(DISTINCT(cat1)), COUNT(DISTINCT(cat3))) as cat1_3,
....
FROM ...

数字越大,相关性越低。

我使用以下 python 脚本生成 SQL:

import itertools

arr = range(1,10)

query = ',\n'.join(list('COUNT(DISTINCT(CONCAT({a}, {b}))) / GREATEST (COUNT(DISTINCT({a})), COUNT(DISTINCT({b}))) as cat{a}_{b}'.format(a=a,b=b) 
  for (a,b) in itertools.combinations(arr,2)))
query = 'SELECT \n ' + query + '\n FROM  `...`;'
print (query)

在 numpy 中做同样的事情应该很简单。

我发现 phik 库在计算分类特征和区间特征之间的相关性时非常有用。这对于合并数字特征也很有用。试试这个:phik documentation