如何让 pandas get_dummies 发出 N-1 个变量以避免共线性?

Posted

技术标签:

【中文标题】如何让 pandas get_dummies 发出 N-1 个变量以避免共线性?【英文标题】:how to get pandas get_dummies to emit N-1 variables to avoid collinearity? 【发布时间】:2015-10-08 12:09:57 【问题描述】:

pandas.get_dummies 为每个分类值发出一个虚拟变量。是否有一些自动化的、简单的方法要求它只创建 N-1 个虚拟变量? (随便去掉一个“基线”变量)?

需要避免我们数据集中的共线性。

【问题讨论】:

请添加一些代码/细节来解释 pd.get_dummies(s).iloc[:,1:] 【参考方案1】:

Pandas 0.18.0 版实现了您正在寻找的功能:drop_first 选项。这是一个例子:

In [1]: import pandas as pd

In [2]: pd.__version__
Out[2]: u'0.18.1'

In [3]: s = pd.Series(list('abcbacb'))

In [4]: pd.get_dummies(s, drop_first=True)
Out[4]: 
     b    c
0  0.0  0.0
1  1.0  0.0
2  0.0  1.0
3  1.0  0.0
4  0.0  0.0
5  0.0  1.0
6  1.0  0.0

【讨论】:

【参考方案2】:

有很多方法可以做到这一点。

可能最简单的方法是在调用get_dummies 之前将其中一个值替换为None。假设你有:

import pandas as pd
import numpy as np
s = pd.Series(list('babca'))
>> s
0    b
1    a
2    b
3    c
4    a

然后使用:

>> pd.get_dummies(np.where(s == s.unique()[0], None, s))
    a   c
0   0   0
1   1   0
2   0   0
3   0   1
4   1   0

删除b

(当然,您需要考虑您的类别列是否尚未包含None。)


另一种方法是使用prefix 参数到get_dummies

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False)

前缀:字符串、字符串列表或字符串字典,默认为 None - 用于附加 DataFrame 列名的字符串 当在 DataFrame 上调用 get_dummies 时,传递长度等于列数的列表。或者,前缀可以是将列名映射到前缀的字典。

这将为所有生成的列附加一些前缀,然后您可以删除具有此前缀的列之一(只需使其唯一)。

【讨论】:

会试试这些!但是你不同意这样一个常见的要求没有作为 get_dummies 的某些参数来实现是很奇怪的吗? @ihadanny 不确定我个人是否遇到过需要这种表示的学习者。你有例子吗? 任何带有常数项的回归都会有问题(尽管大多数统计程序足够聪明,可以自动删除共线变量)。例如,Stata 会在回归中自动使用 n-1 个虚拟变量来避免这个问题。我不确定 statsmodels 是否会自动处理这个问题。 @AmiTavory,旧的 scikit.LinearSVC 不会被共线因变量混淆吗? @JohnE 有趣的一点。无论如何,我通常使用 QR 分解来过滤掉(非常宽的)矩阵,所以我可能错过了它。谢谢。

以上是关于如何让 pandas get_dummies 发出 N-1 个变量以避免共线性?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 pandas get_dummies 函数应用于有效数据集?

将“pandas.get_dummies”转换到新数据的简单方法?

pandas.get_dummies

特征提取pd.get_dummies() 详解(One-Hot Encoding)

python get_dummies pandas with drop_first

Pandas.get_dummies 返回两列(_Y 和 _N)而不是一列