pd.get_dummies 是单热编码吗?

Posted

技术标签:

【中文标题】pd.get_dummies 是单热编码吗?【英文标题】:Is pd.get_dummies one-hot encoding? 【发布时间】:2018-06-18 14:51:13 【问题描述】:

Givenone-hot encoding 和 dummy coding 的区别,是pandas.get_dummies 方法 one-hot encoding 在使用默认参数时(即drop_first=False)吗?

如果是这样,我从逻辑回归模型中删除截距是否有意义?这是一个例子:

# I assume I have already my dataset in a DataFrame X and the true labels in y
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

X = pd.get_dummies(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .80)

clf = LogisticRegression(fit_intercept=False)
clf.fit(X_train, y_train)

【问题讨论】:

【参考方案1】:

虚拟变量是每次观察时为 1 或 0 的任何变量。 pd.get_dummies 当应用于我们每个观察有 一个 类别的类别列时,将为每个唯一的类别值生成一个新列(变量)。它将在对应于该观察的分类值的列中放置一个。这相当于一种热编码。

One-hot 编码的特点是每次观察每组分类值只有一个。

考虑系列s

s = pd.Series(list('AABBCCABCDDEE'))

s

0     A
1     A
2     B
3     B
4     C
5     C
6     A
7     B
8     C
9     D
10    D
11    E
12    E
dtype: object

pd.get_dummies 将产生 one-hot 编码。是的!不适合截距是绝对合适的。

pd.get_dummies(s)

    A  B  C  D  E
0   1  0  0  0  0
1   1  0  0  0  0
2   0  1  0  0  0
3   0  1  0  0  0
4   0  0  1  0  0
5   0  0  1  0  0
6   1  0  0  0  0
7   0  1  0  0  0
8   0  0  1  0  0
9   0  0  0  1  0
10  0  0  0  1  0
11  0  0  0  0  1
12  0  0  0  0  1

但是,如果您有 s 包含不同的数据并使用 pd.Series.str.get_dummies

s = pd.Series('A|B,A,B,B,C|D,D|B,A,B,C,A|D'.split(','))

s

0    A|B
1      A
2      B
3      B
4    C|D
5    D|B
6      A
7      B
8      C
9    A|D
dtype: object

然后get_dummies 生成非单热编码的虚拟变量,理论上您可以离开截距。

s.str.get_dummies()

   A  B  C  D
0  1  1  0  0
1  1  0  0  0
2  0  1  0  0
3  0  1  0  0
4  0  0  1  1
5  0  1  0  1
6  1  0  0  0
7  0  1  0  0
8  0  0  1  0
9  1  0  0  1

【讨论】:

好的!这绝对有道理。我的案例反映了前一个例子,每个观察有 一个且只有一个 类别(在这种情况下,是一个国家名称)。但是,正如我所见,pandas 方法不能一直导致 one-of-K 编码。谢谢你的解释! 我们在哪里提到,分隔符是'|'?? 这是str.get_dummies中的默认值【参考方案2】:

第一个问题:是的,pd.get_dummies() 在默认状态下是 one-hot 编码;请参见下面的示例,来自pd.get_dummies docs:

s = pd.Series(list('abca'))
pd.get_dummies(s, drop_first=False)

第二个问题:[现在编辑,因为 OP 包含代码示例] 是的,如果您将输入单热编码为逻辑回归模型,则跳过截距是合适的。

【讨论】:

以上是关于pd.get_dummies 是单热编码吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用单热编码处理sklearn中的分类变量

当 Sparse = True 时 pd.get_dummies 数据帧大小与 Sparse = False 时相同

熊猫单热编码列到假人,包括“其他”编码[重复]

keras.utils.to_categorical 和 pd.get_dummies 之间有啥区别吗?

缺少类别的单热编码

python 提取单热编码向量。