【问题标题】:Categorical features correlation分类特征相关
【发布时间】:2018-03-11 22:15:28
【问题描述】:

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

【问题讨论】:

  • 二进制还是 n 元分类?有序还是无序?
  • “它与标签的相关性” => 它与分类响应变量的相关性(多少个值?)

标签: pandas machine-learning categorical-data feature-engineering


【解决方案1】:

有一种方法可以计算相关系数,而无需对类别变量进行一次性编码。 Cramers V 统计量是计算分类变量相关性的一种方法。可以如下计算。以下链接很有帮助。 Using pandas, calculate Cramér's coefficient matrix对于其他连续值的变量,可以使用cutpandas进行分类。

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

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

【讨论】:

  • 感谢回复,但我的问题不是如何计算分类特征之间的相关性。问题是:将热编码器用于分类特征然后使用包括分类和连续特征在内的特征来计算相关性是一个好主意还是非常糟糕的主意。
  • 我很抱歉误解了这个问题。我认为计算一个热编码特征和另一个连续特征之间的相关性没有问题,但我认为相关系数将是仅针对类别中的一项的值。
  • 非常感谢
  • 但是,作为一个新手……你介意解释一下,为什么它只使用该类别中的一项。
  • 抱歉没有解释。假设您对一个性别项目进行了一次性编码。性别项目分为男性和女性以及其他变量。男性变量是0或1的标志,无论它是否是男性。我认为有可能与这些标志变量相关联。然而,一般来说,分类变量的相关系数使用统计分析方法,该方法使用统计分析方法,例如在 one-hot 编码之前使用项目类别的频率。另见stats.stackexchange.com/questions/102778/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我希望在 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 中做同样的事情应该很简单。

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 2015-09-23
      • 2011-11-19
      • 2011-04-07
      • 1970-01-01
      • 2020-03-06
      • 2023-02-10
      • 2017-08-01
      • 2017-06-29
      相关资源
      最近更新 更多