pd.get_dummies是一种独热编码吗?

16

鉴于一位热心回答者的解释,一个广泛接受的观点是one-hot编码和虚拟编码之间有所不同。既然如此,当使用默认参数(即drop_first=False)时,pandas.get_dummies方法是进行one-hot编码吗?

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

# 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)
2个回答

30

pd.get_dummies函数适用于类别列,每个观察值只有一个类别。它将为每个唯一的分类值创建一个新的列(变量)。对于每个观测到的分类值,它将在相应的列中放置一个一。这相当于独热编码。虚拟变量是每个观测值为0或1的任何变量。

独热编码特点是每个观测值的一组分类值只有一个“1”。

考虑系列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会生成一种独热编码。是的!不拟合截距绝对合适。

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会生成不是 one-hot 编码的虚拟变量,理论上你可以保留截距。

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方法并不总是能够导致一种K编码。感谢您的解释! - Mattia Paterna
我们在哪里提到过分隔符是“|”? - subro
这是str.get_dummies中的默认设置。 - piRSquared

5

第一个问题: 是的,pd.get_dummies() 在默认状态下进行独热编码; 请参见下面的示例,来自pd.get_dummies文档:

s = pd.Series(list('abca'))
pd.get_dummies(s, drop_first=False)
第二个问题: [由于原帖包括代码示例,现已编辑] 如果您正在对逻辑回归模型的输入进行独热编码,则跳过截距项是合适的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接