【问题标题】:Is pd.get_dummies one-hot encoding?pd.get_dummies 是单热编码吗?
【发布时间】: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)

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案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 包含代码示例] 是的,如果您将输入单热编码为逻辑回归模型,则跳过截距是合适的。

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 2023-03-13
      • 2017-01-31
      • 2023-03-18
      • 1970-01-01
      • 2018-07-31
      • 2021-06-14
      • 1970-01-01
      相关资源
      最近更新 更多